diff options
Diffstat (limited to 'src')
303 files changed, 96754 insertions, 24277 deletions
diff --git a/src/battle/anim/alert.c b/src/battle/anim/alert.c index 7cd42c17b..7cd42c17b 100755..100644 --- a/src/battle/anim/alert.c +++ b/src/battle/anim/alert.c diff --git a/src/battle/anim/angel.c b/src/battle/anim/angel.c index 5ec083887..5ec083887 100755..100644 --- a/src/battle/anim/angel.c +++ b/src/battle/anim/angel.c diff --git a/src/battle/anim/angel_kiss.c b/src/battle/anim/angel_kiss.c index d5be6e2af..d5be6e2af 100755..100644 --- a/src/battle/anim/angel_kiss.c +++ b/src/battle/anim/angel_kiss.c diff --git a/src/battle/anim/anger.c b/src/battle/anim/anger.c index 011aa68ce..011aa68ce 100755..100644 --- a/src/battle/anim/anger.c +++ b/src/battle/anim/anger.c diff --git a/src/battle/anim/battle_intro.c b/src/battle/anim/battle_intro.c new file mode 100644 index 000000000..01f823fa7 --- /dev/null +++ b/src/battle/anim/battle_intro.c @@ -0,0 +1,499 @@ +#include "global.h" +#include "constants/battle_constants.h" +#include "battle.h" +#include "battle_anim.h" +#include "battle_anim_80CA710.h" +#include "data2.h" +#include "ewram.h" +#include "main.h" +#include "rom_8077ABC.h" +#include "scanline_effect.h" +#include "task.h" +#include "trig.h" + +extern u16 gBattleTypeFlags; +extern u16 gBattle_BG1_X; +extern u16 gBattle_BG1_Y; +extern u16 gBattle_BG2_X; +extern u16 gBattle_BG2_Y; +extern u16 gBattle_WIN0V; +extern u16 gUnknown_02024DE8; +extern u8 gBattleMonForms[]; + +extern void sub_800FE20(struct Sprite *); + +static void BattleIntroTask_ScrollScenery(u8); +static void BattleIntroTask_FadeScenery(u8); +static void BattleIntroTask_ScrollAndFadeScenery(u8); +static void BattleIntroTask_80E4C34(u8); + +static const TaskFunc sBattleIntroTaskFuncs[] = +{ + BattleIntroTask_ScrollScenery, + BattleIntroTask_ScrollScenery, + BattleIntroTask_FadeScenery, + BattleIntroTask_FadeScenery, + BattleIntroTask_FadeScenery, + BattleIntroTask_ScrollScenery, + BattleIntroTask_ScrollScenery, + BattleIntroTask_ScrollScenery, + BattleIntroTask_ScrollAndFadeScenery, + BattleIntroTask_ScrollAndFadeScenery, +}; + +#define tState data[0] +#define tBgXOffset data[2] +#define tFramesUntilBg1Slide data[3] + +void StartBattleIntroAnim(u8 a) +{ + u8 taskId; + + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + taskId = CreateTask(BattleIntroTask_80E4C34, 0); + } + else if ((gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) && gGameVersion != VERSION_RUBY) + { + a = 3; + taskId = CreateTask(BattleIntroTask_FadeScenery, 0); + } + else + { + taskId = CreateTask(sBattleIntroTaskFuncs[a], 0); + } + + gTasks[taskId].tState = 0; + gTasks[taskId].data[1] = a; + gTasks[taskId].tBgXOffset = 0; + gTasks[taskId].tFramesUntilBg1Slide = 0; + gTasks[taskId].data[4] = 0; + gTasks[taskId].data[5] = 0; + gTasks[taskId].data[6] = 0; +} + +static void EndBattleIntroTask(u8 taskId) +{ + DestroyTask(taskId); + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + gBattle_BG2_X = 0; + gBattle_BG2_Y = 0; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + REG_WININ = 0x3F3F; + REG_WINOUT = 0x3F3F; +} + +static void BattleIntroTask_ScrollScenery(u8 taskId) +{ + s32 i; + + gBattle_BG1_X += 6; + + switch (gTasks[taskId].tState) + { + case 0: + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + gTasks[taskId].tBgXOffset = 16; + gTasks[taskId].tState++; + } + else + { + gTasks[taskId].tBgXOffset = 1; + gTasks[taskId].tState++; + } + break; + case 1: + gTasks[taskId].tBgXOffset--; + if (gTasks[taskId].tBgXOffset == 0) + { + gTasks[taskId].tState++; + REG_WININ = 0x3F; + } + break; + case 2: + // Open up the window + gBattle_WIN0V -= WIN_RANGE(1, 0); // decrement min Y + gBattle_WIN0V += WIN_RANGE(0, 1); // increment max Y + if ((gBattle_WIN0V & 0xFF00) == 0x3000) + { + gTasks[taskId].tState++; + gTasks[taskId].tBgXOffset = DISPLAY_WIDTH; + gTasks[taskId].tFramesUntilBg1Slide = 32; + gUnknown_02024DE8 &= ~1; + } + break; + case 3: + if (gTasks[taskId].tFramesUntilBg1Slide != 0) + { + gTasks[taskId].tFramesUntilBg1Slide--; + } + else + { + if (gTasks[taskId].data[1] == 1) + { + if (gBattle_BG1_Y != 0xFFB0) + gBattle_BG1_Y -= 2; + } + else + { + if (gBattle_BG1_Y != 0xFFC8) + gBattle_BG1_Y -= 1; + } + } + + if ((gBattle_WIN0V & 0xFF00) != 0) + gBattle_WIN0V -= 1020; + + if (gTasks[taskId].tBgXOffset != 0) + gTasks[taskId].tBgXOffset -= 2; + + // Slide in the top half of the BG from the left + for (i = 0; i < DISPLAY_HEIGHT / 2; i++) + gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gTasks[taskId].tBgXOffset; + // Slide in the bottom half of the BG from the right + for (; i < DISPLAY_HEIGHT; i++) + gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = -gTasks[taskId].tBgXOffset; + + if (gTasks[taskId].tBgXOffset == 0) + { + gScanlineEffect.state = 3; + gTasks[taskId].tState++; + CpuFill32(0, (void *)(VRAM + 0xE000), 0x800); + REG_BG1CNT = 0x9C00; + REG_BG2CNT = 0x5E00; + } + break; + case 4: + EndBattleIntroTask(taskId); + break; + } +} + +static void BattleIntroTask_FadeScenery(u8 taskId) +{ + s32 i; + + switch (gTasks[taskId].data[1]) + { + case 2: + case 4: + gBattle_BG1_X += 8; + break; + case 3: + gBattle_BG1_X += 6; + break; + } + + if (gTasks[taskId].data[1] == 4) + { + gBattle_BG1_Y = Cos2(gTasks[taskId].data[6]) / 512 - 8; + if (gTasks[taskId].data[6] < 0xB4) + gTasks[taskId].data[6] += 4; + else + gTasks[taskId].data[6] += 6; + if (gTasks[taskId].data[6] == 0x168) + gTasks[taskId].data[6] = 0; + } + + switch (gTasks[taskId].tState) + { + case 0: + gTasks[taskId].data[4] = 16; + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + gTasks[taskId].tBgXOffset = 16; + gTasks[taskId].tState++; + } + else + { + gTasks[taskId].tBgXOffset = 1; + gTasks[taskId].tState++; + } + break; + case 1: + gTasks[taskId].tBgXOffset--; + if (gTasks[taskId].tBgXOffset == 0) + { + gTasks[taskId].tState++; + REG_WININ = 0x3F; + } + break; + case 2: + // Open up window + gBattle_WIN0V -= WIN_RANGE(1, 0); // decrement min Y + gBattle_WIN0V += WIN_RANGE(0, 1); // increment max Y + if ((gBattle_WIN0V & 0xFF00) == 0x3000) + { + gTasks[taskId].tState++; + gTasks[taskId].tBgXOffset = DISPLAY_WIDTH; + gTasks[taskId].tFramesUntilBg1Slide = 32; + gTasks[taskId].data[5] = 1; + gUnknown_02024DE8 &= ~1; + } + break; + case 3: + if (gTasks[taskId].tFramesUntilBg1Slide != 0) + { + gTasks[taskId].tFramesUntilBg1Slide--; + if (gTasks[taskId].tFramesUntilBg1Slide == 0) + { + REG_BLDCNT = 0x1842; + REG_BLDALPHA = 0xF; + REG_BLDY = 0; + } + } + else + { + if ((gTasks[taskId].data[4] & 0x1F) && --gTasks[taskId].data[5] == 0) + { + gTasks[taskId].data[4] += 255; + gTasks[taskId].data[5] = 4; + } + } + + if ((gBattle_WIN0V & 0xFF00) != 0) + gBattle_WIN0V -= 1020; + + if (gTasks[taskId].tBgXOffset != 0) + gTasks[taskId].tBgXOffset -= 2; + + // Slide in the top half of the BG from the left + for (i = 0; i < DISPLAY_HEIGHT / 2; i++) + gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gTasks[taskId].tBgXOffset; + // Slide in the bottom half of the BG from the right + for (; i < DISPLAY_HEIGHT; i++) + gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = -gTasks[taskId].tBgXOffset; + + if (gTasks[taskId].tBgXOffset == 0) + { + gScanlineEffect.state = 3; + gTasks[taskId].tState++; + CpuFill32(0, (void *)(VRAM + 0xE000), 0x800); + REG_BG1CNT = 0x9C00; + REG_BG2CNT = 0x5E00; + } + break; + case 4: + EndBattleIntroTask(taskId); + break; + } + + if (gTasks[taskId].tState != 4) + REG_BLDALPHA = gTasks[taskId].data[4]; +} + +static void BattleIntroTask_ScrollAndFadeScenery(u8 taskId) +{ + s32 i; + + gBattle_BG1_X += 8; + + switch (gTasks[taskId].tState) + { + case 0: + REG_BLDCNT = 0x1842; + REG_BLDALPHA = 0x0808; + REG_BLDY = 0; + gTasks[taskId].data[4] = 0x0808; + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + gTasks[taskId].tBgXOffset = 16; + gTasks[taskId].tState++; + } + else + { + gTasks[taskId].tBgXOffset = 1; + gTasks[taskId].tState++; + } + break; + case 1: + gTasks[taskId].tBgXOffset--; + if (gTasks[taskId].tBgXOffset == 0) + { + gTasks[taskId].tState++; + REG_WININ = 0x3F; + } + break; + case 2: + // Open up window + gBattle_WIN0V -= WIN_RANGE(1, 0); // decrement min Y + gBattle_WIN0V += WIN_RANGE(0, 1); // increment max Y + if ((gBattle_WIN0V & 0xFF00) == 0x3000) + { + gTasks[taskId].tState++; + gTasks[taskId].tBgXOffset = DISPLAY_WIDTH; + gTasks[taskId].tFramesUntilBg1Slide = 32; + gTasks[taskId].data[5] = 1; + gUnknown_02024DE8 &= ~1; + } + break; + case 3: + if (gTasks[taskId].tFramesUntilBg1Slide != 0) + { + gTasks[taskId].tFramesUntilBg1Slide--; + } + else + { + if ((gTasks[taskId].data[4] & 0xF) && --gTasks[taskId].data[5] == 0) + { + gTasks[taskId].data[4] += 255; + gTasks[taskId].data[5] = 6; + } + } + + if ((gBattle_WIN0V & 0xFF00) != 0) + gBattle_WIN0V -= 1020; + + if (gTasks[taskId].tBgXOffset != 0) + gTasks[taskId].tBgXOffset -= 2; + + // Slide in the top half of the BG from the left + for (i = 0; i < DISPLAY_HEIGHT / 2; i++) + gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gTasks[taskId].tBgXOffset; + // Slide in the bottom half of the BG from the right + for (; i < DISPLAY_HEIGHT; i++) + gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = -gTasks[taskId].tBgXOffset; + + if (gTasks[taskId].tBgXOffset == 0) + { + gScanlineEffect.state = 3; + gTasks[taskId].tState++; + CpuFill32(0, (void *)(VRAM + 0xE000), 0x800); + REG_BG1CNT = 0x9C00; + REG_BG2CNT = 0x5E00; + } + break; + case 4: + EndBattleIntroTask(taskId); + break; + } + + if (gTasks[taskId].tState != 4) + REG_BLDALPHA = gTasks[taskId].data[4]; +} + +// Seems to only be used for link battles. +static void BattleIntroTask_80E4C34(u8 taskId) +{ + s32 i; + + if (gTasks[taskId].tState > 1 && gTasks[taskId].data[4] == 0) + { + if ((gBattle_BG1_X & 0x8000) || gBattle_BG1_X < 80) // hmm... + { + gBattle_BG1_X += 3; + gBattle_BG2_X -= 3; + } + else + { + CpuFill32(0, (void *)(VRAM + 0xE000), 0x800); + CpuFill32(0, (void *)(VRAM + 0xF000), 0x800); + gTasks[taskId].data[4] = 1; + } + } + + switch (gTasks[taskId].tState) + { + case 0: + gTasks[taskId].tBgXOffset = 16; + gTasks[taskId].tState++; + break; + case 1: + gTasks[taskId].tBgXOffset--; + if (gTasks[taskId].tBgXOffset == 0) + { + gTasks[taskId].tState++; + gSprites[ewram1608A].oam.objMode = 2; + gSprites[ewram1608A].callback = sub_800FE20; + gSprites[ewram1608B].oam.objMode = 2; + gSprites[ewram1608B].callback = sub_800FE20; + REG_WININ = 0x3F; + REG_WINOUT = 0x3F06; + } + break; + case 2: + // Open up window + gBattle_WIN0V -= WIN_RANGE(1, 0); // decrement min Y + gBattle_WIN0V += WIN_RANGE(0, 1); // increment max Y + if ((gBattle_WIN0V & 0xFF00) == 0x3000) + { + gTasks[taskId].tState++; + gTasks[taskId].tBgXOffset = DISPLAY_WIDTH; + gTasks[taskId].tFramesUntilBg1Slide = 32; + gUnknown_02024DE8 &= ~1; + } + break; + case 3: + if ((gBattle_WIN0V & 0xFF00) != 0) + gBattle_WIN0V -= 1020; + + if (gTasks[taskId].tBgXOffset != 0) + gTasks[taskId].tBgXOffset -= 2; + + // Slide in the top half of the BG from the left + for (i = 0; i < DISPLAY_HEIGHT / 2; i++) + gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gTasks[taskId].tBgXOffset; + // Slide in the bottom half of the BG from the right + for (; i < DISPLAY_HEIGHT; i++) + gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = -gTasks[taskId].tBgXOffset; + + if (gTasks[taskId].tBgXOffset == 0) + { + gScanlineEffect.state = 3; + gTasks[taskId].tState++; + REG_BG1CNT = 0x9C00; + REG_BG2CNT = 0x5E00; + } + break; + case 4: + EndBattleIntroTask(taskId); + break; + } +} + +void unref_sub_80E4EC8(u8 a, u8 b, u8 c, u8 d) +{ + sub_80E4EF8(a, b, c, d, 0x4000, 30, 1); +} + +// draws some 8x8 tilemap +void sub_80E4EF8(u8 left, u8 top, u8 c, u8 paletteNum, u16 e, u8 bgMap, u8 g) +{ + u32 tileNum; + s32 x; + s32 y; + u8 bank = GetBankByIdentity(c); + + DmaCopy16(3, gUnknown_081FAF4C[c] + gBattleMonForms[bank] * 0x800, (void *)(VRAM + e), 0x800); + tileNum = e / 32 - g * 512; + for (y = top; y < top + 8; y++) + { + for (x = left; x < left + 8; x++) + { + *(u16 *)(VRAM + x * 2 + bgMap * 0x800 + y * 64) = tileNum | (paletteNum << 12); + tileNum++; + } + } +} + +void unref_sub_80E4FDC(u8 left, u8 top, u8 c, u8 form, u8 paletteNum, u16 f, u8 bgMap, u8 h) +{ + u32 tileNum; + s32 x; + s32 y; + + DmaCopy16(3, gUnknown_081FAF4C[c] + form * 0x800, (void *)(VRAM + f), 0x800); + tileNum = f / 32 - h * 512; + for (y = top; y < top + 8; y++) + { + for (x = left; x < left + 8; x++) + { + *(u16 *)(VRAM + x * 2 + bgMap * 0x800 + y * 64) = tileNum | (paletteNum << 12); + tileNum++; + } + } +} diff --git a/src/battle/anim/blow_kiss.c b/src/battle/anim/blow_kiss.c index e7b49471d..e7b49471d 100755..100644 --- a/src/battle/anim/blow_kiss.c +++ b/src/battle/anim/blow_kiss.c diff --git a/src/battle/anim/bottle.c b/src/battle/anim/bottle.c index 5485bcf5d..5485bcf5d 100755..100644 --- a/src/battle/anim/bottle.c +++ b/src/battle/anim/bottle.c diff --git a/src/battle/anim/brace.c b/src/battle/anim/brace.c index 19ea4297b..19ea4297b 100755..100644 --- a/src/battle/anim/brace.c +++ b/src/battle/anim/brace.c diff --git a/src/battle/anim/breath.c b/src/battle/anim/breath.c index 831b222ad..831b222ad 100755..100644 --- a/src/battle/anim/breath.c +++ b/src/battle/anim/breath.c diff --git a/src/battle/anim/bug.c b/src/battle/anim/bug.c new file mode 100644 index 000000000..dbc0f75a5 --- /dev/null +++ b/src/battle/anim/bug.c @@ -0,0 +1,302 @@ +#include "global.h" +#include "battle_anim.h" +#include "contest.h" +#include "rom_8077ABC.h" +#include "trig.h" +// #include "util.h" + +extern s16 gBattleAnimArgs[]; +extern u8 gAnimBankAttacker; +extern u8 gAnimBankTarget; + +static void sub_80DCA38(struct Sprite *sprite); +static void sub_80DCAEC(struct Sprite *sprite); +static void sub_80DCB5C(struct Sprite *sprite); +static void sub_80DCBB4(struct Sprite *sprite); +void sub_80DCD78(struct Sprite *sprite); + +// used in Move_MEGAHORN +void sub_80DC824(struct Sprite *sprite) +{ + if (IsContest()) + { + StartSpriteAffineAnim(sprite, 2); + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + } + else if (!GetBankSide(gAnimBankTarget)) + { + StartSpriteAffineAnim(sprite, 1); + gBattleAnimArgs[1] = -gBattleAnimArgs[1]; + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + gBattleAnimArgs[3] = -gBattleAnimArgs[3]; + gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + } + + sprite->pos1.x = sub_8077EE4(gAnimBankTarget, 2) + gBattleAnimArgs[0]; + sprite->pos1.y = sub_8077EE4(gAnimBankTarget, 3) + gBattleAnimArgs[1]; + sprite->data[0] = gBattleAnimArgs[4]; + + sprite->data[2] = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[2]; + sprite->data[4] = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[3]; + + sprite->callback = sub_8078B34; + StoreSpriteCallbackInData(sprite, DestroyAnimSprite); +} + +// used in Move_LEECH_LIFE +void sub_80DC8F4(struct Sprite *sprite) +{ + if (IsContest()) + { + gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + StartSpriteAffineAnim(sprite, 2); + } + else if (!GetBankSide(gAnimBankTarget)) + { + gBattleAnimArgs[1] = -gBattleAnimArgs[1]; + gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + } + + sprite->pos1.x = sub_8077EE4(gAnimBankTarget, 2) + gBattleAnimArgs[0]; + sprite->pos1.y = sub_8077EE4(gAnimBankTarget, 3) + gBattleAnimArgs[1]; + sprite->data[0] = gBattleAnimArgs[2]; + + sprite->data[2] = GetBankPosition(gAnimBankTarget, 2); + sprite->data[4] = GetBankPosition(gAnimBankTarget, 3); + + sprite->callback = sub_8078B34; + StoreSpriteCallbackInData(sprite, DestroyAnimSprite); +} + +// used in 2 moves: +// Move_STRING_SHOT, Move_SPIDER_WEB +void sub_80DC9A0(struct Sprite *sprite) +{ + if (IsContest()) + gBattleAnimArgs[2] /= 2; + + sub_80787B0(sprite, 1); + sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[1] = sprite->pos1.x; + sprite->data[3] = sprite->pos1.y; + + if (!gBattleAnimArgs[4]) + { + sprite->data[2] = GetBankPosition(gAnimBankTarget, 2); + sprite->data[4] = GetBankPosition(gAnimBankTarget, 3); + } + else + { + sub_807A3FC(gAnimBankTarget, 1, &sprite->data[2], &sprite->data[4]); + } + + sub_8078BD4(sprite); + sprite->data[5] = gBattleAnimArgs[3]; + sprite->callback = sub_80DCA38; +} + +static void sub_80DCA38(struct Sprite *sprite) +{ + if (sub_8078B5C(sprite)) + { + DestroyAnimSprite(sprite); + return; + } + + sprite->pos2.x += Sin(sprite->data[6], sprite->data[5]); + sprite->data[6] = (sprite->data[6] + 13) & 0xFF; +} + +// used in Move_STRING_SHOT +void sub_80DCA70(struct Sprite *sprite) +{ + sub_807A3FC(gAnimBankTarget, 0, &sprite->pos1.x, &sprite->pos1.y); + if (GetBankSide(gAnimBankAttacker)) + sprite->pos1.x -= gBattleAnimArgs[0]; + else + sprite->pos1.x += gBattleAnimArgs[0]; + + sprite->pos1.y += gBattleAnimArgs[1]; + if (!GetBankSide(gAnimBankTarget)) + sprite->pos1.y += 8; + + sprite->callback = sub_80DCAEC; +} + +static void sub_80DCAEC(struct Sprite *sprite) +{ + if (++sprite->data[0] == 3) + { + sprite->data[0] = 0; + sprite->invisible ^= 1; + } + + if (++sprite->data[1] == 51) + { + DestroyAnimSprite(sprite); + } +} + +// used in Move_SPIDER_WEB +void sub_80DCB38(struct Sprite *sprite) +{ + REG_BLDCNT = 0x3F40; + REG_BLDALPHA = 16; + + sprite->data[0] = 16; + sprite->callback = sub_80DCB5C; +} + +static void sub_80DCB5C(struct Sprite *sprite) +{ + if (sprite->data[2] < 20) + { + sprite->data[2]++; + } + else if (sprite->data[1]++ & 1) + { + sprite->data[0]--; + REG_BLDALPHA = sprite->data[0] | ((16 - sprite->data[0]) << 8); + + if (sprite->data[0] == 0) + { + sprite->invisible = TRUE; + sprite->callback = sub_80DCBB4; + } + } +} + +static void sub_80DCBB4(struct Sprite *sprite) +{ + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + DestroyAnimSprite(sprite); +} + +// used in 3 moves: +// Move_POISON_STING, Move_TWINEEDLE, Move_SPIKE_CANNON +void sub_80DCBCC(struct Sprite *sprite) +{ + s16 lVarX, lVarY; + u16 rot; + + if (IsContest()) + { + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + } + else + { + if (GetBankSide(gAnimBankAttacker)) + { + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + gBattleAnimArgs[1] = -gBattleAnimArgs[1]; + gBattleAnimArgs[3] = -gBattleAnimArgs[3]; + } + } + + if (!IsContest()) + { + if (GetBankSide(gAnimBankAttacker) == GetBankSide(gAnimBankTarget)) + { + if (GetBankIdentity(gAnimBankTarget) == 0 || GetBankIdentity(gAnimBankTarget) == 1) + { + s16 temp1, temp2; + + temp1 = gBattleAnimArgs[2]; + gBattleAnimArgs[2] = -temp1; + + temp2 = gBattleAnimArgs[0]; + gBattleAnimArgs[0] = -temp2; + } + } + } + + sub_80787B0(sprite, 1); + + lVarX = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[2]; + lVarY = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[3]; + rot = sub_80790F0(lVarX - sprite->pos1.x, lVarY - sprite->pos1.y); + rot += 0xC000; + sub_8078FDC(sprite, FALSE, 0x100, 0x100, rot); + + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[2] = lVarX; + sprite->data[4] = lVarY; + + sprite->callback = sub_8078B34; + StoreSpriteCallbackInData(sprite, DestroyAnimSprite); +} + +// used in 2 moves: +// Move_PIN_MISSILE, Move_ICICLE_SPEAR +void sub_80DCCFC(struct Sprite *sprite) +{ + sub_80787B0(sprite, 1); + + if (GetBankSide(gAnimBankAttacker)) + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[2] = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[2]; + sprite->data[4] = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[3]; + sprite->data[5] = gBattleAnimArgs[5]; + sub_80786EC(sprite); + + sprite->callback = sub_80DCD78; + sprite->invisible = TRUE; +} + +void sub_80DCD78(struct Sprite *sprite) +{ + sprite->invisible = FALSE; + + if (sub_8078718(sprite)) + { + DestroyAnimSprite(sprite); + } + else + { + s16 tempData[8]; + u16 *data = sprite->data; + u16 x1 = sprite->pos1.x; + s16 x2 = sprite->pos2.x; + u16 y1 = sprite->pos1.y; + s16 y2 = sprite->pos2.y; + int i; + + for (i = 0; i < 8; i++) + tempData[i] = data[i]; + + x2 += x1; + y2 += y1; + + if (!sub_8078718(sprite)) + { + u16 rot = sub_80790F0(sprite->pos1.x + sprite->pos2.x - x2, + sprite->pos1.y + sprite->pos2.y - y2); + rot += 0xC000; + sub_8078FDC(sprite, FALSE, 0x100, 0x100, rot); + + for (i = 0; i < 8; i++) + data[i] = tempData[i]; + } + } +} + +void sub_80DCE40(struct Sprite *sprite) +{ + if (gBattleAnimArgs[0] == 0) + { + sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2); + sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3) + 18; + } + else + { + sprite->pos1.x = GetBankPosition(gAnimBankTarget, 2); + sprite->pos1.y = GetBankPosition(gAnimBankTarget, 3) + 18; + } + + StoreSpriteCallbackInData(sprite, move_anim_8074EE0); + sprite->callback = sub_80785E4; +} diff --git a/src/battle/anim/bullet.c b/src/battle/anim/bullet.c index 90b2021f1..90b2021f1 100755..100644 --- a/src/battle/anim/bullet.c +++ b/src/battle/anim/bullet.c diff --git a/src/battle/anim/copy_orb.c b/src/battle/anim/copy_orb.c index 4fa8ea163..4fa8ea163 100755..100644 --- a/src/battle/anim/copy_orb.c +++ b/src/battle/anim/copy_orb.c diff --git a/src/battle/anim/cube.c b/src/battle/anim/cube.c index 9adf46e32..9adf46e32 100755..100644 --- a/src/battle/anim/cube.c +++ b/src/battle/anim/cube.c diff --git a/src/battle/anim/curtain.c b/src/battle/anim/curtain.c index 3c9e4e84c..3c9e4e84c 100755..100644 --- a/src/battle/anim/curtain.c +++ b/src/battle/anim/curtain.c diff --git a/src/battle/anim/cutter.c b/src/battle/anim/cutter.c index 2234ebacb..2234ebacb 100755..100644 --- a/src/battle/anim/cutter.c +++ b/src/battle/anim/cutter.c diff --git a/src/battle/anim/cyclone.c b/src/battle/anim/cyclone.c index 0f83df211..0f83df211 100755..100644 --- a/src/battle/anim/cyclone.c +++ b/src/battle/anim/cyclone.c diff --git a/src/battle/anim/dark.c b/src/battle/anim/dark.c new file mode 100644 index 000000000..1c88dc23e --- /dev/null +++ b/src/battle/anim/dark.c @@ -0,0 +1,1008 @@ +#include "global.h" +#include "battle_anim.h" +#include "blend_palette.h" +#include "decompress.h" +#include "ewram.h" +#include "palette.h" +#include "rom_8077ABC.h" +#include "scanline_effect.h" +#include "sound.h" +#include "sprite.h" +#include "trig.h" +#include "constants/battle_constants.h" + +extern s16 gBattleAnimArgs[]; +extern u8 gAnimBankAttacker; +extern u8 gAnimBankTarget; +extern u8 gObjectBankIDs[]; +extern u16 gBattle_BG1_X; +extern u16 gBattle_BG1_Y; +extern u16 gBattle_BG2_X; +extern u16 gBattle_BG2_Y; +extern u16 gBattle_WIN0H; +extern u16 gBattle_WIN0V; +extern u16 gBattlePartyID[]; +extern u8 gAnimMoveTurn; + +extern const u8 gUnknown_08D1D574[]; +extern const u8 gUnknown_08D1D410[]; +extern const u16 gUnknown_08D1D54C[]; + +static void sub_80DFE90(struct Sprite *sprite); +static void sub_80DFC9C(u8 taskId); +static void sub_80DFD58(u8 taskId); +static void sub_80DFF58(struct Sprite *sprite); +static void sub_80DFF98(struct Sprite *sprite); +static void sub_80E00D0(struct Sprite *sprite); +static void sub_80E02A4(u8 taskId); +static void sub_80E0620(u8 taskId); +static void sub_80E08CC(u8 priority); +static void sub_80E079C(struct Task *task); +static void sub_80E0CD0(u8 taskId); + + +// used in Smoke Ball escape, Sky Attack, Feint Attack and Camouflage +void sub_80DFC24(u8 taskId) +{ + int bank; + gTasks[taskId].data[0] = gBattleAnimArgs[0]; + bank = gAnimBankAttacker; + gTasks[taskId].data[1] = 16; + REG_BLDALPHA = 16; + if (GetBankIdentity_permutated(bank) == 1) + REG_BLDCNT = 0x3F42; + else + REG_BLDCNT = 0x3F44; + gTasks[taskId].func = sub_80DFC9C; +} + +static void sub_80DFC9C(u8 taskId) +{ + u8 r2 = gTasks[taskId].data[1] >> 8; + u8 r1 = gTasks[taskId].data[1]; + if (gTasks[taskId].data[2] == (u8)gTasks[taskId].data[0]) + { + r2++; + r1--; + gTasks[taskId].data[1] = (r2 << 8) | r1; + REG_BLDALPHA = (r2 << 8) | r1; + gTasks[taskId].data[2] = 0; + if (r2 == 16) + { + gSprites[gObjectBankIDs[gAnimBankAttacker]].invisible = 1; + DestroyAnimVisualTask(taskId); + } + } + else + gTasks[taskId].data[2]++; +} + +void sub_80DFD24(u8 taskId) +{ + gTasks[taskId].data[0] = gBattleAnimArgs[0]; + gTasks[taskId].data[1] = 0x1000; + gTasks[taskId].func = sub_80DFD58; + REG_BLDALPHA = 0x1000; +} + +void sub_80DFD58(u8 taskId) +{ + u8 r1 = gTasks[taskId].data[1] >> 8; + u8 r5 = gTasks[taskId].data[1]; + if (gTasks[taskId].data[2] == (u8)gTasks[taskId].data[0]) + { + r1--; + r5++; + gTasks[taskId].data[1] = (r1 << 8) | r5; + REG_BLDALPHA = (r1 << 8) | r5; + gTasks[taskId].data[2] = 0; + if (r1 == 0) + { + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + DestroyAnimVisualTask(taskId); + } + } + else + gTasks[taskId].data[2]++; +} + +// unlike the above is only used in Feint Attack + +void sub_80DFDC0(u8 taskId) +{ + REG_BLDALPHA = 0x1000; + if (GetBankIdentity_permutated(gAnimBankAttacker) == 1) + REG_BLDCNT = 0x3F42; + else + REG_BLDCNT = 0x3F44; + DestroyAnimVisualTask(taskId); +} + +// unused sprite template's callback + +void sub_80DFE14(struct Sprite *sprite) +{ + sprite->data[1] = GetBankPosition(gAnimBankTarget, 2); + sprite->data[2] = GetBankPosition(gAnimBankAttacker, 2); + sprite->data[3] = GetBankPosition(gAnimBankTarget, 3); + sprite->data[4] = GetBankPosition(gAnimBankAttacker, 3); + sprite->data[0] = 0x7E; + sub_8078A5C(sprite); + sprite->data[3] = -sprite->data[1]; + sprite->data[4] = -sprite->data[2]; + sprite->data[6] = 0xFFD8; + sprite->callback = sub_80DFE90; + sub_80DFE90(sprite); +} + +static void sub_80DFE90(struct Sprite *sprite) +{ + sprite->data[3] += sprite->data[1]; + sprite->data[4] += sprite->data[2]; + sprite->pos2.x = sprite->data[3] >> 8; + sprite->pos2.y = sprite->data[4] >> 8; + if (sprite->data[7] == 0) + { + sprite->data[3] += sprite->data[1]; + sprite->data[4] += sprite->data[2]; + sprite->pos2.x = sprite->data[3] >> 8; + sprite->pos2.y = sprite->data[4] >> 8; + sprite->data[0]--; + } + sprite->pos2.y += Sin(sprite->data[5], sprite->data[6]); + sprite->data[5] = (sprite->data[5] + 3) & 0xFF; + if (sprite->data[5] > 0x7F) + { + sprite->data[5] = 0; + sprite->data[6] += 20; + sprite->data[7]++; + } + if (--sprite->data[0] == 0) + DestroyAnimSprite(sprite); +} + +void sub_80DFF1C(struct Sprite *sprite) +{ + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += gBattleAnimArgs[1]; + StartSpriteAffineAnim(sprite, gBattleAnimArgs[2]); + + sprite->data[0] = gBattleAnimArgs[3]; + sprite->data[1] = gBattleAnimArgs[4]; + sprite->data[2] = gBattleAnimArgs[5]; + sprite->callback = sub_80DFF58; +} + +static void sub_80DFF58(struct Sprite *sprite) +{ + sprite->data[4] += sprite->data[0]; + sprite->data[5] += sprite->data[1]; + sprite->pos2.x = sprite->data[4] >> 8; + sprite->pos2.y = sprite->data[5] >> 8; + + if (++sprite->data[3] == sprite->data[2]) + sprite->callback = sub_80DFF98; +} + +static void sub_80DFF98(struct Sprite *sprite) +{ + sprite->data[4] -= sprite->data[0]; + sprite->data[5] -= sprite->data[1]; + sprite->pos2.x = sprite->data[4] >> 8; + sprite->pos2.y = sprite->data[5] >> 8; + + if (--sprite->data[3] == 0) + move_anim_8074EE0(sprite); +} + +void sub_80DFFD0(struct Sprite *sprite) +{ + u8 bank; + s8 xOffset; + + if (gBattleAnimArgs[0] == 0) + bank = gAnimBankAttacker; + else + bank = gAnimBankTarget; + + xOffset = 20; + sprite->oam.tileNum += 4; + + switch (gBattleAnimArgs[1]) + { + case 0: + sprite->pos1.x = sub_807A100(bank, 5) - 8; + sprite->pos1.y = sub_807A100(bank, 2) + 8; + break; + case 1: + sprite->pos1.x = sub_807A100(bank, 5) - 14; + sprite->pos1.y = sub_807A100(bank, 2) + 16; + break; + case 2: + sprite->pos1.x = sub_807A100(bank, 4) + 8; + sprite->pos1.y = sub_807A100(bank, 2) + 8; + StartSpriteAffineAnim(sprite, 1); + xOffset = -20; + break; + case 3: + sprite->pos1.x = sub_807A100(bank, 4) + 14; + sprite->pos1.y = sub_807A100(bank, 2) + 16; + StartSpriteAffineAnim(sprite, 1); + xOffset = -20; + break; + } + + sprite->data[0] = 32; + sprite->data[2] = sprite->pos1.x + xOffset; + sprite->data[4] = sprite->pos1.y + 12; + sprite->data[5] = -12; + + sub_80786EC(sprite); + sprite->callback = sub_80E00D0; +} + +static void sub_80E00D0(struct Sprite *sprite) +{ + if (sub_8078718(sprite)) + move_anim_8074EE0(sprite); +} + +void sub_80E00EC(u8 taskId) +{ + struct ScanlineEffectParams scanlineParams; + struct Struct_sub_8078914 subStruct; + u16 i; + u8 pos; + int var0; + struct Task *task = &gTasks[taskId]; + + task->data[7] = GetBankPosition(gAnimBankAttacker, 1) + 31; + task->data[6] = sub_807A100(gAnimBankAttacker, 2) - 7; + task->data[5] = task->data[7]; + task->data[4] = task->data[6]; + task->data[13] = (task->data[7] - task->data[6]) << 8; + + pos = GetBankPosition(gAnimBankAttacker, 0); + task->data[14] = pos - 32; + task->data[15] = pos + 32; + + if (GetBankSide(gAnimBankAttacker) == SIDE_PLAYER) + task->data[8] = -12; + else + task->data[8] = -64; + + task->data[3] = GetBankIdentity_permutated(gAnimBankAttacker); + if (task->data[3] == 1) + { + sub_8078914(&subStruct); + task->data[10] = gBattle_BG1_Y; + REG_BLDCNT = 0x3F42; + FillPalette(0, subStruct.field_8 << 4, 32); + scanlineParams.dmaDest = ®_BG1VOFS; + var0 = 2; + + if (!IsContest()) + gBattle_BG2_X += 240; + } + else + { + task->data[10] = gBattle_BG2_Y; + REG_BLDCNT = 0x3F44; + FillPalette(0, 144, 32); + scanlineParams.dmaDest = ®_BG2VOFS; + var0 = 4; + + if (!IsContest()) + gBattle_BG1_X += 240; + } + + scanlineParams.dmaControl = 0xA2600001; + scanlineParams.initState = 1; + scanlineParams.unused9 = 0; + task->data[11] = 0; + task->data[12] = 16; + task->data[0] = 0; + task->data[1] = 0; + task->data[2] = 0; + + sub_80E08CC(3); + + for (i = 0; i < 112; i++) + { + gScanlineEffectRegBuffers[0][i] = task->data[10]; + gScanlineEffectRegBuffers[1][i] = task->data[10]; + } + + ScanlineEffect_SetParams(scanlineParams); + + REG_WINOUT = 0x3F00 | (var0 ^ 0x3F); + REG_WININ = 0x3F3F; + gBattle_WIN0H = (task->data[14] << 8) | task->data[15]; + gBattle_WIN0V = 160; + + task->func = sub_80E02A4; +} + +static void sub_80E02A4(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + if (++task->data[1] > 1) + { + task->data[1] = 0; + if (++task->data[2] & 1) + { + if (task->data[11] != 12) + task->data[11]++; + } + else + { + if (task->data[12] != 8) + task->data[12]--; + } + + REG_BLDALPHA = (task->data[12] << 8) | task->data[11]; + + if (task->data[11] == 12 && task->data[12] == 8) + task->data[0]++; + } + break; + case 1: + task->data[4] -= 8; + sub_80E079C(task); + + if (task->data[4] < task->data[8]) + task->data[0]++; + break; + case 2: + task->data[4] -= 8; + sub_80E079C(task); + task->data[14] += 4; + task->data[15] -= 4; + + if (task->data[14] >= task->data[15]) + task->data[14] = task->data[15]; + + gBattle_WIN0H = (task->data[14] << 8) | task->data[15]; + + if (task->data[14] == task->data[15]) + task->data[0]++; + break; + case 3: + gScanlineEffect.state = 3; + task->data[0]++; + break; + case 4: + DestroyAnimVisualTask(taskId); + break; + } +} + +void sub_80E03BC(u8 taskId) +{ + struct Struct_sub_8078914 subStruct; + struct ScanlineEffectParams scanlineParams; + u8 pos; + u16 i; + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + if (IsContest() == TRUE) + { + gBattle_WIN0H = 0; + gBattle_WIN0V = 0; + REG_WININ = 0x3F3F; + REG_WINOUT = 0x3F3F; + DestroyAnimVisualTask(taskId); + } + else + { + task->data[3] = GetBankIdentity_permutated(gAnimBankTarget); + if (task->data[3] == 1) + { + REG_BLDCNT = 0x3F42; + gBattle_BG2_X += 240; + } + else + { + REG_BLDCNT = 0x3F44; + gBattle_BG1_X += 240; + } + + task->data[0]++; + } + break; + case 1: + if (task->data[3] == 1) + { + sub_8078914(&subStruct); + task->data[10] = gBattle_BG1_Y; + FillPalette(0, subStruct.field_8 << 4, 32); + } + else + { + task->data[10] = gBattle_BG2_Y; + FillPalette(0, 144, 32); + } + + sub_80E08CC(3); + task->data[0]++; + break; + case 2: + task->data[7] = GetBankPosition(gAnimBankTarget, 1) + 31; + task->data[6] = sub_807A100(gAnimBankTarget, 2) - 7; + task->data[13] = (task->data[7] - task->data[6]) << 8; + pos = GetBankPosition(gAnimBankTarget, 0); + task->data[14] = pos - 4; + task->data[15] = pos + 4; + + if (GetBankSide(gAnimBankTarget) == SIDE_PLAYER) + task->data[8] = -12; + else + task->data[8] = -64; + + task->data[4] = task->data[8]; + task->data[5] = task->data[8]; + task->data[11] = 12; + task->data[12] = 8; + task->data[0]++; + break; + case 3: + if (task->data[3] == 1) + scanlineParams.dmaDest = ®_BG1VOFS; + else + scanlineParams.dmaDest = ®_BG2VOFS; + + for (i = 0; i < 112; i++) + { + gScanlineEffectRegBuffers[0][i] = task->data[10] + (159 - i); + gScanlineEffectRegBuffers[1][i] = task->data[10] + (159 - i); + } + + scanlineParams.dmaControl = 0xA2600001; + scanlineParams.initState = 1; + scanlineParams.unused9 = 0; + ScanlineEffect_SetParams(scanlineParams); + task->data[0]++; + break; + case 4: + if (task->data[3] == 1) + REG_WINOUT = 0x3F3D; + else + REG_WINOUT = 0x3F3B; + + REG_WININ = 0x3F3F; + gBattle_WIN0H = (task->data[14] << 8) | task->data[15]; + gBattle_WIN0V = 160; + + task->data[0] = 0; + task->data[1] = 0; + task->data[2] = 0; + REG_BLDALPHA = 0x80C; + task->func = sub_80E0620; + break; + } +} + +static void sub_80E0620(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + task->data[5] += 8; + if (task->data[5] >= task->data[7]) + task->data[5] = task->data[7]; + + sub_80E079C(task); + + if (task->data[5] == task->data[7]) + task->data[0]++; + break; + case 1: + if (task->data[15] - task->data[14] < 64) + { + task->data[14] -= 4; + task->data[15] += 4; + } + else + { + task->data[1] = 1; + } + + gBattle_WIN0H = (task->data[14] << 8) | task->data[15]; + task->data[4] += 8; + + if (task->data[4] >= task->data[6]) + task->data[4] = task->data[6]; + + sub_80E079C(task); + + if (task->data[4] == task->data[6] && task->data[1] != 0) + { + task->data[1] = 0; + task->data[0]++; + } + break; + case 2: + if (++task->data[1] > 1) + { + task->data[1] = 0; + if ((++task->data[2] & 1) != 0) + { + if (task->data[11] != 0) + task->data[11]--; + } + else + { + if (task->data[12] < 16) + task->data[12]++; + } + + REG_BLDALPHA = (task->data[12] << 8) | task->data[11]; + + if (task->data[11] == 0 && task->data[12] == 16) + task->data[0]++; + } + break; + case 3: + gScanlineEffect.state = 3; + task->data[0]++; + break; + case 4: + gBattle_WIN0H = 0; + gBattle_WIN0V = 0; + REG_WININ = 0x3F3F; + REG_WINOUT = 0x3F3F; + DestroyAnimVisualTask(taskId); + break; + } +} + +// static void sub_80E079C(struct Task *task) +// { +// int var0, var1; +// s16 var2; +// s16 i, j; + +// var2 = task->data[5] - task->data[4]; +// if (var2 != 0) +// { +// var0 = task->data[13] / var2; +// var1 = task->data[6]; + +// for (i = 0; i < task->data[4]; i++) +// { +// gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[10] - (i - 159); +// } + +// for (i = task->data[4]; i <= task->data[5]; i++) +// { +// if (i >= 0) +// { +// gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = (var1 - i) + task->data[10]; +// } + +// var1 += var0; +// } + +// for (j = i; j < task->data[7]; j++) +// { +// if (j >= 0) +// { +// gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][j] = (task->data[10] + 159) - j; +// } +// } +// } +// else +// { +// for (i = 0; i < 112; i++) +// { +// gScanlineEffectRegBuffers[0][i] = task->data[10] + 159 - i; +// gScanlineEffectRegBuffers[1][i] = task->data[10] + 159 - i; +// } +// } +// } + +__attribute__((naked)) +static void sub_80E079C(struct Task *task) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + adds r6, r0, 0\n\ + ldrh r0, [r6, 0x12]\n\ + ldrh r4, [r6, 0x10]\n\ + subs r0, r4\n\ + lsls r0, 16\n\ + asrs r1, r0, 16\n\ + cmp r1, 0\n\ + beq _080E0890\n\ + movs r2, 0x22\n\ + ldrsh r0, [r6, r2]\n\ + bl __divsi3\n\ + mov r8, r0\n\ + movs r3, 0x14\n\ + ldrsh r0, [r6, r3]\n\ + lsls r5, r0, 8\n\ + lsls r0, r4, 16\n\ + movs r4, 0\n\ + cmp r0, 0\n\ + ble _080E07FC\n\ + ldr r0, _080E0888 @ =gScanlineEffectRegBuffers\n\ + mov r12, r0\n\ + ldr r7, _080E088C @ =gScanlineEffect\n\ +_080E07D0:\n\ + lsls r2, r4, 16\n\ + asrs r2, 16\n\ + lsls r3, r2, 1\n\ + ldrb r1, [r7, 0x14]\n\ + lsls r0, r1, 4\n\ + subs r0, r1\n\ + lsls r0, 7\n\ + adds r3, r0\n\ + add r3, r12\n\ + adds r1, r2, 0\n\ + subs r1, 0x9F\n\ + ldrh r0, [r6, 0x1C]\n\ + subs r0, r1\n\ + strh r0, [r3]\n\ + adds r2, 0x1\n\ + lsls r2, 16\n\ + lsrs r4, r2, 16\n\ + asrs r2, 16\n\ + movs r1, 0x10\n\ + ldrsh r0, [r6, r1]\n\ + cmp r2, r0\n\ + blt _080E07D0\n\ +_080E07FC:\n\ + ldrh r4, [r6, 0x10]\n\ + lsls r3, r4, 16\n\ + asrs r1, r3, 16\n\ + movs r2, 0x12\n\ + ldrsh r0, [r6, r2]\n\ + cmp r1, r0\n\ + bgt _080E0846\n\ + ldr r0, _080E0888 @ =gScanlineEffectRegBuffers\n\ + mov r12, r0\n\ + ldr r7, _080E088C @ =gScanlineEffect\n\ +_080E0810:\n\ + asrs r4, r3, 16\n\ + cmp r4, 0\n\ + blt _080E0832\n\ + asrs r1, r5, 8\n\ + subs r1, r4\n\ + lsls r3, r4, 1\n\ + ldrb r2, [r7, 0x14]\n\ + lsls r0, r2, 4\n\ + subs r0, r2\n\ + lsls r0, 7\n\ + adds r3, r0\n\ + add r3, r12\n\ + lsls r1, 16\n\ + asrs r1, 16\n\ + ldrh r2, [r6, 0x1C]\n\ + adds r1, r2\n\ + strh r1, [r3]\n\ +_080E0832:\n\ + add r5, r8\n\ + adds r0, r4, 0x1\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + lsls r3, r4, 16\n\ + asrs r1, r3, 16\n\ + movs r2, 0x12\n\ + ldrsh r0, [r6, r2]\n\ + cmp r1, r0\n\ + ble _080E0810\n\ +_080E0846:\n\ + movs r3, 0x1C\n\ + ldrsh r0, [r6, r3]\n\ + adds r0, 0x9F\n\ + lsls r2, r4, 16\n\ + asrs r1, r2, 16\n\ + subs r5, r0, r1\n\ + movs r3, 0x16\n\ + ldrsh r0, [r6, r3]\n\ + cmp r1, r0\n\ + bge _080E08BE\n\ + ldr r7, _080E0888 @ =gScanlineEffectRegBuffers\n\ + ldr r4, _080E088C @ =gScanlineEffect\n\ +_080E085E:\n\ + asrs r3, r2, 16\n\ + cmp r3, 0\n\ + blt _080E0876\n\ + lsls r2, r3, 1\n\ + ldrb r1, [r4, 0x14]\n\ + lsls r0, r1, 4\n\ + subs r0, r1\n\ + lsls r0, 7\n\ + adds r2, r0\n\ + adds r2, r7\n\ + strh r5, [r2]\n\ + subs r5, 0x1\n\ +_080E0876:\n\ + adds r0, r3, 0x1\n\ + lsls r2, r0, 16\n\ + asrs r1, r2, 16\n\ + movs r3, 0x16\n\ + ldrsh r0, [r6, r3]\n\ + cmp r1, r0\n\ + blt _080E085E\n\ + b _080E08BE\n\ + .align 2, 0\n\ +_080E0888: .4byte gScanlineEffectRegBuffers\n\ +_080E088C: .4byte gScanlineEffect\n\ +_080E0890:\n\ + movs r1, 0x1C\n\ + ldrsh r0, [r6, r1]\n\ + adds r5, r0, 0\n\ + adds r5, 0x9F\n\ + movs r4, 0\n\ + ldr r3, _080E08C8 @ =gScanlineEffectRegBuffers\n\ + movs r2, 0xF0\n\ + lsls r2, 3\n\ + adds r6, r3, r2\n\ +_080E08A2:\n\ + lsls r0, r4, 16\n\ + asrs r0, 16\n\ + lsls r2, r0, 1\n\ + adds r1, r2, r3\n\ + strh r5, [r1]\n\ + adds r2, r6\n\ + strh r5, [r2]\n\ + subs r5, 0x1\n\ + adds r0, 0x1\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x6F\n\ + ble _080E08A2\n\ +_080E08BE:\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080E08C8: .4byte gScanlineEffectRegBuffers\n\ + .syntax divided\n"); +} + +static void sub_80E08CC(u8 priority) +{ + u16 i; + + for (i = 0; i < 4; i++) + { + u8 spriteId = GetAnimBankSpriteId(i); + if (spriteId != 0xFF) + gSprites[spriteId].oam.priority = priority; + } +} + +void sub_80E0918(u8 taskId) +{ + u8 toBG2 = GetBankIdentity_permutated(gAnimBankAttacker) ^ 1 ? 1 : 0; + sub_8076034(gAnimBankAttacker, toBG2); + gSprites[gObjectBankIDs[gAnimBankAttacker]].invisible = 0; + + if (IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2)) + { + sub_8076034(gAnimBankAttacker ^ 2, toBG2 ^ 1); + gSprites[gObjectBankIDs[gAnimBankAttacker ^ 2]].invisible = 0; + } + + DestroyAnimVisualTask(taskId); +} + +void sub_80E09C4(u8 taskId) +{ + u8 toBG2 = GetBankIdentity_permutated(gAnimBankAttacker) ^ 1 ? 1 : 0; + sub_8076464(toBG2); + + if (IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2)) + sub_8076464(toBG2 ^ 1); + + DestroyAnimVisualTask(taskId); +} + +void sub_80E0A10(struct Sprite *sprite) +{ + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += gBattleAnimArgs[1]; + StartSpriteAnim(sprite, gBattleAnimArgs[2]); + sprite->callback = sub_8078600; + StoreSpriteCallbackInData(sprite, DestroyAnimSprite); +} + +void sub_80E0A4C(u8 taskId) +{ + u16 species; + u8 spriteId; + u8 newSpriteId; + u16 paletteNum; + struct Struct_sub_8078914 subStruct; + int var0 = 0; + + gBattle_WIN0H = var0; + gBattle_WIN0V = var0; + REG_WININ = 0x3F3F; + REG_WINOUT = 0x3F3D; + REG_DISPCNT |= DISPCNT_OBJWIN_ON; + REG_BLDCNT = 0x3F42; + REG_BLDALPHA = 0xC08; + REG_BG1CNT_BITFIELD.priority = 0; + REG_BG1CNT_BITFIELD.screenSize = 0; + if (!IsContest()) + REG_BG1CNT_BITFIELD.charBaseBlock = 1; + + if (IsDoubleBattle() && !IsContest()) + { + if (GetBankIdentity(gAnimBankAttacker) == 3 || GetBankIdentity(gAnimBankAttacker) == 0) + { + if (IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2) == TRUE) + { + gSprites[gObjectBankIDs[gAnimBankAttacker ^ 2]].oam.priority--; + REG_BG1CNT_BITFIELD.priority = 1; + var0 = 1; + } + } + } + + if (IsContest()) + { + species = EWRAM_19348; + } + else + { + if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) + species = GetMonData(&gEnemyParty[gBattlePartyID[gAnimBankAttacker]], MON_DATA_SPECIES); + else + species = GetMonData(&gPlayerParty[gBattlePartyID[gAnimBankAttacker]], MON_DATA_SPECIES); + } + + spriteId = GetAnimBankSpriteId(0); + newSpriteId = sub_807A4A0(gAnimBankAttacker, spriteId, species); + + sub_8078914(&subStruct); + DmaClear32(3, subStruct.field_4, 0x1000); + LZDecompressVram(&gUnknown_08D1D574, subStruct.field_4); + LZDecompressVram(&gUnknown_08D1D410, subStruct.field_0); + LoadCompressedPalette(&gUnknown_08D1D54C, subStruct.field_8 << 4, 32); + + gBattle_BG1_X = -gSprites[spriteId].pos1.x + 96; + gBattle_BG1_Y = -gSprites[spriteId].pos1.y + 32; + paletteNum = 16 + gSprites[spriteId].oam.paletteNum; + + if (gBattleAnimArgs[1] == 0) + sub_8079108(paletteNum, FALSE); + else + BlendPalette(paletteNum * 16, 16, 11, gBattleAnimArgs[2]); + + gTasks[taskId].data[0] = newSpriteId; + gTasks[taskId].data[1] = gBattleAnimArgs[0]; + gTasks[taskId].data[2] = gBattleAnimArgs[1]; + gTasks[taskId].data[3] = gBattleAnimArgs[2]; + gTasks[taskId].data[6] = var0; + gTasks[taskId].func = sub_80E0CD0; +} + +static void sub_80E0CD0(u8 taskId) +{ + struct Struct_sub_8078914 subStruct; + u16 paletteNum; + u8 spriteId; + u8 taskIdCopy = taskId; + + gTasks[taskIdCopy].data[10] += 4; + gBattle_BG1_X -= 4; + + if (gTasks[taskIdCopy].data[10] == 128) + { + gTasks[taskIdCopy].data[10] = 0; + gBattle_BG1_X += 128; + + if (++gTasks[taskIdCopy].data[11] == 2) + { + sub_8076464(0); + gBattle_WIN0H = 0; + gBattle_WIN0V = 0; + REG_WININ = 0x3F3F; + REG_WINOUT = 0x3F3F; + + if (!IsContest()) + REG_BG1CNT_BITFIELD.charBaseBlock = 0; + + REG_DISPCNT ^= DISPCNT_OBJWIN_ON; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + + spriteId = GetAnimBankSpriteId(0); + paletteNum = 16 + gSprites[spriteId].oam.paletteNum; + if (gTasks[taskIdCopy].data[1] == 0) + sub_8079108(paletteNum, 1); + + DestroySprite(&gSprites[gTasks[taskIdCopy].data[0]]); + sub_8078914(&subStruct); + DmaClear32(3, subStruct.field_4, 0x800); + + if (gTasks[taskIdCopy].data[6] == 1) + { + gSprites[gObjectBankIDs[gAnimBankAttacker ^ 2]].oam.priority++; + } + + DestroyAnimVisualTask(taskIdCopy); + } + } +} + +void sub_80E0E24(u8 taskId) +{ + u8 spriteId; + u8 bank; + bool8 calcSpriteId = FALSE; + u8 identity = 0; + + switch (gBattleAnimArgs[0]) + { + case 0: + case 1: + case 2: + case 3: + spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]); + break; + case 4: + identity = IDENTITY_PLAYER_MON1; + calcSpriteId = TRUE; + break; + case 5: + identity = IDENTITY_PLAYER_MON2; + calcSpriteId = TRUE; + break; + case 6: + identity = IDENTITY_OPPONENT_MON1; + calcSpriteId = TRUE; + break; + case 7: + identity = IDENTITY_OPPONENT_MON2; + calcSpriteId = TRUE; + break; + default: + spriteId = 0xFF; + break; + } + + if (calcSpriteId) + { + bank = GetBankByIdentity(identity); + if (IsAnimBankSpriteVisible(bank)) + spriteId = gObjectBankIDs[bank]; + else + spriteId = 0xFF; + } + + if (spriteId != 0xFF) + sub_8079108(gSprites[spriteId].oam.paletteNum + 16, gBattleAnimArgs[1]); + + DestroyAnimVisualTask(taskId); +} + +void sub_80E0EE8(u8 taskId) +{ + if (gAnimMoveTurn < 2) + gBattleAnimArgs[7] = 0; + + if (gAnimMoveTurn == 2) + gBattleAnimArgs[7] = 1; + + DestroyAnimVisualTask(taskId); +} diff --git a/src/battle/anim/dragon.c b/src/battle/anim/dragon.c new file mode 100644 index 000000000..bf39e01c0 --- /dev/null +++ b/src/battle/anim/dragon.c @@ -0,0 +1,275 @@ +#include "global.h" +#include "rom_8077ABC.h" +#include "trig.h" +#include "battle_anim.h" +#include "sound.h" +#include "scanline_effect.h" + +void sub_80DF81C(struct Sprite *sprite); +void sub_80DFBD8(struct Sprite *sprite); + +void sub_80DF9F4(u8 taskId); + +void sub_80DFAB0(struct Task *task); + +extern s16 gBattleAnimArgs[]; +extern u8 gAnimBankAttacker; +extern u8 gAnimBankTarget; +extern u8 gBankAttacker; +extern u16 gBattle_BG1_X; +extern u16 gBattle_BG2_X; +extern u16 gUnknown_03000730[]; +extern u8 gObjectBankIDs[]; + +// Outrage + +void sub_80DF5A0(struct Sprite *sprite) +{ + sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2); + sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3); + if (GetBankSide(gAnimBankAttacker)) + { + sprite->pos1.x -= gBattleAnimArgs[0]; + gBattleAnimArgs[3] = -gBattleAnimArgs[3]; + gBattleAnimArgs[4] = -gBattleAnimArgs[4]; + } + else + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += gBattleAnimArgs[1]; + sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[1] = gBattleAnimArgs[3]; + sprite->data[3] = gBattleAnimArgs[4]; + sprite->data[5] = gBattleAnimArgs[5]; + sprite->invisible = 1; + StoreSpriteCallbackInData(sprite, move_anim_8074EE0); + sprite->callback = sub_8078504; +} + +// part of Dragon Breath + +void sub_80DF63C(struct Sprite *sprite) +{ + sub_8078650(sprite); + sprite->data[2] = GetBankPosition(gAnimBankTarget, 2); + sprite->data[4] = GetBankPosition(gAnimBankTarget, 3); + if (GetBankSide(gAnimBankAttacker)) + { + sprite->pos1.x -= gBattleAnimArgs[1]; + sprite->pos1.y += gBattleAnimArgs[1]; + sprite->data[2] -= gBattleAnimArgs[2]; + sprite->data[4] += gBattleAnimArgs[3]; + } + else + { + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += gBattleAnimArgs[1]; + sprite->data[2] += gBattleAnimArgs[2]; + sprite->data[4] += gBattleAnimArgs[3]; + StartSpriteAnim(sprite, 1); + } + sprite->data[0] = gBattleAnimArgs[4]; + sprite->callback = sub_8078B34; + StoreSpriteCallbackInData(sprite, move_anim_8074EE0); +} + +// Dragon Rage + +void sub_80DF6F0(struct Sprite *sprite) +{ + if (gBattleAnimArgs[0] == 0) + { + sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 0); + sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 1); + } + else + { + sprite->pos1.x = GetBankPosition(gAnimBankTarget, 0); + sprite->pos1.y = GetBankPosition(gAnimBankTarget, 1); + } + sub_807867C(sprite, gBattleAnimArgs[1]); + sprite->pos1.y += gBattleAnimArgs[2]; + sprite->callback = sub_8078600; + StoreSpriteCallbackInData(sprite, move_anim_8074EE0); +} + +// Dragon Breath init + +void sub_80DF760(struct Sprite *sprite) +{ + if (GetBankSide(gAnimBankAttacker)) + StartSpriteAffineAnim(sprite, 1); + sub_80DF63C(sprite); +} + +//next 2 tasks might be Dragon Dance orbs? + +void sub_80DF78C(struct Sprite *sprite) +{ + u16 r5; + u16 r0; + sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2); + sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3); + sprite->data[4] = 0; + sprite->data[5] = 1; + sprite->data[6] = gBattleAnimArgs[0]; + r5 = sub_807A100(gBankAttacker, 0); + r0 = sub_807A100(gBankAttacker, 1); + if (r5 > r0) + sprite->data[7] = r5 / 2; + else + sprite->data[7] = r0 / 2; + sprite->pos2.x = Cos(sprite->data[6], sprite->data[7]); + sprite->pos2.y = Sin(sprite->data[6], sprite->data[7]); + sprite->callback = sub_80DF81C; +} + +void sub_80DF81C(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->data[6] = (sprite->data[6] - sprite->data[5]) & 0xFF; + sprite->pos2.x = Cos(sprite->data[6], sprite->data[7]); + sprite->pos2.y = Sin(sprite->data[6], sprite->data[7]); + if (++sprite->data[4] > 5) + { + sprite->data[4] = 0; + if (sprite->data[5] <= 15 && ++sprite->data[5] > 15) + sprite->data[5] = 16; + } + if (++sprite->data[3] > 0x3C) + { + sprite->data[3] = 0; + sprite->data[0]++; + } + break; + case 1: + sprite->data[6] = (sprite->data[6] - sprite->data[5]) & 0xFF; + if (sprite->data[7] <= 0x95 && (sprite->data[7] += 8) > 0x95) + sprite->data[7] = 0x96; + sprite->pos2.x = Cos(sprite->data[6], sprite->data[7]); + sprite->pos2.y = Sin(sprite->data[6], sprite->data[7]); + if (++sprite->data[4] > 5) + { + sprite->data[4] = 0; + if (sprite->data[5] <= 15 && ++sprite->data[5] > 15) + sprite->data[5] = 16; + } + if (++sprite->data[3] > 20) + DestroyAnimSprite(sprite); + break; + } +} + +// Dragon Dance scanline eff + +void sub_80DF924(u8 taskId) +{ + struct ScanlineEffectParams sp; + struct Task *task = &gTasks[taskId]; + u16 i; + u8 r1; + if (GetBankIdentity_permutated(gAnimBankAttacker) == 1) + { + sp.dmaDest = ®_BG1HOFS; + task->data[2] = gBattle_BG1_X; + } + else + { + sp.dmaDest = ®_BG2HOFS; + task->data[2] = gBattle_BG2_X; + } + sp.dmaControl = 0xA2600001; + sp.initState = 1; + sp.unused9 = 0; + r1 = sub_8077FC0(gAnimBankAttacker); + task->data[3] = r1 - 32; + task->data[4] = r1 + 32; + if (task->data[3] < 0) + task->data[3] = 0; + for(i = task->data[3];i <= task->data[4];i++) + { + gScanlineEffectRegBuffers[0][i] = task->data[2]; + gScanlineEffectRegBuffers[1][i] = task->data[2]; + } + ScanlineEffect_SetParams(sp); + task->func = sub_80DF9F4; +} + +void sub_80DF9F4(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + switch (task->data[0]) + { + case 0: + if (++task->data[7] > 1) + { + task->data[7] = 0; + if (++task->data[6] == 3) + task->data[0]++; + } + sub_80DFAB0(task); + break; + case 1: + if (++task->data[1] > 0x3C) + task->data[0]++; + sub_80DFAB0(task); + break; + case 2: + if (++task->data[7] > 1) + { + task->data[7] = 0; + if (--task->data[6] == 0) + task->data[0]++; + } + sub_80DFAB0(task); + break; + case 3: + gScanlineEffect.state = 3; + task->data[0]++; + break; + case 4: + DestroyAnimVisualTask(taskId); + break; + } +} + +void sub_80DFAB0(struct Task *task) +{ + u16 r3 = task->data[5]; + u16 i; + for (i = task->data[3]; i <= task->data[4]; i++) + { + gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = ((gSineTable[r3] * task->data[6]) >> 7) + task->data[2]; + r3 = (r3 + 8) & 0xFF; + } + task->data[5] = (task->data[5] + 9) & 0xFF; +} + +// Overheat + +void sub_80DFB28(struct Sprite *sprite) +{ + int r6 = (gBattleAnimArgs[2] * 3) / 5; + int i; + sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2); + sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3) + gBattleAnimArgs[4]; + sprite->data[1] = Cos(gBattleAnimArgs[1], gBattleAnimArgs[2]); + sprite->data[2] = Sin(gBattleAnimArgs[1], r6); + sprite->pos1.x += sprite->data[1] * gBattleAnimArgs[0]; + sprite->pos1.y += sprite->data[2] * gBattleAnimArgs[0]; + sprite->data[3] = gBattleAnimArgs[3]; + sprite->callback = sub_80DFBD8; + for (i = 0; i <= 6; i++) + gUnknown_03000730[i] = sprite->data[i]; +} + +void sub_80DFBD8(struct Sprite *sprite) +{ + sprite->data[4] += sprite->data[1]; + sprite->data[5] += sprite->data[2]; + sprite->pos2.x = sprite->data[4] / 10; + sprite->pos2.y = sprite->data[5] / 10; + if (++sprite->data[0] > sprite->data[3]) + DestroyAnimSprite(sprite); +} diff --git a/src/battle/anim/draw.c b/src/battle/anim/draw.c index 3adb62e06..f9e505bf2 100755..100644 --- a/src/battle/anim/draw.c +++ b/src/battle/anim/draw.c @@ -3,7 +3,7 @@ #include "trig.h" #include "battle_anim.h" #include "sound.h" -#include "unknown_task.h" +#include "scanline_effect.h" extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; @@ -21,7 +21,8 @@ static void sub_80D0E8C(struct Sprite* sprite); void sub_80D0C88(u8 taskId) { struct Task* task = &gTasks[taskId]; - struct UnknownTaskStruct sp; + struct ScanlineEffectParams params; + s16 i; task->data[0] = sub_8077FC0(gAnimBankTarget) + 32; task->data[1] = 4; @@ -30,30 +31,31 @@ void sub_80D0C88(u8 taskId) task->data[4] = 0; task->data[5] = 0; task->data[15] = sub_807A100(gAnimBankTarget, 0); + if (GetBankIdentity_permutated(gAnimBankTarget) == 1) { task->data[6] = gBattle_BG1_X; - sp.dest = (u16 *)REG_ADDR_BG1HOFS; + params.dmaDest = (u16 *)REG_ADDR_BG1HOFS; } else { task->data[6] = gBattle_BG2_X; - sp.dest = (u16 *)REG_ADDR_BG2HOFS; + params.dmaDest = (u16 *)REG_ADDR_BG2HOFS; } for (i = task->data[0] - 0x40; i <= task->data[0];i++) { if (i >= 0) { - gUnknown_03004DE0[0][i] = task->data[6] + 0xF0; - gUnknown_03004DE0[1][i] = task->data[6] + 0xF0; + gScanlineEffectRegBuffers[0][i] = task->data[6] + 0xF0; + gScanlineEffectRegBuffers[1][i] = task->data[6] + 0xF0; } } - sp.control = 0xa2600001; - sp.unk8 = 1; - sp.unk9 = 0; - sub_80895F8(sp); + params.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT; + params.initState = 1; + params.unused9 = 0; + ScanlineEffect_SetParams(params); task->func = sub_80D0D68; } @@ -91,13 +93,13 @@ void sub_80D0D68(u8 taskId) if (task->data[5] >= 0) { - gUnknown_03004DE0[0][task->data[5]] = task->data[6]; - gUnknown_03004DE0[1][task->data[5]] = task->data[6]; + gScanlineEffectRegBuffers[0][task->data[5]] = task->data[6]; + gScanlineEffectRegBuffers[1][task->data[5]] = task->data[6]; } if (++task->data[3] >= task->data[15]) { - gUnknown_03004DC0.unk15 = 3; + gScanlineEffect.unk15 = 3; DestroyAnimVisualTask(taskId); } } @@ -178,7 +180,7 @@ _080D0DE0:\n\ ldrsh r0, [r3, r1]\n\ cmp r0, 0\n\ blt _080D0E04\n\ - ldr r2, _080D0E28 @ =gUnknown_03004DE0\n\ + ldr r2, _080D0E28 @ =gScanlineEffectRegBuffers\n\ lsls r0, 1\n\ adds r0, r2\n\ ldrh r1, [r3, 0x14]\n\ @@ -202,7 +204,7 @@ _080D0E04:\n\ ldrsh r1, [r3, r2]\n\ cmp r0, r1\n\ blt _080D0E22\n\ - ldr r1, _080D0E2C @ =gUnknown_03004DC0\n\ + ldr r1, _080D0E2C @ =gScanlineEffect\n\ movs r0, 0x3\n\ strb r0, [r1, 0x15]\n\ adds r0, r4, 0\n\ @@ -212,8 +214,8 @@ _080D0E22:\n\ pop {r0}\n\ bx r0\n\ .align 2, 0\n\ -_080D0E28: .4byte gUnknown_03004DE0\n\ -_080D0E2C: .4byte gUnknown_03004DC0\n\ +_080D0E28: .4byte gScanlineEffectRegBuffers\n\ +_080D0E2C: .4byte gScanlineEffect\n\ .syntax divided\n"); } #endif diff --git a/src/battle/anim/drum.c b/src/battle/anim/drum.c index 6306778ae..6306778ae 100755..100644 --- a/src/battle/anim/drum.c +++ b/src/battle/anim/drum.c diff --git a/src/battle/anim/egg.c b/src/battle/anim/egg.c index 8004b3bf5..8004b3bf5 100755..100644 --- a/src/battle/anim/egg.c +++ b/src/battle/anim/egg.c diff --git a/src/battle/anim/espeed.c b/src/battle/anim/espeed.c index 469522092..469522092 100755..100644 --- a/src/battle/anim/espeed.c +++ b/src/battle/anim/espeed.c diff --git a/src/battle/anim/evasion.c b/src/battle/anim/evasion.c index ded8428d4..ded8428d4 100755..100644 --- a/src/battle/anim/evasion.c +++ b/src/battle/anim/evasion.c diff --git a/src/battle/anim/fang.c b/src/battle/anim/fang.c index 5ed7372a8..5ed7372a8 100755..100644 --- a/src/battle/anim/fang.c +++ b/src/battle/anim/fang.c diff --git a/src/battle/anim/fire_2.c b/src/battle/anim/fire_2.c index 6dc304232..4d577a765 100644 --- a/src/battle/anim/fire_2.c +++ b/src/battle/anim/fire_2.c @@ -23,8 +23,8 @@ void sub_80D57C4(u8 spriteId, u8 taskId, u8 a3); void sub_80D51A8(struct Sprite *sprite) { if (GetBankSide(gAnimBankAttacker) == GetBankSide(gAnimBankTarget) - && (gAnimBankAttacker == GetBankByPlayerAI(2) - || gAnimBankAttacker == GetBankByPlayerAI(3))) + && (gAnimBankAttacker == GetBankByIdentity(2) + || gAnimBankAttacker == GetBankByIdentity(3))) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; sprite->callback = sub_8079534; diff --git a/src/battle/anim/flash.c b/src/battle/anim/flash.c index eaa38e5b7..eaa38e5b7 100755..100644 --- a/src/battle/anim/flash.c +++ b/src/battle/anim/flash.c diff --git a/src/battle/anim/flying_hearts.c b/src/battle/anim/flying_hearts.c index d2d22602a..d2d22602a 100755..100644 --- a/src/battle/anim/flying_hearts.c +++ b/src/battle/anim/flying_hearts.c diff --git a/src/battle/anim/flying_path.c b/src/battle/anim/flying_path.c index 441ac0e6d..441ac0e6d 100755..100644 --- a/src/battle/anim/flying_path.c +++ b/src/battle/anim/flying_path.c diff --git a/src/battle/anim/flying_petals.c b/src/battle/anim/flying_petals.c index 4eeaa5215..4eeaa5215 100755..100644 --- a/src/battle/anim/flying_petals.c +++ b/src/battle/anim/flying_petals.c diff --git a/src/battle/anim/glitter.c b/src/battle/anim/glitter.c index e4577f1e1..e4577f1e1 100755..100644 --- a/src/battle/anim/glitter.c +++ b/src/battle/anim/glitter.c diff --git a/src/battle/anim/glow.c b/src/battle/anim/glow.c index 63466c0ff..63466c0ff 100755..100644 --- a/src/battle/anim/glow.c +++ b/src/battle/anim/glow.c diff --git a/src/battle/anim/grip.c b/src/battle/anim/grip.c index c4d7b1cef..c4d7b1cef 100755..100644 --- a/src/battle/anim/grip.c +++ b/src/battle/anim/grip.c diff --git a/src/battle/anim/grow.c b/src/battle/anim/grow.c index 8788b32fe..8788b32fe 100755..100644 --- a/src/battle/anim/grow.c +++ b/src/battle/anim/grow.c diff --git a/src/battle/anim/guard.c b/src/battle/anim/guard.c index ab093eab1..254160109 100644 --- a/src/battle/anim/guard.c +++ b/src/battle/anim/guard.c @@ -1,4 +1,5 @@ #include "global.h" +#include "battle.h" #include "battle_anim.h" #include "rom_8077ABC.h" @@ -12,7 +13,7 @@ extern u16 gBattleTypeFlags; void sub_80D3014(struct Sprite *sprite) { - if ((gBattleTypeFlags & 1) && IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2)) + if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2)) { sub_807A3FC(gAnimBankAttacker, 0, &sprite->pos1.x, &sprite->pos1.y); sprite->pos1.y += 40; diff --git a/src/battle/anim/guillotine.c b/src/battle/anim/guillotine.c index b3d842cdf..b3d842cdf 100755..100644 --- a/src/battle/anim/guillotine.c +++ b/src/battle/anim/guillotine.c diff --git a/src/battle/anim/heal.c b/src/battle/anim/heal.c index a8c14ea1c..a8c14ea1c 100755..100644 --- a/src/battle/anim/heal.c +++ b/src/battle/anim/heal.c diff --git a/src/battle/anim/heart_1.c b/src/battle/anim/heart_1.c index 5df89f929..5df89f929 100755..100644 --- a/src/battle/anim/heart_1.c +++ b/src/battle/anim/heart_1.c diff --git a/src/battle/anim/homing.c b/src/battle/anim/homing.c index 6fb4a76d8..6fb4a76d8 100755..100644 --- a/src/battle/anim/homing.c +++ b/src/battle/anim/homing.c diff --git a/src/battle/anim/hop.c b/src/battle/anim/hop.c index 4006e2d43..4006e2d43 100755..100644 --- a/src/battle/anim/hop.c +++ b/src/battle/anim/hop.c diff --git a/src/battle/anim/hop_2.c b/src/battle/anim/hop_2.c index 1bc3f46af..1bc3f46af 100755..100644 --- a/src/battle/anim/hop_2.c +++ b/src/battle/anim/hop_2.c diff --git a/src/battle/anim/kiss_fountain.c b/src/battle/anim/kiss_fountain.c index d3270ee65..d3270ee65 100755..100644 --- a/src/battle/anim/kiss_fountain.c +++ b/src/battle/anim/kiss_fountain.c diff --git a/src/battle/anim/leaf.c b/src/battle/anim/leaf.c index 676734717..676734717 100755..100644 --- a/src/battle/anim/leaf.c +++ b/src/battle/anim/leaf.c diff --git a/src/battle/anim/love_bg.c b/src/battle/anim/love_bg.c index bd3d22ca6..c3828c681 100755..100644 --- a/src/battle/anim/love_bg.c +++ b/src/battle/anim/love_bg.c @@ -25,7 +25,7 @@ static void sub_80D21F0(u8 taskId); void sub_80D2100(u8 taskId) { struct Struct_sub_8078914 subStruct; - u8* tempvar; + REG_BLDCNT = 0x3F42; REG_BLDALPHA = 0x1000; REG_BG1CNT_BITFIELD.priority = 3; @@ -38,9 +38,8 @@ void sub_80D2100(u8 taskId) REG_BG1HOFS = 0; REG_BG1VOFS = 0; sub_8078914(&subStruct); - tempvar = subStruct.field_4; - DmaFill32(3, 0x0, tempvar, 0x1000); - LZDecompressVram(&gAttractTilemap, tempvar); + DmaFill32Defvars(3, 0, subStruct.field_4, 0x1000); + LZDecompressVram(&gAttractTilemap, subStruct.field_4); LZDecompressVram(&gAttractGfx, subStruct.field_0); LoadCompressedPalette(&gAttractPal, subStruct.field_8 << 4, 32); if (IsContest()) @@ -90,21 +89,7 @@ void sub_80D21F0(u8 taskId) break; case 3: sub_8078914(&subStruct); - { - u8 *addr = subStruct.field_0; - u32 size = 0x2000; - while (1) - { - DmaFill32(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill32(3, 0, addr, size); - break; - } - } - } + DmaFill32Large(3, 0, subStruct.field_0, 0x2000, 0x1000); DmaClear32(3, subStruct.field_4, 0x800); if (!IsContest()) REG_BG1CNT_BITFIELD.charBaseBlock = 0; diff --git a/src/battle/anim/lunge_1.c b/src/battle/anim/lunge_1.c index d379c8f09..d379c8f09 100755..100644 --- a/src/battle/anim/lunge_1.c +++ b/src/battle/anim/lunge_1.c diff --git a/src/battle/anim/lunge_2.c b/src/battle/anim/lunge_2.c index fe2470567..fe2470567 100755..100644 --- a/src/battle/anim/lunge_2.c +++ b/src/battle/anim/lunge_2.c diff --git a/src/battle/anim/money.c b/src/battle/anim/money.c index 8358d23db..8358d23db 100755..100644 --- a/src/battle/anim/money.c +++ b/src/battle/anim/money.c diff --git a/src/battle/anim/moon.c b/src/battle/anim/moon.c index c532e8057..c532e8057 100755..100644 --- a/src/battle/anim/moon.c +++ b/src/battle/anim/moon.c diff --git a/src/battle/anim/note_rain.c b/src/battle/anim/note_rain.c index 715462d73..715462d73 100755..100644 --- a/src/battle/anim/note_rain.c +++ b/src/battle/anim/note_rain.c diff --git a/src/battle/anim/note_scatter.c b/src/battle/anim/note_scatter.c index 8564c58fe..8564c58fe 100755..100644 --- a/src/battle/anim/note_scatter.c +++ b/src/battle/anim/note_scatter.c diff --git a/src/battle/anim/note_scatter_2.c b/src/battle/anim/note_scatter_2.c index 524c51c08..524c51c08 100755..100644 --- a/src/battle/anim/note_scatter_2.c +++ b/src/battle/anim/note_scatter_2.c diff --git a/src/battle/anim/note_wave.c b/src/battle/anim/note_wave.c index 80ed2256f..80ed2256f 100755..100644 --- a/src/battle/anim/note_wave.c +++ b/src/battle/anim/note_wave.c diff --git a/src/battle/anim/orbit.c b/src/battle/anim/orbit.c index c8cf339d2..c8cf339d2 100755..100644 --- a/src/battle/anim/orbit.c +++ b/src/battle/anim/orbit.c diff --git a/src/battle/anim/orbit_fast.c b/src/battle/anim/orbit_fast.c index 92b67672b..92b67672b 100755..100644 --- a/src/battle/anim/orbit_fast.c +++ b/src/battle/anim/orbit_fast.c diff --git a/src/battle/anim/orbit_scatter.c b/src/battle/anim/orbit_scatter.c index 54c157839..54c157839 100755..100644 --- a/src/battle/anim/orbit_scatter.c +++ b/src/battle/anim/orbit_scatter.c diff --git a/src/battle/anim/orbs.c b/src/battle/anim/orbs.c index 6ca2fa71c..6ca2fa71c 100755..100644 --- a/src/battle/anim/orbs.c +++ b/src/battle/anim/orbs.c diff --git a/src/battle/anim/osmose.c b/src/battle/anim/osmose.c index 1140aa34a..1140aa34a 100755..100644 --- a/src/battle/anim/osmose.c +++ b/src/battle/anim/osmose.c diff --git a/src/battle/anim/perceive.c b/src/battle/anim/perceive.c index 3b3153428..3b3153428 100755..100644 --- a/src/battle/anim/perceive.c +++ b/src/battle/anim/perceive.c diff --git a/src/battle/anim/poison.c b/src/battle/anim/poison.c new file mode 100644 index 000000000..f31c441fb --- /dev/null +++ b/src/battle/anim/poison.c @@ -0,0 +1,140 @@ +#include "global.h" +#include "battle_anim.h" +#include "rom_8077ABC.h" +#include "trig.h" + +extern s16 gBattleAnimArgs[]; +extern u8 gAnimBankAttacker; +extern u8 gAnimBankTarget; + +void sub_80D9DD4(struct Sprite *sprite); +void sub_80D9E78(struct Sprite *sprite); +void sub_80D9EE8(struct Sprite *sprite); +void sub_80D9FF0(struct Sprite *sprite); + +void sub_80D9D70(struct Sprite *sprite) +{ + if (!gBattleAnimArgs[3]) + StartSpriteAnim(sprite, 2); + + sub_80787B0(sprite, 1); + + sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[2] = GetBankPosition(gAnimBankTarget, 2); + sprite->data[4] = GetBankPosition(gAnimBankTarget, 3); + sprite->data[5] = -30; + + sub_80786EC(sprite); + + sprite->callback = sub_80D9DD4; +} + +void sub_80D9DD4(struct Sprite *sprite) // same as sub_80D9E78 +{ + if (sub_8078718(sprite)) + DestroyAnimSprite(sprite); +} + +void sub_80D9DF0(struct Sprite *sprite) +{ + s16 l1, l2; + if (!gBattleAnimArgs[3]) + StartSpriteAnim(sprite, 2); + + sub_80787B0(sprite, 1); + sub_807A3FC(gAnimBankTarget, 1, &l1, &l2); + + if (GetBankSide(gAnimBankAttacker)) + gBattleAnimArgs[4] = -gBattleAnimArgs[4]; + + sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[2] = l1 + gBattleAnimArgs[4]; + sprite->data[4] = l2 + gBattleAnimArgs[5]; + sprite->data[5] = -30; + + sub_80786EC(sprite); + + sprite->callback = sub_80D9E78; +} + +void sub_80D9E78(struct Sprite *sprite) // same as sub_80D9DD4 +{ + if (sub_8078718(sprite)) + DestroyAnimSprite(sprite); +} + +void sub_80D9E94(struct Sprite *sprite) +{ + sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[0]; + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[1]; + + sub_8078A5C(sprite); + + sprite->data[5] = sprite->data[1] / gBattleAnimArgs[2]; + sprite->data[6] = sprite->data[2] / gBattleAnimArgs[2]; + + sprite->callback = sub_80D9EE8; +} + +void sub_80D9EE8(struct Sprite *sprite) +{ + sub_8078394(sprite); + + sprite->data[1] -= sprite->data[5]; + sprite->data[2] -= sprite->data[6]; + + if (!sprite->data[0]) + DestroyAnimSprite(sprite); +} + +void sub_80D9F14(struct Sprite *sprite) +{ + sub_807A3FC(gAnimBankTarget, TRUE, &sprite->pos1.x, &sprite->pos1.y); + + if (GetBankSide(gAnimBankAttacker)) + gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += gBattleAnimArgs[1]; + + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[2]; + sprite->data[4] = sprite->pos1.y + sprite->data[0]; + + sprite->callback = sub_8078B34; + StoreSpriteCallbackInData(sprite, DestroyAnimSprite); +} + +void sub_80D9F88(struct Sprite *sprite) +{ + if (!gBattleAnimArgs[2]) + { + sub_8078764(sprite, TRUE); + } + else + { + sub_807A3FC(gAnimBankTarget, TRUE, &sprite->pos1.x, &sprite->pos1.y); + + if (GetBankSide(gAnimBankAttacker)) + gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += gBattleAnimArgs[1]; + } + + sprite->callback = sub_80D9FF0; +} + +void sub_80D9FF0(struct Sprite *sprite) +{ + sprite->data[0] = (sprite->data[0] + 0xB) & 0xFF; + sprite->pos2.x = Sin(sprite->data[0], 4); + sprite->data[1] += 0x30; + sprite->pos2.y = -(sprite->data[1] >> 8); + + if (sprite->affineAnimEnded) + DestroyAnimSprite(sprite); +}
\ No newline at end of file diff --git a/src/battle/anim/powder.c b/src/battle/anim/powder.c index a0be20d6f..a0be20d6f 100755..100644 --- a/src/battle/anim/powder.c +++ b/src/battle/anim/powder.c diff --git a/src/battle/anim/psychic.c b/src/battle/anim/psychic.c new file mode 100644 index 000000000..6617183cb --- /dev/null +++ b/src/battle/anim/psychic.c @@ -0,0 +1,900 @@ +#include "global.h" +#include "battle.h" +#include "battle_anim.h" +#include "palette.h" +#include "rom_8077ABC.h" +#include "scanline_effect.h" +#include "sound.h" +#include "task.h" +#include "trig.h" +#include "constants/songs.h" + +extern s16 gBattleAnimArgs[]; +extern u8 gAnimBankAttacker; +extern u8 gAnimBankTarget; +extern u16 gBattle_BG1_X; +extern u16 gBattle_BG2_X; +extern u8 gObjectBankIDs[]; + +extern const union AffineAnimCmd *const gUnknown_083DA888[]; +extern struct AffineAnimFrameCmd gUnknown_083DA8A4; +extern struct AffineAnimFrameCmd gUnknown_083DA8C4; +extern const struct SpriteTemplate gSpriteTemplate_83DA8DC; +extern const struct SpriteTemplate gSpriteTemplate_83DA9AC; + +static void sub_80DB88C(struct Sprite *sprite); +static void sub_80DB8C0(struct Sprite *sprite); +static void sub_80DB92C(struct Sprite *sprite); +static void sub_80DB9E4(struct Sprite *sprite); +static void sub_80DBC00(struct Sprite *sprite); +static void sub_80DBC34(struct Sprite *sprite); +static void sub_80DBCD0(u8 taskId); +static void sub_80DBD58(u8 taskId); +static void sub_80DBE98(u8 taskId); +static void sub_80DC1FC(u8 taskId); +static void sub_80DC3F4(u8 taskId); +void sub_80DC5F4(u8 taskId); + + +void sub_80DB74C(struct Sprite *sprite) +{ + if (GetBankSide(gAnimBankAttacker) == SIDE_PLAYER || IsContest()) + { + sprite->oam.priority = 2; + sprite->subpriority = 200; + } + + if (!IsContest()) + { + u8 bankCopy; + u8 bank = bankCopy = GetBankByIdentity(IDENTITY_OPPONENT_MON1); + u8 identity = GetBankIdentity_permutated(bank); + int var0 = 1; + u8 toBG_2 = (identity ^ var0) != 0; + + if (IsAnimBankSpriteVisible(bank)) + sub_8076034(bank, toBG_2); + + bank = bankCopy ^ 2; + if (IsAnimBankSpriteVisible(bank)) + sub_8076034(bank, toBG_2 ^ var0); + } + + if (!IsContest() && IsDoubleBattle()) + { + if (GetBankSide(gAnimBankAttacker) == SIDE_PLAYER) + { + sprite->pos1.x = 72; + sprite->pos1.y = 80; + } + else + { + sprite->pos1.x = 176; + sprite->pos1.y = 40; + } + } + else + { + if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) + gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + + sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 0) + gBattleAnimArgs[0]; + sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 1) + gBattleAnimArgs[1]; + } + + if (IsContest()) + sprite->pos1.y += 9; + + sprite->data[0] = 256 + IndexOfSpritePaletteTag(gBattleAnimArgs[2]) * 16; + sprite->callback = sub_80DB88C; + sprite->callback(sprite); +} + +static void sub_80DB88C(struct Sprite *sprite) +{ + REG_BLDALPHA = ((16 - sprite->data[3]) << 8) | sprite->data[3]; + + if (sprite->data[3] == 13) + sprite->callback = sub_80DB8C0; + else + sprite->data[3]++; +} + +static void sub_80DB8C0(struct Sprite *sprite) +{ + u16 color; + u16 startOffset; + int i; + + if (++sprite->data[1] == 2) + { + sprite->data[1] = 0; + startOffset = sprite->data[0]; + color = gPlttBufferFaded[startOffset + 8]; + + for (i = 8; i > 0; i--) + gPlttBufferFaded[startOffset + i] = gPlttBufferFaded[startOffset + i - 1]; + + gPlttBufferFaded[startOffset + 1] = color; + + if (++sprite->data[2] == 16) + sprite->callback = sub_80DB92C; + } +} + +static void sub_80DB92C(struct Sprite *sprite) +{ + REG_BLDALPHA = ((16 - sprite->data[3]) << 8) | sprite->data[3]; + + if (--sprite->data[3] == -1) + { + if (!IsContest()) + { + u8 bankCopy; + u8 bank = bankCopy = GetBankByIdentity(IDENTITY_OPPONENT_MON1); + + if (IsAnimBankSpriteVisible(bank)) + gSprites[gObjectBankIDs[bank]].invisible = 0; + + bank = bankCopy ^ 2; + if (IsAnimBankSpriteVisible(bank)) + gSprites[gObjectBankIDs[bank]].invisible = 0; + } + + sprite->invisible = 1; + sprite->callback = sub_80DB9E4; + } +} + +static void sub_80DB9E4(struct Sprite *sprite) +{ + if (!IsContest()) + { + u8 bankCopy; + u8 bank = bankCopy = GetBankByIdentity(IDENTITY_OPPONENT_MON1); + u8 identity = GetBankIdentity_permutated(bank); + int var0 = 1; + u8 toBG_2 = (identity ^ var0) != 0; + + if (IsAnimBankSpriteVisible(bank)) + sub_8076464(toBG_2); + + bank = bankCopy ^ 2; + if (IsAnimBankSpriteVisible(bank)) + sub_8076464(toBG_2 ^ var0); + } + + sprite->callback = DestroyAnimSprite; +} + +void sub_80DBA4C(struct Sprite *sprite) +{ + if (sprite->data[0] == 0) + { + int arg3 = gBattleAnimArgs[3]; + u8 var0 = 0; + if (arg3 == 0) + var0 = 1; + + if (!IsContest() && IsDoubleBattle()) + { + if (GetBankSide(gAnimBankAttacker) == SIDE_PLAYER) + { + sprite->pos1.x = 72 - gBattleAnimArgs[0]; + sprite->pos1.y = gBattleAnimArgs[1] + 80; + } + else + { + sprite->pos1.x = gBattleAnimArgs[0] + 176; + sprite->pos1.y = gBattleAnimArgs[1] + 40; + } + } + else + { + if (gBattleAnimArgs[2] == 0) + sub_80787B0(sprite, var0); + else + sub_8078764(sprite, var0); + } + + sprite->data[0]++; + } + else + { + if (sprite->animEnded || sprite->affineAnimEnded) + move_anim_8074EE0(sprite); + } +} + +void sub_80DBAF4(struct Sprite *sprite) +{ + sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2); + sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3); + + if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) + { + StartSpriteAnim(sprite, 1); + sprite->pos1.x -= 40; + sprite->pos1.y += 10; + sprite->data[1] = -1; + } + else + { + sprite->pos1.x += 40; + sprite->pos1.y -= 10; + sprite->data[1] = 1; + } + + StoreSpriteCallbackInData(sprite, DestroyAnimSprite); + sprite->callback = sub_8078600; +} + +void sub_80DBB70(struct Sprite *sprite) +{ + s16 x = sub_807A100(gAnimBankAttacker, 1) / 2; + s16 y = sub_807A100(gAnimBankAttacker, 0) / -2; + + if (GetBankSide(gAnimBankAttacker) == SIDE_OPPONENT) + { + x = -x; + } + + sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2) + x; + sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3) + y; + + if (sprite->pos1.y < 16) + { + sprite->pos1.y = 16; + } + + StoreSpriteCallbackInData(sprite, sub_80DBC00); + sprite->callback = sub_8078600; +} + +static void sub_80DBC00(struct Sprite *sprite) +{ + sprite->oam.affineMode = 1; + sprite->affineAnims = gUnknown_083DA888; + sprite->data[0] = 0; + InitSpriteAffineAnim(sprite); + sprite->callback = sub_80DBC34; +} + +static void sub_80DBC34(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + if (sprite->affineAnimEnded) + { + FreeOamMatrix(sprite->oam.matrixNum); + sprite->oam.affineMode = 0; + sprite->data[1] = 18; + sprite->data[0]++; + } + break; + case 1: + if (--sprite->data[1] == -1) + { + DestroyAnimSprite(sprite); + } + break; + } +} + +void sub_80DBC94(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + u8 spriteId = GetAnimBankSpriteId(0); + task->data[0] = spriteId; + sub_80798F4(task, spriteId, &gUnknown_083DA8A4); + task->func = sub_80DBCD0; +} + +static void sub_80DBCD0(u8 taskId) +{ + if (!sub_807992C(&gTasks[taskId])) + { + DestroyAnimVisualTask(taskId); + } +} + +void sub_80DBCFC(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + u8 spriteId = GetAnimBankSpriteId(0); + task->data[0] = spriteId; + task->data[1] = 0; + task->data[2] = 0; + task->data[3] = GetBankSide(gAnimBankAttacker) != SIDE_PLAYER ? 4 : 8; + + sub_80798F4(task, task->data[0], &gUnknown_083DA8C4); + task->func = sub_80DBD58; +} + +static void sub_80DBD58(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[1]) + { + case 0: + sub_807992C(task); + if (++task->data[2] > 19) + task->data[1]++; + break; + case 1: + if (task->data[3] != 0) + { + gSprites[task->data[0]].pos2.y -= 8; + task->data[3]--; + } + else + { + gSprites[task->data[0]].invisible = 1; + gSprites[task->data[0]].pos1.x = 272; + sub_8078F40(task->data[0]); + DestroyAnimVisualTask(taskId); + } + break; + } +} + +void sub_80DBE00(u8 taskId) +{ + u16 var0, var1; + + struct Task *task = &gTasks[taskId]; + + task->data[3] = 16; + task->data[4] = 0; + task->data[13] = GetBankPosition(gAnimBankAttacker, 2); + task->data[14] = GetBankPosition(gAnimBankAttacker, 3); + + var0 = sub_807A100(gAnimBankAttacker, 1) / 3; + var1 = sub_807A100(gAnimBankAttacker, 0) / 3; + task->data[12] = var0 > var1 ? var0 : var1; + + REG_BLDCNT = 0x3F40; + REG_BLDALPHA = 0x10; + + task->func = sub_80DBE98; +} + +static void sub_80DBE98(u8 taskId) +{ + u16 i; + u8 spriteId; + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + if (++task->data[1] > 8) + { + task->data[1] = 0; + spriteId = CreateSprite(&gSpriteTemplate_83DA8DC, task->data[13], task->data[14], 0); + task->data[task->data[2] + 8] = spriteId; + + if (spriteId != 64) + { + switch (task->data[2]) + { + case 0: + gSprites[spriteId].pos2.x = task->data[12]; + gSprites[spriteId].pos2.y = -task->data[12]; + break; + case 1: + gSprites[spriteId].pos2.x = -task->data[12]; + gSprites[spriteId].pos2.y = task->data[12]; + break; + case 2: + gSprites[spriteId].pos2.x = task->data[12]; + gSprites[spriteId].pos2.y = task->data[12]; + break; + case 3: + gSprites[spriteId].pos2.x = -task->data[12]; + gSprites[spriteId].pos2.y = -task->data[12]; + break; + } + } + + if (++task->data[2] == 5) + task->data[0]++; + } + break; + case 1: + if (task->data[1] & 1) + task->data[3]--; + else + task->data[4]++; + + REG_BLDALPHA = (task->data[4] << 8) | task->data[3]; + + if (++task->data[1] == 32) + { + for (i = 8; i < 13; i++) + { + if (task->data[i] != 64) + DestroySprite(&gSprites[task->data[i]]); + } + + task->data[0]++; + } + break; + case 2: + task->data[0]++; + break; + case 3: + REG_BLDALPHA = 0; + REG_BLDCNT = 0; + DestroyAnimVisualTask(taskId); + break; + } +} + +static void sub_80DC020(struct Sprite *sprite) +{ + if (sprite->data[1] > sprite->data[0] - 10) + sprite->invisible = sprite->data[1] & 1; + + if (sprite->data[1] == sprite->data[0]) + DestroyAnimSprite(sprite); + + sprite->data[1]++; +} + +void sub_80DC068(struct Sprite *sprite) +{ + if (gBattleAnimArgs[0] == 0) + { + sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2); + sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3); + } + + sprite->data[0] = gBattleAnimArgs[1]; + sprite->callback = sub_80DC020; +} + +void sub_80DC0B0(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + if (IsContest()) + { + if (gBattleAnimArgs[0] == 1) + { + task->data[10] = -10; + task->data[11] = sub_807A100(gAnimBankTarget, 5) - 8; + task->data[12] = sub_807A100(gAnimBankTarget, 2) + 8; + task->data[13] = sub_807A100(gAnimBankAttacker, 5) - 8; + task->data[14] = sub_807A100(gAnimBankAttacker, 2) + 8; + } + else + { + task->data[10] = 10; + task->data[11] = sub_807A100(gAnimBankAttacker, 4) + 8; + task->data[12] = sub_807A100(gAnimBankAttacker, 3) - 8; + task->data[13] = sub_807A100(gAnimBankTarget, 4) + 8; + task->data[14] = sub_807A100(gAnimBankTarget, 3) - 8; + } + } + else + { + if (gBattleAnimArgs[0] == 1) + { + task->data[10] = -10; + task->data[11] = sub_807A100(gAnimBankTarget, 4) + 8; + task->data[12] = sub_807A100(gAnimBankTarget, 2) + 8; + task->data[13] = sub_807A100(gAnimBankAttacker, 4) + 8; + task->data[14] = sub_807A100(gAnimBankAttacker, 2) + 8; + } + else + { + task->data[10] = 10; + task->data[11] = sub_807A100(gAnimBankAttacker, 5) - 8; + task->data[12] = sub_807A100(gAnimBankAttacker, 3) - 8; + task->data[13] = sub_807A100(gAnimBankTarget, 5) - 8; + task->data[14] = sub_807A100(gAnimBankTarget, 3) - 8; + } + } + + task->data[1] = 6; + task->func = sub_80DC1FC; +} + +static void sub_80DC1FC(u8 taskId) +{ + u8 spriteId; + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + if (++task->data[1] > 6) + { + task->data[1] = 0; + spriteId = CreateSprite(&gSpriteTemplate_83DA9AC, task->data[11], task->data[12], 0); + if (spriteId != 64) + { + gSprites[spriteId].data[0] = 16; + gSprites[spriteId].data[2] = task->data[13]; + gSprites[spriteId].data[4] = task->data[14]; + gSprites[spriteId].data[5] = task->data[10]; + + sub_80786EC(&gSprites[spriteId]); + StartSpriteAffineAnim(&gSprites[spriteId], task->data[2] & 3); + } + + if (++task->data[2] == 12) + task->data[0]++; + } + break; + case 1: + if (++task->data[1] > 17) + DestroyAnimVisualTask(taskId); + break; + } +} + +void sub_80DC2B0(struct Sprite *sprite) +{ + if (sub_8078718(sprite)) + { + FreeOamMatrix(sprite->oam.matrixNum); + DestroySprite(sprite); + } +} + +void sub_80DC2D4(u8 taskId) +{ + s16 i; + u8 var1; + struct ScanlineEffectParams scanlineParams; + struct Task *task = &gTasks[taskId]; + + var1 = sub_8077FC0(gAnimBankTarget); + task->data[14] = var1 - 32; + + switch (gBattleAnimArgs[0]) + { + case 0: + task->data[11] = 2; + task->data[12] = 5; + task->data[13] = 64; + task->data[15] = var1 + 32; + break; + case 1: + task->data[11] = 2; + task->data[12] = 5; + task->data[13] = 192; + task->data[15] = var1 + 32; + break; + case 2: + task->data[11] = 4; + task->data[12] = 4; + task->data[13] = 0; + task->data[15] = var1 + 32; + break; + } + + if (task->data[14] < 0) + task->data[14] = 0; + + if (GetBankIdentity_permutated(gAnimBankTarget) == 1) + { + task->data[10] = gBattle_BG1_X; + scanlineParams.dmaDest = ®_BG1HOFS; + } + else + { + task->data[10] = gBattle_BG2_X; + scanlineParams.dmaDest = ®_BG2HOFS; + } + + i = task->data[14]; + while (i <= task->data[14] + 64) + { + gScanlineEffectRegBuffers[0][i] = task->data[10]; + gScanlineEffectRegBuffers[1][i] = task->data[10]; + i++; + } + + scanlineParams.dmaControl = 0XA2600001; + scanlineParams.initState = 1; + scanlineParams.unused9 = 0; + ScanlineEffect_SetParams(scanlineParams); + + task->func = sub_80DC3F4; +} + +static void sub_80DC3F4(u8 taskId) +{ + s16 sineIndex, i; + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + sineIndex = task->data[13]; + i = task->data[14]; + while (i <= task->data[15]) + { + s16 var2 = (gSineTable[sineIndex] >> task->data[12]); + if (var2 > 0) + { + var2 += (task->data[1] & 3); + } + else if (var2 < 0) + { + var2 -= (task->data[1] & 3); + } + + gScanlineEffectRegBuffers[0][i] = task->data[10] + var2; + gScanlineEffectRegBuffers[1][i] = task->data[10] + var2; + + sineIndex += task->data[11]; + i++; + } + + if (++task->data[1] > 23) + { + task->data[0]++; + } + break; + case 1: + gScanlineEffect.state = 3; + task->data[0]++; + break; + case 2: + DestroyAnimVisualTask(taskId); + break; + } +} + +#ifdef NONMATCHING +void sub_80DC4F4(u8 taskId) +{ + s16 spriteId; + u8 matrixNum; + register u8 matrixNum2 asm("r6"); + struct Task *task = &gTasks[taskId]; + + matrixNum = AllocOamMatrix(); + matrixNum2 = matrixNum; + if (matrixNum2 == 0xFF) + { + DestroyAnimVisualTask(taskId); + return; + } + + spriteId = duplicate_obj_of_side_rel2move_in_transparent_mode(gBattleAnimArgs[0]); + if (spriteId < 0) + { + FreeOamMatrix(matrixNum); + DestroyAnimVisualTask(taskId); + return; + } + + gSprites[spriteId].callback = SpriteCallbackDummy; + gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE; + gSprites[spriteId].oam.matrixNum = matrixNum2; + gSprites[spriteId].affineAnimPaused = 1; + gSprites[spriteId].subpriority++; + obj_id_set_rotscale(spriteId, 256, 256, 0); + CalcCenterToCornerVec(&gSprites[spriteId], gSprites[spriteId].oam.shape, gSprites[spriteId].oam.size, gSprites[spriteId].oam.affineMode); + + task->data[13] = GetAnimBankSpriteId(gBattleAnimArgs[0]); + task->data[14] = matrixNum; + task->data[15] = spriteId; + task->func = sub_80DC5F4; +} +#else +__attribute__((naked)) +void sub_80DC4F4(u8 taskId) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + mov r8, r4\n\ + lsls r0, r4, 2\n\ + adds r0, r4\n\ + lsls r0, 3\n\ + ldr r1, _080DC528 @ =gTasks\n\ + adds r7, r0, r1\n\ + bl AllocOamMatrix\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + mov r10, r5\n\ + adds r6, r5, 0\n\ + cmp r6, 0xFF\n\ + bne _080DC52C\n\ + adds r0, r4, 0\n\ + bl DestroyAnimVisualTask\n\ + b _080DC5D6\n\ + .align 2, 0\n\ +_080DC528: .4byte gTasks\n\ +_080DC52C:\n\ + ldr r1, _080DC550 @ =gBattleAnimArgs\n\ + ldrb r0, [r1]\n\ + bl duplicate_obj_of_side_rel2move_in_transparent_mode\n\ + lsls r0, 16\n\ + lsrs r1, r0, 16\n\ + mov r9, r1\n\ + asrs r0, 16\n\ + cmp r0, 0\n\ + bge _080DC554\n\ + adds r0, r5, 0\n\ + bl FreeOamMatrix\n\ + mov r0, r8\n\ + bl DestroyAnimVisualTask\n\ + b _080DC5D6\n\ + .align 2, 0\n\ +_080DC550: .4byte gBattleAnimArgs\n\ +_080DC554:\n\ + ldr r2, _080DC5E4 @ =gSprites\n\ + lsls r4, r0, 4\n\ + adds r4, r0\n\ + lsls r4, 2\n\ + adds r0, r2, 0\n\ + adds r0, 0x1C\n\ + adds r0, r4, r0\n\ + ldr r1, _080DC5E8 @ =SpriteCallbackDummy\n\ + str r1, [r0]\n\ + adds r4, r2\n\ + ldrb r0, [r4, 0x1]\n\ + movs r1, 0x3\n\ + orrs r0, r1\n\ + strb r0, [r4, 0x1]\n\ + movs r0, 0x1F\n\ + ands r6, r0\n\ + lsls r2, r6, 1\n\ + ldrb r1, [r4, 0x3]\n\ + movs r0, 0x3F\n\ + negs r0, r0\n\ + ands r0, r1\n\ + orrs r0, r2\n\ + strb r0, [r4, 0x3]\n\ + adds r2, r4, 0\n\ + adds r2, 0x2C\n\ + ldrb r0, [r2]\n\ + movs r1, 0x80\n\ + orrs r0, r1\n\ + strb r0, [r2]\n\ + adds r1, r4, 0\n\ + adds r1, 0x43\n\ + ldrb r0, [r1]\n\ + adds r0, 0x1\n\ + strb r0, [r1]\n\ + mov r1, r9\n\ + lsls r0, r1, 24\n\ + lsrs r0, 24\n\ + movs r2, 0x80\n\ + lsls r2, 1\n\ + adds r1, r2, 0\n\ + movs r3, 0\n\ + bl obj_id_set_rotscale\n\ + ldrb r3, [r4, 0x1]\n\ + lsrs r1, r3, 6\n\ + ldrb r2, [r4, 0x3]\n\ + lsrs r2, 6\n\ + lsls r3, 30\n\ + lsrs r3, 30\n\ + adds r0, r4, 0\n\ + bl CalcCenterToCornerVec\n\ + ldr r1, _080DC5EC @ =gBattleAnimArgs\n\ + ldrb r0, [r1]\n\ + bl GetAnimBankSpriteId\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + strh r0, [r7, 0x22]\n\ + mov r0, r10\n\ + strh r0, [r7, 0x24]\n\ + mov r1, r9\n\ + strh r1, [r7, 0x26]\n\ + ldr r0, _080DC5F0 @ =sub_80DC5F4\n\ + str r0, [r7]\n\ +_080DC5D6:\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080DC5E4: .4byte gSprites\n\ +_080DC5E8: .4byte SpriteCallbackDummy\n\ +_080DC5EC: .4byte gBattleAnimArgs\n\ +_080DC5F0: .4byte sub_80DC5F4\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +void sub_80DC5F4(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + task->data[1] += 4; + task->data[2] = 256 - (gSineTable[task->data[1]] >> 1); + obj_id_set_rotscale(task->data[15], task->data[2], task->data[2], 0); + sub_8079AB8(task->data[15], task->data[13]); + if (task->data[1] == 48) + task->data[0]++; + break; + case 1: + task->data[1] -= 4; + task->data[2] = 256 - (gSineTable[task->data[1]] >> 1);; + obj_id_set_rotscale(task->data[15], task->data[2], task->data[2], 0); + sub_8079AB8(task->data[15], task->data[13]); + if (task->data[1] == 0) + task->data[0]++; + break; + case 2: + obj_delete_but_dont_free_vram(&gSprites[task->data[15]]); + task->data[0]++; + break; + case 3: + FreeOamMatrix(task->data[14]); + DestroyAnimVisualTask(taskId); + break; + } +} + +void sub_80DC700(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 0); + sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 1); + + if (IsContest()) + sprite->pos1.y += 12; + + sprite->data[1] = 8; + REG_BLDCNT = 0x3F40; + REG_BLDALPHA = ((16 - sprite->data[1]) << 8) | sprite->data[1]; + sprite->data[0]++; + break; + case 1: + if (sprite->affineAnimEnded) + { + PlaySE12WithPanning(SE_W100, BattleAnimAdjustPanning(-64)); + ChangeSpriteAffineAnim(sprite, 1); + sprite->data[0]++; + } + break; + case 2: + if (sprite->data[2]++ > 1) + { + sprite->data[2] = 0; + sprite->data[1]--; + REG_BLDALPHA = ((16 - sprite->data[1]) << 8) | sprite->data[1]; + + if (sprite->data[1] == 0) + { + sprite->data[0]++; + sprite->invisible = 1; + } + } + + sprite->data[3] += 896; + sprite->pos2.y -= sprite->data[3] >> 8; + sprite->data[3] &= 0xFF; + break; + case 3: + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + DestroyAnimSprite(sprite); + break; + } +} diff --git a/src/battle/anim/ring.c b/src/battle/anim/ring.c index 915cadcbc..915cadcbc 100755..100644 --- a/src/battle/anim/ring.c +++ b/src/battle/anim/ring.c diff --git a/src/battle/anim/rock.c b/src/battle/anim/rock.c new file mode 100644 index 000000000..b113ce040 --- /dev/null +++ b/src/battle/anim/rock.c @@ -0,0 +1,602 @@ +#include "global.h" +#include "battle.h" +#include "battle_anim.h" +#include "decompress.h" +#include "palette.h" +#include "rom_8077ABC.h" +#include "sound.h" +#include "task.h" +#include "trig.h" +#include "constants/songs.h" + +extern s16 gBattleAnimArgs[]; +extern u8 gAnimBankAttacker; +extern u8 gAnimBankTarget; +extern u32 gAnimMoveDmg; +extern u16 gBattle_BG1_X; +extern u16 gBattle_BG1_Y; +extern u16 gBattle_BG3_Y; + +extern const u8 gBattleAnimBackgroundTilemap_SandstormBrew[]; +extern const u8 gBattleAnimBackgroundImage_SandstormBrew[]; +extern const u16 gBattleAnimSpritePalette_261[]; +extern const struct SpriteTemplate gSpriteTemplate_83DAD78; +extern const struct SpriteTemplate gSpriteTemplate_83DAD90; + +extern const struct SubspriteTable gUnknown_083DAD10; + +static void sub_80DCF1C(struct Sprite *sprite); +static void sub_80DD02C(struct Sprite *sprite); +static void sub_80DD190(u8 taskId); +static void sub_80DD604(u8 taskId); +static void sub_80DD774(struct Task *task); +static u8 sub_80DD8BC(void); +static void sub_80DD928(struct Sprite *sprite); +static void sub_80DD9FC(struct Sprite *sprite); + + +void sub_80DCE9C(struct Sprite *sprite) +{ + if (gBattleAnimArgs[3] != 0) + sub_807A3FC(gAnimBankTarget, 0, &sprite->pos1.x, &sprite->pos1.y); + + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += 14; + + StartSpriteAnim(sprite, gBattleAnimArgs[1]); + AnimateSprite(sprite); + + sprite->data[0] = 0; + sprite->data[1] = 0; + sprite->data[2] = 4; + sprite->data[3] = 16; + sprite->data[4] = -70; + sprite->data[5] = gBattleAnimArgs[2]; + + StoreSpriteCallbackInData(sprite, sub_80DCF1C); + sprite->callback = sub_8078278; + sprite->callback(sprite); +} + +static void sub_80DCF1C(struct Sprite *sprite) +{ + sprite->pos1.x += sprite->data[5]; + + sprite->data[0] = 192; + sprite->data[1] = sprite->data[5]; + sprite->data[2] = 4; + sprite->data[3] = 32; + sprite->data[4] = -24; + + StoreSpriteCallbackInData(sprite, move_anim_8074EE0); + sprite->callback = sub_8078278; + sprite->callback(sprite); +} + +void sub_80DCF60(struct Sprite *sprite) +{ + StartSpriteAnim(sprite, gBattleAnimArgs[5]); + AnimateSprite(sprite); + + if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) + sprite->pos1.x -= gBattleAnimArgs[0]; + else + sprite->pos1.x += gBattleAnimArgs[0]; + + sprite->pos1.y += gBattleAnimArgs[1]; + + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[2]; + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[3]; + + sub_8078A5C(sprite); + sprite->data[3] = 0; + sprite->data[4] = 0; + + sprite->callback = sub_8078394; + StoreSpriteCallbackInData(sprite, move_anim_8074EE0); +} + +void sub_80DCFE4(struct Sprite *sprite) +{ + if (gBattleAnimArgs[6] == 0) + sub_80787B0(sprite, 0); + else + sub_8078764(sprite, 0); + + sprite->data[0] = gBattleAnimArgs[3]; + sprite->data[1] = gBattleAnimArgs[2]; + sprite->data[2] = gBattleAnimArgs[4]; + sprite->data[3] = gBattleAnimArgs[5]; + + sprite->callback = sub_80DD02C; +} + +static void sub_80DD02C(struct Sprite *sprite) +{ + sprite->data[4] += sprite->data[1]; + sprite->pos2.y = -(sprite->data[4] >> 8); + sprite->pos2.x = Sin(sprite->data[5], sprite->data[3]); + sprite->data[5] = (sprite->data[5] + sprite->data[2]) & 0xFF; + + if (--sprite->data[0] == -1) + { + DestroyAnimSprite(sprite); + } +} + +void do_boulder_dust(u8 taskId) +{ + struct Struct_sub_8078914 subStruct; + int var0 = 0; + + REG_BLDCNT = 0x3F42; + REG_BLDALPHA = 0x1000; + REG_BG1CNT_BITFIELD.priority = 1; + REG_BG1CNT_BITFIELD.screenSize = 0; + + if (!IsContest()) + REG_BG1CNT_BITFIELD.charBaseBlock = 1; + + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + + sub_8078914(&subStruct); + DmaFill32Defvars(3, 0, subStruct.field_4, 0x1000); + LZDecompressVram(&gBattleAnimBackgroundTilemap_SandstormBrew, subStruct.field_4); + LZDecompressVram(&gBattleAnimBackgroundImage_SandstormBrew, subStruct.field_0); + LoadCompressedPalette(&gBattleAnimSpritePalette_261, subStruct.field_8 << 4, 32); + + if (IsContest()) + sub_80763FC(subStruct.field_8, (u16 *)subStruct.field_4, 0, 0); + + if (gBattleAnimArgs[0] != 0 && GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) + var0 = 1; + + gTasks[taskId].data[0] = var0; + gTasks[taskId].func = sub_80DD190; +} + +static void sub_80DD190(u8 taskId) +{ + struct Struct_sub_8078914 subStruct; + + if (gTasks[taskId].data[0] == 0) + gBattle_BG1_X += 0xFFFA; + else + gBattle_BG1_X += 6; + + gBattle_BG1_Y += -1; + + switch (gTasks[taskId].data[12]) + { + case 0: + if (++gTasks[taskId].data[10] == 4) + { + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[11]++; + REG_BLDALPHA = gTasks[taskId].data[11] | ((16 - gTasks[taskId].data[11]) << 8); + if (gTasks[taskId].data[11] == 7) + { + gTasks[taskId].data[12]++; + gTasks[taskId].data[11] = 0; + } + } + break; + case 1: + if (++gTasks[taskId].data[11] == 101) + { + gTasks[taskId].data[11] = 7; + gTasks[taskId].data[12]++; + } + break; + case 2: + if (++gTasks[taskId].data[10] == 4) + { + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[11]--; + REG_BLDALPHA = gTasks[taskId].data[11] | ((16 - gTasks[taskId].data[11]) << 8); + if (gTasks[taskId].data[11] == 0) + { + gTasks[taskId].data[12]++; + gTasks[taskId].data[11] = 0; + } + } + break; + case 3: + sub_8078914(&subStruct); + DmaFill32Large(3, 0, subStruct.field_0, 0x2000, 0x1000); + DmaClear32(3, subStruct.field_4, 0x800); + if (!IsContest()) + REG_BG1CNT_BITFIELD.charBaseBlock = 0; + + gTasks[taskId].data[12]++; + // fall through + case 4: + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BG1CNT_BITFIELD.priority = 1; + DestroyAnimVisualTask(taskId); + break; + } +} + +void sub_80DD3AC(struct Sprite *sprite) +{ + if (sprite->data[0] == 0) + { + if (gBattleAnimArgs[3] != 0 && GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) + { + sprite->pos1.x = 304; + gBattleAnimArgs[1] = -gBattleAnimArgs[1]; + sprite->data[5] = 1; + sprite->oam.matrixNum = 8; + } + else + { + sprite->pos1.x = -64; + } + + sprite->pos1.y = gBattleAnimArgs[0]; + SetSubspriteTables(sprite, &gUnknown_083DAD10); + sprite->data[1] = gBattleAnimArgs[1]; + sprite->data[2] = gBattleAnimArgs[2]; + sprite->data[0]++; + } + else + { + sprite->data[3] += sprite->data[1]; + sprite->data[4] += sprite->data[2]; + sprite->pos2.x += (sprite->data[3] >> 8); + sprite->pos2.y += (sprite->data[4] >> 8); + sprite->data[3] &= 0xFF; + sprite->data[4] &= 0xFF; + + if (sprite->data[5] == 0) + { + if (sprite->pos1.x + sprite->pos2.x > 272) + { + sprite->callback = DestroyAnimSprite; + } + } + else if (sprite->pos1.x + sprite->pos2.x < -32) + { + sprite->callback = DestroyAnimSprite; + } + } +} + +void sub_80DD490(struct Sprite *sprite) +{ + StartSpriteAnim(sprite, gBattleAnimArgs[4]); + sub_80787B0(sprite, 0); + + sprite->data[0] = gBattleAnimArgs[3]; + sprite->data[2] = sprite->pos1.x; + sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[2]; + + sprite->callback = sub_8078B34; + StoreSpriteCallbackInData(sprite, DestroyAnimSprite); +} + +void sub_80DD4D4(u8 taskId) +{ + u16 var0, var1, var2, var3; + u8 var4; + int var5; + s16 pan1, pan2; + struct Task *task; + + task = &gTasks[taskId]; + + var0 = GetBankPosition(gAnimBankAttacker, 2); + var1 = GetBankPosition(gAnimBankAttacker, 1) + 24; + var2 = GetBankPosition(gAnimBankTarget, 2); + var3 = GetBankPosition(gAnimBankTarget, 1) + 24; + + if ((gAnimBankAttacker ^ 2) == gAnimBankTarget) + var3 = var1; + + var4 = sub_80DD8BC(); + if (var4 == 1) + task->data[8] = 32; + else + task->data[8] = 48 - (var4 * 8); + + task->data[0] = 0; + task->data[11] = 0; + task->data[9] = 0; + task->data[12] = 1; + + var5 = task->data[8]; + if (var5 < 0) + var5 += 7; + + task->data[10] = (var5 >> 3) - 1; + + task->data[2] = var0 * 8; + task->data[3] = var1 * 8; + task->data[4] = ((var2 - var0) * 8) / task->data[8]; + task->data[5] = ((var3 - var1) * 8) / task->data[8]; + task->data[6] = 0; + task->data[7] = 0; + + pan1 = BattleAnimAdjustPanning(-64); + pan2 = BattleAnimAdjustPanning(63); + + task->data[13] = pan1; + task->data[14] = (pan2 - pan1) / task->data[8]; + task->data[1] = var4; + task->data[15] = GetAnimBankSpriteId(0); + + task->func = sub_80DD604; +} + +static void sub_80DD604(u8 taskId) +{ + struct Task *task; + + task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + task->data[6] -= task->data[4]; + task->data[7] -= task->data[5]; + gSprites[task->data[15]].pos2.x = task->data[6] >> 3; + gSprites[task->data[15]].pos2.y = task->data[7] >> 3; + + if (++task->data[9] == 10) + { + task->data[11] = 20; + task->data[0]++; + } + + PlaySE12WithPanning(SE_W029, task->data[13]); + break; + case 1: + if (--task->data[11] == 0) + task->data[0]++; + break; + case 2: + if (--task->data[9] != 0) + { + task->data[6] += task->data[4]; + task->data[7] += task->data[5]; + } + else + { + task->data[6] = 0; + task->data[7] = 0; + task->data[0]++; + } + + gSprites[task->data[15]].pos2.x = task->data[6] >> 3; + gSprites[task->data[15]].pos2.y = task->data[7] >> 3; + break; + case 3: + task->data[2] += task->data[4]; + task->data[3] += task->data[5]; + if (++task->data[9] >= task->data[10]) + { + task->data[9] = 0; + sub_80DD774(task); + task->data[13] += task->data[14]; + PlaySE12WithPanning(SE_W091, task->data[13]); + } + + if (--task->data[8] == 0) + { + task->data[0]++; + } + break; + case 4: + if (task->data[11] == 0) + DestroyAnimVisualTask(taskId); + break; + } +} + +static void sub_80DD774(struct Task *task) +{ + const struct SpriteTemplate *spriteTemplate; + int var0; + u16 x, y; + u8 spriteId; + + switch (task->data[1]) + { + case 1: + spriteTemplate = &gSpriteTemplate_83DAD78; + var0 = 0; + break; + case 2: + case 3: + spriteTemplate = &gSpriteTemplate_83DAD90; + var0 = 80; + break; + case 4: + spriteTemplate = &gSpriteTemplate_83DAD90; + var0 = 64; + break; + case 5: + spriteTemplate = &gSpriteTemplate_83DAD90; + var0 = 48; + break; + default: + return; + } + + x = task->data[2] >> 3; + y = task->data[3] >> 3; + x += (task->data[12] * 4); + + spriteId = CreateSprite(spriteTemplate, x, y, 35); + if (spriteId != 64) + { + gSprites[spriteId].data[0] = 18; + gSprites[spriteId].data[2] = ((task->data[12] * 20) + x) + (task->data[1] * 3); + gSprites[spriteId].data[4] = y; + gSprites[spriteId].data[5] = -16 - (task->data[1] * 2); + gSprites[spriteId].oam.tileNum += var0; + + sub_80786EC(&gSprites[spriteId]); + task->data[11]++; + } + + task->data[12] *= -1; +} + +void sub_80DD87C(struct Sprite *sprite) +{ + if (sub_8078718(sprite)) + { + u8 taskId = FindTaskIdByFunc(sub_80DD604); + if (taskId != 0xFF) + gTasks[taskId].data[11]--; + + DestroySprite(sprite); + } +} + +u8 sub_80DD8BC(void) +{ + u8 retVal = gAnimDisableStructPtr->rolloutTimer2 - gAnimDisableStructPtr->rolloutTimer1; + u8 var0 = retVal - 1; + if (var0 > 4) + { + retVal = 1; + } + + return retVal; +} + +void sub_80DD8E8(struct Sprite *sprite) +{ + StartSpriteAnim(sprite, gBattleAnimArgs[4]); + + sprite->pos2.x = gBattleAnimArgs[0]; + sprite->data[2] = gBattleAnimArgs[1]; + sprite->data[3] -= gBattleAnimArgs[2]; + sprite->data[0] = 3; + sprite->data[1] = gBattleAnimArgs[3]; + sprite->callback = sub_80DD928; + sprite->invisible = 1; +} + +static void sub_80DD928(struct Sprite *sprite) +{ + sprite->invisible = 0; + if (sprite->data[3] != 0) + { + sprite->pos2.y = sprite->data[2] + sprite->data[3]; + sprite->data[3] += sprite->data[0]; + sprite->data[0]++; + if (sprite->data[3] > 0) + { + sprite->data[3] = 0; + } + } + else + { + if (--sprite->data[1] == 0) + { + DestroyAnimSprite(sprite); + } + } +} + +void sub_80DD978(struct Sprite *sprite) +{ + if (GetBankSide(gAnimBankAttacker) == SIDE_OPPONENT) + StartSpriteAffineAnim(sprite, 1); + + sub_807941C(sprite); +} + +void sub_80DD9A4(struct Sprite *sprite) +{ + sprite->pos1.x = GetBankPosition(gAnimBankTarget, 0); + sprite->pos1.y = GetBankPosition(gAnimBankTarget, 1); + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += gBattleAnimArgs[1]; + + sprite->data[1] = gBattleAnimArgs[0]; + sprite->data[2] = gBattleAnimArgs[1]; + sprite->data[5] = gBattleAnimArgs[2]; + + StartSpriteAnim(sprite, gBattleAnimArgs[3]); + sprite->callback = sub_80DD9FC; +} + +static void sub_80DD9FC(struct Sprite *sprite) +{ + sprite->data[0] += 8; + sprite->data[3] += sprite->data[1]; + sprite->data[4] += sprite->data[2]; + + sprite->pos2.x += sprite->data[3] / 40; + sprite->pos2.y -= Sin(sprite->data[0], sprite->data[5]); + + if (sprite->data[0] > 140) + DestroyAnimSprite(sprite); +} + +void sub_80DDA4C(u8 taskId) +{ + if ((s32)gAnimMoveDmg < 33) + gBattleAnimArgs[7] = 0; + if (gAnimMoveDmg - 33 < 33) + gBattleAnimArgs[7] = 1; + if ((s32)gAnimMoveDmg > 65) + gBattleAnimArgs[7] = 2; + + DestroyAnimVisualTask(taskId); +} + +void sub_80DDA8C(u8 taskId) +{ + if (gTasks[taskId].data[0] == 0) + { + sub_80789D4(0); + gTasks[taskId].data[1] = 200; + } + + gBattle_BG3_Y += gTasks[taskId].data[1] / 10; + gTasks[taskId].data[1] -= 3; + + if (gTasks[taskId].data[0] == 120) + { + sub_80789D4(1); + DestroyAnimVisualTask(taskId); + } + + gTasks[taskId].data[0]++; +} + +void sub_80DDAF0(u8 taskId) +{ + if (gTasks[taskId].data[0] == 0) + { + sub_80789D4(0); + gTasks[taskId].data[0]++; + gTasks[taskId].data[2] = gBattle_BG3_Y; + } + + gTasks[taskId].data[1] += 80; + gTasks[taskId].data[1] &= 0xFF; + gBattle_BG3_Y = gTasks[taskId].data[2] + Cos(4, gTasks[taskId].data[1]); + + if (gBattleAnimArgs[7] == 0xFFF) + { + gBattle_BG3_Y = 0; + sub_80789D4(1); + DestroyAnimVisualTask(taskId); + } +} diff --git a/src/battle/anim/roots.c b/src/battle/anim/roots.c index 68f8a3e2f..68f8a3e2f 100755..100644 --- a/src/battle/anim/roots.c +++ b/src/battle/anim/roots.c diff --git a/src/battle/anim/scan.c b/src/battle/anim/scan.c index 22bb26973..22bb26973 100755..100644 --- a/src/battle/anim/scan.c +++ b/src/battle/anim/scan.c diff --git a/src/battle/anim/scary_face.c b/src/battle/anim/scary_face.c index 47776a3cb..8d51521ee 100755..100644 --- a/src/battle/anim/scary_face.c +++ b/src/battle/anim/scary_face.c @@ -27,7 +27,7 @@ static void sub_80D24E0(u8 taskId); void sub_80D23B4(u8 taskId) { struct Struct_sub_8078914 subStruct; - u8* tempvar; + REG_BLDCNT = 0x3F42; REG_BLDALPHA = 0x1000; REG_BG1CNT_BITFIELD.priority = 1; @@ -40,8 +40,7 @@ void sub_80D23B4(u8 taskId) REG_BG1HOFS = 0; REG_BG1VOFS = 0; sub_8078914(&subStruct); - tempvar = subStruct.field_4; - DmaFill32(3, 0x0, tempvar, 0x1000); + DmaFill32Defvars(3, 0, subStruct.field_4, 0x1000); if (IsContest()) LZDecompressVram(&gBattleAnimBackgroundTilemap_ScaryFaceContest, subStruct.field_4); else if (GetBankSide(gAnimBankTarget) == 1) @@ -98,21 +97,7 @@ void sub_80D24E0(u8 taskId) break; case 3: sub_8078914(&subStruct); - { - u8 *addr = subStruct.field_0; - u32 size = 0x2000; - while (1) - { - DmaFill32(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill32(3, 0, addr, size); - break; - } - } - } + DmaFill32Large(3, 0, subStruct.field_0, 0x2000, 0x1000); DmaClear32(3, subStruct.field_4, 0x800); if (!IsContest()) REG_BG1CNT_BITFIELD.charBaseBlock = 0; diff --git a/src/battle/anim/seed.c b/src/battle/anim/seed.c index be8613a74..be8613a74 100755..100644 --- a/src/battle/anim/seed.c +++ b/src/battle/anim/seed.c diff --git a/src/battle/anim/sfx.c b/src/battle/anim/sfx.c new file mode 100644 index 000000000..10ef1681e --- /dev/null +++ b/src/battle/anim/sfx.c @@ -0,0 +1,280 @@ +#include "global.h" +#include "battle_anim.h" +#include "contest.h" +#include "ewram.h" +#include "rom_8077ABC.h" +#include "sound.h" +#include "task.h" + +extern s16 gBattleAnimArgs[]; +extern u8 gAnimBankAttacker; +extern u8 gAnimBankTarget; +extern u16 gBattlePartyID[]; +extern u16 gAnimSpeciesByBanks[]; +extern u8 gUnknown_0202F7D2; + +static void sub_812AF98(u8 taskId); +static void sub_812B004(u8 taskId); +static void sub_812B108(u8 taskId); +static void sub_812B404(u8 taskId); + +// used in 1 move: +// Move_FIRE_BLAST +void sub_812AF30(u8 taskId) +{ + s8 sourcePan, targetPan, panIncrement; + + TASK.data[0] = gBattleAnimArgs[0]; + TASK.data[1] = gBattleAnimArgs[1]; + + sourcePan = BattleAnimAdjustPanning(-64); + targetPan = BattleAnimAdjustPanning(63); + panIncrement = CalculatePanIncrement(sourcePan, targetPan, 2); + + TASK.data[2] = sourcePan; + TASK.data[3] = targetPan; + TASK.data[4] = panIncrement; + TASK.data[10] = 10; + + TASK.func = sub_812AF98; +} + +static void sub_812AF98(u8 taskId) +{ + s16 pan = TASK.data[2]; + s8 dPan = TASK.data[4]; + + if (++TASK.data[11] == 111) + { + TASK.data[10] = 5; + TASK.data[11] = 0; + TASK.func = sub_812B004; + } + else + { + if (++TASK.data[10] == 11) + { + TASK.data[10] = 0; + PlaySE12WithPanning(TASK.data[0], pan); + } + pan += dPan; + TASK.data[2] = sub_8077104(pan, dPan); + } +} + +static void sub_812B004(u8 taskId) +{ + s8 pan; + + if (++TASK.data[10] == 6) + { + TASK.data[10] = 0; + + pan = BattleAnimAdjustPanning(63); + PlaySE12WithPanning(TASK.data[1], pan); + + if (++TASK.data[11] == 2) + { + DestroyAnimSoundTask(taskId); + } + } +} + +// used in 7 moves: +// Move_ICE_BEAM, Move_AURORA_BEAM, Move_PSYBEAM, +// Move_PSYWAVE, Move_SHADOW_BALL, Move_TRI_ATTACK, +// Move_HYPER_BEAM +void sub_812B058(u8 taskId) +{ + s16 sp = gBattleAnimArgs[0]; + s8 r5 = gBattleAnimArgs[2]; + s8 panIncrement = gBattleAnimArgs[3]; + u8 r10 = gBattleAnimArgs[4]; // number of times the sound must be played + u8 r7 = gBattleAnimArgs[5]; + u8 r9 = gBattleAnimArgs[6]; + + s8 pan1 = BattleAnimAdjustPanning(gBattleAnimArgs[1]); + s8 pan2 = BattleAnimAdjustPanning(r5); + panIncrement = CalculatePanIncrement(pan1, pan2, panIncrement); + + TASK.data[0] = sp; + TASK.data[1] = pan1; + TASK.data[2] = pan2; + TASK.data[3] = panIncrement; + TASK.data[4] = r10; + TASK.data[5] = r7; + TASK.data[6] = r9; + TASK.data[10] = 0; + TASK.data[11] = pan1; + TASK.data[12] = r9; + + TASK.func = sub_812B108; + TASK.func(taskId); +} + +static void sub_812B108(u8 taskId) +{ + if (TASK.data[12]++ == TASK.data[6]) + { + TASK.data[12] = 0; + PlaySE12WithPanning(TASK.data[0], TASK.data[11]); + + if (--TASK.data[4] == 0) + { + DestroyAnimSoundTask(taskId); + return; + } + } + + if (TASK.data[10]++ == TASK.data[5]) + { + u16 dPan, oldPan; + TASK.data[10] = 0; + dPan = TASK.data[3]; + oldPan = TASK.data[11]; + TASK.data[11] = dPan + oldPan; + TASK.data[11] = sub_8077104(TASK.data[11], oldPan); + } +} + +// #define shared19348 (*(struct UnknownContestStruct8 *)(gSharedMem + 0x19348)) +// #define EWRAM_19348 (*(u16 *)(gSharedMem + 0x19348)) + +// used in 3 moves: +// Move_HOWL, Move_ROAR, Move_GROWL +void sub_812B18C(u8 taskId) +{ + u16 species = 0; + s8 pan = BattleAnimAdjustPanning(-64); + + if (IsContest()) + { + if (!gBattleAnimArgs[0]) + species = shared19348.unk0; + else + DestroyAnimVisualTask(taskId); + } + else + { + u8 bank; + if (gBattleAnimArgs[0] == 0) + bank = gAnimBankAttacker; + else if (gBattleAnimArgs[0] == 1) + bank = gAnimBankTarget; + else if (gBattleAnimArgs[0] == 2) + bank = gAnimBankAttacker ^ 0x2; + else + bank = gAnimBankTarget ^ 0x2; + + if (gBattleAnimArgs[0] == 1 || gBattleAnimArgs[0] == 3) + { + if (!IsAnimBankSpriteVisible(bank)) + { + DestroyAnimVisualTask(taskId); + return; + } + } + + if (GetBankSide(bank)) + species = GetMonData(&gEnemyParty[gBattlePartyID[bank]], 0xB); + else + species = GetMonData(&gPlayerParty[gBattlePartyID[bank]], 0xB); + } + + if (species != 0) + { + s16 mode = gBattleAnimArgs[1]; + if (mode == 0xFF) + PlayCry1(species, pan); + else + PlayCry3(species, pan, mode); + } + + DestroyAnimVisualTask(taskId); +} + +// used in Move_HYPER_VOICE +void sub_812B2B8(u8 taskId) +{ + u16 species; + s8 pan = BattleAnimAdjustPanning(-64); + + if (IsContest()) + species = shared19348.unk0; + else + species = gAnimSpeciesByBanks[gAnimBankAttacker]; + + if (species != 0) + PlayCry3(species, pan, 4); + + DestroyAnimVisualTask(taskId); +} + +// used in 6 moves: +// Move_SKY_ATTACK, Move_LUSTER_PURGE, Move_FLATTER, +// Move_DRAGON_CLAW, Move_RETURN, Move_COSMIC_POWER, +void sub_812B30C(u8 taskId) +{ + u16 songNum = gBattleAnimArgs[0]; + s8 pan = BattleAnimAdjustPanning(gBattleAnimArgs[1]); + PlaySE1WithPanning(songNum, pan); + + DestroyAnimVisualTask(taskId); +} + +// used in 6 moves: +// Move_SKY_ATTACK, Move_SUPERPOWER, Move_ENCORE, +// Move_FLATTER, Move_RETURN, Move_COSMIC_POWER +void sub_812B340(u8 taskId) +{ + u16 songNum = gBattleAnimArgs[0]; + s8 pan = BattleAnimAdjustPanning(gBattleAnimArgs[1]); + PlaySE2WithPanning(songNum, pan); + + DestroyAnimVisualTask(taskId); +} + +// used in 2 moves: +// Move_CONFUSE_RAY, Move_WILL_O_WISP +void sub_812B374(u8 taskId) +{ + u8 r5 = gBattleAnimArgs[1]; + s8 panIncrement = gBattleAnimArgs[2]; + s16 r9 = gBattleAnimArgs[3]; + s8 r1 = gBattleAnimArgs[0]; + + s8 sourcePan = BattleAnimAdjustPanning(r1); + s8 targetPan = BattleAnimAdjustPanning(r5); + panIncrement = CalculatePanIncrement(sourcePan, targetPan, panIncrement); + + TASK.data[1] = sourcePan; + TASK.data[2] = targetPan; + TASK.data[3] = panIncrement; + TASK.data[5] = r9; + TASK.data[10] = 0; + TASK.data[11] = sourcePan; + + TASK.func = sub_812B404; + TASK.func(taskId); +} + +static void sub_812B404(u8 taskId) +{ + u16 dPan = TASK.data[3]; + + if (TASK.data[10]++ == TASK.data[5]) + { + u16 oldPan; + TASK.data[10] = 0; + oldPan = TASK.data[11]; + TASK.data[11] = dPan + oldPan; + TASK.data[11] = sub_8077104(TASK.data[11], oldPan); + } + + gUnknown_0202F7D2 = TASK.data[11]; + + if (TASK.data[11] == TASK.data[2]) + { + DestroyAnimVisualTask(taskId); + } +}
\ No newline at end of file diff --git a/src/battle/anim/shadow_enlarge.c b/src/battle/anim/shadow_enlarge.c index 399cf1ba4..399cf1ba4 100755..100644 --- a/src/battle/anim/shadow_enlarge.c +++ b/src/battle/anim/shadow_enlarge.c diff --git a/src/battle/anim/shadow_minimize.c b/src/battle/anim/shadow_minimize.c index 94069374f..94069374f 100755..100644 --- a/src/battle/anim/shadow_minimize.c +++ b/src/battle/anim/shadow_minimize.c diff --git a/src/battle/anim/shield.c b/src/battle/anim/shield.c index 676318545..676318545 100755..100644 --- a/src/battle/anim/shield.c +++ b/src/battle/anim/shield.c diff --git a/src/battle/anim/shimmer.c b/src/battle/anim/shimmer.c index 9e7bea1e4..9e7bea1e4 100755..100644 --- a/src/battle/anim/shimmer.c +++ b/src/battle/anim/shimmer.c diff --git a/src/battle/anim/silhouette.c b/src/battle/anim/silhouette.c index a3147f598..a3147f598 100755..100644 --- a/src/battle/anim/silhouette.c +++ b/src/battle/anim/silhouette.c diff --git a/src/battle/anim/slash.c b/src/battle/anim/slash.c index 6adcaf098..6adcaf098 100755..100644 --- a/src/battle/anim/slash.c +++ b/src/battle/anim/slash.c diff --git a/src/battle/anim/sleep.c b/src/battle/anim/sleep.c index 0f0e54f80..0f0e54f80 100755..100644 --- a/src/battle/anim/sleep.c +++ b/src/battle/anim/sleep.c diff --git a/src/battle/anim/slice.c b/src/battle/anim/slice.c index fe8745483..fe8745483 100755..100644 --- a/src/battle/anim/slice.c +++ b/src/battle/anim/slice.c diff --git a/src/battle/anim/smoke.c b/src/battle/anim/smoke.c index 7ab873e63..7ab873e63 100755..100644 --- a/src/battle/anim/smoke.c +++ b/src/battle/anim/smoke.c diff --git a/src/battle/anim/sonic.c b/src/battle/anim/sonic.c index 0897ec6e3..0897ec6e3 100755..100644 --- a/src/battle/anim/sonic.c +++ b/src/battle/anim/sonic.c diff --git a/src/battle/anim/sonic_task.c b/src/battle/anim/sonic_task.c index 924b1b568..924b1b568 100755..100644 --- a/src/battle/anim/sonic_task.c +++ b/src/battle/anim/sonic_task.c diff --git a/src/battle/anim/spin_finger.c b/src/battle/anim/spin_finger.c index 8eb060358..8eb060358 100755..100644 --- a/src/battle/anim/spin_finger.c +++ b/src/battle/anim/spin_finger.c diff --git a/src/battle/anim/spit.c b/src/battle/anim/spit.c index 1e65ba53e..1e65ba53e 100755..100644 --- a/src/battle/anim/spit.c +++ b/src/battle/anim/spit.c diff --git a/src/battle/anim/splash.c b/src/battle/anim/splash.c index 570ef0dca..570ef0dca 100755..100644 --- a/src/battle/anim/splash.c +++ b/src/battle/anim/splash.c diff --git a/src/battle/anim/startle.c b/src/battle/anim/startle.c index 50e78af37..50e78af37 100755..100644 --- a/src/battle/anim/startle.c +++ b/src/battle/anim/startle.c diff --git a/src/battle/anim/strike.c b/src/battle/anim/strike.c index bfa1dc4f7..bfa1dc4f7 100755..100644 --- a/src/battle/anim/strike.c +++ b/src/battle/anim/strike.c diff --git a/src/battle/anim/switch.c b/src/battle/anim/switch.c index c4082b6aa..c4082b6aa 100755..100644 --- a/src/battle/anim/switch.c +++ b/src/battle/anim/switch.c diff --git a/src/battle/anim/sword.c b/src/battle/anim/sword.c index b46fe6759..b46fe6759 100755..100644 --- a/src/battle/anim/sword.c +++ b/src/battle/anim/sword.c diff --git a/src/battle/anim/taunt_finger.c b/src/battle/anim/taunt_finger.c index 023e14e45..023e14e45 100755..100644 --- a/src/battle/anim/taunt_finger.c +++ b/src/battle/anim/taunt_finger.c diff --git a/src/battle/anim/tendrils.c b/src/battle/anim/tendrils.c index 9f57ffd45..9f57ffd45 100755..100644 --- a/src/battle/anim/tendrils.c +++ b/src/battle/anim/tendrils.c diff --git a/src/battle/anim/thought.c b/src/battle/anim/thought.c index c3ab6f82c..c3ab6f82c 100755..100644 --- a/src/battle/anim/thought.c +++ b/src/battle/anim/thought.c diff --git a/src/battle/anim/thrashing.c b/src/battle/anim/thrashing.c index 3fde815ae..3fde815ae 100755..100644 --- a/src/battle/anim/thrashing.c +++ b/src/battle/anim/thrashing.c diff --git a/src/battle/anim/tile_in.c b/src/battle/anim/tile_in.c index a4a544a0c..a4a544a0c 100755..100644 --- a/src/battle/anim/tile_in.c +++ b/src/battle/anim/tile_in.c diff --git a/src/battle/anim/tile_out.c b/src/battle/anim/tile_out.c index 50468a440..50468a440 100755..100644 --- a/src/battle/anim/tile_out.c +++ b/src/battle/anim/tile_out.c diff --git a/src/battle/anim/twinkle.c b/src/battle/anim/twinkle.c index e26669f63..e26669f63 100755..100644 --- a/src/battle/anim/twinkle.c +++ b/src/battle/anim/twinkle.c diff --git a/src/battle/anim/unused_1.c b/src/battle/anim/unused_1.c index d7e5fbfe4..d7e5fbfe4 100755..100644 --- a/src/battle/anim/unused_1.c +++ b/src/battle/anim/unused_1.c diff --git a/src/battle/anim/unused_2.c b/src/battle/anim/unused_2.c index 122f39e02..122f39e02 100755..100644 --- a/src/battle/anim/unused_2.c +++ b/src/battle/anim/unused_2.c diff --git a/src/battle/anim/unused_3.c b/src/battle/anim/unused_3.c index 6dbcbfefe..6dbcbfefe 100755..100644 --- a/src/battle/anim/unused_3.c +++ b/src/battle/anim/unused_3.c diff --git a/src/battle/anim/unused_4.c b/src/battle/anim/unused_4.c index bda476a0a..bda476a0a 100755..100644 --- a/src/battle/anim/unused_4.c +++ b/src/battle/anim/unused_4.c diff --git a/src/battle/anim/unused_5.c b/src/battle/anim/unused_5.c index 421cdd6bf..421cdd6bf 100755..100644 --- a/src/battle/anim/unused_5.c +++ b/src/battle/anim/unused_5.c diff --git a/src/battle/anim/unused_6.c b/src/battle/anim/unused_6.c index 37e2031b0..37e2031b0 100755..100644 --- a/src/battle/anim/unused_6.c +++ b/src/battle/anim/unused_6.c diff --git a/src/battle/anim/unused_7.c b/src/battle/anim/unused_7.c index 2be6e7633..2be6e7633 100755..100644 --- a/src/battle/anim/unused_7.c +++ b/src/battle/anim/unused_7.c diff --git a/src/battle/anim/unused_8.c b/src/battle/anim/unused_8.c index 03772f951..03772f951 100755..100644 --- a/src/battle/anim/unused_8.c +++ b/src/battle/anim/unused_8.c diff --git a/src/battle/anim/unused_9.c b/src/battle/anim/unused_9.c index cf3ccb0d4..cf3ccb0d4 100755..100644 --- a/src/battle/anim/unused_9.c +++ b/src/battle/anim/unused_9.c diff --git a/src/battle/anim/wave_finger.c b/src/battle/anim/wave_finger.c index 2cf68c34c..2cf68c34c 100755..100644 --- a/src/battle/anim/wave_finger.c +++ b/src/battle/anim/wave_finger.c diff --git a/src/battle/anim/whip.c b/src/battle/anim/whip.c index cb3ce327e..cb3ce327e 100755..100644 --- a/src/battle/anim/whip.c +++ b/src/battle/anim/whip.c diff --git a/src/battle/anim/wisp_fire.c b/src/battle/anim/wisp_fire.c new file mode 100644 index 000000000..348ce6426 --- /dev/null +++ b/src/battle/anim/wisp_fire.c @@ -0,0 +1,196 @@ +#include "global.h" +#include "battle_anim.h" +#include "blend_palette.h" +#include "main.h" +#include "rom_8077ABC.h" +#include "task.h" +#include "trig.h" + +extern s16 gBattleAnimArgs[]; +extern u8 gAnimBankTarget; +extern u8 gAnimBankAttacker; + +extern u8 gObjectBankIDs[]; +extern s8 gUnknown_083D9794[16]; +extern s8 gUnknown_083D97A4[16]; + +void sub_80D5E4C(u8 taskId); + +void sub_80D5CC0(struct Sprite *sprite) +{ + if (!sprite->data[0]) + { + sprite->data[1] = gBattleAnimArgs[0]; + sprite->data[0] += 1; + } + + sprite->data[3] += 0xC0 * 2; + sprite->data[4] += 0xA0; + + sprite->pos2.x = Sin(sprite->data[1], sprite->data[3] >> 8); + sprite->pos2.y = Cos(sprite->data[1], sprite->data[4] >> 8); + + sprite->data[1] = (sprite->data[1] + 7) & 0xFF; + + if (gMain.inBattle) + { + if (sprite->data[1] < 64 || sprite->data[1] > 195) + sprite->oam.priority = sub_8079ED4(gAnimBankTarget); + else + sprite->oam.priority = sub_8079ED4(gAnimBankTarget) + 1; + } + else + { + if (sprite->data[1] < 64 || sprite->data[1] > 195) + sprite->subpriority = 0x1D; + else + sprite->subpriority = 0x1F; + } + + if (++sprite->data[2] > 0x14) + sprite->invisible ^= 1; + + if (sprite->data[2] == 0x1E) + DestroyAnimSprite(sprite); +} + +void sub_80D5DDC(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + task->data[12] = !GetBankSide(gAnimBankAttacker) ? 1 : -1; + task->data[13] = IsAnimBankSpriteVisible(gAnimBankTarget ^ 2) + 1; + task->data[14] = GetAnimBankSpriteId(1); + task->data[15] = GetAnimBankSpriteId(3); + + task->func = sub_80D5E4C; +} + +void sub_80D5E4C(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + task->data[10] += task->data[12] * 2; + if (++task->data[1] >= 2) + { + task->data[1] = 0; + task->data[2]++; + if (task->data[2] & 1) + task->data[11] = 2; + else + task->data[11] = -2; + } + + for (task->data[3] = 0; task->data[3] < task->data[13]; task->data[3]++) + { + gSprites[task->data[task->data[3] + 14]].pos2.x = task->data[10] + task->data[11]; + } + + if (++task->data[9] == 16) + { + task->data[9] = 0; + task->data[0]++; + } + break; + case 1: + if (++task->data[1] >= 5) + { + task->data[1] = 0; + task->data[2]++; + + if (task->data[2] & 1) + task->data[11] = 2; + else + task->data[11] = -2; + } + + for (task->data[3] = 0; task->data[3] < task->data[13]; task->data[3]++) + { + gSprites[task->data[task->data[3] + 14]].pos2.x = task->data[10] + task->data[11]; + } + + if (++task->data[9] == 96) + { + task->data[9] = 0; + task->data[0]++; + } + break; + case 2: + task->data[10] -= task->data[12] * 2; + + if (++task->data[1] >= 2) + { + task->data[1] = 0; + task->data[2]++; + + if (task->data[2] & 1) + task->data[11] = 2; + else + task->data[11] = -2; + } + + for (task->data[3] = 0; task->data[3] < task->data[13]; task->data[3]++) + { + gSprites[task->data[task->data[3] + 14]].pos2.x = task->data[10] + task->data[11]; + } + + if (++task->data[9] == 16) + { + task->data[0]++; + } + break; + case 3: + for (task->data[3] = 0; task->data[3] < task->data[13]; task->data[3]++) + { + gSprites[task->data[task->data[3] + 14]].pos2.x = 0; + } + + DestroyAnimVisualTask(taskId); + break; + } +} + +void sub_80D6080(u8 taskId) +{ + struct Struct_sub_8078914 unk; + sub_8078914(&unk); + BlendPalette(unk.field_8 << 4, 16, gBattleAnimArgs[0], gBattleAnimArgs[1]); // u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor + DestroyAnimVisualTask(taskId); +} + +void sub_80D60B4(u8 taskId) +{ + s8 unk; + u8 spriteId; + + if (gTasks[taskId].data[0] == 0) + { + gTasks[taskId].data[1] = gBattleAnimArgs[0]; + gTasks[taskId].data[2] = gBattleAnimArgs[1]; + gTasks[taskId].data[3] = gBattleAnimArgs[2]; + gTasks[taskId].data[4] = gBattleAnimArgs[3]; + } + gTasks[taskId].data[0]++; + + spriteId = gObjectBankIDs[gAnimBankTarget]; + + if (!gTasks[taskId].data[4]) + unk = gUnknown_083D9794[gTasks[taskId].data[0] % 10]; + else + unk = gUnknown_083D97A4[gTasks[taskId].data[0] % 10]; + + if (gTasks[taskId].data[3] == 1) + gSprites[spriteId].pos2.y = gBattleAnimArgs[1] * unk < 0 ? -(gBattleAnimArgs[1] * unk) : gBattleAnimArgs[1] * unk; + else + gSprites[spriteId].pos2.x = gBattleAnimArgs[1] * unk; + + if (gTasks[taskId].data[0] == gTasks[taskId].data[1]) + { + gSprites[spriteId].pos2.x = 0; + gSprites[spriteId].pos2.y = 0; + DestroyAnimVisualTask(taskId); + } +}
\ No newline at end of file diff --git a/src/battle/anim/withdraw.c b/src/battle/anim/withdraw.c index e67248b9f..e67248b9f 100755..100644 --- a/src/battle/anim/withdraw.c +++ b/src/battle/anim/withdraw.c diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index b0654950b..b09d9ad8d 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -1,34 +1,48 @@ #include "global.h" #include "constants/abilities.h" +#include "constants/battle_move_effects.h" +#include "constants/hold_effects.h" +#include "constants/items.h" +#include "constants/moves.h" +#include "constants/songs.h" +#include "constants/species.h" +#include "gba/flash_internal.h" #include "battle.h" +#include "battle_ai.h" #include "battle_interface.h" +#include "battle_message.h" #include "battle_setup.h" +#include "battle_util.h" #include "data2.h" +#include "decompress.h" +#include "event_data.h" +#include "evolution_scene.h" #include "item.h" #include "link.h" #include "main.h" +#include "m4a.h" #include "name_string_util.h" +#include "overworld.h" #include "palette.h" #include "party_menu.h" #include "pokeball.h" #include "pokedex.h" #include "pokemon.h" #include "random.h" +#include "roamer.h" #include "rom3.h" #include "rom_8077ABC.h" #include "rom_8094928.h" -#include "constants/songs.h" #include "sound.h" -#include "constants/species.h" #include "sprite.h" +#include "string_util.h" #include "task.h" #include "text.h" +#include "trainer.h" #include "trig.h" -#include "unknown_task.h" +#include "tv.h" +#include "scanline_effect.h" #include "util.h" -#include "constants/items.h" -#include "constants/hold_effects.h" -#include "constants/battle_move_effects.h" #include "ewram.h" struct UnknownStruct7 @@ -53,20 +67,29 @@ struct UnknownStruct12 u8 filler4[0x54]; }; +extern void sub_802BBD4(); + +extern struct SpriteTemplate gUnknown_02024E8C; +extern const u8 Str_821F7B8[]; +extern u8 gUnknown_02023A14_50; extern const u16 gUnknown_08D004E0[]; extern const struct MonCoords gCastformFrontSpriteCoords[]; - +extern const u8 Str_821F7EA[]; +extern const u8 gUnknown_Debug_821F7F3[]; +extern const u8 BattleText_YesNo[]; +extern u8 gStatStageRatios[][2]; +extern u8 gActionsByTurnOrder[4]; extern struct UnknownPokemonStruct2 gUnknown_02023A00[]; extern u8 gBattleBufferB[][0x200]; extern u8 gActiveBank; extern u32 gBattleExecBuffer; extern u8 gNoOfAllBanks; extern u16 gBattlePartyID[]; -extern u8 gFightStateTracker; -extern u8 gTurnOrder[]; +extern u8 gCurrentActionFuncId; +extern u8 gBanksByTurnOrder[]; extern struct UnknownStruct12 gUnknown_02024AD0[]; extern u8 gObjectBankIDs[]; -extern u16 gCurrentMove; +extern u16 gCurrentMove; // This is mis-named. It is a species, not a move ID. extern u8 gLastUsedAbility; extern u8 gStringBank; extern u8 gAbsentBankFlags; @@ -74,10 +97,10 @@ extern u8 gMultiHitCounter; extern u8 gActionForBanks[]; extern u16 gUnknown_02024C2C[]; extern u16 gLastUsedMove[]; -extern u16 gMoveHitWith[]; -extern u16 gUnknown_02024C44[]; +extern u16 gLastLandedMoves[]; +extern u16 gLastHitByType[]; extern u16 gUnknown_02024C4C[]; -extern u16 gLockedMove[]; +extern u16 gLockedMoves[]; extern u8 gUnknown_02024C5C[]; extern u16 gChosenMovesByBanks[]; extern u32 gHitMarker; @@ -95,9 +118,9 @@ extern u16 gUnknown_02024DE8; extern u8 gActionSelectionCursor[]; extern u8 gMoveSelectionCursor[]; extern u8 gUnknown_02038470[]; -extern u16 gUnknown_030041B0; +extern u16 gBattle_BG3_X; extern u16 gBattle_BG1_Y; -extern u16 gUnknown_030041B8; +extern u16 gBattle_BG3_Y; extern struct Window gUnknown_030041D0; extern u16 gBattle_WIN1H; extern struct Window gUnknown_03004210; @@ -107,8 +130,8 @@ extern u16 gBattle_WIN0V; extern u16 gBattle_BG2_Y; extern u32 gUnknown_03004284; extern u16 gBattle_BG2_X; -extern u16 gUnknown_030042A0; -extern u16 gUnknown_030042A4; +extern u16 gBattle_BG0_Y; +extern u16 gBattle_BG0_X; extern u16 gBattle_BG1_X; extern u16 gBattle_WIN0H; extern MainCallback gPreBattleCallback1; @@ -129,8 +152,52 @@ extern u16 gBattleWeather; extern u32 gBattleMoveDamage; extern struct BattlePokemon gBattleMons[]; extern u8 gBattleMoveFlags; - +extern u8 BattleScript_FocusPunchSetUp[]; +extern u16 gDynamicBasePower; +extern u8 gCurrentTurnActionNumber; +extern void (* const gUnknown_081FA640[])(void); +extern void (* const gUnknown_081FA678[])(void); +extern u8* gBattlescriptCurrInstr; +extern u8 BattleScript_LinkBattleWonOrLost[]; +extern u8 BattleScript_PayDayMoneyAndPickUpItems[]; +extern u8 gUnknown_081D8E0D[]; +extern u8 BattleScript_LocalTrainerBattleWon[]; +extern u8 BattleScript_LocalBattleLost[]; +extern u8 BattleScript_GotAwaySafely[]; +extern u8 BattleScript_SmokeBallEscape[]; +extern u8 BattleScript_RanAwayUsingMonAbility[]; +extern u8 BattleScript_WildMonFled[]; +extern u8 BattleScript_ActionSwitch[]; +extern u8 BattleScript_PrintFailedToRunString[]; +extern const BattleCmdFunc gBattleScriptingCommandsTable[]; +extern u8 gCritMultiplier; +extern u8 gCurrMovePos; +extern u8 gUnknown_02024BE5; +extern u16 gChosenMove; +extern u8* gBattleScriptsForMoveEffects[]; +extern u16 gLastUsedItem; +extern u8 * const gBattlescriptsForBallThrow[]; +extern u8 * const gBattlescriptsForRunningByItem[]; +extern u8 * const gBattlescriptsForUsingItem[]; +extern u8 * const gBattlescriptsForSafariActions[]; +extern u8 gBattleTextBuff2[]; +extern u8 gNumSafariBalls; +extern u8 gUnknown_081FA70C[][3]; +extern u8 gUnknown_081FA71B[]; +extern u8 gUnknown_081FA71F[]; + +void sub_8010824(void); static void BattlePrepIntroSlide(void); +void CheckFocusPunch_ClearVarsBeforeTurnStarts(void); +void SetActionsAndBanksTurnOrder(void); +static void TurnValuesCleanUp(u8); +void SpecialStatusesClear(void); +static void RunTurnActionsFunctions(void); +void HandleEndTurn_FinishBattle(); +static void FreeResetData_ReturnToOvOrDoEvolutions(void); +void TryEvolvePokemon(void); +static void ReturnFromBattleToOverworld(void); +static void WaitForEvoSceneToFinish(void); void sub_800E7C4(void) { @@ -162,35 +229,42 @@ void InitBattle(void) REG_WINOUT = 0; gBattle_WIN0H = 0xF0; gBattle_WIN0V = 0x5051; - dp12_8087EA4(); + ScanlineEffect_Clear(); for (i = 0; i < 80; i++) { - gUnknown_03004DE0[0][i] = 0xF0; - gUnknown_03004DE0[1][i] = 0xF0; + gScanlineEffectRegBuffers[0][i] = 0xF0; + gScanlineEffectRegBuffers[1][i] = 0xF0; } for (i = 80; i < 160; i++) { asm(""::"r"(i)); // Needed to stop the compiler from optimizing out the loop counter - gUnknown_03004DE0[0][i] = 0xFF10; - gUnknown_03004DE0[1][i] = 0xFF10; + gScanlineEffectRegBuffers[0][i] = 0xFF10; + gScanlineEffectRegBuffers[1][i] = 0xFF10; } - //sub_80895F8(gUnknown_081F9674.unk0, gUnknown_081F9674.unk4, gUnknown_081F9674.unk8); - sub_80895F8(gUnknown_081F9674); - SetUpWindowConfig(&gWindowConfig_81E6C58); + //ScanlineEffect_SetParams(gUnknown_081F9674.unk0, gUnknown_081F9674.unk4, gUnknown_081F9674.unk8); + ScanlineEffect_SetParams(gUnknown_081F9674); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C58); ResetPaletteFade(); - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; gBattle_BG1_X = 0; gBattle_BG1_Y = 0; gBattle_BG2_X = 0; gBattle_BG2_Y = 0; - gUnknown_030041B0 = 0; - gUnknown_030041B8 = 0; + gBattle_BG3_X = 0; + gBattle_BG3_Y = 0; + +#if DEBUG + if (!(gUnknown_02023A14_50 & 8)) + gBattleTerrain = BattleSetup_GetTerrain(); +#else gBattleTerrain = BattleSetup_GetTerrain(); - InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6C58); - InitWindowFromConfig(&gUnknown_030041D0, &gWindowConfig_81E71D0); - InitWindowFromConfig(&gUnknown_03004250, &gWindowConfig_81E71EC); +#endif + + Text_InitWindowWithTemplate(&gUnknown_03004210, &gWindowTemplate_81E6C58); + Text_InitWindowWithTemplate(&gUnknown_030041D0, &gWindowTemplate_81E71D0); + Text_InitWindowWithTemplate(&gUnknown_03004250, &gWindowTemplate_81E71EC); sub_800D6D4(); sub_800DAB8(); ResetSpriteData(); @@ -204,7 +278,11 @@ void InitBattle(void) SetMainCallback2(sub_800F298); else SetMainCallback2(sub_800EC9C); - if (!(gBattleTypeFlags & BATTLE_TYPE_LINK)) + if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) +#if DEBUG + && !(gUnknown_02023A14_50 & 8) +#endif + ) { CreateNPCTrainerParty(gEnemyParty, gTrainerBattleOpponent); SetWildMonHeldItem(); @@ -244,8 +322,8 @@ void sub_800E9EC(void) if (species != SPECIES_EGG && hp == 0) r6 |= 3 << i * 2; } - BATTLE_STRUCT->unk2 = r6; - BATTLE_STRUCT->unk3 = r6 >> 8; + gBattleStruct->unk2 = r6; + gBattleStruct->unk3 = r6 >> 8; } void sub_800EAAC(void) @@ -326,6 +404,7 @@ void sub_800EC9C(void) { u8 playerId; u8 enemyId; + s32 id; RunTasks(); AnimateSprites(); @@ -339,13 +418,23 @@ void sub_800EC9C(void) case 0: if (gBattleTypeFlags & BATTLE_TYPE_LINK) { - if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC()) + if (gReceivedRemoteLinkPlayers != 0 && IsLinkTaskFinished()) { - BATTLE_STRUCT->unk0 = 1; - BATTLE_STRUCT->unk1 = 1; + gBattleStruct->unk0 = 1; + gBattleStruct->unk1 = 1; sub_800E9EC(); sub_800EAAC(); - SendBlock(bitmask_all_link_players_but_self(), BATTLE_STRUCT, 32); +#if DEBUG + if (gUnknown_02023A14_50 & 8) + { + for (id = 0; id < 2; id++) // Why < 2 here? + { + gLinkPlayers[id].lp_field_18 = id; + gLinkPlayers[id].linkType = 0x2211; + } + } +#endif + SendBlock(bitmask_all_link_players_but_self(), gBattleStruct, 32); gBattleCommunication[0] = 1; } } @@ -359,7 +448,6 @@ void sub_800EC9C(void) case 1: if ((GetBlockReceivedStatus() & 3) == 3) { - s32 id; u8 taskId; ResetBlockReceivedFlags(); @@ -401,13 +489,13 @@ void sub_800EC9C(void) gTasks[taskId].data[1] = 0x10E; gTasks[taskId].data[2] = 0x5A; gTasks[taskId].data[5] = 0; - gTasks[taskId].data[3] = BATTLE_STRUCT->unk2 | (BATTLE_STRUCT->unk3 << 8); + gTasks[taskId].data[3] = gBattleStruct->unk2 | (gBattleStruct->unk3 << 8); gTasks[taskId].data[4] = gBlockRecvBuffer[enemyId][1]; gBattleCommunication[0]++; } break; case 2: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { SendBlock(bitmask_all_link_players_but_self(), gPlayerParty, sizeof(*gPlayerParty) * 2); gBattleCommunication[0]++; @@ -422,7 +510,7 @@ void sub_800EC9C(void) } break; case 4: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 2, sizeof(*gPlayerParty) * 2); gBattleCommunication[0]++; @@ -437,7 +525,7 @@ void sub_800EC9C(void) } break; case 6: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 4, sizeof(*gPlayerParty) * 2); gBattleCommunication[0]++; @@ -468,7 +556,7 @@ void sub_800EC9C(void) { gPreBattleCallback1 = gMain.callback1; gMain.callback1 = sub_8010824; - SetMainCallback2(sub_800F808); + SetMainCallback2(BattleMainCB2); if (gBattleTypeFlags & BATTLE_TYPE_LINK) { gTrainerBattleOpponent = 0x800; @@ -496,7 +584,7 @@ void sub_800F02C(void) gUnknown_02023A00[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); gUnknown_02023A00[i].personality = GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY); gUnknown_02023A00[i].gender = GetMonGender(&gPlayerParty[i]); - StripExtCtrlCodes(nickname); + Text_StripExtCtrlCodes(nickname); gUnknown_02023A00[i].language = GetMonData(&gPlayerParty[i], MON_DATA_LANGUAGE); if (gUnknown_02023A00[i].language != 1) PadNameString(nickname, 0); @@ -509,6 +597,7 @@ void sub_800F104(void) u8 playerId; MainCallback *pSavedCallback; u16 *pSavedBattleTypeFlags; + s32 i; playerId = GetMultiplayerId(); ewram160CB = playerId; @@ -522,17 +611,30 @@ void sub_800F104(void) switch (gBattleCommunication[0]) { case 0: - if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC()) + if (gReceivedRemoteLinkPlayers != 0) { - sub_800F02C(); - SendBlock(bitmask_all_link_players_but_self(), gSharedMem, 0x60); - gBattleCommunication[0]++; +#if DEBUG + if (gUnknown_02023A14_50 & 8) + { + for (i = 0; i < 4; i++) + { + gLinkPlayers[i].lp_field_18 = i; + gLinkPlayers[i].linkType = 0x2211; + } + } +#endif + if (IsLinkTaskFinished()) + { + sub_800F02C(); + SendBlock(bitmask_all_link_players_but_self(), gSharedMem, 0x60); + gBattleCommunication[0]++; + } } break; case 1: if ((GetBlockReceivedStatus() & 0xF) == 0xF) { - s32 i; + //s32 i; ResetBlockReceivedFlags(); for (i = 0; i < 4; i++) @@ -582,14 +684,27 @@ void sub_800F298(void) switch (gBattleCommunication[0]) { case 0: - if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC()) + if (gReceivedRemoteLinkPlayers != 0) { - BATTLE_STRUCT->unk0 = 1; - BATTLE_STRUCT->unk1 = 1; - sub_800E9EC(); - sub_800EAAC(); - SendBlock(bitmask_all_link_players_but_self(), gSharedMem, 0x20); - gBattleCommunication[0]++; +#if DEBUG + if (gUnknown_02023A14_50 & 8) + { + for (id = 0; id < 4; id++) + { + gLinkPlayers[id].lp_field_18 = id; + gLinkPlayers[id].linkType = 0x2211; + } + } +#endif + if (IsLinkTaskFinished()) + { + gBattleStruct->unk0 = 1; + gBattleStruct->unk1 = 1; + sub_800E9EC(); + sub_800EAAC(); + SendBlock(bitmask_all_link_players_but_self(), gSharedMem, 0x20); + gBattleCommunication[0]++; + } } break; case 1: @@ -675,7 +790,7 @@ void sub_800F298(void) break; case 2: step_2: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { SendBlock(bitmask_all_link_players_but_self(), ewram1D000, sizeof(struct Pokemon) * 2); gBattleCommunication[0]++; @@ -738,7 +853,7 @@ void sub_800F298(void) } break; case 4: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { SendBlock(bitmask_all_link_players_but_self(), ewram1D000 + 2, sizeof(struct Pokemon)); gBattleCommunication[0]++; @@ -826,7 +941,7 @@ void sub_800F298(void) { gPreBattleCallback1 = gMain.callback1; gMain.callback1 = sub_8010824; - SetMainCallback2(sub_800F808); + SetMainCallback2(BattleMainCB2); if (gBattleTypeFlags & BATTLE_TYPE_LINK) { gTrainerBattleOpponent = 0x800; @@ -837,11 +952,34 @@ void sub_800F298(void) } } -void sub_800F808(void) +void BattleMainCB2(void) { AnimateSprites(); BuildOamBuffer(); - sub_800374C(&gUnknown_03004210); + +#if DEBUG + if ((gMain.heldKeys & (R_BUTTON | SELECT_BUTTON)) == ((R_BUTTON | SELECT_BUTTON))) + { + gSpecialVar_Result = gBattleOutcome = 1; + gMain.inBattle = FALSE; + gScanlineEffect.state = 3; + gMain.callback1 = gPreBattleCallback1; + ZeroEnemyPartyMons(); + m4aSongNumStop(0x5A); + if (gBattleTypeFlags & 2) + SetMainCallback2(sub_805465C); + else + SetMainCallback2(gMain.savedCallback); + } + if (gBattleTypeFlags & 2) + { + debug_sub_8008264((gBattleTypeFlags >> 2) % 2, 1, 1, 1, 1); + debug_sub_8008264((gBattleTypeFlags >> 2) % 2, 1, 21, 1, 1); + debug_sub_8008264((gBattleTypeFlags >> 2) % 2, 1, 41, 1, 1); + } +#endif + + Text_UpdateWindowInBattle(&gUnknown_03004210); UpdatePaletteFade(); RunTasks(); } @@ -1001,14 +1139,14 @@ void sub_800FCD4(void) void sub_800FCFC(void) { Random(); // unused return value - REG_BG0HOFS = gUnknown_030042A4; - REG_BG0VOFS = gUnknown_030042A0; + REG_BG0HOFS = gBattle_BG0_X; + REG_BG0VOFS = gBattle_BG0_Y; REG_BG1HOFS = gBattle_BG1_X; REG_BG1VOFS = gBattle_BG1_Y; REG_BG2HOFS = gBattle_BG2_X; REG_BG2VOFS = gBattle_BG2_Y; - REG_BG3HOFS = gUnknown_030041B0; - REG_BG3VOFS = gUnknown_030041B8; + REG_BG3HOFS = gBattle_BG3_X; + REG_BG3VOFS = gBattle_BG3_Y; REG_WIN0H = gBattle_WIN0H; REG_WIN0V = gBattle_WIN0V; REG_WIN1H = gBattle_WIN1H; @@ -1016,7 +1154,7 @@ void sub_800FCFC(void) LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); - sub_8089668(); + ScanlineEffect_InitHBlankDmaTransfer(); } void nullsub_36(struct Sprite *sprite) @@ -1140,33 +1278,33 @@ void c2_8011A1C(void) REG_WINOUT = 0; gBattle_WIN0H = 0xF0; gBattle_WIN0V = 0x5051; - dp12_8087EA4(); + ScanlineEffect_Clear(); for (i = 0; i < 80; i++) { - gUnknown_03004DE0[0][i] = 0xF0; - gUnknown_03004DE0[1][i] = 0xF0; + gScanlineEffectRegBuffers[0][i] = 0xF0; + gScanlineEffectRegBuffers[1][i] = 0xF0; } for (i = 80; i < 160; i++) { asm(""::"r"(i)); // Needed to stop the compiler from optimizing out the loop counter - gUnknown_03004DE0[0][i] = 0xFF10; - gUnknown_03004DE0[1][i] = 0xFF10; + gScanlineEffectRegBuffers[0][i] = 0xFF10; + gScanlineEffectRegBuffers[1][i] = 0xFF10; } - SetUpWindowConfig(&gWindowConfig_81E6C58); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C58); ResetPaletteFade(); - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; gBattle_BG1_X = 0; gBattle_BG1_Y = 0; gBattle_BG2_X = 0; gBattle_BG2_Y = 0; - gUnknown_030041B0 = 0; - gUnknown_030041B8 = 0; + gBattle_BG3_X = 0; + gBattle_BG3_Y = 0; - InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6C58); - InitWindowFromConfig(&gUnknown_030041D0, &gWindowConfig_81E71D0); - InitWindowFromConfig(&gUnknown_03004250, &gWindowConfig_81E71EC); + Text_InitWindowWithTemplate(&gUnknown_03004210, &gWindowTemplate_81E6C58); + Text_InitWindowWithTemplate(&gUnknown_030041D0, &gWindowTemplate_81E71D0); + Text_InitWindowWithTemplate(&gUnknown_03004250, &gWindowTemplate_81E71EC); sub_800D6D4(); LoadCompressedPalette(gUnknown_08D004E0, 0, 64); sub_800D74C(); @@ -1218,6 +1356,3104 @@ void c2_081284E0(void) } } +// A LOT of debug code! +#if DEBUG + +extern u8 gUnknown_Debug_2023B62[]; +extern const u8 Str_821F7BD[]; +extern const u8 Str_821F7DA[]; + +void debug_sub_8010818(void); +void debug_sub_80108B8(void); +void debug_sub_8010CAC(void); +void debug_sub_8011498(void); +void debug_sub_801174C(void); +void debug_sub_8011D40(void); +void debug_sub_8011E5C(void); +void debug_sub_8011E74(void); +void debug_sub_8011EA0(u8); +void debug_sub_8012294(void); +void debug_sub_80123D8(u8); +void debug_sub_8012540(void); +void debug_nullsub_3(void); +void debug_sub_80125A0(void); +void debug_sub_80125E4(void); +void debug_sub_8012628(void); +void debug_sub_8012688(void); +void debug_sub_8012878(void); +void debug_sub_8012D10(u8); +u32 debug_sub_8013294(u8, void *, u32); +void debug_sub_80132C8(u8, void *, u32); + +extern s16 gUnknown_Debug_2023A76[][0x23]; +extern s16 gUnknown_Debug_2023A76_[][7][5]; +extern s16 gUnknown_Debug_2023B02[][6][4]; +extern u8 gUnknown_Debug_03004360; +extern struct Window gUnknown_Debug_03004370; +extern u8 gUnknown_Debug_030043A0; +extern u8 gUnknown_Debug_030043A4; +extern u8 gUnknown_Debug_030043A8; +extern u8 gBattleBuffersTransferData[]; + +extern const u16 gUnknown_Debug_821F424[][5]; +extern const u16 gUnknown_Debug_821F56C[][5]; +extern const u32 gUnknown_Debug_821F798[][4]; + +extern const u8 gUnusedOldCharmap_Gfx_lz[]; +extern const u8 gUnusedOldCharmap_Tilemap_lz[]; +extern const u8 gUnusedOldCharmap_Pal_lz[]; + +void debug_sub_8010800(void) +{ + debug_sub_8010818(); + debug_sub_80108B8(); + *(u32 *)(gBattleBuffersTransferData + 0x100) = 0; +} + +void debug_sub_8010818(void) +{ + s32 i; + + gUnknown_Debug_2023A76[0][0] = 0x115; + gUnknown_Debug_2023A76[1][0] = 0x115; + for (i = 1; i < 31; i++) + { + gUnknown_Debug_2023A76[0][i] = gUnknown_Debug_821F424[i][4]; + gUnknown_Debug_2023A76[1][i] = gUnknown_Debug_821F424[i][4]; + } + + for (i = 0; i < 6; i++) + { + for (gUnknown_Debug_030043A8 = 0; gUnknown_Debug_030043A8 < 4; gUnknown_Debug_030043A8++) + { + gUnknown_Debug_2023B02[0][i][gUnknown_Debug_030043A8] = gUnknown_Debug_821F56C[gUnknown_Debug_030043A8][0]; + gUnknown_Debug_2023B02[1][i][gUnknown_Debug_030043A8] = gUnknown_Debug_821F56C[gUnknown_Debug_030043A8][0]; + } + } +} + +void debug_sub_80108B8(void) +{ + s32 i; + + m4aSoundVSyncOff(); + SetHBlankCallback(NULL); + SetVBlankCallback(NULL); + DmaFill32(3, 0, (void *)VRAM, VRAM_SIZE); + REG_IE = 1; + REG_DISPCNT = 0x1340; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + gBattle_BG2_X = 0; + gBattle_BG2_Y = 0; + gBattle_BG3_X = 0; + gBattle_BG3_Y = 0; + REG_BG0CNT = 0x1F09; + REG_BG1CNT = 0x4801; + REG_BLDCNT = 0; + REG_BLDY = 0; + LZDecompressVram(gUnusedOldCharmap_Gfx_lz, (void *)VRAM); + LZDecompressWram(gUnusedOldCharmap_Tilemap_lz, gSharedMem); + LZDecompressVram(gUnusedOldCharmap_Pal_lz, (void *)PLTT); + LZDecompressVram(gUnusedOldCharmap_Pal_lz, (void *)(PLTT + 0x1E0)); + m4aSoundVSyncOn(); + SetVBlankCallback(debug_sub_8011D40); + SetMainCallback2(debug_sub_8010CAC); + ResetTasks(); + ResetSpriteData(); + ScanlineEffect_Stop(); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + Text_InitWindowWithTemplate(&gUnknown_Debug_03004370, &gWindowTemplate_81E6C3C); + gUnknown_Debug_03004360 = 0; + gUnknown_Debug_030043A0 = 0; + gUnknown_Debug_030043A4 = 0; + for (i = 0; i < 31; i++) + debug_sub_8011EA0(i); + for (gUnknown_Debug_030043A8 = 0; gUnknown_Debug_030043A8 < 4; gUnknown_Debug_030043A8++) + debug_sub_8012294(); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + debug_sub_8012540(); + debug_nullsub_3(); + gUnknown_Debug_030043A8 = 0; + debug_sub_80125A0(); + if (gUnknown_Debug_2023A76[0][0x22] == 8) + { + debug_sub_801174C(); + } + else + { + for (i = 0; i < 8; i++) + gSharedMem[0x160B4 + i] = 0; + } +} + +void debug_sub_8010A7C(u8 a, u8 b) +{ + s32 i; + + for (i = 0; i < b; i++) + gBattleTextBuff1[i] = a; + gBattleTextBuff1[i] = EOS; +} + +// gUnknown_Debug_2023A76_ seems like a 3D array, but this function refuses to match when I do that. +#ifdef NONMATCHING +void debug_sub_8010AAC(u8 a) +{ + switch (gBaseStats[gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][0]].genderRatio) + { + case 0: + gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][4] = 2; + break; + case 0xFE: + gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][4] = 3; + break; + case 0xFF: + gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][4] = 4; + break; + default: + gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][4] &= 1; + if (a != 0) + gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][4] ^= 1; + else + gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][4] = 0; + break; + } +} +#else +void debug_sub_8010AAC(u8 a) +{ + switch (gBaseStats[gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5]].genderRatio) + { + case 0: + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + 4] = 2; + break; + case 0xFE: + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + 4] = 3; + break; + case 0xFF: + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + 4] = 4; + break; + default: + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + 4] &= 1; + if (a != 0) + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + 4] ^= 1; + else + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + 4] = 0; + break; + } +} +#endif + +void debug_sub_8010B80(u8 a) +{ + s8 r12 = 0; + s8 r7 = gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][gUnknown_Debug_030043A0]; + + while (r7 >= 10) + { + r7 -= 10; + r12++; + } + + if (a & 2) + { + if (a & 1) + r12++; + else + r12--; + if (r12 < 0) + r12 = 9; + if (r12 > 9) + r12 = 0; + } + else + { + if (a & 1) + r7++; + else + r7--; + if (r7 < 1) + r7 = 9; + if (r7 > 9) + r7 = 1; + } + gUnknown_Debug_2023A76_[gUnknown_Debug_03004360 ^ 1][gUnknown_Debug_030043A4][gUnknown_Debug_030043A0] + = gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][gUnknown_Debug_030043A0] + = r12 * 10 + r7; +} + +void debug_sub_8010CAC(void) +{ + s32 r5; + + if (gMain.heldKeysRaw == 0x204) + DoSoftReset(); + if (gMain.newKeysRaw == 4) + { + if (gUnknown_Debug_030043A4 < 6) + { + gUnknown_Debug_030043A8 = 0; + debug_sub_8012628(); + SetMainCallback2(debug_sub_8011498); + } + //_546 + if (gUnknown_Debug_030043A0 == 0 && gUnknown_Debug_030043A4 == 6) + { + gMain.savedCallback = debug_sub_80108B8; + CreateMon( + &gPlayerParty[0], + gUnknown_Debug_2023A76_[0][0][0], + gUnknown_Debug_2023A76_[0][0][1], + 32, + 0, 0, 0, 0); + for (r5 = 0; r5 < 4; r5++) + { + SetMonData(&gPlayerParty[0], MON_DATA_MOVE1 + r5, &gUnknown_Debug_2023B02[0][0][r5]); + SetMonData(&gPlayerParty[0], MON_DATA_PP1 + r5, &gBattleMoves[gUnknown_Debug_2023B02[0][0][r5]].pp); + } + switch (gUnknown_Debug_2023A76_[0][6][0]) + { + case 1: //_550 + gCB2_AfterEvolution = debug_sub_80108B8; + EvolutionScene(&gPlayerParty[0], gUnknown_Debug_2023A76_[0][1][0], 1, 0); + break; + case 2: //_551 + debug_sub_8012688(); + break; + } + } + //_555 + if (gUnknown_Debug_030043A0 == 1 && gUnknown_Debug_030043A4 == 6) + { + // This is really weird + r5 = (gSaveBlock2.optionsBattleSceneOff | (gSaveBlock2.optionsSound << 1)); + r5++; + if (r5 == 4) + r5 = 0; + gSaveBlock2.optionsBattleSceneOff = (r5 & 1); + gSaveBlock2.optionsSound = (r5 & 2) >> 1; + SetPokemonCryStereo(gSaveBlock2.optionsSound); + debug_nullsub_3(); + } + } + //_559 + if (gMain.newKeysRaw == 8) + debug_sub_801174C(); + if (gMain.newKeysRaw == 0x40) + { + debug_sub_80125E4(); + if (gUnknown_Debug_030043A4 != 0) + gUnknown_Debug_030043A4--; + else + gUnknown_Debug_030043A4 = 6; + debug_sub_8011E74(); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + debug_sub_80125A0(); + } + //_562 + if (gMain.newKeysRaw == 0x80) + { + debug_sub_80125E4(); + if (gUnknown_Debug_030043A4 == 6) + gUnknown_Debug_030043A4 = 0; + else + gUnknown_Debug_030043A4++; + debug_sub_8011E74(); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + debug_sub_80125A0(); + } + //_567 + if (gMain.newKeysRaw == 0x20) + { + debug_sub_80125E4(); + if (gUnknown_Debug_030043A0 != 0) + { + gUnknown_Debug_030043A0--; + } + else + { + if (gUnknown_Debug_03004360 != 0) + { + gUnknown_Debug_03004360 = 0; + gUnknown_Debug_030043A0 = 4; + gBattle_BG1_X = 0; + debug_sub_8011E5C(); + debug_sub_8011E74(); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + } + } + //_577 + debug_sub_80125A0(); + } + //_572 + if (gMain.newKeysRaw == 0x10) + { + debug_sub_80125E4(); + if (gUnknown_Debug_030043A0 != 4) + { + gUnknown_Debug_030043A0++; + } + else + { + if (gUnknown_Debug_03004360 == 0) + { + gUnknown_Debug_03004360 = 1; + gUnknown_Debug_030043A0 = 0; + gBattle_BG1_X = 0x100; + debug_sub_8011E5C(); + debug_sub_8011E74(); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + } + } + debug_sub_80125A0(); + } + //_578 + if (gMain.newAndRepeatedKeys & B_BUTTON) + { + switch (gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5) + { + case 31: + debug_sub_8010818(); + debug_sub_8011E5C(); + debug_sub_8011E74(); + debug_sub_8012540(); + debug_nullsub_3(); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + break; + case 32: + debug_sub_80132C8(31, gUnknown_Debug_2023A76, 0xEC); + debug_sub_8011E5C(); + debug_sub_8011E74(); + debug_sub_8012540(); + debug_nullsub_3(); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + break; + case 33: + debug_sub_8013294(31, gUnknown_Debug_2023A76, 0xEC); + break; + case 34: + if (gUnknown_Debug_2023A76_[0][6][4] != 0) + { + gUnknown_Debug_2023A76_[0][6][4]--; + gUnknown_Debug_2023A76_[1][6][4]--; + } + else + { + gUnknown_Debug_2023A76_[0][6][4] = 8; + gUnknown_Debug_2023A76_[1][6][4] = 8; + } + debug_sub_8012540(); + break; + case 30: + debug_sub_8010B80(0); + debug_sub_8011EA0(gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5); + break; + default: + if (gUnknown_Debug_030043A0 == 4 && gUnknown_Debug_030043A4 < 6) + { + debug_sub_8010AAC(1); + } + else + { + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5]--; + if (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] < gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][4]) + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] = gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3]; + } + //_613 + if (gUnknown_Debug_030043A0 == 0) + { + debug_sub_8010AAC(0); + debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + 4); + } + debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + break; + } + } + //_607 + if (gMain.newAndRepeatedKeys & A_BUTTON) + { + switch (gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5) + { + case 31: + debug_sub_8010818(); + debug_sub_8011E5C(); + debug_sub_8011E74(); + debug_sub_8012540(); + debug_nullsub_3(); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + break; + case 32: + debug_sub_80132C8(31, gUnknown_Debug_2023A76, 0xEC); + debug_sub_8011E5C(); + debug_sub_8011E74(); + debug_sub_8012540(); + debug_nullsub_3(); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + break; + case 33: + debug_sub_8013294(31, gUnknown_Debug_2023A76, 0xEC); + break; + case 34: + if (gUnknown_Debug_2023A76_[0][6][4] < 8) + { + gUnknown_Debug_2023A76_[0][6][4]++; + gUnknown_Debug_2023A76_[1][6][4]++; + } + else + { + gUnknown_Debug_2023A76_[0][6][4] = 0; + gUnknown_Debug_2023A76_[1][6][4] = 0; + } + debug_sub_8012540(); + break; + case 30: + debug_sub_8010B80(1); + debug_sub_8011EA0(gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5); + break; + default: + if (gUnknown_Debug_030043A0 == 4 && gUnknown_Debug_030043A4 < 6) + { + debug_sub_8010AAC(1); + } + else + { + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5]++; + if (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] > gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3]) + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] = gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][4]; + } + //_644 + if (gUnknown_Debug_030043A0 == 0) + { + debug_sub_8010AAC(0); + debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + 4); + } + //_645 + debug_sub_8011EA0(gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + break; + } + } + //_638 + if (gMain.newAndRepeatedKeys & 0x200) + { + if (gUnknown_Debug_030043A0 == 4 && gUnknown_Debug_030043A4 < 6) + { + debug_sub_8010AAC(1); + } + //_648 + else + { + if (gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0 == 30) + { + debug_sub_8010B80(2); + } + //_652 + else + { + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] -= 10; + while (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] < gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][4]) + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] += gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3]; + } + } + //_653 + if (gUnknown_Debug_030043A0 == 0) + { + debug_sub_8010AAC(0); + debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + 4); + } + //_658 + debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + } + //_646 + if (gMain.newAndRepeatedKeys & 0x100) + { + if (gUnknown_Debug_030043A0 == 4 && gUnknown_Debug_030043A4 < 6) + { + debug_sub_8010AAC(1); + } + //_661 + else + { + if (gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0 == 30) + { + debug_sub_8010B80(3); + } + //_665 + else + { + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] += 10; + while (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] > gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3]) + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] -= gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3]; + } + } + //_666 + if (gUnknown_Debug_030043A0 == 0) + { + debug_sub_8010AAC(0); + debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + 4); + } + //_671 + debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + } + //_659 + AnimateSprites(); + BuildOamBuffer(); +} + +__attribute__((naked)) +void debug_sub_8011498() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " ldr r2, ._687 @ gUnknown_Debug_030043A0\n" + " ldr r0, ._687 + 4 @ gUnknown_Debug_030043A4\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " ldrb r2, [r2]\n" + " add r0, r0, r2\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r9, r0\n" + " ldr r4, ._687 + 8 @ gMain\n" + " ldrh r1, [r4, #0x28]\n" + " mov r0, #0x81\n" + " lsl r0, r0, #0x2\n" + " cmp r1, r0\n" + " bne ._674 @cond_branch\n" + " bl DoSoftReset\n" + "._674:\n" + " ldrh r0, [r4, #0x2a]\n" + " cmp r0, #0x4\n" + " bne ._675 @cond_branch\n" + " bl debug_sub_8012658\n" + " ldr r0, ._687 + 12 @ debug_sub_8010CAC\n" + " bl SetMainCallback2\n" + "._675:\n" + " ldrh r0, [r4, #0x2a]\n" + " cmp r0, #0x8\n" + " bne ._676 @cond_branch\n" + " bl debug_sub_801174C\n" + "._676:\n" + " ldrh r0, [r4, #0x2a]\n" + " cmp r0, #0x40\n" + " beq ._677 @cond_branch\n" + " cmp r0, #0x80\n" + " bne ._678 @cond_branch\n" + "._677:\n" + " bl debug_sub_8012658\n" + " ldr r0, ._687 + 16 @ gUnknown_Debug_030043A8\n" + " ldrb r1, [r0]\n" + " mov r2, #0x2\n" + " eor r1, r1, r2\n" + " strb r1, [r0]\n" + " bl debug_sub_8012628\n" + "._678:\n" + " ldr r0, ._687 + 8 @ gMain\n" + " ldrh r0, [r0, #0x2a]\n" + " cmp r0, #0x20\n" + " beq ._679 @cond_branch\n" + " cmp r0, #0x10\n" + " bne ._680 @cond_branch\n" + "._679:\n" + " bl debug_sub_8012658\n" + " ldr r0, ._687 + 16 @ gUnknown_Debug_030043A8\n" + " ldrb r1, [r0]\n" + " mov r2, #0x1\n" + " eor r1, r1, r2\n" + " strb r1, [r0]\n" + " bl debug_sub_8012628\n" + "._680:\n" + " ldr r0, ._687 + 8 @ gMain\n" + " ldrh r1, [r0, #0x30]\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._681 @cond_branch\n" + " ldr r0, ._687 + 20 @ gUnknown_Debug_2023B02\n" + " mov r8, r0\n" + " ldr r6, ._687 + 16 @ gUnknown_Debug_030043A8\n" + " ldrb r4, [r6]\n" + " lsl r4, r4, #0x1\n" + " mov r0, r9\n" + " mov r1, #0x5\n" + " bl __udivsi3\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x15\n" + " add r4, r4, r0\n" + " ldr r5, ._687 + 24 @ gUnknown_Debug_03004360\n" + " ldrb r2, [r5]\n" + " lsl r1, r2, #0x1\n" + " add r1, r1, r2\n" + " lsl r1, r1, #0x4\n" + " add r4, r4, r1\n" + " add r4, r4, r8\n" + " ldrh r1, [r4]\n" + " sub r1, r1, #0x1\n" + " strh r1, [r4]\n" + " ldrb r3, [r6]\n" + " lsl r1, r3, #0x1\n" + " add r1, r1, r0\n" + " ldrb r2, [r5]\n" + " lsl r0, r2, #0x1\n" + " add r0, r0, r2\n" + " lsl r0, r0, #0x4\n" + " add r1, r1, r0\n" + " mov r0, r8\n" + " add r4, r1, r0\n" + " mov r0, #0x0\n" + " ldsh r1, [r4, r0]\n" + " ldr r5, ._687 + 28 @ gUnknown_Debug_821F564\n" + " lsl r0, r3, #0x2\n" + " add r0, r0, r3\n" + " lsl r2, r0, #0x1\n" + " add r0, r5, #0\n" + " add r0, r0, #0x8\n" + " add r0, r2, r0\n" + " ldrh r0, [r0]\n" + " cmp r1, r0\n" + " bge ._682 @cond_branch\n" + " add r0, r5, #6\n" + " add r0, r2, r0\n" + " ldrh r0, [r0]\n" + " strh r0, [r4]\n" + "._682:\n" + " bl debug_sub_8012294\n" + "._681:\n" + " ldr r0, ._687 + 8 @ gMain\n" + " ldrh r1, [r0, #0x30]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._683 @cond_branch\n" + " ldr r1, ._687 + 20 @ gUnknown_Debug_2023B02\n" + " mov r8, r1\n" + " ldr r6, ._687 + 16 @ gUnknown_Debug_030043A8\n" + " ldrb r4, [r6]\n" + " lsl r4, r4, #0x1\n" + " mov r0, r9\n" + " mov r1, #0x5\n" + " bl __udivsi3\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x15\n" + " add r4, r4, r0\n" + " ldr r5, ._687 + 24 @ gUnknown_Debug_03004360\n" + " ldrb r2, [r5]\n" + " lsl r1, r2, #0x1\n" + " add r1, r1, r2\n" + " lsl r1, r1, #0x4\n" + " add r4, r4, r1\n" + " add r4, r4, r8\n" + " ldrh r1, [r4]\n" + " add r1, r1, #0x1\n" + " strh r1, [r4]\n" + " ldrb r3, [r6]\n" + " lsl r1, r3, #0x1\n" + " add r1, r1, r0\n" + " ldrb r2, [r5]\n" + " lsl r0, r2, #0x1\n" + " add r0, r0, r2\n" + " lsl r0, r0, #0x4\n" + " add r1, r1, r0\n" + " mov r0, r8\n" + " add r4, r1, r0\n" + " mov r0, #0x0\n" + " ldsh r1, [r4, r0]\n" + " ldr r5, ._687 + 28 @ gUnknown_Debug_821F564\n" + " lsl r0, r3, #0x2\n" + " add r0, r0, r3\n" + " lsl r2, r0, #0x1\n" + " add r0, r5, #6\n" + " add r0, r2, r0\n" + " ldrh r0, [r0]\n" + " cmp r1, r0\n" + " ble ._684 @cond_branch\n" + " add r0, r5, #0\n" + " add r0, r0, #0x8\n" + " add r0, r2, r0\n" + " ldrh r0, [r0]\n" + " strh r0, [r4]\n" + "._684:\n" + " bl debug_sub_8012294\n" + "._683:\n" + " ldr r0, ._687 + 8 @ gMain\n" + " ldrh r1, [r0, #0x30]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._685 @cond_branch\n" + " ldr r6, ._687 + 20 @ gUnknown_Debug_2023B02\n" + " ldr r5, ._687 + 16 @ gUnknown_Debug_030043A8\n" + " ldrb r4, [r5]\n" + " lsl r4, r4, #0x1\n" + " mov r0, r9\n" + " mov r1, #0x5\n" + " bl __udivsi3\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x15\n" + " add r4, r4, r0\n" + " ldr r2, ._687 + 24 @ gUnknown_Debug_03004360\n" + " ldrb r1, [r2]\n" + " lsl r0, r1, #0x1\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x4\n" + " add r4, r4, r0\n" + " add r4, r4, r6\n" + " ldrh r0, [r4]\n" + " sub r0, r0, #0xa\n" + " strh r0, [r4]\n" + " mov sl, r5\n" + " mov r8, r6\n" + " add r7, r2, #0\n" + " ldr r6, ._687 + 28 @ gUnknown_Debug_821F564\n" + " b ._686\n" + "._688:\n" + " .align 2, 0\n" + "._687:\n" + " .word gUnknown_Debug_030043A0\n" + " .word gUnknown_Debug_030043A4\n" + " .word gMain\n" + " .word debug_sub_8010CAC+1\n" + " .word gUnknown_Debug_030043A8\n" + " .word gUnknown_Debug_2023B02\n" + " .word gUnknown_Debug_03004360\n" + " .word gUnknown_Debug_821F564\n" + "._689:\n" + " add r0, r6, #6\n" + " add r0, r2, r0\n" + " ldrh r0, [r0]\n" + " ldrh r1, [r4]\n" + " add r0, r0, r1\n" + " strh r0, [r4]\n" + "._686:\n" + " mov r0, sl\n" + " ldrb r5, [r0]\n" + " lsl r4, r5, #0x1\n" + " mov r0, r9\n" + " mov r1, #0x5\n" + " bl __udivsi3\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x15\n" + " add r4, r4, r0\n" + " ldrb r1, [r7]\n" + " lsl r0, r1, #0x1\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x4\n" + " add r4, r4, r0\n" + " add r4, r4, r8\n" + " mov r0, #0x0\n" + " ldsh r1, [r4, r0]\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r2, r0, #0x1\n" + " add r0, r6, #0\n" + " add r0, r0, #0x8\n" + " add r0, r2, r0\n" + " ldrh r0, [r0]\n" + " cmp r1, r0\n" + " blt ._689 @cond_branch\n" + " bl debug_sub_8012294\n" + "._685:\n" + " ldr r0, ._692 @ gMain\n" + " ldrh r1, [r0, #0x30]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._690 @cond_branch\n" + " ldr r6, ._692 + 4 @ gUnknown_Debug_2023B02\n" + " ldr r5, ._692 + 8 @ gUnknown_Debug_030043A8\n" + " ldrb r4, [r5]\n" + " lsl r4, r4, #0x1\n" + " mov r0, r9\n" + " mov r1, #0x5\n" + " bl __udivsi3\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x15\n" + " add r4, r4, r0\n" + " ldr r2, ._692 + 12 @ gUnknown_Debug_03004360\n" + " ldrb r1, [r2]\n" + " lsl r0, r1, #0x1\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x4\n" + " add r4, r4, r0\n" + " add r4, r4, r6\n" + " ldrh r0, [r4]\n" + " add r0, r0, #0xa\n" + " strh r0, [r4]\n" + " mov sl, r5\n" + " mov r8, r6\n" + " add r7, r2, #0\n" + " ldr r6, ._692 + 16 @ gUnknown_Debug_821F564\n" + " b ._691\n" + "._693:\n" + " .align 2, 0\n" + "._692:\n" + " .word gMain\n" + " .word gUnknown_Debug_2023B02\n" + " .word gUnknown_Debug_030043A8\n" + " .word gUnknown_Debug_03004360\n" + " .word gUnknown_Debug_821F564\n" + "._694:\n" + " ldrh r0, [r4]\n" + " sub r0, r0, r1\n" + " strh r0, [r4]\n" + "._691:\n" + " mov r1, sl\n" + " ldrb r5, [r1]\n" + " lsl r4, r5, #0x1\n" + " mov r0, r9\n" + " mov r1, #0x5\n" + " bl __udivsi3\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x15\n" + " add r4, r4, r0\n" + " ldrb r1, [r7]\n" + " lsl r0, r1, #0x1\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x4\n" + " add r4, r4, r0\n" + " add r4, r4, r8\n" + " mov r0, #0x0\n" + " ldsh r2, [r4, r0]\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x1\n" + " add r1, r6, #6\n" + " add r0, r0, r1\n" + " ldrh r1, [r0]\n" + " cmp r2, r1\n" + " bgt ._694 @cond_branch\n" + " bl debug_sub_8012294\n" + "._690:\n" + " bl AnimateSprites\n" + " bl BuildOamBuffer\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_801174C() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " add sp, sp, #0xffffffe8\n" + " mov r0, #0x0\n" + " mov r9, r0\n" + " ldr r1, ._704 @ gUnknown_020297ED\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " bl Random\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x10\n" + " lsr r4, r4, #0x10\n" + " mov r0, #0x3\n" + " and r4, r4, r0\n" + " lsl r4, r4, #0x18\n" + " lsr r6, r4, #0x18\n" + " ldr r5, ._704 + 4 @ gSaveBlock2\n" + " lsl r1, r6, #0x1\n" + " add r1, r1, r6\n" + " lsl r1, r1, #0x1\n" + " ldr r0, ._704 + 8 @ str_821F631\n" + " add r1, r1, r0\n" + " add r0, r5, #0\n" + " bl StringCopy\n" + " lsr r4, r4, #0x19\n" + " strb r4, [r5, #0x8]\n" + " bl ZeroPlayerPartyMons\n" + " bl ZeroEnemyPartyMons\n" + " ldr r0, ._704 + 12 @ gUnknown_Debug_2023A76\n" + " mov r1, #0x3c\n" + " ldsh r7, [r0, r1]\n" + " mov r2, r9\n" + " str r2, [sp, #0xc]\n" + " cmp r7, #0x9\n" + " ble ._695 @cond_branch\n" + " mov r0, #0x0\n" + "._696:\n" + " sub r7, r7, #0xa\n" + " add r0, r0, #0x1\n" + " cmp r7, #0x9\n" + " bgt ._696 @cond_branch\n" + " str r0, [sp, #0xc]\n" + "._695:\n" + " ldr r2, ._704 + 16 @ gBattleTypeFlags\n" + " ldr r1, ._704 + 20 @ gUnknown_Debug_821F598\n" + " sub r0, r7, #1\n" + " lsl r0, r0, #0x1\n" + " add r0, r0, r1\n" + " ldrh r3, [r0]\n" + " strh r3, [r2]\n" + " ldr r1, ._704 + 24 @ gUnknown_02023A14_50\n" + " mov r0, #0x8\n" + " strb r0, [r1]\n" + " ldr r1, ._704 + 28 @ gBattleTerrain\n" + " add r0, sp, #0xc\n" + " ldrb r0, [r0]\n" + " strb r0, [r1]\n" + " mov r0, #0x80\n" + " and r0, r0, r3\n" + " cmp r0, #0\n" + " beq ._697 @cond_branch\n" + " bl EnterSafariMode\n" + "._697:\n" + " ldr r5, ._704 + 12 @ gUnknown_Debug_2023A76\n" + " ldrh r0, [r5, #0x3c]\n" + " sub r0, r0, #0x2\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " cmp r0, #0x2\n" + " bhi ._698 @cond_branch\n" + " ldr r4, ._704 + 32 @ gTrainerBattleOpponent\n" + " bl Random\n" + " mov r1, #0x7\n" + " and r1, r1, r0\n" + " add r1, r1, #0x1\n" + " strh r1, [r4]\n" + "._698:\n" + " ldr r1, ._704 + 36 @ gPlayerPartyCount\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + " mov r7, #0x0\n" + "._745:\n" + " lsl r0, r7, #0x1\n" + " ldr r3, ._704 + 12 @ gUnknown_Debug_2023A76\n" + " add r1, r0, r3\n" + " mov r2, #0x0\n" + " ldsh r1, [r1, r2]\n" + " add r2, r3, #0\n" + " mov r8, r0\n" + " add r3, r7, #5\n" + " mov sl, r3\n" + " cmp r1, #0\n" + " beq ._699 @cond_branch\n" + " add r0, r7, #4\n" + " lsl r0, r0, #0x1\n" + " add r1, r2, #0\n" + " add r0, r0, r1\n" + " mov r3, #0x0\n" + " ldsh r0, [r0, r3]\n" + " cmp r0, #0x1\n" + " beq ._707 @cond_branch\n" + " cmp r0, #0x1\n" + " bgt ._701 @cond_branch\n" + " cmp r0, #0\n" + " beq ._706 @cond_branch\n" + " b ._708\n" + "._705:\n" + " .align 2, 0\n" + "._704:\n" + " .word gUnknown_020297ED\n" + " .word gSaveBlock2\n" + " .word str_821F631\n" + " .word gUnknown_Debug_2023A76\n" + " .word gBattleTypeFlags\n" + " .word gUnknown_Debug_821F598\n" + " .word gUnknown_02023A14_50\n" + " .word gBattleTerrain\n" + " .word gTrainerBattleOpponent\n" + " .word gPlayerPartyCount\n" + "._701:\n" + " cmp r0, #0x2\n" + " beq ._706 @cond_branch\n" + " cmp r0, #0x3\n" + " beq ._707 @cond_branch\n" + " b ._708\n" + "._706:\n" + " mov r6, #0x0\n" + " b ._710\n" + "._707:\n" + " mov r6, #0xfe\n" + " b ._710\n" + "._708:\n" + " mov r6, #0xff\n" + "._710:\n" + " mov r1, r8\n" + " add r0, r1, r2\n" + " mov r3, #0x0\n" + " ldsh r0, [r0, r3]\n" + " add r1, r7, #5\n" + " mov sl, r1\n" + " cmp r0, #0xc9\n" + " bne ._712 @cond_branch\n" + " cmp r1, #0x1d\n" + " bgt ._712 @cond_branch\n" + " add r0, r7, #7\n" + " lsl r0, r0, #0x1\n" + " add r0, r0, r2\n" + " ldrb r0, [r0]\n" + " mov r9, r0\n" + " b ._713\n" + "._712:\n" + " mov r2, #0x0\n" + " mov r9, r2\n" + "._713:\n" + " add r0, r7, #0\n" + " mov r1, #0x5\n" + " bl __divsi3\n" + " mov r3, #0x64\n" + " mul r0, r0, r3\n" + " ldr r1, ._719 @ gEnemyParty\n" + " add r0, r0, r1\n" + " ldr r1, ._719 + 4 @ gUnknown_Debug_2023A76\n" + " add r1, r1, r8\n" + " ldrh r1, [r1]\n" + " add r2, r7, #1\n" + " lsl r2, r2, #0x1\n" + " ldr r3, ._719 + 4 @ gUnknown_Debug_2023A76\n" + " add r2, r2, r3\n" + " ldrb r2, [r2]\n" + " str r6, [sp]\n" + " mov r3, #0x0\n" + " str r3, [sp, #0x4]\n" + " mov r3, r9\n" + " str r3, [sp, #0x8]\n" + " mov r3, #0x0\n" + " bl CreateMonWithGenderNatureLetter\n" + "._699:\n" + " add r0, r7, #0\n" + " mov r1, #0x5\n" + " bl __divsi3\n" + " mov r2, #0x64\n" + " add r1, r0, #0\n" + " mul r1, r1, r2\n" + " ldr r0, ._719 @ gEnemyParty\n" + " add r5, r1, r0\n" + " ldr r4, ._719 + 8 @ gUnknown_Debug_2023A7A\n" + " mov r3, r8\n" + " add r6, r3, r4\n" + " add r0, r5, #0\n" + " mov r1, #0xc\n" + " add r2, r6, #0\n" + " bl SetMonData\n" + " sub r4, r4, #0x4\n" + " add r1, r7, #2\n" + " lsl r0, r1, #0x1\n" + " add r0, r0, r4\n" + " ldrh r0, [r0]\n" + " sub r0, r0, #0x1\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " str r1, [sp, #0x10]\n" + " cmp r0, #0xb\n" + " bhi ._714 @cond_branch\n" + " add r0, r5, #0\n" + " mov r1, #0x26\n" + " add r2, r6, #0\n" + " bl SetMonData\n" + "._714:\n" + " add r1, r7, #3\n" + " lsl r0, r1, #0x1\n" + " add r0, r0, r4\n" + " mov r3, #0x0\n" + " ldsh r2, [r0, r3]\n" + " str r1, [sp, #0x14]\n" + " cmp r2, #0\n" + " beq ._716 @cond_branch\n" + " cmp r2, #0x3\n" + " beq ._716 @cond_branch\n" + " cmp r2, #0x2\n" + " bgt ._717 @cond_branch\n" + " mov r1, #0x0\n" + " ldsh r0, [r0, r1]\n" + " sub r0, r0, #0x1\n" + " b ._718\n" + "._720:\n" + " .align 2, 0\n" + "._719:\n" + " .word gEnemyParty\n" + " .word gUnknown_Debug_2023A76\n" + " .word gUnknown_Debug_2023A7A\n" + "._717:\n" + " mov r2, #0x0\n" + " ldsh r0, [r0, r2]\n" + " sub r0, r0, #0x4\n" + "._718:\n" + " str r0, [sp, #0xc]\n" + " add r0, r7, #0\n" + " mov r1, #0x5\n" + " bl __divsi3\n" + " mov r3, #0x64\n" + " mul r0, r0, r3\n" + " ldr r1, ._726 @ gEnemyParty\n" + " add r0, r0, r1\n" + " mov r1, #0x2e\n" + " add r2, sp, #0xc\n" + " bl SetMonData\n" + "._716:\n" + " ldr r1, ._726 + 4 @ gUnknown_Debug_2023A76\n" + " add r1, r1, #0x46\n" + " mov r2, r8\n" + " add r0, r2, r1\n" + " mov r3, #0x0\n" + " ldsh r0, [r0, r3]\n" + " ldr r2, ._726 + 4 @ gUnknown_Debug_2023A76\n" + " cmp r0, #0\n" + " beq ._721 @cond_branch\n" + " add r0, r7, #4\n" + " lsl r0, r0, #0x1\n" + " add r0, r0, r1\n" + " mov r1, #0x0\n" + " ldsh r0, [r0, r1]\n" + " cmp r0, #0x1\n" + " beq ._729 @cond_branch\n" + " cmp r0, #0x1\n" + " bgt ._723 @cond_branch\n" + " cmp r0, #0\n" + " beq ._728 @cond_branch\n" + " b ._730\n" + "._727:\n" + " .align 2, 0\n" + "._726:\n" + " .word gEnemyParty\n" + " .word gUnknown_Debug_2023A76\n" + "._723:\n" + " cmp r0, #0x2\n" + " beq ._728 @cond_branch\n" + " cmp r0, #0x3\n" + " beq ._729 @cond_branch\n" + " b ._730\n" + "._728:\n" + " mov r6, #0x0\n" + " b ._732\n" + "._729:\n" + " mov r6, #0xfe\n" + " b ._732\n" + "._730:\n" + " mov r6, #0xff\n" + "._732:\n" + " add r1, r2, #0\n" + " add r1, r1, #0x46\n" + " mov r2, r8\n" + " add r0, r2, r1\n" + " mov r3, #0x0\n" + " ldsh r0, [r0, r3]\n" + " cmp r0, #0xc9\n" + " bne ._734 @cond_branch\n" + " mov r0, sl\n" + " cmp r0, #0x1d\n" + " bgt ._734 @cond_branch\n" + " add r0, r7, #7\n" + " lsl r0, r0, #0x1\n" + " add r0, r0, r1\n" + " ldrb r0, [r0]\n" + " mov r9, r0\n" + " b ._735\n" + "._734:\n" + " mov r1, #0x0\n" + " mov r9, r1\n" + "._735:\n" + " add r0, r7, #0\n" + " mov r1, #0x5\n" + " bl __divsi3\n" + " mov r2, #0x64\n" + " mul r0, r0, r2\n" + " ldr r1, ._741 @ gPlayerParty\n" + " add r0, r0, r1\n" + " ldr r1, ._741 + 4 @ gUnknown_Debug_2023ABC\n" + " add r1, r1, r8\n" + " ldrh r1, [r1]\n" + " add r2, r7, #1\n" + " lsl r2, r2, #0x1\n" + " ldr r3, ._741 + 4 @ gUnknown_Debug_2023ABC\n" + " add r2, r2, r3\n" + " ldrb r2, [r2]\n" + " str r6, [sp]\n" + " mov r3, #0x0\n" + " str r3, [sp, #0x4]\n" + " mov r3, r9\n" + " str r3, [sp, #0x8]\n" + " mov r3, #0x0\n" + " bl CreateMonWithGenderNatureLetter\n" + " ldr r1, ._741 + 8 @ gPlayerPartyCount\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + "._721:\n" + " add r0, r7, #0\n" + " mov r1, #0x5\n" + " bl __divsi3\n" + " mov r2, #0x64\n" + " add r1, r0, #0\n" + " mul r1, r1, r2\n" + " ldr r0, ._741 @ gPlayerParty\n" + " add r4, r1, r0\n" + " ldr r0, ._741 + 12 @ gUnknown_Debug_2023AC0\n" + " mov r3, r8\n" + " add r5, r3, r0\n" + " add r0, r4, #0\n" + " mov r1, #0xc\n" + " add r2, r5, #0\n" + " bl SetMonData\n" + " ldr r1, [sp, #0x10]\n" + " lsl r0, r1, #0x1\n" + " ldr r2, ._741 + 16 @ gUnknown_Debug_2023A76\n" + " add r0, r0, r2\n" + " ldrh r0, [r0]\n" + " sub r0, r0, #0x1\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " cmp r0, #0xb\n" + " bhi ._736 @cond_branch\n" + " add r0, r4, #0\n" + " mov r1, #0x26\n" + " add r2, r5, #0\n" + " bl SetMonData\n" + "._736:\n" + " ldr r3, [sp, #0x14]\n" + " lsl r0, r3, #0x1\n" + " ldr r1, ._741 + 4 @ gUnknown_Debug_2023ABC\n" + " add r0, r0, r1\n" + " mov r2, #0x0\n" + " ldsh r1, [r0, r2]\n" + " cmp r1, #0\n" + " beq ._738 @cond_branch\n" + " cmp r1, #0x3\n" + " beq ._738 @cond_branch\n" + " cmp r1, #0x2\n" + " bgt ._739 @cond_branch\n" + " add r0, r1, #0\n" + " sub r0, r0, #0x1\n" + " b ._740\n" + "._742:\n" + " .align 2, 0\n" + "._741:\n" + " .word gPlayerParty\n" + " .word gUnknown_Debug_2023ABC\n" + " .word gPlayerPartyCount\n" + " .word gUnknown_Debug_2023AC0\n" + " .word gUnknown_Debug_2023A76\n" + "._739:\n" + " mov r1, #0x0\n" + " ldsh r0, [r0, r1]\n" + " sub r0, r0, #0x4\n" + "._740:\n" + " str r0, [sp, #0xc]\n" + " add r0, r7, #0\n" + " mov r1, #0x5\n" + " bl __divsi3\n" + " mov r2, #0x64\n" + " mul r0, r0, r2\n" + " ldr r1, ._750 @ gPlayerParty\n" + " add r0, r0, r1\n" + " mov r1, #0x2e\n" + " add r2, sp, #0xc\n" + " bl SetMonData\n" + "._738:\n" + " ldr r3, [sp, #0x14]\n" + " lsl r0, r3, #0x1\n" + " ldr r1, ._750 + 4 @ gUnknown_Debug_2023ABC\n" + " add r0, r0, r1\n" + " mov r2, #0x0\n" + " ldsh r0, [r0, r2]\n" + " cmp r0, #0x2\n" + " ble ._743 @cond_branch\n" + " add r0, r7, #0\n" + " mov r1, #0x5\n" + " bl __divsi3\n" + " mov r3, #0x64\n" + " mul r0, r0, r3\n" + " ldr r1, ._750 @ gPlayerParty\n" + " add r0, r0, r1\n" + " mov r1, #0x7\n" + " ldr r2, ._750 + 8 @ Str_821F649\n" + " bl SetMonData\n" + " ldr r2, ._750 + 12 @ gUnknown_02023A14_50\n" + " ldrb r0, [r2]\n" + " mov r1, #0x40\n" + " orr r0, r0, r1\n" + " strb r0, [r2]\n" + "._743:\n" + " mov r7, sl\n" + " cmp r7, #0x1d\n" + " bgt ._744 @cond_branch\n" + " b ._745\n" + "._744:\n" + " mov r0, #0x0\n" + " str r0, [sp, #0xc]\n" + " mov r0, #0x64\n" + " mov r8, r0\n" + " ldr r1, ._750 + 16 @ gUnknown_Debug_2023B02\n" + " mov r9, r1\n" + " ldr r2, ._750 @ gPlayerParty\n" + " mov sl, r2\n" + "._747:\n" + " mov r7, #0x0\n" + "._746:\n" + " ldr r2, [sp, #0xc]\n" + " mov r0, r8\n" + " mul r0, r0, r2\n" + " ldr r3, ._750 + 20 @ gEnemyParty\n" + " add r0, r0, r3\n" + " add r5, r7, #0\n" + " add r5, r5, #0xd\n" + " lsl r2, r2, #0x3\n" + " lsl r4, r7, #0x1\n" + " mov r3, r9\n" + " add r1, r4, r3\n" + " add r2, r2, r1\n" + " add r1, r5, #0\n" + " bl SetMonData\n" + " ldr r1, [sp, #0xc]\n" + " mov r0, r8\n" + " mul r0, r0, r1\n" + " ldr r2, ._750 + 20 @ gEnemyParty\n" + " add r0, r0, r2\n" + " add r6, r7, #0\n" + " add r6, r6, #0x11\n" + " lsl r1, r1, #0x3\n" + " add r1, r4, r1\n" + " add r1, r1, r9\n" + " mov r3, #0x0\n" + " ldsh r1, [r1, r3]\n" + " lsl r2, r1, #0x1\n" + " add r2, r2, r1\n" + " lsl r2, r2, #0x2\n" + " ldr r1, ._750 + 24 @ gBattleMoves\n" + " add r2, r2, r1\n" + " add r1, r6, #0\n" + " bl SetMonData\n" + " ldr r2, [sp, #0xc]\n" + " mov r0, r8\n" + " mul r0, r0, r2\n" + " add r0, r0, sl\n" + " lsl r2, r2, #0x3\n" + " ldr r3, ._750 + 28 @ gUnknown_Debug_2023B32\n" + " add r1, r4, r3\n" + " add r2, r2, r1\n" + " add r1, r5, #0\n" + " bl SetMonData\n" + " ldr r1, [sp, #0xc]\n" + " mov r0, r8\n" + " mul r0, r0, r1\n" + " add r0, r0, sl\n" + " lsl r1, r1, #0x3\n" + " add r4, r4, r1\n" + " ldr r1, ._750 + 28 @ gUnknown_Debug_2023B32\n" + " add r4, r4, r1\n" + " mov r2, #0x0\n" + " ldsh r1, [r4, r2]\n" + " lsl r2, r1, #0x1\n" + " add r2, r2, r1\n" + " lsl r2, r2, #0x2\n" + " ldr r3, ._750 + 24 @ gBattleMoves\n" + " add r2, r2, r3\n" + " add r1, r6, #0\n" + " bl SetMonData\n" + " add r7, r7, #0x1\n" + " cmp r7, #0x3\n" + " ble ._746 @cond_branch\n" + " ldr r0, [sp, #0xc]\n" + " add r0, r0, #0x1\n" + " str r0, [sp, #0xc]\n" + " cmp r0, #0x5\n" + " ble ._747 @cond_branch\n" + " ldr r3, ._750 + 32 @ gUnknown_Debug_2023A76\n" + " add r4, r3, #0\n" + " add r4, r4, #0x44\n" + " ldrh r1, [r4]\n" + " mov r2, #0x0\n" + " ldsh r0, [r4, r2]\n" + " cmp r0, #0x8\n" + " bne ._748 @cond_branch\n" + " ldr r0, ._750 + 12 @ gUnknown_02023A14_50\n" + " ldrb r1, [r0]\n" + " mov r2, #0x80\n" + " b ._753\n" + "._751:\n" + " .align 2, 0\n" + "._750:\n" + " .word gPlayerParty\n" + " .word gUnknown_Debug_2023ABC\n" + " .word Str_821F649\n" + " .word gUnknown_02023A14_50\n" + " .word gUnknown_Debug_2023B02\n" + " .word gEnemyParty\n" + " .word gBattleMoves+0x4\n" + " .word gUnknown_Debug_2023B32\n" + " .word gUnknown_Debug_2023A76\n" + "._748:\n" + " cmp r0, #0x7\n" + " bne ._752 @cond_branch\n" + " ldr r0, ._754 @ gUnknown_02023A14_50\n" + " ldrb r1, [r0]\n" + " mov r2, #0x20\n" + " b ._753\n" + "._755:\n" + " .align 2, 0\n" + "._754:\n" + " .word gUnknown_02023A14_50\n" + "._752:\n" + " cmp r0, #0x6\n" + " bne ._756 @cond_branch\n" + " ldr r2, ._759 @ gUnknown_02023A14_50\n" + " ldrb r0, [r2]\n" + " mov r1, #0x10\n" + " orr r0, r0, r1\n" + " strb r0, [r2]\n" + " ldrh r1, [r3, #0x4]\n" + " mov r2, #0x4\n" + " ldsh r0, [r3, r2]\n" + " cmp r0, #0x5\n" + " ble ._757 @cond_branch\n" + " ldr r0, ._759 + 4 @ gSharedMem\n" + " sub r1, r1, #0x2\n" + " ldr r3, ._759 + 8 @ 0x160a3\n" + " add r0, r0, r3\n" + " b ._761\n" + "._760:\n" + " .align 2, 0\n" + "._759:\n" + " .word gUnknown_02023A14_50\n" + " .word gSharedMem\n" + " .word 0x160a3\n" + "._757:\n" + " ldr r0, ._762 @ gSharedMem\n" + " ldr r2, ._762 + 4 @ 0x160a3\n" + " add r0, r0, r2\n" + " b ._761\n" + "._763:\n" + " .align 2, 0\n" + "._762:\n" + " .word gSharedMem\n" + " .word 0x160a3\n" + "._756:\n" + " cmp r0, #0x5\n" + " bne ._764 @cond_branch\n" + " ldr r0, ._766 @ gUnknown_02023A14_50\n" + " ldrb r1, [r0]\n" + " mov r2, #0x21\n" + "._753:\n" + " orr r1, r1, r2\n" + "._761:\n" + " strb r1, [r0]\n" + " bl sub_80408BC\n" + " b ._770\n" + "._767:\n" + " .align 2, 0\n" + "._766:\n" + " .word gUnknown_02023A14_50\n" + "._764:\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._768 @cond_branch\n" + " bl sub_80408BC\n" + "._768:\n" + " ldrh r3, [r4]\n" + " mov r0, #0x2\n" + " and r0, r0, r3\n" + " cmp r0, #0\n" + " beq ._769 @cond_branch\n" + " ldr r0, ._772 @ gUnknown_02023A14_50\n" + " ldrb r1, [r0]\n" + " mov r2, #0x4\n" + " orr r1, r1, r2\n" + " strb r1, [r0]\n" + "._769:\n" + " mov r0, #0x4\n" + " and r0, r0, r3\n" + " cmp r0, #0\n" + " beq ._770 @cond_branch\n" + " ldr r0, ._772 @ gUnknown_02023A14_50\n" + " ldrb r1, [r0]\n" + " mov r2, #0x6\n" + " orr r1, r1, r2\n" + " strb r1, [r0]\n" + "._770:\n" + " ldr r0, ._772 + 4 @ gMain\n" + " ldr r1, ._772 + 8 @ debug_sub_80108B8\n" + " str r1, [r0, #0x8]\n" + " ldr r0, ._772 + 12 @ unref_sub_800D684\n" + " bl SetMainCallback2\n" + " bl ClearBag\n" + " mov r0, #0x1\n" + " mov r1, #0xa\n" + " bl AddBagItem\n" + " mov r0, #0x2\n" + " mov r1, #0xa\n" + " bl AddBagItem\n" + " mov r0, #0x3\n" + " mov r1, #0xa\n" + " bl AddBagItem\n" + " mov r0, #0x4\n" + " mov r1, #0xa\n" + " bl AddBagItem\n" + " mov r0, #0x5\n" + " mov r1, #0xa\n" + " bl AddBagItem\n" + " mov r0, #0x6\n" + " mov r1, #0xa\n" + " bl AddBagItem\n" + " mov r0, #0x7\n" + " mov r1, #0xa\n" + " bl AddBagItem\n" + " mov r0, #0x8\n" + " mov r1, #0xa\n" + " bl AddBagItem\n" + " mov r0, #0x9\n" + " mov r1, #0xa\n" + " bl AddBagItem\n" + " mov r0, #0xa\n" + " mov r1, #0xa\n" + " bl AddBagItem\n" + " mov r0, #0xb\n" + " mov r1, #0xa\n" + " bl AddBagItem\n" + " mov r0, #0xc\n" + " mov r1, #0xa\n" + " bl AddBagItem\n" + " mov r0, #0x13\n" + " mov r1, #0x63\n" + " bl AddBagItem\n" + " mov r0, #0x14\n" + " mov r1, #0x63\n" + " bl AddBagItem\n" + " mov r0, #0x19\n" + " mov r1, #0x63\n" + " bl AddBagItem\n" + " mov r0, #0x22\n" + " mov r1, #0x63\n" + " bl AddBagItem\n" + " mov r0, #0x23\n" + " mov r1, #0x63\n" + " bl AddBagItem\n" + " mov r0, #0x25\n" + " mov r1, #0x63\n" + " bl AddBagItem\n" + " mov r0, #0x49\n" + " mov r1, #0x63\n" + " bl AddBagItem\n" + " mov r0, #0x4a\n" + " mov r1, #0x63\n" + " bl AddBagItem\n" + " mov r0, #0x4b\n" + " mov r1, #0x63\n" + " bl AddBagItem\n" + " mov r0, #0x4c\n" + " mov r1, #0x63\n" + " bl AddBagItem\n" + " mov r0, #0x4d\n" + " mov r1, #0x63\n" + " bl AddBagItem\n" + " mov r0, #0x4e\n" + " mov r1, #0x63\n" + " bl AddBagItem\n" + " mov r0, #0x50\n" + " mov r1, #0x63\n" + " bl AddBagItem\n" + " ldr r4, ._772 + 16 @ gUnknown_Debug_821F5AC\n" + " mov r7, #0xe\n" + "._771:\n" + " add r0, r4, #0\n" + " bl sub_810CA34\n" + " add r4, r4, #0x8\n" + " sub r7, r7, #0x1\n" + " cmp r7, #0\n" + " bge ._771 @cond_branch\n" + " add sp, sp, #0x18\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._773:\n" + " .align 2, 0\n" + "._772:\n" + " .word gUnknown_02023A14_50\n" + " .word gMain\n" + " .word debug_sub_80108B8+1\n" + " .word unref_sub_800D684+1\n" + " .word gUnknown_Debug_821F5AC\n" + "\n" + ); +} + +void debug_sub_8011D40(void) +{ + DmaCopy16(3, gSharedMem, (void *)(VRAM + 0x4000), 0x1000); + REG_BG0HOFS = gBattle_BG0_X; + REG_BG0VOFS = gBattle_BG0_Y; + REG_BG1HOFS = gBattle_BG1_X; + REG_BG1VOFS = gBattle_BG1_Y; + REG_BG2HOFS = gBattle_BG2_X; + REG_BG2VOFS = gBattle_BG2_Y; + REG_BG3HOFS = gBattle_BG3_X; + REG_BG3VOFS = gBattle_BG3_Y; + LoadOam(); + ProcessSpriteCopyRequests(); +} + +void debug_nullsub_45() +{ +} + +void debug_sub_8011DD4(void) +{ + REG_BG0CNT = 0x9803; + + REG_BG0HOFS = gBattle_BG0_X; + REG_BG0VOFS = gBattle_BG0_Y; + + REG_BG1HOFS = gBattle_BG1_X; + REG_BG1VOFS = gBattle_BG1_Y; + + REG_BG2HOFS = gBattle_BG2_X; + REG_BG2VOFS = gBattle_BG2_Y; + + REG_BG3HOFS = gBattle_BG3_X; + REG_BG3VOFS = gBattle_BG3_Y; + + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + ScanlineEffect_InitHBlankDmaTransfer(); +} + +void debug_sub_8011E5C(void) +{ + s32 i; + + for (i = 0; i < 31; i++) + debug_sub_8011EA0(i); +} + +extern u8 gUnknown_Debug_030043A8; + +void debug_sub_8011E74(void) +{ + u8 r5 = gUnknown_Debug_030043A8; + + for (gUnknown_Debug_030043A8 = 0; gUnknown_Debug_030043A8 < 4; gUnknown_Debug_030043A8++) + debug_sub_8012294(); + + gUnknown_Debug_030043A8 = r5; +} + +__attribute__((naked)) +void debug_sub_8011EA0(u8 a) +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " add sp, sp, #0xfffffff4\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + " cmp r7, #0x22\n" + " bls ._782 @cond_branch\n" + " b ._815\n" + "._782:\n" + " lsl r0, r7, #0x2\n" + " ldr r1, ._785 @ \n" + " add r1, r0, r1\n" + " ldr r1, [r1]\n" + " str r0, [sp, #0x8]\n" + " mov pc, r1\n" + "._786:\n" + " .align 2, 0\n" + "._785:\n" + " .word ._784\n" + "._784:\n" + " .word ._812\n" + " .word ._817\n" + " .word ._814\n" + " .word ._815\n" + " .word ._816\n" + " .word ._812\n" + " .word ._817\n" + " .word ._814\n" + " .word ._815\n" + " .word ._816\n" + " .word ._812\n" + " .word ._817\n" + " .word ._814\n" + " .word ._815\n" + " .word ._816\n" + " .word ._812\n" + " .word ._817\n" + " .word ._814\n" + " .word ._815\n" + " .word ._816\n" + " .word ._812\n" + " .word ._817\n" + " .word ._814\n" + " .word ._815\n" + " .word ._816\n" + " .word ._812\n" + " .word ._817\n" + " .word ._814\n" + " .word ._815\n" + " .word ._816\n" + " .word ._817\n" + " .word ._848\n" + " .word ._848\n" + " .word ._848\n" + " .word ._848\n" + "._812:\n" + " mov r0, #0x0\n" + " mov r1, #0x14\n" + " bl debug_sub_8010A7C\n" + " ldr r6, ._823 @ gBattleTextBuff1\n" + " ldr r2, ._823 + 4 @ gUnknown_Debug_821F424\n" + " ldr r0, [sp, #0x8]\n" + " add r1, r0, r7\n" + " lsl r1, r1, #0x1\n" + " add r0, r1, r2\n" + " ldrh r0, [r0]\n" + " str r0, [sp, #0x4]\n" + " add r0, r2, #2\n" + " add r0, r1, r0\n" + " ldrb r0, [r0]\n" + " mov r8, r0\n" + " add r2, r2, #0x4\n" + " add r1, r1, r2\n" + " ldrb r1, [r1]\n" + " mov r9, r1\n" + " str r1, [sp]\n" + " ldr r0, ._823 + 8 @ gUnknown_Debug_03004370\n" + " add r1, r6, #0\n" + " ldr r2, [sp, #0x4]\n" + " mov r3, r8\n" + " bl Text_InitWindow\n" + " ldr r0, ._823 + 8 @ gUnknown_Debug_03004370\n" + " bl Text_PrintWindow8002F44\n" + " ldr r1, ._823 + 12 @ gUnknown_Debug_2023A76\n" + " mov sl, r1\n" + " lsl r4, r7, #0x1\n" + " ldr r5, ._823 + 16 @ gUnknown_Debug_03004360\n" + " ldrb r0, [r5]\n" + " mov r7, #0x46\n" + " mul r0, r0, r7\n" + " add r0, r4, r0\n" + " add r0, r0, sl\n" + " mov r2, #0x0\n" + " ldsh r1, [r0, r2]\n" + " add r0, r6, #0\n" + " mov r2, #0x2\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " mov r2, #0xd3\n" + " lsl r2, r2, #0x1\n" + " ldrb r3, [r5]\n" + " lsl r3, r3, #0x5\n" + " add r3, r3, #0x19\n" + " lsl r3, r3, #0x18\n" + " lsr r3, r3, #0x18\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " ldr r0, ._823 + 8 @ gUnknown_Debug_03004370\n" + " add r1, r6, #0\n" + " bl Text_InitWindow\n" + " ldr r0, ._823 + 8 @ gUnknown_Debug_03004370\n" + " bl Text_PrintWindow8002F44\n" + " mov r0, #0xff\n" + " strb r0, [r6]\n" + " ldrb r0, [r5]\n" + " mul r0, r0, r7\n" + " add r4, r4, r0\n" + " add r4, r4, sl\n" + " mov r0, #0x0\n" + " ldsh r1, [r4, r0]\n" + " mov r0, #0xb\n" + " mul r1, r1, r0\n" + " ldr r0, ._823 + 20 @ gSpeciesNames\n" + " add r1, r1, r0\n" + " add r0, r6, #0\n" + " bl StringAppend\n" + " mov r1, r9\n" + " str r1, [sp]\n" + " ldr r0, ._823 + 8 @ gUnknown_Debug_03004370\n" + " add r1, r6, #0\n" + " ldr r2, [sp, #0x4]\n" + " mov r3, r8\n" + " bl Text_InitWindow\n" + " ldr r0, ._823 + 8 @ gUnknown_Debug_03004370\n" + " bl Text_PrintWindow8002F44\n" + " b ._848\n" + "._824:\n" + " .align 2, 0\n" + "._823:\n" + " .word gBattleTextBuff1\n" + " .word gUnknown_Debug_821F424\n" + " .word gUnknown_Debug_03004370\n" + " .word gUnknown_Debug_2023A76\n" + " .word gUnknown_Debug_03004360\n" + " .word gSpeciesNames\n" + "._817:\n" + " ldr r6, ._826 @ gBattleTextBuff1\n" + " ldr r3, ._826 + 4 @ gUnknown_Debug_2023A76\n" + " lsl r1, r7, #0x1\n" + " ldr r0, ._826 + 8 @ gUnknown_Debug_03004360\n" + " ldrb r2, [r0]\n" + " mov r0, #0x46\n" + " mul r0, r0, r2\n" + " add r1, r1, r0\n" + " add r1, r1, r3\n" + " mov r2, #0x0\n" + " ldsh r1, [r1, r2]\n" + " add r0, r6, #0\n" + " mov r2, #0x2\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " b ._825\n" + "._827:\n" + " .align 2, 0\n" + "._826:\n" + " .word gBattleTextBuff1\n" + " .word gUnknown_Debug_2023A76\n" + " .word gUnknown_Debug_03004360\n" + "._814:\n" + " mov r0, #0x0\n" + " mov r1, #0x18\n" + " bl debug_sub_8010A7C\n" + " ldr r6, ._830 @ gUnknown_Debug_03004370\n" + " ldr r1, ._830 + 4 @ gBattleTextBuff1\n" + " mov sl, r1\n" + " ldr r4, ._830 + 8 @ gUnknown_Debug_821F424\n" + " ldr r2, [sp, #0x8]\n" + " add r1, r2, r7\n" + " lsl r1, r1, #0x1\n" + " add r0, r1, r4\n" + " ldrh r2, [r0]\n" + " add r0, r4, #2\n" + " add r0, r1, r0\n" + " ldrb r3, [r0]\n" + " add r4, r4, #0x4\n" + " add r1, r1, r4\n" + " ldrb r0, [r1]\n" + " str r0, [sp]\n" + " add r0, r6, #0\n" + " mov r1, sl\n" + " bl Text_InitWindow\n" + " add r0, r6, #0\n" + " bl Text_PrintWindow8002F44\n" + " lsl r4, r7, #0x1\n" + " ldr r5, ._830 + 12 @ gUnknown_Debug_03004360\n" + " ldrb r0, [r5]\n" + " mov r1, #0x46\n" + " mul r0, r0, r1\n" + " add r0, r4, r0\n" + " ldr r2, ._830 + 16 @ gUnknown_Debug_2023A76\n" + " add r0, r0, r2\n" + " mov r2, #0x0\n" + " ldsh r1, [r0, r2]\n" + " mov r0, sl\n" + " mov r2, #0x2\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " mov r2, #0xd3\n" + " lsl r2, r2, #0x1\n" + " ldrb r3, [r5]\n" + " lsl r3, r3, #0x5\n" + " add r3, r3, #0x19\n" + " lsl r3, r3, #0x18\n" + " lsr r3, r3, #0x18\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " add r0, r6, #0\n" + " mov r1, sl\n" + " bl Text_InitWindow\n" + " add r0, r6, #0\n" + " bl Text_PrintWindow8002F44\n" + " mov r0, #0xff\n" + " mov r1, sl\n" + " strb r0, [r1]\n" + " ldrb r0, [r5]\n" + " mov r2, #0x46\n" + " mul r0, r0, r2\n" + " add r4, r4, r0\n" + " ldr r0, ._830 + 16 @ gUnknown_Debug_2023A76\n" + " add r4, r4, r0\n" + " mov r1, #0x0\n" + " ldsh r0, [r4, r1]\n" + " cmp r0, #0\n" + " beq ._828 @cond_branch\n" + " ldrh r0, [r4]\n" + " bl ItemId_GetItem\n" + " add r1, r0, #0\n" + " mov r0, sl\n" + " bl StringAppend\n" + " b ._829\n" + "._831:\n" + " .align 2, 0\n" + "._830:\n" + " .word gUnknown_Debug_03004370\n" + " .word gBattleTextBuff1\n" + " .word gUnknown_Debug_821F424\n" + " .word gUnknown_Debug_03004360\n" + " .word gUnknown_Debug_2023A76\n" + "._828:\n" + " ldr r1, ._833 @ Str_821F624\n" + " mov r0, sl\n" + " bl StringAppend\n" + "._829:\n" + " ldr r6, ._833 + 4 @ gUnknown_Debug_03004370\n" + " ldr r1, ._833 + 8 @ gBattleTextBuff1\n" + " ldr r5, ._833 + 12 @ gUnknown_Debug_821F424\n" + " ldr r2, [sp, #0x8]\n" + " add r4, r2, r7\n" + " lsl r4, r4, #0x1\n" + " add r0, r4, r5\n" + " ldrh r2, [r0]\n" + " add r0, r5, #2\n" + " add r0, r4, r0\n" + " ldrb r3, [r0]\n" + " add r5, r5, #0x4\n" + " add r4, r4, r5\n" + " ldrb r0, [r4]\n" + " str r0, [sp]\n" + " add r0, r6, #0\n" + " bl Text_InitWindow\n" + " add r0, r6, #0\n" + " bl Text_PrintWindow8002F44\n" + " b ._848\n" + "._834:\n" + " .align 2, 0\n" + "._833:\n" + " .word Str_821F624\n" + " .word gUnknown_Debug_03004370\n" + " .word gBattleTextBuff1\n" + " .word gUnknown_Debug_821F424\n" + "._816:\n" + " mov r0, #0x0\n" + " mov r1, #0x4\n" + " bl debug_sub_8010A7C\n" + " ldr r5, ._839 @ gUnknown_Debug_03004370\n" + " ldr r6, ._839 + 4 @ gBattleTextBuff1\n" + " ldr r4, ._839 + 8 @ gUnknown_Debug_821F424\n" + " ldr r0, [sp, #0x8]\n" + " add r1, r0, r7\n" + " lsl r1, r1, #0x1\n" + " add r0, r1, r4\n" + " ldrh r2, [r0]\n" + " add r0, r4, #2\n" + " add r0, r1, r0\n" + " ldrb r3, [r0]\n" + " add r4, r4, #0x4\n" + " add r1, r1, r4\n" + " ldrb r0, [r1]\n" + " str r0, [sp]\n" + " add r0, r5, #0\n" + " add r1, r6, #0\n" + " bl Text_InitWindow\n" + " add r0, r5, #0\n" + " bl Text_PrintWindow8002F44\n" + " mov r4, #0x0\n" + " ldr r3, ._839 + 12 @ gUnknown_Debug_2023A76\n" + " lsl r1, r7, #0x1\n" + " ldr r0, ._839 + 16 @ gUnknown_Debug_03004360\n" + " ldrb r2, [r0]\n" + " mov r0, #0x46\n" + " mul r0, r0, r2\n" + " add r1, r1, r0\n" + " add r1, r1, r3\n" + " mov r2, #0x0\n" + " ldsh r0, [r1, r2]\n" + " cmp r0, #0x1\n" + " beq ._835 @cond_branch\n" + " cmp r0, #0x1\n" + " bgt ._836 @cond_branch\n" + " cmp r0, #0\n" + " beq ._837 @cond_branch\n" + " b ._843\n" + "._840:\n" + " .align 2, 0\n" + "._839:\n" + " .word gUnknown_Debug_03004370\n" + " .word gBattleTextBuff1\n" + " .word gUnknown_Debug_821F424\n" + " .word gUnknown_Debug_2023A76\n" + " .word gUnknown_Debug_03004360\n" + "._836:\n" + " cmp r0, #0x2\n" + " beq ._841 @cond_branch\n" + " cmp r0, #0x3\n" + " beq ._842 @cond_branch\n" + " b ._843\n" + "._837:\n" + " mov r0, #0xb5\n" + " b ._844\n" + "._835:\n" + " mov r0, #0xb6\n" + "._844:\n" + " strb r0, [r6]\n" + " mov r4, #0x1\n" + " b ._847\n" + "._841:\n" + " mov r0, #0xb5\n" + " b ._846\n" + "._842:\n" + " mov r0, #0xb6\n" + "._846:\n" + " strb r0, [r6]\n" + " strb r0, [r6, #0x1]\n" + " mov r4, #0x2\n" + " b ._847\n" + "._843:\n" + " ldr r2, ._849 @ gBattleTextBuff1\n" + " add r1, r4, r2\n" + " mov r0, #0xac\n" + " strb r0, [r1]\n" + " add r4, r4, #0x1\n" + " add r6, r2, #0\n" + "._847:\n" + " add r1, r4, r6\n" + " mov r0, #0xff\n" + " strb r0, [r1]\n" + "._825:\n" + " ldr r5, ._849 + 4 @ gUnknown_Debug_03004370\n" + " ldr r4, ._849 + 8 @ gUnknown_Debug_821F424\n" + " ldr r0, [sp, #0x8]\n" + " add r1, r0, r7\n" + " lsl r1, r1, #0x1\n" + " add r0, r1, r4\n" + " ldrh r2, [r0]\n" + " add r0, r4, #2\n" + " add r0, r1, r0\n" + " ldrb r3, [r0]\n" + " add r4, r4, #0x4\n" + " add r1, r1, r4\n" + " ldrb r0, [r1]\n" + " str r0, [sp]\n" + " add r0, r5, #0\n" + " add r1, r6, #0\n" + " bl Text_InitWindow\n" + " add r0, r5, #0\n" + " bl Text_PrintWindow8002F44\n" + " b ._848\n" + "._850:\n" + " .align 2, 0\n" + "._849:\n" + " .word gBattleTextBuff1\n" + " .word gUnknown_Debug_03004370\n" + " .word gUnknown_Debug_821F424\n" + "._815:\n" + " ldr r6, ._851 @ gBattleTextBuff1\n" + " ldr r3, ._851 + 4 @ gUnknown_Debug_2023A76\n" + " lsl r1, r7, #0x1\n" + " ldr r0, ._851 + 8 @ gUnknown_Debug_03004360\n" + " ldrb r2, [r0]\n" + " mov r0, #0x46\n" + " mul r0, r0, r2\n" + " add r1, r1, r0\n" + " add r1, r1, r3\n" + " mov r2, #0x0\n" + " ldsh r1, [r1, r2]\n" + " add r0, r6, #0\n" + " mov r2, #0x2\n" + " mov r3, #0x1\n" + " bl ConvertIntToDecimalStringN\n" + " ldr r5, ._851 + 12 @ gUnknown_Debug_03004370\n" + " ldr r4, ._851 + 16 @ gUnknown_Debug_821F424\n" + " lsl r1, r7, #0x2\n" + " add r1, r1, r7\n" + " lsl r1, r1, #0x1\n" + " add r0, r1, r4\n" + " ldrh r2, [r0]\n" + " add r0, r4, #2\n" + " add r0, r1, r0\n" + " ldrb r3, [r0]\n" + " add r4, r4, #0x4\n" + " add r1, r1, r4\n" + " ldrb r0, [r1]\n" + " str r0, [sp]\n" + " add r0, r5, #0\n" + " add r1, r6, #0\n" + " bl Text_InitWindow\n" + " add r0, r5, #0\n" + " bl Text_PrintWindow8002F44\n" + "._848:\n" + " add sp, sp, #0xc\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._852:\n" + " .align 2, 0\n" + "._851:\n" + " .word gBattleTextBuff1\n" + " .word gUnknown_Debug_2023A76\n" + " .word gUnknown_Debug_03004360\n" + " .word gUnknown_Debug_03004370\n" + " .word gUnknown_Debug_821F424\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8012294() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " add sp, sp, #0xfffffffc\n" + " ldr r2, ._854 @ gUnknown_Debug_030043A0\n" + " ldr r0, ._854 + 4 @ gUnknown_Debug_030043A4\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " ldrb r2, [r2]\n" + " add r0, r0, r2\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, #0x1d\n" + " bhi ._853 @cond_branch\n" + " mov r0, #0x0\n" + " mov r1, #0x18\n" + " bl debug_sub_8010A7C\n" + " ldr r0, ._854 + 8 @ gUnknown_Debug_03004370\n" + " mov sl, r0\n" + " ldr r1, ._854 + 12 @ gBattleTextBuff1\n" + " mov r9, r1\n" + " ldr r2, ._854 + 16 @ gUnknown_Debug_821F564\n" + " mov r8, r2\n" + " ldr r7, ._854 + 20 @ gUnknown_Debug_030043A8\n" + " ldrb r1, [r7]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x1\n" + " add r1, r0, r2\n" + " ldrh r2, [r1]\n" + " ldr r3, ._854 + 24 @ gUnknown_Debug_821F566\n" + " add r1, r0, r3\n" + " ldrb r3, [r1]\n" + " ldr r1, ._854 + 28 @ gUnknown_Debug_821F568\n" + " add r0, r0, r1\n" + " ldrb r0, [r0]\n" + " str r0, [sp]\n" + " mov r0, sl\n" + " mov r1, r9\n" + " bl Text_InitWindow\n" + " mov r0, sl\n" + " bl Text_PrintWindow8002F44\n" + " ldrb r4, [r7]\n" + " lsl r4, r4, #0x1\n" + " add r0, r5, #0\n" + " mov r1, #0x5\n" + " bl __udivsi3\n" + " add r5, r0, #0\n" + " lsl r5, r5, #0x18\n" + " lsr r5, r5, #0x15\n" + " add r4, r4, r5\n" + " ldr r6, ._854 + 32 @ gUnknown_Debug_03004360\n" + " ldrb r1, [r6]\n" + " lsl r0, r1, #0x1\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x4\n" + " add r4, r4, r0\n" + " ldr r2, ._854 + 36 @ gUnknown_Debug_2023B02\n" + " add r4, r4, r2\n" + " mov r3, #0x0\n" + " ldsh r1, [r4, r3]\n" + " mov r0, r9\n" + " mov r2, #0x2\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " mov r2, #0xd3\n" + " lsl r2, r2, #0x1\n" + " ldrb r3, [r6]\n" + " lsl r3, r3, #0x5\n" + " add r3, r3, #0x19\n" + " lsl r3, r3, #0x18\n" + " lsr r3, r3, #0x18\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, sl\n" + " mov r1, r9\n" + " bl Text_InitWindow\n" + " mov r0, sl\n" + " bl Text_PrintWindow8002F44\n" + " mov r0, #0xff\n" + " mov r1, r9\n" + " strb r0, [r1]\n" + " ldrb r1, [r7]\n" + " lsl r1, r1, #0x1\n" + " add r1, r1, r5\n" + " ldrb r2, [r6]\n" + " lsl r0, r2, #0x1\n" + " add r0, r0, r2\n" + " lsl r0, r0, #0x4\n" + " add r1, r1, r0\n" + " ldr r2, ._854 + 36 @ gUnknown_Debug_2023B02\n" + " add r1, r1, r2\n" + " mov r3, #0x0\n" + " ldsh r1, [r1, r3]\n" + " mov r0, #0xd\n" + " mul r1, r1, r0\n" + " ldr r0, ._854 + 40 @ gMoveNames\n" + " add r1, r1, r0\n" + " mov r0, r9\n" + " bl StringAppend\n" + " ldrb r1, [r7]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x1\n" + " add r8, r8, r0\n" + " mov r1, r8\n" + " ldrh r2, [r1]\n" + " ldr r3, ._854 + 24 @ gUnknown_Debug_821F566\n" + " add r1, r0, r3\n" + " ldrb r3, [r1]\n" + " ldr r1, ._854 + 28 @ gUnknown_Debug_821F568\n" + " add r0, r0, r1\n" + " ldrb r0, [r0]\n" + " str r0, [sp]\n" + " mov r0, sl\n" + " mov r1, r9\n" + " bl Text_InitWindow\n" + " mov r0, sl\n" + " bl Text_PrintWindow8002F44\n" + "._853:\n" + " add sp, sp, #0x4\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._855:\n" + " .align 2, 0\n" + "._854:\n" + " .word gUnknown_Debug_030043A0\n" + " .word gUnknown_Debug_030043A4\n" + " .word gUnknown_Debug_03004370\n" + " .word gBattleTextBuff1\n" + " .word gUnknown_Debug_821F564\n" + " .word gUnknown_Debug_030043A8\n" + " .word gUnknown_Debug_821F566\n" + " .word gUnknown_Debug_821F568\n" + " .word gUnknown_Debug_03004360\n" + " .word gUnknown_Debug_2023B02\n" + " .word gMoveNames\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_80123D8(u8 a) +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " add sp, sp, #0xfffffffc\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, #0x1d\n" + " bhi ._856 @cond_branch\n" + " mov r0, #0x0\n" + " mov r1, #0x12\n" + " bl debug_sub_8010A7C\n" + " ldr r4, ._858 @ gUnknown_Debug_03004370\n" + " ldr r0, ._858 + 4 @ gBattleTextBuff1\n" + " mov r8, r0\n" + " ldr r6, ._858 + 8 @ gUnknown_Debug_821F58C\n" + " ldrh r1, [r6]\n" + " mov sl, r1\n" + " ldrb r7, [r6, #0x2]\n" + " ldrb r2, [r6, #0x4]\n" + " mov r9, r2\n" + " str r2, [sp]\n" + " add r0, r4, #0\n" + " mov r1, r8\n" + " mov r2, sl\n" + " add r3, r7, #0\n" + " bl Text_InitWindow\n" + " add r0, r4, #0\n" + " bl Text_PrintWindow8002F44\n" + " lsl r5, r5, #0x1\n" + " ldr r1, ._858 + 12 @ gUnknown_Debug_03004360\n" + " ldrb r0, [r1]\n" + " mov r2, #0x46\n" + " mul r0, r0, r2\n" + " add r0, r5, r0\n" + " ldr r1, ._858 + 16 @ gUnknown_Debug_2023A76\n" + " add r0, r0, r1\n" + " mov r2, #0x0\n" + " ldsh r1, [r0, r2]\n" + " lsl r0, r1, #0x3\n" + " sub r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._858 + 20 @ gBaseStats\n" + " add r0, r0, r1\n" + " ldrb r0, [r0, #0x16]\n" + " mov r2, #0xd\n" + " add r1, r0, #0\n" + " mul r1, r1, r2\n" + " ldr r0, ._858 + 24 @ gAbilityNames\n" + " add r1, r1, r0\n" + " mov r0, r8\n" + " bl StringCopy\n" + " mov r1, r9\n" + " str r1, [sp]\n" + " add r0, r4, #0\n" + " mov r1, r8\n" + " mov r2, sl\n" + " add r3, r7, #0\n" + " bl Text_InitWindow\n" + " add r0, r4, #0\n" + " bl Text_PrintWindow8002F44\n" + " mov r0, #0x0\n" + " mov r1, #0x12\n" + " bl debug_sub_8010A7C\n" + " ldrh r2, [r6, #0x6]\n" + " mov r9, r2\n" + " ldrb r0, [r6, #0x8]\n" + " mov sl, r0\n" + " ldrb r6, [r6, #0xa]\n" + " str r6, [sp]\n" + " add r0, r4, #0\n" + " mov r1, r8\n" + " mov r3, sl\n" + " bl Text_InitWindow\n" + " add r0, r4, #0\n" + " bl Text_PrintWindow8002F44\n" + " ldr r1, ._858 + 12 @ gUnknown_Debug_03004360\n" + " ldrb r0, [r1]\n" + " mov r2, #0x46\n" + " mul r0, r0, r2\n" + " add r5, r5, r0\n" + " ldr r0, ._858 + 16 @ gUnknown_Debug_2023A76\n" + " add r5, r5, r0\n" + " mov r2, #0x0\n" + " ldsh r1, [r5, r2]\n" + " lsl r0, r1, #0x3\n" + " sub r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._858 + 20 @ gBaseStats\n" + " add r0, r0, r1\n" + " ldrb r0, [r0, #0x17]\n" + " mov r2, #0xd\n" + " add r1, r0, #0\n" + " mul r1, r1, r2\n" + " ldr r0, ._858 + 24 @ gAbilityNames\n" + " add r1, r1, r0\n" + " mov r0, r8\n" + " bl StringCopy\n" + " str r6, [sp]\n" + " add r0, r4, #0\n" + " mov r1, r8\n" + " mov r2, r9\n" + " mov r3, sl\n" + " bl Text_InitWindow\n" + " add r0, r4, #0\n" + " bl Text_PrintWindow8002F44\n" + " b ._857\n" + "._859:\n" + " .align 2, 0\n" + "._858:\n" + " .word gUnknown_Debug_03004370\n" + " .word gBattleTextBuff1\n" + " .word gUnknown_Debug_821F58C\n" + " .word gUnknown_Debug_03004360\n" + " .word gUnknown_Debug_2023A76\n" + " .word gBaseStats\n" + " .word gAbilityNames\n" + "._856:\n" + " ldr r6, ._860 @ gBattleTextBuff1\n" + " ldr r1, ._860 + 4 @ gAbilityNames\n" + " add r0, r6, #0\n" + " bl StringCopy\n" + " ldr r5, ._860 + 8 @ gUnknown_Debug_03004370\n" + " ldr r4, ._860 + 12 @ gUnknown_Debug_821F58C\n" + " ldrh r2, [r4]\n" + " ldrb r3, [r4, #0x2]\n" + " ldrb r0, [r4, #0x4]\n" + " str r0, [sp]\n" + " add r0, r5, #0\n" + " add r1, r6, #0\n" + " bl Text_InitWindow\n" + " add r0, r5, #0\n" + " bl Text_PrintWindow8002F44\n" + " ldrh r2, [r4, #0x6]\n" + " ldrb r3, [r4, #0x8]\n" + " ldrb r0, [r4, #0xa]\n" + " str r0, [sp]\n" + " add r0, r5, #0\n" + " add r1, r6, #0\n" + " bl Text_InitWindow\n" + " add r0, r5, #0\n" + " bl Text_PrintWindow8002F44\n" + "._857:\n" + " add sp, sp, #0x4\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._861:\n" + " .align 2, 0\n" + "._860:\n" + " .word gBattleTextBuff1\n" + " .word gAbilityNames\n" + " .word gUnknown_Debug_03004370\n" + " .word gUnknown_Debug_821F58C\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8012540() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add sp, sp, #0xfffffffc\n" + " ldr r5, ._862 @ gBattleTextBuff1\n" + " ldr r0, ._862 + 4 @ gUnknown_Debug_2023A76\n" + " add r0, r0, #0x44\n" + " mov r2, #0x0\n" + " ldsh r1, [r0, r2]\n" + " add r0, r5, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x1\n" + " bl ConvertIntToDecimalStringN\n" + " ldr r4, ._862 + 8 @ gUnknown_Debug_03004370\n" + " ldr r1, ._862 + 12 @ gUnknown_Debug_821F424\n" + " mov r3, #0x9b\n" + " lsl r3, r3, #0x1\n" + " add r0, r1, r3\n" + " ldrh r2, [r0]\n" + " mov r6, #0x9c\n" + " lsl r6, r6, #0x1\n" + " add r0, r1, r6\n" + " ldrb r3, [r0]\n" + " add r6, r6, #0x2\n" + " add r0, r1, r6\n" + " ldrb r0, [r0]\n" + " str r0, [sp]\n" + " add r0, r4, #0\n" + " add r1, r5, #0\n" + " bl Text_InitWindow\n" + " add r0, r4, #0\n" + " bl Text_PrintWindow8002F44\n" + " add sp, sp, #0x4\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._863:\n" + " .align 2, 0\n" + "._862:\n" + " .word gBattleTextBuff1\n" + " .word gUnknown_Debug_2023A76\n" + " .word gUnknown_Debug_03004370\n" + " .word gUnknown_Debug_821F424\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_nullsub_3() +{ + asm( + " bx lr\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_80125A0() +{ + asm( + " push {r4, lr}\n" + " ldr r4, ._864 @ gSharedMem\n" + " ldr r3, ._864 + 4 @ gUnknown_Debug_821F680\n" + " ldr r2, ._864 + 8 @ gUnknown_Debug_030043A0\n" + " ldr r0, ._864 + 12 @ gUnknown_Debug_030043A4\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " ldrb r2, [r2]\n" + " add r0, r0, r2\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._864 + 16 @ gUnknown_Debug_03004360\n" + " ldrb r2, [r1]\n" + " mov r1, #0x8c\n" + " mul r1, r1, r2\n" + " add r0, r0, r1\n" + " add r0, r0, r3\n" + " ldr r0, [r0]\n" + " add r0, r0, r4\n" + " mov r1, #0x6d\n" + " strb r1, [r0]\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._865:\n" + " .align 2, 0\n" + "._864:\n" + " .word gSharedMem\n" + " .word gUnknown_Debug_821F680\n" + " .word gUnknown_Debug_030043A0\n" + " .word gUnknown_Debug_030043A4\n" + " .word gUnknown_Debug_03004360\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_80125E4() +{ + asm( + " push {r4, lr}\n" + " ldr r4, ._866 @ gSharedMem\n" + " ldr r3, ._866 + 4 @ gUnknown_Debug_821F680\n" + " ldr r2, ._866 + 8 @ gUnknown_Debug_030043A0\n" + " ldr r0, ._866 + 12 @ gUnknown_Debug_030043A4\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " ldrb r2, [r2]\n" + " add r0, r0, r2\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._866 + 16 @ gUnknown_Debug_03004360\n" + " ldrb r2, [r1]\n" + " mov r1, #0x8c\n" + " mul r1, r1, r2\n" + " add r0, r0, r1\n" + " add r0, r0, r3\n" + " ldr r0, [r0]\n" + " add r0, r0, r4\n" + " mov r1, #0x81\n" + " strb r1, [r0]\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._867:\n" + " .align 2, 0\n" + "._866:\n" + " .word gSharedMem\n" + " .word gUnknown_Debug_821F680\n" + " .word gUnknown_Debug_030043A0\n" + " .word gUnknown_Debug_030043A4\n" + " .word gUnknown_Debug_03004360\n" + "\n" + ); +} + +void debug_sub_8012628(void) +{ + gSharedMem[gUnknown_Debug_821F798[gUnknown_Debug_03004360][gUnknown_Debug_030043A8]] = 0x6D; +} + +void debug_sub_8012658(void) +{ + gSharedMem[gUnknown_Debug_821F798[gUnknown_Debug_03004360][gUnknown_Debug_030043A8]] = 0x81; +} + +void debug_sub_8012688(void) +{ + s32 i; + u8 spriteId; + u8 taskId; + + for (i = 0; i < 411; i++) + gUnknown_Debug_2023B62[i] = 0; + SetHBlankCallback(NULL); + SetVBlankCallback(NULL); + DmaFill32(3, 0, (void *)VRAM, VRAM_SIZE); + REG_MOSAIC = 0; + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WIN1H = 0; + REG_WIN1V = 0; + REG_WININ = 0; + REG_WINOUT = 0; + Text_LoadWindowTemplate(&gWindowTemplate_81E6C58); + ResetPaletteFade(); + gBattle_BG0_X = 0; + gBattle_BG0_Y = DISPLAY_HEIGHT; + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + gBattle_BG2_X = 0; + gBattle_BG2_Y = 0; + gBattle_BG3_X = 0; + gBattle_BG3_Y = 0; + gBattleTerrain = 9; + sub_800D6D4(); + sub_800DAB8(); + ResetSpriteData(); + ResetTasks(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 4; + gCurrentMove = 1; + Text_InitWindowWithTemplate(&gUnknown_03004210, &gWindowTemplate_81E6C58); + DecompressPicFromTable_2( + &gMonFrontPicTable[gCurrentMove], + gMonFrontPicCoords[gCurrentMove].coords, + gMonFrontPicCoords[gCurrentMove].y_offset, + (void *)0x02000000, + gUnknown_081FAF4C[1], + gCurrentMove); + LoadCompressedPalette(gMonPaletteTable[gCurrentMove].data, 272, 32); + GetMonSpriteTemplate_803C56C(gCurrentMove, 1); + spriteId = CreateSprite(&gUnknown_02024E8C, 176, 40 + gMonFrontPicCoords[gCurrentMove].y_offset, 40); + gSprites[spriteId].callback = nullsub_37; + gSprites[spriteId].oam.paletteNum = 1; + REG_DISPCNT = 0x1F40; + SetHBlankCallback(debug_nullsub_45); + SetVBlankCallback(debug_sub_8011DD4); + m4aMPlayAllStop(); + taskId = CreateTask(debug_sub_8012D10, 0); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = spriteId; + SetMainCallback2(debug_sub_8012878); +} + +void debug_sub_8012878(void) +{ + AnimateSprites(); + BuildOamBuffer(); + Text_UpdateWindowInBattle(&gUnknown_03004210); + UpdatePaletteFade(); + RunTasks(); + if (gMain.heldKeys == (SELECT_BUTTON | R_BUTTON)) + SetMainCallback2(debug_sub_80108B8); +} + +void debug_sub_80128B4(void) +{ + debug_sub_8010A7C(0, 9); + Text_InitWindow(&gUnknown_03004210, gBattleTextBuff1, 144, 2, 35); + Text_PrintWindow8002F44(&gUnknown_03004210); + ConvertIntToDecimalStringN(gBattleTextBuff1, gCurrentMove, 2, 3); + gBattleTextBuff1[3] = CHAR_SPACE; + gBattleTextBuff1[4] = EOS; + StringAppend(gBattleTextBuff1, gSpeciesNames[gCurrentMove]); + Text_InitWindow(&gUnknown_03004210, gBattleTextBuff1, 144, 2, 35); + Text_PrintWindow8002F44(&gUnknown_03004210); +} + +void debug_sub_8012938(u8 taskId) +{ + debug_sub_8010A7C(0, 7); + Text_InitWindow(&gUnknown_03004210, gBattleTextBuff1, 162, 2, 37); + Text_PrintWindow8002F44(&gUnknown_03004210); + StringCopy(gBattleTextBuff1, Str_821F7B8); + ConvertIntToDecimalStringN(gBattleTextBuff1 + 4, gUnknown_Debug_2023B62[gCurrentMove - 1], 2, 3); + Text_InitWindow(&gUnknown_03004210, gBattleTextBuff1, 162, 2, 37); + Text_PrintWindow8002F44(&gUnknown_03004210); + gSprites[gTasks[taskId].data[1]].pos2.y = -gUnknown_Debug_2023B62[gCurrentMove - 1]; +} + +void debug_sub_80129F8(u8 taskId) +{ + DecompressPicFromTable_2( + &gMonFrontPicTable[gCurrentMove], + gMonFrontPicCoords[gCurrentMove].coords, + gMonFrontPicCoords[gCurrentMove].y_offset, + (void *)0x02000000, + gUnknown_081FAF4C[1], + gCurrentMove); + LoadCompressedPalette(gMonPaletteTable[gCurrentMove].data, 272, 32); + gSprites[gTasks[taskId].data[1]].pos1.y = gMonFrontPicCoords[gCurrentMove].y_offset + 40; + gSprites[gTasks[taskId].data[1]].pos2.y = -gUnknown_Debug_2023B62[gCurrentMove - 1]; + StartSpriteAnim(&gSprites[gTasks[taskId].data[1]], 0); +} + +void debug_sub_8012AC0(s8 a, u8 taskId) +{ + do + { + gCurrentMove += a; + if (gCurrentMove == 0) + gCurrentMove = 411; + if (gCurrentMove == 411) + gCurrentMove = 1; + } while (gBaseStats[gCurrentMove].type1 != 2 && gBaseStats[gCurrentMove].type2 != 2); + debug_sub_80128B4(); + debug_sub_8012938(taskId); + debug_sub_80129F8(taskId); +} + +void debug_sub_8012B2C(u8 a) +{ + *(u16 *)(VRAM + 0xC000 + 0x772 + (a * 4 + 0) * 0x20) = 1; + *(u16 *)(VRAM + 0xC000 + 0x772 + (a * 4 + 2) * 0x20) = 2; +} + +void debug_sub_8012B4C(u8 a) +{ + *(u16 *)(VRAM + 0xC000 + 0x772 + (a * 4 + 0) * 0x20) = 0x1016; + *(u16 *)(VRAM + 0xC000 + 0x772 + (a * 4 + 2) * 0x20) = 0x1016; +} + +void debug_sub_8012B70(u8 taskId, u8 b) +{ + if (b != 0) + { + sub_802BBD4(24, 28, 29, 33, 1); + debug_sub_80128B4(); + debug_sub_8012938(taskId); + debug_sub_80129F8(taskId); + gTasks[taskId].data[0] = 1; + } + else + { + sub_802BBD4(24, 28, 29, 33, 0); + gTasks[taskId].data[0] = 2; + Text_InitWindow(&gUnknown_03004210, Str_821F7DA, 656, 26, 29); + Text_PrintWindow8002F44(&gUnknown_03004210); + gTasks[taskId].data[3] = 0; + debug_sub_8012B2C(0); + } +} + +void debug_sub_8012C08(u8 taskId, u8 b) +{ + debug_sub_8010A7C(0, 9); + Text_InitWindow(&gUnknown_03004210, gBattleTextBuff1, 144, 2, 35); + Text_PrintWindow8002F44(&gUnknown_03004210); + debug_sub_8010A7C(0, 7); + Text_InitWindow(&gUnknown_03004210, gBattleTextBuff1, 162, 2, 37); + Text_PrintWindow8002F44(&gUnknown_03004210); + sub_802BBD4(24, 28, 29, 33, 0); + if (b != 0) + { + gTasks[taskId].data[0] = 4; + Text_InitWindow(&gUnknown_03004210, gUnknown_Debug_821F7F3, 144, 2, 35); + } + else + { + gTasks[taskId].data[0] = 3; + Text_InitWindow(&gUnknown_03004210, Str_821F7EA, 144, 2, 35); + } + Text_PrintWindow8002F44(&gUnknown_03004210); + Text_InitWindow(&gUnknown_03004210, BattleText_YesNo, 656, 26, 29); + Text_PrintWindow8002F44(&gUnknown_03004210); + gTasks[taskId].data[3] = 1; + debug_sub_8012B2C(1); +} + +void debug_sub_8012D10(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 0: + debug_sub_80128B4(); + debug_sub_8012938(taskId); + Text_InitWindow(&gUnknown_03004210, Str_821F7BD, 400, 19, 35); + Text_PrintWindow8002F44(&gUnknown_03004210); + gTasks[taskId].data[0]++; + sub_802E3E4(gTasks[taskId].data[2], 0); + break; + case 1: + if (gMain.newKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + nullsub_8(gTasks[taskId].data[2]); + gTasks[taskId].data[2] &= ~2; + sub_802E3E4(gTasks[taskId].data[2], 0); + } + else if (gMain.newKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + nullsub_8(gTasks[taskId].data[2]); + gTasks[taskId].data[2] |= 2; + sub_802E3E4(gTasks[taskId].data[2], 0); + } + else if (gMain.newKeys & DPAD_LEFT) + { + PlaySE(SE_SELECT); + nullsub_8(gTasks[taskId].data[2]); + gTasks[taskId].data[2] &= ~1; + sub_802E3E4(gTasks[taskId].data[2], 0); + } + else if (gMain.newKeys & DPAD_RIGHT) + { + PlaySE(SE_SELECT); + nullsub_8(gTasks[taskId].data[2]); + gTasks[taskId].data[2] |= 1; + sub_802E3E4(gTasks[taskId].data[2], 0); + } + else if (gMain.newAndRepeatedKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + switch (gTasks[taskId].data[2]) + { + case 0: + if (gUnknown_Debug_2023B62[gCurrentMove - 1] < 64) + { + gUnknown_Debug_2023B62[gCurrentMove - 1] += 1; + debug_sub_8012938(taskId); + } + break; + case 1: + debug_sub_8012AC0(1, taskId); + break; + case 2: + if (gCurrentMove < 411) + gCurrentMove++; + else + gCurrentMove = 1; + debug_sub_80128B4(); + debug_sub_8012938(taskId); + debug_sub_80129F8(taskId); + break; + case 3: + debug_sub_8012B70(taskId, 0); + break; + } + } + else if (gMain.newAndRepeatedKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + switch (gTasks[taskId].data[2]) + { + case 0: + if (gUnknown_Debug_2023B62[gCurrentMove - 1] > 0) + { + gUnknown_Debug_2023B62[gCurrentMove - 1] -= 1; + debug_sub_8012938(taskId); + } + break; + case 1: + debug_sub_8012AC0(-1, taskId); + break; + case 2: + if (gCurrentMove > 1) + gCurrentMove--; + else + gCurrentMove = 411; + debug_sub_80128B4(); + debug_sub_8012938(taskId); + debug_sub_80129F8(taskId); + break; + case 3: + debug_sub_8012B70(taskId, 0); + break; + } + } + else if (gMain.newAndRepeatedKeys & R_BUTTON) + { + PlaySE(SE_SELECT); + switch (gTasks[taskId].data[2]) + { + case 0: + if (gUnknown_Debug_2023B62[gCurrentMove - 1] < 64) + { + gUnknown_Debug_2023B62[gCurrentMove - 1] += 8; + if (gUnknown_Debug_2023B62[gCurrentMove - 1] > 64) + gUnknown_Debug_2023B62[gCurrentMove - 1] = 64; + debug_sub_8012938(taskId); + } + break; + case 1: + debug_sub_8012AC0(1, taskId); + break; + case 2: + if (gCurrentMove + 10 < 412) + gCurrentMove += 10; + else + gCurrentMove -= 400; + debug_sub_80128B4(); + debug_sub_8012938(taskId); + debug_sub_80129F8(taskId); + break; + case 3: + debug_sub_8012B70(taskId, 0); + break; + } + } + else if (gMain.newAndRepeatedKeys & L_BUTTON) + { + PlaySE(SE_SELECT); + switch (gTasks[taskId].data[2]) + { + case 0: + if (gUnknown_Debug_2023B62[gCurrentMove - 1] > 0) + { + if (gUnknown_Debug_2023B62[gCurrentMove - 1] > 8) + gUnknown_Debug_2023B62[gCurrentMove - 1] -= 8; + else + gUnknown_Debug_2023B62[gCurrentMove - 1] = 0; + debug_sub_8012938(taskId); + } + break; + case 1: + debug_sub_8012AC0(-1, taskId); + break; + case 2: + if (gCurrentMove - 10 > 1) + gCurrentMove -= 10; + else + gCurrentMove += 400; + debug_sub_80128B4(); + debug_sub_8012938(taskId); + debug_sub_80129F8(taskId); + break; + case 3: + debug_sub_8012B70(taskId, 0); + break; + } + } + break; + case 2: + if (gMain.newKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + debug_sub_8012B4C(gTasks[taskId].data[3]); + gTasks[taskId].data[3] = 0; + debug_sub_8012B2C(0); + } + else if (gMain.newKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + debug_sub_8012B4C(gTasks[taskId].data[3]); + gTasks[taskId].data[3] = 1; + debug_sub_8012B2C(1); + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + debug_sub_8012C08(taskId, gTasks[taskId].data[3]); + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + asm(""); + debug_sub_8012B70(taskId, 1); + } + return; + case 3: + if (gMain.newKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + debug_sub_8012B4C(gTasks[taskId].data[3]); + gTasks[taskId].data[3] = 0; + debug_sub_8012B2C(0); + } + else if (gMain.newKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + debug_sub_8012B4C(gTasks[taskId].data[3]); + gTasks[taskId].data[3] = 1; + debug_sub_8012B2C(1); + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (gTasks[taskId].data[3] == 0) + debug_sub_80132C8(31, gUnknown_Debug_2023B62, 411); + debug_sub_8012B70(taskId, 1); + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + debug_sub_8012B70(taskId, 1); + } + break; + case 4: + if (gMain.newKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + debug_sub_8012B4C(gTasks[taskId].data[3]); + gTasks[taskId].data[3] = 0; + debug_sub_8012B2C(0); + } + else if (gMain.newKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + debug_sub_8012B4C(gTasks[taskId].data[3]); + gTasks[taskId].data[3] = 1; + debug_sub_8012B2C(1); + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (gTasks[taskId].data[3] == 0) + debug_sub_8013294(31, gUnknown_Debug_2023B62, 411); + debug_sub_8012B70(taskId, 1); + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + debug_sub_8012B70(taskId, 1); + } + break; + } +} + +u8 debug_sub_8013240(void) +{ + if (IdentifyFlash() == 0) + return 0; + else + return 1; +} + +u32 debug_sub_8013258(u16 sectorNum, u8 *data, u32 size) +{ + while (1) + { + if (ProgramFlashSectorAndVerify(sectorNum, data) != 0) + return 0; + if (size <= 0x1000) + break; + size -= 0x1000; + data += 0x1000; + sectorNum++; + } + return 1; +} + +u32 debug_sub_8013294(u8 sectorNum, void *data, u32 size) +{ + u32 result; + + if (debug_sub_8013240() != 0) + return 0; + m4aSoundVSyncOff(); + result = debug_sub_8013258(sectorNum, data, size); + m4aSoundVSyncOn(); + return result; +} + +void debug_sub_80132C8(u8 a, void *b, u32 c) +{ + if (debug_sub_8013240() == 0) + ReadFlash(a, 0, b, c); +} +#endif + void oac_poke_opponent(struct Sprite *sprite) { sprite->callback = sub_8010278; @@ -1497,12 +4733,68 @@ void sub_8010800(void) gBattleMainFunc = bc_8012FAC; } -void sub_8010824(void) +#if DEBUG +void debug_sub_80138CC(void) { - gBattleMainFunc(); + if (GetBankSide(gActiveBank) == 0) + { + switch (gSharedMem[0x160FD]) + { + case 0: + if (gBattleBankFunc[gActiveBank] == sub_802C098) + gSharedMem[0x160FD]++; + break; + case 1: + gMain.heldKeys = A_BUTTON; + gMain.newKeys = A_BUTTON; + gSharedMem[0x160FD]++; + gSharedMem[0x160FE] = 0x80; + break; + case 2: + gSharedMem[0x160FE]--; + if (gSharedMem[0x160FE] == 0) + { + gMain.heldKeys = A_BUTTON; + gMain.newKeys = A_BUTTON; + gSharedMem[0x160FD]++; + gSharedMem[0x160FE] = 0x80; + } + break; + case 3: + gSharedMem[0x160FE]--; + if (gSharedMem[0x160FE] == 0) + { + gMain.heldKeys = A_BUTTON; + gMain.newKeys = A_BUTTON; + gSharedMem[0x160FD]++; + } + break; + case 4: + gSharedMem[0x160FD] = 0; + break; + } + } +} +#endif - for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) - gBattleBankFunc[gActiveBank](); +void sub_8010824(void) +{ +#if DEBUG + if (gUnknown_02023A14_50 & 0x80) + { + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + debug_sub_80138CC(); + gBattleMainFunc(); + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + gBattleBankFunc[gActiveBank](); + } + else +#endif + { + gBattleMainFunc(); + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + gBattleBankFunc[gActiveBank](); + } } void sub_8010874(void) @@ -1522,11 +4814,11 @@ void sub_8010874(void) gDisableStructs[i].isFirstTurn= 2; gUnknown_02024C70[i] = 0; gLastUsedMove[i] = 0; - gMoveHitWith[i] = 0; - gUnknown_02024C44[i] = 0; + gLastLandedMoves[i] = 0; + gLastHitByType[i] = 0; gUnknown_02024C4C[i] = 0; gUnknown_02024C5C[i] = 0xFF; - gLockedMove[i] = 0; + gLockedMoves[i] = 0; gUnknown_02024C2C[i] = 0; eFlashFireArr.arr[i] = 0; } @@ -1534,7 +4826,7 @@ void sub_8010874(void) for (i = 0; i < 2; i++) { gSideAffecting[i] = 0; - MEMSET_ALT(&gSideTimer[i], 0, 12, j, r4); + MEMSET_ALT(&gSideTimers[i], 0, 12, j, r4); } gBankAttacker = 0; @@ -1605,9 +4897,13 @@ void sub_8010874(void) gBattleResults.pokeString2[i] = 0; gBattleResults.caughtNick[i] = 0; } +#if DEBUG + gSharedMem[0x1609E] = 0; + gSharedMem[0x1609F] = 0; +#endif } -void SwitchInClearStructs(void) +void SwitchInClearSetData(void) { struct DisableStruct sp0 = gDisableStructs[gActiveBank]; s32 i; @@ -1675,8 +4971,8 @@ void SwitchInClearStructs(void) gDisableStructs[gActiveBank].isFirstTurn= 2; gLastUsedMove[gActiveBank] = 0; - gMoveHitWith[gActiveBank] = 0; - gUnknown_02024C44[gActiveBank] = 0; + gLastLandedMoves[gActiveBank] = 0; + gLastHitByType[gActiveBank] = 0; gUnknown_02024C4C[gActiveBank] = 0; gUnknown_02024C2C[gActiveBank] = 0; gUnknown_02024C5C[gActiveBank] = 0xFF; @@ -1739,8 +5035,8 @@ void UndoEffectsAfterFainting(void) gDisableStructs[gActiveBank].isFirstTurn= 2; gLastUsedMove[gActiveBank] = 0; - gMoveHitWith[gActiveBank] = 0; - gUnknown_02024C44[gActiveBank] = 0; + gLastLandedMoves[gActiveBank] = 0; + gLastHitByType[gActiveBank] = 0; gUnknown_02024C4C[gActiveBank] = 0; gUnknown_02024C2C[gActiveBank] = 0; gUnknown_02024C5C[gActiveBank] = 0xFF; @@ -1787,7 +5083,7 @@ static void BattlePrepIntroSlide(void) { if (gBattleExecBuffer == 0) { - gActiveBank = GetBankByPlayerAI(0); + gActiveBank = GetBankByIdentity(0); EmitIntroSlide(0, gBattleTerrain); MarkBufferBankForExecution(gActiveBank); gBattleMainFunc = sub_8011384; @@ -1891,7 +5187,7 @@ void bc_801333C(void) hpStatus[i].status = GetMonData(&gEnemyParty[i], MON_DATA_STATUS); } } - gActiveBank = GetBankByPlayerAI(1); + gActiveBank = GetBankByIdentity(1); EmitDrawPartyStatusSummary(0, hpStatus, 0x80); MarkBufferBankForExecution(gActiveBank); @@ -1909,7 +5205,7 @@ void bc_801333C(void) hpStatus[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); } } - gActiveBank = GetBankByPlayerAI(0); + gActiveBank = GetBankByIdentity(0); EmitDrawPartyStatusSummary(0, hpStatus, 0x80); MarkBufferBankForExecution(gActiveBank); @@ -1944,7 +5240,7 @@ void bc_battle_begin_message(void) { if (gBattleExecBuffer == 0) { - gActiveBank = GetBankByPlayerAI(1); + gActiveBank = GetBankByIdentity(1); PrepareStringBattle(0, gActiveBank); gBattleMainFunc = sub_8011800; } @@ -1963,7 +5259,7 @@ void sub_8011800(void) { if (gBattleExecBuffer == 0) { - PrepareStringBattle(1, GetBankByPlayerAI(1)); + PrepareStringBattle(1, GetBankByIdentity(1)); gBattleMainFunc = sub_8011834; } } @@ -2015,7 +5311,7 @@ void sub_8011970(void) if (gBattleExecBuffer == 0) { if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) - PrepareStringBattle(1, GetBankByPlayerAI(0)); + PrepareStringBattle(1, GetBankByIdentity(0)); gBattleMainFunc = sub_80119B4; } } @@ -2075,13 +5371,13 @@ void BattleBeginFirstTurn(void) if (ewram16058 == 0) { for (i = 0; i < gNoOfAllBanks; i++) - gTurnOrder[i] = i; + gBanksByTurnOrder[i] = i; for (i = 0; i < gNoOfAllBanks - 1; i++) { for (j = i + 1; j < gNoOfAllBanks; j++) { - if (GetWhoStrikesFirst(gTurnOrder[i], gTurnOrder[j], 1) != 0) - sub_8012FBC(i, j); + if (GetWhoStrikesFirst(gBanksByTurnOrder[i], gBanksByTurnOrder[j], 1) != 0) + SwapTurnOrder(i, j); } } } @@ -2092,7 +5388,7 @@ void BattleBeginFirstTurn(void) } while (ewram16058 < gNoOfAllBanks) { - if (AbilityBattleEffects(0, gTurnOrder[ewram16058], 0, 0, 0) != 0) + if (AbilityBattleEffects(0, gBanksByTurnOrder[ewram16058], 0, 0, 0) != 0) r9++; ewram16058++; if (r9 != 0) @@ -2104,7 +5400,7 @@ void BattleBeginFirstTurn(void) return; while (ewram160F9 < gNoOfAllBanks) { - if (ItemBattleEffects(0, gTurnOrder[ewram160F9], 0) != 0) + if (ItemBattleEffects(0, gBanksByTurnOrder[ewram160F9], 0) != 0) r9++; ewram160F9++; if (r9 != 0) @@ -2123,7 +5419,7 @@ void BattleBeginFirstTurn(void) SpecialStatusesClear(); ewram160A6 = gAbsentBankFlags; gBattleMainFunc = sub_8012324; - sub_80156DC(); + ResetSentPokesToOpponentValue(); for (i = 0; i < 8; i++) gBattleCommunication[i] = 0; for (i = 0; i < gNoOfAllBanks; i++) @@ -2176,10 +5472,10 @@ void BattleTurnPassed(void) if (TurnBasedEffects() != 0) return; } - if (sub_80173A4() != 0) + if (HandleFaintedMonActions() != 0) return; ewram16059 = 0; - if (sub_80170DC() != 0) + if (HandleWishPerishSongOnTurnEnd() != 0) return; TurnValuesCleanUp(0); gHitMarker &= ~HITMARKER_NO_ATTACKSTRING; @@ -2195,8 +5491,8 @@ void BattleTurnPassed(void) gBattleCommunication[i] = 0; if (gBattleOutcome != 0) { - gFightStateTracker = 12; - gBattleMainFunc = sub_80138F0; + gCurrentActionFuncId = 12; + gBattleMainFunc = RunTurnActionsFunctions; return; } if (gBattleResults.battleTurnCounter < 0xFF) @@ -2319,8 +5615,8 @@ void sub_8012324(void) ewram16068arr(gActiveBank) = 6; if (!(gBattleTypeFlags & 0x40) && (r5 & 2) - && !(ewram160A6 & gBitTable[GetBankByPlayerAI(r5 ^ 2)]) - && gBattleCommunication[GetBankByPlayerAI(r5)] != 4) + && !(ewram160A6 & gBitTable[GetBankByIdentity(r5 ^ 2)]) + && gBattleCommunication[GetBankByIdentity(r5)] != 4) break; //_080123F8 if (ewram160A6 & gBitTable[gActiveBank]) @@ -2352,3 +5648,3329 @@ void sub_8012324(void) } } */ +__attribute__((naked)) +void sub_8012324(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x1C\n\ + ldr r0, _08012340 @ =gBattleCommunication\n\ + movs r1, 0\n\ + strb r1, [r0, 0x4]\n\ + ldr r0, _08012344 @ =gActiveBank\n\ + strb r1, [r0]\n\ + ldr r0, _08012348 @ =gNoOfAllBanks\n\ + bl _08012F74\n\ + .align 2, 0\n\ +_08012340: .4byte gBattleCommunication\n\ +_08012344: .4byte gActiveBank\n\ +_08012348: .4byte gNoOfAllBanks\n\ +_0801234C:\n\ + ldr r4, _08012374 @ =gActiveBank\n\ + ldrb r0, [r4]\n\ + bl GetBankIdentity\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + ldr r1, _08012378 @ =gBattleCommunication\n\ + ldrb r0, [r4]\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x6\n\ + bls _08012368\n\ + bl _08012F66\n\ +_08012368:\n\ + lsls r0, 2\n\ + ldr r1, _0801237C @ =_08012380\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ + .align 2, 0\n\ +_08012374: .4byte gActiveBank\n\ +_08012378: .4byte gBattleCommunication\n\ +_0801237C: .4byte _08012380\n\ + .align 2, 0\n\ +_08012380:\n\ + .4byte _0801239C\n\ + .4byte _080124C8\n\ + .4byte _08012A28\n\ + .4byte _08012DA8\n\ + .4byte _08012E50\n\ + .4byte _08012E94\n\ + .4byte _08012F38\n\ +_0801239C:\n\ + ldr r4, _08012434 @ =gSharedMem\n\ + ldr r0, _08012438 @ =gActiveBank\n\ + ldrb r0, [r0]\n\ + ldr r1, _0801243C @ =0x00016068\n\ + adds r0, r1\n\ + adds r0, r4\n\ + movs r1, 0x6\n\ + strb r1, [r0]\n\ + ldr r0, _08012440 @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + movs r0, 0x40\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _080123F8\n\ + movs r1, 0x2\n\ + movs r0, 0x2\n\ + ands r0, r5\n\ + cmp r0, 0\n\ + beq _080123F8\n\ + eors r5, r1\n\ + adds r0, r5, 0\n\ + bl GetBankByIdentity\n\ + ldr r2, _08012444 @ =0x000160a6\n\ + adds r1, r4, r2\n\ + ldrb r1, [r1]\n\ + ldr r2, _08012448 @ =gBitTable\n\ + lsls r0, 24\n\ + lsrs r0, 22\n\ + adds r0, r2\n\ + ldr r0, [r0]\n\ + ands r1, r0\n\ + cmp r1, 0\n\ + bne _080123F8\n\ + ldr r4, _0801244C @ =gBattleCommunication\n\ + adds r0, r5, 0\n\ + bl GetBankByIdentity\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + adds r0, r4\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x4\n\ + beq _080123F8\n\ + bl _08012F66\n\ +_080123F8:\n\ + ldr r0, _08012434 @ =gSharedMem\n\ + ldr r3, _08012444 @ =0x000160a6\n\ + adds r0, r3\n\ + ldrb r3, [r0]\n\ + ldr r1, _08012448 @ =gBitTable\n\ + ldr r4, _08012438 @ =gActiveBank\n\ + ldrb r2, [r4]\n\ + lsls r0, r2, 2\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + ands r3, r0\n\ + cmp r3, 0\n\ + beq _08012468\n\ + ldr r0, _08012450 @ =gActionForBanks\n\ + adds r0, r2, r0\n\ + movs r1, 0xD\n\ + strb r1, [r0]\n\ + ldr r0, _08012440 @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + movs r0, 0x40\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _08012454\n\ + ldr r0, _0801244C @ =gBattleCommunication\n\ + ldrb r1, [r4]\n\ + adds r1, r0\n\ + movs r0, 0x4\n\ + strb r0, [r1]\n\ + bl _08012F66\n\ + .align 2, 0\n\ +_08012434: .4byte gSharedMem\n\ +_08012438: .4byte gActiveBank\n\ +_0801243C: .4byte 0x00016068\n\ +_08012440: .4byte gBattleTypeFlags\n\ +_08012444: .4byte 0x000160a6\n\ +_08012448: .4byte gBitTable\n\ +_0801244C: .4byte gBattleCommunication\n\ +_08012450: .4byte gActionForBanks\n\ +_08012454:\n\ + ldr r0, _08012464 @ =gBattleCommunication\n\ + ldrb r1, [r4]\n\ + adds r1, r0\n\ + movs r0, 0x3\n\ + strb r0, [r1]\n\ + bl _08012F66\n\ + .align 2, 0\n\ +_08012464: .4byte gBattleCommunication\n\ +_08012468:\n\ + ldr r1, _0801249C @ =gBattleMons\n\ + movs r0, 0x58\n\ + muls r0, r2\n\ + adds r1, 0x50\n\ + adds r0, r1\n\ + ldr r1, [r0]\n\ + movs r0, 0x80\n\ + lsls r0, 5\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _08012488\n\ + movs r0, 0x80\n\ + lsls r0, 15\n\ + ands r1, r0\n\ + cmp r1, 0\n\ + beq _080124A8\n\ +_08012488:\n\ + ldr r0, _080124A0 @ =gActionForBanks\n\ + adds r0, r2, r0\n\ + strb r3, [r0]\n\ + ldr r1, _080124A4 @ =gBattleCommunication\n\ + ldrb r0, [r4]\n\ + adds r0, r1\n\ + movs r1, 0x3\n\ + strb r1, [r0]\n\ + bl _08012F66\n\ + .align 2, 0\n\ +_0801249C: .4byte gBattleMons\n\ +_080124A0: .4byte gActionForBanks\n\ +_080124A4: .4byte gBattleCommunication\n\ +_080124A8:\n\ + ldr r0, _080124C0 @ =gActionForBanks\n\ + ldrb r1, [r0]\n\ + ldr r0, _080124C4 @ =gBattleBufferB\n\ + ldrb r2, [r0, 0x1]\n\ + ldrb r0, [r0, 0x2]\n\ + lsls r0, 8\n\ + orrs r2, r0\n\ + movs r0, 0\n\ + bl Emitcmd18\n\ + bl _08012E32\n\ + .align 2, 0\n\ +_080124C0: .4byte gActionForBanks\n\ +_080124C4: .4byte gBattleBufferB\n\ +_080124C8:\n\ + ldr r4, _08012520 @ =gBattleExecBuffer\n\ + ldr r1, _08012524 @ =gBitTable\n\ + ldr r3, _08012528 @ =gActiveBank\n\ + ldrb r5, [r3]\n\ + lsls r0, r5, 2\n\ + adds r0, r1\n\ + ldr r2, [r0]\n\ + lsls r0, r2, 4\n\ + movs r1, 0xF0\n\ + lsls r1, 24\n\ + orrs r0, r1\n\ + orrs r0, r2\n\ + lsls r1, r2, 8\n\ + orrs r0, r1\n\ + lsls r2, 12\n\ + orrs r0, r2\n\ + ldr r1, [r4]\n\ + ands r1, r0\n\ + mov r8, r3\n\ + cmp r1, 0\n\ + beq _080124F6\n\ + bl _08012F66\n\ +_080124F6:\n\ + ldr r2, _0801252C @ =gActionForBanks\n\ + adds r2, r5, r2\n\ + ldr r1, _08012530 @ =gBattleBufferB\n\ + lsls r0, r5, 9\n\ + adds r1, 0x1\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + strb r0, [r2]\n\ + ldrb r0, [r3]\n\ + lsls r0, 9\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, 0xC\n\ + bls _08012514\n\ + b _08012968\n\ +_08012514:\n\ + lsls r0, 2\n\ + ldr r1, _08012534 @ =_08012538\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ + .align 2, 0\n\ +_08012520: .4byte gBattleExecBuffer\n\ +_08012524: .4byte gBitTable\n\ +_08012528: .4byte gActiveBank\n\ +_0801252C: .4byte gActionForBanks\n\ +_08012530: .4byte gBattleBufferB\n\ +_08012534: .4byte _08012538\n\ + .align 2, 0\n\ +_08012538:\n\ + .4byte _0801256C\n\ + .4byte _080126B4\n\ + .4byte _080126E0\n\ + .4byte _08012968\n\ + .4byte _08012968\n\ + .4byte _080128B0\n\ + .4byte _08012908\n\ + .4byte _08012968\n\ + .4byte _08012968\n\ + .4byte _08012968\n\ + .4byte _08012968\n\ + .4byte _08012968\n\ + .4byte _0801292C\n\ +_0801256C:\n\ + bl AreAllMovesUnusable\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080125D0\n\ + ldr r0, _080125B4 @ =gBattleCommunication\n\ + ldr r2, _080125B8 @ =gActiveBank\n\ + ldrb r1, [r2]\n\ + adds r1, r0\n\ + movs r4, 0\n\ + movs r0, 0x5\n\ + strb r0, [r1]\n\ + ldr r3, _080125BC @ =gSharedMem\n\ + ldrb r0, [r2]\n\ + ldr r1, _080125C0 @ =0x00016060\n\ + adds r0, r1\n\ + adds r0, r3\n\ + strb r4, [r0]\n\ + ldrb r0, [r2]\n\ + ldr r4, _080125C4 @ =0x00016094\n\ + adds r0, r4\n\ + adds r0, r3\n\ + movs r1, 0x3\n\ + strb r1, [r0]\n\ + ldrb r1, [r2]\n\ + ldr r0, _080125C8 @ =0x00016010\n\ + adds r2, r1, r0\n\ + adds r2, r3\n\ + ldr r0, _080125CC @ =gBattleBufferB\n\ + lsls r1, 9\n\ + adds r0, 0x3\n\ + adds r1, r0\n\ + ldrb r0, [r1]\n\ + strb r0, [r2]\n\ + bl _08012F90\n\ + .align 2, 0\n\ +_080125B4: .4byte gBattleCommunication\n\ +_080125B8: .4byte gActiveBank\n\ +_080125BC: .4byte gSharedMem\n\ +_080125C0: .4byte 0x00016060\n\ +_080125C4: .4byte 0x00016094\n\ +_080125C8: .4byte 0x00016010\n\ +_080125CC: .4byte gBattleBufferB\n\ +_080125D0:\n\ + ldr r1, _080125FC @ =gDisableStructs\n\ + ldr r5, _08012600 @ =gActiveBank\n\ + ldrb r4, [r5]\n\ + lsls r0, r4, 3\n\ + subs r0, r4\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldrh r2, [r0, 0x6]\n\ + cmp r2, 0\n\ + beq _0801260C\n\ + ldr r1, _08012604 @ =gChosenMovesByBanks\n\ + lsls r0, r4, 1\n\ + adds r0, r1\n\ + strh r2, [r0]\n\ + ldr r1, _08012608 @ =gBattleCommunication\n\ + ldrb r0, [r5]\n\ + adds r0, r1\n\ + movs r1, 0x3\n\ + strb r1, [r0]\n\ + bl _08012F90\n\ + .align 2, 0\n\ +_080125FC: .4byte gDisableStructs\n\ +_08012600: .4byte gActiveBank\n\ +_08012604: .4byte gChosenMovesByBanks\n\ +_08012608: .4byte gBattleCommunication\n\ +_0801260C:\n\ + add r2, sp, 0x4\n\ + ldr r3, _080126AC @ =gBattleMons\n\ + movs r1, 0x58\n\ + adds r0, r4, 0\n\ + muls r0, r1\n\ + adds r0, r3\n\ + ldrh r0, [r0]\n\ + strh r0, [r2, 0x10]\n\ + ldrb r0, [r5]\n\ + muls r0, r1\n\ + adds r0, r3\n\ + adds r0, 0x21\n\ + ldrb r0, [r0]\n\ + strb r0, [r2, 0x12]\n\ + ldrb r0, [r5]\n\ + muls r0, r1\n\ + adds r0, r3\n\ + adds r0, 0x22\n\ + ldrb r0, [r0]\n\ + strb r0, [r2, 0x13]\n\ + movs r4, 0\n\ + mov r1, sp\n\ + adds r1, 0xC\n\ + str r1, [sp, 0x18]\n\ + add r2, sp, 0x10\n\ + mov r10, r2\n\ + mov r8, r3\n\ + adds r7, r5, 0\n\ + movs r6, 0x58\n\ + movs r3, 0xC\n\ + add r3, r8\n\ + mov r9, r3\n\ + add r5, sp, 0x4\n\ +_0801264E:\n\ + lsls r2, r4, 1\n\ + ldrb r0, [r7]\n\ + muls r0, r6\n\ + adds r0, r2, r0\n\ + add r0, r9\n\ + ldrh r0, [r0]\n\ + strh r0, [r5]\n\ + ldr r0, [sp, 0x18]\n\ + adds r3, r0, r4\n\ + ldrb r0, [r7]\n\ + muls r0, r6\n\ + adds r0, r4, r0\n\ + mov r1, r8\n\ + adds r1, 0x24\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + strb r0, [r3]\n\ + ldrb r0, [r7]\n\ + adds r1, r0, 0\n\ + muls r1, r6\n\ + adds r2, r1\n\ + add r2, r9\n\ + ldrh r0, [r2]\n\ + add r1, r8\n\ + adds r1, 0x3B\n\ + ldrb r1, [r1]\n\ + lsls r2, r4, 24\n\ + lsrs r2, 24\n\ + bl CalculatePPWithBonus\n\ + mov r2, r10\n\ + adds r1, r2, r4\n\ + strb r0, [r1]\n\ + adds r5, 0x2\n\ + adds r4, 0x1\n\ + cmp r4, 0x3\n\ + ble _0801264E\n\ + ldr r0, _080126B0 @ =gBattleTypeFlags\n\ + ldrb r0, [r0]\n\ + movs r1, 0x1\n\ + ands r1, r0\n\ + movs r0, 0\n\ + movs r2, 0\n\ + add r3, sp, 0x4\n\ + bl Emitcmd20\n\ + b _0801289E\n\ + .align 2, 0\n\ +_080126AC: .4byte gBattleMons\n\ +_080126B0: .4byte gBattleTypeFlags\n\ +_080126B4:\n\ + ldr r0, _080126D0 @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + ldr r0, _080126D4 @ =0x00000902\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _080126C2\n\ + b _08012908\n\ +_080126C2:\n\ + ldr r1, _080126D8 @ =gUnknown_02024C1C\n\ + mov r3, r8\n\ + ldrb r0, [r3]\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldr r1, _080126DC @ =BattleScript_ActionSelectionItemsCantBeUsed\n\ + b _080129CC\n\ + .align 2, 0\n\ +_080126D0: .4byte gBattleTypeFlags\n\ +_080126D4: .4byte 0x00000902\n\ +_080126D8: .4byte gUnknown_02024C1C\n\ +_080126DC: .4byte BattleScript_ActionSelectionItemsCantBeUsed\n\ +_080126E0:\n\ + ldr r3, _08012738 @ =gSharedMem\n\ + ldr r5, _0801273C @ =gActiveBank\n\ + ldrb r0, [r5]\n\ + ldr r4, _08012740 @ =0x00016064\n\ + adds r1, r0, r4\n\ + adds r1, r3\n\ + ldr r2, _08012744 @ =gBattlePartyID\n\ + lsls r0, 1\n\ + adds r0, r2\n\ + ldrh r0, [r0]\n\ + strb r0, [r1]\n\ + ldr r7, _08012748 @ =gBattleMons\n\ + ldrb r2, [r5]\n\ + movs r6, 0x58\n\ + adds r0, r2, 0\n\ + muls r0, r6\n\ + adds r1, r7, 0\n\ + adds r1, 0x50\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + ldr r1, _0801274C @ =0x0400e000\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _08012722\n\ + ldr r0, _08012750 @ =gStatuses3\n\ + lsls r1, r2, 2\n\ + adds r1, r0\n\ + ldr r1, [r1]\n\ + movs r0, 0x80\n\ + lsls r0, 3\n\ + ands r1, r0\n\ + cmp r1, 0\n\ + beq _08012758\n\ +_08012722:\n\ + lsls r0, r2, 1\n\ + adds r0, r2\n\ + ldr r2, _08012754 @ =0x0001606c\n\ + adds r1, r3, r2\n\ + adds r0, r1\n\ + str r0, [sp]\n\ + movs r0, 0\n\ + movs r1, 0x2\n\ + movs r2, 0x6\n\ + b _0801286C\n\ + .align 2, 0\n\ +_08012738: .4byte gSharedMem\n\ +_0801273C: .4byte gActiveBank\n\ +_08012740: .4byte 0x00016064\n\ +_08012744: .4byte gBattlePartyID\n\ +_08012748: .4byte gBattleMons\n\ +_0801274C: .4byte 0x0400e000\n\ +_08012750: .4byte gStatuses3\n\ +_08012754: .4byte 0x0001606c\n\ +_08012758:\n\ + str r1, [sp]\n\ + movs r0, 0xC\n\ + adds r1, r2, 0\n\ + movs r2, 0x17\n\ + movs r3, 0\n\ + bl AbilityBattleEffects\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + cmp r4, 0\n\ + bne _080127E0\n\ + ldrb r1, [r5]\n\ + str r4, [sp]\n\ + movs r0, 0xC\n\ + movs r2, 0x47\n\ + movs r3, 0\n\ + bl AbilityBattleEffects\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + cmp r4, 0\n\ + beq _080127A8\n\ + ldrb r0, [r5]\n\ + muls r0, r6\n\ + adds r1, r0, r7\n\ + adds r0, r1, 0\n\ + adds r0, 0x21\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x2\n\ + beq _080127A8\n\ + adds r0, r1, 0\n\ + adds r0, 0x22\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x2\n\ + beq _080127A8\n\ + adds r0, r1, 0\n\ + adds r0, 0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x1A\n\ + bne _080127E0\n\ +_080127A8:\n\ + ldr r5, _08012808 @ =gActiveBank\n\ + ldrb r1, [r5]\n\ + movs r0, 0\n\ + str r0, [sp]\n\ + movs r0, 0xF\n\ + movs r2, 0x2A\n\ + movs r3, 0\n\ + bl AbilityBattleEffects\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + cmp r4, 0\n\ + beq _08012818\n\ + ldr r2, _0801280C @ =gBattleMons\n\ + ldrb r1, [r5]\n\ + movs r0, 0x58\n\ + muls r0, r1\n\ + adds r1, r0, r2\n\ + adds r0, r1, 0\n\ + adds r0, 0x21\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x8\n\ + beq _080127E0\n\ + adds r0, r1, 0\n\ + adds r0, 0x22\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x8\n\ + bne _08012818\n\ +_080127E0:\n\ + subs r1, r4, 0x1\n\ + lsls r1, 4\n\ + movs r0, 0x4\n\ + orrs r1, r0\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + ldr r0, _08012810 @ =gLastUsedAbility\n\ + ldrb r3, [r0]\n\ + ldr r0, _08012808 @ =gActiveBank\n\ + ldrb r2, [r0]\n\ + lsls r0, r2, 1\n\ + adds r0, r2\n\ + ldr r2, _08012814 @ =gSharedMem + 0x1606C\n\ + adds r0, r2\n\ + str r0, [sp]\n\ + movs r0, 0\n\ + movs r2, 0x6\n\ + bl EmitChoosePokemon\n\ + b _0801289E\n\ + .align 2, 0\n\ +_08012808: .4byte gActiveBank\n\ +_0801280C: .4byte gBattleMons\n\ +_08012810: .4byte gLastUsedAbility\n\ +_08012814: .4byte gSharedMem + 0x1606C\n\ +_08012818:\n\ + ldr r0, _08012830 @ =gActiveBank\n\ + ldrb r1, [r0]\n\ + mov r8, r0\n\ + cmp r1, 0x2\n\ + bne _08012840\n\ + ldr r0, _08012834 @ =gActionForBanks\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x2\n\ + bne _08012840\n\ + ldr r3, _08012838 @ =gSharedMem\n\ + ldr r4, _0801283C @ =0x00016068\n\ + b _08012854\n\ + .align 2, 0\n\ +_08012830: .4byte gActiveBank\n\ +_08012834: .4byte gActionForBanks\n\ +_08012838: .4byte gSharedMem\n\ +_0801283C: .4byte 0x00016068\n\ +_08012840:\n\ + mov r2, r8\n\ + ldrb r0, [r2]\n\ + cmp r0, 0x3\n\ + bne _08012884\n\ + ldr r0, _08012874 @ =gActionForBanks\n\ + ldrb r0, [r0, 0x1]\n\ + cmp r0, 0x2\n\ + bne _08012884\n\ + ldr r3, _08012878 @ =gSharedMem\n\ + ldr r4, _0801287C @ =0x00016069\n\ +_08012854:\n\ + adds r0, r3, r4\n\ + ldrb r2, [r0]\n\ + mov r0, r8\n\ + ldrb r1, [r0]\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + ldr r1, _08012880 @ =0x0001606c\n\ + adds r3, r1\n\ + adds r0, r3\n\ + str r0, [sp]\n\ + movs r0, 0\n\ + movs r1, 0\n\ +_0801286C:\n\ + movs r3, 0\n\ + bl EmitChoosePokemon\n\ + b _0801289E\n\ + .align 2, 0\n\ +_08012874: .4byte gActionForBanks\n\ +_08012878: .4byte gSharedMem\n\ +_0801287C: .4byte 0x00016069\n\ +_08012880: .4byte 0x0001606c\n\ +_08012884:\n\ + ldr r0, _080128A8 @ =gActiveBank\n\ + ldrb r1, [r0]\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + ldr r1, _080128AC @ =gSharedMem + 0x1606C\n\ + adds r0, r1\n\ + str r0, [sp]\n\ + movs r0, 0\n\ + movs r1, 0\n\ + movs r2, 0x6\n\ + movs r3, 0\n\ + bl EmitChoosePokemon\n\ +_0801289E:\n\ + ldr r0, _080128A8 @ =gActiveBank\n\ + ldrb r0, [r0]\n\ + bl MarkBufferBankForExecution\n\ + b _08012968\n\ + .align 2, 0\n\ +_080128A8: .4byte gActiveBank\n\ +_080128AC: .4byte gSharedMem + 0x1606C\n\ +_080128B0:\n\ + bl PlayerPartyAndPokemonStorageFull\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _08012968\n\ + ldr r1, _080128EC @ =gUnknown_02024C1C\n\ + ldr r2, _080128F0 @ =gActiveBank\n\ + ldrb r0, [r2]\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldr r1, _080128F4 @ =BattleScript_PrintFullBox\n\ + str r1, [r0]\n\ + ldr r0, _080128F8 @ =gBattleCommunication\n\ + ldrb r1, [r2]\n\ + adds r1, r0\n\ + movs r3, 0\n\ + movs r0, 0x5\n\ + strb r0, [r1]\n\ + ldr r1, _080128FC @ =gSharedMem\n\ + ldrb r0, [r2]\n\ + ldr r4, _08012900 @ =0x00016060\n\ + adds r0, r4\n\ + adds r0, r1\n\ + strb r3, [r0]\n\ + ldrb r0, [r2]\n\ + ldr r2, _08012904 @ =0x00016094\n\ + adds r0, r2\n\ + adds r0, r1\n\ + strb r3, [r0]\n\ + b _08012F90\n\ + .align 2, 0\n\ +_080128EC: .4byte gUnknown_02024C1C\n\ +_080128F0: .4byte gActiveBank\n\ +_080128F4: .4byte BattleScript_PrintFullBox\n\ +_080128F8: .4byte gBattleCommunication\n\ +_080128FC: .4byte gSharedMem\n\ +_08012900: .4byte 0x00016060\n\ +_08012904: .4byte 0x00016094\n\ +_08012908:\n\ + ldr r4, _08012924 @ =gActiveBank\n\ + ldrb r0, [r4]\n\ + lsls r1, r0, 1\n\ + adds r1, r0\n\ + ldr r0, _08012928 @ =gSharedMem + 0x1606C\n\ + adds r1, r0\n\ + movs r0, 0\n\ + bl EmitOpenBag\n\ + ldrb r0, [r4]\n\ + bl MarkBufferBankForExecution\n\ + b _08012968\n\ + .align 2, 0\n\ +_08012924: .4byte gActiveBank\n\ +_08012928: .4byte gSharedMem + 0x1606C\n\ +_0801292C:\n\ + ldr r4, _08012964 @ =gBattleCommunication\n\ + mov r3, r8\n\ + ldrb r1, [r3]\n\ + adds r1, r4\n\ + movs r5, 0\n\ + movs r0, 0x6\n\ + strb r0, [r1]\n\ + ldrb r0, [r3]\n\ + bl GetBankIdentity\n\ + movs r1, 0x2\n\ + eors r0, r1\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + bl GetBankByIdentity\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + adds r0, r4\n\ + strb r5, [r0]\n\ + movs r0, 0\n\ + bl Emitcmd50\n\ + mov r4, r8\n\ + ldrb r0, [r4]\n\ + bl MarkBufferBankForExecution\n\ + b _08012F90\n\ + .align 2, 0\n\ +_08012964: .4byte gBattleCommunication\n\ +_08012968:\n\ + ldr r0, _08012994 @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + movs r0, 0xA\n\ + ands r0, r1\n\ + cmp r0, 0x8\n\ + bne _080129A8\n\ + ldr r0, _08012998 @ =gBattleBufferB\n\ + ldr r4, _0801299C @ =gActiveBank\n\ + ldrb r1, [r4]\n\ + lsls r1, 9\n\ + adds r0, 0x1\n\ + adds r1, r0\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x3\n\ + bne _080129A8\n\ + ldr r0, _080129A0 @ =BattleScript_PrintCantRunFromTrainer\n\ + bl BattleScriptExecute\n\ + ldr r1, _080129A4 @ =gBattleCommunication\n\ + ldrb r0, [r4]\n\ + adds r0, r1\n\ + b _08012BFE\n\ + .align 2, 0\n\ +_08012994: .4byte gBattleTypeFlags\n\ +_08012998: .4byte gBattleBufferB\n\ +_0801299C: .4byte gActiveBank\n\ +_080129A0: .4byte BattleScript_PrintCantRunFromTrainer\n\ +_080129A4: .4byte gBattleCommunication\n\ +_080129A8:\n\ + bl CanRunFromBattle\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _08012A14\n\ + ldr r0, _080129F4 @ =gBattleBufferB\n\ + ldr r3, _080129F8 @ =gActiveBank\n\ + ldrb r2, [r3]\n\ + lsls r1, r2, 9\n\ + adds r0, 0x1\n\ + adds r1, r0\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x3\n\ + bne _08012A14\n\ + ldr r1, _080129FC @ =gUnknown_02024C1C\n\ + lsls r0, r2, 2\n\ + adds r0, r1\n\ + ldr r1, _08012A00 @ =BattleScript_PrintCantEscapeFromBattle\n\ +_080129CC:\n\ + str r1, [r0]\n\ + ldr r0, _08012A04 @ =gBattleCommunication\n\ + ldrb r1, [r3]\n\ + adds r1, r0\n\ + movs r2, 0\n\ + movs r0, 0x5\n\ + strb r0, [r1]\n\ + ldr r1, _08012A08 @ =gSharedMem\n\ + ldrb r0, [r3]\n\ + ldr r4, _08012A0C @ =0x00016060\n\ + adds r0, r4\n\ + adds r0, r1\n\ + strb r2, [r0]\n\ + ldrb r0, [r3]\n\ + ldr r3, _08012A10 @ =0x00016094\n\ + adds r0, r3\n\ + adds r0, r1\n\ + strb r2, [r0]\n\ + b _08012F90\n\ + .align 2, 0\n\ +_080129F4: .4byte gBattleBufferB\n\ +_080129F8: .4byte gActiveBank\n\ +_080129FC: .4byte gUnknown_02024C1C\n\ +_08012A00: .4byte BattleScript_PrintCantEscapeFromBattle\n\ +_08012A04: .4byte gBattleCommunication\n\ +_08012A08: .4byte gSharedMem\n\ +_08012A0C: .4byte 0x00016060\n\ +_08012A10: .4byte 0x00016094\n\ +_08012A14:\n\ + ldr r2, _08012A20 @ =gBattleCommunication\n\ + ldr r0, _08012A24 @ =gActiveBank\n\ + ldrb r1, [r0]\n\ + adds r1, r2\n\ + b _08012E3E\n\ + .align 2, 0\n\ +_08012A20: .4byte gBattleCommunication\n\ +_08012A24: .4byte gActiveBank\n\ +_08012A28:\n\ + ldr r4, _08012A6C @ =gBattleExecBuffer\n\ + ldr r1, _08012A70 @ =gBitTable\n\ + ldr r3, _08012A74 @ =gActiveBank\n\ + ldrb r5, [r3]\n\ + lsls r0, r5, 2\n\ + adds r0, r1\n\ + ldr r2, [r0]\n\ + lsls r0, r2, 4\n\ + movs r1, 0xF0\n\ + lsls r1, 24\n\ + orrs r0, r1\n\ + orrs r0, r2\n\ + lsls r1, r2, 8\n\ + orrs r0, r1\n\ + lsls r2, 12\n\ + orrs r0, r2\n\ + ldr r1, [r4]\n\ + ands r1, r0\n\ + mov r8, r3\n\ + cmp r1, 0\n\ + beq _08012A54\n\ + b _08012F66\n\ +_08012A54:\n\ + ldr r1, _08012A78 @ =gActionForBanks\n\ + adds r0, r5, r1\n\ + ldrb r0, [r0]\n\ + adds r3, r1, 0\n\ + cmp r0, 0x9\n\ + bls _08012A62\n\ + b _08012F66\n\ +_08012A62:\n\ + lsls r0, 2\n\ + ldr r1, _08012A7C @ =_08012A80\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ + .align 2, 0\n\ +_08012A6C: .4byte gBattleExecBuffer\n\ +_08012A70: .4byte gBitTable\n\ +_08012A74: .4byte gActiveBank\n\ +_08012A78: .4byte gActionForBanks\n\ +_08012A7C: .4byte _08012A80\n\ + .align 2, 0\n\ +_08012A80:\n\ + .4byte _08012AA8\n\ + .4byte _08012BB0\n\ + .4byte _08012BE8\n\ + .4byte _08012CE0\n\ + .4byte _08012D04\n\ + .4byte _08012D18\n\ + .4byte _08012D2C\n\ + .4byte _08012D5C\n\ + .4byte _08012D70\n\ + .4byte _08012D94\n\ +_08012AA8:\n\ + ldr r0, _08012AC8 @ =gBattleBufferB\n\ + mov r1, r8\n\ + ldrb r4, [r1]\n\ + lsls r1, r4, 9\n\ + adds r2, r0, 0x1\n\ + adds r1, r2\n\ + ldrb r1, [r1]\n\ + adds r6, r0, 0\n\ + cmp r1, 0x9\n\ + bgt _08012ACC\n\ + cmp r1, 0x3\n\ + blt _08012ACC\n\ + adds r0, r4, r3\n\ + strb r1, [r0]\n\ + b _08012F90\n\ + .align 2, 0\n\ +_08012AC8: .4byte gBattleBufferB\n\ +_08012ACC:\n\ + adds r3, r6, 0\n\ + mov r5, r8\n\ + ldrb r4, [r5]\n\ + lsls r1, r4, 9\n\ + adds r7, r3, 0x2\n\ + adds r0, r1, r7\n\ + ldrb r2, [r0]\n\ + adds r3, 0x3\n\ + mov r9, r3\n\ + add r1, r9\n\ + ldrb r0, [r1]\n\ + lsls r0, 8\n\ + orrs r2, r0\n\ + ldr r0, _08012AF4 @ =0x0000ffff\n\ + cmp r2, r0\n\ + bne _08012AFC\n\ + ldr r0, _08012AF8 @ =gBattleCommunication\n\ + adds r0, r4, r0\n\ + b _08012BFE\n\ + .align 2, 0\n\ +_08012AF4: .4byte 0x0000ffff\n\ +_08012AF8: .4byte gBattleCommunication\n\ +_08012AFC:\n\ + bl TrySetCantSelectMoveBattleScript\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _08012B48\n\ + ldr r0, _08012B38 @ =gBattleCommunication\n\ + ldrb r1, [r5]\n\ + adds r1, r0\n\ + movs r2, 0\n\ + movs r0, 0x5\n\ + strb r0, [r1]\n\ + ldr r3, _08012B3C @ =gSharedMem\n\ + ldrb r0, [r5]\n\ + ldr r4, _08012B40 @ =0x00016060\n\ + adds r0, r4\n\ + adds r0, r3\n\ + strb r2, [r0]\n\ + ldrb r0, [r5]\n\ + lsls r0, 9\n\ + adds r1, r6, 0x1\n\ + adds r0, r1\n\ + strb r2, [r0]\n\ + ldrb r0, [r5]\n\ + ldr r1, _08012B44 @ =0x00016094\n\ + adds r0, r1\n\ + adds r0, r3\n\ + movs r1, 0x1\n\ + strb r1, [r0]\n\ + b _08012F90\n\ + .align 2, 0\n\ +_08012B38: .4byte gBattleCommunication\n\ +_08012B3C: .4byte gSharedMem\n\ +_08012B40: .4byte 0x00016060\n\ +_08012B44: .4byte 0x00016094\n\ +_08012B48:\n\ + ldr r6, _08012B98 @ =gSharedMem\n\ + mov r2, r8\n\ + ldrb r0, [r2]\n\ + ldr r2, _08012B9C @ =0x0001608c\n\ + adds r1, r0, r2\n\ + adds r1, r6\n\ + lsls r0, 9\n\ + adds r0, r7\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ + ldr r0, _08012BA0 @ =gChosenMovesByBanks\n\ + mov r4, r8\n\ + ldrb r3, [r4]\n\ + lsls r5, r3, 1\n\ + adds r5, r0\n\ + ldr r4, _08012BA4 @ =gBattleMons\n\ + adds r2, r3, r2\n\ + adds r2, r6\n\ + ldrb r0, [r2]\n\ + lsls r0, 1\n\ + movs r1, 0x58\n\ + muls r1, r3\n\ + adds r0, r1\n\ + adds r4, 0xC\n\ + adds r0, r4\n\ + ldrh r0, [r0]\n\ + strh r0, [r5]\n\ + mov r1, r8\n\ + ldrb r0, [r1]\n\ + ldr r2, _08012BA8 @ =0x00016010\n\ + adds r1, r0, r2\n\ + adds r1, r6\n\ + lsls r0, 9\n\ + add r0, r9\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ + ldr r0, _08012BAC @ =gBattleCommunication\n\ + mov r3, r8\n\ + ldrb r1, [r3]\n\ + b _08012E3C\n\ + .align 2, 0\n\ +_08012B98: .4byte gSharedMem\n\ +_08012B9C: .4byte 0x0001608c\n\ +_08012BA0: .4byte gChosenMovesByBanks\n\ +_08012BA4: .4byte gBattleMons\n\ +_08012BA8: .4byte 0x00016010\n\ +_08012BAC: .4byte gBattleCommunication\n\ +_08012BB0:\n\ + ldr r2, _08012BD8 @ =gBattleBufferB\n\ + ldr r5, _08012BDC @ =gActiveBank\n\ + ldrb r4, [r5]\n\ + lsls r1, r4, 9\n\ + adds r0, r2, 0x1\n\ + adds r0, r1, r0\n\ + ldrb r3, [r0]\n\ + adds r2, 0x2\n\ + adds r1, r2\n\ + ldrb r0, [r1]\n\ + lsls r0, 8\n\ + orrs r3, r0\n\ + cmp r3, 0\n\ + bne _08012BCE\n\ + b _08012F60\n\ +_08012BCE:\n\ + ldr r0, _08012BE0 @ =gLastUsedItem\n\ + strh r3, [r0]\n\ + ldr r0, _08012BE4 @ =gBattleCommunication\n\ + ldrb r1, [r5]\n\ + b _08012E3C\n\ + .align 2, 0\n\ +_08012BD8: .4byte gBattleBufferB\n\ +_08012BDC: .4byte gActiveBank\n\ +_08012BE0: .4byte gLastUsedItem\n\ +_08012BE4: .4byte gBattleCommunication\n\ +_08012BE8:\n\ + ldr r4, _08012C04 @ =gBattleBufferB\n\ + ldr r7, _08012C08 @ =gActiveBank\n\ + ldrb r2, [r7]\n\ + lsls r0, r2, 9\n\ + adds r1, r4, 0x1\n\ + adds r0, r1\n\ + ldrb r1, [r0]\n\ + cmp r1, 0x6\n\ + bne _08012C10\n\ + ldr r0, _08012C0C @ =gBattleCommunication\n\ + adds r0, r2, r0\n\ +_08012BFE:\n\ + movs r1, 0\n\ + strb r1, [r0]\n\ + b _08012F66\n\ + .align 2, 0\n\ +_08012C04: .4byte gBattleBufferB\n\ +_08012C08: .4byte gActiveBank\n\ +_08012C0C: .4byte gBattleCommunication\n\ +_08012C10:\n\ + ldr r0, _08012CC4 @ =gSharedMem\n\ + mov r12, r0\n\ + ldr r3, _08012CC8 @ =0x00016068\n\ + adds r0, r2, r3\n\ + add r0, r12\n\ + strb r1, [r0]\n\ + ldr r0, _08012CCC @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + movs r0, 0x40\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08012CBE\n\ + ldrb r0, [r7]\n\ + lsls r1, r0, 1\n\ + adds r1, r0\n\ + ldr r5, _08012CD0 @ =0x0001606c\n\ + adds r1, r5\n\ + add r1, r12\n\ + ldrb r2, [r1]\n\ + movs r0, 0xF\n\ + ands r0, r2\n\ + strb r0, [r1]\n\ + ldrb r0, [r7]\n\ + lsls r2, r0, 1\n\ + adds r2, r0\n\ + adds r2, r5\n\ + add r2, r12\n\ + lsls r0, 9\n\ + adds r6, r4, 0x2\n\ + adds r0, r6\n\ + ldrb r1, [r0]\n\ + movs r3, 0xF0\n\ + adds r0, r3, 0\n\ + ands r0, r1\n\ + ldrb r1, [r2]\n\ + orrs r0, r1\n\ + strb r0, [r2]\n\ + ldrb r0, [r7]\n\ + lsls r1, r0, 1\n\ + adds r1, r0\n\ + ldr r2, _08012CD4 @ =0x0001606d\n\ + adds r1, r2\n\ + add r1, r12\n\ + lsls r0, 9\n\ + adds r4, 0x3\n\ + mov r8, r4\n\ + add r0, r8\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ + ldrb r0, [r7]\n\ + movs r4, 0x2\n\ + eors r0, r4\n\ + lsls r1, r0, 1\n\ + adds r1, r0\n\ + adds r1, r5\n\ + add r1, r12\n\ + ldrb r2, [r1]\n\ + adds r0, r3, 0\n\ + ands r0, r2\n\ + strb r0, [r1]\n\ + ldrb r0, [r7]\n\ + eors r0, r4\n\ + lsls r1, r0, 1\n\ + adds r1, r0\n\ + adds r1, r5\n\ + add r1, r12\n\ + ldrb r0, [r7]\n\ + lsls r0, 9\n\ + adds r0, r6\n\ + ldrb r0, [r0]\n\ + ands r3, r0\n\ + lsrs r3, 4\n\ + ldrb r0, [r1]\n\ + orrs r3, r0\n\ + strb r3, [r1]\n\ + ldrb r0, [r7]\n\ + eors r4, r0\n\ + lsls r1, r4, 1\n\ + adds r1, r4\n\ + ldr r3, _08012CD8 @ =0x0001606e\n\ + adds r1, r3\n\ + add r1, r12\n\ + ldrb r0, [r7]\n\ + lsls r0, 9\n\ + add r0, r8\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ +_08012CBE:\n\ + ldr r0, _08012CDC @ =gBattleCommunication\n\ + ldrb r1, [r7]\n\ + b _08012E3C\n\ + .align 2, 0\n\ +_08012CC4: .4byte gSharedMem\n\ +_08012CC8: .4byte 0x00016068\n\ +_08012CCC: .4byte gBattleTypeFlags\n\ +_08012CD0: .4byte 0x0001606c\n\ +_08012CD4: .4byte 0x0001606d\n\ +_08012CD8: .4byte 0x0001606e\n\ +_08012CDC: .4byte gBattleCommunication\n\ +_08012CE0:\n\ + ldr r2, _08012CF8 @ =gHitMarker\n\ + ldr r0, [r2]\n\ + movs r1, 0x80\n\ + lsls r1, 8\n\ + orrs r0, r1\n\ + str r0, [r2]\n\ + ldr r2, _08012CFC @ =gBattleCommunication\n\ + ldr r0, _08012D00 @ =gActiveBank\n\ + ldrb r1, [r0]\n\ + adds r1, r2\n\ + b _08012E3E\n\ + .align 2, 0\n\ +_08012CF8: .4byte gHitMarker\n\ +_08012CFC: .4byte gBattleCommunication\n\ +_08012D00: .4byte gActiveBank\n\ +_08012D04:\n\ + ldr r2, _08012D10 @ =gBattleCommunication\n\ + ldr r0, _08012D14 @ =gActiveBank\n\ + ldrb r1, [r0]\n\ + adds r1, r2\n\ + b _08012E3E\n\ + .align 2, 0\n\ +_08012D10: .4byte gBattleCommunication\n\ +_08012D14: .4byte gActiveBank\n\ +_08012D18:\n\ + ldr r2, _08012D24 @ =gBattleCommunication\n\ + ldr r0, _08012D28 @ =gActiveBank\n\ + ldrb r1, [r0]\n\ + adds r1, r2\n\ + b _08012E3E\n\ + .align 2, 0\n\ +_08012D24: .4byte gBattleCommunication\n\ +_08012D28: .4byte gActiveBank\n\ +_08012D2C:\n\ + ldr r2, _08012D50 @ =gBattleBufferB\n\ + ldr r0, _08012D54 @ =gActiveBank\n\ + ldrb r4, [r0]\n\ + lsls r1, r4, 9\n\ + adds r0, r2, 0x1\n\ + adds r0, r1, r0\n\ + ldrb r3, [r0]\n\ + adds r2, 0x2\n\ + adds r1, r2\n\ + ldrb r0, [r1]\n\ + lsls r0, 8\n\ + orrs r3, r0\n\ + cmp r3, 0\n\ + bne _08012D4A\n\ + b _08012F60\n\ +_08012D4A:\n\ + ldr r1, _08012D58 @ =gBattleCommunication\n\ + adds r1, r4, r1\n\ + b _08012E3E\n\ + .align 2, 0\n\ +_08012D50: .4byte gBattleBufferB\n\ +_08012D54: .4byte gActiveBank\n\ +_08012D58: .4byte gBattleCommunication\n\ +_08012D5C:\n\ + ldr r2, _08012D68 @ =gBattleCommunication\n\ + ldr r0, _08012D6C @ =gActiveBank\n\ + ldrb r1, [r0]\n\ + adds r1, r2\n\ + b _08012E3E\n\ + .align 2, 0\n\ +_08012D68: .4byte gBattleCommunication\n\ +_08012D6C: .4byte gActiveBank\n\ +_08012D70:\n\ + ldr r2, _08012D88 @ =gHitMarker\n\ + ldr r0, [r2]\n\ + movs r1, 0x80\n\ + lsls r1, 8\n\ + orrs r0, r1\n\ + str r0, [r2]\n\ + ldr r2, _08012D8C @ =gBattleCommunication\n\ + ldr r0, _08012D90 @ =gActiveBank\n\ + ldrb r1, [r0]\n\ + adds r1, r2\n\ + b _08012E3E\n\ + .align 2, 0\n\ +_08012D88: .4byte gHitMarker\n\ +_08012D8C: .4byte gBattleCommunication\n\ +_08012D90: .4byte gActiveBank\n\ +_08012D94:\n\ + ldr r2, _08012DA0 @ =gBattleCommunication\n\ + ldr r0, _08012DA4 @ =gActiveBank\n\ + ldrb r1, [r0]\n\ + adds r1, r2\n\ + b _08012E3E\n\ + .align 2, 0\n\ +_08012DA0: .4byte gBattleCommunication\n\ +_08012DA4: .4byte gActiveBank\n\ +_08012DA8:\n\ + ldr r3, _08012E10 @ =gBattleExecBuffer\n\ + ldr r4, _08012E14 @ =gBitTable\n\ + ldr r0, _08012E18 @ =gActiveBank\n\ + ldrb r0, [r0]\n\ + lsls r0, 2\n\ + adds r0, r4\n\ + ldr r2, [r0]\n\ + lsls r1, r2, 4\n\ + movs r0, 0xF0\n\ + lsls r0, 24\n\ + orrs r1, r0\n\ + orrs r1, r2\n\ + lsls r0, r2, 8\n\ + orrs r1, r0\n\ + lsls r2, 12\n\ + orrs r1, r2\n\ + ldr r0, [r3]\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08012DD2\n\ + b _08012F66\n\ +_08012DD2:\n\ + ldr r0, _08012E1C @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + movs r0, 0x41\n\ + ands r0, r1\n\ + cmp r0, 0x1\n\ + bne _08012E06\n\ + movs r1, 0x2\n\ + movs r0, 0x2\n\ + ands r0, r5\n\ + cmp r0, 0\n\ + bne _08012E06\n\ + adds r0, r5, 0\n\ + eors r0, r1\n\ + bl GetBankByIdentity\n\ + ldr r1, _08012E20 @ =gSharedMem\n\ + ldr r2, _08012E24 @ =0x000160a6\n\ + adds r1, r2\n\ + ldrb r1, [r1]\n\ + lsls r0, 24\n\ + lsrs r0, 22\n\ + adds r0, r4\n\ + ldr r0, [r0]\n\ + ands r1, r0\n\ + cmp r1, 0\n\ + beq _08012E28\n\ +_08012E06:\n\ + movs r0, 0\n\ + movs r1, 0\n\ + bl EmitLinkStandbyMsg\n\ + b _08012E30\n\ + .align 2, 0\n\ +_08012E10: .4byte gBattleExecBuffer\n\ +_08012E14: .4byte gBitTable\n\ +_08012E18: .4byte gActiveBank\n\ +_08012E1C: .4byte gBattleTypeFlags\n\ +_08012E20: .4byte gSharedMem\n\ +_08012E24: .4byte 0x000160a6\n\ +_08012E28:\n\ + movs r0, 0\n\ + movs r1, 0x1\n\ + bl EmitLinkStandbyMsg\n\ +_08012E30:\n\ + ldr r4, _08012E48 @ =gActiveBank\n\ +_08012E32:\n\ + ldrb r0, [r4]\n\ + bl MarkBufferBankForExecution\n\ + ldr r0, _08012E4C @ =gBattleCommunication\n\ + ldrb r1, [r4]\n\ +_08012E3C:\n\ + adds r1, r0\n\ +_08012E3E:\n\ + ldrb r0, [r1]\n\ + adds r0, 0x1\n\ + strb r0, [r1]\n\ + b _08012F66\n\ + .align 2, 0\n\ +_08012E48: .4byte gActiveBank\n\ +_08012E4C: .4byte gBattleCommunication\n\ +_08012E50:\n\ + ldr r3, _08012E84 @ =gBattleExecBuffer\n\ + ldr r1, _08012E88 @ =gBitTable\n\ + ldr r0, _08012E8C @ =gActiveBank\n\ + ldrb r0, [r0]\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldr r2, [r0]\n\ + lsls r1, r2, 4\n\ + movs r0, 0xF0\n\ + lsls r0, 24\n\ + orrs r1, r0\n\ + orrs r1, r2\n\ + lsls r0, r2, 8\n\ + orrs r1, r0\n\ + lsls r2, 12\n\ + orrs r1, r2\n\ + ldr r0, [r3]\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _08012F66\n\ + ldr r1, _08012E90 @ =gBattleCommunication\n\ + ldrb r0, [r1, 0x4]\n\ + adds r0, 0x1\n\ + strb r0, [r1, 0x4]\n\ + b _08012F66\n\ + .align 2, 0\n\ +_08012E84: .4byte gBattleExecBuffer\n\ +_08012E88: .4byte gBitTable\n\ +_08012E8C: .4byte gActiveBank\n\ +_08012E90: .4byte gBattleCommunication\n\ +_08012E94:\n\ + ldr r2, _08012EB8 @ =gSharedMem\n\ + ldr r5, _08012EBC @ =gActiveBank\n\ + ldrb r1, [r5]\n\ + ldr r3, _08012EC0 @ =0x00016060\n\ + adds r0, r1, r3\n\ + adds r0, r2\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + beq _08012ECC\n\ + ldr r0, _08012EC4 @ =gBattleCommunication\n\ + adds r0, r1, r0\n\ + ldr r4, _08012EC8 @ =0x00016094\n\ + adds r1, r4\n\ + adds r1, r2\n\ + ldrb r1, [r1]\n\ + strb r1, [r0]\n\ + b _08012F66\n\ + .align 2, 0\n\ +_08012EB8: .4byte gSharedMem\n\ +_08012EBC: .4byte gActiveBank\n\ +_08012EC0: .4byte 0x00016060\n\ +_08012EC4: .4byte gBattleCommunication\n\ +_08012EC8: .4byte 0x00016094\n\ +_08012ECC:\n\ + ldr r0, _08012F20 @ =gBankAttacker\n\ + strb r1, [r0]\n\ + ldr r7, _08012F24 @ =gBattlescriptCurrInstr\n\ + ldr r6, _08012F28 @ =gUnknown_02024C1C\n\ + ldrb r0, [r5]\n\ + lsls r0, 2\n\ + adds r0, r6\n\ + ldr r4, [r0]\n\ + str r4, [r7]\n\ + ldr r3, _08012F2C @ =gBattleExecBuffer\n\ + ldr r1, _08012F30 @ =gBitTable\n\ + ldrb r0, [r5]\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldr r2, [r0]\n\ + lsls r1, r2, 4\n\ + movs r0, 0xF0\n\ + lsls r0, 24\n\ + orrs r1, r0\n\ + orrs r1, r2\n\ + lsls r0, r2, 8\n\ + orrs r1, r0\n\ + lsls r2, 12\n\ + orrs r1, r2\n\ + ldr r0, [r3]\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _08012F12\n\ + ldr r0, _08012F34 @ =gBattleScriptingCommandsTable\n\ + ldrb r1, [r4]\n\ + lsls r1, 2\n\ + adds r1, r0\n\ + ldr r0, [r1]\n\ + bl _call_via_r0\n\ +_08012F12:\n\ + ldrb r0, [r5]\n\ + lsls r0, 2\n\ + adds r0, r6\n\ + ldr r1, [r7]\n\ + str r1, [r0]\n\ + b _08012F66\n\ + .align 2, 0\n\ +_08012F20: .4byte gBankAttacker\n\ +_08012F24: .4byte gBattlescriptCurrInstr\n\ +_08012F28: .4byte gUnknown_02024C1C\n\ +_08012F2C: .4byte gBattleExecBuffer\n\ +_08012F30: .4byte gBitTable\n\ +_08012F34: .4byte gBattleScriptingCommandsTable\n\ +_08012F38:\n\ + ldr r3, _08012FA0 @ =gBattleExecBuffer\n\ + ldr r1, _08012FA4 @ =gBitTable\n\ + ldr r0, _08012FA8 @ =gActiveBank\n\ + ldrb r4, [r0]\n\ + lsls r0, r4, 2\n\ + adds r0, r1\n\ + ldr r2, [r0]\n\ + lsls r0, r2, 4\n\ + movs r1, 0xF0\n\ + lsls r1, 24\n\ + orrs r0, r1\n\ + orrs r0, r2\n\ + lsls r1, r2, 8\n\ + orrs r0, r1\n\ + lsls r2, 12\n\ + orrs r0, r2\n\ + ldr r3, [r3]\n\ + ands r3, r0\n\ + cmp r3, 0\n\ + bne _08012F66\n\ +_08012F60:\n\ + ldr r0, _08012FAC @ =gBattleCommunication\n\ + adds r0, r4, r0\n\ + strb r3, [r0]\n\ +_08012F66:\n\ + ldr r0, _08012FA8 @ =gActiveBank\n\ + ldrb r1, [r0]\n\ + adds r1, 0x1\n\ + strb r1, [r0]\n\ + ldr r0, _08012FB0 @ =gNoOfAllBanks\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ +_08012F74:\n\ + adds r2, r0, 0\n\ + ldrb r0, [r2]\n\ + cmp r1, r0\n\ + bcs _08012F80\n\ + bl _0801234C\n\ +_08012F80:\n\ + ldr r0, _08012FAC @ =gBattleCommunication\n\ + ldrb r0, [r0, 0x4]\n\ + ldrb r2, [r2]\n\ + cmp r0, r2\n\ + bne _08012F90\n\ + ldr r1, _08012FB4 @ =gBattleMainFunc\n\ + ldr r0, _08012FB8 @ =SetActionsAndBanksTurnOrder\n\ + str r0, [r1]\n\ +_08012F90:\n\ + add sp, 0x1C\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_08012FA0: .4byte gBattleExecBuffer\n\ +_08012FA4: .4byte gBitTable\n\ +_08012FA8: .4byte gActiveBank\n\ +_08012FAC: .4byte gBattleCommunication\n\ +_08012FB0: .4byte gNoOfAllBanks\n\ +_08012FB4: .4byte gBattleMainFunc\n\ +_08012FB8: .4byte SetActionsAndBanksTurnOrder\n\ + .syntax divided\n"); +} + +void SwapTurnOrder(u8 a, u8 b) +{ + int temp; + + temp = gActionsByTurnOrder[a]; + gActionsByTurnOrder[a] = gActionsByTurnOrder[b]; + gActionsByTurnOrder[b] = temp; + + temp = gBanksByTurnOrder[a]; + gBanksByTurnOrder[a] = gBanksByTurnOrder[b]; + gBanksByTurnOrder[b] = temp; +} + +// Determines which of the two given mons will strike first in a battle. +// Returns: +// 0 = first mon moves first +// 1 = second mon moves first +// 2 = second mon moves first because it won a 50/50 roll +u8 GetWhoStrikesFirst(u8 bank1, u8 bank2, bool8 ignoreMovePriorities) +{ + int bank1SpeedMultiplier, bank2SpeedMultiplier; + u32 bank1AdjustedSpeed, bank2AdjustedSpeed; + u8 heldItemEffect; + u8 heldItemEffectParam; + u16 bank1Move; + u16 bank2Move; + u8 strikesFirst = 0; + + // Check for abilities that boost speed in weather. + if (WEATHER_HAS_EFFECT) + { + if ((gBattleMons[bank1].ability == ABILITY_SWIFT_SWIM && (gBattleWeather & WEATHER_RAIN_ANY)) + || (gBattleMons[bank1].ability == ABILITY_CHLOROPHYLL && (gBattleWeather & WEATHER_SUN_ANY))) + bank1SpeedMultiplier = 2; + else + bank1SpeedMultiplier = 1; + + if ((gBattleMons[bank2].ability == ABILITY_SWIFT_SWIM && (gBattleWeather & WEATHER_RAIN_ANY)) + || (gBattleMons[bank2].ability == ABILITY_CHLOROPHYLL && (gBattleWeather & WEATHER_SUN_ANY))) + bank2SpeedMultiplier = 2; + else + bank2SpeedMultiplier = 1; + } + else + { + bank1SpeedMultiplier = 1; + bank2SpeedMultiplier = 1; + } + + // Calculate adjusted speed for first mon. + bank1AdjustedSpeed = (gBattleMons[bank1].speed * bank1SpeedMultiplier) + * gStatStageRatios[gBattleMons[bank1].statStages[STAT_STAGE_SPEED]][0] / gStatStageRatios[gBattleMons[bank1].statStages[STAT_STAGE_SPEED]][1]; + + if (gBattleMons[bank1].item == ITEM_ENIGMA_BERRY) + { + heldItemEffect = gEnigmaBerries[bank1].holdEffect; + heldItemEffectParam = gEnigmaBerries[bank1].holdEffectParam; + } + else + { + heldItemEffect = ItemId_GetHoldEffect(gBattleMons[bank1].item); + heldItemEffectParam = ItemId_GetHoldEffectParam(gBattleMons[bank1].item); + } + + // Only give badge speed boost to the player's mon. + if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) && FlagGet(FLAG_BADGE03_GET) && GetBankSide(bank1) == 0) + bank1AdjustedSpeed = (bank1AdjustedSpeed * 110) / 100; + + if (heldItemEffect == HOLD_EFFECT_MACHO_BRACE) + bank1AdjustedSpeed /= 2; + + if (gBattleMons[bank1].status1 & STATUS_PARALYSIS) + bank1AdjustedSpeed /= 4; + + if (heldItemEffect == HOLD_EFFECT_QUICK_CLAW && gRandomTurnNumber < (heldItemEffectParam * 0xFFFF) / 100) + bank1AdjustedSpeed = UINT_MAX; + + // Calculate adjusted speed for second mon. + bank2AdjustedSpeed = gBattleMons[bank2].speed * bank2SpeedMultiplier + * gStatStageRatios[gBattleMons[bank2].statStages[STAT_STAGE_SPEED]][0] / gStatStageRatios[gBattleMons[bank2].statStages[STAT_STAGE_SPEED]][1]; + + if (gBattleMons[bank2].item == ITEM_ENIGMA_BERRY) + { + heldItemEffect = gEnigmaBerries[bank2].holdEffect; + heldItemEffectParam = gEnigmaBerries[bank2].holdEffectParam; + } + else + { + heldItemEffect = ItemId_GetHoldEffect(gBattleMons[bank2].item); + heldItemEffectParam = ItemId_GetHoldEffectParam(gBattleMons[bank2].item); + } + + // Only give badge speed boost to the player's mon. + if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) && FlagGet(FLAG_BADGE03_GET) && GetBankSide(bank2) == 0) + { + bank2AdjustedSpeed = (bank2AdjustedSpeed * 110) / 100; + } + + if (heldItemEffect == HOLD_EFFECT_MACHO_BRACE) + bank2AdjustedSpeed /= 2; + + if (gBattleMons[bank2].status1 & STATUS_PARALYSIS) + bank2AdjustedSpeed /= 4; + + if (heldItemEffect == HOLD_EFFECT_QUICK_CLAW && gRandomTurnNumber < (heldItemEffectParam * 0xFFFF) / 100) + bank2AdjustedSpeed = UINT_MAX; + + if (ignoreMovePriorities) + { + bank1Move = MOVE_NONE; + bank2Move = MOVE_NONE; + } + else + { + if (gActionForBanks[bank1] == 0) + { + if (gProtectStructs[bank1].onlyStruggle) + bank1Move = MOVE_STRUGGLE; + else + bank1Move = gBattleMons[bank1].moves[ewram1608Carr(bank1)]; + } + else + bank1Move = MOVE_NONE; + + if (gActionForBanks[bank2] == 0) + { + if (gProtectStructs[bank2].onlyStruggle) + bank2Move = MOVE_STRUGGLE; + else + bank2Move = gBattleMons[bank2].moves[ewram1608Carr(bank2)]; + } + else + bank2Move = MOVE_NONE; + } + + if (gBattleMoves[bank1Move].priority != 0 || gBattleMoves[bank2Move].priority != 0) + { + if (gBattleMoves[bank1Move].priority == gBattleMoves[bank2Move].priority) + { + if (bank1AdjustedSpeed == bank2AdjustedSpeed && (Random() & 1)) + strikesFirst = 2; + else if (bank1AdjustedSpeed < bank2AdjustedSpeed) + strikesFirst = 1; + } + else if (gBattleMoves[bank1Move].priority < gBattleMoves[bank2Move].priority) + strikesFirst = 1; + } + else + { + if (bank1AdjustedSpeed == bank2AdjustedSpeed && (Random() & 1)) + strikesFirst = 2; + else if (bank1AdjustedSpeed < bank2AdjustedSpeed) + strikesFirst = 1; + } + + return strikesFirst; +} + +// The debug version should be identical, but has a strange register swap, and +// seems to be affected by other functions, which is bizarre. +#if DEBUG +__attribute__((naked)) +void SetActionsAndBanksTurnOrder(void) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + mov r7, sl\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5, r6, r7}\n\ + mov r3, #0x0\n\ + ldr r0, ._L1550\n\ + ldrh r1, [r0]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._L1499 @cond_branch\n\ + ldr r0, ._L1550+0x4\n\ + strb r3, [r0]\n\ + ldr r4, ._L1550+0x8\n\ + mov r8, r0\n\ + ldrb r0, [r4]\n\ + cmp r3, r0\n\ + bcc ._LCB12758\n\ + b ._L1505 @long jump\n\ +._LCB12758:\n\ + ldr r7, ._L1550+0xc\n\ + ldr r6, ._L1550+0x10\n\ + mov r2, r8\n\ + ldr r5, ._L1550+0x14\n\ +._L1503:\n\ + add r1, r3, r7\n\ + ldrb r0, [r2]\n\ + add r0, r0, r6\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ + add r1, r3, r5\n\ + ldrb r0, [r2]\n\ + strb r0, [r1]\n\ + add r3, r3, #0x1\n\ + ldrb r0, [r2]\n\ + add r0, r0, #0x1\n\ + strb r0, [r2]\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + ldrb r1, [r4]\n\ + cmp r0, r1\n\ + bcc ._L1503 @cond_branch\n\ + b ._L1505\n\ +._L1551:\n\ + .align 2, 0\n\ +._L1550:\n\ + .word gBattleTypeFlags\n\ + .word gActiveBank\n\ + .word gNoOfAllBanks\n\ + .word gActionsByTurnOrder\n\ + .word gActionForBanks\n\ + .word gBanksByTurnOrder\n\ +._L1499:\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._L1506 @cond_branch\n\ + ldr r0, ._L1552\n\ + strb r3, [r0]\n\ + ldr r1, ._L1552+0x4\n\ + mov r8, r0\n\ + add r2, r1, #0\n\ + ldrb r2, [r2]\n\ + cmp r3, r2\n\ + bcs ._L1513 @cond_branch\n\ + ldr r0, ._L1552+0x8\n\ + ldrb r1, [r0]\n\ + add r4, r0, #0\n\ + cmp r1, #0x3\n\ + beq ._L1548 @cond_branch\n\ +._L1509:\n\ + mov r7, r8\n\ + ldrb r0, [r7]\n\ + add r0, r0, #0x1\n\ + strb r0, [r7]\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + ldr r1, ._L1552+0x4\n\ + ldrb r1, [r1]\n\ + cmp r0, r1\n\ + bcs ._L1513 @cond_branch\n\ + ldrb r0, [r7]\n\ + add r0, r0, r4\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x3\n\ + bne ._L1509 @cond_branch\n\ + b ._L1548\n\ +._L1553:\n\ + .align 2, 0\n\ +._L1552:\n\ + .word gActiveBank\n\ + .word gNoOfAllBanks\n\ + .word gActionForBanks\n\ +._L1506:\n\ + ldr r0, ._L1554\n\ + ldrb r0, [r0]\n\ + ldr r2, ._L1554+0x4\n\ + mov r8, r2\n\ + cmp r0, #0x3\n\ + bne ._L1513 @cond_branch\n\ + strb r3, [r2]\n\ +._L1548:\n\ + mov r3, #0x5\n\ +._L1513:\n\ + cmp r3, #0x5\n\ + bne ._L1515 @cond_branch\n\ + ldr r6, ._L1554+0x8\n\ + ldr r1, ._L1554\n\ + mov r3, r8\n\ + ldrb r0, [r3]\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + strb r0, [r6]\n\ + ldr r2, ._L1554+0xc\n\ + ldrb r0, [r3]\n\ + strb r0, [r2]\n\ + mov r3, #0x1\n\ + mov r5, #0x0\n\ + add r4, r1, #0\n\ + ldr r7, ._L1554+0x10\n\ + mov r9, r7\n\ + ldr r0, ._L1554+0x14\n\ + mov ip, r0\n\ + ldr r1, ._L1554+0x18\n\ + mov sl, r1\n\ + ldr r7, ._L1554+0x1c\n\ + ldrb r7, [r7]\n\ + cmp r5, r7\n\ + bge ._L1517 @cond_branch\n\ + add r7, r6, #0\n\ + add r6, r4, #0\n\ + add r4, r2, #0\n\ + ldr r2, ._L1554+0x1c\n\ +._L1519:\n\ + mov r0, r8\n\ + ldrb r0, [r0]\n\ + cmp r5, r0\n\ + beq ._L1518 @cond_branch\n\ + add r1, r3, r7\n\ + add r0, r5, r6\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ + add r0, r3, r4\n\ + strb r5, [r0]\n\ + add r3, r3, #0x1\n\ +._L1518:\n\ + add r5, r5, #0x1\n\ + ldrb r1, [r2]\n\ + cmp r5, r1\n\ + blt ._L1519 @cond_branch\n\ +._L1517:\n\ + mov r2, ip\n\ + mov r3, r9\n\ + str r2, [r3]\n\ + ldr r1, ._L1554+0x20\n\ + add r1, r1, sl\n\ + mov r0, #0x0\n\ + strb r0, [r1]\n\ + b ._L1498\n\ +._L1555:\n\ + .align 2, 0\n\ +._L1554:\n\ + .word gActionForBanks\n\ + .word gActiveBank\n\ + .word gActionsByTurnOrder\n\ + .word gBanksByTurnOrder\n\ + .word gBattleMainFunc\n\ + .word CheckFocusPunch_ClearVarsBeforeTurnStarts\n\ + .word gSharedMem\n\ + .word gNoOfAllBanks\n\ + .word 0x1601d\n\ +._L1515:\n\ + mov r0, #0x0\n\ + mov r7, r8\n\ + strb r0, [r7]\n\ + ldr r1, ._L1556\n\ + ldrb r0, [r1]\n\ + cmp r0, #0\n\ + beq ._L1524 @cond_branch\n\ + ldr r6, ._L1556+0x4\n\ + mov r2, r8\n\ + ldr r5, ._L1556+0x8\n\ + ldr r4, ._L1556+0xc\n\ +._L1526:\n\ + ldrb r0, [r2]\n\ + add r0, r0, r6\n\ + ldrb r1, [r0]\n\ + sub r0, r1, #0x1\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x1\n\ + bhi ._L1525 @cond_branch\n\ + add r0, r3, r5\n\ + strb r1, [r0]\n\ + add r1, r3, r4\n\ + mov r7, r8\n\ + ldrb r0, [r7]\n\ + strb r0, [r1]\n\ + add r3, r3, #0x1\n\ +._L1525:\n\ + ldrb r0, [r2]\n\ + add r0, r0, #0x1\n\ + strb r0, [r2]\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + ldr r1, ._L1556\n\ + ldrb r1, [r1]\n\ + cmp r0, r1\n\ + bcc ._L1526 @cond_branch\n\ +._L1524:\n\ + mov r0, #0x0\n\ + mov r2, r8\n\ + strb r0, [r2]\n\ + ldr r7, ._L1556\n\ + ldrb r0, [r7]\n\ + cmp r0, #0\n\ + beq ._L1530 @cond_branch\n\ + ldr r6, ._L1556+0x4\n\ + ldr r5, ._L1556+0x8\n\ + ldr r4, ._L1556+0xc\n\ +._L1532:\n\ + ldrb r0, [r2]\n\ + add r0, r0, r6\n\ + ldrb r1, [r0]\n\ + sub r0, r1, #0x1\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x1\n\ + bls ._L1531 @cond_branch\n\ + add r0, r3, r5\n\ + strb r1, [r0]\n\ + add r1, r3, r4\n\ + mov r7, r8\n\ + ldrb r0, [r7]\n\ + strb r0, [r1]\n\ + add r3, r3, #0x1\n\ +._L1531:\n\ + ldrb r0, [r2]\n\ + add r0, r0, #0x1\n\ + strb r0, [r2]\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + ldr r1, ._L1556\n\ + ldrb r1, [r1]\n\ + cmp r0, r1\n\ + bcc ._L1532 @cond_branch\n\ +._L1530:\n\ + mov r5, #0x0\n\ + b ._L1549\n\ +._L1557:\n\ + .align 2, 0\n\ +._L1556:\n\ + .word gNoOfAllBanks\n\ + .word gActionForBanks\n\ + .word gActionsByTurnOrder\n\ + .word gBanksByTurnOrder\n\ +._L1538:\n\ + add r4, r5, #0x1\n\ + add r7, r4, #0\n\ + ldrb r1, [r1]\n\ + cmp r7, r1\n\ + bge ._L1537 @cond_branch\n\ + ldr r6, ._L1558\n\ + lsl r2, r5, #0x18\n\ + mov r8, r2\n\ +._L1542:\n\ + ldr r0, ._L1558+0x4\n\ + add r1, r5, r0\n\ + ldrb r3, [r1]\n\ + add r0, r4, r0\n\ + ldrb r1, [r0]\n\ + add r0, r5, r6\n\ + ldrb r2, [r0]\n\ + cmp r2, #0x1\n\ + beq ._L1541 @cond_branch\n\ + add r0, r4, r6\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + beq ._L1541 @cond_branch\n\ + cmp r2, #0x2\n\ + beq ._L1541 @cond_branch\n\ + cmp r0, #0x2\n\ + beq ._L1541 @cond_branch\n\ + add r0, r3, #0\n\ + mov r2, #0x0\n\ + bl GetWhoStrikesFirst\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._L1541 @cond_branch\n\ + lsl r1, r4, #0x18\n\ + lsr r1, r1, #0x18\n\ + mov r3, r8\n\ + lsr r0, r3, #0x18\n\ + bl SwapTurnOrder\n\ +._L1541:\n\ + add r4, r4, #0x1\n\ + ldr r0, ._L1558+0x8\n\ + ldrb r0, [r0]\n\ + cmp r4, r0\n\ + blt ._L1542 @cond_branch\n\ +._L1537:\n\ + add r5, r7, #0\n\ +._L1549:\n\ + ldr r1, ._L1558+0x8\n\ + ldrb r0, [r1]\n\ + sub r0, r0, #0x1\n\ + cmp r5, r0\n\ + blt ._L1538 @cond_branch\n\ +._L1505:\n\ + ldr r1, ._L1558+0xc\n\ + ldr r0, ._L1558+0x10\n\ + str r0, [r1]\n\ + ldr r0, ._L1558+0x14\n\ + ldr r7, ._L1558+0x18\n\ + add r0, r0, r7\n\ + mov r1, #0x0\n\ + strb r1, [r0]\n\ +._L1498:\n\ + pop {r3, r4, r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov sl, r5\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._L1559:\n\ + .align 2, 0\n\ +._L1558:\n\ + .word gActionsByTurnOrder\n\ + .word gBanksByTurnOrder\n\ + .word gNoOfAllBanks\n\ + .word gBattleMainFunc\n\ + .word CheckFocusPunch_ClearVarsBeforeTurnStarts\n\ + .word gSharedMem\n\ + .word 0x1601d"); +} +#else +void SetActionsAndBanksTurnOrder(void) +{ + s32 var = 0; + s32 i, j; + + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + { + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + { + gActionsByTurnOrder[var] = gActionForBanks[gActiveBank]; + gBanksByTurnOrder[var] = gActiveBank; + var++; + } + } + else + { + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + { + if (gActionForBanks[gActiveBank] == ACTION_RUN) + { + var = 5; + break; + } + } + } + else + { + if (gActionForBanks[0] == ACTION_RUN) + { + gActiveBank = 0; + var = 5; + } + } + + if (var == 5) + { + gActionsByTurnOrder[0] = gActionForBanks[gActiveBank]; + gBanksByTurnOrder[0] = gActiveBank; + var = 1; + for (i = 0; i < gNoOfAllBanks; i++) + { + if (i != gActiveBank) + { + gActionsByTurnOrder[var] = gActionForBanks[i]; + gBanksByTurnOrder[var] = i; + var++; + } + } + gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts; + eFocusPunchBank = 0; + return; + } + else + { + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + { + if (gActionForBanks[gActiveBank] == ACTION_USE_ITEM || gActionForBanks[gActiveBank] == ACTION_SWITCH) + { + gActionsByTurnOrder[var] = gActionForBanks[gActiveBank]; + gBanksByTurnOrder[var] = gActiveBank; + var++; + } + } + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + { + if (gActionForBanks[gActiveBank] != ACTION_USE_ITEM && gActionForBanks[gActiveBank] != ACTION_SWITCH) + { + gActionsByTurnOrder[var] = gActionForBanks[gActiveBank]; + gBanksByTurnOrder[var] = gActiveBank; + var++; + } + } + for (i = 0; i < gNoOfAllBanks - 1; i++) + { + for (j = i + 1; j < gNoOfAllBanks; j++) + { + u8 bank1 = gBanksByTurnOrder[i]; + u8 bank2 = gBanksByTurnOrder[j]; + if (gActionsByTurnOrder[i] != ACTION_USE_ITEM + && gActionsByTurnOrder[j] != ACTION_USE_ITEM + && gActionsByTurnOrder[i] != ACTION_SWITCH + && gActionsByTurnOrder[j] != ACTION_SWITCH) + { + if (GetWhoStrikesFirst(bank1, bank2, FALSE)) + SwapTurnOrder(i, j); + } + } + } + } + } + + gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts; + eFocusPunchBank = 0; +} +#endif + +static void TurnValuesCleanUp(bool8 var0) +{ + s32 i; + u8 *dataPtr; + + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + { + if (var0) + { + gProtectStructs[gActiveBank].protected = 0; + gProtectStructs[gActiveBank].endured = 0; + } + else + { + dataPtr = (u8*)(&gProtectStructs[gActiveBank]); + for (i = 0; i < sizeof(struct ProtectStruct); i++) + dataPtr[i] = 0; + + if (gDisableStructs[gActiveBank].isFirstTurn) + gDisableStructs[gActiveBank].isFirstTurn--; + + if (gDisableStructs[gActiveBank].rechargeCounter) + { + gDisableStructs[gActiveBank].rechargeCounter--; + if (gDisableStructs[gActiveBank].rechargeCounter == 0) + gBattleMons[gActiveBank].status2 &= ~(STATUS2_RECHARGE); + } + } + + if (gDisableStructs[gActiveBank].substituteHP == 0) + gBattleMons[gActiveBank].status2 &= ~(STATUS2_SUBSTITUTE); + } + + gSideTimers[0].followmeTimer = 0; + gSideTimers[1].followmeTimer = 0; +} + +void SpecialStatusesClear(void) +{ + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + { + s32 i; + u8 *dataPtr = (u8*)(&gSpecialStatuses[gActiveBank]); + + for (i = 0; i < sizeof(struct SpecialStatus); i++) + dataPtr[i] = 0; + } +} + +void CheckFocusPunch_ClearVarsBeforeTurnStarts(void) +{ + if (!(gHitMarker & HITMARKER_RUN)) + { + while (eFocusPunchBank < gNoOfAllBanks) + { + gActiveBank = gBankAttacker = eFocusPunchBank; + eFocusPunchBank++; + if (gChosenMovesByBanks[gActiveBank] == MOVE_FOCUS_PUNCH + && !(gBattleMons[gActiveBank].status1 & STATUS_SLEEP) + && !(gDisableStructs[gBankAttacker].truantCounter) + && !(gProtectStructs[gActiveBank].onlyStruggle)) + { + BattleScriptExecute(BattleScript_FocusPunchSetUp); + return; + } + } + } + + TryClearRageStatuses(); + gCurrentTurnActionNumber = 0; + { + // something stupid needed to match + u8 zero; + gCurrentActionFuncId = gActionsByTurnOrder[(zero = 0)]; + } + + gDynamicBasePower = 0; + gBattleStruct->dynamicMoveType = 0; + gBattleMainFunc = RunTurnActionsFunctions; + gBattleCommunication[3] = 0; + gBattleCommunication[4] = 0; + eMultihitMoveEffect = 0; + ewram17130 = 0; +} + +static void RunTurnActionsFunctions(void) +{ + if (gBattleOutcome != 0) + gCurrentActionFuncId = 12; + + gBattleStruct->unk16057 = gCurrentTurnActionNumber; + gUnknown_081FA640[gCurrentActionFuncId](); + + if (gCurrentTurnActionNumber >= gNoOfAllBanks) // everyone did their actions, turn finished + { + gHitMarker &= ~(HITMARKER_x100000); + gBattleMainFunc = gUnknown_081FA678[gBattleOutcome & 0x7F]; + } + else + { + if (gBattleStruct->unk16057 != gCurrentTurnActionNumber) // action turn has been done, clear hitmarker bits for another bank + { + gHitMarker &= ~(HITMARKER_NO_ATTACKSTRING); + gHitMarker &= ~(HITMARKER_UNABLE_TO_USE_MOVE); + } + } +} + +void HandleEndTurn_BattleWon(void) +{ + gCurrentActionFuncId = 0; + + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + gBattleTextBuff1[0] = gBattleOutcome; + gBankAttacker = GetBankByIdentity(IDENTITY_PLAYER_MON1); + gBattlescriptCurrInstr = BattleScript_LinkBattleWonOrLost; + gBattleOutcome &= ~(OUTCOME_LINK_BATTLE_RUN); + } + else if (gBattleTypeFlags & (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER)) + { + gBattlescriptCurrInstr = gUnknown_081D8E0D; + } + else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && !(gBattleTypeFlags & BATTLE_TYPE_LINK)) + { + BattleStopLowHpSound(); + gBattlescriptCurrInstr = BattleScript_LocalTrainerBattleWon; + + switch (gTrainers[gTrainerBattleOpponent].trainerClass) + { + case TRAINER_CLASS_ELITE_FOUR: + case TRAINER_CLASS_CHAMPION: + PlayBGM(BGM_KACHI5); + break; + case TRAINER_CLASS_TEAM_AQUA: + case TRAINER_CLASS_TEAM_MAGMA: + case TRAINER_CLASS_AQUA_ADMIN: + case TRAINER_CLASS_AQUA_LEADER: + case TRAINER_CLASS_MAGMA_ADMIN: + case TRAINER_CLASS_MAGMA_LEADER: + PlayBGM(BGM_KACHI4); + break; + case TRAINER_CLASS_LEADER: + PlayBGM(BGM_KACHI3); + break; + default: + PlayBGM(BGM_KACHI1); + break; + } + } + else + { + gBattlescriptCurrInstr = BattleScript_PayDayMoneyAndPickUpItems; + } + + gBattleMainFunc = HandleEndTurn_FinishBattle; +} + +void HandleEndTurn_BattleLost(void) +{ + gCurrentActionFuncId = 0; + + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + gBattleTextBuff1[0] = gBattleOutcome; + gBankAttacker = GetBankByIdentity(IDENTITY_PLAYER_MON1); + gBattlescriptCurrInstr = BattleScript_LinkBattleWonOrLost; + gBattleOutcome &= ~(OUTCOME_LINK_BATTLE_RUN); + } + else + { + gBattlescriptCurrInstr = BattleScript_LocalBattleLost; + } + + gBattleMainFunc = HandleEndTurn_FinishBattle; +} + +void HandleEndTurn_RanFromBattle(void) +{ + gCurrentActionFuncId = 0; + + switch (gProtectStructs[gBankAttacker].fleeFlag) + { + default: + gBattlescriptCurrInstr = BattleScript_GotAwaySafely; + break; + case 1: + gBattlescriptCurrInstr = BattleScript_SmokeBallEscape; + break; + case 2: + gBattlescriptCurrInstr = BattleScript_RanAwayUsingMonAbility; + break; + } + + gBattleMainFunc = HandleEndTurn_FinishBattle; +} + +void HandleEndTurn_MonFled(void) +{ + gCurrentActionFuncId = 0; + + PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBankAttacker, gBattlePartyID[gBankAttacker]); + gBattlescriptCurrInstr = BattleScript_WildMonFled; + + gBattleMainFunc = HandleEndTurn_FinishBattle; +} + +void HandleEndTurn_FinishBattle(void) +{ + if (gCurrentActionFuncId == 0xB || gCurrentActionFuncId == 0xC) + { + if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK + | BATTLE_TYPE_FIRST_BATTLE + | BATTLE_TYPE_SAFARI + | BATTLE_TYPE_EREADER_TRAINER + | BATTLE_TYPE_WALLY_TUTORIAL + | BATTLE_TYPE_BATTLE_TOWER))) + { + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + { + if (GetBankSide(gActiveBank) == SIDE_PLAYER) + { + if (gBattleResults.poke1Species == SPECIES_NONE) + { + gBattleResults.poke1Species = gBattleMons[gActiveBank].species; + StringCopy(gBattleResults.pokeString1, gBattleMons[gActiveBank].nickname); + } + else + { + gBattleResults.opponentSpecies = gBattleMons[gActiveBank].species; + StringCopy(gBattleResults.pokeString2, gBattleMons[gActiveBank].nickname); + } + } + } + PutPokemonTodayCaughtOnAir(); + } + + BeginFastPaletteFade(3); + FadeOutMapMusic(5); + gBattleMainFunc = FreeResetData_ReturnToOvOrDoEvolutions; + gCB2_AfterEvolution = BattleMainCB2; + } + else + { + if (gBattleExecBuffer == 0) + gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]](); + } +} + +static void FreeResetData_ReturnToOvOrDoEvolutions(void) +{ + if (!gPaletteFade.active) + { + ResetSpriteData(); + if (gLeveledUpInBattle == 0 || gBattleOutcome != BATTLE_WON) + { + gBattleMainFunc = ReturnFromBattleToOverworld; + return; + } + else + { + gBattleMainFunc = TryEvolvePokemon; + } + } +} + +void TryEvolvePokemon(void) +{ + s32 i; + + while (gLeveledUpInBattle != 0) + { + for (i = 0; i < 6; i++) + { + if (gLeveledUpInBattle & gBitTable[i]) + { + u16 species; + u8 levelUpBits = gLeveledUpInBattle; + + levelUpBits &= ~(gBitTable[i]); + gLeveledUpInBattle = levelUpBits; + + species = GetEvolutionTargetSpecies(&gPlayerParty[i], 0, levelUpBits); + if (species != SPECIES_NONE) + { + gBattleMainFunc = WaitForEvoSceneToFinish; + EvolutionScene(&gPlayerParty[i], species, 0x81, i); + return; + } + } + } + } + + gBattleMainFunc = ReturnFromBattleToOverworld; +} + +static void WaitForEvoSceneToFinish(void) +{ + if (gMain.callback2 == BattleMainCB2) + gBattleMainFunc = TryEvolvePokemon; +} + +static void ReturnFromBattleToOverworld(void) +{ + if (!(gBattleTypeFlags & BATTLE_TYPE_LINK)) + { + RandomlyGivePartyPokerus(gPlayerParty); + PartySpreadPokerus(gPlayerParty); + } + + if (gBattleTypeFlags & BATTLE_TYPE_LINK && gReceivedRemoteLinkPlayers != 0) + return; + + gSpecialVar_Result = gBattleOutcome; + gMain.inBattle = 0; + gMain.callback1 = gPreBattleCallback1; + + if (gBattleTypeFlags & BATTLE_TYPE_ROAMER) + { + UpdateRoamerHPStatus(&gEnemyParty[0]); + if (gBattleOutcome == BATTLE_WON || gBattleOutcome == BATTLE_CAUGHT) + SetRoamerInactive(); + } + + m4aSongNumStop(0x5A); + SetMainCallback2(gMain.savedCallback); +} + +void RunBattleScriptCommands_PopCallbacksStack(void) +{ + if (gCurrentActionFuncId == 0xB || gCurrentActionFuncId == 0xC) + { + if (B_FUNCTION_STACK->size != 0) + B_FUNCTION_STACK->size--; + gBattleMainFunc = B_FUNCTION_STACK->ptr[B_FUNCTION_STACK->size]; + } + else + { + if (gBattleExecBuffer == 0) + gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]](); + } +} + +void RunBattleScriptCommands(void) +{ + if (gBattleExecBuffer == 0) + gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]](); +} + +void HandleAction_UseMove(void) +{ + u8 side; + u8 var = 4; + + gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber]; + + if (ewram160A6 & gBitTable[gBankAttacker]) + { + gCurrentActionFuncId = ACTION_FINISHED; + return; + } + + gCritMultiplier = 1; + eDmgMultiplier = 1; + ewram160E7 = 0; + gBattleMoveFlags = 0; + gMultiHitCounter = 0; + gBattleCommunication[6] = 0; + gCurrMovePos = gUnknown_02024BE5 = ewram1608Carr(gBankAttacker); + + // choose move + if (gProtectStructs[gBankAttacker].onlyStruggle) + { + gProtectStructs[gBankAttacker].onlyStruggle = 0; + gCurrentMove = gChosenMove = MOVE_STRUGGLE; + gHitMarker |= HITMARKER_NO_PPDEDUCT; + ewram16010arr(gBankAttacker) = GetMoveTarget(MOVE_STRUGGLE, 0); + } + else if (gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS || gBattleMons[gBankAttacker].status2 & STATUS2_RECHARGE) + { + gCurrentMove = gChosenMove = gLockedMoves[gBankAttacker]; + } + // encore forces you to use the same move + else if (gDisableStructs[gBankAttacker].encoredMove != MOVE_NONE + && gDisableStructs[gBankAttacker].encoredMove == gBattleMons[gBankAttacker].moves[gDisableStructs[gBankAttacker].encoredMovePos]) + { + gCurrentMove = gChosenMove = gDisableStructs[gBankAttacker].encoredMove; + gCurrMovePos = gUnknown_02024BE5 = gDisableStructs[gBankAttacker].encoredMovePos; + ewram16010arr(gBankAttacker) = GetMoveTarget(gCurrentMove, 0); + } + // check if the encored move wasn't overwritten + else if (gDisableStructs[gBankAttacker].encoredMove != MOVE_NONE + && gDisableStructs[gBankAttacker].encoredMove != gBattleMons[gBankAttacker].moves[gDisableStructs[gBankAttacker].encoredMovePos]) + { + gCurrMovePos = gUnknown_02024BE5 = gDisableStructs[gBankAttacker].encoredMovePos; + gCurrentMove = gChosenMove = gBattleMons[gBankAttacker].moves[gCurrMovePos]; + gDisableStructs[gBankAttacker].encoredMove = MOVE_NONE; + gDisableStructs[gBankAttacker].encoredMovePos = 0; + gDisableStructs[gBankAttacker].encoreTimer1 = 0; + ewram16010arr(gBankAttacker) = GetMoveTarget(gCurrentMove, 0); + } + else if (gBattleMons[gBankAttacker].moves[gCurrMovePos] != gChosenMovesByBanks[gBankAttacker]) + { + gCurrentMove = gChosenMove = gBattleMons[gBankAttacker].moves[gCurrMovePos]; + ewram16010arr(gBankAttacker) = GetMoveTarget(gCurrentMove, 0); + } + else + { + gCurrentMove = gChosenMove = gBattleMons[gBankAttacker].moves[gCurrMovePos]; + } + + if (GetBankSide(gBankAttacker) == SIDE_PLAYER) + gBattleResults.lastUsedMove = gCurrentMove; + else + gBattleResults.opponentMove = gCurrentMove; + + // choose target + side = GetBankSide(gBankAttacker) ^ BIT_SIDE; + if (gSideTimers[side].followmeTimer != 0 + && gBattleMoves[gCurrentMove].target == MOVE_TARGET_SELECTED + && GetBankSide(gBankAttacker) != GetBankSide(gSideTimers[side].followmeTarget) + && gBattleMons[gSideTimers[side].followmeTarget].hp != 0) + { + gBankTarget = gSideTimers[side].followmeTarget; + } + else if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + && gSideTimers[side].followmeTimer == 0 + && (gBattleMoves[gCurrentMove].power != 0 + || gBattleMoves[gCurrentMove].target != MOVE_TARGET_x10) + && gBattleMons[ewram16010arr(gBankAttacker)].ability != ABILITY_LIGHTNING_ROD + && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC) + { + side = GetBankSide(gBankAttacker); + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + { + if (side != GetBankSide(gActiveBank) + && ewram16010arr(gBankAttacker) != gActiveBank + && gBattleMons[gActiveBank].ability == ABILITY_LIGHTNING_ROD + && BankGetTurnOrder(gActiveBank) < var) + { + var = BankGetTurnOrder(gActiveBank); + } + } + if (var == 4) + { + if (gBattleMoves[gChosenMove].target & MOVE_TARGET_RANDOM) + { + if (GetBankSide(gBankAttacker) == SIDE_PLAYER) + { + if (Random() & 1) + gBankTarget = GetBankByIdentity(IDENTITY_OPPONENT_MON1); + else + gBankTarget = GetBankByIdentity(IDENTITY_OPPONENT_MON2); + } + else + { + if (Random() & 1) + gBankTarget = GetBankByIdentity(IDENTITY_PLAYER_MON1); + else + gBankTarget = GetBankByIdentity(IDENTITY_PLAYER_MON2); + } + } + else + { + gBankTarget = ewram16010arr(gBankAttacker); + } + + if (gAbsentBankFlags & gBitTable[gBankTarget]) + { + if (GetBankSide(gBankAttacker) != GetBankSide(gBankTarget)) + { + gBankTarget = GetBankByIdentity(GetBankIdentity(gBankTarget) ^ BIT_MON); + } + else + { + gBankTarget = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ BIT_SIDE); + if (gAbsentBankFlags & gBitTable[gBankTarget]) + gBankTarget = GetBankByIdentity(GetBankIdentity(gBankTarget) ^ BIT_MON); + } + } + } + else + { + gActiveBank = gBanksByTurnOrder[var]; + RecordAbilityBattle(gActiveBank, gBattleMons[gActiveBank].ability); + gSpecialStatuses[gActiveBank].lightningRodRedirected = 1; + gBankTarget = gActiveBank; + } + } + else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE + && gBattleMoves[gChosenMove].target & MOVE_TARGET_RANDOM) + { + if (GetBankSide(gBankAttacker) == SIDE_PLAYER) + { + if (Random() & 1) + gBankTarget = GetBankByIdentity(IDENTITY_OPPONENT_MON1); + else + gBankTarget = GetBankByIdentity(IDENTITY_OPPONENT_MON2); + } + else + { + if (Random() & 1) + gBankTarget = GetBankByIdentity(IDENTITY_PLAYER_MON1); + else + gBankTarget = GetBankByIdentity(IDENTITY_PLAYER_MON2); + } + + if (gAbsentBankFlags & gBitTable[gBankTarget] + && GetBankSide(gBankAttacker) != GetBankSide(gBankTarget)) + { + gBankTarget = GetBankByIdentity(GetBankIdentity(gBankTarget) ^ BIT_MON); + } + } + else + { + gBankTarget = ewram16010arr(gBankAttacker); + if (gAbsentBankFlags & gBitTable[gBankTarget]) + { + if (GetBankSide(gBankAttacker) != GetBankSide(gBankTarget)) + { + gBankTarget = GetBankByIdentity(GetBankIdentity(gBankTarget) ^ BIT_MON); + } + else + { + gBankTarget = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ BIT_SIDE); + if (gAbsentBankFlags & gBitTable[gBankTarget]) + gBankTarget = GetBankByIdentity(GetBankIdentity(gBankTarget) ^ BIT_MON); + } + } + } + + gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; + gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; +} + +void HandleAction_Switch(void) +{ + gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber]; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; + gActionSelectionCursor[gBankAttacker] = 0; + gMoveSelectionCursor[gBankAttacker] = 0; + + PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBankAttacker, ewram16064arr(gBankAttacker)) + + ewram16003 = gBankAttacker; + gBattlescriptCurrInstr = BattleScript_ActionSwitch; + gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; + + if (gBattleResults.unk2 < 255) + gBattleResults.unk2++; +} + +#ifdef NONMATCHING +void HandleAction_UseItem(void) +{ + gBankAttacker = gBankTarget = gBanksByTurnOrder[gCurrentTurnActionNumber]; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; + gDisableStructs[gBankAttacker].furyCutterCounter = 0; + gLastUsedItem = gBattleBufferB[gBankAttacker][1] | (gBattleBufferB[gBankAttacker][2] << 8); + + if (gLastUsedItem <= ITEM_PREMIER_BALL) // is ball + { + gBattlescriptCurrInstr = gBattlescriptsForBallThrow[gLastUsedItem]; + } + else if (gLastUsedItem == ITEM_POKE_DOLL || gLastUsedItem == ITEM_FLUFFY_TAIL) + { + gBattlescriptCurrInstr = gBattlescriptsForRunningByItem[0]; + } + else if (GetBankSide(gBankAttacker) == SIDE_PLAYER) + { + gBattlescriptCurrInstr = gBattlescriptsForUsingItem[0]; + } + else + { + ewram16003 = gBankAttacker; + + switch (ewram160D8(gBankAttacker)) + { + case AI_ITEM_FULL_RESTORE: + case AI_ITEM_HEAL_HP: + break; + case AI_ITEM_CURE_CONDITION: + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + if (ewram160DA(gBankAttacker) & 1) + { + if (ewram160DA(gBankAttacker) & 0x3E) + gBattleCommunication[MULTISTRING_CHOOSER] = 5; + } + else + { + while (!(ewram160DA(gBankAttacker) & 1)) + { + ewram160DA(gBankAttacker) /= 2; + gBattleCommunication[MULTISTRING_CHOOSER]++; + } + } + break; + case AI_ITEM_X_STAT: + gBattleCommunication[MULTISTRING_CHOOSER] = 4; + if (ewram160DA(gBankAttacker) & 0x80) + { + gBattleCommunication[MULTISTRING_CHOOSER] = 5; + } + else + { + PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK) + PREPARE_STRING_BUFFER(gBattleTextBuff2, 0xD2) + + while (!(ewram160DA(gBankAttacker) & 1)) + { + ewram160DA(gBankAttacker) /= 2; + gBattleTextBuff1[2]++; + } + + ewram160A4 = gBattleTextBuff1[2] + 14; + ewram160A5 = 0; + } + break; + case AI_ITEM_GUARD_SPECS: + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + gBattleCommunication[MULTISTRING_CHOOSER] = 2; + else + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + break; + } + + gBattlescriptCurrInstr = gBattlescriptsForUsingItem[ewram160D8(gBankAttacker)]; + } + gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; +} +#else +__attribute__((naked)) +void HandleAction_UseItem(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + ldr r4, _08014804 @ =gBankAttacker\n\ + ldr r2, _08014808 @ =gBankTarget\n\ + ldr r1, _0801480C @ =gBanksByTurnOrder\n\ + ldr r0, _08014810 @ =gCurrentTurnActionNumber\n\ + ldrb r0, [r0]\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + strb r0, [r2]\n\ + strb r0, [r4]\n\ + ldr r0, _08014814 @ =gBattle_BG0_X\n\ + movs r2, 0\n\ + strh r2, [r0]\n\ + ldr r0, _08014818 @ =gBattle_BG0_Y\n\ + strh r2, [r0]\n\ + ldr r3, _0801481C @ =gDisableStructs\n\ + ldrb r1, [r4]\n\ + lsls r0, r1, 3\n\ + subs r0, r1\n\ + lsls r0, 2\n\ + adds r0, r3\n\ + strb r2, [r0, 0x10]\n\ + ldr r5, _08014820 @ =gLastUsedItem\n\ + ldr r2, _08014824 @ =gBattleBufferB\n\ + ldrb r1, [r4]\n\ + lsls r1, 9\n\ + adds r0, r2, 0x1\n\ + adds r0, r1, r0\n\ + ldrb r3, [r0]\n\ + adds r2, 0x2\n\ + adds r1, r2\n\ + ldrb r0, [r1]\n\ + lsls r0, 8\n\ + orrs r3, r0\n\ + strh r3, [r5]\n\ + cmp r3, 0xC\n\ + bhi _08014830\n\ + ldr r2, _08014828 @ =gBattlescriptCurrInstr\n\ + ldr r1, _0801482C @ =gBattlescriptsForBallThrow\n\ + ldrh r0, [r5]\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + str r0, [r2]\n\ + b _08014A8C\n\ + .align 2, 0\n\ +_08014804: .4byte gBankAttacker\n\ +_08014808: .4byte gBankTarget\n\ +_0801480C: .4byte gBanksByTurnOrder\n\ +_08014810: .4byte gCurrentTurnActionNumber\n\ +_08014814: .4byte gBattle_BG0_X\n\ +_08014818: .4byte gBattle_BG0_Y\n\ +_0801481C: .4byte gDisableStructs\n\ +_08014820: .4byte gLastUsedItem\n\ +_08014824: .4byte gBattleBufferB\n\ +_08014828: .4byte gBattlescriptCurrInstr\n\ +_0801482C: .4byte gBattlescriptsForBallThrow\n\ +_08014830:\n\ + adds r0, r3, 0\n\ + subs r0, 0x50\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r0, 0x1\n\ + bhi _0801484C\n\ + ldr r0, _08014844 @ =gBattlescriptCurrInstr\n\ + ldr r1, _08014848 @ =gBattlescriptsForRunningByItem\n\ + b _0801485C\n\ + .align 2, 0\n\ +_08014844: .4byte gBattlescriptCurrInstr\n\ +_08014848: .4byte gBattlescriptsForRunningByItem\n\ +_0801484C:\n\ + ldrb r0, [r4]\n\ + bl GetBankSide\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _0801486C\n\ + ldr r0, _08014864 @ =gBattlescriptCurrInstr\n\ + ldr r1, _08014868 @ =gBattlescriptsForUsingItem\n\ +_0801485C:\n\ + ldr r1, [r1]\n\ + str r1, [r0]\n\ + b _08014A8C\n\ + .align 2, 0\n\ +_08014864: .4byte gBattlescriptCurrInstr\n\ +_08014868: .4byte gBattlescriptsForUsingItem\n\ +_0801486C:\n\ + ldr r2, _080148A0 @ =gSharedMem\n\ + ldrb r0, [r4]\n\ + ldr r3, _080148A4 @ =0x00016003\n\ + adds r1, r2, r3\n\ + strb r0, [r1]\n\ + lsls r0, 24\n\ + lsrs r0, 25\n\ + ldr r1, _080148A8 @ =0x000160d8\n\ + adds r0, r1\n\ + adds r0, r2\n\ + ldrb r0, [r0]\n\ + subs r0, 0x1\n\ + mov r8, r4\n\ + ldr r3, _080148AC @ =gBattlescriptCurrInstr\n\ + mov r9, r3\n\ + ldr r1, _080148B0 @ =gBattlescriptsForUsingItem\n\ + mov r10, r1\n\ + adds r7, r2, 0\n\ + cmp r0, 0x4\n\ + bls _08014896\n\ + b _08014A74\n\ +_08014896:\n\ + lsls r0, 2\n\ + ldr r1, _080148B4 @ =_080148B8\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ + .align 2, 0\n\ +_080148A0: .4byte gSharedMem\n\ +_080148A4: .4byte 0x00016003\n\ +_080148A8: .4byte 0x000160d8\n\ +_080148AC: .4byte gBattlescriptCurrInstr\n\ +_080148B0: .4byte gBattlescriptsForUsingItem\n\ +_080148B4: .4byte _080148B8\n\ + .align 2, 0\n\ +_080148B8:\n\ + .4byte _08014A74\n\ + .4byte _08014A74\n\ + .4byte _080148CC\n\ + .4byte _08014958\n\ + .4byte _08014A30\n\ +_080148CC:\n\ + ldr r2, _08014904 @ =gBattleCommunication\n\ + movs r0, 0\n\ + strb r0, [r2, 0x5]\n\ + ldr r1, _08014908 @ =gBankAttacker\n\ + ldrb r0, [r1]\n\ + lsrs r0, 1\n\ + ldr r6, _0801490C @ =0x000160da\n\ + adds r0, r6\n\ + adds r0, r7\n\ + ldrb r3, [r0]\n\ + movs r0, 0x1\n\ + ands r0, r3\n\ + mov r8, r1\n\ + cmp r0, 0\n\ + beq _08014918\n\ + movs r0, 0x3E\n\ + ands r0, r3\n\ + ldr r3, _08014910 @ =gBattlescriptCurrInstr\n\ + mov r9, r3\n\ + ldr r1, _08014914 @ =gBattlescriptsForUsingItem\n\ + mov r10, r1\n\ + cmp r0, 0\n\ + bne _080148FC\n\ + b _08014A74\n\ +_080148FC:\n\ + movs r0, 0x5\n\ + strb r0, [r2, 0x5]\n\ + b _08014A74\n\ + .align 2, 0\n\ +_08014904: .4byte gBattleCommunication\n\ +_08014908: .4byte gBankAttacker\n\ +_0801490C: .4byte 0x000160da\n\ +_08014910: .4byte gBattlescriptCurrInstr\n\ +_08014914: .4byte gBattlescriptsForUsingItem\n\ +_08014918:\n\ + ldr r3, _08014950 @ =gBattlescriptCurrInstr\n\ + mov r9, r3\n\ + ldr r0, _08014954 @ =gBattlescriptsForUsingItem\n\ + mov r10, r0\n\ + adds r5, r7, 0\n\ + mov r4, r8\n\ + adds r3, r6, 0\n\ +_08014926:\n\ + ldrb r0, [r4]\n\ + lsrs r0, 1\n\ + adds r0, r3\n\ + adds r0, r5\n\ + ldrb r1, [r0]\n\ + lsrs r1, 1\n\ + strb r1, [r0]\n\ + ldrb r0, [r2, 0x5]\n\ + adds r0, 0x1\n\ + strb r0, [r2, 0x5]\n\ + ldrb r0, [r4]\n\ + lsrs r0, 1\n\ + adds r0, r3\n\ + adds r0, r5\n\ + ldrb r1, [r0]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08014926\n\ + b _08014A74\n\ + .align 2, 0\n\ +_08014950: .4byte gBattlescriptCurrInstr\n\ +_08014954: .4byte gBattlescriptsForUsingItem\n\ +_08014958:\n\ + ldr r3, _0801498C @ =gBattleCommunication\n\ + movs r0, 0x4\n\ + strb r0, [r3, 0x5]\n\ + ldr r2, _08014990 @ =gBankAttacker\n\ + ldrb r0, [r2]\n\ + lsrs r0, 1\n\ + ldr r1, _08014994 @ =0x000160da\n\ + mov r12, r1\n\ + add r0, r12\n\ + adds r6, r0, r7\n\ + ldrb r1, [r6]\n\ + movs r0, 0x80\n\ + ands r0, r1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + mov r8, r2\n\ + cmp r5, 0\n\ + beq _080149A0\n\ + movs r0, 0x5\n\ + strb r0, [r3, 0x5]\n\ + ldr r2, _08014998 @ =gBattlescriptCurrInstr\n\ + mov r9, r2\n\ + ldr r3, _0801499C @ =gBattlescriptsForUsingItem\n\ + mov r10, r3\n\ + b _08014A74\n\ + .align 2, 0\n\ +_0801498C: .4byte gBattleCommunication\n\ +_08014990: .4byte gBankAttacker\n\ +_08014994: .4byte 0x000160da\n\ +_08014998: .4byte gBattlescriptCurrInstr\n\ +_0801499C: .4byte gBattlescriptsForUsingItem\n\ +_080149A0:\n\ + ldr r3, _08014A18 @ =gBattleTextBuff1\n\ + movs r4, 0xFD\n\ + strb r4, [r3]\n\ + movs r0, 0x5\n\ + strb r0, [r3, 0x1]\n\ + movs r2, 0x1\n\ + strb r2, [r3, 0x2]\n\ + movs r0, 0xFF\n\ + strb r0, [r3, 0x3]\n\ + ldr r1, _08014A1C @ =gBattleTextBuff2\n\ + strb r4, [r1]\n\ + strb r5, [r1, 0x1]\n\ + movs r0, 0xD2\n\ + strb r0, [r1, 0x2]\n\ + strb r5, [r1, 0x3]\n\ + subs r0, 0xD3\n\ + strb r0, [r1, 0x4]\n\ + ldrb r0, [r6]\n\ + ands r2, r0\n\ + ldr r0, _08014A20 @ =gBattlescriptCurrInstr\n\ + mov r9, r0\n\ + ldr r1, _08014A24 @ =gBattlescriptsForUsingItem\n\ + mov r10, r1\n\ + adds r6, r3, 0\n\ + cmp r2, 0\n\ + bne _08014A02\n\ + adds r3, r7, 0\n\ + mov r5, r8\n\ + mov r4, r12\n\ + adds r2, r6, 0\n\ +_080149DC:\n\ + ldrb r0, [r5]\n\ + lsrs r0, 1\n\ + adds r0, r4\n\ + adds r0, r3\n\ + ldrb r1, [r0]\n\ + lsrs r1, 1\n\ + strb r1, [r0]\n\ + ldrb r0, [r2, 0x2]\n\ + adds r0, 0x1\n\ + strb r0, [r2, 0x2]\n\ + ldrb r0, [r5]\n\ + lsrs r0, 1\n\ + adds r0, r4\n\ + adds r0, r3\n\ + ldrb r1, [r0]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080149DC\n\ +_08014A02:\n\ + ldrb r0, [r6, 0x2]\n\ + adds r0, 0xE\n\ + ldr r2, _08014A28 @ =0x000160a4\n\ + adds r1, r7, r2\n\ + movs r2, 0\n\ + strb r0, [r1]\n\ + ldr r3, _08014A2C @ =0x000160a5\n\ + adds r0, r7, r3\n\ + strb r2, [r0]\n\ + b _08014A74\n\ + .align 2, 0\n\ +_08014A18: .4byte gBattleTextBuff1\n\ +_08014A1C: .4byte gBattleTextBuff2\n\ +_08014A20: .4byte gBattlescriptCurrInstr\n\ +_08014A24: .4byte gBattlescriptsForUsingItem\n\ +_08014A28: .4byte 0x000160a4\n\ +_08014A2C: .4byte 0x000160a5\n\ +_08014A30:\n\ + ldr r0, _08014A50 @ =gBattleTypeFlags\n\ + ldrh r0, [r0]\n\ + movs r1, 0x1\n\ + ands r1, r0\n\ + cmp r1, 0\n\ + beq _08014A64\n\ + ldr r1, _08014A54 @ =gBattleCommunication\n\ + movs r0, 0x2\n\ + strb r0, [r1, 0x5]\n\ + ldr r0, _08014A58 @ =gBankAttacker\n\ + mov r8, r0\n\ + ldr r1, _08014A5C @ =gBattlescriptCurrInstr\n\ + mov r9, r1\n\ + ldr r2, _08014A60 @ =gBattlescriptsForUsingItem\n\ + mov r10, r2\n\ + b _08014A74\n\ + .align 2, 0\n\ +_08014A50: .4byte gBattleTypeFlags\n\ +_08014A54: .4byte gBattleCommunication\n\ +_08014A58: .4byte gBankAttacker\n\ +_08014A5C: .4byte gBattlescriptCurrInstr\n\ +_08014A60: .4byte gBattlescriptsForUsingItem\n\ +_08014A64:\n\ + ldr r0, _08014AA0 @ =gBattleCommunication\n\ + strb r1, [r0, 0x5]\n\ + ldr r3, _08014AA4 @ =gBankAttacker\n\ + mov r8, r3\n\ + ldr r0, _08014AA8 @ =gBattlescriptCurrInstr\n\ + mov r9, r0\n\ + ldr r1, _08014AAC @ =gBattlescriptsForUsingItem\n\ + mov r10, r1\n\ +_08014A74:\n\ + mov r2, r8\n\ + ldrb r0, [r2]\n\ + lsrs r0, 1\n\ + ldr r3, _08014AB0 @ =0x000160d8\n\ + adds r0, r3\n\ + adds r0, r7\n\ + ldrb r0, [r0]\n\ + lsls r0, 2\n\ + add r0, r10\n\ + ldr r0, [r0]\n\ + mov r1, r9\n\ + str r0, [r1]\n\ +_08014A8C:\n\ + movs r0, 0xA\n\ + ldr r2, _08014AB4 @ =gCurrentActionFuncId\n\ + strb r0, [r2]\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_08014AA0: .4byte gBattleCommunication\n\ +_08014AA4: .4byte gBankAttacker\n\ +_08014AA8: .4byte gBattlescriptCurrInstr\n\ +_08014AAC: .4byte gBattlescriptsForUsingItem\n\ +_08014AB0: .4byte 0x000160d8\n\ +_08014AB4: .4byte gCurrentActionFuncId\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +bool8 TryRunFromBattle(u8 bank) +{ + bool8 effect = FALSE; + u8 holdEffect; + u8 speedVar; + + if (gBattleMons[bank].item == ITEM_ENIGMA_BERRY) + holdEffect = gEnigmaBerries[bank].holdEffect; + else + holdEffect = ItemId_GetHoldEffect(gBattleMons[bank].item); + + gStringBank = bank; + + if (holdEffect == HOLD_EFFECT_CAN_ALWAYS_RUN) + { + gLastUsedItem = gBattleMons[bank].item ; + gProtectStructs[bank].fleeFlag = 1; + effect++; + } + else if (gBattleMons[bank].ability == ABILITY_RUN_AWAY) + { + gLastUsedAbility = ABILITY_RUN_AWAY; + gProtectStructs[bank].fleeFlag = 2; + effect++; + } + else + { + if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + { + if (gBattleMons[bank].speed < gBattleMons[bank ^ BIT_SIDE].speed) + { + speedVar = (gBattleMons[bank].speed * 128) / (gBattleMons[bank ^ BIT_SIDE].speed) + (ewram16078 * 30); + if (speedVar > (Random() & 0xFF)) + effect++; + } + else // same speed or faster + { + effect++; + } + } + + ewram16078++; + } + + if (effect) + { + gCurrentTurnActionNumber = gNoOfAllBanks; + gBattleOutcome = BATTLE_RAN; + } + + return effect; +} + +void HandleAction_Run(void) +{ + gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber]; + + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + gCurrentTurnActionNumber = gNoOfAllBanks; + + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + { + if (GetBankSide(gActiveBank) == SIDE_PLAYER) + { + if (gActionForBanks[gActiveBank] == ACTION_RUN) + gBattleOutcome |= BATTLE_LOST; + } + else + { + if (gActionForBanks[gActiveBank] == ACTION_RUN) + gBattleOutcome |= BATTLE_WON; + } + } + + gBattleOutcome |= OUTCOME_LINK_BATTLE_RUN; + } + else + { + if (GetBankSide(gBankAttacker) == SIDE_PLAYER) + { + if (!TryRunFromBattle(gBankAttacker)) // failed to run away + { + gBattleMons[gBankAttacker].status2 &= ~STATUS2_DESTINY_BOND; + gBattleCommunication[MULTISTRING_CHOOSER] = 3; + gBattlescriptCurrInstr = BattleScript_PrintFailedToRunString; + gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; + } + } + else + { + if (gBattleMons[gBankAttacker].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = 4; + gBattlescriptCurrInstr = BattleScript_PrintFailedToRunString; + gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; + } + else + { + gCurrentTurnActionNumber = gNoOfAllBanks; + gBattleOutcome = BATTLE_POKE_FLED; + } + } + } +} + +void HandleAction_WatchesCarefully(void) +{ + gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber]; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; + gBattlescriptCurrInstr = gBattlescriptsForSafariActions[0]; + gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; +} + +void HandleAction_SafariZoneBallThrow(void) +{ + gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber]; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; + gNumSafariBalls--; + gLastUsedItem = ITEM_SAFARI_BALL; + gBattlescriptCurrInstr = gBattlescriptsForBallThrow[ITEM_SAFARI_BALL]; + gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; +} + +void HandleAction_ThrowPokeblock(void) +{ + gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber]; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = gBattleBufferB[gBankAttacker][1] - 1; + gLastUsedItem = gBattleBufferB[gBankAttacker][2]; + + if (ewram16087 < 3) + ewram16087++; + if (ewram16088 > 1) + { + if (ewram16088 < gUnknown_081FA70C[ewram16087][gBattleCommunication[MULTISTRING_CHOOSER]]) + ewram16088 = 1; + else + ewram16088 -= gUnknown_081FA70C[ewram16087][gBattleCommunication[MULTISTRING_CHOOSER]]; + } + + gBattlescriptCurrInstr = gBattlescriptsForSafariActions[2]; + gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; +} + +void HandleAction_GoNear(void) +{ + gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber]; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; + + ewram16089 += gUnknown_081FA71B[ewram16086]; + if (ewram16089 > 20) + ewram16089 = 20; + + ewram16088 += gUnknown_081FA71F[ewram16086]; + if (ewram16088 > 20) + ewram16088 = 20; + + if (ewram16086 < 3) + { + ewram16086++; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + } + else + { + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + } + gBattlescriptCurrInstr = gBattlescriptsForSafariActions[1]; + gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; +} + +void HandleAction_SafriZoneRun(void) +{ + gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber]; + PlaySE(SE_NIGERU); + gCurrentTurnActionNumber = gNoOfAllBanks; + gBattleOutcome = BATTLE_RAN; +} + +void HandleAction_Action9(void) +{ + gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber]; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; + + PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBankAttacker, gBattlePartyID[gBankAttacker]) + + gBattlescriptCurrInstr = gBattlescriptsForSafariActions[3]; + gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; + gActionsByTurnOrder[1] = ACTION_FINISHED; +} + +void HandleAction_Action11(void) +{ + if (!HandleFaintedMonActions()) + { + ewram16059 = 0; + gCurrentActionFuncId = ACTION_FINISHED; + } +} + +void HandleAction_NothingIsFainted(void) +{ + gCurrentTurnActionNumber++; + gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber]; + gHitMarker &= ~(HITMARKER_DESTINYBOND | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_ATTACKSTRING_PRINTED + | HITMARKER_NO_PPDEDUCT | HITMARKER_IGNORE_SAFEGUARD | HITMARKER_IGNORE_ON_AIR + | HITMARKER_IGNORE_UNDERGROUND | HITMARKER_IGNORE_UNDERWATER | HITMARKER_x100000 + | HITMARKER_OBEYS | HITMARKER_x10 | HITMARKER_SYNCHRONISE_EFFECT + | HITMARKER_x8000000 | HITMARKER_x4000000); +} + +void HandleAction_ActionFinished(void) +{ + gCurrentTurnActionNumber++; + gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber]; + SpecialStatusesClear(); + gHitMarker &= ~(HITMARKER_DESTINYBOND | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_ATTACKSTRING_PRINTED + | HITMARKER_NO_PPDEDUCT | HITMARKER_IGNORE_SAFEGUARD | HITMARKER_IGNORE_ON_AIR + | HITMARKER_IGNORE_UNDERGROUND | HITMARKER_IGNORE_UNDERWATER | HITMARKER_x100000 + | HITMARKER_OBEYS | HITMARKER_x10 | HITMARKER_SYNCHRONISE_EFFECT + | HITMARKER_x8000000 | HITMARKER_x4000000); + + gBattleMoveDamage = 0; + ewram16002 = 0; + ewram160A1 = 0; + gLastLandedMoves[gBankAttacker] = 0; + gLastHitByType[gBankAttacker] = 0; + eDynamicMoveType = 0; + gDynamicBasePower = 0; + ewram1600C = 0; + gBattleCommunication[3] = 0; + gBattleCommunication[4] = 0; + eMultihitMoveEffect = 0; + ewram17130 = 0; +} diff --git a/src/battle/battle_4.c b/src/battle/battle_4.c index 0c147e471..8b81139fb 100644 --- a/src/battle/battle_4.c +++ b/src/battle/battle_4.c @@ -1,5 +1,9 @@ #include "global.h" #include "battle.h" +#include "battle_message.h" +#include "battle_string_ids.h" +#include "battle_script_commands.h" +#include "battle_util.h" #include "constants/battle_move_effects.h" #include "constants/moves.h" #include "constants/abilities.h" @@ -21,22 +25,89 @@ #include "pokemon_summary_screen.h" #include "naming_screen.h" #include "ewram.h" +#include "util.h" + +// TODO: put this into battle_controllers.h + +#define RET_VALUE_LEVELLED_UP 11 + +enum +{ + CONTROLLER_GETMONDATA, + CONTROLLER_GETRAWMONDATA, + CONTROLLER_SETMONDATA, + CONTROLLER_SETRAWMONDATA, + CONTROLLER_LOADMONSPRITE, + CONTROLLER_SWITCHINANIM, + CONTROLLER_RETURNMONTOBALL, + CONTROLLER_DRAWTRAINERPIC, + CONTROLLER_TRAINERSLIDE, + CONTROLLER_TRAINERSLIDEBACK, + CONTROLLER_FAINTANIMATION, + CONTROLLER_PALETTEFADE, + CONTROLLER_SUCCESSBALLTHROWANIM, + CONTROLLER_BALLTHROWANIM, + CONTROLLER_PAUSE, + CONTROLLER_MOVEANIMATION, + CONTROLLER_PRINTSTRING, + CONTROLLER_PRINTSTRINGPLAYERONLY, + CONTROLLER_CHOOSEACTION, + CONTROLLER_UNKNOWNYESNOBOX, + CONTROLLER_CHOOSEMOVE, + CONTROLLER_OPENBAG, + CONTROLLER_CHOOSEPOKEMON, + CONTROLLER_23, + CONTROLLER_HEALTHBARUPDATE, + CONTROLLER_EXPUPDATE, + CONTROLLER_STATUSICONUPDATE, + CONTROLLER_STATUSANIMATION, + CONTROLLER_STATUSXOR, + CONTROLLER_DATATRANSFER, + CONTROLLER_DMA3TRANSFER, + CONTROLLER_31, + CONTROLLER_32, + CONTROLLER_TWORETURNVALUES, + CONTROLLER_CHOSENMONRETURNVALUE, + CONTROLLER_ONERETURNVALUE, + CONTROLLER_ONERETURNVALUE_DUPLICATE, + CONTROLLER_37, + CONTROLLER_38, + CONTROLLER_39, + CONTROLLER_40, + CONTROLLER_HITANIMATION, + CONTROLLER_42, + CONTROLLER_EFFECTIVENESSSOUND, + CONTROLLER_PLAYFANFAREORBGM, + CONTROLLER_FAINTINGCRY, + CONTROLLER_INTROSLIDE, + CONTROLLER_INTROTRAINERBALLTHROW, + CONTROLLER_DRAWPARTYSTATUSSUMMARY, + CONTROLLER_49, + CONTROLLER_50, + CONTROLLER_SPRITEINVISIBILITY, + CONTROLLER_BATTLEANIMATION, + CONTROLLER_LINKSTANDBYMSG, + CONTROLLER_RESETACTIONMOVESELECTION, + CONTROLLER_55, + /*new controllers should go here*/ + CONTROLLER_TERMINATOR_NOP, + CONTROLLER_CMDS_COUNT +}; //extern needed variables extern u8 gCritMultiplier; extern s32 gBattleMoveDamage; -extern u32 gStatuses3[4]; +extern u32 gStatuses3[BATTLE_BANKS_COUNT]; extern u16 gBattleTypeFlags; -extern const u32 gBitTable[]; extern const struct BaseStats gBaseStats[]; -extern struct BattleEnigmaBerry gEnigmaBerries[4]; -extern struct BattlePokemon gBattleMons[4]; +extern struct BattleEnigmaBerry gEnigmaBerries[BATTLE_BANKS_COUNT]; +extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT]; extern u8 gActiveBank; extern u32 gBattleExecBuffer; extern u8 gNoOfAllBanks; -extern u16 gBattlePartyID[4]; -extern u8 gTurnOrder[4]; -extern u8 gUnknown_02024A76[4]; +extern u16 gBattlePartyID[BATTLE_BANKS_COUNT]; +extern u8 gBanksByTurnOrder[BATTLE_BANKS_COUNT]; +extern u8 gActionsByTurnOrder[BATTLE_BANKS_COUNT]; extern u16 gCurrentMove; extern u8 gLastUsedAbility; extern u16 gBattleWeather; @@ -45,7 +116,7 @@ extern u8 gEffectBank; extern u8 gAbsentBankFlags; extern u8 gMultiHitCounter; extern u16 gLastUsedMove[4]; -extern u16 gLockedMove[4]; +extern u16 gLockedMoves[4]; extern u16 gChosenMovesByBanks[4]; extern u16 gSideAffecting[2]; extern u16 gPauseCounterBattle; @@ -56,23 +127,23 @@ extern u8 gBattleTerrain; extern u16 gTrainerBattleOpponent; extern u8 gBankAttacker; extern u8 gBankTarget; -extern u8* gBattlescriptCurrInstr; +extern const u8* gBattlescriptCurrInstr; extern u8 gCurrMovePos; -extern u8 gFightStateTracker; +extern u8 gCurrentActionFuncId; extern u32 gHitMarker; extern u8 gBattleMoveFlags; extern u8 gBattleCommunication[]; -extern u16 gMoveHitWith[4]; -extern u16 gUnknown_02024C44[4]; +extern u16 gLastLandedMoves[4]; +extern u16 gLastHitByType[4]; extern u8 gStringBank; extern u16 gDynamicBasePower; extern const u8 gTypeEffectiveness[]; extern u16 gLastUsedItem; extern u16 gBattleMovePower; -extern s32 gHP_dealt; -extern s32 gTakenDmg[4]; -extern u8 gTakenDmgBanks[4]; -extern const u16 gMissStrings[]; +extern s32 gHpDealt; +extern s32 gTakenDmg[BATTLE_BANKS_COUNT]; +extern u8 gTakenDmgBanks[BATTLE_BANKS_COUNT]; +extern const u16 gMissStringIds[]; extern u8 gSentPokesToOpponent[2]; extern u8 gBank1; extern u16 gExpShareExp; @@ -92,52 +163,62 @@ extern u16 gChosenMove; //last used move in battle extern u8 gBankInMenu; extern u8 gActionForBanks[4]; extern u16 gUnknown_02024C2C[4]; //last used moves 2, used by sketch -extern u16 gUnknown_030041B0; +extern u16 gBattle_BG3_X; extern u16 gUnknown_02024C4C[4]; //last used moves by banks, another one -extern u8 gCurrentMoveTurn; +extern u8 gCurrentTurnActionNumber; extern u16 gTrappingMoves[]; +extern u8 BattleScript_MoveEffectSleep[]; +extern u8 BattleScript_MoveEffectPoison[]; +extern u8 BattleScript_MoveEffectBurn[]; +extern u8 BattleScript_MoveEffectFreeze[]; +extern u8 BattleScript_MoveEffectParalysis[]; +extern u8 BattleScript_MoveEffectToxic[]; +extern u8 BattleScript_MoveEffectConfusion[]; +extern u8 BattleScript_MoveEffectUproar[]; +extern u8 BattleScript_MoveEffectWrap[]; +extern u8 BattleScript_MoveEffectPayDay[]; +extern u8 BattleScript_MoveEffectRecoil33[]; + //extern functions u8 AtkCanceller_UnableToUseMove(void); void PressurePPLose(u8 bank_atk, u8 bank_def, u16 move); void CancelMultiTurnMoves(u8 bank); -void b_movescr_stack_push(u8* BS_ptr); -void b_movescr_stack_push_cursor(void); +void BattleScriptPush(const u8* BS_ptr); +void BattleScriptPushCursor(void); void RecordAbilityBattle(u8 bank, u8 ability); void RecordItemBattle(u8 bank, u8 holdEffect); -int IsPokeDisobedient(void); static bool8 IsTwoTurnsMove(u16 move); -static void DestinyBondFlagUpdate(void); -static void b_wonderguard_and_levitate(void); +static void TrySetDestinyBondToHappen(void); +static void CheckWonderGuardAndLevitate(void); u8 GetBankIdentity(u8 bank); u8 GetBankSide(u8 bank); u8 GetBattleBank(u8 bankValue); s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 a4, u16 powerOverride, u8 typeOverride, u8 bank_atk, u8 bank_def); static u8 AttacksThisTurn(u8 bank, u16 move); //Note: returns 1 if it's a charging turn, otherwise 2 void UndoEffectsAfterFainting(void); -void BattleMusicStop(void); +void BattleStopLowHpSound(void); void PlayBGM(u16 songID); void MonGainEVs(struct Pokemon*, u16 defeatedSpecies); extern u8 gBattleBufferB[4][0x200]; -void sub_80324F8(struct Pokemon*, u8 bank); +void HandleLowHpMusicChange(struct Pokemon*, u8 bank); void AdjustFriendship(struct Pokemon*, u8 value); bool8 IsTradedMon(struct Pokemon*); -void b_movescr_stack_pop_cursor(void); -void SwitchInClearStructs(void); +void BattleScriptPop(void); +void SwitchInClearSetData(void); u8* ConvertIntToDecimalStringN(u8*, s32, u8, u8); u8 GetSetPokedexFlag(u16 nationalNum, u8 caseID); u16 SpeciesToNationalPokedexNum(u16 species); u8 sub_803FC34(u8 bank); u16 sub_803FBFC(u8 a); -u8 GetBankByPlayerAI(u8 ID); +u8 GetBankByIdentity(u8 ID); void sub_8012258(u8); -void sub_80157C4(u8 bank); //update sent pokes in battle //MonTryLearningNewMove teach poke a move u16 GiveMoveToBattleMon(struct BattlePokemon *mon, u16 move); void IncrementGameStat(u8 index); u8 GetScaledHPFraction(s16 hp, s16 maxhp, u8 scale); u16 GetPokedexHeightWeight(u16 national_num, u8 heightweight); -u8 sub_814A5C0(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5); +u8 MenuCursor_Create814A5C0(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5); void DestroyMenuCursor(void); void sub_802BC6C(void); u8 sub_809FA30(void); @@ -145,24 +226,19 @@ bool32 IsHMMove2(u16 move); void sub_802BBD4(u8 r0, u8 r1, u8 r2, u8 r3, u8 sp0); void nullsub_6(void); void ReshowBattleScreenAfterMenu(void); -void sub_800F808(void); +void BattleMainCB2(void); void AddMoney(u32* moneySaveblock, u32 to_give); -void sub_80156DC(void); //set sentpokes value -bool8 sub_8014AB8(u8 bank); //can run from battle u8 CountAliveMons(u8 caseID); -void sub_803E1B0(struct Pokemon*, u16 item, u8 partyID, u8 r3, u8 sp); +void PokemonUseItemEffects(struct Pokemon*, u16 item, u8 partyID, u8 r3, u8 sp); u8 CanRunFromBattle(void); u8 GetMoveTarget(u16 move, u8 targetbyte); //get target of move -void sub_80153D0(u8 atk); //pressure perish song pp decrement u8 CastformDataTypeChange(u8 bank); -void b_push_move_exec(u8* bs_ptr); u8 Overworld_GetMapTypeOfSaveblockLocation(void); u8 CalculatePlayerPartyCount(void); u16 Sqrt(u32 num); u8 sub_809070C(u16 nationalNum, u32 TiD, u32 PiD); //task prepare poke dex display -void sub_814A880(u8 a1, u8 a2); +void MenuCursor_SetPos814A880(u8 a1, u8 a2); u8 CheckMoveLimitations(u8 bank, u8 unusable_moves, u8 flags); -void sub_801529C(u8 bank); bool8 IsLinkDoubleBattle(void); void sub_8094B6C(u8 bank, u8 partyID, u8 r2); @@ -231,7 +307,7 @@ extern u8 BattleScript_SelectingImprisionedMoveInPalace[]; #define BS2ScriptRead16(ptr) ((ptr)[0] + ((ptr)[1] << 8)) #define BS2ScriptReadPtr(ptr) ((void *)BS2ScriptRead32(ptr)) -#define TargetProtectAffected ((gProtectStructs[gBankTarget].protected && gBattleMoves[gCurrentMove].flags & FLAG_PROTECT_AFFECTED)) +#define TARGET_PROTECT_AFFECTED ((gProtectStructs[gBankTarget].protected && gBattleMoves[gCurrentMove].flags & FLAG_PROTECT_AFFECTED)) //array entries for battle communication #define MOVE_EFFECT_BYTE 0x3 @@ -273,7 +349,7 @@ extern u8 BattleScript_SelectingImprisionedMoveInPalace[]; #define RecordAbilitySetField6(ability, fieldValue) \ (gLastUsedAbility = ability, gBattleCommunication[6] = fieldValue, RecordAbilityBattle(gBankTarget, ability)) -#define TARGET_TURN_DAMAGED (((gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_physical.moveturnLostHP_special))) +#define TARGET_TURN_DAMAGED (((gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special))) #define HP_ON_SWITCHOUT (((u16*)(ewram_addr + 0x160BC))) @@ -350,7 +426,7 @@ static void atk45_playanimation(void); static void atk46_playanimation2(void); static void atk47_setgraphicalstatchangevalues(void); static void atk48_playstatchangeanimation(void); -static void atk49_moveend(void); +void atk49_moveend(void); static void atk4A_typecalc2(void); static void atk4B_returnatktoball(void); static void atk4C_getswitchedmondata(void); @@ -414,7 +490,7 @@ static void atk85_stockpile(void); static void atk86_stockpiletobasedamage(void); static void atk87_stockpiletohpheal(void); static void atk88_negativedamage(void); -static u8 ChangeStatBuffs(s8, u8, u8, u8*); +static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr); static void atk89_statbuffchange(void); static void atk8A_normalisebuffs(void); static void atk8B_setbide(void); @@ -527,7 +603,7 @@ static void atkF5_removeattackerstatus1(void); static void atkF6_finishaction(void); static void atkF7_finishturn(void); -const BattleCmdFunc gBattleScriptingCommandsTable[] = +void (* const gBattleScriptingCommandsTable[])(void) = { atk00_attackcanceler, atk01_accuracycheck, @@ -779,13 +855,13 @@ const BattleCmdFunc gBattleScriptingCommandsTable[] = atkF7_finishturn, }; -struct statFractions +struct StatFractions { u8 dividend; u8 divisor; }; -static const struct statFractions gAccuracyStageRatios[] = +static const struct StatFractions gAccuracyStageRatios[] = { { 33, 100}, // -6 { 36, 100}, // -5 @@ -802,25 +878,25 @@ static const struct statFractions gAccuracyStageRatios[] = { 3, 1}, // +6 }; -//The chance is 1/N for each stage. -static const u16 gCriticalHitChance[] = {16, 8, 4, 3, 2}; +// The chance is 1/N for each stage. +static const u16 sCriticalHitChance[] = {16, 8, 4, 3, 2}; -static const u32 gStatusFlagsForMoveEffects[] = +static const u32 sStatusFlagsForMoveEffects[] = { 0x00000000, - 0x00000007, - 0x00000008, - 0x00000010, - 0x00000020, - 0x00000040, - 0x00000080, - 0x00000007, - 0x00000008, + STATUS_SLEEP, + STATUS_POISON, + STATUS_BURN, + STATUS_FREEZE, + STATUS_PARALYSIS, + STATUS_TOXIC_POISON, + STATUS2_CONFUSION, + STATUS2_FLINCHED, 0x00000000, - 0x00000070, + STATUS2_UPROAR, 0x00000000, - 0x00001000, - 0x0000E000, + STATUS2_MULTIPLETURNS, + STATUS2_WRAPPED, 0x00000000, 0x00000000, 0x00000000, @@ -836,11 +912,11 @@ static const u32 gStatusFlagsForMoveEffects[] = 0x00000000, 0x00000000, 0x00000000, - 0x00400000, + STATUS2_RECHARGE, 0x00000000, 0x00000000, - 0x04000000, - 0x08000000, + STATUS2_ESCAPE_PREVENTION, + STATUS2_NIGHTMARE, 0x00000000, 0x00000000, 0x00000000, @@ -860,7 +936,7 @@ static const u32 gStatusFlagsForMoveEffects[] = 0x00000000, 0x00000000, 0x00000000, - 0x00000C00, + STATUS2_LOCK_CONFUSE, 0x00000000, 0x00000000, 0x00000000, @@ -869,18 +945,6 @@ static const u32 gStatusFlagsForMoveEffects[] = 0x00000000 }; -extern u8 BattleScript_MoveEffectSleep[]; -extern u8 BattleScript_MoveEffectPoison[]; -extern u8 BattleScript_MoveEffectBurn[]; -extern u8 BattleScript_MoveEffectFreeze[]; -extern u8 BattleScript_MoveEffectParalysis[]; -extern u8 BattleScript_MoveEffectToxic[]; -extern u8 BattleScript_MoveEffectConfusion[]; -extern u8 BattleScript_MoveEffectUproar[]; -extern u8 BattleScript_MoveEffectWrap[]; -extern u8 BattleScript_MoveEffectPayDay[]; -extern u8 BattleScript_MoveEffectRecoil33[]; - u8* const gMoveEffectBS_Ptrs[] = { BattleScript_MoveEffectSleep, @@ -926,17 +990,25 @@ u8* const gMoveEffectBS_Ptrs[] = const u8 sUnreferencedBitMask1[] = {0, 1, 3, 7, 0xF, 0x1F, 0x3F}; -const u8 gLevelUpStatBoxStats[] = {MON_DATA_MAX_HP, MON_DATA_SPATK, MON_DATA_ATK, MON_DATA_SPDEF, MON_DATA_DEF, MON_DATA_SPEED}; +const u8 gLevelUpStatBoxStats[] = +{ + MON_DATA_MAX_HP, MON_DATA_SPATK, MON_DATA_ATK, + MON_DATA_SPDEF, MON_DATA_DEF, MON_DATA_SPEED +}; static const u16 sProtectSuccessRates[] = {0xFFFF, 0x7FFF, 0x3FFF, 0x1FFF}; -static const u16 sUnknown_081FACFE[] = //banned moves to copy +#define MIMIC_FORBIDDEN_END 0xFFFE +#define METRONOME_FORBIDDEN_END 0xFFFF +#define ASSIST_FORBIDDEN_END 0xFFFF + +static const u16 sMovesForbiddenToCopy[] = { MOVE_METRONOME, MOVE_STRUGGLE, MOVE_SKETCH, MOVE_MIMIC, - 0xFFFE, + MIMIC_FORBIDDEN_END, MOVE_COUNTER, MOVE_MIRROR_COAT, MOVE_PROTECT, @@ -951,10 +1023,10 @@ static const u16 sUnknown_081FACFE[] = //banned moves to copy MOVE_COVET, MOVE_TRICK, MOVE_FOCUS_PUNCH, - 0xFFFF + METRONOME_FORBIDDEN_END }; -static const u8 sUnknown_081FAD26[] = //reversal+flail HP thresholds to power +static const u8 sFlailHpScaleToPowerTable[] = //reversal+flail HP thresholds to power { 1, 200, 4, 150, @@ -978,16 +1050,16 @@ static const u16 sNaturePowerMoves[] = MOVE_SWIFT }; -//weight-based damage table for Low Kick -//format: min. weight (hectograms), base power -static const u16 sWeightDamage[] = +// weight-based damage table for Low Kick +// format: min. weight (hectograms), base power +static const u16 sWeightToDamageTable[] = { 100, 20, 250, 40, 500, 60, 1000, 80, 2000, 100, - -1, -1 + 0xFFFF, 0xFFFF }; static const u16 sPickupItems[] = @@ -1012,23 +1084,24 @@ static const u8 sTerrainToType[] = TYPE_WATER, // underwater TYPE_WATER, // water TYPE_WATER, // pond water - TYPE_ROCK , // rock - TYPE_ROCK , // cave + TYPE_ROCK, // rock + TYPE_ROCK, // cave TYPE_NORMAL, // building TYPE_NORMAL, // plain }; static const u8 sBallCatchBonuses[] = { - 20, 15, 10, 15 //Ultra, Great, Poke, Safari + 20, 15, 10, 15 // Ultra, Great, Poke, Safari }; static void atk00_attackcanceler(void) { - int i; - if (gBattleOutcome) + s32 i; + + if (gBattleOutcome != 0) { - gFightStateTracker = 0xC; + gCurrentActionFuncId = ACTION_FINISHED; return; } if (gBattleMons[gBankAttacker].hp == 0 && !(gHitMarker & HITMARKER_NO_ATTACKSTRING)) @@ -1039,7 +1112,7 @@ static void atk00_attackcanceler(void) } if (AtkCanceller_UnableToUseMove()) return; - if (AbilityBattleEffects(2, gBankTarget, 0, 0, 0)) + if (AbilityBattleEffects(ABILITYEFFECT_MOVES_BLOCK, gBankTarget, 0, 0, 0)) return; if (!gBattleMons[gBankAttacker].pp[gCurrMovePos] && gCurrentMove != MOVE_STRUGGLE && !(gHitMarker & 0x800200) && !(gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS)) @@ -1048,58 +1121,65 @@ static void atk00_attackcanceler(void) gBattleMoveFlags |= MOVESTATUS_MISSED; return; } + gHitMarker &= ~(HITMARKER_x800000); + if (!(gHitMarker & HITMARKER_OBEYS) && !(gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS)) { - u8 disobedient = IsPokeDisobedient(); - asm("":::"r0"); //It's impossible to match - asm("":::"r1"); - if ((disobedient)) + i = IsMonDisobedient(); // why use the 'i' variable...? + switch (i) { - if (disobedient == 2) - gHitMarker |= HITMARKER_OBEYS; - else - gBattleMoveFlags |= MOVESTATUS_MISSED; + case 0: + break; + case 2: + gHitMarker |= HITMARKER_OBEYS; + return; + default: + gBattleMoveFlags |= MOVESTATUS_MISSED; return; } } + gHitMarker |= HITMARKER_OBEYS; + if (gProtectStructs[gBankTarget].bounceMove && gBattleMoves[gCurrentMove].flags & FLAG_MAGICCOAT_AFFECTED) { PressurePPLose(gBankAttacker, gBankTarget, MOVE_MAGIC_COAT); gProtectStructs[gBankTarget].bounceMove = 0; - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MagicCoatBounce; return; } + for (i = 0; i < gNoOfAllBanks; i++) { - if ((gProtectStructs[gTurnOrder[i]].stealMove) && gBattleMoves[gCurrentMove].flags & FLAG_SNATCH_AFFECTED) + if ((gProtectStructs[gBanksByTurnOrder[i]].stealMove) && gBattleMoves[gCurrentMove].flags & FLAG_SNATCH_AFFECTED) { - PressurePPLose(gBankAttacker, gTurnOrder[i], MOVE_SNATCH); - gProtectStructs[gTurnOrder[i]].stealMove = 0; - BATTLE_STRUCT->scriptingActive = gTurnOrder[i]; - b_movescr_stack_push_cursor(); + PressurePPLose(gBankAttacker, gBanksByTurnOrder[i], MOVE_SNATCH); + gProtectStructs[gBanksByTurnOrder[i]].stealMove = 0; + gBattleStruct->scriptingActive = gBanksByTurnOrder[i]; + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SnatchedMove; return; } } + if (gSpecialStatuses[gBankTarget].lightningRodRedirected) { gSpecialStatuses[gBankTarget].lightningRodRedirected = 0; gLastUsedAbility = ABILITY_LIGHTNING_ROD; - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_TookAttack; RecordAbilityBattle(gBankTarget, gLastUsedAbility); } - else if (TargetProtectAffected + else if (TARGET_PROTECT_AFFECTED && (gCurrentMove != MOVE_CURSE || (gBattleMons[gBankAttacker].type1 == TYPE_GHOST || gBattleMons[gBankAttacker].type2 == TYPE_GHOST)) && ((!IsTwoTurnsMove(gCurrentMove) || (gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS)))) { CancelMultiTurnMoves(gBankAttacker); gBattleMoveFlags |= MOVESTATUS_MISSED; - gMoveHitWith[gBankTarget] = 0; - gUnknown_02024C44[gBankTarget] = 0; + gLastLandedMoves[gBankTarget] = 0; + gLastHitByType[gBankTarget] = 0; gBattleCommunication[6] = 1; gBattlescriptCurrInstr++; } @@ -1111,25 +1191,25 @@ static void atk00_attackcanceler(void) static void JumpIfMoveFailed(u8 adder, u16 move) { - void* to_store = gBattlescriptCurrInstr + adder; + const u8 *BS_ptr = gBattlescriptCurrInstr + adder; if (gBattleMoveFlags & MOVESTATUS_NOEFFECT) { - gMoveHitWith[gBankTarget] = 0; - gUnknown_02024C44[gBankTarget] = 0; - to_store = T1_READ_PTR(gBattlescriptCurrInstr + 1); + gLastLandedMoves[gBankTarget] = 0; + gLastHitByType[gBankTarget] = 0; + BS_ptr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { - DestinyBondFlagUpdate(); - if (AbilityBattleEffects(3, gBankTarget, 0, 0, move)) + TrySetDestinyBondToHappen(); + if (AbilityBattleEffects(ABILITYEFFECT_ABSORBING, gBankTarget, 0, 0, move)) return; } - gBattlescriptCurrInstr = to_store; + gBattlescriptCurrInstr = BS_ptr; } static void atk40_jumpifaffectedbyprotect(void) { - if (TargetProtectAffected) + if (TARGET_PROTECT_AFFECTED) { gBattleMoveFlags |= MOVESTATUS_MISSED; JumpIfMoveFailed(5, 0); @@ -1143,13 +1223,13 @@ static void atk40_jumpifaffectedbyprotect(void) static bool8 JumpIfMoveAffectedByProtect(u16 move) { - bool8 affected = 0; - if (TargetProtectAffected) + bool8 affected = FALSE; + if (TARGET_PROTECT_AFFECTED) { gBattleMoveFlags |= MOVESTATUS_MISSED; JumpIfMoveFailed(7, move); gBattleCommunication[6] = 1; - affected = 1; + affected = TRUE; } return affected; } @@ -1168,6 +1248,7 @@ static bool8 AccuracyCalcHelper(u16 move) JumpIfMoveFailed(7, move); return TRUE; } + gHitMarker &= ~HITMARKER_IGNORE_ON_AIR; if (!(gHitMarker & HITMARKER_IGNORE_UNDERGROUND) && gStatuses3[gBankTarget] & STATUS3_UNDERGROUND) @@ -1176,6 +1257,7 @@ static bool8 AccuracyCalcHelper(u16 move) JumpIfMoveFailed(7, move); return TRUE; } + gHitMarker &= ~HITMARKER_IGNORE_UNDERGROUND; if (!(gHitMarker & HITMARKER_IGNORE_UNDERWATER) && gStatuses3[gBankTarget] & STATUS3_UNDERWATER) @@ -1184,6 +1266,7 @@ static bool8 AccuracyCalcHelper(u16 move) JumpIfMoveFailed(7, move); return TRUE; } + gHitMarker &= ~HITMARKER_IGNORE_UNDERWATER; if ((WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_RAIN_ANY) && gBattleMoves[move].effect == EFFECT_THUNDER) @@ -1192,12 +1275,14 @@ static bool8 AccuracyCalcHelper(u16 move) JumpIfMoveFailed(7, move); return TRUE; } + return FALSE; } static void atk01_accuracycheck(void) { u16 move = T2_READ_16(gBattlescriptCurrInstr + 5); + if (move == 0xFFFE || move == 0xFFFF) { if (gStatuses3[gBankTarget] & STATUS3_ALWAYS_HITS && move == 0xFFFF && gDisableStructs[gBankTarget].bankWithSureHit == gBankAttacker) @@ -1209,13 +1294,14 @@ static void atk01_accuracycheck(void) } else { - u8 type; s8 buff; u8 MoveAcc; u16 calc; u8 hold_effect; u8 quality; - if (move == 0) {move = gCurrentMove;} + u8 type, moveAcc, holdEffect, quality; + s8 buff; + u16 calc; - if (BATTLE_STRUCT->dynamicMoveType) - type = BATTLE_STRUCT->dynamicMoveType & 0x3F; - else - type = gBattleMoves[move].type; + if (move == 0) + move = gCurrentMove; + + GET_MOVE_TYPE(move, type); if (JumpIfMoveAffectedByProtect(move)) return; @@ -1233,47 +1319,52 @@ static void atk01_accuracycheck(void) buff = acc + 6 - gBattleMons[gBankTarget].statStages[STAT_STAGE_EVASION]; } - if (buff < 0) {buff = 0;} - if (buff > 0xC) {buff = 0xC;} + if (buff < 0) + buff = 0; + if (buff > 0xC) + buff = 0xC; - MoveAcc = gBattleMoves[move].accuracy; - //check Thunder on sunny weather + moveAcc = gBattleMoves[move].accuracy; + // check Thunder on sunny weather if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY && gBattleMoves[move].effect == EFFECT_THUNDER) - MoveAcc = 50; + moveAcc = 50; - calc = gAccuracyStageRatios[buff].dividend * MoveAcc; + calc = gAccuracyStageRatios[buff].dividend * moveAcc; calc /= gAccuracyStageRatios[buff].divisor; if (gBattleMons[gBankAttacker].ability == ABILITY_COMPOUND_EYES) - calc = (calc * 130) / 100; //1.3 compound eyes boost + calc = (calc * 130) / 100; // 1.3 compound eyes boost if (WEATHER_HAS_EFFECT && gBattleMons[gBankTarget].ability == ABILITY_SAND_VEIL && gBattleWeather & WEATHER_SANDSTORM_ANY) - calc = (calc * 80) / 100; //1.2 sand veil loss; + calc = (calc * 80) / 100; // 1.2 sand veil loss; if (gBattleMons[gBankAttacker].ability == ABILITY_HUSTLE && type < 9) - calc = (calc * 80) / 100; //1.2 hustle loss; + calc = (calc * 80) / 100; // 1.2 hustle loss; if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY) - hold_effect = gEnigmaBerries[gBankTarget].holdEffect, quality = gEnigmaBerries[gBankTarget].holdEffectParam; + { + holdEffect = gEnigmaBerries[gBankTarget].holdEffect; + quality = gEnigmaBerries[gBankTarget].holdEffectParam; + } else { - hold_effect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item); + holdEffect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item); quality = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item); } gStringBank = gBankTarget; - if (hold_effect == HOLD_EFFECT_EVASION_UP) + if (holdEffect == HOLD_EFFECT_EVASION_UP) calc = (calc * (100 - quality)) / 100; - //final calculation + // final calculation if ((Random() % 100 + 1) > calc) { gBattleMoveFlags |= MOVESTATUS_MISSED; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && (gBattleMoves[move].target == 0x8 || gBattleMoves[move].target == 0x20)) + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && + (gBattleMoves[move].target == 0x8 || gBattleMoves[move].target == 0x20)) gBattleCommunication[6] = 2; else gBattleCommunication[6] = 0; - b_wonderguard_and_levitate(); - + CheckWonderGuardAndLevitate(); } JumpIfMoveFailed(7, move); } @@ -1294,31 +1385,35 @@ static void atk02_attackstring(void) static void atk03_ppreduce(void) { - int to_deduct = 1; + s32 ppToDeduct = 1; + if (gBattleExecBuffer) return; + if (!gSpecialStatuses[gBankAttacker].flag20) { switch (gBattleMoves[gCurrentMove].target) { case TARGET_FOES_AND_ALLY: - to_deduct += AbilityBattleEffects(ABILITYEFFECT_COUNT_ON_FIELD, gBankAttacker, ABILITY_PRESSURE, 0, 0); + ppToDeduct += AbilityBattleEffects(ABILITYEFFECT_COUNT_ON_FIELD, gBankAttacker, ABILITY_PRESSURE, 0, 0); break; case TARGET_BOTH: case TARGET_OPPONENTS_FIELD: - to_deduct += AbilityBattleEffects(ABILITYEFFECT_COUNT_OTHER_SIZE, gBankAttacker, ABILITY_PRESSURE, 0, 0); + ppToDeduct += AbilityBattleEffects(ABILITYEFFECT_COUNT_OTHER_SIZE, gBankAttacker, ABILITY_PRESSURE, 0, 0); break; default: if (gBankAttacker != gBankTarget && gBattleMons[gBankTarget].ability == ABILITY_PRESSURE) - to_deduct++; + ppToDeduct++; break; } } + if (!(gHitMarker & (HITMARKER_NO_PPDEDUCT | HITMARKER_NO_ATTACKSTRING)) && gBattleMons[gBankAttacker].pp[gCurrMovePos]) { gProtectStructs[gBankAttacker].notFirstStrike = 1; - if (gBattleMons[gBankAttacker].pp[gCurrMovePos] > to_deduct) - gBattleMons[gBankAttacker].pp[gCurrMovePos] -= to_deduct; + + if (gBattleMons[gBankAttacker].pp[gCurrMovePos] > ppToDeduct) + gBattleMons[gBankAttacker].pp[gCurrMovePos] -= ppToDeduct; else gBattleMons[gBankAttacker].pp[gCurrMovePos] = 0; @@ -1326,60 +1421,49 @@ static void atk03_ppreduce(void) && !((gDisableStructs[gBankAttacker].unk18_b) & gBitTable[gCurrMovePos])) { gActiveBank = gBankAttacker; - EmitSetAttributes(0, REQUEST_PPMOVE1_BATTLE + gCurrMovePos, 0, 1, &gBattleMons[gBankAttacker].pp[gCurrMovePos]); + EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + gCurrMovePos, 0, 1, &gBattleMons[gBankAttacker].pp[gCurrMovePos]); MarkBufferBankForExecution(gBankAttacker); } } + gHitMarker &= ~(HITMARKER_NO_PPDEDUCT); gBattlescriptCurrInstr++; } static void atk04_critcalc(void) { - u8 hold_effect; u16 item; u16 crit_chance; int adderv3, adderv5, adderv6, adderv7, adderv8, adderv9, adderv10, adderv11; u16 adderv12; + u8 holdEffect; + u16 item, critChance; + item = gBattleMons[gBankAttacker].item; + if (item == ITEM_ENIGMA_BERRY) - hold_effect = gEnigmaBerries[gBankAttacker].holdEffect; + holdEffect = gEnigmaBerries[gBankAttacker].holdEffect; else - hold_effect = ItemId_GetHoldEffect(item); + holdEffect = ItemId_GetHoldEffect(item); gStringBank = gBankAttacker; - if (gBattleMons[gBankAttacker].status2 & STATUS2_FOCUS_ENERGY) - adderv3 = 2; - else - adderv3 = 0; - - if (gBattleMoves[gCurrentMove].effect == EFFECT_HIGH_CRITICAL) {adderv3++;} - adderv5 = adderv3; - if (gBattleMoves[gCurrentMove].effect == EFFECT_SKY_ATTACK) {adderv5 = adderv3 + 1;} - - if (gBattleMoves[gCurrentMove].effect == EFFECT_BLAZE_KICK) {adderv5++;} - adderv6 = adderv5; - if (gBattleMoves[gCurrentMove].effect == EFFECT_POISON_TAIL) {adderv6 = adderv5 + 1;} - - adderv7 = 0; - if (hold_effect == HOLD_EFFECT_LUCKY_PUNCH && gBattleMons[gBankAttacker].species == SPECIES_CHANSEY) {adderv7 = 1;} - adderv8 = 2 * adderv7; - adderv9 = 0; - if (hold_effect == HOLD_EFFECT_STICK && gBattleMons[gBankAttacker].species == SPECIES_FARFETCHD) {adderv9 = 1;} - adderv11 = 2 * adderv9; - if (hold_effect == HOLD_EFFECT_SCOPE_LENS) - {adderv10 = 1 + adderv6 + adderv8; adderv12 = adderv10 + adderv11;} - else - {adderv10 = adderv6 + adderv8; adderv12 = adderv10 + adderv11;} + critChance = 2 * ((gBattleMons[gBankAttacker].status2 & STATUS2_FOCUS_ENERGY) != 0) + + (gBattleMoves[gCurrentMove].effect == EFFECT_HIGH_CRITICAL) + + (gBattleMoves[gCurrentMove].effect == EFFECT_SKY_ATTACK) + + (gBattleMoves[gCurrentMove].effect == EFFECT_BLAZE_KICK) + + (gBattleMoves[gCurrentMove].effect == EFFECT_POISON_TAIL) + + (holdEffect == HOLD_EFFECT_SCOPE_LENS) + + 2 * (holdEffect == HOLD_EFFECT_LUCKY_PUNCH && gBattleMons[gBankAttacker].species == SPECIES_CHANSEY) + + 2 * (holdEffect == HOLD_EFFECT_STICK && gBattleMons[gBankAttacker].species == SPECIES_FARFETCHD); - crit_chance = adderv12; - - if (crit_chance > 4) {crit_chance = 4;} + if (critChance > 4) + critChance = 4; if ((gBattleMons[gBankTarget].ability != ABILITY_BATTLE_ARMOR && gBattleMons[gBankTarget].ability != ABILITY_SHELL_ARMOR) && !(gStatuses3[gBankAttacker] & STATUS3_CANT_SCORE_A_CRIT) && !(gBattleTypeFlags & (BATTLE_TYPE_WALLY_TUTORIAL | BATTLE_TYPE_FIRST_BATTLE)) - && !(Random() % gCriticalHitChance[crit_chance])) + && !(Random() % sCriticalHitChance[critChance])) gCritMultiplier = 2; else gCritMultiplier = 1; + gBattlescriptCurrInstr++; } @@ -1388,8 +1472,8 @@ static void atk05_damagecalc(void) u16 side_hword = gSideAffecting[GetBankIdentity(gBankTarget) & 1]; gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBankAttacker], &gBattleMons[gBankTarget], gCurrentMove, side_hword, gDynamicBasePower, - BATTLE_STRUCT->dynamicMoveType, gBankAttacker, gBankTarget); - gBattleMoveDamage = gBattleMoveDamage * gCritMultiplier * BATTLE_STRUCT->dmgMultiplier; + gBattleStruct->dynamicMoveType, gBankAttacker, gBankTarget); + gBattleMoveDamage = gBattleMoveDamage * gCritMultiplier * gBattleStruct->dmgMultiplier; if (gStatuses3[gBankAttacker] & STATUS3_CHARGED_UP && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC) gBattleMoveDamage *= 2; @@ -1404,9 +1488,9 @@ void AI_CalcDmg(u8 BankAtk, u8 BankDef) u16 side_hword = gSideAffecting[GetBankIdentity(BankDef) & 1]; gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[BankAtk], &gBattleMons[BankDef], gCurrentMove, side_hword, gDynamicBasePower, - BATTLE_STRUCT->dynamicMoveType, BankAtk, BankDef); + gBattleStruct->dynamicMoveType, BankAtk, BankDef); gDynamicBasePower = 0; - gBattleMoveDamage = gBattleMoveDamage * gCritMultiplier * BATTLE_STRUCT->dmgMultiplier; + gBattleMoveDamage = gBattleMoveDamage * gCritMultiplier * gBattleStruct->dmgMultiplier; if (gStatuses3[BankAtk] & STATUS3_CHARGED_UP && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC) gBattleMoveDamage *= 2; @@ -1454,8 +1538,8 @@ static void atk06_typecalc(void) u8 move_type; if (gCurrentMove != MOVE_STRUGGLE) { - if (BATTLE_STRUCT->dynamicMoveType) - move_type = BATTLE_STRUCT->dynamicMoveType & 0x3F; + if (gBattleStruct->dynamicMoveType) + move_type = gBattleStruct->dynamicMoveType & 0x3F; else move_type = gBattleMoves[gCurrentMove].type; @@ -1470,8 +1554,8 @@ static void atk06_typecalc(void) { gLastUsedAbility = gBattleMons[gBankTarget].ability; gBattleMoveFlags |= (MOVESTATUS_MISSED | MOVESTATUS_NOTAFFECTED); - gMoveHitWith[gBankTarget] = 0; - gUnknown_02024C44[gBankTarget] = 0; + gLastLandedMoves[gBankTarget] = 0; + gLastHitByType[gBankTarget] = 0; gBattleCommunication[6] = move_type; RecordAbilityBattle(gBankTarget, gLastUsedAbility); } @@ -1507,8 +1591,8 @@ static void atk06_typecalc(void) { gLastUsedAbility = ABILITY_WONDER_GUARD; gBattleMoveFlags |= MOVESTATUS_MISSED; - gMoveHitWith[gBankTarget] = 0; - gUnknown_02024C44[gBankTarget] = 0; + gLastLandedMoves[gBankTarget] = 0; + gLastHitByType[gBankTarget] = 0; gBattleCommunication[6] = 3; RecordAbilityBattle(gBankTarget, gLastUsedAbility); } @@ -1517,7 +1601,7 @@ static void atk06_typecalc(void) } gBattlescriptCurrInstr++; } -static void b_wonderguard_and_levitate(void) +static void CheckWonderGuardAndLevitate(void) { u8 flags = 0; int i = 0; @@ -1526,8 +1610,8 @@ static void b_wonderguard_and_levitate(void) if (gCurrentMove == MOVE_STRUGGLE || !gBattleMoves[gCurrentMove].power) return; - if (BATTLE_STRUCT->dynamicMoveType) - move_type = BATTLE_STRUCT->dynamicMoveType & 0x3F; + if (gBattleStruct->dynamicMoveType) + move_type = gBattleStruct->dynamicMoveType & 0x3F; else move_type = gBattleMoves[gCurrentMove].type; @@ -1845,14 +1929,14 @@ static void atk09_attackanimation(void) if ((gHitMarker & HITMARKER_NO_ANIMATIONS) && (gCurrentMove != MOVE_TRANSFORM && gCurrentMove != MOVE_SUBSTITUTE)) { - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_Pausex20; - BATTLE_STRUCT->animTurn += 1; - BATTLE_STRUCT->animTargetsHit += 1; + gBattleStruct->animTurn += 1; + gBattleStruct->animTargetsHit += 1; } else { - if ((gBattleMoves[gCurrentMove].target & TARGET_BOTH || gBattleMoves[gCurrentMove].target & TARGET_FOES_AND_ALLY || gBattleMoves[gCurrentMove].target & TARGET_DEPENDS) && BATTLE_STRUCT->animTargetsHit) + if ((gBattleMoves[gCurrentMove].target & TARGET_BOTH || gBattleMoves[gCurrentMove].target & TARGET_FOES_AND_ALLY || gBattleMoves[gCurrentMove].target & TARGET_DEPENDS) && gBattleStruct->animTargetsHit) { gBattlescriptCurrInstr++; return; @@ -1861,15 +1945,15 @@ static void atk09_attackanimation(void) { gActiveBank = gBankAttacker; - EmitMoveAnimation(0, gCurrentMove, BATTLE_STRUCT->animTurn, gBattleMovePower, gBattleMoveDamage, gBattleMons[gBankAttacker].friendship, &gDisableStructs[gBankAttacker]); - BATTLE_STRUCT->animTurn += 1; - BATTLE_STRUCT->animTargetsHit += 1; + EmitMoveAnimation(0, gCurrentMove, gBattleStruct->animTurn, gBattleMovePower, gBattleMoveDamage, gBattleMons[gBankAttacker].friendship, &gDisableStructs[gBankAttacker]); + gBattleStruct->animTurn += 1; + gBattleStruct->animTargetsHit += 1; MarkBufferBankForExecution(gBankAttacker); gBattlescriptCurrInstr++; } else { - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_Pausex20; } } @@ -1885,49 +1969,60 @@ static void atk0B_healthbarupdate(void) { if (gBattleExecBuffer) return; - if (gBattleMoveFlags & MOVESTATUS_NOEFFECT) - goto END; - gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - - if (gBattleMons[gActiveBank].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBank].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)) { - PrepareStringBattle(0x80, gActiveBank); - goto END; - } + gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]); - EmitHealthBarUpdate(0, gBattleMoveDamage); - MarkBufferBankForExecution(gActiveBank); + if (gBattleMons[gActiveBank].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBank].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) + { + PrepareStringBattle(0x80, gActiveBank); + } + else + { + // Emerald + /* + s16 healthValue; - if (!GetBankSide(gActiveBank) && gBattleMoveDamage > 0) - gBattleResults.unk5_0 = 1; + s32 currDmg = gBattleMoveDamage; + s32 maxPossibleDmgValue = 10000; // not present in R/S, ensures that huge damage values don't change sign - END: - gBattlescriptCurrInstr += 2; + if (currDmg <= maxPossibleDmgValue) + healthValue = currDmg; + else + healthValue = maxPossibleDmgValue; + + EmitHealthBarUpdate(0, healthValue); + */ + + EmitHealthBarUpdate(0, gBattleMoveDamage); + MarkBufferBankForExecution(gActiveBank); + + if (GetBankSide(gActiveBank) == SIDE_PLAYER && gBattleMoveDamage > 0) + gBattleResults.unk5_0 = 1; + } + } + + gBattlescriptCurrInstr += 2; } static void atk0C_datahpupdate(void) { - register u32 move_type asm("r6"); //no idea how to match it otherwise - u8 dynamic_move_type; + u32 moveType; if (gBattleExecBuffer) return; - dynamic_move_type = BATTLE_STRUCT->dynamicMoveType; - if (dynamic_move_type && !(dynamic_move_type & 0x40)) - { - move_type = 0x3F; - move_type &= dynamic_move_type; - } + if (gBattleStruct->dynamicMoveType == 0) + moveType = gBattleMoves[gCurrentMove].type; + else if (!(gBattleStruct->dynamicMoveType & 0x40)) + moveType = gBattleStruct->dynamicMoveType & 0x3F; else - { - move_type = gBattleMoves[gCurrentMove].type; - } + moveType = gBattleMoves[gCurrentMove].type; if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)) { - gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); + gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]); if (gBattleMons[gActiveBank].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBank].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) { if (gDisableStructs[gActiveBank].substituteHP >= gBattleMoveDamage) @@ -1935,20 +2030,20 @@ static void atk0C_datahpupdate(void) if (gSpecialStatuses[gActiveBank].moveturnLostHP == 0) gSpecialStatuses[gActiveBank].moveturnLostHP = gBattleMoveDamage; gDisableStructs[gActiveBank].substituteHP -= gBattleMoveDamage; - gHP_dealt = gBattleMoveDamage; + gHpDealt = gBattleMoveDamage; } else { if (gSpecialStatuses[gActiveBank].moveturnLostHP == 0) gSpecialStatuses[gActiveBank].moveturnLostHP = gDisableStructs[gActiveBank].substituteHP; - gHP_dealt = gDisableStructs[gActiveBank].substituteHP; + gHpDealt = gDisableStructs[gActiveBank].substituteHP; gDisableStructs[gActiveBank].substituteHP = 0; } - //check substitute fading + // check substitute fading if (gDisableStructs[gActiveBank].substituteHP == 0) { gBattlescriptCurrInstr += 2; - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SubstituteFade; return; } @@ -1956,14 +2051,14 @@ static void atk0C_datahpupdate(void) else { gHitMarker &= ~(HITMARKER_IGNORE_SUBSTITUTE); - if (gBattleMoveDamage < 0) //hp goes up + if (gBattleMoveDamage < 0) // hp goes up { gBattleMons[gActiveBank].hp -= gBattleMoveDamage; if (gBattleMons[gActiveBank].hp > gBattleMons[gActiveBank].maxHP) gBattleMons[gActiveBank].hp = gBattleMons[gActiveBank].maxHP; } - else //hp goes down + else // hp goes down { if (gHitMarker & HITMARKER_x20) { @@ -1972,7 +2067,7 @@ static void atk0C_datahpupdate(void) else { gTakenDmg[gActiveBank] += gBattleMoveDamage; - if (T2_READ_8(gBattlescriptCurrInstr + 1) == 0) + if (gBattlescriptCurrInstr[1] == BS_GET_TARGET) gTakenDmgBanks[gActiveBank] = gBankAttacker; else gTakenDmgBanks[gActiveBank] = gBankTarget; @@ -1981,22 +2076,22 @@ static void atk0C_datahpupdate(void) if (gBattleMons[gActiveBank].hp > gBattleMoveDamage) { gBattleMons[gActiveBank].hp -= gBattleMoveDamage; - gHP_dealt = gBattleMoveDamage; + gHpDealt = gBattleMoveDamage; } else { - gHP_dealt = gBattleMons[gActiveBank].hp; + gHpDealt = gBattleMons[gActiveBank].hp; gBattleMons[gActiveBank].hp = 0; } if (!gSpecialStatuses[gActiveBank].moveturnLostHP && !(gHitMarker & HITMARKER_x100000)) - gSpecialStatuses[gActiveBank].moveturnLostHP = gHP_dealt; + gSpecialStatuses[gActiveBank].moveturnLostHP = gHpDealt; - if (move_type <= 8 && !(gHitMarker & HITMARKER_x100000) && gCurrentMove != MOVE_PAIN_SPLIT) + if (moveType <= 8 && !(gHitMarker & HITMARKER_x100000) && gCurrentMove != MOVE_PAIN_SPLIT) { - gProtectStructs[gActiveBank].physicalDmg = gHP_dealt; - gSpecialStatuses[gActiveBank].moveturnLostHP_physical = gHP_dealt; - if (T2_READ_8(gBattlescriptCurrInstr + 1) == 0) + gProtectStructs[gActiveBank].physicalDmg = gHpDealt; + gSpecialStatuses[gActiveBank].moveturnLostHP_physical = gHpDealt; + if (gBattlescriptCurrInstr[1] == BS_GET_TARGET) { gProtectStructs[gActiveBank].physicalBank = gBankAttacker; gSpecialStatuses[gActiveBank].moveturnPhysicalBank = gBankAttacker; @@ -2007,11 +2102,11 @@ static void atk0C_datahpupdate(void) gSpecialStatuses[gActiveBank].moveturnPhysicalBank = gBankTarget; } } - else if (move_type > 8 && !(gHitMarker & HITMARKER_x100000)) + else if (moveType > 8 && !(gHitMarker & HITMARKER_x100000)) { - gProtectStructs[gActiveBank].specialDmg = gHP_dealt; - gSpecialStatuses[gActiveBank].moveturnLostHP_special = gHP_dealt; - if (T2_READ_8(gBattlescriptCurrInstr + 1) == 0) + gProtectStructs[gActiveBank].specialDmg = gHpDealt; + gSpecialStatuses[gActiveBank].moveturnLostHP_special = gHpDealt; + if (gBattlescriptCurrInstr[1] == BS_GET_TARGET) { gProtectStructs[gActiveBank].specialBank = gBankAttacker; gSpecialStatuses[gActiveBank].moveturnSpecialBank = gBankAttacker; @@ -2024,13 +2119,13 @@ static void atk0C_datahpupdate(void) } } gHitMarker &= ~(HITMARKER_x100000); - EmitSetAttributes(0, REQUEST_HP_BATTLE, 0, 2, &gBattleMons[gActiveBank].hp); + EmitSetMonData(0, REQUEST_HP_BATTLE, 0, 2, &gBattleMons[gActiveBank].hp); MarkBufferBankForExecution(gActiveBank); } } else { - gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); + gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]); if (gSpecialStatuses[gActiveBank].moveturnLostHP == 0) gSpecialStatuses[gActiveBank].moveturnLostHP = 0xFFFF; } @@ -2054,6 +2149,7 @@ static void atk0E_effectivenesssound(void) { if (gBattleExecBuffer) return; + gActiveBank = gBankTarget; if (!(gBattleMoveFlags & MOVESTATUS_MISSED)) { @@ -2098,61 +2194,64 @@ static void atk0E_effectivenesssound(void) static void atk0F_resultmessage(void) { - u16 stringID = 0; + u32 stringId = 0; if (gBattleExecBuffer) return; if (gBattleMoveFlags & MOVESTATUS_MISSED && (!(gBattleMoveFlags & MOVESTATUS_NOTAFFECTED) || gBattleCommunication[6] > 2)) { - stringID = gMissStrings[gBattleCommunication[6]]; + stringId = gMissStringIds[gBattleCommunication[6]]; gBattleCommunication[MSG_DISPLAY] = 1; } else { gBattleCommunication[MSG_DISPLAY] = 1; - switch (gBattleMoveFlags & 0xFE) + switch (gBattleMoveFlags & (u8)(~(MOVESTATUS_MISSED))) { case MOVESTATUS_SUPEREFFECTIVE: - stringID = 0xDE; + stringId = STRINGID_SUPEREFFECTIVE; break; case MOVESTATUS_NOTVERYEFFECTIVE: - stringID = 0xDD; + stringId = STRINGID_NOTVERYEFFECTIVE; break; case MOVESTATUS_ONEHITKO: - stringID = 0xDA; + stringId = STRINGID_ONEHITKO; break; case MOVESTATUS_ENDURED: - stringID = 0x99; + stringId = STRINGID_PKMNENDUREDHIT; break; case MOVESTATUS_FAILED: - goto FAILED; + stringId = STRINGID_BUTITFAILED; + break; case MOVESTATUS_NOTAFFECTED: - goto NOTAFFECTED; + stringId = STRINGID_ITDOESNTAFFECT; + break; case MOVESTATUS_HUNGON: gLastUsedItem = gBattleMons[gBankTarget].item; gStringBank = gBankTarget; gBattleMoveFlags &= ~(MOVESTATUS_ENDURED | MOVESTATUS_HUNGON); - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_HangedOnMsg; return; default: if (gBattleMoveFlags & MOVESTATUS_NOTAFFECTED) - NOTAFFECTED: - stringID = 0x1B; + { + stringId = STRINGID_ITDOESNTAFFECT; + } else if (gBattleMoveFlags & MOVESTATUS_ONEHITKO) { gBattleMoveFlags &= ~(MOVESTATUS_ONEHITKO); gBattleMoveFlags &= ~(MOVESTATUS_SUPEREFFECTIVE); gBattleMoveFlags &= ~(MOVESTATUS_NOTVERYEFFECTIVE); - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_OneHitKOMsg; return; } else if (gBattleMoveFlags & MOVESTATUS_ENDURED) { gBattleMoveFlags &= ~(MOVESTATUS_ENDURED | MOVESTATUS_HUNGON); - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_EnduredMsg; return; } @@ -2161,23 +2260,24 @@ static void atk0F_resultmessage(void) gLastUsedItem = gBattleMons[gBankTarget].item; gStringBank = gBankTarget; gBattleMoveFlags &= ~(MOVESTATUS_ENDURED | MOVESTATUS_HUNGON); - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_HangedOnMsg; return; } else if (gBattleMoveFlags & MOVESTATUS_FAILED) - FAILED: - stringID = 0xE5; + { + stringId = STRINGID_BUTITFAILED; + } else + { gBattleCommunication[MSG_DISPLAY] = 0; + } } } - if (stringID) - { - register u16 dummy asm("r0") = stringID; //Can't match it otherwise - PrepareStringBattle(dummy, gBankAttacker); - } + if (stringId) + PrepareStringBattle(stringId, gBankAttacker); + gBattlescriptCurrInstr++; } @@ -2253,7 +2353,7 @@ u8 BankGetTurnOrder(u8 bank) int i; for (i = 0; i < gNoOfAllBanks; i++) { - if (gTurnOrder[i] == bank) + if (gBanksByTurnOrder[i] == bank) break; } return i; @@ -2274,12 +2374,12 @@ void SetMoveEffect(bool8 primary, u8 certainArg) gEffectBank = gBankAttacker; //bank that effects get applied on gBattleCommunication[MOVE_EFFECT_BYTE] &= ~(EffectAffectsUser); AffectsUser = EffectAffectsUser; - BATTLE_STRUCT->scriptingActive = gBankTarget; //theoretically the attacker + gBattleStruct->scriptingActive = gBankTarget; //theoretically the attacker } else { gEffectBank = gBankTarget; - BATTLE_STRUCT->scriptingActive = gBankAttacker; + gBattleStruct->scriptingActive = gBankAttacker; } if (gBattleMons[gEffectBank].ability == ABILITY_SHIELD_DUST && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && @@ -2299,7 +2399,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) if (gBattleCommunication[MOVE_EFFECT_BYTE] <= 6) //status change { - switch (gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]) + switch (sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]) { case STATUS_SLEEP: //check active uproar @@ -2322,7 +2422,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) { gLastUsedAbility = ABILITY_IMMUNITY; RecordAbilityBattle(gEffectBank, ABILITY_IMMUNITY); - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); //_0801E664: gBattlescriptCurrInstr = BattleScript_PSNPrevention; if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) @@ -2337,7 +2437,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) if ((gBattleMons[gEffectBank].type1 == TYPE_POISON || gBattleMons[gEffectBank].type2 == TYPE_POISON || gBattleMons[gEffectBank].type1 == TYPE_STEEL || gBattleMons[gEffectBank].type2 == TYPE_STEEL) && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == 1 || certain == 0x80)) { - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_PSNPrevention; gBattleCommunication[MULTISTRING_CHOOSER] = 2; return; @@ -2348,7 +2448,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) if (gBattleMons[gEffectBank].type2 == TYPE_STEEL) {break;} if (gBattleMons[gEffectBank].status1) {break;} if (gBattleMons[gEffectBank].ability == ABILITY_IMMUNITY) {break;} - + StatusChanged = 1; break; case STATUS_BURN: @@ -2356,7 +2456,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) { gLastUsedAbility = ABILITY_WATER_VEIL; RecordAbilityBattle(gEffectBank, ABILITY_WATER_VEIL); - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); //_0801E664: gBattlescriptCurrInstr = BattleScript_BRNPrevention; if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) @@ -2371,7 +2471,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) if ((gBattleMons[gEffectBank].type1 == TYPE_FIRE || gBattleMons[gEffectBank].type2 == TYPE_FIRE) && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == 1 || certain == 0x80)) { - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_BRNPrevention; gBattleCommunication[MULTISTRING_CHOOSER] = 2; return; @@ -2400,7 +2500,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) { gLastUsedAbility = ABILITY_LIMBER; RecordAbilityBattle(gEffectBank, ABILITY_LIMBER); - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); //_0801E664: gBattlescriptCurrInstr = BattleScript_PRLZPrevention; if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) @@ -2422,7 +2522,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) { gLastUsedAbility = ABILITY_IMMUNITY; RecordAbilityBattle(gEffectBank, ABILITY_IMMUNITY); - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); //_0801E664: gBattlescriptCurrInstr = BattleScript_PSNPrevention; if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) @@ -2437,7 +2537,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) if ((gBattleMons[gEffectBank].type1 == TYPE_POISON || gBattleMons[gEffectBank].type2 == TYPE_POISON || gBattleMons[gEffectBank].type1 == TYPE_STEEL || gBattleMons[gEffectBank].type2 == TYPE_STEEL) && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == 1 || certain == 0x80)) { - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_PSNPrevention; gBattleCommunication[MULTISTRING_CHOOSER] = 2; return; @@ -2459,14 +2559,14 @@ void SetMoveEffect(bool8 primary, u8 certainArg) } if (StatusChanged == 1) { - b_movescr_stack_push(gBattlescriptCurrInstr + 1); - if (gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]] == STATUS_SLEEP) + BattleScriptPush(gBattlescriptCurrInstr + 1); + if (sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]] == STATUS_SLEEP) gBattleMons[gEffectBank].status1 |= ((Random() & 3) + 2); else - gBattleMons[gEffectBank].status1 |= gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattleMons[gEffectBank].status1 |= sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]; gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; gActiveBank = gEffectBank; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gEffectBank].status1); + EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gEffectBank].status1); MarkBufferBankForExecution(gActiveBank); if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) { @@ -2477,7 +2577,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) gBattleCommunication[MULTISTRING_CHOOSER] = 0; if (gBattleCommunication[MOVE_EFFECT_BYTE] == 2 || gBattleCommunication[MOVE_EFFECT_BYTE] == 6 || gBattleCommunication[MOVE_EFFECT_BYTE] == 5 || gBattleCommunication[MOVE_EFFECT_BYTE] == 3) { - BATTLE_STRUCT->synchroniseEffect = gBattleCommunication[MOVE_EFFECT_BYTE]; + gBattleStruct->synchroniseEffect = gBattleCommunication[MOVE_EFFECT_BYTE]; gHitMarker |= HITMARKER_SYNCHRONISE_EFFECT; } return; @@ -2487,12 +2587,12 @@ void SetMoveEffect(bool8 primary, u8 certainArg) } else { - if (gBattleMons[gEffectBank].status2 & gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]) + if (gBattleMons[gEffectBank].status2 & sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]) { gBattlescriptCurrInstr++; return; } - switch (gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]) + switch (sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]) { case 7: //confusion if (gBattleMons[gEffectBank].ability == ABILITY_OWN_TEMPO) @@ -2500,7 +2600,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) if (gBattleMons[gEffectBank].status2 & STATUS2_CONFUSION) {gBattlescriptCurrInstr++; return;} gBattleMons[gEffectBank].status2 |= (((Random()) % 0x4)) + 2; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; case 8: //flinch @@ -2518,8 +2618,8 @@ void SetMoveEffect(bool8 primary, u8 certainArg) } else { - if (BankGetTurnOrder(gEffectBank) > gCurrentMoveTurn) - gBattleMons[gEffectBank].status2 |= gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]; + if (BankGetTurnOrder(gEffectBank) > gCurrentTurnActionNumber) + gBattleMons[gEffectBank].status2 |= sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]; gBattlescriptCurrInstr++; return; } break; @@ -2527,9 +2627,9 @@ void SetMoveEffect(bool8 primary, u8 certainArg) if (gBattleMons[gEffectBank].status2 & STATUS2_UPROAR) {gBattlescriptCurrInstr++; return;} gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS; - gLockedMove[gEffectBank] = gCurrentMove; + gLockedMoves[gEffectBank] = gCurrentMove; gBattleMons[gEffectBank].status2 |= ((Random() & 3) + 2) << 4; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; case 11: //pay day @@ -2540,7 +2640,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) if (PayDay > gPaydayMoney) gPaydayMoney = 0xFFFF; } - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; case 9: //tri attack @@ -2551,7 +2651,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) break; case 12: //charging move gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS; - gLockedMove[gEffectBank] = gCurrentMove; + gLockedMoves[gEffectBank] = gCurrentMove; gProtectStructs[gEffectBank].chargingTurn = 1; gBattlescriptCurrInstr++; break; @@ -2559,10 +2659,10 @@ void SetMoveEffect(bool8 primary, u8 certainArg) if (gBattleMons[gEffectBank].status2 & STATUS2_WRAPPED) {gBattlescriptCurrInstr++; return;} gBattleMons[gEffectBank].status2 |= ((Random() & 3) + 2) << 0xD; - BATTLE_STRUCT->wrappedMove[gEffectBank*2] = (u8)gCurrentMove; - (1 + BATTLE_STRUCT->wrappedMove)[gEffectBank*2] = gCurrentMove >> 8; //don't ask. - BATTLE_STRUCT->wrappedBy[gEffectBank] = gBankAttacker; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + gBattleStruct->wrappedMove[gEffectBank*2] = (u8)gCurrentMove; + (1 + gBattleStruct->wrappedMove)[gEffectBank*2] = gCurrentMove >> 8; //don't ask. + gBattleStruct->wrappedBy[gEffectBank] = gBankAttacker; + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; gBattleCommunication[MULTISTRING_CHOOSER] = 0; while (gBattleCommunication[MULTISTRING_CHOOSER] <= 4 @@ -2570,19 +2670,19 @@ void SetMoveEffect(bool8 primary, u8 certainArg) gBattleCommunication[MULTISTRING_CHOOSER]++; break; case 14: //25% recoil - gBattleMoveDamage = (gHP_dealt) / 4; + gBattleMoveDamage = (gHpDealt) / 4; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; case 15 ... 21: //stat + 1 if (ChangeStatBuffs(0x10, gBattleCommunication[MOVE_EFFECT_BYTE] + 0xF2, certain, 0)) {gBattlescriptCurrInstr++;} else { - BATTLE_STRUCT->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; //TODO: the arg ptr is wrong by one - BATTLE_STRUCT->animArg2 = 0; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + gBattleStruct->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; //TODO: the arg ptr is wrong by one + gBattleStruct->animArg2 = 0; + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_StatUp; } break; @@ -2590,9 +2690,9 @@ void SetMoveEffect(bool8 primary, u8 certainArg) if (ChangeStatBuffs(~(0x6f), gBattleCommunication[MOVE_EFFECT_BYTE] + 0xEB, certain, 0)) {gBattlescriptCurrInstr++;} //TODO: negation doesnt work correctly else { - BATTLE_STRUCT->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; - BATTLE_STRUCT->animArg2 = 0; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + gBattleStruct->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; + gBattleStruct->animArg2 = 0; + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_StatDown; } break; @@ -2600,9 +2700,9 @@ void SetMoveEffect(bool8 primary, u8 certainArg) if (ChangeStatBuffs(0x20, gBattleCommunication[MOVE_EFFECT_BYTE] + 0xDA, certain, 0)) {gBattlescriptCurrInstr++;} else { - BATTLE_STRUCT->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; - BATTLE_STRUCT->animArg2 = 0; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + gBattleStruct->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; + gBattleStruct->animArg2 = 0; + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_StatUp; } break; @@ -2610,16 +2710,16 @@ void SetMoveEffect(bool8 primary, u8 certainArg) if (ChangeStatBuffs(~(0x5f), gBattleCommunication[MOVE_EFFECT_BYTE] + 0xD3, certain, 0)) {gBattlescriptCurrInstr++;} else { - BATTLE_STRUCT->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; - BATTLE_STRUCT->animArg2 = 0; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + gBattleStruct->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; + gBattleStruct->animArg2 = 0; + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_StatDown; } break; case 29: //recharge gBattleMons[gEffectBank].status2 |= STATUS2_RECHARGE; gDisableStructs[gEffectBank].rechargeCounter = 2; - gLockedMove[gEffectBank] = gCurrentMove; + gLockedMoves[gEffectBank] = gCurrentMove; gBattlescriptCurrInstr++; break; case 30: //rage @@ -2635,7 +2735,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) {gBattlescriptCurrInstr++; return;} if (gBattleMons[gBankTarget].item && gBattleMons[gBankTarget].ability == ABILITY_STICKY_HOLD) { - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_NoItemSteal; gLastUsedAbility = gBattleMons[gBankTarget].ability; RecordAbilityBattle(gBankTarget, gLastUsedAbility); @@ -2653,14 +2753,14 @@ void SetMoveEffect(bool8 primary, u8 certainArg) gBattleMons[gBankTarget].item = 0; gActiveBank = gBankAttacker; - EmitSetAttributes(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gLastUsedItem); + EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gLastUsedItem); MarkBufferBankForExecution(gBankAttacker); gActiveBank = gBankTarget; - EmitSetAttributes(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gBankTarget].item); + EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gBankTarget].item); MarkBufferBankForExecution(gBankTarget); - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_ItemSteal; CHOICED_MOVE(gBankTarget) = 0; @@ -2676,11 +2776,11 @@ void SetMoveEffect(bool8 primary, u8 certainArg) gBattlescriptCurrInstr++; break; case 34: //ancientpower - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_AllStatsUp; return; case 35: //break free rapidspin - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_RapidSpinAway; return; case 36: //paralysis removal @@ -2688,30 +2788,30 @@ void SetMoveEffect(bool8 primary, u8 certainArg) { gBattleMons[gBankTarget].status1 &= ~(STATUS_PARALYSIS); gActiveBank = gBankTarget; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankTarget].status1); + EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankTarget].status1); MarkBufferBankForExecution(gActiveBank); - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_TargetPRLZHeal; } else {gBattlescriptCurrInstr++; return;} break; case 37: //superpower - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_AtkDefDown; return; case 38: //33% recoil - gBattleMoveDamage = gHP_dealt / 3; + gBattleMoveDamage = gHpDealt / 3; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; case 53: //thrash if (!(gBattleMons[gEffectBank].status2 & STATUS2_LOCK_CONFUSE)) { gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS; - gLockedMove[gEffectBank] = gCurrentMove; + gLockedMoves[gEffectBank] = gCurrentMove; gBattleMons[gEffectBank].status2 |= (((Random() & 1) + 2) << 0xA); } else @@ -2735,14 +2835,14 @@ void SetMoveEffect(bool8 primary, u8 certainArg) gLastUsedItem = gBattleMons[gEffectBank].item; gBattleMons[gEffectBank].item = 0; gWishFutureKnock.knockedOffPokes[side] |= gBitTable[gBattlePartyID[gEffectBank]]; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_KnockedOff; CHOICED_MOVE(gEffectBank) = 0; } break; case 59: //overheat - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_SAtkDown2; return; } @@ -2900,7 +3000,7 @@ _0801E50C:\n\ bls _0801E518\n\ b _0801EB4A\n\ _0801E518:\n\ - ldr r1, _0801E55C @ =gStatusFlagsForMoveEffects\n\ + ldr r1, _0801E55C @ =sStatusFlagsForMoveEffects\n\ ldrb r0, [r7, 0x3]\n\ lsls r0, 2\n\ adds r0, r1\n\ @@ -2928,7 +3028,7 @@ _0801E54C: .4byte gBattleMons\n\ _0801E550: .4byte gHitMarker\n\ _0801E554: .4byte gSideAffecting\n\ _0801E558: .4byte gBattleCommunication\n\ -_0801E55C: .4byte gStatusFlagsForMoveEffects\n\ +_0801E55C: .4byte sStatusFlagsForMoveEffects\n\ _0801E560:\n\ cmp r0, 0x40\n\ bne _0801E566\n\ @@ -3066,7 +3166,7 @@ _0801E64A:\n\ ldr r4, _0801E67C @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801E680 @ =BattleScript_PSNPrevention\n\ _0801E664:\n\ str r0, [r4]\n\ @@ -3189,7 +3289,7 @@ _0801E72E:\n\ ldr r4, _0801E750 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801E754 @ =BattleScript_BRNPrevention\n\ b _0801E664\n\ .align 2, 0\n\ @@ -3229,7 +3329,7 @@ _0801E78E:\n\ ldr r4, _0801E7A0 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801E7A4 @ =BattleScript_BRNPrevention\n\ b _0801E998\n\ .align 2, 0\n\ @@ -3380,7 +3480,7 @@ _0801E8A6:\n\ ldr r4, _0801E8C8 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801E8CC @ =BattleScript_PRLZPrevention\n\ b _0801E664\n\ .align 2, 0\n\ @@ -3423,7 +3523,7 @@ _0801E8FE:\n\ ldr r4, _0801E93C @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801E940 @ =BattleScript_PSNPrevention\n\ str r0, [r4]\n\ ldr r2, _0801E944 @ =gHitMarker\n\ @@ -3484,7 +3584,7 @@ _0801E98C:\n\ ldr r4, _0801E9A8 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801E9AC @ =BattleScript_PSNPrevention\n\ _0801E998:\n\ str r0, [r4]\n\ @@ -3557,8 +3657,8 @@ _0801EA1C:\n\ ldr r0, _0801EA5C @ =gBattlescriptCurrInstr\n\ ldr r0, [r0]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ - ldr r1, _0801EA60 @ =gStatusFlagsForMoveEffects\n\ + bl BattleScriptPush\n\ + ldr r1, _0801EA60 @ =sStatusFlagsForMoveEffects\n\ ldr r0, _0801EA64 @ =gBattleCommunication\n\ ldrb r0, [r0, 0x3]\n\ lsls r0, 2\n\ @@ -3584,7 +3684,7 @@ _0801EA1C:\n\ .align 2, 0\n\ _0801EA58: .4byte gBattleMoveFlags\n\ _0801EA5C: .4byte gBattlescriptCurrInstr\n\ -_0801EA60: .4byte gStatusFlagsForMoveEffects\n\ +_0801EA60: .4byte sStatusFlagsForMoveEffects\n\ _0801EA64: .4byte gBattleCommunication\n\ _0801EA68: .4byte gBattleMons\n\ _0801EA6C: .4byte gEffectBank\n\ @@ -3622,7 +3722,7 @@ _0801EA84:\n\ movs r1, 0x28\n\ movs r2, 0\n\ movs r3, 0x4\n\ - bl EmitSetAttributes\n\ + bl EmitSetMonData\n\ ldrb r0, [r4]\n\ bl MarkBufferBankForExecution\n\ ldr r2, _0801EAF0 @ =gHitMarker\n\ @@ -3694,7 +3794,7 @@ _0801EB4A:\n\ mov r0, r9\n\ adds r0, 0x50\n\ adds r1, r0\n\ - ldr r2, _0801EB84 @ =gStatusFlagsForMoveEffects\n\ + ldr r2, _0801EB84 @ =sStatusFlagsForMoveEffects\n\ ldrb r3, [r7, 0x3]\n\ lsls r0, r3, 2\n\ adds r0, r2\n\ @@ -3716,7 +3816,7 @@ _0801EB78:\n\ ldr r0, [r0]\n\ mov pc, r0\n\ .align 2, 0\n\ -_0801EB84: .4byte gStatusFlagsForMoveEffects\n\ +_0801EB84: .4byte sStatusFlagsForMoveEffects\n\ _0801EB88: .4byte _0801EB8C\n\ .align 2, 0\n\ _0801EB8C:\n\ @@ -3815,7 +3915,7 @@ _0801EC8E:\n\ ldr r4, _0801ECC8 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r1, _0801ECCC @ =gMoveEffectBS_Ptrs\n\ ldr r0, _0801ECD0 @ =gBattleCommunication\n\ ldrb r0, [r0, 0x3]\n\ @@ -3861,7 +3961,7 @@ _0801ED14: .4byte BattleScript_FlinchPrevention\n\ _0801ED18:\n\ adds r0, r2, 0\n\ bl BankGetTurnOrder\n\ - ldr r1, _0801ED54 @ =gCurrentMoveTurn\n\ + ldr r1, _0801ED54 @ =gCurrentTurnActionNumber\n\ lsls r0, 24\n\ lsrs r0, 24\n\ ldrb r1, [r1]\n\ @@ -3876,7 +3976,7 @@ _0801ED2E:\n\ mov r0, r9\n\ adds r0, 0x50\n\ adds r2, r0\n\ - ldr r1, _0801ED58 @ =gStatusFlagsForMoveEffects\n\ + ldr r1, _0801ED58 @ =sStatusFlagsForMoveEffects\n\ ldr r0, _0801ED5C @ =gBattleCommunication\n\ ldrb r0, [r0, 0x3]\n\ lsls r0, 2\n\ @@ -3887,8 +3987,8 @@ _0801ED2E:\n\ str r1, [r2]\n\ bl _0801F5DC\n\ .align 2, 0\n\ -_0801ED54: .4byte gCurrentMoveTurn\n\ -_0801ED58: .4byte gStatusFlagsForMoveEffects\n\ +_0801ED54: .4byte gCurrentTurnActionNumber\n\ +_0801ED58: .4byte sStatusFlagsForMoveEffects\n\ _0801ED5C: .4byte gBattleCommunication\n\ _0801ED60:\n\ mov r3, r8\n\ @@ -3909,7 +4009,7 @@ _0801ED7C:\n\ lsls r0, 5\n\ orrs r1, r0\n\ str r1, [r2]\n\ - ldr r1, _0801EDC8 @ =gLockedMove\n\ + ldr r1, _0801EDC8 @ =gLockedMoves\n\ ldrb r0, [r3]\n\ lsls r0, 1\n\ adds r0, r1\n\ @@ -3932,7 +4032,7 @@ _0801ED7C:\n\ ldr r4, _0801EDD0 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r1, _0801EDD4 @ =gMoveEffectBS_Ptrs\n\ ldr r0, _0801EDD8 @ =gBattleCommunication\n\ ldrb r0, [r0, 0x3]\n\ @@ -3941,7 +4041,7 @@ _0801ED7C:\n\ ldr r0, [r0]\n\ bl _0801F5F8\n\ .align 2, 0\n\ -_0801EDC8: .4byte gLockedMove\n\ +_0801EDC8: .4byte gLockedMoves\n\ _0801EDCC: .4byte gCurrentMove\n\ _0801EDD0: .4byte gBattlescriptCurrInstr\n\ _0801EDD4: .4byte gMoveEffectBS_Ptrs\n\ @@ -3978,7 +4078,7 @@ _0801EE14:\n\ ldr r4, _0801EE40 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r1, _0801EE44 @ =gMoveEffectBS_Ptrs\n\ ldr r0, _0801EE48 @ =gBattleCommunication\n\ ldrb r0, [r0, 0x3]\n\ @@ -4035,7 +4135,7 @@ _0801EE84:\n\ lsls r1, 5\n\ orrs r0, r1\n\ str r0, [r2]\n\ - ldr r1, _0801EEC0 @ =gLockedMove\n\ + ldr r1, _0801EEC0 @ =gLockedMoves\n\ mov r2, r8\n\ ldrb r0, [r2]\n\ lsls r0, 1\n\ @@ -4053,7 +4153,7 @@ _0801EE84:\n\ strb r0, [r1, 0x1]\n\ b _0801F5DC\n\ .align 2, 0\n\ -_0801EEC0: .4byte gLockedMove\n\ +_0801EEC0: .4byte gLockedMoves\n\ _0801EEC4: .4byte gCurrentMove\n\ _0801EEC8: .4byte gProtectStructs\n\ _0801EECC:\n\ @@ -4113,7 +4213,7 @@ _0801EEE8:\n\ ldr r4, _0801EF98 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r1, _0801EF9C @ =gMoveEffectBS_Ptrs\n\ ldr r2, _0801EFA0 @ =gBattleCommunication\n\ ldrb r0, [r2, 0x3]\n\ @@ -4162,7 +4262,7 @@ _0801EFA0: .4byte gBattleCommunication\n\ _0801EFA4: .4byte gTrappingMoves\n\ _0801EFA8:\n\ ldr r1, _0801EFD8 @ =gBattleMoveDamage\n\ - ldr r0, _0801EFDC @ =gHP_dealt\n\ + ldr r0, _0801EFDC @ =gHpDealt\n\ ldr r0, [r0]\n\ cmp r0, 0\n\ bge _0801EFB4\n\ @@ -4178,7 +4278,7 @@ _0801EFC0:\n\ ldr r4, _0801EFE0 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r1, _0801EFE4 @ =gMoveEffectBS_Ptrs\n\ ldr r0, _0801EFE8 @ =gBattleCommunication\n\ ldrb r0, [r0, 0x3]\n\ @@ -4188,7 +4288,7 @@ _0801EFC0:\n\ b _0801F5F8\n\ .align 2, 0\n\ _0801EFD8: .4byte gBattleMoveDamage\n\ -_0801EFDC: .4byte gHP_dealt\n\ +_0801EFDC: .4byte gHpDealt\n\ _0801EFE0: .4byte gBattlescriptCurrInstr\n\ _0801EFE4: .4byte gMoveEffectBS_Ptrs\n\ _0801EFE8: .4byte gBattleCommunication\n\ @@ -4220,7 +4320,7 @@ _0801F008:\n\ ldr r4, _0801F038 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801F03C @ =BattleScript_StatUp\n\ b _0801F5F8\n\ .align 2, 0\n\ @@ -4258,7 +4358,7 @@ _0801F05E:\n\ ldr r4, _0801F08C @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801F090 @ =BattleScript_StatDown\n\ b _0801F5F8\n\ .align 2, 0\n\ @@ -4295,7 +4395,7 @@ _0801F0B0:\n\ ldr r4, _0801F0E0 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801F0E4 @ =BattleScript_StatUp\n\ b _0801F5F8\n\ .align 2, 0\n\ @@ -4333,7 +4433,7 @@ _0801F106:\n\ ldr r4, _0801F134 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801F138 @ =BattleScript_StatDown\n\ b _0801F5F8\n\ .align 2, 0\n\ @@ -4365,7 +4465,7 @@ _0801F13C:\n\ adds r0, r2\n\ movs r1, 0x2\n\ strb r1, [r0, 0x19]\n\ - ldr r1, _0801F17C @ =gLockedMove\n\ + ldr r1, _0801F17C @ =gLockedMoves\n\ ldrb r0, [r3]\n\ lsls r0, 1\n\ adds r0, r1\n\ @@ -4375,7 +4475,7 @@ _0801F13C:\n\ b _0801F5DC\n\ .align 2, 0\n\ _0801F178: .4byte gDisableStructs\n\ -_0801F17C: .4byte gLockedMove\n\ +_0801F17C: .4byte gLockedMoves\n\ _0801F180: .4byte gCurrentMove\n\ _0801F184:\n\ ldr r0, _0801F1A0 @ =gBankAttacker\n\ @@ -4546,7 +4646,7 @@ _0801F2B6:\n\ movs r1, 0x2\n\ movs r2, 0\n\ movs r3, 0x2\n\ - bl EmitSetAttributes\n\ + bl EmitSetMonData\n\ mov r3, r10\n\ ldrb r0, [r3]\n\ bl MarkBufferBankForExecution\n\ @@ -4564,13 +4664,13 @@ _0801F2B6:\n\ movs r1, 0x2\n\ movs r2, 0\n\ movs r3, 0x2\n\ - bl EmitSetAttributes\n\ + bl EmitSetMonData\n\ ldrb r0, [r7]\n\ bl MarkBufferBankForExecution\n\ ldr r4, _0801F350 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801F354 @ =BattleScript_ItemSteal\n\ str r0, [r4]\n\ ldr r0, _0801F358 @ =0xfffe9f10\n\ @@ -4645,7 +4745,7 @@ _0801F3BC:\n\ ldr r4, _0801F3CC @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801F3D0 @ =BattleScript_AllStatsUp\n\ b _0801F5F8\n\ .align 2, 0\n\ @@ -4655,7 +4755,7 @@ _0801F3D4:\n\ ldr r4, _0801F3E4 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801F3E8 @ =BattleScript_RapidSpinAway\n\ b _0801F5F8\n\ .align 2, 0\n\ @@ -4691,13 +4791,13 @@ _0801F406:\n\ movs r1, 0x28\n\ movs r2, 0\n\ movs r3, 0x4\n\ - bl EmitSetAttributes\n\ + bl EmitSetMonData\n\ ldrb r0, [r4]\n\ bl MarkBufferBankForExecution\n\ ldr r4, _0801F444 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801F448 @ =BattleScript_TargetPRLZHeal\n\ b _0801F5F8\n\ .align 2, 0\n\ @@ -4709,7 +4809,7 @@ _0801F44C:\n\ ldr r4, _0801F45C @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801F460 @ =BattleScript_AtkDefDown\n\ b _0801F5F8\n\ .align 2, 0\n\ @@ -4717,7 +4817,7 @@ _0801F45C: .4byte gBattlescriptCurrInstr\n\ _0801F460: .4byte BattleScript_AtkDefDown\n\ _0801F464:\n\ ldr r4, _0801F494 @ =gBattleMoveDamage\n\ - ldr r0, _0801F498 @ =gHP_dealt\n\ + ldr r0, _0801F498 @ =gHpDealt\n\ ldr r0, [r0]\n\ movs r1, 0x3\n\ bl __divsi3\n\ @@ -4730,7 +4830,7 @@ _0801F47A:\n\ ldr r4, _0801F49C @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r1, _0801F4A0 @ =gMoveEffectBS_Ptrs\n\ ldr r0, _0801F4A4 @ =gBattleCommunication\n\ ldrb r0, [r0, 0x3]\n\ @@ -4740,7 +4840,7 @@ _0801F47A:\n\ b _0801F5F8\n\ .align 2, 0\n\ _0801F494: .4byte gBattleMoveDamage\n\ -_0801F498: .4byte gHP_dealt\n\ +_0801F498: .4byte gHpDealt\n\ _0801F49C: .4byte gBattlescriptCurrInstr\n\ _0801F4A0: .4byte gMoveEffectBS_Ptrs\n\ _0801F4A4: .4byte gBattleCommunication\n\ @@ -4764,7 +4864,7 @@ _0801F4C4:\n\ lsls r0, 5\n\ orrs r1, r0\n\ str r1, [r2]\n\ - ldr r1, _0801F4F8 @ =gLockedMove\n\ + ldr r1, _0801F4F8 @ =gLockedMoves\n\ ldrb r0, [r3]\n\ lsls r0, 1\n\ adds r0, r1\n\ @@ -4787,7 +4887,7 @@ _0801F4F2:\n\ str r0, [r2]\n\ b _0801F5FA\n\ .align 2, 0\n\ -_0801F4F8: .4byte gLockedMove\n\ +_0801F4F8: .4byte gLockedMoves\n\ _0801F4FC: .4byte gCurrentMove\n\ _0801F500:\n\ mov r5, r8\n\ @@ -4858,7 +4958,7 @@ _0801F540:\n\ ldr r4, _0801F5C8 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801F5CC @ =BattleScript_KnockedOff\n\ str r0, [r4]\n\ ldr r1, _0801F5D0 @ =gSharedMem\n\ @@ -4898,7 +4998,7 @@ _0801F5EC:\n\ ldr r4, _0801F60C @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801F610 @ =BattleScript_SAtkDown2\n\ _0801F5F8:\n\ str r0, [r4]\n\ @@ -4918,7 +5018,156 @@ _0801F610: .4byte BattleScript_SAtkDown2\n\ } #endif // NONMATCHING - +#if DEBUG +__attribute__((naked)) +static void atk15_seteffectwithchance(void) +{ + asm("\ + push {r4, lr}\n\ + ldr r2, ._1037 @ gBattleMons\n\ + ldr r0, ._1037 + 4 @ gBankAttacker\n\ + ldrb r1, [r0]\n\ + mov r0, #0x58\n\ + mul r0, r0, r1\n\ + add r0, r0, r2\n\ + add r0, r0, #0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x20\n\ + bne ._1035 @cond_branch\n\ + ldr r2, ._1037 + 8 @ gBattleMoves\n\ + ldr r0, ._1037 + 12 @ gCurrentMove\n\ + ldrh r1, [r0]\n\ + lsl r0, r1, #0x1\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r2\n\ + ldrb r0, [r0, #0x5]\n\ + lsl r4, r0, #0x1\n\ + b ._1036\n\ +._1038:\n\ + .align 2, 0\n\ +._1037:\n\ + .word gBattleMons\n\ + .word gBankAttacker\n\ + .word gBattleMoves\n\ + .word gCurrentMove\n\ +._1035:\n\ + ldr r2, ._1045 @ gBattleMoves\n\ + ldr r0, ._1045 + 4 @ gCurrentMove\n\ + ldrh r1, [r0]\n\ + lsl r0, r1, #0x1\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r2\n\ + ldrb r4, [r0, #0x5]\n\ +._1036:\n\ + ldr r0, ._1045 + 8 @ gUnknown_02023A14_50\n\ + ldrb r1, [r0]\n\ + mov r0, #0x4\n\ + and r0, r0, r1\n\ + ldr r2, ._1045 + 12 @ gBattleCommunication\n\ + cmp r0, #0\n\ + beq ._1039 @cond_branch\n\ + ldrb r1, [r2, #0x3]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._1040 @cond_branch\n\ + ldr r0, ._1045 + 16 @ gBattleMoveFlags\n\ + ldrb r1, [r0]\n\ + mov r0, #0x29\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1050 @cond_branch\n\ +._1039:\n\ + ldrb r1, [r2, #0x3]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1043 @cond_branch\n\ +._1040:\n\ + ldr r0, ._1045 + 16 @ gBattleMoveFlags\n\ + ldrb r1, [r0]\n\ + mov r0, #0x29\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._1043 @cond_branch\n\ + ldr r2, ._1045 + 12 @ gBattleCommunication\n\ + ldrb r1, [r2, #0x3]\n\ + mov r0, #0x7f\n\ + and r0, r0, r1\n\ + strb r0, [r2, #0x3]\n\ + b ._1044\n\ +._1046:\n\ + .align 2, 0\n\ +._1045:\n\ + .word gBattleMoves\n\ + .word gCurrentMove\n\ + .word gUnknown_02023A14_50\n\ + .word gBattleCommunication\n\ + .word gBattleMoveFlags\n\ +._1043:\n\ + bl Random\n\ + lsl r0, r0, #0x10\n\ + lsr r0, r0, #0x10\n\ + mov r1, #0x64\n\ + bl __umodsi3\n\ + lsl r0, r0, #0x10\n\ + lsr r0, r0, #0x10\n\ + cmp r0, r4\n\ + bhi ._1049 @cond_branch\n\ + ldr r0, ._1052 @ gBattleCommunication\n\ + ldrb r0, [r0, #0x3]\n\ + cmp r0, #0\n\ + beq ._1049 @cond_branch\n\ + ldr r0, ._1052 + 4 @ gBattleMoveFlags\n\ + ldrb r1, [r0]\n\ + mov r0, #0x29\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._1049 @cond_branch\n\ + cmp r4, #0x63\n\ + bls ._1050 @cond_branch\n\ +._1044:\n\ + mov r0, #0x0\n\ + mov r1, #0x80\n\ + bl SetMoveEffect\n\ + b ._1054\n\ +._1053:\n\ + .align 2, 0\n\ +._1052:\n\ + .word gBattleCommunication\n\ + .word gBattleMoveFlags\n\ +._1050:\n\ + mov r0, #0x0\n\ + mov r1, #0x0\n\ + bl SetMoveEffect\n\ + b ._1054\n\ +._1049:\n\ + ldr r1, ._1055 @ gBattlescriptCurrInstr\n\ + ldr r0, [r1]\n\ + add r0, r0, #0x1\n\ + str r0, [r1]\n\ +._1054:\n\ + ldr r0, ._1055 + 4 @ gBattleCommunication\n\ + mov r1, #0x0\n\ + strb r1, [r0, #0x3]\n\ + ldr r0, ._1055 + 8 @ \n\ + ldr r2, ._1055 + 12 @ \n\ + add r0, r0, r2\n\ + strb r1, [r0]\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ +._1056:\n\ + .align 2, 0\n\ +._1055:\n\ + .word gBattlescriptCurrInstr\n\ + .word gBattleCommunication\n\ + .word +0x2000000\n\ + .word 0x16112"); +} +#else static void atk15_seteffectwithchance(void) { u32 PercentChance; @@ -4941,8 +5190,9 @@ static void atk15_seteffectwithchance(void) else gBattlescriptCurrInstr++; gBattleCommunication[MOVE_EFFECT_BYTE] = 0; - BATTLE_STRUCT->unk16112 = 0; + gBattleStruct->unk16112 = 0; } +#endif static void atk16_seteffectprimary(void) { @@ -4958,13 +5208,13 @@ static void atk18_clearstatusfromeffect(void) { gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); if (gBattleCommunication[MOVE_EFFECT_BYTE] <= 6) - gBattleMons[gActiveBank].status1 &= (~gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]); + gBattleMons[gActiveBank].status1 &= (~sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]); else - gBattleMons[gActiveBank].status2 &= (~gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]); + gBattleMons[gActiveBank].status2 &= (~sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]); gBattleCommunication[MOVE_EFFECT_BYTE] = 0; gBattlescriptCurrInstr += 2; - BATTLE_STRUCT->unk16112 = 0; + gBattleStruct->unk16112 = 0; } static void atk19_tryfaintmon(void) @@ -4978,7 +5228,7 @@ static void atk19_tryfaintmon(void) { r4 = T1_READ_PTR(gBattlescriptCurrInstr + 3); - b_movescr_stack_pop_cursor(); + BattleScriptPop(); gBattlescriptCurrInstr = r4; gSideAffecting[GetBankSide(gActiveBank)] &= ~SIDE_STATUS_SPIKES_DAMAGED; } @@ -5014,7 +5264,7 @@ static void atk19_tryfaintmon(void) ewram16100arr2(3, bank) = 0; gHitMarker |= HITMARKER_FAINTED(gActiveBank); - b_movescr_stack_push(gBattlescriptCurrInstr + 7); + BattleScriptPush(gBattlescriptCurrInstr + 7); gBattlescriptCurrInstr = r4; if (GetBankSide(gActiveBank) == 0) { @@ -5037,7 +5287,7 @@ static void atk19_tryfaintmon(void) } if ((gHitMarker & HITMARKER_DESTINYBOND) && gBattleMons[gBankAttacker].hp != 0) { - b_movescr_stack_push(gBattlescriptCurrInstr); + BattleScriptPush(gBattlescriptCurrInstr); gBattleMoveDamage = gBattleMons[bank].hp; gBattlescriptCurrInstr = BattleScript_DestinyBondTakesLife; } @@ -5050,10 +5300,10 @@ static void atk19_tryfaintmon(void) u8 moveIndex = ewram1608Carr(gBankAttacker); gBattleMons[gBankAttacker].pp[moveIndex] = 0; - b_movescr_stack_push(gBattlescriptCurrInstr); + BattleScriptPush(gBattlescriptCurrInstr); gBattlescriptCurrInstr = BattleScript_SelectingImprisionedMoveInPalace; gActiveBank = gBankAttacker; - EmitSetAttributes(0, moveIndex + 9, 0, 1, &gBattleMons[gActiveBank].pp[moveIndex]); + EmitSetMonData(0, moveIndex + 9, 0, 1, &gBattleMons[gActiveBank].pp[moveIndex]); MarkBufferBankForExecution(gActiveBank); gBattleTextBuff1[0] = 0xFD; @@ -5088,7 +5338,7 @@ static void atk1B_cleareffectsonfaint(void) { gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); gBattleMons[gActiveBank].status1 = 0; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 0x4, &gBattleMons[gActiveBank].status1); + EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 0x4, &gBattleMons[gActiveBank].status1); MarkBufferBankForExecution(gActiveBank); UndoEffectsAfterFainting(); gBattlescriptCurrInstr += 2; @@ -5256,282 +5506,262 @@ static void atk22_jumpiftype(void) //u8 bank, u8 type, *ptr gBattlescriptCurrInstr += 7; } -//here we go again... -#ifdef NONMATCHING static void atk23_getexp(void) { - u8 hold_effect; - int via_expshare = 0, sent_in; - u16* exp = &BATTLE_STRUCT->exp; - gBank1 = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - sent_in = gSentPokesToOpponent[(gBank1 & 2) >> 1]; - switch (BATTLE_STRUCT->getexpStateTracker) + u16 item; + s32 i; // also used as stringId + u8 holdEffect; + s32 sentIn; + + s32 viaExpShare = 0; + u16* exp = &gBattleStruct->exp; + + gBank1 = GetBattleBank(gBattlescriptCurrInstr[1]); + sentIn = gSentPokesToOpponent[(gBank1 & 2) >> 1]; + + switch (gBattleStruct->getexpStateTracker) { - case 0: //check if should receive exp at all - if (GetBankSide(gBank1) != 1 || (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_SAFARI | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER))) - BATTLE_STRUCT->getexpStateTracker = 6; //goto last case + case 0: // check if should receive exp at all + if (GetBankSide(gBank1) != SIDE_OPPONENT || (gBattleTypeFlags & + (BATTLE_TYPE_LINK + | BATTLE_TYPE_SAFARI + | BATTLE_TYPE_BATTLE_TOWER + | BATTLE_TYPE_EREADER_TRAINER))) + { + gBattleStruct->getexpStateTracker = 6; // goto last case + } else { - BATTLE_STRUCT->getexpStateTracker++; - ((u8*)ewram)[0x16113] |= gBitTable[gBattlePartyID[gBank1]]; + gBattleStruct->getexpStateTracker++; + gBattleStruct->unk16113 |= gBitTable[gBattlePartyID[gBank1]]; } break; - case 1: //calculate experience points to redistribute + case 1: // calculate experience points to redistribute { - int via_sent_in = 0; u16 calculatedExp; - int i; - for (i = 0; i < 6; i++) + s32 viaSentIn; + + for (viaSentIn = 0, i = 0; i < 6; i++) { - u16 item; - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == 0 || GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0) + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == SPECIES_NONE || GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0) continue; - if (gBitTable[i] & sent_in) - via_sent_in++; + if (gBitTable[i] & sentIn) + viaSentIn++; item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); + if (item == ITEM_ENIGMA_BERRY) - hold_effect = gSaveBlock1.enigmaBerry.holdEffect; + holdEffect = gSaveBlock1.enigmaBerry.holdEffect; else - hold_effect = ItemId_GetHoldEffect(item); + holdEffect = ItemId_GetHoldEffect(item); - if (hold_effect == HOLD_EFFECT_EXP_SHARE) - via_expshare++; + if (holdEffect == HOLD_EFFECT_EXP_SHARE) + viaExpShare++; } + calculatedExp = gBaseStats[gBattleMons[gBank1].species].expYield * gBattleMons[gBank1].level / 7; - if (via_expshare) //at least one poke is getting exp via exp share + + if (viaExpShare) // at least one mon is getting exp via exp share { - calculatedExp /= 2; - *exp = calculatedExp / via_sent_in; + *exp = calculatedExp / 2 / viaSentIn; if (*exp == 0) *exp = 1; - gExpShareExp = calculatedExp / via_expshare; + gExpShareExp = calculatedExp / 2 / viaExpShare; if (gExpShareExp == 0) gExpShareExp = 1; } else { - *exp = calculatedExp / via_sent_in; + *exp = calculatedExp / viaSentIn; if (*exp == 0) *exp = 1; gExpShareExp = 0; } - BATTLE_STRUCT->getexpStateTracker++; - BATTLE_STRUCT->expGetterID = 0; - BATTLE_STRUCT->sentInPokes = sent_in; - } //no break statement - case 2: //loop; set exp value to the poke in expgetter_id and print message + + gBattleStruct->getexpStateTracker++; + gBattleStruct->expGetterID = 0; + gBattleStruct->sentInPokes = sentIn; + } + // fall through + case 2: // set exp value to the poke in expgetter_id and print message if (gBattleExecBuffer == 0) { - u16 item = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HELD_ITEM); - u8* tracker; u32 zero; + item = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_HELD_ITEM); + if (item == ITEM_ENIGMA_BERRY) - hold_effect = gSaveBlock1.enigmaBerry.holdEffect; + holdEffect = gSaveBlock1.enigmaBerry.holdEffect; else - hold_effect = ItemId_GetHoldEffect(item); + holdEffect = ItemId_GetHoldEffect(item); - if ((hold_effect != HOLD_EFFECT_EXP_SHARE && !(BATTLE_STRUCT->sentInPokes & 1))) + if (holdEffect != HOLD_EFFECT_EXP_SHARE && !(gBattleStruct->sentInPokes & 1)) { - BATTLE_STRUCT->sentInPokes >>= 1; - tracker = &BATTLE_STRUCT->getexpStateTracker; - zero = 0; - *tracker = 5; //increment looper - gBattleMoveDamage = zero; //used for exp + gBattleStruct->sentInPokes >>= 1; + gBattleStruct->getexpStateTracker = 5; + gBattleMoveDamage = 0; // used for exp } - else if (GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL) == 100) + else if (GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_LEVEL) == 100) { - BATTLE_STRUCT->sentInPokes >>= 1; - tracker = &BATTLE_STRUCT->getexpStateTracker; - zero = 0; - *tracker = 5; //increment looper - gBattleMoveDamage = zero; //used for exp + gBattleStruct->sentInPokes >>= 1; + gBattleStruct->getexpStateTracker = 5; + gBattleMoveDamage = 0; // used for exp } else { - //music change in wild battle after fainting a poke - if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER) && gBattleMons[0].hp && !BATTLE_STRUCT->wildVictorySong) + // music change in wild battle after fainting a poke + if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER) && gBattleMons[0].hp && !gBattleStruct->wildVictorySong) { - BattleMusicStop(); + BattleStopLowHpSound(); PlayBGM(0x161); - BATTLE_STRUCT->wildVictorySong++; + gBattleStruct->wildVictorySong++; } - if (GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HP)) + if (GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_HP)) { - s16 stringID; - if (BATTLE_STRUCT->sentInPokes & 1) + if (gBattleStruct->sentInPokes & 1) gBattleMoveDamage = *exp; else gBattleMoveDamage = 0; - if (hold_effect == HOLD_EFFECT_EXP_SHARE) + if (holdEffect == HOLD_EFFECT_EXP_SHARE) gBattleMoveDamage += gExpShareExp; - if (hold_effect == HOLD_EFFECT_LUCKY_EGG) + if (holdEffect == HOLD_EFFECT_LUCKY_EGG) gBattleMoveDamage = (gBattleMoveDamage * 150) / 100; if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) gBattleMoveDamage = (gBattleMoveDamage * 150) / 100; - if (IsTradedMon(&gPlayerParty[BATTLE_STRUCT->expGetterID])) + if (IsTradedMon(&gPlayerParty[gBattleStruct->expGetterID])) { gBattleMoveDamage = (gBattleMoveDamage * 150) / 100; - stringID = 0x14A; + i = 0x14A; } else { - stringID = 0x149; - } + i = 0x149; + } - //get exp getter bank + // get exp getter bank if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { - if (!(gBattlePartyID[2] != BATTLE_STRUCT->expGetterID) && !(gAbsentBankFlags & gBitTable[2])) - BATTLE_STRUCT->expGetterBank = 2; + if (!(gBattlePartyID[2] != gBattleStruct->expGetterID) && !(gAbsentBankFlags & gBitTable[2])) + gBattleStruct->expGetterBank = 2; else { if (!(gAbsentBankFlags & gBitTable[0])) - BATTLE_STRUCT->expGetterBank = 0; + gBattleStruct->expGetterBank = 0; else - BATTLE_STRUCT->expGetterBank = 2; + gBattleStruct->expGetterBank = 2; } } else - BATTLE_STRUCT->expGetterBank = 0; + gBattleStruct->expGetterBank = 0; - //buffer poke name - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 4; - gBattleTextBuff1[2] = BATTLE_STRUCT->expGetterBank; - gBattleTextBuff1[3] = BATTLE_STRUCT->expGetterID; - gBattleTextBuff1[4] = 0xFF; - - //buffer 'gained' or 'gained a boosted' - gBattleTextBuff2[0] = 0xFD; - gBattleTextBuff2[1] = 0; - gBattleTextBuff2[2] = stringID; - stringID = (stringID >> 8) & (0xFF); //this does not want to cooperate - gBattleTextBuff2[3] = stringID; - gBattleTextBuff2[4] = 0xFF; - - //buffer exp number - gBattleTextBuff3[0] = 0xFD; - gBattleTextBuff3[1] = 1; - gBattleTextBuff3[2] = 4; //word - gBattleTextBuff3[3] = 5; //max digits - gBattleTextBuff3[4] = gBattleMoveDamage; - gBattleTextBuff3[5] = sBYTE1_32(gBattleMoveDamage); - gBattleTextBuff3[6] = sBYTE2_32(gBattleMoveDamage); - gBattleTextBuff3[7] = sBYTE3_32(gBattleMoveDamage); - gBattleTextBuff3[8] = 0xFF; - - PrepareStringBattle(0xD, BATTLE_STRUCT->expGetterBank); - MonGainEVs(&gPlayerParty[BATTLE_STRUCT->expGetterID], gBattleMons[gBank1].species); + PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattleStruct->expGetterBank, gBattleStruct->expGetterID) + + // buffer 'gained' or 'gained a boosted' + PREPARE_STRING_BUFFER(gBattleTextBuff2, i) + + PREPARE_WORD_NUMBER_BUFFER(gBattleTextBuff3, 5, gBattleMoveDamage) + + PrepareStringBattle(STRINGID_PKMNGAINEDEXP, gBattleStruct->expGetterBank); + MonGainEVs(&gPlayerParty[gBattleStruct->expGetterID], gBattleMons[gBank1].species); } - BATTLE_STRUCT->sentInPokes >>= 1; - BATTLE_STRUCT->getexpStateTracker++; + gBattleStruct->sentInPokes >>= 1; + gBattleStruct->getexpStateTracker++; } } break; - case 3: //Set Stats and give exp + case 3: // Set stats and give exp if (gBattleExecBuffer == 0) { - gBattleBufferB[BATTLE_STRUCT->expGetterBank][0] = 0; - if (GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HP) && GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL) != 100) + gBattleBufferB[gBattleStruct->expGetterBank][0] = 0; + if (GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_HP) && GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_LEVEL) != 100) { - // Doesn't match. - BATTLE_STRUCT->beforeLvlUp[0] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_MAX_HP); - BATTLE_STRUCT->beforeLvlUp[1] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_ATK); - BATTLE_STRUCT->beforeLvlUp[2] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_DEF); - BATTLE_STRUCT->beforeLvlUp[3] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPEED); - BATTLE_STRUCT->beforeLvlUp[4] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPATK); - BATTLE_STRUCT->beforeLvlUp[5] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPDEF); - - gActiveBank = BATTLE_STRUCT->expGetterBank; - EmitExpBarUpdate(0, BATTLE_STRUCT->expGetterID, gBattleMoveDamage); + gBattleResources_statsBeforeLvlUp->hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_MAX_HP); + gBattleResources_statsBeforeLvlUp->atk = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_ATK); + gBattleResources_statsBeforeLvlUp->def = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_DEF); + gBattleResources_statsBeforeLvlUp->spd = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED); + gBattleResources_statsBeforeLvlUp->spAtk = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPATK); + gBattleResources_statsBeforeLvlUp->spDef = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPDEF); + + gActiveBank = gBattleStruct->expGetterBank; + EmitExpBarUpdate(0, gBattleStruct->expGetterID, gBattleMoveDamage); MarkBufferBankForExecution(gActiveBank); } - BATTLE_STRUCT->getexpStateTracker++; + gBattleStruct->getexpStateTracker++; } break; - case 4: //lvl up if necessary + case 4: // lvl up if necessary if (gBattleExecBuffer == 0) { - gActiveBank = BATTLE_STRUCT->expGetterBank; - if (gBattleBufferB[gActiveBank][0] == 0x21 && gBattleBufferB[gActiveBank][1] == 0xB) + gActiveBank = gBattleStruct->expGetterBank; + if (gBattleBufferB[gActiveBank][0] == CONTROLLER_TWORETURNVALUES + && gBattleBufferB[gActiveBank][1] == RET_VALUE_LEVELLED_UP) { - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gBattlePartyID[gActiveBank] == BATTLE_STRUCT->expGetterID) - sub_80324F8(&gPlayerParty[gActiveBank], gActiveBank); + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gBattlePartyID[gActiveBank] == gBattleStruct->expGetterID) + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); - //buff poke name - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 4; - gBattleTextBuff1[2] = gActiveBank; - gBattleTextBuff1[3] = BATTLE_STRUCT->expGetterID; - gBattleTextBuff1[4] = 0xFF; - - //buff level - gBattleTextBuff2[0] = 0xFD; - gBattleTextBuff2[1] = 1; - gBattleTextBuff2[2] = 1; - gBattleTextBuff2[3] = 3; - gBattleTextBuff2[4] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL); - gBattleTextBuff2[5] = 0xFF; - - b_movescr_stack_push_cursor(); - gLeveledUpInBattle |= gBitTable[BATTLE_STRUCT->expGetterID]; + PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gActiveBank, gBattleStruct->expGetterID) + + PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff2, 3, GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_LEVEL)) + + BattleScriptPushCursor(); + gLeveledUpInBattle |= gBitTable[gBattleStruct->expGetterID]; gBattlescriptCurrInstr = BattleScript_LevelUp; gBattleMoveDamage = (gBattleBufferB[gActiveBank][2] | (gBattleBufferB[gActiveBank][3] << 8)); - AdjustFriendship(&gPlayerParty[BATTLE_STRUCT->expGetterID], 0); + AdjustFriendship(&gPlayerParty[gBattleStruct->expGetterID], 0); - //update battle mon structure after level up - if (gBattlePartyID[0] == BATTLE_STRUCT->expGetterID && gBattleMons[0].hp) + // update battle mon structure after level up + if (gBattlePartyID[0] == gBattleStruct->expGetterID && gBattleMons[0].hp) { - gBattleMons[0].level = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL); - gBattleMons[0].hp = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HP); - gBattleMons[0].maxHP = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_MAX_HP); - gBattleMons[0].attack = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_ATK); - gBattleMons[0].defense = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_DEF); - gBattleMons[0].speed = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPEED); - gBattleMons[0].spAttack = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPATK); - gBattleMons[0].spDefense = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPDEF); + gBattleMons[0].level = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_LEVEL); + gBattleMons[0].hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_HP); + gBattleMons[0].maxHP = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_MAX_HP); + gBattleMons[0].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_ATK); + gBattleMons[0].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_DEF); + // Why is this duplicated? + gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED); + gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED); + gBattleMons[0].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPATK); + gBattleMons[0].spDefense = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPDEF); } - //What is else if? Guess it's too advanced for GameFreak - if (gBattlePartyID[2] == BATTLE_STRUCT->expGetterID && gBattleMons[2].hp && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + // What is else if? + if (gBattlePartyID[2] == gBattleStruct->expGetterID && gBattleMons[2].hp && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) { - gBattleMons[2].level = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL); - gBattleMons[2].hp = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HP); - gBattleMons[2].maxHP = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_MAX_HP); - gBattleMons[2].attack = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_ATK); - gBattleMons[2].defense = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_DEF); - //There are no words...GF can't even copy&paste code properly - gBattleMons[2].speed = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPEED); - gBattleMons[2].spAttack = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPEED /*RIP*/); - gBattleMons[2].spDefense = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPATK); + gBattleMons[2].level = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_LEVEL); + gBattleMons[2].hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_HP); + gBattleMons[2].maxHP = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_MAX_HP); + gBattleMons[2].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_ATK); + gBattleMons[2].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_DEF); + // Duplicated again, but this time there's no Sp Defense + gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED); + gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED); + gBattleMons[2].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPATK); } - BATTLE_STRUCT->getexpStateTracker = 5; } else { gBattleMoveDamage = 0; - BATTLE_STRUCT->getexpStateTracker = 5; } + gBattleStruct->getexpStateTracker = 5; } break; - case 5: //looper increment - if (gBattleMoveDamage) //there is exp to give, goto case 3 that gives exp - BATTLE_STRUCT->getexpStateTracker = 3; + case 5: // looper increment + if (gBattleMoveDamage) // there is exp to give, goto case 3 that gives exp + gBattleStruct->getexpStateTracker = 3; else { - if (++BATTLE_STRUCT->expGetterID <= 5) - BATTLE_STRUCT->getexpStateTracker = 2; //loop again + gBattleStruct->expGetterID++; + if (gBattleStruct->expGetterID <= 5) + gBattleStruct->getexpStateTracker = 2; // loop again else - BATTLE_STRUCT->getexpStateTracker = 6; //we're done + gBattleStruct->getexpStateTracker = 6; // we're done } break; - case 6: //increment instruction + case 6: // increment instruction if (gBattleExecBuffer == 0) { - //not even sure why gamefreak clears that data in this place + // not sure why gf clears the item and ability here gBattleMons[gBank1].item = 0; gBattleMons[gBank1].ability = 0; gBattlescriptCurrInstr += 2; @@ -5539,1138 +5769,6 @@ static void atk23_getexp(void) break; } } -#else -__attribute__((naked)) -static void atk23_getexp(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - movs r6, 0\n\ - ldr r0, _0802004C @ =gSharedMem + 0x1605C\n\ - mov r10, r0\n\ - ldr r0, _08020050 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r0]\n\ - ldrb r0, [r0, 0x1]\n\ - bl GetBattleBank\n\ - ldr r1, _08020054 @ =gBank1\n\ - strb r0, [r1]\n\ - ldr r2, _08020058 @ =gSentPokesToOpponent\n\ - movs r1, 0x2\n\ - ands r1, r0\n\ - lsls r1, 24\n\ - lsrs r1, 25\n\ - adds r1, r2\n\ - ldrb r1, [r1]\n\ - mov r8, r1\n\ - mov r0, r10\n\ - subs r0, 0x4D\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x6\n\ - bls _08020040\n\ - bl _08020996\n\ -_08020040:\n\ - lsls r0, 2\n\ - ldr r1, _0802005C @ =_08020060\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ - .align 2, 0\n\ -_0802004C: .4byte gSharedMem + 0x1605C\n\ -_08020050: .4byte gBattlescriptCurrInstr\n\ -_08020054: .4byte gBank1\n\ -_08020058: .4byte gSentPokesToOpponent\n\ -_0802005C: .4byte _08020060\n\ - .align 2, 0\n\ -_08020060:\n\ - .4byte _0802007C\n\ - .4byte _080200FC\n\ - .4byte _08020216\n\ - .4byte _0802055C\n\ - .4byte _08020648\n\ - .4byte _08020910\n\ - .4byte _0802096C\n\ -_0802007C:\n\ - ldr r4, _080200A8 @ =gBank1\n\ - ldrb r0, [r4]\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bne _08020098\n\ - ldr r0, _080200AC @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - ldr r0, _080200B0 @ =0x00000982\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080200BC\n\ -_08020098:\n\ - ldr r0, _080200B4 @ =gSharedMem\n\ - ldr r1, _080200B8 @ =0x0001600f\n\ - adds r0, r1\n\ - movs r1, 0x6\n\ - strb r1, [r0]\n\ - bl _08020996\n\ - .align 2, 0\n\ -_080200A8: .4byte gBank1\n\ -_080200AC: .4byte gBattleTypeFlags\n\ -_080200B0: .4byte 0x00000982\n\ -_080200B4: .4byte gSharedMem\n\ -_080200B8: .4byte 0x0001600f\n\ -_080200BC:\n\ - ldr r2, _080200E8 @ =gSharedMem\n\ - ldr r3, _080200EC @ =0x0001600f\n\ - adds r1, r2, r3\n\ - ldrb r0, [r1]\n\ - adds r0, 0x1\n\ - strb r0, [r1]\n\ - ldr r0, _080200F0 @ =0x00016113\n\ - adds r2, r0\n\ - ldr r3, _080200F4 @ =gBitTable\n\ - ldr r1, _080200F8 @ =gBattlePartyID\n\ - ldrb r0, [r4]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - ldrh r0, [r0]\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - ldr r0, [r0]\n\ - ldrb r1, [r2]\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - bl _08020996\n\ - .align 2, 0\n\ -_080200E8: .4byte gSharedMem\n\ -_080200EC: .4byte 0x0001600f\n\ -_080200F0: .4byte 0x00016113\n\ -_080200F4: .4byte gBitTable\n\ -_080200F8: .4byte gBattlePartyID\n\ -_080200FC:\n\ - movs r5, 0\n\ - movs r7, 0\n\ - ldr r1, _08020150 @ =gSaveBlock1 + 0x3688\n\ - mov r9, r1\n\ -_08020104:\n\ - movs r0, 0x64\n\ - adds r1, r7, 0\n\ - muls r1, r0\n\ - ldr r0, _08020154 @ =gPlayerParty\n\ - adds r4, r1, r0\n\ - adds r0, r4, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _0802016A\n\ - adds r0, r4, 0\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _0802016A\n\ - ldr r0, _08020158 @ =gBitTable\n\ - lsls r1, r7, 2\n\ - adds r1, r0\n\ - ldr r0, [r1]\n\ - mov r2, r8\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - beq _08020138\n\ - adds r5, 0x1\n\ -_08020138:\n\ - adds r0, r4, 0\n\ - movs r1, 0xC\n\ - bl GetMonData\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0xAF\n\ - bne _0802015C\n\ - mov r3, r9\n\ - ldrb r4, [r3]\n\ - b _08020164\n\ - .align 2, 0\n\ -_08020150: .4byte gSaveBlock1 + 0x3688\n\ -_08020154: .4byte gPlayerParty\n\ -_08020158: .4byte gBitTable\n\ -_0802015C:\n\ - bl ItemId_GetHoldEffect\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ -_08020164:\n\ - cmp r4, 0x19\n\ - bne _0802016A\n\ - adds r6, 0x1\n\ -_0802016A:\n\ - adds r7, 0x1\n\ - cmp r7, 0x5\n\ - ble _08020104\n\ - ldr r3, _080201D0 @ =gBaseStats\n\ - ldr r2, _080201D4 @ =gBattleMons\n\ - ldr r0, _080201D8 @ =gBank1\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - muls r1, r0\n\ - adds r1, r2\n\ - ldrh r2, [r1]\n\ - lsls r0, r2, 3\n\ - subs r0, r2\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - ldrb r2, [r0, 0x9]\n\ - adds r1, 0x2A\n\ - ldrb r0, [r1]\n\ - muls r0, r2\n\ - movs r1, 0x7\n\ - bl __divsi3\n\ - lsls r0, 16\n\ - lsrs r1, r0, 16\n\ - cmp r6, 0\n\ - beq _080201E0\n\ - lsrs r4, r0, 17\n\ - adds r0, r4, 0\n\ - adds r1, r5, 0\n\ - bl __divsi3\n\ - mov r1, r10\n\ - strh r0, [r1]\n\ - lsls r0, 16\n\ - cmp r0, 0\n\ - bne _080201B6\n\ - movs r0, 0x1\n\ - strh r0, [r1]\n\ -_080201B6:\n\ - ldr r5, _080201DC @ =gExpShareExp\n\ - adds r0, r4, 0\n\ - adds r1, r6, 0\n\ - bl __divsi3\n\ - strh r0, [r5]\n\ - lsls r0, 16\n\ - cmp r0, 0\n\ - bne _080201FA\n\ - movs r0, 0x1\n\ - strh r0, [r5]\n\ - b _080201FA\n\ - .align 2, 0\n\ -_080201D0: .4byte gBaseStats\n\ -_080201D4: .4byte gBattleMons\n\ -_080201D8: .4byte gBank1\n\ -_080201DC: .4byte gExpShareExp\n\ -_080201E0:\n\ - adds r0, r1, 0\n\ - adds r1, r5, 0\n\ - bl __divsi3\n\ - mov r2, r10\n\ - strh r0, [r2]\n\ - lsls r0, 16\n\ - cmp r0, 0\n\ - bne _080201F6\n\ - movs r0, 0x1\n\ - strh r0, [r2]\n\ -_080201F6:\n\ - ldr r0, _08020248 @ =gExpShareExp\n\ - strh r6, [r0]\n\ -_080201FA:\n\ - ldr r1, _0802024C @ =gSharedMem\n\ - ldr r3, _08020250 @ =0x0001600f\n\ - adds r2, r1, r3\n\ - ldrb r0, [r2]\n\ - adds r0, 0x1\n\ - movs r3, 0\n\ - strb r0, [r2]\n\ - ldr r2, _08020254 @ =0x00016018\n\ - adds r0, r1, r2\n\ - strb r3, [r0]\n\ - ldr r3, _08020258 @ =0x0001605f\n\ - adds r1, r3\n\ - mov r0, r8\n\ - strb r0, [r1]\n\ -_08020216:\n\ - ldr r0, _0802025C @ =gBattleExecBuffer\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _08020220\n\ - b _08020996\n\ -_08020220:\n\ - ldr r0, _0802024C @ =gSharedMem\n\ - ldr r1, _08020254 @ =0x00016018\n\ - adds r0, r1\n\ - ldrb r1, [r0]\n\ - movs r0, 0x64\n\ - muls r0, r1\n\ - ldr r1, _08020260 @ =gPlayerParty\n\ - adds r0, r1\n\ - movs r1, 0xC\n\ - bl GetMonData\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0xAF\n\ - bne _0802026C\n\ - ldr r0, _08020264 @ =gSaveBlock1\n\ - ldr r2, _08020268 @ =0x00003688\n\ - adds r0, r2\n\ - ldrb r4, [r0]\n\ - b _08020274\n\ - .align 2, 0\n\ -_08020248: .4byte gExpShareExp\n\ -_0802024C: .4byte gSharedMem\n\ -_08020250: .4byte 0x0001600f\n\ -_08020254: .4byte 0x00016018\n\ -_08020258: .4byte 0x0001605f\n\ -_0802025C: .4byte gBattleExecBuffer\n\ -_08020260: .4byte gPlayerParty\n\ -_08020264: .4byte gSaveBlock1\n\ -_08020268: .4byte 0x00003688\n\ -_0802026C:\n\ - bl ItemId_GetHoldEffect\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ -_08020274:\n\ - ldr r5, _08020294 @ =gSharedMem\n\ - cmp r4, 0x19\n\ - beq _080202A0\n\ - ldr r3, _08020298 @ =0x0001605f\n\ - adds r1, r5, r3\n\ - ldrb r0, [r1]\n\ - movs r2, 0x1\n\ - ands r2, r0\n\ - cmp r2, 0\n\ - bne _080202A0\n\ - lsrs r0, 1\n\ - strb r0, [r1]\n\ - ldr r0, _0802029C @ =0x0001600f\n\ - adds r1, r5, r0\n\ - b _080202C8\n\ - .align 2, 0\n\ -_08020294: .4byte gSharedMem\n\ -_08020298: .4byte 0x0001605f\n\ -_0802029C: .4byte 0x0001600f\n\ -_080202A0:\n\ - ldr r1, _080202D4 @ =0x00016018\n\ - adds r0, r5, r1\n\ - ldrb r1, [r0]\n\ - movs r0, 0x64\n\ - muls r0, r1\n\ - ldr r1, _080202D8 @ =gPlayerParty\n\ - adds r0, r1\n\ - movs r1, 0x38\n\ - bl GetMonData\n\ - cmp r0, 0x64\n\ - bne _080202E8\n\ - ldr r2, _080202DC @ =0x0001605f\n\ - adds r1, r5, r2\n\ - ldrb r0, [r1]\n\ - lsrs r0, 1\n\ - movs r2, 0\n\ - strb r0, [r1]\n\ - ldr r3, _080202E0 @ =0x0001600f\n\ - adds r1, r5, r3\n\ -_080202C8:\n\ - movs r0, 0x5\n\ - strb r0, [r1]\n\ - ldr r0, _080202E4 @ =gBattleMoveDamage\n\ - str r2, [r0]\n\ - b _08020996\n\ - .align 2, 0\n\ -_080202D4: .4byte 0x00016018\n\ -_080202D8: .4byte gPlayerParty\n\ -_080202DC: .4byte 0x0001605f\n\ -_080202E0: .4byte 0x0001600f\n\ -_080202E4: .4byte gBattleMoveDamage\n\ -_080202E8:\n\ - ldr r0, _0802034C @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - movs r0, 0x8\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _08020316\n\ - ldr r0, _08020350 @ =gBattleMons\n\ - ldrh r0, [r0, 0x28]\n\ - cmp r0, 0\n\ - beq _08020316\n\ - ldr r0, _08020354 @ =0x0001601b\n\ - adds r5, r0\n\ - ldrb r0, [r5]\n\ - cmp r0, 0\n\ - bne _08020316\n\ - bl BattleMusicStop\n\ - ldr r0, _08020358 @ =0x00000161\n\ - bl PlayBGM\n\ - ldrb r0, [r5]\n\ - adds r0, 0x1\n\ - strb r0, [r5]\n\ -_08020316:\n\ - ldr r5, _0802035C @ =gSharedMem\n\ - ldr r1, _08020360 @ =0x00016018\n\ - adds r0, r5, r1\n\ - ldrb r1, [r0]\n\ - movs r0, 0x64\n\ - muls r0, r1\n\ - ldr r1, _08020364 @ =gPlayerParty\n\ - adds r0, r1\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - bne _08020332\n\ - b _0802051E\n\ -_08020332:\n\ - ldr r2, _08020368 @ =0x0001605f\n\ - adds r0, r5, r2\n\ - ldrb r0, [r0]\n\ - movs r3, 0x1\n\ - ands r3, r0\n\ - cmp r3, 0\n\ - beq _08020370\n\ - ldr r1, _0802036C @ =gBattleMoveDamage\n\ - mov r3, r10\n\ - ldrh r0, [r3]\n\ - str r0, [r1]\n\ - mov r8, r1\n\ - b _08020376\n\ - .align 2, 0\n\ -_0802034C: .4byte gBattleTypeFlags\n\ -_08020350: .4byte gBattleMons\n\ -_08020354: .4byte 0x0001601b\n\ -_08020358: .4byte 0x00000161\n\ -_0802035C: .4byte gSharedMem\n\ -_08020360: .4byte 0x00016018\n\ -_08020364: .4byte gPlayerParty\n\ -_08020368: .4byte 0x0001605f\n\ -_0802036C: .4byte gBattleMoveDamage\n\ -_08020370:\n\ - ldr r0, _080203EC @ =gBattleMoveDamage\n\ - str r3, [r0]\n\ - mov r8, r0\n\ -_08020376:\n\ - cmp r4, 0x19\n\ - bne _08020386\n\ - ldr r0, _080203F0 @ =gExpShareExp\n\ - ldrh r1, [r0]\n\ - mov r2, r8\n\ - ldr r0, [r2]\n\ - adds r0, r1\n\ - str r0, [r2]\n\ -_08020386:\n\ - cmp r4, 0x28\n\ - bne _0802039C\n\ - mov r3, r8\n\ - ldr r1, [r3]\n\ - movs r0, 0x96\n\ - muls r0, r1\n\ - movs r1, 0x64\n\ - bl __divsi3\n\ - mov r1, r8\n\ - str r0, [r1]\n\ -_0802039C:\n\ - ldr r0, _080203F4 @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - movs r0, 0x8\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080203B8\n\ - ldr r4, _080203EC @ =gBattleMoveDamage\n\ - ldr r1, [r4]\n\ - movs r0, 0x96\n\ - muls r0, r1\n\ - movs r1, 0x64\n\ - bl __divsi3\n\ - str r0, [r4]\n\ -_080203B8:\n\ - ldr r0, _080203F8 @ =gSharedMem\n\ - ldr r2, _080203FC @ =0x00016018\n\ - adds r0, r2\n\ - ldrb r1, [r0]\n\ - movs r0, 0x64\n\ - muls r0, r1\n\ - ldr r1, _08020400 @ =gPlayerParty\n\ - adds r0, r1\n\ - bl IsTradedMon\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08020404\n\ - ldr r4, _080203EC @ =gBattleMoveDamage\n\ - ldr r1, [r4]\n\ - movs r0, 0x96\n\ - muls r0, r1\n\ - movs r1, 0x64\n\ - bl __divsi3\n\ - str r0, [r4]\n\ - movs r7, 0xA5\n\ - lsls r7, 1\n\ - mov r8, r4\n\ - b _0802040A\n\ - .align 2, 0\n\ -_080203EC: .4byte gBattleMoveDamage\n\ -_080203F0: .4byte gExpShareExp\n\ -_080203F4: .4byte gBattleTypeFlags\n\ -_080203F8: .4byte gSharedMem\n\ -_080203FC: .4byte 0x00016018\n\ -_08020400: .4byte gPlayerParty\n\ -_08020404:\n\ - ldr r7, _0802043C @ =0x00000149\n\ - ldr r3, _08020440 @ =gBattleMoveDamage\n\ - mov r8, r3\n\ -_0802040A:\n\ - ldr r0, _08020444 @ =gBattleTypeFlags\n\ - ldrh r0, [r0]\n\ - movs r1, 0x1\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - beq _08020488\n\ - ldr r1, _08020448 @ =gBattlePartyID\n\ - ldr r0, _0802044C @ =gSharedMem\n\ - ldr r3, _08020450 @ =0x00016018\n\ - adds r2, r0, r3\n\ - ldrh r1, [r1, 0x4]\n\ - adds r5, r0, 0\n\ - ldr r4, _08020454 @ =gBitTable\n\ - ldr r3, _08020458 @ =gAbsentBankFlags\n\ - ldrb r2, [r2]\n\ - cmp r1, r2\n\ - bne _08020460\n\ - ldrb r1, [r3]\n\ - ldr r0, [r4, 0x8]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - bne _08020460\n\ - ldr r0, _0802045C @ =0x000160a2\n\ - adds r1, r5, r0\n\ - b _0802047C\n\ - .align 2, 0\n\ -_0802043C: .4byte 0x00000149\n\ -_08020440: .4byte gBattleMoveDamage\n\ -_08020444: .4byte gBattleTypeFlags\n\ -_08020448: .4byte gBattlePartyID\n\ -_0802044C: .4byte gSharedMem\n\ -_08020450: .4byte 0x00016018\n\ -_08020454: .4byte gBitTable\n\ -_08020458: .4byte gAbsentBankFlags\n\ -_0802045C: .4byte 0x000160a2\n\ -_08020460:\n\ - ldrb r2, [r3]\n\ - ldr r0, [r4]\n\ - ands r2, r0\n\ - cmp r2, 0\n\ - bne _08020478\n\ - ldr r1, _08020474 @ =0x000160a2\n\ - adds r0, r5, r1\n\ - strb r2, [r0]\n\ - b _08020490\n\ - .align 2, 0\n\ -_08020474: .4byte 0x000160a2\n\ -_08020478:\n\ - ldr r2, _08020484 @ =0x000160a2\n\ - adds r1, r5, r2\n\ -_0802047C:\n\ - movs r0, 0x2\n\ - strb r0, [r1]\n\ - b _08020490\n\ - .align 2, 0\n\ -_08020484: .4byte 0x000160a2\n\ -_08020488:\n\ - ldr r0, _08020530 @ =gSharedMem\n\ - ldr r3, _08020534 @ =0x000160a2\n\ - adds r0, r3\n\ - strb r1, [r0]\n\ -_08020490:\n\ - ldr r1, _08020538 @ =gBattleTextBuff1\n\ - movs r3, 0\n\ - movs r2, 0xFD\n\ - strb r2, [r1]\n\ - movs r5, 0x4\n\ - strb r5, [r1, 0x1]\n\ - ldr r4, _08020530 @ =gSharedMem\n\ - ldr r0, _08020534 @ =0x000160a2\n\ - adds r6, r4, r0\n\ - ldrb r0, [r6]\n\ - strb r0, [r1, 0x2]\n\ - ldr r0, _0802053C @ =0x00016018\n\ - adds r4, r0\n\ - ldrb r0, [r4]\n\ - strb r0, [r1, 0x3]\n\ - movs r0, 0xFF\n\ - strb r0, [r1, 0x4]\n\ - ldr r1, _08020540 @ =gBattleTextBuff2\n\ - strb r2, [r1]\n\ - strb r3, [r1, 0x1]\n\ - strb r7, [r1, 0x2]\n\ - movs r3, 0xFF\n\ - lsls r3, 8\n\ - ands r7, r3\n\ - asrs r0, r7, 8\n\ - strb r0, [r1, 0x3]\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - strb r0, [r1, 0x4]\n\ - ldr r1, _08020544 @ =gBattleTextBuff3\n\ - strb r2, [r1]\n\ - movs r0, 0x1\n\ - strb r0, [r1, 0x1]\n\ - strb r5, [r1, 0x2]\n\ - movs r0, 0x5\n\ - strb r0, [r1, 0x3]\n\ - mov r0, r8\n\ - ldr r2, [r0]\n\ - strb r2, [r1, 0x4]\n\ - adds r0, r2, 0\n\ - ands r0, r3\n\ - asrs r0, 8\n\ - strb r0, [r1, 0x5]\n\ - movs r0, 0xFF\n\ - lsls r0, 16\n\ - ands r0, r2\n\ - asrs r0, 16\n\ - strb r0, [r1, 0x6]\n\ - lsrs r2, 24\n\ - strb r2, [r1, 0x7]\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - strb r0, [r1, 0x8]\n\ - ldrb r1, [r6]\n\ - movs r0, 0xD\n\ - bl PrepareStringBattle\n\ - ldrb r1, [r4]\n\ - movs r0, 0x64\n\ - muls r0, r1\n\ - ldr r1, _08020548 @ =gPlayerParty\n\ - adds r0, r1\n\ - ldr r3, _0802054C @ =gBattleMons\n\ - ldr r1, _08020550 @ =gBank1\n\ - ldrb r2, [r1]\n\ - movs r1, 0x58\n\ - muls r1, r2\n\ - adds r1, r3\n\ - ldrh r1, [r1]\n\ - bl MonGainEVs\n\ -_0802051E:\n\ - ldr r1, _08020530 @ =gSharedMem\n\ - ldr r3, _08020554 @ =0x0001605f\n\ - adds r2, r1, r3\n\ - ldrb r0, [r2]\n\ - lsrs r0, 1\n\ - strb r0, [r2]\n\ - ldr r0, _08020558 @ =0x0001600f\n\ - adds r1, r0\n\ - b _08020618\n\ - .align 2, 0\n\ -_08020530: .4byte gSharedMem\n\ -_08020534: .4byte 0x000160a2\n\ -_08020538: .4byte gBattleTextBuff1\n\ -_0802053C: .4byte 0x00016018\n\ -_08020540: .4byte gBattleTextBuff2\n\ -_08020544: .4byte gBattleTextBuff3\n\ -_08020548: .4byte gPlayerParty\n\ -_0802054C: .4byte gBattleMons\n\ -_08020550: .4byte gBank1\n\ -_08020554: .4byte 0x0001605f\n\ -_08020558: .4byte 0x0001600f\n\ -_0802055C:\n\ - ldr r0, _08020620 @ =gBattleExecBuffer\n\ - ldr r2, [r0]\n\ - cmp r2, 0\n\ - beq _08020566\n\ - b _08020996\n\ -_08020566:\n\ - ldr r1, _08020624 @ =gBattleBufferB\n\ - ldr r4, _08020628 @ =gSharedMem\n\ - ldr r3, _0802062C @ =0x000160a2\n\ - adds r3, r4\n\ - mov r8, r3\n\ - ldrb r0, [r3]\n\ - lsls r0, 9\n\ - adds r0, r1\n\ - strb r2, [r0]\n\ - ldr r0, _08020630 @ =0x00016018\n\ - adds r7, r4, r0\n\ - ldrb r0, [r7]\n\ - movs r6, 0x64\n\ - muls r0, r6\n\ - ldr r5, _08020634 @ =gPlayerParty\n\ - adds r0, r5\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _08020612\n\ - ldrb r0, [r7]\n\ - muls r0, r6\n\ - adds r0, r5\n\ - movs r1, 0x38\n\ - bl GetMonData\n\ - cmp r0, 0x64\n\ - beq _08020612\n\ - ldrb r0, [r7]\n\ - muls r0, r6\n\ - adds r0, r5\n\ - movs r1, 0x3A\n\ - bl GetMonData\n\ - ldr r1, _08020638 @ =0x00017180\n\ - adds r4, r1\n\ - strh r0, [r4]\n\ - ldrb r0, [r7]\n\ - muls r0, r6\n\ - adds r0, r5\n\ - movs r1, 0x3B\n\ - bl GetMonData\n\ - strh r0, [r4, 0x2]\n\ - ldrb r0, [r7]\n\ - muls r0, r6\n\ - adds r0, r5\n\ - movs r1, 0x3C\n\ - bl GetMonData\n\ - strh r0, [r4, 0x4]\n\ - ldrb r0, [r7]\n\ - muls r0, r6\n\ - adds r0, r5\n\ - movs r1, 0x3D\n\ - bl GetMonData\n\ - strh r0, [r4, 0x6]\n\ - ldrb r0, [r7]\n\ - muls r0, r6\n\ - adds r0, r5\n\ - movs r1, 0x3E\n\ - bl GetMonData\n\ - strh r0, [r4, 0x8]\n\ - ldrb r0, [r7]\n\ - muls r0, r6\n\ - adds r0, r5\n\ - movs r1, 0x3F\n\ - bl GetMonData\n\ - strh r0, [r4, 0xA]\n\ - ldr r4, _0802063C @ =gActiveBank\n\ - mov r2, r8\n\ - ldrb r0, [r2]\n\ - strb r0, [r4]\n\ - ldrb r1, [r7]\n\ - ldr r0, _08020640 @ =gBattleMoveDamage\n\ - ldrh r2, [r0]\n\ - movs r0, 0\n\ - bl EmitExpBarUpdate\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ -_08020612:\n\ - ldr r1, _08020628 @ =gSharedMem\n\ - ldr r3, _08020644 @ =0x0001600f\n\ - adds r1, r3\n\ -_08020618:\n\ - ldrb r0, [r1]\n\ - adds r0, 0x1\n\ - strb r0, [r1]\n\ - b _08020996\n\ - .align 2, 0\n\ -_08020620: .4byte gBattleExecBuffer\n\ -_08020624: .4byte gBattleBufferB\n\ -_08020628: .4byte gSharedMem\n\ -_0802062C: .4byte 0x000160a2\n\ -_08020630: .4byte 0x00016018\n\ -_08020634: .4byte gPlayerParty\n\ -_08020638: .4byte 0x00017180\n\ -_0802063C: .4byte gActiveBank\n\ -_08020640: .4byte gBattleMoveDamage\n\ -_08020644: .4byte 0x0001600f\n\ -_08020648:\n\ - ldr r0, _080208AC @ =gBattleExecBuffer\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _08020652\n\ - b _08020996\n\ -_08020652:\n\ - ldr r1, _080208B0 @ =gActiveBank\n\ - ldr r4, _080208B4 @ =gSharedMem\n\ - ldr r2, _080208B8 @ =0x000160a2\n\ - adds r0, r4, r2\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - ldr r2, _080208BC @ =gBattleBufferB\n\ - ldrb r3, [r1]\n\ - lsls r1, r3, 9\n\ - adds r0, r1, r2\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x21\n\ - beq _0802066E\n\ - b _080208F0\n\ -_0802066E:\n\ - adds r0, r2, 0x1\n\ - adds r0, r1, r0\n\ - ldrb r0, [r0]\n\ - cmp r0, 0xB\n\ - beq _0802067A\n\ - b _080208F0\n\ -_0802067A:\n\ - ldr r0, _080208C0 @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - movs r0, 0x8\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080206A8\n\ - ldr r1, _080208C4 @ =gBattlePartyID\n\ - lsls r0, r3, 1\n\ - adds r2, r0, r1\n\ - ldr r0, _080208C8 @ =0x00016018\n\ - adds r1, r4, r0\n\ - ldrh r0, [r2]\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - bne _080206A8\n\ - adds r1, r0, 0\n\ - movs r0, 0x64\n\ - muls r0, r1\n\ - ldr r1, _080208CC @ =gPlayerParty\n\ - adds r0, r1\n\ - adds r1, r3, 0\n\ - bl sub_80324F8\n\ -_080206A8:\n\ - ldr r1, _080208D0 @ =gBattleTextBuff1\n\ - movs r2, 0xFD\n\ - strb r2, [r1]\n\ - movs r0, 0x4\n\ - strb r0, [r1, 0x1]\n\ - ldr r5, _080208B0 @ =gActiveBank\n\ - ldrb r0, [r5]\n\ - strb r0, [r1, 0x2]\n\ - ldr r0, _080208B4 @ =gSharedMem\n\ - ldr r3, _080208C8 @ =0x00016018\n\ - adds r6, r0, r3\n\ - ldrb r0, [r6]\n\ - strb r0, [r1, 0x3]\n\ - movs r0, 0xFF\n\ - strb r0, [r1, 0x4]\n\ - ldr r4, _080208D4 @ =gBattleTextBuff2\n\ - strb r2, [r4]\n\ - movs r0, 0x1\n\ - strb r0, [r4, 0x1]\n\ - strb r0, [r4, 0x2]\n\ - movs r0, 0x3\n\ - strb r0, [r4, 0x3]\n\ - ldrb r0, [r6]\n\ - movs r1, 0x64\n\ - mov r8, r1\n\ - mov r2, r8\n\ - muls r2, r0\n\ - adds r0, r2, 0\n\ - ldr r7, _080208CC @ =gPlayerParty\n\ - adds r0, r7\n\ - movs r1, 0x38\n\ - bl GetMonData\n\ - strb r0, [r4, 0x4]\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - strb r0, [r4, 0x5]\n\ - bl b_movescr_stack_push_cursor\n\ - ldr r2, _080208D8 @ =gLeveledUpInBattle\n\ - ldr r1, _080208DC @ =gBitTable\n\ - ldrb r0, [r6]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - ldrb r1, [r2]\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r1, _080208E0 @ =gBattlescriptCurrInstr\n\ - ldr r0, _080208E4 @ =BattleScript_LevelUp\n\ - str r0, [r1]\n\ - ldr r4, _080208E8 @ =gBattleMoveDamage\n\ - ldr r2, _080208BC @ =gBattleBufferB\n\ - ldrb r1, [r5]\n\ - lsls r1, 9\n\ - adds r0, r2, 0x2\n\ - adds r0, r1, r0\n\ - ldrb r3, [r0]\n\ - adds r2, 0x3\n\ - adds r1, r2\n\ - ldrb r0, [r1]\n\ - lsls r0, 8\n\ - orrs r3, r0\n\ - str r3, [r4]\n\ - ldrb r0, [r6]\n\ - mov r3, r8\n\ - muls r3, r0\n\ - adds r0, r3, 0\n\ - adds r0, r7\n\ - movs r1, 0\n\ - bl AdjustFriendship\n\ - ldr r0, _080208C4 @ =gBattlePartyID\n\ - ldrb r1, [r6]\n\ - ldrh r0, [r0]\n\ - cmp r0, r1\n\ - bne _080207EC\n\ - ldr r4, _080208EC @ =gBattleMons\n\ - ldrh r0, [r4, 0x28]\n\ - cmp r0, 0\n\ - beq _080207EC\n\ - mov r0, r8\n\ - muls r0, r1\n\ - adds r0, r7\n\ - movs r1, 0x38\n\ - bl GetMonData\n\ - adds r1, r4, 0\n\ - adds r1, 0x2A\n\ - strb r0, [r1]\n\ - ldrb r0, [r6]\n\ - mov r1, r8\n\ - muls r1, r0\n\ - adds r0, r1, 0\n\ - adds r0, r7\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - strh r0, [r4, 0x28]\n\ - ldrb r0, [r6]\n\ - mov r2, r8\n\ - muls r2, r0\n\ - adds r0, r2, 0\n\ - adds r0, r7\n\ - movs r1, 0x3A\n\ - bl GetMonData\n\ - strh r0, [r4, 0x2C]\n\ - ldrb r0, [r6]\n\ - mov r3, r8\n\ - muls r3, r0\n\ - adds r0, r3, 0\n\ - adds r0, r7\n\ - movs r1, 0x3B\n\ - bl GetMonData\n\ - strh r0, [r4, 0x2]\n\ - ldrb r0, [r6]\n\ - mov r1, r8\n\ - muls r1, r0\n\ - adds r0, r1, 0\n\ - adds r0, r7\n\ - movs r1, 0x3C\n\ - bl GetMonData\n\ - strh r0, [r4, 0x4]\n\ - ldrb r0, [r6]\n\ - mov r2, r8\n\ - muls r2, r0\n\ - adds r0, r2, 0\n\ - adds r0, r7\n\ - movs r1, 0x3D\n\ - bl GetMonData\n\ - strh r0, [r4, 0x6]\n\ - ldrb r0, [r6]\n\ - mov r3, r8\n\ - muls r3, r0\n\ - adds r0, r3, 0\n\ - adds r0, r7\n\ - movs r1, 0x3D\n\ - bl GetMonData\n\ - strh r0, [r4, 0x6]\n\ - ldrb r0, [r6]\n\ - mov r1, r8\n\ - muls r1, r0\n\ - adds r0, r1, 0\n\ - adds r0, r7\n\ - movs r1, 0x3E\n\ - bl GetMonData\n\ - strh r0, [r4, 0x8]\n\ - ldrb r0, [r6]\n\ - mov r2, r8\n\ - muls r2, r0\n\ - adds r0, r2, 0\n\ - adds r0, r7\n\ - movs r1, 0x3F\n\ - bl GetMonData\n\ - strh r0, [r4, 0xA]\n\ -_080207EC:\n\ - ldr r0, _080208C4 @ =gBattlePartyID\n\ - ldr r1, _080208B4 @ =gSharedMem\n\ - ldr r3, _080208C8 @ =0x00016018\n\ - adds r7, r1, r3\n\ - ldrb r2, [r7]\n\ - ldrh r0, [r0, 0x4]\n\ - cmp r0, r2\n\ - bne _080208F6\n\ - ldr r6, _080208EC @ =gBattleMons\n\ - movs r0, 0xD8\n\ - adds r0, r6\n\ - mov r8, r0\n\ - ldrh r0, [r0]\n\ - cmp r0, 0\n\ - beq _080208F6\n\ - ldr r0, _080208C0 @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080208F6\n\ - movs r5, 0x64\n\ - adds r0, r2, 0\n\ - muls r0, r5\n\ - ldr r4, _080208CC @ =gPlayerParty\n\ - adds r0, r4\n\ - movs r1, 0x38\n\ - bl GetMonData\n\ - adds r1, r6, 0\n\ - adds r1, 0xDA\n\ - strb r0, [r1]\n\ - ldrb r0, [r7]\n\ - muls r0, r5\n\ - adds r0, r4\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - mov r1, r8\n\ - strh r0, [r1]\n\ - ldrb r0, [r7]\n\ - muls r0, r5\n\ - adds r0, r4\n\ - movs r1, 0x3A\n\ - bl GetMonData\n\ - adds r1, r6, 0\n\ - adds r1, 0xDC\n\ - strh r0, [r1]\n\ - ldrb r0, [r7]\n\ - muls r0, r5\n\ - adds r0, r4\n\ - movs r1, 0x3B\n\ - bl GetMonData\n\ - adds r1, r6, 0\n\ - adds r1, 0xB2\n\ - strh r0, [r1]\n\ - ldrb r0, [r7]\n\ - muls r0, r5\n\ - adds r0, r4\n\ - movs r1, 0x3C\n\ - bl GetMonData\n\ - adds r1, r6, 0\n\ - adds r1, 0xB4\n\ - strh r0, [r1]\n\ - ldrb r0, [r7]\n\ - muls r0, r5\n\ - adds r0, r4\n\ - movs r1, 0x3D\n\ - bl GetMonData\n\ - movs r2, 0xB6\n\ - adds r2, r6\n\ - mov r8, r2\n\ - strh r0, [r2]\n\ - ldrb r0, [r7]\n\ - muls r0, r5\n\ - adds r0, r4\n\ - movs r1, 0x3D\n\ - bl GetMonData\n\ - mov r3, r8\n\ - strh r0, [r3]\n\ - ldrb r0, [r7]\n\ - muls r0, r5\n\ - adds r0, r4\n\ - movs r1, 0x3E\n\ - bl GetMonData\n\ - adds r1, r6, 0\n\ - adds r1, 0xB8\n\ - strh r0, [r1]\n\ - b _080208F6\n\ - .align 2, 0\n\ -_080208AC: .4byte gBattleExecBuffer\n\ -_080208B0: .4byte gActiveBank\n\ -_080208B4: .4byte gSharedMem\n\ -_080208B8: .4byte 0x000160a2\n\ -_080208BC: .4byte gBattleBufferB\n\ -_080208C0: .4byte gBattleTypeFlags\n\ -_080208C4: .4byte gBattlePartyID\n\ -_080208C8: .4byte 0x00016018\n\ -_080208CC: .4byte gPlayerParty\n\ -_080208D0: .4byte gBattleTextBuff1\n\ -_080208D4: .4byte gBattleTextBuff2\n\ -_080208D8: .4byte gLeveledUpInBattle\n\ -_080208DC: .4byte gBitTable\n\ -_080208E0: .4byte gBattlescriptCurrInstr\n\ -_080208E4: .4byte BattleScript_LevelUp\n\ -_080208E8: .4byte gBattleMoveDamage\n\ -_080208EC: .4byte gBattleMons\n\ -_080208F0:\n\ - ldr r1, _08020904 @ =gBattleMoveDamage\n\ - movs r0, 0\n\ - str r0, [r1]\n\ -_080208F6:\n\ - ldr r0, _08020908 @ =gSharedMem\n\ - ldr r1, _0802090C @ =0x0001600f\n\ - adds r0, r1\n\ - movs r1, 0x5\n\ - strb r1, [r0]\n\ - b _08020996\n\ - .align 2, 0\n\ -_08020904: .4byte gBattleMoveDamage\n\ -_08020908: .4byte gSharedMem\n\ -_0802090C: .4byte 0x0001600f\n\ -_08020910:\n\ - ldr r0, _08020924 @ =gBattleMoveDamage\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _08020930\n\ - ldr r0, _08020928 @ =gSharedMem\n\ - ldr r2, _0802092C @ =0x0001600f\n\ - adds r0, r2\n\ - movs r1, 0x3\n\ - strb r1, [r0]\n\ - b _08020996\n\ - .align 2, 0\n\ -_08020924: .4byte gBattleMoveDamage\n\ -_08020928: .4byte gSharedMem\n\ -_0802092C: .4byte 0x0001600f\n\ -_08020930:\n\ - ldr r2, _08020950 @ =gSharedMem\n\ - ldr r3, _08020954 @ =0x00016018\n\ - adds r1, r2, r3\n\ - ldrb r0, [r1]\n\ - adds r0, 0x1\n\ - strb r0, [r1]\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x5\n\ - bhi _0802095C\n\ - ldr r0, _08020958 @ =0x0001600f\n\ - adds r1, r2, r0\n\ - movs r0, 0x2\n\ - strb r0, [r1]\n\ - b _08020996\n\ - .align 2, 0\n\ -_08020950: .4byte gSharedMem\n\ -_08020954: .4byte 0x00016018\n\ -_08020958: .4byte 0x0001600f\n\ -_0802095C:\n\ - ldr r3, _08020968 @ =0x0001600f\n\ - adds r1, r2, r3\n\ - movs r0, 0x6\n\ - strb r0, [r1]\n\ - b _08020996\n\ - .align 2, 0\n\ -_08020968: .4byte 0x0001600f\n\ -_0802096C:\n\ - ldr r0, _080209A4 @ =gBattleExecBuffer\n\ - ldr r5, [r0]\n\ - cmp r5, 0\n\ - bne _08020996\n\ - ldr r4, _080209A8 @ =gBattleMons\n\ - ldr r2, _080209AC @ =gBank1\n\ - ldrb r0, [r2]\n\ - movs r1, 0x58\n\ - muls r0, r1\n\ - adds r0, r4\n\ - movs r3, 0\n\ - strh r5, [r0, 0x2E]\n\ - ldrb r0, [r2]\n\ - muls r0, r1\n\ - adds r0, r4\n\ - adds r0, 0x20\n\ - strb r3, [r0]\n\ - ldr r1, _080209B0 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x2\n\ - str r0, [r1]\n\ -_08020996:\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080209A4: .4byte gBattleExecBuffer\n\ -_080209A8: .4byte gBattleMons\n\ -_080209AC: .4byte gBank1\n\ -_080209B0: .4byte gBattlescriptCurrInstr\n\ - .syntax divided\n"); -} - -#endif // NONMATCHING #ifdef NONMATCHING static void atk24(void) @@ -6958,7 +6056,7 @@ _08020B50: .4byte gBattlescriptCurrInstr\n\ static void MoveValuesCleanUp(void) { gBattleMoveFlags = 0; - BATTLE_STRUCT->dmgMultiplier = 1; + gBattleStruct->dmgMultiplier = 1; gCritMultiplier = 1; gBattleCommunication[MOVE_EFFECT_BYTE] = 0; gBattleCommunication[6] = 0; @@ -7283,26 +6381,26 @@ static void atk3B_healthbar_update(void) static void atk3C_return(void) { - b_movescr_stack_pop_cursor(); + BattleScriptPop(); } static void atk3D_end(void) { gBattleMoveFlags = 0; gActiveBank = 0; - gFightStateTracker = 0xB; + gCurrentActionFuncId = 0xB; } static void atk3E_end2(void) { //not much difference between this and 3D. It's more apparent in Emerald gActiveBank = 0; - gFightStateTracker = 0xB; + gCurrentActionFuncId = 0xB; } static void atk3F_end3(void) //pops the main function stack { - b_movescr_stack_pop_cursor(); + BattleScriptPop(); if (B_FUNCTION_STACK->size) B_FUNCTION_STACK->size--; gBattleMainFunc = B_FUNCTION_STACK->ptr[B_FUNCTION_STACK->size]; @@ -7310,7 +6408,7 @@ static void atk3F_end3(void) //pops the main function stack static void atk41_call(void) { - b_movescr_stack_push(gBattlescriptCurrInstr + 5); + BattleScriptPush(gBattlescriptCurrInstr + 5); gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } @@ -7354,7 +6452,7 @@ static void atk45_playanimation(void) } else if (gHitMarker & HITMARKER_NO_ANIMATIONS) { - b_movescr_stack_push(gBattlescriptCurrInstr + 7); + BattleScriptPush(gBattlescriptCurrInstr + 7); gBattlescriptCurrInstr = BattleScript_Pausex20; } else if (gBattlescriptCurrInstr[2] == B_ANIM_RAIN_CONTINUES @@ -7423,7 +6521,7 @@ static void atk46_playanimation2(void) // animation Id is stored in the first po static void atk47_setgraphicalstatchangevalues(void) { u8 to_add = 0; - switch (BATTLE_STRUCT->statChanger & 0xF0) + switch (gBattleStruct->statChanger & 0xF0) { case 0x10: //+1 to_add = 0xF; @@ -7438,8 +6536,8 @@ static void atk47_setgraphicalstatchangevalues(void) to_add = 0x2E; break; } - BATTLE_STRUCT->animArg1 = (BATTLE_STRUCT->statChanger & 0xF) + to_add - 1; - BATTLE_STRUCT->animArg2 = 0; + gBattleStruct->animArg1 = (gBattleStruct->statChanger & 0xF) + to_add - 1; + gBattleStruct->animArg2 = 0; gBattlescriptCurrInstr++; } @@ -7467,7 +6565,7 @@ static void atk48_playstatchangeanimation(void) if (!(T2_READ_8(gBattlescriptCurrInstr + 3))) { u8 ability; - if (gSideTimer[GetBankIdentity(gActiveBank) & 1].mistTimer) + if (gSideTimers[GetBankIdentity(gActiveBank) & 1].mistTimer) continue; ability = gBattleMons[gActiveBank].ability; if (ability == ABILITY_CLEAR_BODY || ability == ABILITY_WHITE_SMOKE || (ability == ABILITY_KEEN_EYE && curr_stat == 6) || (ability == ABILITY_HYPER_CUTTER && curr_stat == 1)) @@ -7513,14 +6611,14 @@ static void atk48_playstatchangeanimation(void) stat_animID = 0x38; } if ((T2_READ_8(gBattlescriptCurrInstr + 3) & 2 && changeable_stats <= 1) - || changeable_stats == 0 || BATTLE_STRUCT->filler2[0] != 0) + || changeable_stats == 0 || gBattleStruct->filler2[0] != 0) gBattlescriptCurrInstr += 4; else { EmitBattleAnimation(0, 1, stat_animID); MarkBufferBankForExecution(gActiveBank); if ((T2_READ_8(gBattlescriptCurrInstr + 3) & 4) && changeable_stats > 1) - BATTLE_STRUCT->filler2[0] = 1; + gBattleStruct->filler2[0] = 1; gBattlescriptCurrInstr += 4; } } @@ -7602,7 +6700,7 @@ _0802167C:\n\ lsls r0, r1, 1\n\ adds r0, r1\n\ lsls r0, 2\n\ - ldr r1, _08021704 @ =gSideTimer\n\ + ldr r1, _08021704 @ =gSideTimers\n\ adds r0, r1\n\ ldrb r0, [r0, 0x2]\n\ ldr r3, [sp]\n\ @@ -7665,7 +6763,7 @@ _080216E4:\n\ b _08021770\n\ .align 2, 0\n\ _08021700: .4byte gActiveBank\n\ -_08021704: .4byte gSideTimer\n\ +_08021704: .4byte gSideTimers\n\ _08021708: .4byte gBattleMons\n\ _0802170C: .4byte gBattlescriptCurrInstr\n\ _08021710:\n\ @@ -7813,14 +6911,14 @@ static void atk49_moveend(void) hold_effect_atk = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item); choiced_move_atk = (u16*)(gBankAttacker * (ewram_addr + 0x160E8)); - if (BATTLE_STRUCT->dynamicMoveType) - move_type = BATTLE_STRUCT->dynamicMoveType & 0x3F; + if (gBattleStruct->dynamicMoveType) + move_type = gBattleStruct->dynamicMoveType & 0x3F; else move_type = gBattleMoves[gCurrentMove].type; do { - switch (BATTLE_STRUCT->cmd49StateTracker) + switch (gBattleStruct->cmd49StateTracker) { case 0: //rage check if (gBattleMons[gBankTarget].status2 & STATUS2_RAGE @@ -7830,11 +6928,11 @@ static void atk49_moveend(void) && gBattleMoves[gCurrentMove].power && gBattleMons[gBankTarget].statStages[STAT_STAGE_ATK] <= 0xB) { gBattleMons[gBankTarget].statStages[STAT_STAGE_ATK]++; - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_RageIsBuilding; effect = 1; } - BATTLE_STRUCT->cmd49StateTracker++; + gBattleStruct->cmd49StateTracker++; break; case 1: //defrosting check if (gBattleMons[gBankTarget].status1 & STATUS_FREEZE @@ -7844,34 +6942,34 @@ static void atk49_moveend(void) { gBattleMons[gBankTarget].status1 &= ~(STATUS_FREEZE); gActiveBank = gBankTarget; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankTarget].status1); + EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankTarget].status1); MarkBufferBankForExecution(gActiveBank); - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_DefrostedViaFireMove; effect = 1; } - BATTLE_STRUCT->cmd49StateTracker++; + gBattleStruct->cmd49StateTracker++; break; case 2: //target synchronize if (AbilityBattleEffects(ABILITYEFFECT_SYNCHRONIZE, gBankTarget, 0, 0, 0)) effect = 1; - BATTLE_STRUCT->cmd49StateTracker++; + gBattleStruct->cmd49StateTracker++; break; case 3: //contact abilities if (AbilityBattleEffects(ABILITYEFFECT_CONTACT, gBankTarget, 0, 0, 0)) effect = 1; - BATTLE_STRUCT->cmd49StateTracker++; + gBattleStruct->cmd49StateTracker++; break; case 4: //status immunities if (AbilityBattleEffects(ABILITYEFFECT_IMMUNITY, 0, 0, 0, 0)) effect = 1; //it loops through 4 banks, so we increment after its done with all banks else - BATTLE_STRUCT->cmd49StateTracker++; + gBattleStruct->cmd49StateTracker++; break; case 5: //attacker synchronize if (AbilityBattleEffects(ABILITYEFFECT_ATK_SYNCHRONIZE, gBankAttacker, 0, 0, 0)) effect = 1; - BATTLE_STRUCT->cmd49StateTracker++; + gBattleStruct->cmd49StateTracker++; break; case 6: //update choice band move if (gHitMarker & HITMARKER_OBEYS && hold_effect_atk == HOLD_EFFECT_CHOICE_BAND @@ -7883,7 +6981,7 @@ static void atk49_moveend(void) if (i == 4) *choiced_move_atk = 0; } - BATTLE_STRUCT->cmd49StateTracker++; + gBattleStruct->cmd49StateTracker++; break; case 7: //changed held items for (i = 0; i < gNoOfAllBanks; i++) @@ -7892,7 +6990,7 @@ static void atk49_moveend(void) if (CHANGED_ITEM(i)) gBattleMons[i].item = CHANGED_ITEM(i); } - BATTLE_STRUCT->cmd49StateTracker++; + gBattleStruct->cmd49StateTracker++; break; case 8: //make sprite invisible if (gStatuses3[gBankAttacker] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER) @@ -7902,12 +7000,11 @@ static void atk49_moveend(void) EmitSpriteInvisibility(0, 1); MarkBufferBankForExecution(gActiveBank); } - BATTLE_STRUCT->cmd49StateTracker++; + gBattleStruct->cmd49StateTracker++; break; - //sub_8015660 CheckIfMoveFailed case 9: //semi-invlurneable attacker make visible if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) || !(gStatuses3[gBankAttacker] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) - || sub_8015660(gBankAttacker)) + || WasUnableToUseMove(gBankAttacker)) { gActiveBank = gBankAttacker; EmitSpriteInvisibility(0, 0); @@ -7915,11 +7012,11 @@ static void atk49_moveend(void) gStatuses3 &= ~(STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER); gSpecialStatuses[gBankAttacker].restored_bank_sprite = 1; } - BATTLE_STRUCT->cmd49StateTracker++; + gBattleStruct->cmd49StateTracker++; break; case 10: //semi-invlurneable target make visible if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) || !(gStatuses3[gBankTarget] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) - || sub_8015660(gBankTarget)) + || WasUnableToUseMove(gBankTarget)) { gActiveBank = gBankTarget; EmitSpriteInvisibility(0, 0); @@ -7927,7 +7024,7 @@ static void atk49_moveend(void) gStatuses3 &= ~(STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER); gSpecialStatuses[gBankTarget].restored_bank_sprite = 1; } - BATTLE_STRUCT->cmd49StateTracker++; + gBattleStruct->cmd49StateTracker++; break; case 11: // } @@ -7936,7 +7033,7 @@ static void atk49_moveend(void) } #else __attribute__((naked)) -static void atk49_moveend(void) +void atk49_moveend(void) { asm(".syntax unified\n\ push {r4-r7,lr}\n\ @@ -8019,7 +7116,7 @@ _08021874:\n\ lsls r0, 2\n\ adds r0, r2\n\ ldr r0, [r0]\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r1, _080218B8 @ =gBattlescriptCurrInstr\n\ ldr r0, _080218BC @ =gUnknown_081D9B2D\n\ bl _0802229C\n\ @@ -8164,7 +7261,7 @@ _080219C8:\n\ bgt _080219FE\n\ adds r0, r2, 0x1\n\ strb r0, [r1, 0x19]\n\ - bl b_movescr_stack_push_cursor\n\ + bl BattleScriptPushCursor\n\ ldr r1, _08021A24 @ =gBattlescriptCurrInstr\n\ ldr r0, _08021A28 @ =BattleScript_RageIsBuilding\n\ str r0, [r1]\n\ @@ -8259,10 +7356,10 @@ _08021A92:\n\ movs r1, 0x28\n\ movs r2, 0\n\ movs r3, 0x4\n\ - bl EmitSetAttributes\n\ + bl EmitSetMonData\n\ ldrb r0, [r4]\n\ bl MarkBufferBankForExecution\n\ - bl b_movescr_stack_push_cursor\n\ + bl BattleScriptPushCursor\n\ ldr r1, _08021AE8 @ =gBattlescriptCurrInstr\n\ ldr r0, _08021AEC @ =BattleScript_DefrostedViaFireMove\n\ str r0, [r1]\n\ @@ -8572,7 +7669,7 @@ _08021D18:\n\ cmp r0, 0\n\ beq _08021D44\n\ adds r0, r2, 0\n\ - bl sub_8015660\n\ + bl WasUnableToUseMove\n\ lsls r0, 24\n\ cmp r0, 0\n\ beq _08021D7E\n\ @@ -8872,7 +7969,7 @@ _08021FA0:\n\ ldr r0, _08021FD4 @ =0x0000ffff\n\ cmp r2, r0\n\ bne _08021FEC\n\ - ldr r1, _08021FE8 @ =gMoveHitWith\n\ + ldr r1, _08021FE8 @ =gLastLandedMoves\n\ ldr r4, _08021FDC @ =gBankTarget\n\ ldrb r0, [r4]\n\ lsls r0, 1\n\ @@ -8886,9 +7983,9 @@ _08021FD8: .4byte gUnknown_02024C4C\n\ _08021FDC: .4byte gBankTarget\n\ _08021FE0: .4byte gUnknown_02024C5C\n\ _08021FE4: .4byte gBattleMoveFlags\n\ -_08021FE8: .4byte gMoveHitWith\n\ +_08021FE8: .4byte gLastLandedMoves\n\ _08021FEC:\n\ - ldr r0, _08022014 @ =gMoveHitWith\n\ + ldr r0, _08022014 @ =gLastLandedMoves\n\ ldr r5, _08022018 @ =gBankTarget\n\ ldrb r1, [r5]\n\ lsls r1, 1\n\ @@ -8901,7 +7998,7 @@ _08021FEC:\n\ ldrb r3, [r0]\n\ cmp r3, 0\n\ beq _08022028\n\ - ldr r0, _08022024 @ =gUnknown_02024C44\n\ + ldr r0, _08022024 @ =gLastHitByType\n\ ldrb r1, [r5]\n\ lsls r1, 1\n\ adds r1, r0\n\ @@ -8909,13 +8006,13 @@ _08021FEC:\n\ ands r0, r3\n\ b _08021C22\n\ .align 2, 0\n\ -_08022014: .4byte gMoveHitWith\n\ +_08022014: .4byte gLastLandedMoves\n\ _08022018: .4byte gBankTarget\n\ _0802201C: .4byte gCurrentMove\n\ _08022020: .4byte 0x0001601c\n\ -_08022024: .4byte gUnknown_02024C44\n\ +_08022024: .4byte gLastHitByType\n\ _08022028:\n\ - ldr r0, _08022044 @ =gUnknown_02024C44\n\ + ldr r0, _08022044 @ =gLastHitByType\n\ ldr r1, _08022048 @ =gBankTarget\n\ ldrb r2, [r1]\n\ lsls r2, 1\n\ @@ -8929,10 +8026,10 @@ _08022028:\n\ strh r0, [r2]\n\ b _08022244\n\ .align 2, 0\n\ -_08022044: .4byte gUnknown_02024C44\n\ +_08022044: .4byte gLastHitByType\n\ _08022048: .4byte gBankTarget\n\ _0802204C:\n\ - ldr r0, _0802205C @ =gMoveHitWith\n\ + ldr r0, _0802205C @ =gLastLandedMoves\n\ ldr r2, _08022060 @ =gBankTarget\n\ ldrb r1, [r2]\n\ lsls r1, 1\n\ @@ -8940,7 +8037,7 @@ _0802204C:\n\ ldr r0, _08022064 @ =0x0000ffff\n\ b _08021C22\n\ .align 2, 0\n\ -_0802205C: .4byte gMoveHitWith\n\ +_0802205C: .4byte gLastLandedMoves\n\ _08022060: .4byte gBankTarget\n\ _08022064: .4byte 0x0000ffff\n\ _08022068:\n\ @@ -9154,7 +8251,7 @@ _080221C0:\n\ eors r0, r1\n\ lsls r0, 24\n\ lsrs r0, 24\n\ - bl GetBankByPlayerAI\n\ + bl GetBankByIdentity\n\ lsls r0, 24\n\ lsrs r2, r0, 24\n\ ldr r1, _080222CC @ =gBattleMons\n\ @@ -9257,7 +8354,7 @@ static void atk4A_typecalc2(void) { gLastUsedAbility = gBattleMons[gBankTarget].ability; gBattleMoveFlags |= (MOVESTATUS_MISSED | MOVESTATUS_NOTAFFECTED); - gMoveHitWith[gBankTarget] = 0; + gLastLandedMoves[gBankTarget] = 0; gBattleCommunication[6] = move_type; RecordAbilityBattle(gBankTarget, gLastUsedAbility); } @@ -9312,7 +8409,7 @@ static void atk4A_typecalc2(void) { gLastUsedAbility = ABILITY_WONDER_GUARD; gBattleMoveFlags |= MOVESTATUS_MISSED; - gMoveHitWith[gBankTarget] = 0; + gLastLandedMoves[gBankTarget] = 0; gBattleCommunication[6] = 3; RecordAbilityBattle(gBankTarget, gLastUsedAbility); } @@ -9347,27 +8444,19 @@ static void atk4C_getswitchedmondata(void) gBattlescriptCurrInstr += 2; } -static inline u8 get_knocked_off_byte(u8 bank) -{ - register u32 side asm("r2") = GetBankSide(bank); - register struct WishFutureKnock* dummy = &gWishFutureKnock; - register u8* aa = ((u8*)((u8*)(dummy))); - register u8* bb = aa + 0x29; - register u8* cc asm("r0") = side + bb; - return *cc; -} - static void atk4D_switchindataupdate(void) { - struct BattlePokemon OldData; - int i; + struct BattlePokemon oldData; + s32 i; u8 *monData; + if (gBattleExecBuffer) return; - gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - OldData = gBattleMons[gActiveBank]; + gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]); + oldData = gBattleMons[gActiveBank]; monData = (u8*)(&gBattleMons[gActiveBank]); + for (i = 0; i < sizeof(struct BattlePokemon); i++) { monData[i] = gBattleBufferB[gActiveBank][4 + i]; @@ -9376,8 +8465,10 @@ static void atk4D_switchindataupdate(void) gBattleMons[gActiveBank].type1 = gBaseStats[gBattleMons[gActiveBank].species].type1; gBattleMons[gActiveBank].type2 = gBaseStats[gBattleMons[gActiveBank].species].type2; gBattleMons[gActiveBank].ability = GetAbilityBySpecies(gBattleMons[gActiveBank].species, gBattleMons[gActiveBank].altAbility); - //check knocked off item - if (get_knocked_off_byte(gActiveBank) & gBitTable[gBattlePartyID[gActiveBank]]) + + // check knocked off item + i = GetBankSide(gActiveBank); + if (gWishFutureKnock.knockedOffPokes[i] & gBitTable[gBattlePartyID[gActiveBank]]) { gBattleMons[gActiveBank].item = 0; } @@ -9386,17 +8477,16 @@ static void atk4D_switchindataupdate(void) { for (i = 0; i < 8; i++) { - gBattleMons[gActiveBank].statStages[i] = OldData.statStages[i]; + gBattleMons[gActiveBank].statStages[i] = oldData.statStages[i]; } - gBattleMons[gActiveBank].status2 = OldData.status2; + gBattleMons[gActiveBank].status2 = oldData.status2; } - SwitchInClearStructs(); - BATTLE_STRUCT->scriptingActive = gActiveBank; - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 7; - gBattleTextBuff1[2] = gActiveBank; - gBattleTextBuff1[3] = gBattlePartyID[gActiveBank]; - gBattleTextBuff1[4] = EOS; + + SwitchInClearSetData(); + + gBattleStruct->scriptingActive = gActiveBank; + + PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gActiveBank, gBattlePartyID[gActiveBank]); gBattlescriptCurrInstr += 2; } @@ -9457,18 +8547,18 @@ static void atk4F_jumpifcantswitch(void) { if (GetBankSide(gActiveBank) == 1) { - r7 = GetBankByPlayerAI(1); + r7 = GetBankByIdentity(1); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - to_cmp = GetBankByPlayerAI(3); + to_cmp = GetBankByIdentity(3); else to_cmp = r7; party = gEnemyParty; } else { - r7 = GetBankByPlayerAI(0); + r7 = GetBankByIdentity(0); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - to_cmp = GetBankByPlayerAI(2); + to_cmp = GetBankByIdentity(2); else to_cmp = r7; party = gPlayerParty; @@ -9491,7 +8581,7 @@ static void atk4F_jumpifcantswitch(void) void sub_8022A3C(u8 unkown) { BATTLE_PARTY_ID(gActiveBank) = gBattlePartyID[gActiveBank]; - EmitChoosePokemon(0, 1, unkown, 0, BATTLE_STRUCT->unk1606C[gActiveBank]); + EmitChoosePokemon(0, 1, unkown, 0, gBattleStruct->unk1606C[gActiveBank]); MarkBufferBankForExecution(gActiveBank); } @@ -10528,7 +9618,7 @@ _080232C4:\n\ eors r0, r1\n\ lsls r0, 24\n\ lsrs r0, 24\n\ - bl GetBankByPlayerAI\n\ + bl GetBankByIdentity\n\ ldr r4, _08023310 @ =gActiveBank\n\ strb r0, [r4]\n\ ldr r0, _08023314 @ =gAbsentBankFlags\n\ @@ -10632,13 +9722,13 @@ static void atk52_switchineffects(void) gSideAffecting[GetBankSide(gActiveBank)] |= SIDE_STATUS_SPIKES_DAMAGED; - spikesDmg = (5 - gSideTimer[GetBankSide(gActiveBank)].spikesAmount) * 2; + spikesDmg = (5 - gSideTimers[GetBankSide(gActiveBank)].spikesAmount) * 2; gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / (spikesDmg); if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; - BATTLE_STRUCT->scriptingActive = gActiveBank; - b_movescr_stack_push_cursor(); + gBattleStruct->scriptingActive = gActiveBank; + BattleScriptPushCursor(); if (T2_READ_8(gBattlescriptCurrInstr + 1) == 0) gBattlescriptCurrInstr = BattleScript_SpikesOnTarget; @@ -10660,8 +9750,8 @@ static void atk52_switchineffects(void) for (i = 0; i < gNoOfAllBanks; i++) { - if (gTurnOrder[i] == gActiveBank) - gUnknown_02024A76[i] = 0xC; + if (gBanksByTurnOrder[i] == gActiveBank) + gActionsByTurnOrder[i] = 0xC; } for (i = 0; i < gNoOfAllBanks; i++) @@ -10690,9 +9780,9 @@ static void atk52_switchineffects(void) static void atk53_trainerslidein(void) { if (!T2_READ_8(gBattlescriptCurrInstr + 1)) - gActiveBank = GetBankByPlayerAI(0); + gActiveBank = GetBankByIdentity(0); else - gActiveBank = GetBankByPlayerAI(1); + gActiveBank = GetBankByIdentity(1); EmitTrainerSlide(0); MarkBufferBankForExecution(gActiveBank); @@ -10725,7 +9815,7 @@ static void atk56_playfaintcry(void) static void atk57(void) { - gActiveBank = GetBankByPlayerAI(0); + gActiveBank = GetBankByIdentity(0); Emitcmd55(0, gBattleOutcome); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr += 1; @@ -10744,9 +9834,9 @@ void atk59_handlelearnnewmove(void) u8* loc1 = T1_READ_PTR(gBattlescriptCurrInstr + 1); u8* loc2 = T1_READ_PTR(gBattlescriptCurrInstr + 5); - u16 ret = MonTryLearningNewMove(&gPlayerParty[BATTLE_STRUCT->expGetterID], T2_READ_8(gBattlescriptCurrInstr + 9)); + u16 ret = MonTryLearningNewMove(&gPlayerParty[gBattleStruct->expGetterID], T2_READ_8(gBattlescriptCurrInstr + 9)); while (ret == 0xFFFE) - ret = MonTryLearningNewMove(&gPlayerParty[BATTLE_STRUCT->expGetterID], 0); + ret = MonTryLearningNewMove(&gPlayerParty[gBattleStruct->expGetterID], 0); if (ret == 0) { @@ -10758,13 +9848,13 @@ void atk59_handlelearnnewmove(void) } else { - gActiveBank = GetBankByPlayerAI(0); - if (gBattlePartyID[gActiveBank] == BATTLE_STRUCT->expGetterID && !(gBattleMons[gActiveBank].status2 & STATUS2_TRANSFORMED)) + gActiveBank = GetBankByIdentity(0); + if (gBattlePartyID[gActiveBank] == gBattleStruct->expGetterID && !(gBattleMons[gActiveBank].status2 & STATUS2_TRANSFORMED)) GiveMoveToBattleMon(&gBattleMons[gActiveBank], ret); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) //what is else if { - gActiveBank = GetBankByPlayerAI(2); - if (gBattlePartyID[gActiveBank] == BATTLE_STRUCT->expGetterID && !(gBattleMons[gActiveBank].status2 & STATUS2_TRANSFORMED)) + gActiveBank = GetBankByIdentity(2); + if (gBattlePartyID[gActiveBank] == gBattleStruct->expGetterID && !(gBattleMons[gActiveBank].status2 & STATUS2_TRANSFORMED)) GiveMoveToBattleMon(&gBattleMons[gActiveBank], ret); } gBattlescriptCurrInstr = loc1; @@ -10774,9 +9864,9 @@ void atk59_handlelearnnewmove(void) void sub_8023A80(void) { sub_802BBD4(0x18, 8, 0x1D, 0xD, 0); - InitWindow(&gUnknown_03004210, BattleText_YesNo, 0x100, 0x19, 0x9); - sub_8002F44(&gUnknown_03004210); - sub_814A5C0(0, 0xFFFF, 0xC, 0x2D9F, 0x20); + Text_InitWindow(&gUnknown_03004210, BattleText_YesNo, 0x100, 0x19, 0x9); + Text_PrintWindow8002F44(&gUnknown_03004210); + MenuCursor_Create814A5C0(0, 0xFFFF, 0xC, 0x2D9F, 0x20); } void sub_8023AD8(void) @@ -10788,11 +9878,11 @@ void sub_8023AD8(void) static void atk5A_yesnoboxlearnmove(void) { gActiveBank = 0; - switch (BATTLE_STRUCT->atk5A_StateTracker) + switch (gBattleStruct->atk5A_StateTracker) { case 0: sub_8023A80(); - BATTLE_STRUCT->atk5A_StateTracker++; + gBattleStruct->atk5A_StateTracker++; gBattleCommunication[1] = 0; sub_802BC6C(); break; @@ -10818,7 +9908,7 @@ static void atk5A_yesnoboxlearnmove(void) { sub_8023AD8(); BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - BATTLE_STRUCT->atk5A_StateTracker++; + gBattleStruct->atk5A_StateTracker++; return; } goto state_tracker_4; @@ -10827,31 +9917,31 @@ static void atk5A_yesnoboxlearnmove(void) { PlaySE(SE_SELECT); state_tracker_4: - BATTLE_STRUCT->atk5A_StateTracker = 4; + gBattleStruct->atk5A_StateTracker = 4; } break; case 2: if (!gPaletteFade.active) { - ShowSelectMovePokemonSummaryScreen(gPlayerParty, BATTLE_STRUCT->expGetterID, gPlayerPartyCount - 1, ReshowBattleScreenAfterMenu, gMoveToLearn); - BATTLE_STRUCT->atk5A_StateTracker++; + ShowSelectMovePokemonSummaryScreen(gPlayerParty, gBattleStruct->expGetterID, gPlayerPartyCount - 1, ReshowBattleScreenAfterMenu, gMoveToLearn); + gBattleStruct->atk5A_StateTracker++; } break; case 3: - if (!gPaletteFade.active && gMain.callback2 == sub_800F808) + if (!gPaletteFade.active && gMain.callback2 == BattleMainCB2) { u8 move_pos = sub_809FA30(); if (move_pos == 4) { - BATTLE_STRUCT->atk5A_StateTracker = 4; + gBattleStruct->atk5A_StateTracker = 4; } else { - u16 move = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_MOVE1 + move_pos); + u16 move = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_MOVE1 + move_pos); if (IsHMMove2(move)) { PrepareStringBattle(0x13F, gActiveBank); - BATTLE_STRUCT->atk5A_StateTracker = 5; + gBattleStruct->atk5A_StateTracker = 5; } else { @@ -10867,15 +9957,15 @@ static void atk5A_yesnoboxlearnmove(void) ptr += 4; } ptr[0] = 0xFF; - RemoveMonPPBonus(&gPlayerParty[BATTLE_STRUCT->expGetterID], move_pos); - SetMonMoveSlot(&gPlayerParty[BATTLE_STRUCT->expGetterID], gMoveToLearn, move_pos); - if (gBattlePartyID[0] == BATTLE_STRUCT->expGetterID && !(gBattleMons[0].status2 & STATUS2_TRANSFORMED) + RemoveMonPPBonus(&gPlayerParty[gBattleStruct->expGetterID], move_pos); + SetMonMoveSlot(&gPlayerParty[gBattleStruct->expGetterID], gMoveToLearn, move_pos); + if (gBattlePartyID[0] == gBattleStruct->expGetterID && !(gBattleMons[0].status2 & STATUS2_TRANSFORMED) && !(gDisableStructs[0].unk18_b & gBitTable[move_pos])) { RemoveBattleMonPPBonus(&gBattleMons[0], move_pos); SetBattleMonMoveSlot(&gBattleMons[0], gMoveToLearn, move_pos); } - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gBattlePartyID[2] == BATTLE_STRUCT->expGetterID && !(gBattleMons[2].status2 & STATUS2_TRANSFORMED) + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gBattlePartyID[2] == gBattleStruct->expGetterID && !(gBattleMons[2].status2 & STATUS2_TRANSFORMED) && !(gDisableStructs[2].unk18_b & gBitTable[move_pos])) { RemoveBattleMonPPBonus(&gBattleMons[2], move_pos); @@ -10892,7 +9982,7 @@ static void atk5A_yesnoboxlearnmove(void) case 5: if (gBattleExecBuffer == 0) { - BATTLE_STRUCT->atk5A_StateTracker = 2; + gBattleStruct->atk5A_StateTracker = 2; } break; } @@ -10900,11 +9990,11 @@ static void atk5A_yesnoboxlearnmove(void) static void atk5B_yesnoboxstoplearningmove(void) { - switch (BATTLE_STRUCT->atk5A_StateTracker) + switch (gBattleStruct->atk5A_StateTracker) { case 0: sub_8023A80(); - BATTLE_STRUCT->atk5A_StateTracker++; + gBattleStruct->atk5A_StateTracker++; gBattleCommunication[1] = 0; sub_802BC6C(); break; @@ -10966,7 +10056,7 @@ static void atk5D_getmoneyreward(void) u32 money_to_give; if (gTrainerBattleOpponent == 0x400) { - money_to_give = 2 * BATTLE_STRUCT->moneyMultiplier * MONEY_UNKNOWN; + money_to_give = 2 * gBattleStruct->moneyMultiplier * MONEY_UNKNOWN; } else { @@ -10994,7 +10084,7 @@ static void atk5D_getmoneyreward(void) } for (; gTrainerMoney[i * 4] != 0xFF && gTrainerMoney[i * 4 + 1] != gTrainers[gTrainerBattleOpponent].trainerClass ; i++) {} - money_to_give = (r5 << 2) * BATTLE_STRUCT->moneyMultiplier; + money_to_give = (r5 << 2) * gBattleStruct->moneyMultiplier; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) money_to_give = 2 * gTrainerMoney[i * 4 + 1] * money_to_give; else @@ -11214,6 +10304,76 @@ _08024190: .4byte gBattlescriptCurrInstr\n\ } #endif //NONMATCHING +/* +static u32 GetTrainerMoneyToGive(u16 trainerId) +{ + u32 i = 0; + u32 lastMonLevel = 0; + u32 moneyReward = 0; + + if (trainerId == SECRET_BASE_OPPONENT) + { + moneyReward = 20 * eSecretBaseRecord->partyLevels[0] * gBattleStruct->moneyMultiplier; + } + else + { + switch (gTrainers[trainerId].partyFlags) + { + case 0: + { + const struct TrainerMonNoItemDefaultMoves *party = gTrainers[trainerId].party.NoItemDefaultMoves; + lastMonLevel = party[gTrainers[trainerId].partySize - 1].lvl; + } + break; + case F_TRAINER_PARTY_CUSTOM_MOVESET: + { + const struct TrainerMonNoItemCustomMoves *party = gTrainers[trainerId].party.NoItemCustomMoves; + lastMonLevel = party[gTrainers[trainerId].partySize - 1].lvl; + } + break; + case F_TRAINER_PARTY_HELD_ITEM: + { + const struct TrainerMonItemDefaultMoves *party = gTrainers[trainerId].party.ItemDefaultMoves; + lastMonLevel = party[gTrainers[trainerId].partySize - 1].lvl; + } + break; + case F_TRAINER_PARTY_CUSTOM_MOVESET | F_TRAINER_PARTY_HELD_ITEM: + { + const struct TrainerMonItemCustomMoves *party = gTrainers[trainerId].party.ItemCustomMoves; + lastMonLevel = party[gTrainers[trainerId].partySize - 1].lvl; + } + break; + } + + for (; gTrainerMoneyTable[i].classId != 0xFF; i++) + { + if (gTrainerMoneyTable[i].classId == gTrainers[trainerId].trainerClass) + break; + } + + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + moneyReward = 4 * lastMonLevel * gBattleStruct->moneyMultiplier * 2 * gTrainerMoneyTable[i].value; + else + moneyReward = 4 * lastMonLevel * gBattleStruct->moneyMultiplier * gTrainerMoneyTable[i].value; + } + + return moneyReward; +} + +static void atk5D_getmoneyreward(void) +{ + u32 moneyReward = GetTrainerMoneyToGive(gTrainerBattleOpponent_A); + if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) + moneyReward += GetTrainerMoneyToGive(gTrainerBattleOpponent_B); + + AddMoney(&gSaveBlock1Ptr->money, moneyReward); + + PREPARE_WORD_NUMBER_BUFFER(gBattleTextBuff1, 5, moneyReward) + + gBattlescriptCurrInstr++; +} +*/ + static void atk5E_8025A70(void) { gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); @@ -11404,7 +10564,7 @@ static void atk68_cancelallactions(void) int i; for (i = 0; i < gNoOfAllBanks; i++) { - gUnknown_02024A76[i] = 0xC; + gActionsByTurnOrder[i] = 0xC; } gBattlescriptCurrInstr++; } @@ -11458,7 +10618,7 @@ void atk6A_removeitem(void) USED_HELD_ITEMS(gActiveBank) = gBattleMons[gActiveBank].item; gBattleMons[gActiveBank].item = 0; - EmitSetAttributes(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBank].item); + EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBank].item); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr += 2; } @@ -11478,7 +10638,7 @@ static void atk6C_drawlvlupbox(void) { u8 r1 = 0; u8 r7 = 0; - switch (BATTLE_STRUCT->atk6C_statetracker) + switch (gBattleStruct->atk6C_statetracker) { case 0: sub_802BBD4(0xB, 0, 0x1D, 0x7, r1); @@ -11721,9 +10881,9 @@ _08024AC4:\n\ str r0, [sp]\n\ adds r0, r4, 0\n\ movs r3, 0xC\n\ - bl InitWindow\n\ + bl Text_InitWindow\n\ adds r0, r4, 0\n\ - bl sub_8002F44\n\ + bl Text_PrintWindow8002F44\n\ ldr r1, _08024AEC @ =gSharedMem\n\ ldr r2, _08024AF0 @ =0x0001609c\n\ adds r1, r2\n\ @@ -11842,9 +11002,9 @@ _08024BC0:\n\ str r0, [sp]\n\ adds r0, r4, 0\n\ movs r3, 0xC\n\ - bl InitWindow\n\ + bl Text_InitWindow\n\ adds r0, r4, 0\n\ - bl sub_8002F44\n\ + bl Text_PrintWindow8002F44\n\ ldr r1, _08024BFC @ =gSharedMem\n\ ldr r0, _08024C00 @ =0x0001609c\n\ adds r1, r0\n\ @@ -11901,13 +11061,13 @@ _08024C48: .4byte gBattlescriptCurrInstr\n\ static void atk6D_resetsentmonsvalue(void) { - sub_80156DC(); + ResetSentPokesToOpponentValue(); gBattlescriptCurrInstr++; } static void atk6E_setatktoplayer0(void) { - gBankAttacker = GetBankByPlayerAI(0); + gBankAttacker = GetBankByIdentity(0); gBattlescriptCurrInstr++; } @@ -11943,7 +11103,7 @@ static void atk71_buffermovetolearn(void) static void atk72_jumpifplayerran(void) { - if (sub_8014AB8(gBank1)) + if (TryRunFromBattle(gBank1)) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else gBattlescriptCurrInstr += 5; @@ -11963,13 +11123,13 @@ static void atk73_hpthresholds(void) result = 1; if (result > 69 || !gBattleMons[opposing_bank].hp) - BATTLE_STRUCT->hpScale = 0; + gBattleStruct->hpScale = 0; else if (result > 39) - BATTLE_STRUCT->hpScale = 1; + gBattleStruct->hpScale = 1; else if (result > 9) - BATTLE_STRUCT->hpScale = 2; + gBattleStruct->hpScale = 2; else - BATTLE_STRUCT->hpScale = 3; + gBattleStruct->hpScale = 3; } gBattlescriptCurrInstr += 2; @@ -11984,17 +11144,17 @@ static void atk74_hpthresholds2(void) { gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); opposing_bank = gActiveBank ^ 1; - hp_switchout = ewram160BCarr(GetBankSide(opposing_bank)); //BATTLE_STRUCT->HP_OnSwitchout[GetBankSide(opposing_bank)]; + hp_switchout = ewram160BCarr(GetBankSide(opposing_bank)); //gBattleStruct->HP_OnSwitchout[GetBankSide(opposing_bank)]; result = (hp_switchout - gBattleMons[opposing_bank].hp) * 100 / hp_switchout; if (gBattleMons[opposing_bank].hp >= hp_switchout) - BATTLE_STRUCT->hpScale = 0; + gBattleStruct->hpScale = 0; else if (result <= 29) - BATTLE_STRUCT->hpScale = 1; + gBattleStruct->hpScale = 1; else if (result <= 69) - BATTLE_STRUCT->hpScale = 2; + gBattleStruct->hpScale = 2; else - BATTLE_STRUCT->hpScale = 3; + gBattleStruct->hpScale = 3; } gBattlescriptCurrInstr += 2; @@ -12003,7 +11163,7 @@ static void atk74_hpthresholds2(void) static void atk75_useitemonopponent(void) { gBankInMenu = gBankAttacker; - sub_803E1B0(&gEnemyParty[gBattlePartyID[gBankAttacker]], gLastUsedItem, gBattlePartyID[gBankAttacker], 0, 1); + PokemonUseItemEffects(&gEnemyParty[gBattlePartyID[gBankAttacker]], gLastUsedItem, gBattlePartyID[gBankAttacker], 0, 1); gBattlescriptCurrInstr += 1; } @@ -12020,8 +11180,8 @@ static void atk76_various(void) u8 side; gBankAttacker = gBankTarget; side = GetBankSide(gBankAttacker) ^ 1; - if (gSideTimer[side].followmeTimer && gBattleMons[gSideTimer[side].followmeTarget].hp) - gBankTarget = gSideTimer[side].followmeTarget; + if (gSideTimers[side].followmeTimer && gBattleMons[gSideTimers[side].followmeTarget].hp) + gBankTarget = gSideTimers[side].followmeTarget; else gBankTarget = gActiveBank; } @@ -12046,9 +11206,9 @@ static void atk76_various(void) { int i; u16* choiced_move; - if (gBattlePartyID[0] == BATTLE_STRUCT->expGetterID) + if (gBattlePartyID[0] == gBattleStruct->expGetterID) goto ACTIVE_0; - if (gBattlePartyID[2] != BATTLE_STRUCT->expGetterID) + if (gBattlePartyID[2] != gBattleStruct->expGetterID) break; if (gBattlePartyID[0] == gBattlePartyID[2]) { @@ -12080,7 +11240,7 @@ static void atk77_setprotectlike(void) //protect and endure if (last_move != MOVE_PROTECT && last_move != MOVE_DETECT && last_move != MOVE_ENDURE) gDisableStructs[gBankAttacker].protectUses = 0; - if (gCurrentMoveTurn == (gNoOfAllBanks - 1)) + if (gCurrentTurnActionNumber == (gNoOfAllBanks - 1)) not_last_turn = 0; if (sProtectSuccessRates[gDisableStructs[gBankAttacker].protectUses] > Random() && not_last_turn) @@ -12149,7 +11309,7 @@ static void atk79_setatkhptozero(void) gActiveBank = gBankAttacker; gBattleMons[gActiveBank].hp = 0; - EmitSetAttributes(0, REQUEST_HP_BATTLE, 0, 2, &gBattleMons[gActiveBank].hp); + EmitSetMonData(0, REQUEST_HP_BATTLE, 0, 2, &gBattleMons[gActiveBank].hp); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr++; @@ -12266,7 +11426,7 @@ static void atk7E_setreflect(void) else { gSideAffecting[GetBankIdentity(gBankAttacker) & 1] |= SIDE_STATUS_REFLECT; - gSideTimer[GetBankIdentity(gBankAttacker) & 1].reflectTimer = 5; + gSideTimers[GetBankIdentity(gBankAttacker) & 1].reflectTimer = 5; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMons(1) == 2) gBattleCommunication[MULTISTRING_CHOOSER] = 2; else @@ -12334,7 +11494,7 @@ static void atk81_trysetrest(void) gBattleCommunication[MULTISTRING_CHOOSER] = 0; gBattleMons[gBankTarget].status1 = 3; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); + EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr += 5; } @@ -12362,7 +11522,7 @@ bool8 UproarWakeUpCheck(u8 bank) { if (!(gBattleMons[i].status2 & STATUS2_UPROAR) || gBattleMons[bank].ability == ABILITY_SOUNDPROOF) //wtf gamefreak, you should check this only once, not every time in a loop... continue; - BATTLE_STRUCT->scriptingActive = i; + gBattleStruct->scriptingActive = i; if (gBankTarget == 0xFF) gBankTarget = i; else if (gBankTarget == i) @@ -12431,7 +11591,7 @@ static void atk86_stockpiletobasedamage(void) gSideAffecting[GetBankIdentity(gBankTarget) & 1], 0, 0, gBankAttacker, gBankTarget) * gDisableStructs[gBankAttacker].stockpileCounter; - BATTLE_STRUCT->animTurn = gDisableStructs[gBankAttacker].stockpileCounter; + gBattleStruct->animTurn = gDisableStructs[gBankAttacker].stockpileCounter; if (gProtectStructs[gBankAttacker].helpingHand) gBattleMoveDamage = gBattleMoveDamage * 15 / 10; @@ -12462,7 +11622,7 @@ static void atk87_stockpiletohpheal(void) if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; - BATTLE_STRUCT->animTurn = gDisableStructs[gBankAttacker].stockpileCounter; + gBattleStruct->animTurn = gDisableStructs[gBankAttacker].stockpileCounter; gDisableStructs[gBankAttacker].stockpileCounter = 0; gBattlescriptCurrInstr += 5; gBankTarget = gBankAttacker; @@ -12471,767 +11631,186 @@ static void atk87_stockpiletohpheal(void) static void atk88_negativedamage(void) { - gBattleMoveDamage = -(gHP_dealt / 2); + gBattleMoveDamage = -(gHpDealt / 2); if (gBattleMoveDamage == 0) gBattleMoveDamage = -1; gBattlescriptCurrInstr++; } -#ifdef NONMATCHING -u8 ChangeStatBuffs(s8 statchanger, u8 stat, u8 flags, u8* bs_ptr) +static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr) { - u8 r9 = 0; - u8 r10 = 0; - u8 index; - if (flags & 0x40) + bool8 certain = FALSE; + bool8 notProtectAffected = FALSE; + u32 index; + + if (flags & MOVE_EFFECT_AFFECTS_USER) gActiveBank = gBankAttacker; else gActiveBank = gBankTarget; - flags &= ~(0x40); - if (flags & 0x80) - r9++; - flags &= ~(0x80); - if (flags & 0x20) - r10++; - flags &= ~(0x20); - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 5; - gBattleTextBuff1[2] = stat; - gBattleTextBuff1[3] = 0xFF; + flags &= ~(MOVE_EFFECT_AFFECTS_USER); + + if (flags & MOVE_EFFECT_CERTAIN) + certain++; + flags &= ~(MOVE_EFFECT_CERTAIN); + + if (flags & STAT_CHANGE_NOT_PROTECT_AFFECTED) + notProtectAffected++; + flags &= ~(STAT_CHANGE_NOT_PROTECT_AFFECTED); + + PREPARE_STAT_BUFFER(gBattleTextBuff1, statId) - if ((statchanger << 0x18) < 0) //stat decrease + if ((statValue << 0x18) < 0) // stat decrease { - if (gSideTimer[GetBankIdentity(gActiveBank) & 1].mistTimer && !r9 && gCurrentMove != MOVE_CURSE) + if (gSideTimers[GET_BANK_SIDE(gActiveBank)].mistTimer + && !certain && gCurrentMove != MOVE_CURSE) { - if (flags == 1) + if (flags == STAT_CHANGE_BS_PTR) { - if (gSpecialStatuses[gActiveBank].statloweringflag) - gBattlescriptCurrInstr = bs_ptr; + if (gSpecialStatuses[gActiveBank].statLowered) + { + gBattlescriptCurrInstr = BS_ptr; + } else { - b_movescr_stack_push(bs_ptr); - BATTLE_STRUCT->scriptingActive = gActiveBank; + BattleScriptPush(BS_ptr); + gBattleStruct->scriptingActive = gActiveBank; gBattlescriptCurrInstr = BattleScript_MistProtected; - gSpecialStatuses[gActiveBank].statloweringflag = 1; + gSpecialStatuses[gActiveBank].statLowered = 1; } } - return 1; + return STAT_CHANGE_DIDNT_WORK; } - else if (gCurrentMove != MOVE_CURSE && r10 != 1 && JumpIfMoveAffectedByProtect(0)) + else if (gCurrentMove != MOVE_CURSE + && notProtectAffected != TRUE && JumpIfMoveAffectedByProtect(0)) { gBattlescriptCurrInstr = BattleScript_ButItFailed; - return 1; + return STAT_CHANGE_DIDNT_WORK; } - else if ((gBattleMons[gActiveBank].ability == ABILITY_CLEAR_BODY || gBattleMons[gActiveBank].ability == ABILITY_WHITE_SMOKE) && !r9 && gCurrentMove != MOVE_CURSE) + else if ((gBattleMons[gActiveBank].ability == ABILITY_CLEAR_BODY + || gBattleMons[gActiveBank].ability == ABILITY_WHITE_SMOKE) + && !certain && gCurrentMove != MOVE_CURSE) { - if (flags == 1) + if (flags == STAT_CHANGE_BS_PTR) { - if (gSpecialStatuses[gActiveBank].statloweringflag) - gBattlescriptCurrInstr = bs_ptr; + if (gSpecialStatuses[gActiveBank].statLowered) + { + gBattlescriptCurrInstr = BS_ptr; + } else { - b_movescr_stack_push(bs_ptr); - BATTLE_STRUCT->scriptingActive = gActiveBank; + BattleScriptPush(BS_ptr); + gBattleStruct->scriptingActive = gActiveBank; gBattlescriptCurrInstr = BattleScript_AbilityNoStatLoss; gLastUsedAbility = gBattleMons[gActiveBank].ability; RecordAbilityBattle(gActiveBank, gLastUsedAbility); - gSpecialStatuses[gActiveBank].statloweringflag = 1; + gSpecialStatuses[gActiveBank].statLowered = 1; } } - return 1; + return STAT_CHANGE_DIDNT_WORK; } - else if (gBattleMons[gActiveBank].ability == ABILITY_KEEN_EYE && !r9 && stat == STAT_STAGE_ACC) + else if (gBattleMons[gActiveBank].ability == ABILITY_KEEN_EYE + && !certain && statId == STAT_STAGE_ACC) { - if (flags == 1) + if (flags == STAT_CHANGE_BS_PTR) { - b_movescr_stack_push(bs_ptr); - BATTLE_STRUCT->scriptingActive = gActiveBank; + BattleScriptPush(BS_ptr); + gBattleStruct->scriptingActive = gActiveBank; gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss; gLastUsedAbility = gBattleMons[gActiveBank].ability; RecordAbilityBattle(gActiveBank, gLastUsedAbility); } - return 1; + return STAT_CHANGE_DIDNT_WORK; } - else if (gBattleMons[gActiveBank].ability == ABILITY_HYPER_CUTTER && !r9 && stat == STAT_STAGE_ATK) + else if (gBattleMons[gActiveBank].ability == ABILITY_HYPER_CUTTER + && !certain && statId == STAT_STAGE_ATK) { - if (flags == 1) + if (flags == STAT_CHANGE_BS_PTR) { - b_movescr_stack_push(bs_ptr); - BATTLE_STRUCT->scriptingActive = gActiveBank; + BattleScriptPush(BS_ptr); + gBattleStruct->scriptingActive = gActiveBank; gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss; gLastUsedAbility = gBattleMons[gActiveBank].ability; RecordAbilityBattle(gActiveBank, gLastUsedAbility); } - return 1; + return STAT_CHANGE_DIDNT_WORK; } else if (gBattleMons[gActiveBank].ability == ABILITY_SHIELD_DUST && flags == 0) - return 1; - else //decrease { - statchanger = -((statchanger >> 4) & (7)); - gBattleTextBuff2[0] = 0xFD; + return STAT_CHANGE_DIDNT_WORK; + } + else // try to decrease + { + statValue = -GET_STAT_BUFF_VALUE(statValue); + gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN; index = 1; - if (statchanger == -2) + if (statValue == -2) { - gBattleTextBuff2[1] = 0; - gBattleTextBuff2[2] = 0xD3; //harshly - gBattleTextBuff2[3] = 0x0; + gBattleTextBuff2[1] = B_BUFF_STRING; + gBattleTextBuff2[2] = STRINGID_STATHARSHLY; + gBattleTextBuff2[3] = STRINGID_STATHARSHLY >> 8; index = 4; } - gBattleTextBuff2[index] = 0; + gBattleTextBuff2[index] = B_BUFF_STRING; index++; - gBattleTextBuff2[index] = 0xD4; //fell + gBattleTextBuff2[index] = STRINGID_STATFELL; index++; - gBattleTextBuff2[index] = 0; + gBattleTextBuff2[index] = STRINGID_STATFELL >> 8; index++; - gBattleTextBuff2[index] = 0xFF; + gBattleTextBuff2[index] = B_BUFF_EOS; - if (gBattleMons[gActiveBank].statStages[stat] == 0) - { + if (gBattleMons[gActiveBank].statStages[statId] == 0) gBattleCommunication[MULTISTRING_CHOOSER] = 2; - } else - { - u8 stringID = 0; - if (gBankTarget == gActiveBank) - stringID = 1; - gBattleCommunication[MULTISTRING_CHOOSER] = stringID; - } + gBattleCommunication[MULTISTRING_CHOOSER] = (gBankTarget == gActiveBank); + } } - else //stat increase + else // stat increase { - statchanger = (statchanger >> 4) & (7); - gBattleTextBuff2[0] = 0xFD; + statValue = GET_STAT_BUFF_VALUE(statValue); + gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN; index = 1; - if (statchanger == 2) + if (statValue == 2) { - gBattleTextBuff2[1] = 0; - gBattleTextBuff2[2] = 0xD1; //sharply - gBattleTextBuff2[3] = 0x0; + gBattleTextBuff2[1] = B_BUFF_STRING; + gBattleTextBuff2[2] = STRINGID_STATSHARPLY; + gBattleTextBuff2[3] = STRINGID_STATSHARPLY >> 8; index = 4; } - gBattleTextBuff2[index] = 0; + gBattleTextBuff2[index] = B_BUFF_STRING; index++; - gBattleTextBuff2[index] = 0xD2; //rose + gBattleTextBuff2[index] = STRINGID_STATROSE; index++; - gBattleTextBuff2[index] = 0; + gBattleTextBuff2[index] = STRINGID_STATROSE >> 8; index++; - gBattleTextBuff2[index] = 0xFF; + gBattleTextBuff2[index] = B_BUFF_EOS; - if (gBattleMons[gActiveBank].statStages[stat] == 0xC) - { + if (gBattleMons[gActiveBank].statStages[statId] == 0xC) gBattleCommunication[MULTISTRING_CHOOSER] = 2; - } else - { - u8 stringID = 0; - if (gBankTarget == gActiveBank) - stringID = 1; - gBattleCommunication[MULTISTRING_CHOOSER] = stringID; - } + gBattleCommunication[MULTISTRING_CHOOSER] = (gBankTarget == gActiveBank); } - gBattleMons[gActiveBank].statStages[stat] += statchanger; - if (gBattleMons[gActiveBank].statStages[stat] < 0) - gBattleMons[gActiveBank].statStages[stat] = 0; - if (gBattleMons[gActiveBank].statStages[stat] > 0xC) - gBattleMons[gActiveBank].statStages[stat] = 0xC; + gBattleMons[gActiveBank].statStages[statId] += statValue; + if (gBattleMons[gActiveBank].statStages[statId] < 0) + gBattleMons[gActiveBank].statStages[statId] = 0; + if (gBattleMons[gActiveBank].statStages[statId] > 0xC) + gBattleMons[gActiveBank].statStages[statId] = 0xC; - if (gBattleCommunication[MULTISTRING_CHOOSER] == 2) - { - if (flags & 1) - gBattleMoveFlags |= MOVESTATUS_MISSED; - if (gBattleCommunication[MULTISTRING_CHOOSER] == 2 && !(flags & 1)) //what the actual fuck gamefreak... - return 1; - } - return 0; -} + if (gBattleCommunication[MULTISTRING_CHOOSER] == 2 && flags & STAT_CHANGE_BS_PTR) + gBattleMoveFlags |= MOVESTATUS_MISSED; -#else -__attribute__((naked)) -u8 ChangeStatBuffs(s8 statchanger, u8 stat, u8 flags, u8* bs_ptr) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - mov r8, r3\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - lsls r1, 24\n\ - lsrs r7, r1, 24\n\ - lsls r2, 24\n\ - lsrs r5, r2, 24\n\ - movs r0, 0\n\ - mov r9, r0\n\ - mov r10, r0\n\ - movs r0, 0x40\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - beq _08025E54\n\ - ldr r0, _08025E4C @ =gActiveBank\n\ - ldr r1, _08025E50 @ =gBankAttacker\n\ - b _08025E58\n\ - .align 2, 0\n\ -_08025E4C: .4byte gActiveBank\n\ -_08025E50: .4byte gBankAttacker\n\ -_08025E54:\n\ - ldr r0, _08025EF8 @ =gActiveBank\n\ - ldr r1, _08025EFC @ =gBankTarget\n\ -_08025E58:\n\ - ldrb r1, [r1]\n\ - strb r1, [r0]\n\ - movs r0, 0xBF\n\ - ands r5, r0\n\ - movs r0, 0x80\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - beq _08025E72\n\ - mov r0, r9\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r9, r0\n\ -_08025E72:\n\ - movs r0, 0x7F\n\ - ands r5, r0\n\ - movs r0, 0x20\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - beq _08025E88\n\ - mov r0, r10\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r10, r0\n\ -_08025E88:\n\ - movs r0, 0xDF\n\ - ands r5, r0\n\ - ldr r1, _08025F00 @ =gBattleTextBuff1\n\ - movs r4, 0\n\ - movs r2, 0xFD\n\ - strb r2, [r1]\n\ - movs r0, 0x5\n\ - strb r0, [r1, 0x1]\n\ - strb r7, [r1, 0x2]\n\ - movs r3, 0x1\n\ - negs r3, r3\n\ - mov r12, r3\n\ - movs r0, 0xFF\n\ - strb r0, [r1, 0x3]\n\ - lsls r0, r6, 24\n\ - cmp r0, 0\n\ - blt _08025EAC\n\ - b _080261B0\n\ -_08025EAC:\n\ - ldr r4, _08025F04 @ =gSideTimer\n\ - ldr r1, _08025EF8 @ =gActiveBank\n\ - ldrb r0, [r1]\n\ - bl GetBankIdentity\n\ - movs r1, 0x1\n\ - ands r1, r0\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldrb r0, [r0, 0x2]\n\ - cmp r0, 0\n\ - beq _08025F54\n\ - mov r2, r9\n\ - cmp r2, 0\n\ - bne _08025F54\n\ - ldr r0, _08025F08 @ =gCurrentMove\n\ - ldrh r0, [r0]\n\ - cmp r0, 0xAE\n\ - beq _08025F84\n\ - cmp r5, 0x1\n\ - bne _08025F74\n\ - ldr r4, _08025F0C @ =gSpecialStatuses\n\ - ldr r3, _08025EF8 @ =gActiveBank\n\ - ldrb r0, [r3]\n\ - lsls r1, r0, 2\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r4\n\ - ldrb r0, [r1]\n\ - lsls r0, 31\n\ - cmp r0, 0\n\ - beq _08025F14\n\ - ldr r0, _08025F10 @ =gBattlescriptCurrInstr\n\ - mov r4, r8\n\ - str r4, [r0]\n\ - b _08025F74\n\ - .align 2, 0\n\ -_08025EF8: .4byte gActiveBank\n\ -_08025EFC: .4byte gBankTarget\n\ -_08025F00: .4byte gBattleTextBuff1\n\ -_08025F04: .4byte gSideTimer\n\ -_08025F08: .4byte gCurrentMove\n\ -_08025F0C: .4byte gSpecialStatuses\n\ -_08025F10: .4byte gBattlescriptCurrInstr\n\ -_08025F14:\n\ - mov r0, r8\n\ - bl b_movescr_stack_push\n\ - ldr r0, _08025F40 @ =gSharedMem\n\ - ldr r6, _08025F44 @ =gActiveBank\n\ - ldrb r1, [r6]\n\ - ldr r2, _08025F48 @ =0x00016003\n\ - adds r0, r2\n\ - strb r1, [r0]\n\ - ldr r1, _08025F4C @ =gBattlescriptCurrInstr\n\ - ldr r0, _08025F50 @ =BattleScript_MistProtected\n\ - str r0, [r1]\n\ - ldrb r1, [r6]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldrb r1, [r0]\n\ - movs r2, 0x1\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ - b _08025F74\n\ - .align 2, 0\n\ -_08025F40: .4byte gSharedMem\n\ -_08025F44: .4byte gActiveBank\n\ -_08025F48: .4byte 0x00016003\n\ -_08025F4C: .4byte gBattlescriptCurrInstr\n\ -_08025F50: .4byte BattleScript_MistProtected\n\ -_08025F54:\n\ - ldr r0, _08025F78 @ =gCurrentMove\n\ - ldrh r0, [r0]\n\ - cmp r0, 0xAE\n\ - beq _08025F84\n\ - mov r3, r10\n\ - cmp r3, 0x1\n\ - beq _08025F84\n\ - movs r0, 0\n\ - bl JumpIfMoveAffectedByProtect\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08025F84\n\ - ldr r1, _08025F7C @ =gBattlescriptCurrInstr\n\ - ldr r0, _08025F80 @ =BattleScript_ButItFailed\n\ - str r0, [r1]\n\ -_08025F74:\n\ - movs r0, 0x1\n\ - b _080262A4\n\ - .align 2, 0\n\ -_08025F78: .4byte gCurrentMove\n\ -_08025F7C: .4byte gBattlescriptCurrInstr\n\ -_08025F80: .4byte BattleScript_ButItFailed\n\ -_08025F84:\n\ - ldr r2, _08025FCC @ =gBattleMons\n\ - ldr r1, _08025FD0 @ =gActiveBank\n\ - ldrb r3, [r1]\n\ - movs r4, 0x58\n\ - adds r0, r3, 0\n\ - muls r0, r4\n\ - adds r0, r2\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - mov r10, r2\n\ - cmp r0, 0x1D\n\ - beq _08025FA0\n\ - cmp r0, 0x49\n\ - bne _08026040\n\ -_08025FA0:\n\ - mov r0, r9\n\ - cmp r0, 0\n\ - bne _08026040\n\ - ldr r0, _08025FD4 @ =gCurrentMove\n\ - ldrh r0, [r0]\n\ - cmp r0, 0xAE\n\ - beq _08026040\n\ - cmp r5, 0x1\n\ - bne _08025F74\n\ - ldr r4, _08025FD8 @ =gSpecialStatuses\n\ - lsls r0, r3, 2\n\ - adds r0, r3\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldrb r0, [r0]\n\ - lsls r0, 31\n\ - cmp r0, 0\n\ - beq _08025FE0\n\ - ldr r0, _08025FDC @ =gBattlescriptCurrInstr\n\ - mov r1, r8\n\ - str r1, [r0]\n\ - b _08025F74\n\ - .align 2, 0\n\ -_08025FCC: .4byte gBattleMons\n\ -_08025FD0: .4byte gActiveBank\n\ -_08025FD4: .4byte gCurrentMove\n\ -_08025FD8: .4byte gSpecialStatuses\n\ -_08025FDC: .4byte gBattlescriptCurrInstr\n\ -_08025FE0:\n\ - mov r0, r8\n\ - bl b_movescr_stack_push\n\ - ldr r0, _08026028 @ =gSharedMem\n\ - ldr r2, _0802602C @ =gActiveBank\n\ - ldrb r1, [r2]\n\ - ldr r3, _08026030 @ =0x00016003\n\ - adds r0, r3\n\ - strb r1, [r0]\n\ - ldr r1, _08026034 @ =gBattlescriptCurrInstr\n\ - ldr r0, _08026038 @ =BattleScript_AbilityNoStatLoss\n\ - str r0, [r1]\n\ - ldr r1, _0802603C @ =gLastUsedAbility\n\ - ldrb r0, [r2]\n\ - movs r6, 0x58\n\ - muls r0, r6\n\ - add r0, r10\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - ldrb r0, [r2]\n\ - ldrb r1, [r1]\n\ - bl RecordAbilityBattle\n\ - ldr r0, _0802602C @ =gActiveBank\n\ - ldrb r1, [r0]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldrb r1, [r0]\n\ - movs r2, 0x1\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ - b _08025F74\n\ - .align 2, 0\n\ -_08026028: .4byte gSharedMem\n\ -_0802602C: .4byte gActiveBank\n\ -_08026030: .4byte 0x00016003\n\ -_08026034: .4byte gBattlescriptCurrInstr\n\ -_08026038: .4byte BattleScript_AbilityNoStatLoss\n\ -_0802603C: .4byte gLastUsedAbility\n\ -_08026040:\n\ - ldr r1, _08026090 @ =gActiveBank\n\ - ldrb r0, [r1]\n\ - movs r4, 0x58\n\ - muls r0, r4\n\ - add r0, r10\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x33\n\ - bne _080260A8\n\ - mov r2, r9\n\ - cmp r2, 0\n\ - bne _080260A8\n\ - cmp r7, 0x6\n\ - bne _080260A8\n\ - cmp r5, 0x1\n\ - bne _08025F74\n\ - mov r0, r8\n\ - bl b_movescr_stack_push\n\ - ldr r0, _08026094 @ =gSharedMem\n\ - ldr r3, _08026090 @ =gActiveBank\n\ - ldrb r1, [r3]\n\ - ldr r6, _08026098 @ =0x00016003\n\ - adds r0, r6\n\ - strb r1, [r0]\n\ - ldr r1, _0802609C @ =gBattlescriptCurrInstr\n\ - ldr r0, _080260A0 @ =BattleScript_AbilityNoSpecificStatLoss\n\ - str r0, [r1]\n\ - ldr r1, _080260A4 @ =gLastUsedAbility\n\ - ldrb r0, [r3]\n\ - muls r0, r4\n\ - add r0, r10\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - ldrb r0, [r3]\n\ - ldrb r1, [r1]\n\ - bl RecordAbilityBattle\n\ - b _08025F74\n\ - .align 2, 0\n\ -_08026090: .4byte gActiveBank\n\ -_08026094: .4byte gSharedMem\n\ -_08026098: .4byte 0x00016003\n\ -_0802609C: .4byte gBattlescriptCurrInstr\n\ -_080260A0: .4byte BattleScript_AbilityNoSpecificStatLoss\n\ -_080260A4: .4byte gLastUsedAbility\n\ -_080260A8:\n\ - ldr r1, _080260FC @ =gActiveBank\n\ - ldrb r0, [r1]\n\ - movs r4, 0x58\n\ - muls r0, r4\n\ - add r0, r10\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x34\n\ - bne _08026114\n\ - mov r2, r9\n\ - cmp r2, 0\n\ - bne _08026114\n\ - cmp r7, 0x1\n\ - bne _08026114\n\ - cmp r5, 0x1\n\ - beq _080260CA\n\ - b _08025F74\n\ -_080260CA:\n\ - mov r0, r8\n\ - bl b_movescr_stack_push\n\ - ldr r0, _08026100 @ =gSharedMem\n\ - ldr r3, _080260FC @ =gActiveBank\n\ - ldrb r1, [r3]\n\ - ldr r6, _08026104 @ =0x00016003\n\ - adds r0, r6\n\ - strb r1, [r0]\n\ - ldr r1, _08026108 @ =gBattlescriptCurrInstr\n\ - ldr r0, _0802610C @ =BattleScript_AbilityNoSpecificStatLoss\n\ - str r0, [r1]\n\ - ldr r1, _08026110 @ =gLastUsedAbility\n\ - ldrb r0, [r3]\n\ - muls r0, r4\n\ - add r0, r10\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - ldrb r0, [r3]\n\ - ldrb r1, [r1]\n\ - bl RecordAbilityBattle\n\ - b _08025F74\n\ - .align 2, 0\n\ -_080260FC: .4byte gActiveBank\n\ -_08026100: .4byte gSharedMem\n\ -_08026104: .4byte 0x00016003\n\ -_08026108: .4byte gBattlescriptCurrInstr\n\ -_0802610C: .4byte BattleScript_AbilityNoSpecificStatLoss\n\ -_08026110: .4byte gLastUsedAbility\n\ -_08026114:\n\ - ldr r0, _080261A0 @ =gActiveBank\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - add r0, r10\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x13\n\ - bne _0802612C\n\ - cmp r5, 0\n\ - bne _0802612C\n\ - b _08025F74\n\ -_0802612C:\n\ - lsls r0, r6, 24\n\ - asrs r0, 28\n\ - movs r1, 0x7\n\ - ands r0, r1\n\ - negs r0, r0\n\ - lsls r0, 24\n\ - ldr r3, _080261A4 @ =gBattleTextBuff2\n\ - movs r4, 0\n\ - movs r1, 0xFD\n\ - strb r1, [r3]\n\ - movs r2, 0x1\n\ - lsrs r6, r0, 24\n\ - asrs r0, 24\n\ - subs r1, 0xFF\n\ - cmp r0, r1\n\ - bne _08026156\n\ - strb r4, [r3, 0x1]\n\ - movs r0, 0xD3\n\ - strb r0, [r3, 0x2]\n\ - strb r4, [r3, 0x3]\n\ - movs r2, 0x4\n\ -_08026156:\n\ - adds r0, r2, r3\n\ - strb r4, [r0]\n\ - adds r2, 0x1\n\ - adds r1, r2, r3\n\ - movs r0, 0xD4\n\ - strb r0, [r1]\n\ - adds r2, 0x1\n\ - adds r0, r2, r3\n\ - strb r4, [r0]\n\ - adds r2, 0x1\n\ - adds r1, r2, r3\n\ - movs r0, 0xFF\n\ - strb r0, [r1]\n\ - ldr r1, _080261A0 @ =gActiveBank\n\ - ldrb r2, [r1]\n\ - movs r0, 0x58\n\ - muls r0, r2\n\ - adds r0, r7, r0\n\ - mov r1, r10\n\ - adds r1, 0x18\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - cmp r0, 0\n\ - beq _08026206\n\ - movs r1, 0\n\ - ldr r0, _080261A8 @ =gBankTarget\n\ - ldrb r0, [r0]\n\ - ldr r3, _080261AC @ =gBattleCommunication\n\ - mov r8, r3\n\ - cmp r0, r2\n\ - bne _0802619A\n\ - movs r1, 0x1\n\ -_0802619A:\n\ - mov r4, r8\n\ - strb r1, [r4, 0x5]\n\ - b _08026234\n\ - .align 2, 0\n\ -_080261A0: .4byte gActiveBank\n\ -_080261A4: .4byte gBattleTextBuff2\n\ -_080261A8: .4byte gBankTarget\n\ -_080261AC: .4byte gBattleCommunication\n\ -_080261B0:\n\ - asrs r6, r0, 28\n\ - movs r0, 0x7\n\ - ands r6, r0\n\ - ldr r3, _08026210 @ =gBattleTextBuff2\n\ - strb r2, [r3]\n\ - movs r2, 0x1\n\ - cmp r6, 0x2\n\ - bne _080261CA\n\ - strb r4, [r3, 0x1]\n\ - movs r0, 0xD1\n\ - strb r0, [r3, 0x2]\n\ - strb r4, [r3, 0x3]\n\ - movs r2, 0x4\n\ -_080261CA:\n\ - adds r0, r2, r3\n\ - strb r4, [r0]\n\ - adds r2, 0x1\n\ - adds r1, r2, r3\n\ - movs r0, 0xD2\n\ - strb r0, [r1]\n\ - adds r2, 0x1\n\ - adds r0, r2, r3\n\ - strb r4, [r0]\n\ - adds r2, 0x1\n\ - adds r1, r2, r3\n\ - ldrb r0, [r1]\n\ - mov r2, r12\n\ - orrs r0, r2\n\ - strb r0, [r1]\n\ - ldr r2, _08026214 @ =gBattleMons\n\ - ldr r4, _08026218 @ =gActiveBank\n\ - ldrb r3, [r4]\n\ - movs r0, 0x58\n\ - muls r0, r3\n\ - adds r0, r7, r0\n\ - adds r1, r2, 0\n\ - adds r1, 0x18\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - mov r10, r2\n\ - cmp r0, 0xC\n\ - bne _08026220\n\ -_08026206:\n\ - ldr r1, _0802621C @ =gBattleCommunication\n\ - movs r0, 0x2\n\ - strb r0, [r1, 0x5]\n\ - mov r8, r1\n\ - b _08026234\n\ - .align 2, 0\n\ -_08026210: .4byte gBattleTextBuff2\n\ -_08026214: .4byte gBattleMons\n\ -_08026218: .4byte gActiveBank\n\ -_0802621C: .4byte gBattleCommunication\n\ -_08026220:\n\ - movs r1, 0\n\ - ldr r0, _080262B4 @ =gBankTarget\n\ - ldrb r0, [r0]\n\ - ldr r2, _080262B8 @ =gBattleCommunication\n\ - mov r8, r2\n\ - cmp r0, r3\n\ - bne _08026230\n\ - movs r1, 0x1\n\ -_08026230:\n\ - mov r3, r8\n\ - strb r1, [r3, 0x5]\n\ -_08026234:\n\ - ldr r2, _080262BC @ =gActiveBank\n\ - ldrb r0, [r2]\n\ - movs r4, 0x58\n\ - adds r1, r0, 0\n\ - muls r1, r4\n\ - adds r1, r7, r1\n\ - mov r3, r10\n\ - adds r3, 0x18\n\ - adds r1, r3\n\ - lsls r0, r6, 24\n\ - asrs r0, 24\n\ - ldrb r6, [r1]\n\ - adds r0, r6\n\ - strb r0, [r1]\n\ - ldrb r0, [r2]\n\ - muls r0, r4\n\ - adds r0, r7, r0\n\ - adds r1, r0, r3\n\ - movs r0, 0\n\ - ldrsb r0, [r1, r0]\n\ - cmp r0, 0\n\ - bge _08026264\n\ - movs r0, 0\n\ - strb r0, [r1]\n\ -_08026264:\n\ - ldr r1, _080262BC @ =gActiveBank\n\ - ldrb r0, [r1]\n\ - muls r0, r4\n\ - adds r0, r7, r0\n\ - adds r1, r0, r3\n\ - movs r0, 0\n\ - ldrsb r0, [r1, r0]\n\ - cmp r0, 0xC\n\ - ble _0802627A\n\ - movs r0, 0xC\n\ - strb r0, [r1]\n\ -_0802627A:\n\ - mov r2, r8\n\ - ldrb r0, [r2, 0x5]\n\ - cmp r0, 0x2\n\ - bne _080262A2\n\ - movs r3, 0x1\n\ - ands r3, r5\n\ - cmp r3, 0\n\ - beq _08026294\n\ - ldr r0, _080262C0 @ =gBattleMoveFlags\n\ - ldrb r1, [r0]\n\ - movs r2, 0x1\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ -_08026294:\n\ - mov r4, r8\n\ - ldrb r0, [r4, 0x5]\n\ - cmp r0, 0x2\n\ - bne _080262A2\n\ - cmp r3, 0\n\ - bne _080262A2\n\ - b _08025F74\n\ -_080262A2:\n\ - movs r0, 0\n\ -_080262A4:\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_080262B4: .4byte gBankTarget\n\ -_080262B8: .4byte gBattleCommunication\n\ -_080262BC: .4byte gActiveBank\n\ -_080262C0: .4byte gBattleMoveFlags\n\ - .syntax divided"); + if (gBattleCommunication[MULTISTRING_CHOOSER] == 2 && !(flags & STAT_CHANGE_BS_PTR)) + return STAT_CHANGE_DIDNT_WORK; + + return STAT_CHANGE_WORKED; } -#endif // NONMATCHING static void atk89_statbuffchange(void) { u8* jump_loc = T1_READ_PTR(gBattlescriptCurrInstr + 2); - if (ChangeStatBuffs(BATTLE_STRUCT->statChanger & 0xF0, BATTLE_STRUCT->statChanger & 0xF, T2_READ_8(gBattlescriptCurrInstr + 1), jump_loc) == 0) + if (ChangeStatBuffs(gBattleStruct->statChanger & 0xF0, gBattleStruct->statChanger & 0xF, T2_READ_8(gBattlescriptCurrInstr + 1), jump_loc) == 0) gBattlescriptCurrInstr += 6; } @@ -13251,7 +11830,7 @@ static void atk8A_normalisebuffs(void) //haze static void atk8B_setbide(void) { gBattleMons[gBankAttacker].status2 |= STATUS2_MULTIPLETURNS; - gLockedMove[gBankAttacker] = gCurrentMove; + gLockedMoves[gBankAttacker] = gCurrentMove; gTakenDmg[gBankAttacker] = 0; gBattleMons[gBankAttacker].status2 |= (STATUS2_BIDE - 0x100); //2 turns gBattlescriptCurrInstr++; @@ -13463,7 +12042,7 @@ static void atk91_givepaydaymoney(void) { if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) && gPaydayMoney) { - AddMoney(&gSaveBlock1.money, gPaydayMoney * BATTLE_STRUCT->moneyMultiplier); + AddMoney(&gSaveBlock1.money, gPaydayMoney * gBattleStruct->moneyMultiplier); gBattleTextBuff1[0] = 0xFD; gBattleTextBuff1[1] = 1; gBattleTextBuff1[2] = 2; @@ -13471,7 +12050,7 @@ static void atk91_givepaydaymoney(void) gBattleTextBuff1[4] = gPaydayMoney; gBattleTextBuff1[5] = uBYTE1_16(gPaydayMoney); gBattleTextBuff1[6] = 0xFF; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_PrintPayDayMoneyString; } else @@ -13488,7 +12067,7 @@ static void atk92_setlightscreen(void) else { gSideAffecting[GetBankIdentity(gBankAttacker) & 1] |= SIDE_STATUS_LIGHTSCREEN; - gSideTimer[GetBankIdentity(gBankAttacker) & 1].lightscreenTimer = 5; + gSideTimers[GetBankIdentity(gBankAttacker) & 1].lightscreenTimer = 5; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMons(1) == 2) gBattleCommunication[MULTISTRING_CHOOSER] = 4; else @@ -14034,7 +12613,7 @@ static void atk98_updatestatusicon(void) } if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) { - gActiveBank = GetBankByPlayerAI(GetBankIdentity(gBankAttacker) ^ 2); + gActiveBank = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ 2); if (!(gAbsentBankFlags & gBitTable[gActiveBank])) { EmitStatusIconUpdate(0, gBattleMons[gActiveBank].status1, gBattleMons[gActiveBank].status2); @@ -14047,14 +12626,14 @@ static void atk98_updatestatusicon(void) static void atk99_setmist(void) { - if (gSideTimer[GetBankIdentity(gBankAttacker) & 1].mistTimer) + if (gSideTimers[GetBankIdentity(gBankAttacker) & 1].mistTimer) { gBattleMoveFlags |= MOVESTATUS_FAILED; gBattleCommunication[MULTISTRING_CHOOSER] = 1; } else { - gSideTimer[GetBankIdentity(gBankAttacker) & 1].mistTimer = 5; + gSideTimers[GetBankIdentity(gBankAttacker) & 1].mistTimer = 5; gSideAffecting[GetBankIdentity(gBankAttacker) & 1] |= SIDE_STATUS_MIST; gBattleCommunication[MULTISTRING_CHOOSER] = 0; } @@ -14149,8 +12728,8 @@ static void atk9C_setsubstitute(void) static bool8 IsMoveUncopyable(u16 move) { int i; - for (i = 0; sUnknown_081FACFE[i] != 0xFFFE && sUnknown_081FACFE[i] != move; i++) {} - return (sUnknown_081FACFE[i] != 0xFFFE); + for (i = 0; sMovesForbiddenToCopy[i] != 0xFFFE && sMovesForbiddenToCopy[i] != move; i++) {} + return (sMovesForbiddenToCopy[i] != 0xFFFE); } static void atk9D_mimicattackcopy(void) @@ -14191,16 +12770,203 @@ static void atk9D_mimicattackcopy(void) } } +#if DEBUG +__attribute__((naked)) +static void atk9E_metronome(void) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + ldr r6, ._3076 @ gBankAttacker\n\ + ldrb r2, [r6]\n\ + lsl r1, r2, #0x1\n\ + ldr r0, ._3076 + 4 @ \n\ + add r3, r1, r0\n\ + ldr r5, ._3076 + 8 @ \n\ + mov r4, #0x58\n\ + add r0, r2, #0\n\ + mul r0, r0, r4\n\ + add r1, r0, r5\n\ + ldrh r0, [r1, #0xe]\n\ + cmp r0, #0\n\ + bne ._3071 @cond_branch\n\ + ldrh r2, [r1, #0x10]\n\ + cmp r2, #0\n\ + beq ._3071 @cond_branch\n\ + ldrh r0, [r1, #0x12]\n\ + cmp r0, #0\n\ + beq ._3071 @cond_branch\n\ + ldrh r0, [r3]\n\ + cmp r0, #0\n\ + bne ._3072 @cond_branch\n\ + strh r2, [r3]\n\ +._3072:\n\ + ldr r1, ._3076 + 12 @ \n\ + ldrh r0, [r3]\n\ + strh r0, [r1]\n\ + ldrb r0, [r6]\n\ + mul r0, r0, r4\n\ + add r0, r0, r5\n\ + ldrh r5, [r0, #0x10]\n\ + ldrh r2, [r0, #0x12]\n\ + add r7, r1, #0\n\ + cmp r5, r2\n\ + bcs ._3073 @cond_branch\n\ + ldrh r0, [r3]\n\ + cmp r0, r2\n\ + beq ._3074 @cond_branch\n\ + add r0, r0, #0x1\n\ + b ._3079\n\ +._3077:\n\ + .align 2, 0\n\ +._3076:\n\ + .word gBankAttacker\n\ + .word +0x20160b4\n\ + .word gBattleMons\n\ + .word gCurrentMove\n\ +._3073:\n\ + ldrh r4, [r3]\n\ + add r1, r4, #0\n\ + mov r0, #0xb1\n\ + lsl r0, r0, #0x1\n\ + cmp r1, r0\n\ + bne ._3078 @cond_branch\n\ + mov r0, #0x1\n\ + b ._3079\n\ +._3078:\n\ + cmp r1, r2\n\ + bne ._3080 @cond_branch\n\ +._3074:\n\ + strh r5, [r3]\n\ + b ._3081\n\ +._3080:\n\ + add r0, r4, #1\n\ +._3079:\n\ + strh r0, [r3]\n\ +._3081:\n\ + ldr r4, ._3083 @ gHitMarker\n\ + ldr r2, [r4]\n\ + ldr r0, ._3083 + 4 @ 0xfffffbff\n\ + and r2, r2, r0\n\ + str r2, [r4]\n\ + ldr r6, ._3083 + 8 @ gBattlescriptCurrInstr\n\ + ldr r5, ._3083 + 12 @ gBattleScriptsForMoveEffects\n\ + ldr r3, ._3083 + 16 @ gBattleMoves\n\ + ldrh r1, [r7]\n\ + lsl r0, r1, #0x1\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r3\n\ + ldrb r0, [r0]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r5\n\ + ldr r0, [r0]\n\ + str r0, [r6]\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x4\n\ + orr r2, r2, r0\n\ + str r2, [r4]\n\ + ldrh r0, [r7]\n\ + b ._3082\n\ +._3084:\n\ + .align 2, 0\n\ +._3083:\n\ + .word gHitMarker\n\ + .word 0xfffffbff\n\ + .word gBattlescriptCurrInstr\n\ + .word gBattleScriptsForMoveEffects\n\ + .word gBattleMoves\n\ +._3071:\n\ + ldr r7, ._3090 @ gCurrentMove\n\ + mov r6, #0xb1\n\ + lsl r6, r6, #0x1\n\ + ldr r5, ._3090 + 4 @ sMovesForbiddenToCopy\n\ + ldr r0, ._3090 + 8 @ gBattlescriptCurrInstr\n\ + mov r8, r0\n\ +._3089:\n\ + bl Random\n\ + ldr r2, ._3090 + 12 @ 0x1ff\n\ + add r1, r2, #0\n\ + and r0, r0, r1\n\ + add r0, r0, #0x1\n\ + strh r0, [r7]\n\ + cmp r0, r6\n\ + bhi ._3089 @cond_branch\n\ + mov r0, #0x3\n\ +._3086:\n\ + sub r0, r0, #0x1\n\ + cmp r0, #0\n\ + bge ._3086 @cond_branch\n\ + ldr r4, ._3090 @ gCurrentMove\n\ + ldrh r2, [r4]\n\ + ldr r3, ._3090 + 16 @ 0xffff\n\ + sub r0, r5, #2\n\ +._3088:\n\ + add r0, r0, #0x2\n\ + ldrh r1, [r0]\n\ + cmp r1, r2\n\ + beq ._3087 @cond_branch\n\ + cmp r1, r3\n\ + bne ._3088 @cond_branch\n\ +._3087:\n\ + ldr r0, ._3090 + 16 @ 0xffff\n\ + cmp r1, r0\n\ + bne ._3089 @cond_branch\n\ + ldr r2, ._3090 + 20 @ gHitMarker\n\ + ldr r0, [r2]\n\ + ldr r1, ._3090 + 24 @ 0xfffffbff\n\ + and r0, r0, r1\n\ + str r0, [r2]\n\ + ldr r3, ._3090 + 28 @ gBattleScriptsForMoveEffects\n\ + ldr r2, ._3090 + 32 @ gBattleMoves\n\ + ldrh r1, [r4]\n\ + lsl r0, r1, #0x1\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r2\n\ + ldrb r0, [r0]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r3\n\ + ldr r0, [r0]\n\ + mov r1, r8\n\ + str r0, [r1]\n\ + ldrh r0, [r4]\n\ +._3082:\n\ + mov r1, #0x0\n\ + bl GetMoveTarget\n\ + ldr r1, ._3090 + 36 @ gBankTarget\n\ + strb r0, [r1]\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._3091:\n\ + .align 2, 0\n\ +._3090:\n\ + .word gCurrentMove\n\ + .word sMovesForbiddenToCopy\n\ + .word gBattlescriptCurrInstr\n\ + .word 0x1ff\n\ + .word 0xffff\n\ + .word gHitMarker\n\ + .word 0xfffffbff\n\ + .word gBattleScriptsForMoveEffects\n\ + .word gBattleMoves\n\ + .word gBankTarget"); +} +#else #ifdef NONMATCHING static void atk9E_metronome(void) { - // sUnknown_081FACFE + // sMovesForbiddenToCopy int i; do { while ((gCurrentMove = (Random() & 0x1FF) + 1) > 0x162); - for (i = 0; sUnknown_081FACFE[i] != gCurrentMove && sUnknown_081FACFE[i] != 0xFFFF; i++); - } while (sUnknown_081FACFE[i] != 0xFFFF); + for (i = 0; sMovesForbiddenToCopy[i] != gCurrentMove && sMovesForbiddenToCopy[i] != 0xFFFF; i++); + } while (sMovesForbiddenToCopy[i] != 0xFFFF); gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; @@ -14218,7 +12984,7 @@ static void atk9E_metronome(void) ldr r7, _08027938 @ =gCurrentMove\n\ movs r6, 0xB1\n\ lsls r6, 1\n\ - ldr r5, _0802793C @ =sUnknown_081FACFE\n\ + ldr r5, _0802793C @ =sMovesForbiddenToCopy\n\ ldr r0, _08027940 @ =gBattlescriptCurrInstr\n\ mov r8, r0\n\ _080278CA:\n\ @@ -14280,7 +13046,7 @@ _080278F8:\n\ bx r0\n\ .align 2, 0\n\ _08027938: .4byte gCurrentMove\n\ -_0802793C: .4byte sUnknown_081FACFE\n\ +_0802793C: .4byte sMovesForbiddenToCopy\n\ _08027940: .4byte gBattlescriptCurrInstr\n\ _08027944: .4byte 0x000001ff\n\ _08027948: .4byte 0x0000ffff\n\ @@ -14292,6 +13058,7 @@ _0802795C: .4byte gBankTarget\n\ .syntax divided"); } #endif // NONMATCHING +#endif static void atk9F_dmgtolevel(void) { @@ -14315,8 +13082,8 @@ static void atkA1_counterdamagecalculator(void) if (gProtectStructs[gBankAttacker].physicalDmg && atk_side != def_side && gBattleMons[gProtectStructs[gBankAttacker].physicalBank].hp) { gBattleMoveDamage = gProtectStructs[gBankAttacker].physicalDmg * 2; - if (gSideTimer[def_side].followmeTimer && gBattleMons[gSideTimer[def_side].followmeTarget].hp) - gBankTarget = gSideTimer[def_side].followmeTarget; + if (gSideTimers[def_side].followmeTimer && gBattleMons[gSideTimers[def_side].followmeTarget].hp) + gBankTarget = gSideTimers[def_side].followmeTarget; else gBankTarget = gProtectStructs[gBankAttacker].physicalBank; gBattlescriptCurrInstr += 5; @@ -14335,8 +13102,8 @@ static void atkA2_mirrorcoatdamagecalculator(void) //a copy of atkA1 with the ph if (gProtectStructs[gBankAttacker].specialDmg && atk_side != def_side && gBattleMons[gProtectStructs[gBankAttacker].specialBank].hp) { gBattleMoveDamage = gProtectStructs[gBankAttacker].specialDmg * 2; - if (gSideTimer[def_side].followmeTimer && gBattleMons[gSideTimer[def_side].followmeTarget].hp) - gBankTarget = gSideTimer[def_side].followmeTarget; + if (gSideTimers[def_side].followmeTimer && gBattleMons[gSideTimers[def_side].followmeTarget].hp) + gBankTarget = gSideTimers[def_side].followmeTarget; else gBankTarget = gProtectStructs[gBankAttacker].specialBank; gBattlescriptCurrInstr += 5; @@ -14405,10 +13172,10 @@ static void atkA5_painsplitdmgcalc(void) { s32 hp_diff = (gBattleMons[gBankAttacker].hp + gBattleMons[gBankTarget].hp) / 2; s32 to_store = gBattleMoveDamage = gBattleMons[gBankTarget].hp - hp_diff; - BATTLE_STRUCT->unk16014 = sBYTE0_32(to_store); - BATTLE_STRUCT->unk16015 = sBYTE1_32(to_store); - BATTLE_STRUCT->unk16016 = sBYTE2_32(to_store); - BATTLE_STRUCT->unk16017 = sBYTE3_32(to_store); + gBattleStruct->unk16014 = sBYTE0_32(to_store); + gBattleStruct->unk16015 = sBYTE1_32(to_store); + gBattleStruct->unk16016 = sBYTE2_32(to_store); + gBattleStruct->unk16017 = sBYTE3_32(to_store); gBattleMoveDamage = gBattleMons[gBankAttacker].hp - hp_diff; gSpecialStatuses[gBankTarget].moveturnLostHP = 0xFFFF; @@ -14422,7 +13189,7 @@ static void atkA5_painsplitdmgcalc(void) #ifdef NONMATCHING static void atkA6_settypetorandomresistance(void) { - if (gMoveHitWith[gBankAttacker] == 0 || gMoveHitWith[gBankAttacker] == 0xFFFF || (IsTwoTurnsMove(gMoveHitWith[gBankAttacker]) && !gProtectStructs[gBankAttacker].physicalDmg && !gProtectStructs[gBankAttacker].specialDmg)) + if (gLastLandedMoves[gBankAttacker] == 0 || gLastLandedMoves[gBankAttacker] == 0xFFFF || (IsTwoTurnsMove(gLastLandedMoves[gBankAttacker]) && !gProtectStructs[gBankAttacker].physicalDmg && !gProtectStructs[gBankAttacker].specialDmg)) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else { @@ -14431,7 +13198,7 @@ static void atkA6_settypetorandomresistance(void) { while (((type = (Random() & 0x7F)) > 0x70)); type *= 3; - if (gTypeEffectiveness[type] == gUnknown_02024C44[gBankAttacker] && gTypeEffectiveness[type + 2] <= 5 && gBattleMons[gBankAttacker].type1 != gTypeEffectiveness[type + 1] && gBattleMons[gBankAttacker].type2 != gTypeEffectiveness[type + 1]) + if (gTypeEffectiveness[type] == gLastHitByType[gBankAttacker] && gTypeEffectiveness[type + 2] <= 5 && gBattleMons[gBankAttacker].type1 != gTypeEffectiveness[type + 1] && gBattleMons[gBankAttacker].type2 != gTypeEffectiveness[type + 1]) { gBattleMons[gBankAttacker].type1 = type; gBattleMons[gBankAttacker].type2 = type; @@ -14450,7 +13217,7 @@ static void atkA6_settypetorandomresistance(void) { if (gTypeEffectiveness[type] == 0xFE || gTypeEffectiveness[type] != 0xFF) { - if (gTypeEffectiveness[type] == gUnknown_02024C44[gBankAttacker] && gTypeEffectiveness[type + 2] <= 5 && gBattleMons[gBankAttacker].type1 != gTypeEffectiveness[type + 1] && gBattleMons[gBankAttacker].type2 != gTypeEffectiveness[type + 1]) + if (gTypeEffectiveness[type] == gLastHitByType[gBankAttacker] && gTypeEffectiveness[type + 2] <= 5 && gBattleMons[gBankAttacker].type1 != gTypeEffectiveness[type + 1] && gBattleMons[gBankAttacker].type2 != gTypeEffectiveness[type + 1]) { gBattleMons[gBankAttacker].type1 = gTypeEffectiveness[rands + 1]; gBattleMons[gBankAttacker].type2 = gTypeEffectiveness[rands + 1]; @@ -14479,7 +13246,7 @@ static void atkA6_settypetorandomresistance(void) mov r6, r9\n\ mov r5, r8\n\ push {r5-r7}\n\ - ldr r1, _08027FA8 @ =gMoveHitWith\n\ + ldr r1, _08027FA8 @ =gLastLandedMoves\n\ ldr r4, _08027FAC @ =gBankAttacker\n\ ldrb r0, [r4]\n\ lsls r0, 1\n\ @@ -14525,7 +13292,7 @@ _08027F8C:\n\ str r1, [r3]\n\ b _08028110\n\ .align 2, 0\n\ -_08027FA8: .4byte gMoveHitWith\n\ +_08027FA8: .4byte gLastLandedMoves\n\ _08027FAC: .4byte gBankAttacker\n\ _08027FB0: .4byte 0x0000ffff\n\ _08027FB4: .4byte gProtectStructs\n\ @@ -14597,7 +13364,7 @@ _0802802C:\n\ adds r4, r0, r4\n\ ldr r6, _08028120 @ =gTypeEffectiveness\n\ adds r3, r4, r6\n\ - ldr r1, _08028124 @ =gUnknown_02024C44\n\ + ldr r1, _08028124 @ =gLastHitByType\n\ ldr r2, _08028128 @ =gBankAttacker\n\ ldrb r5, [r2]\n\ lsls r0, r5, 1\n\ @@ -14658,7 +13425,7 @@ _080280AE:\n\ mov r4, r10\n\ ldrb r2, [r4]\n\ lsls r0, r2, 1\n\ - ldr r7, _08028124 @ =gUnknown_02024C44\n\ + ldr r7, _08028124 @ =gLastHitByType\n\ adds r0, r7\n\ ldrh r0, [r0]\n\ cmp r1, r0\n\ @@ -14715,7 +13482,7 @@ _08028110:\n\ bx r0\n\ .align 2, 0\n\ _08028120: .4byte gTypeEffectiveness\n\ -_08028124: .4byte gUnknown_02024C44\n\ +_08028124: .4byte gLastHitByType\n\ _08028128: .4byte gBankAttacker\n\ _0802812C: .4byte gBattleMons\n\ _08028130: .4byte 0x000003e7\n\ @@ -14767,7 +13534,7 @@ static void atkA8_copymovepermanently(void) moves_data.pp[i] = gBattleMons[gBankAttacker].pp[i]; } moves_data.ppBonuses = gBattleMons[gBankAttacker].ppBonuses; - EmitSetAttributes(0, REQUEST_MOVES_PP_BATTLE, 0, sizeof(struct move_pp), &moves_data); + EmitSetMonData(0, REQUEST_MOVES_PP_BATTLE, 0, sizeof(struct move_pp), &moves_data); MarkBufferBankForExecution(gActiveBank); gBattleTextBuff1[0] = 0xFD; gBattleTextBuff1[1] = 2; @@ -14849,7 +13616,7 @@ static void atkAA_setdestinybond(void) gBattlescriptCurrInstr++; } -static void DestinyBondFlagUpdate(void) +static void TrySetDestinyBondToHappen(void) { u8 atk_side = GetBankSide(gBankAttacker); u8 def_side = GetBankSide(gBankTarget); @@ -14859,7 +13626,7 @@ static void DestinyBondFlagUpdate(void) static void atkAB_trysetdestinybondtohappen(void) { - DestinyBondFlagUpdate(); + TrySetDestinyBondToHappen(); gBattlescriptCurrInstr++; } @@ -14869,10 +13636,10 @@ static void atkAC_remaininghptopower(void) int i; for (i = 0; i < 12; i += 2) { - if (hp_fraction <= sUnknown_081FAD26[i]) + if (hp_fraction <= sFlailHpScaleToPowerTable[i]) break; } - gDynamicBasePower = sUnknown_081FAD26[i + 1]; + gDynamicBasePower = sFlailHpScaleToPowerTable[i + 1]; gBattlescriptCurrInstr++; } @@ -14910,7 +13677,7 @@ static void atkAD_tryspiteppreduce(void) if (!(gDisableStructs[gActiveBank].unk18_b & gBitTable[i]) && !(gBattleMons[gActiveBank].status2 & STATUS2_TRANSFORMED)) { - EmitSetAttributes(0, REQUEST_PPMOVE1_BATTLE + i, 0, 1, &gBattleMons[gActiveBank].pp[i]); + EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + i, 0, 1, &gBattleMons[gActiveBank].pp[i]); MarkBufferBankForExecution(gActiveBank); } gBattlescriptCurrInstr += 5; @@ -14948,7 +13715,7 @@ static void atkAE_healpartystatus(void) gBattleCommunication[MULTISTRING_CHOOSER] |= 1; } - gActiveBank = BATTLE_STRUCT->scriptingActive = GetBankByPlayerAI(GetBankIdentity(gBankAttacker) ^ 2); + gActiveBank = gBattleStruct->scriptingActive = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ 2); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBankFlags & gBitTable[gActiveBank])) { if (gBattleMons[gActiveBank].ability != ABILITY_SOUNDPROOF) @@ -14986,14 +13753,14 @@ static void atkAE_healpartystatus(void) to_heal = 0x3F; gBattleMons[gBankAttacker].status1 = zero2; - gActiveBank = GetBankByPlayerAI(GetBankIdentity(gBankAttacker) ^ 2); + gActiveBank = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ 2); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBankFlags & gBitTable[gActiveBank])) gBattleMons[gActiveBank].status1 = 0; } //missing check? gActiveBank = gBankAttacker; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, to_heal, 4, &zero); + EmitSetMonData(0, REQUEST_STATUS_BATTLE, to_heal, 4, &zero); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr++; @@ -15018,7 +13785,7 @@ static void atkAF_cursetarget(void) static void atkB0_trysetspikes(void) { u8 side = GetBankSide(gBankAttacker) ^ 1; - if (gSideTimer[side].spikesAmount == 3) + if (gSideTimers[side].spikesAmount == 3) { gSpecialStatuses[gBankAttacker].flag20 = 1; gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); @@ -15026,7 +13793,7 @@ static void atkB0_trysetspikes(void) else { gSideAffecting[side] |= SIDE_STATUS_SPIKES; - gSideTimer[side].spikesAmount++; + gSideTimers[side].spikesAmount++; gBattlescriptCurrInstr += 5; } } @@ -15053,7 +13820,7 @@ static void atkB2_trysetperishsong(void) } } - sub_80153D0(gBankAttacker); + PressurePPLoseOnUsingPerishSong(gBankAttacker); if (not_affected_pokes == gNoOfAllBanks) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else @@ -15075,7 +13842,7 @@ static void atkB3_rolloutdamagecalculation(void) gDisableStructs[gBankAttacker].rolloutTimer1 = 5; gDisableStructs[gBankAttacker].rolloutTimer2 = 5; gBattleMons[gBankAttacker].status2 |= STATUS2_MULTIPLETURNS; - gLockedMove[gBankAttacker] = gCurrentMove; + gLockedMoves[gBankAttacker] = gCurrentMove; } if (--gDisableStructs[gBankAttacker].rolloutTimer1 == 0) gBattleMons[gBankAttacker].status2 &= ~(STATUS2_MULTIPLETURNS); @@ -15167,7 +13934,7 @@ static void atkB8_setsafeguard(void) else { gSideAffecting[GetBankIdentity(gBankAttacker) & 1] |= SIDE_STATUS_SAFEGUARD; - gSideTimer[GetBankIdentity(gBankAttacker) & 1].safeguardTimer = 5; + gSideTimers[GetBankIdentity(gBankAttacker) & 1].safeguardTimer = 5; gBattleCommunication[MULTISTRING_CHOOSER] = 5; } gBattlescriptCurrInstr++; @@ -15234,16 +14001,16 @@ static void atkBA_jumpifnopursuitswitchdmg(void) if (gMultiHitCounter == 1) { if (GetBankSide(gBankAttacker) == 0) - gBankTarget = GetBankByPlayerAI(1); + gBankTarget = GetBankByIdentity(1); else - gBankTarget = GetBankByPlayerAI(0); + gBankTarget = GetBankByIdentity(0); } else { if (GetBankSide(gBankAttacker) == 0) - gBankTarget = GetBankByPlayerAI(3); + gBankTarget = GetBankByIdentity(3); else - gBankTarget = GetBankByPlayerAI(2); + gBankTarget = GetBankByIdentity(2); } if (gActionForBanks[gBankTarget] == 0 && gBankAttacker == ewram16010arr(gBankTarget) && !(gBattleMons[gBankTarget].status1 & (STATUS_SLEEP | STATUS_FREEZE)) @@ -15252,12 +14019,12 @@ static void atkBA_jumpifnopursuitswitchdmg(void) int i; for (i = 0; i < gNoOfAllBanks; i++) { - if (gTurnOrder[i] == gBankTarget) - gUnknown_02024A76[i] = 11; + if (gBanksByTurnOrder[i] == gBankTarget) + gActionsByTurnOrder[i] = 11; } gCurrentMove = MOVE_PURSUIT; gBattlescriptCurrInstr += 5; - BATTLE_STRUCT->animTurn = 1; + gBattleStruct->animTurn = 1; gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); } else @@ -15321,21 +14088,21 @@ static void atkBE_rapidspinfree(void) //rapid spin gBattleTextBuff1[2] = ewram16004arr(0, gBankAttacker); gBattleTextBuff1[3] = ewram16004arr(1, gBankAttacker); gBattleTextBuff1[4] = 0xFF; - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_WrapFree; } else if (gStatuses3[gBankAttacker] & STATUS3_LEECHSEED) { gStatuses3[gBankAttacker] &= ~(STATUS3_LEECHSEED); gStatuses3[gBankAttacker] &= ~(STATUS3_LEECHSEED_BANK); - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_LeechSeedFree; } else if (gSideAffecting[GetBankSide(gBankAttacker)] & SIDE_STATUS_SPIKES) { gSideAffecting[GetBankSide(gBankAttacker)] &= ~(SIDE_STATUS_SPIKES); - gSideTimer[GetBankSide(gBankAttacker)].spikesAmount = 0; - b_movescr_stack_push_cursor(); + gSideTimers[GetBankSide(gBankAttacker)].spikesAmount = 0; + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SpikesFree; } else @@ -15935,8 +14702,8 @@ static void atkC9_jumpifattackandspecialattackcannotfall(void) //memento static void atkCA_setforcedtarget(void) //follow me { - gSideTimer[GetBankSide(gBankAttacker)].followmeTimer = 1; - gSideTimer[GetBankSide(gBankAttacker)].followmeTarget = gBankAttacker; + gSideTimers[GetBankSide(gBankAttacker)].followmeTimer = 1; + gSideTimers[GetBankSide(gBankAttacker)].followmeTarget = gBankAttacker; gBattlescriptCurrInstr++; } @@ -15953,7 +14720,7 @@ static void atkCC_callterrainattack(void) //nature power gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); gCurrentMove = sNaturePowerMoves[gBattleTerrain]; gBankTarget = GetMoveTarget(gCurrentMove, 0); - b_movescr_stack_push(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]); + BattleScriptPush(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]); gBattlescriptCurrInstr++; } @@ -15964,7 +14731,7 @@ static void atkCD_cureifburnedparalysedorpoisoned(void) //refresh gBattleMons[gBankAttacker].status1 = 0; gBattlescriptCurrInstr += 5; gActiveBank = gBankAttacker; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); + EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); MarkBufferBankForExecution(gActiveBank); } else @@ -16004,7 +14771,7 @@ static void atkD0_settaunt(void) static void atkD1_trysethelpinghand(void) { - gBankTarget = GetBankByPlayerAI(GetBankIdentity(gBankAttacker) ^ 2); + gBankTarget = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ 2); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBankFlags & gBitTable[gBankTarget]) && !gProtectStructs[gBankAttacker].helpingHand && !gProtectStructs[gBankTarget].helpingHand) { @@ -16223,7 +14990,7 @@ _0802A36C:\n\ movs r1, 0x2\n\ movs r2, 0\n\ movs r3, 0x2\n\ - bl EmitSetAttributes\n\ + bl EmitSetMonData\n\ ldr r2, _0802A45C @ =gBankAttacker\n\ ldrb r0, [r2]\n\ bl MarkBufferBankForExecution\n\ @@ -16241,7 +15008,7 @@ _0802A36C:\n\ movs r1, 0x2\n\ movs r2, 0\n\ movs r3, 0x2\n\ - bl EmitSetAttributes\n\ + bl EmitSetMonData\n\ ldrb r0, [r7]\n\ bl MarkBufferBankForExecution\n\ ldr r0, _0802A464 @ =0xfffe9f10\n\ @@ -16407,7 +15174,7 @@ static void atkD6_doubledamagedealtifdamaged(void) { if ((gProtectStructs[gBankAttacker].physicalDmg && gProtectStructs[gBankAttacker].physicalBank == gBankTarget) || (gProtectStructs[gBankAttacker].specialDmg && gProtectStructs[gBankAttacker].specialBank == gBankTarget)) - BATTLE_STRUCT->dmgMultiplier = 2; + gBattleStruct->dmgMultiplier = 2; gBattlescriptCurrInstr++; } @@ -16472,7 +15239,7 @@ static void atkDB_tryimprision(void) else { u8 bank; - sub_801529C(gBankAttacker); + PressurePPLoseOnUsingImprision(gBankAttacker); for (bank = 0; bank < gNoOfAllBanks; bank++) { if (r8 != GetBankSide(bank)) @@ -16516,13 +15283,13 @@ static void atkDC_trysetgrudge(void) static void atkDD_weightdamagecalculation(void) { int i; - for (i = 0; sWeightDamage[i] != 0xFFFF; i += 2) + for (i = 0; sWeightToDamageTable[i] != 0xFFFF; i += 2) { - if (sWeightDamage[i] > GetPokedexHeightWeight(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 1)) + if (sWeightToDamageTable[i] > GetPokedexHeightWeight(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 1)) break; } - if (sWeightDamage[i] != 0xFFFF) - gDynamicBasePower = sWeightDamage[i + 1]; + if (sWeightToDamageTable[i] != 0xFFFF) + gDynamicBasePower = sWeightToDamageTable[i + 1]; else gDynamicBasePower = 120; gBattlescriptCurrInstr++; @@ -16546,17 +15313,17 @@ static void atkDE_asistattackselect(void) break; if (!GetMonData(&party[i], MON_DATA_SPECIES2) || GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG) break; - chooseable_moves = &BATTLE_STRUCT->assistMove[chooseable_moves_no]; + chooseable_moves = &gBattleStruct->assistMove[chooseable_moves_no]; for (j = 0; j < 4; j++) { int k; u16 move = GetMonData(&party[i], MON_DATA_MOVE1 + i); if (IsMoveUnchoosable(move)) break; - //sUnknown_081FACFE[k] + //sMovesForbiddenToCopy[k] for (k = 0; ;k++) { - if (sUnknown_081FACFE[k] == 0xFFFF) + if (sMovesForbiddenToCopy[k] == 0xFFFF) { if (move) { @@ -16566,7 +15333,7 @@ static void atkDE_asistattackselect(void) } break; } - if (sUnknown_081FACFE[k] == move) + if (sMovesForbiddenToCopy[k] == move) break; } } @@ -16574,7 +15341,7 @@ static void atkDE_asistattackselect(void) if (chooseable_moves_no) { gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - gRandomMove = BATTLE_STRUCT->assistMove[Random() % chooseable_moves_no]; + gRandomMove = gBattleStruct->assistMove[Random() % chooseable_moves_no]; gBankTarget = GetMoveTarget(gRandomMove, 0); gBattlescriptCurrInstr += 5; } @@ -16659,7 +15426,7 @@ _0802AAF8:\n\ adds r1, r5, 0x1\n\ cmp r0, 0\n\ bne _0802AB4E\n\ - ldr r0, _0802ABB4 @ =sUnknown_081FACFE\n\ + ldr r0, _0802ABB4 @ =sMovesForbiddenToCopy\n\ ldrh r2, [r0]\n\ adds r3, r0, 0\n\ cmp r2, r8\n\ @@ -16734,7 +15501,7 @@ _0802ABA4: .4byte gEnemyParty\n\ _0802ABA8: .4byte gBattlePartyID\n\ _0802ABAC: .4byte 0x0000ffff\n\ _0802ABB0: .4byte gSharedMem + 0x16024\n\ -_0802ABB4: .4byte sUnknown_081FACFE\n\ +_0802ABB4: .4byte sMovesForbiddenToCopy\n\ _0802ABB8: .4byte gHitMarker\n\ _0802ABBC: .4byte 0xfffffbff\n\ _0802ABC0: .4byte gRandomMove\n\ @@ -16774,7 +15541,7 @@ static void atkDF_trysetmagiccoat(void) { gBankTarget = gBankAttacker; gSpecialStatuses[gBankAttacker].flag20 = 1; - if (gCurrentMoveTurn == gNoOfAllBanks - 1) //last turn + if (gCurrentTurnActionNumber == gNoOfAllBanks - 1) //last turn gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else { @@ -16786,7 +15553,7 @@ static void atkDF_trysetmagiccoat(void) static void atkE0_trysetsnatch(void) { gSpecialStatuses[gBankAttacker].flag20 = 1; - if (gCurrentMoveTurn == gNoOfAllBanks - 1) //last turn + if (gCurrentTurnActionNumber == gNoOfAllBanks - 1) //last turn gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else { @@ -16799,11 +15566,11 @@ static void atkE1_trygetintimidatetarget(void) { u8 side; - BATTLE_STRUCT->scriptingActive = ewram160DD; - side = GetBankSide(BATTLE_STRUCT->scriptingActive); + gBattleStruct->scriptingActive = ewram160DD; + side = GetBankSide(gBattleStruct->scriptingActive); gBattleTextBuff1[0] = 0xFD; gBattleTextBuff1[1] = 9; - gBattleTextBuff1[2] = gBattleMons[BATTLE_STRUCT->scriptingActive].ability; + gBattleTextBuff1[2] = gBattleMons[gBattleStruct->scriptingActive].ability; gBattleTextBuff1[3] = 0xFF; for (;gBankTarget < gNoOfAllBanks; gBankTarget++) @@ -16827,7 +15594,7 @@ static void atkE2_switchoutabilities(void) { case ABILITY_NATURAL_CURE: gBattleMons[gActiveBank].status1 = 0; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, gBitTable[ewram16064arr(gActiveBank)], 4, &gBattleMons[gActiveBank].status1); + EmitSetMonData(0, REQUEST_STATUS_BATTLE, gBitTable[ewram16064arr(gActiveBank)], 4, &gBattleMons[gActiveBank].status1); MarkBufferBankForExecution(gActiveBank); break; } @@ -16908,10 +15675,10 @@ static void atkE5_pickup(void) static void atkE6_docastformchangeanimation(void) { - gActiveBank = BATTLE_STRUCT->scriptingActive; + gActiveBank = gBattleStruct->scriptingActive; if (gBattleMons[gActiveBank].status2 & STATUS2_SUBSTITUTE) - BATTLE_STRUCT->castformToChangeInto |= 0x80; - EmitBattleAnimation(0, B_ANIM_CASTFORM_CHANGE, BATTLE_STRUCT->castformToChangeInto); + gBattleStruct->castformToChangeInto |= 0x80; + EmitBattleAnimation(0, B_ANIM_CASTFORM_CHANGE, gBattleStruct->castformToChangeInto); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr++; } @@ -16920,11 +15687,11 @@ static void atkE7_trycastformdatachange(void) { u8 form; gBattlescriptCurrInstr++; - form = CastformDataTypeChange(BATTLE_STRUCT->scriptingActive); + form = CastformDataTypeChange(gBattleStruct->scriptingActive); if (form) { - b_push_move_exec(BattleScript_CastformChange); - BATTLE_STRUCT->castformToChangeInto = form - 1; + BattleScriptPushCursorAndCallback(BattleScript_CastformChange); + gBattleStruct->castformToChangeInto = form - 1; } } @@ -16960,17 +15727,17 @@ static void atkE9_setweatherballtype(void) if (WEATHER_HAS_EFFECT) { if ((u8)(gBattleWeather)) - BATTLE_STRUCT->dmgMultiplier = 2; + gBattleStruct->dmgMultiplier = 2; if (gBattleWeather & WEATHER_RAIN_ANY) - BATTLE_STRUCT->dynamicMoveType = TYPE_WATER | 0x80; + gBattleStruct->dynamicMoveType = TYPE_WATER | 0x80; else if (gBattleWeather & WEATHER_SANDSTORM_ANY) - BATTLE_STRUCT->dynamicMoveType = TYPE_ROCK | 0x80; + gBattleStruct->dynamicMoveType = TYPE_ROCK | 0x80; else if (gBattleWeather & WEATHER_SUN_ANY) - BATTLE_STRUCT->dynamicMoveType = TYPE_FIRE | 0x80; + gBattleStruct->dynamicMoveType = TYPE_FIRE | 0x80; else if (gBattleWeather & WEATHER_HAIL) - BATTLE_STRUCT->dynamicMoveType = TYPE_ICE | 0x80; + gBattleStruct->dynamicMoveType = TYPE_ICE | 0x80; else - BATTLE_STRUCT->dynamicMoveType = TYPE_NORMAL | 0x80; + gBattleStruct->dynamicMoveType = TYPE_NORMAL | 0x80; } gBattlescriptCurrInstr++; } @@ -16985,7 +15752,7 @@ static void atkEA_tryrecycleitem(void) gLastUsedItem = *used_item; *used_item = 0; gBattleMons[gActiveBank].item = gLastUsedItem; - EmitSetAttributes(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBank].item); + EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBank].item); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr += 5; } @@ -17011,14 +15778,14 @@ static void atkEB_settypetoterrain(void) static void atkEC_pursuitrelated(void) { - gActiveBank = GetBankByPlayerAI(GetBankIdentity(gBankAttacker) ^ 2); + gActiveBank = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ 2); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBankFlags & gBitTable[gActiveBank]) && gActionForBanks[gActiveBank] == 0 && gChosenMovesByBanks[gActiveBank] == MOVE_PURSUIT) { - gUnknown_02024A76[gActiveBank] = 11; + gActionsByTurnOrder[gActiveBank] = 11; gCurrentMove = MOVE_PURSUIT; gBattlescriptCurrInstr += 5; - BATTLE_STRUCT->animTurn = 1; - BATTLE_STRUCT->unk160A7 = gBankAttacker; + gBattleStruct->animTurn = 1; + gBattleStruct->unk160A7 = gBankAttacker; gBankAttacker = gActiveBank; } else @@ -17029,29 +15796,29 @@ static void atkED_snatchsetbanks(void) { gEffectBank = gBankAttacker; if (gBankAttacker == gBankTarget) - gBankAttacker = gBankTarget = BATTLE_STRUCT->scriptingActive; + gBankAttacker = gBankTarget = gBattleStruct->scriptingActive; else - gBankTarget = BATTLE_STRUCT->scriptingActive; - BATTLE_STRUCT->scriptingActive = gEffectBank; + gBankTarget = gBattleStruct->scriptingActive; + gBattleStruct->scriptingActive = gEffectBank; gBattlescriptCurrInstr++; } static void atkEE_removelightscreenreflect(void) //brick break { u8 side = GetBankSide(gBankAttacker) ^ 1; - if (gSideTimer[side].reflectTimer || gSideTimer[side].lightscreenTimer) + if (gSideTimers[side].reflectTimer || gSideTimers[side].lightscreenTimer) { gSideAffecting[side] &= ~(SIDE_STATUS_REFLECT); gSideAffecting[side] &= ~(SIDE_STATUS_LIGHTSCREEN); - gSideTimer[side].reflectTimer = 0; - gSideTimer[side].lightscreenTimer = 0; - BATTLE_STRUCT->animTurn = 1; - BATTLE_STRUCT->animTargetsHit = 1; + gSideTimers[side].reflectTimer = 0; + gSideTimers[side].lightscreenTimer = 0; + gBattleStruct->animTurn = 1; + gBattleStruct->animTargetsHit = 1; } else { - BATTLE_STRUCT->animTurn = 0; - BATTLE_STRUCT->animTargetsHit = 0; + gBattleStruct->animTurn = 0; + gBattleStruct->animTargetsHit = 0; } gBattlescriptCurrInstr++; } @@ -17081,7 +15848,7 @@ void atkEF_handleballthrow(void) u32 odds; u8 catch_rate; if (gLastUsedItem == ITEM_SAFARI_BALL) - catch_rate = BATTLE_STRUCT->unk16089 * 1275 / 100; //correct the name to safariFleeRate + catch_rate = gBattleStruct->unk16089 * 1275 / 100; //correct the name to safariFleeRate else catch_rate = gBaseStats[gBattleMons[gBankTarget].species].catchRate; if (gLastUsedItem > 5) @@ -17230,13 +15997,13 @@ static void atkF2_displaydexinfo(void) } break; case 2: - if (!gPaletteFade.active && gMain.callback2 == sub_800F808 && !gTasks[gBattleCommunication[1]].isActive) + if (!gPaletteFade.active && gMain.callback2 == BattleMainCB2 && !gTasks[gBattleCommunication[1]].isActive) { LZDecompressVram(gBattleTerrainTiles_Building, (void*)(0x06008000)); LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(0x0600d000)); LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60); REG_BG3CNT = 0x5a0b; - gUnknown_030041B0 = 0x100; + gBattle_BG3_X = 0x100; BeginNormalPaletteFade(0xfffc, 0, 0x10, 0, 0); gBattleCommunication[0]++; } @@ -17340,7 +16107,7 @@ _0802BC68: .4byte 0x00001025\n\ void sub_802BC6C(void) { - sub_814A880(0xC8, ((gBattleCommunication[1] << 28) + 1207959552) >> 24); //what could that be? + MenuCursor_SetPos814A880(0xC8, ((gBattleCommunication[1] << 28) + 1207959552) >> 24); //what could that be? } void nullsub_6(void) @@ -17393,15 +16160,15 @@ static void atkF3_trygivecaughtmonnick(void) case 2: if (!gPaletteFade.active) { - GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]], MON_DATA_NICKNAME, BATTLE_STRUCT->caughtNick); - DoNamingScreen(2, BATTLE_STRUCT->caughtNick, GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]], MON_DATA_SPECIES), GetMonGender(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]]), GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]], MON_DATA_PERSONALITY, 0), sub_800F808); + GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]], MON_DATA_NICKNAME, gBattleStruct->caughtNick); + DoNamingScreen(2, gBattleStruct->caughtNick, GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]], MON_DATA_SPECIES), GetMonGender(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]]), GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]], MON_DATA_PERSONALITY, 0), BattleMainCB2); gBattleCommunication[0]++; } break; case 3: - if (gMain.callback2 == sub_800F808 && !gPaletteFade.active ) + if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active ) { - SetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]], MON_DATA_NICKNAME, BATTLE_STRUCT->caughtNick); + SetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]], MON_DATA_NICKNAME, gBattleStruct->caughtNick); gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } break; @@ -17428,11 +16195,11 @@ static void atkF5_removeattackerstatus1(void) static void atkF6_finishaction(void) { - gFightStateTracker = 0xC; + gCurrentActionFuncId = 0xC; } static void atkF7_finishturn(void) { - gFightStateTracker = 0xC; - gCurrentMoveTurn = gNoOfAllBanks; + gCurrentActionFuncId = 0xC; + gCurrentTurnActionNumber = gNoOfAllBanks; } diff --git a/src/battle/battle_7.c b/src/battle/battle_7.c index 7ca9ac3c4..b4c71b9c2 100644 --- a/src/battle/battle_7.c +++ b/src/battle/battle_7.c @@ -3,6 +3,7 @@ #include "battle_anim.h" #include "battle_interface.h" #include "blend_palette.h" +#include "contest.h" #include "data2.h" #include "decompress.h" #include "main.h" @@ -623,15 +624,12 @@ void sub_8031FC4(u8 a, u8 b, bool8 c) } else { - const void *src; - void *dst; - if (IsContest()) { r10 = 0; - species = ewram19348.unk2; - personalityValue = ewram19348.unk8; - otId = ewram19348.unkC; + species = shared19348.unk2; + personalityValue = shared19348.unk8; + otId = shared19348.unkC; HandleLoadSpecialPokePic( &gMonBackPicTable[species], gMonBackPicCoords[species].coords, @@ -639,7 +637,7 @@ void sub_8031FC4(u8 a, u8 b, bool8 c) eVoidSharedArr2, gUnknown_081FAF4C[0], species, - ewram19348.unk10); + shared19348.unk10); } else { @@ -675,9 +673,7 @@ void sub_8031FC4(u8 a, u8 b, bool8 c) gTransformedPersonalities[a]); } } - src = gUnknown_081FAF4C[r10]; - dst = (void *)(VRAM + 0x10000 + gSprites[gObjectBankIDs[a]].oam.tileNum * 32); - DmaCopy32(3, src, dst, 0x800); + DmaCopy32Defvars(3, gUnknown_081FAF4C[r10], (void *)(VRAM + 0x10000 + gSprites[gObjectBankIDs[a]].oam.tileNum * 32), 0x800); paletteOffset = 0x100 + a * 16; lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, otId, personalityValue); LZDecompressWram(lzPaletteData, gSharedMem); @@ -762,7 +758,7 @@ void sub_80324E0(u8 a) ewram17800[a].substituteSprite = 0; } -void sub_80324F8(struct Pokemon *pkmn, u8 b) +void HandleLowHpMusicChange(struct Pokemon *pkmn, u8 b) { u16 hp = GetMonData(pkmn, MON_DATA_HP); u16 maxHP = GetMonData(pkmn, MON_DATA_MAX_HP); @@ -792,9 +788,9 @@ void sub_80324F8(struct Pokemon *pkmn, u8 b) } } -void BattleMusicStop(void) +void BattleStopLowHpSound(void) { - u8 r4 = GetBankByPlayerAI(0); + u8 r4 = GetBankByIdentity(0); ewram17800[r4].unk0_1 = 0; if (IsDoubleBattle()) @@ -814,17 +810,17 @@ void sub_8032638(void) { if (gMain.inBattle) { - u8 r8 = GetBankByPlayerAI(0); - u8 r9 = GetBankByPlayerAI(2); + u8 r8 = GetBankByIdentity(0); + u8 r9 = GetBankByIdentity(2); u8 r4 = pokemon_order_func(gBattlePartyID[r8]); u8 r5 = pokemon_order_func(gBattlePartyID[r9]); if (GetMonData(&gPlayerParty[r4], MON_DATA_HP) != 0) - sub_80324F8(&gPlayerParty[r4], r8); + HandleLowHpMusicChange(&gPlayerParty[r4], r8); if (IsDoubleBattle()) { if (GetMonData(&gPlayerParty[r5], MON_DATA_HP) != 0) - sub_80324F8(&gPlayerParty[r5], r9); + HandleLowHpMusicChange(&gPlayerParty[r5], r9); } } } @@ -856,12 +852,12 @@ void sub_80327CC(void) u8 r5; LoadCompressedObjectPic(&gUnknown_081FAF24); - r5 = GetBankByPlayerAI(1); + r5 = GetBankByIdentity(1); ewram17810[r5].unk7 = CreateSprite(&gSpriteTemplate_81FAF34, GetBankPosition(r5, 0), GetBankPosition(r5, 1) + 32, 0xC8); gSprites[ewram17810[r5].unk7].data[0] = r5; if (IsDoubleBattle()) { - r5 = GetBankByPlayerAI(3); + r5 = GetBankByIdentity(3); ewram17810[r5].unk7 = CreateSprite(&gSpriteTemplate_81FAF34, GetBankPosition(r5, 0), GetBankPosition(r5, 1) + 32, 0xC8); gSprites[ewram17810[r5].unk7].data[0] = r5; } diff --git a/src/battle/battle_ai.c b/src/battle/battle_ai.c index 1fa7a2ed2..629a57d25 100644 --- a/src/battle/battle_ai.c +++ b/src/battle/battle_ai.c @@ -13,6 +13,8 @@ #include "util.h" #include "ewram.h" +extern u8 gUnknown_02023A14_50; +extern u32 gUnknown_02023A14_4C; extern u16 gBattleTypeFlags; extern u16 gBattleWeather; extern u8 gActiveBank; @@ -336,11 +338,15 @@ void BattleAI_SetupAIData(void) else if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) AI_THINKING_STRUCT->aiFlags = 0x80000000; #ifdef GERMAN - else if (gBattleTypeFlags & 0x900 || gTrainerBattleOpponent == 0x400) + else if (gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER) || gTrainerBattleOpponent == 0x400) AI_THINKING_STRUCT->aiFlags = 7; #endif else // otherwise, just set aiFlags to whatever flags the trainer has set in their data. AI_THINKING_STRUCT->aiFlags = gTrainers[gTrainerBattleOpponent].aiFlags; +#if DEBUG + if (gUnknown_02023A14_50 & 1) + AI_THINKING_STRUCT->aiFlags = gUnknown_02023A14_4C; +#endif } u8 BattleAI_GetAIActionToUse(void) @@ -355,7 +361,7 @@ u8 BattleAI_GetAIActionToUse(void) { if (AI_THINKING_STRUCT->aiFlags & 1) { - AI_THINKING_STRUCT->aiState = AIState_SettingUp; + AI_THINKING_STRUCT->aiState = BATTLEAI_SETTING_UP; BattleAI_DoAIProcessing(); } AI_THINKING_STRUCT->aiFlags >>= 1; @@ -393,13 +399,13 @@ u8 BattleAI_GetAIActionToUse(void) void BattleAI_DoAIProcessing(void) { - while (AI_THINKING_STRUCT->aiState != AIState_FinishedProcessing) + while (AI_THINKING_STRUCT->aiState != BATTLEAI_FINISHED) { switch (AI_THINKING_STRUCT->aiState) { - case AIState_DoNotProcess: //Needed to match. + case BATTLEAI_DO_NOT_PROCESS: //Needed to match. break; - case AIState_SettingUp: + case BATTLEAI_SETTING_UP: gAIScriptPtr = BattleAIs[AI_THINKING_STRUCT->aiLogicId]; // set the AI ptr. if (gBattleMons[gBankAttacker].pp[AI_THINKING_STRUCT->movesetIndex] == 0) { @@ -411,7 +417,7 @@ void BattleAI_DoAIProcessing(void) } AI_THINKING_STRUCT->aiState++; break; - case AIState_Processing: + case BATTLEAI_PROCESSING: if (AI_THINKING_STRUCT->moveConsidered != MOVE_NONE) sBattleAICmdTable[*gAIScriptPtr](); // run AI command. else @@ -423,7 +429,7 @@ void BattleAI_DoAIProcessing(void) { AI_THINKING_STRUCT->movesetIndex++; if (AI_THINKING_STRUCT->movesetIndex < MAX_MON_MOVES && (AI_THINKING_STRUCT->aiAction & AI_ACTION_DO_NOT_ATTACK) == 0) - AI_THINKING_STRUCT->aiState = AIState_SettingUp; // as long as their are more moves to process, keep setting this to setup state. + AI_THINKING_STRUCT->aiState = BATTLEAI_SETTING_UP; // as long as their are more moves to process, keep setting this to setup state. else AI_THINKING_STRUCT->aiState++; // done processing. AI_THINKING_STRUCT->aiAction &= (AI_ACTION_FLEE | AI_ACTION_WATCH | AI_ACTION_DO_NOT_ATTACK | @@ -1275,7 +1281,7 @@ static void BattleAICmd_if_arg_not_equal(void) static void BattleAICmd_if_would_go_first(void) { - if (GetWhoStrikesFirst(gBankAttacker, gBankTarget, 1) == gAIScriptPtr[1]) + if (GetWhoStrikesFirst(gBankAttacker, gBankTarget, TRUE) == gAIScriptPtr[1]) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); else gAIScriptPtr += 6; @@ -1283,7 +1289,7 @@ static void BattleAICmd_if_would_go_first(void) static void BattleAICmd_if_would_not_go_first(void) { - if (GetWhoStrikesFirst(gBankAttacker, gBankTarget, 1) != gAIScriptPtr[1]) + if (GetWhoStrikesFirst(gBankAttacker, gBankTarget, TRUE) != gAIScriptPtr[1]) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); else gAIScriptPtr += 6; @@ -1321,7 +1327,7 @@ static void BattleAICmd_count_alive_pokemon(void) u32 status; var = gBattlePartyID[index]; status = GetBankIdentity(index) ^ 2; - var2 = gBattlePartyID[GetBankByPlayerAI(status)]; + var2 = gBattlePartyID[GetBankByIdentity(status)]; } else { @@ -1422,8 +1428,8 @@ static void BattleAICmd_get_highest_possible_damage(void) s32 i; gDynamicBasePower = 0; - BATTLE_STRUCT->dynamicMoveType = 0; - BATTLE_STRUCT->dmgMultiplier = 1; + gBattleStruct->dynamicMoveType = 0; + gBattleStruct->dmgMultiplier = 1; gBattleMoveFlags = 0; gCritMultiplier = 1; AI_THINKING_STRUCT->funcResult = 0; @@ -1462,8 +1468,8 @@ static void BattleAICmd_if_damage_bonus(void) u8 damageVar; gDynamicBasePower = 0; - BATTLE_STRUCT->dynamicMoveType = 0; - BATTLE_STRUCT->dmgMultiplier = 1; + gBattleStruct->dynamicMoveType = 0; + gBattleStruct->dmgMultiplier = 1; gBattleMoveFlags = 0; gCritMultiplier = 1; @@ -1669,8 +1675,8 @@ static void BattleAICmd_if_can_faint(void) } gDynamicBasePower = 0; - BATTLE_STRUCT->dynamicMoveType = 0; - BATTLE_STRUCT->dmgMultiplier = 1; + gBattleStruct->dynamicMoveType = 0; + gBattleStruct->dmgMultiplier = 1; gBattleMoveFlags = 0; gCritMultiplier = 1; gCurrentMove = AI_THINKING_STRUCT->moveConsidered; @@ -1698,8 +1704,8 @@ static void BattleAICmd_if_cant_faint(void) } gDynamicBasePower = 0; - BATTLE_STRUCT->dynamicMoveType = 0; - BATTLE_STRUCT->dmgMultiplier = 1; + gBattleStruct->dynamicMoveType = 0; + gBattleStruct->dmgMultiplier = 1; gBattleMoveFlags = 0; gCritMultiplier = 1; gCurrentMove = AI_THINKING_STRUCT->moveConsidered; @@ -1907,7 +1913,7 @@ static void BattleAICmd_flee(void) static void BattleAICmd_if_random_100(void) { - u8 safariFleeRate = BATTLE_STRUCT->safariFleeRate * 5; // safari flee rate, from 0-20 + u8 safariFleeRate = gBattleStruct->safariFleeRate * 5; // safari flee rate, from 0-20 if ((u8)(Random() % 100) < safariFleeRate) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); diff --git a/src/battle/battle_anim.c b/src/battle/battle_anim.c index 8242a1ddd..c71c12ce7 100644 --- a/src/battle/battle_anim.c +++ b/src/battle/battle_anim.c @@ -13,6 +13,7 @@ #include "sprite.h" #include "task.h" #include "ewram.h" +#include "graphics.h" // sprites start at 10000 and thus must be subtracted of 10000 to account for the true index. #define GET_TRUE_SPRITE_INDEX(i) (i - 10000) @@ -20,6 +21,1271 @@ #define ANIM_SPRITE_INDEX_COUNT 8 #define ANIM_ARGS_COUNT 8 +const struct OamData gOamData_837DF24 = +{ + .affineMode = 0, + .objMode = 0, + .shape = 0, + .size = 0, + .priority = 2, +}; + +const struct OamData gOamData_837DF2C = +{ + .affineMode = 0, + .objMode = 0, + .shape = 0, + .size = 1, + .priority = 2, +}; + +const struct OamData gOamData_837DF34 = +{ + .affineMode = 0, + .objMode = 0, + .shape = 0, + .size = 2, + .priority = 2, +}; + +const struct OamData gOamData_837DF3C = +{ + .affineMode = 0, + .objMode = 0, + .shape = 0, + .size = 3, + .priority = 2, +}; + +const struct OamData gOamData_837DF44 = +{ + .affineMode = 0, + .objMode = 0, + .shape = 1, + .size = 0, + .priority = 2, +}; + +const struct OamData gOamData_837DF4C = +{ + .affineMode = 0, + .objMode = 0, + .shape = 1, + .size = 1, + .priority = 2, +}; + +const struct OamData gOamData_837DF54 = +{ + .affineMode = 0, + .objMode = 0, + .shape = 1, + .size = 2, + .priority = 2, +}; + +const struct OamData gOamData_837DF5C = +{ + .affineMode = 0, + .objMode = 0, + .shape = 1, + .size = 3, + .priority = 2, +}; + +const struct OamData gOamData_837DF64 = +{ + .affineMode = 0, + .objMode = 0, + .shape = 2, + .size = 0, + .priority = 2, +}; + +const struct OamData gOamData_837DF6C = +{ + .affineMode = 0, + .objMode = 0, + .shape = 2, + .size = 1, + .priority = 2, +}; + +const struct OamData gOamData_837DF74 = +{ + .affineMode = 0, + .objMode = 0, + .shape = 2, + .size = 2, + .priority = 2, +}; + +const struct OamData gOamData_837DF7C = +{ + .affineMode = 0, + .objMode = 0, + .shape = 2, + .size = 3, + .priority = 2, +}; + +const struct OamData gOamData_837DF84 = +{ + .affineMode = 1, + .objMode = 0, + .shape = 0, + .size = 0, + .priority = 2, +}; + +const struct OamData gOamData_837DF8C = +{ + .affineMode = 1, + .objMode = 0, + .shape = 0, + .size = 1, + .priority = 2, +}; + +const struct OamData gOamData_837DF94 = +{ + .affineMode = 1, + .objMode = 0, + .shape = 0, + .size = 2, + .priority = 2, +}; + +const struct OamData gOamData_837DF9C = +{ + .affineMode = 1, + .objMode = 0, + .shape = 0, + .size = 3, + .priority = 2, +}; + +const struct OamData gOamData_837DFA4 = +{ + .affineMode = 1, + .objMode = 0, + .shape = 1, + .size = 0, + .priority = 2, +}; + +const struct OamData gOamData_837DFAC = +{ + .affineMode = 1, + .objMode = 0, + .shape = 1, + .size = 1, + .priority = 2, +}; + +const struct OamData gOamData_837DFB4 = +{ + .affineMode = 1, + .objMode = 0, + .shape = 1, + .size = 2, + .priority = 2, +}; + +const struct OamData gOamData_837DFBC = +{ + .affineMode = 1, + .objMode = 0, + .shape = 1, + .size = 3, + .priority = 2, +}; + +const struct OamData gOamData_837DFC4 = +{ + .affineMode = 1, + .objMode = 0, + .shape = 2, + .size = 0, + .priority = 2, +}; + +const struct OamData gOamData_837DFCC = +{ + .affineMode = 1, + .objMode = 0, + .shape = 2, + .size = 1, + .priority = 2, +}; + +const struct OamData gOamData_837DFD4 = +{ + .affineMode = 1, + .objMode = 0, + .shape = 2, + .size = 2, + .priority = 2, +}; + +const struct OamData gOamData_837DFDC = +{ + .affineMode = 1, + .objMode = 0, + .shape = 2, + .size = 3, + .priority = 2, +}; + +const struct OamData gOamData_837DFE4 = +{ + .affineMode = 3, + .objMode = 0, + .shape = 0, + .size = 0, + .priority = 2, +}; + +const struct OamData gOamData_837DFEC = +{ + .affineMode = 3, + .objMode = 0, + .shape = 0, + .size = 1, + .priority = 2, +}; + +const struct OamData gOamData_837DFF4 = +{ + .affineMode = 3, + .objMode = 0, + .shape = 0, + .size = 2, + .priority = 2, +}; + +const struct OamData gOamData_837DFFC = +{ + .affineMode = 3, + .objMode = 0, + .shape = 0, + .size = 3, + .priority = 2, +}; + +const struct OamData gOamData_837D004 = +{ + .affineMode = 3, + .objMode = 0, + .shape = 1, + .size = 0, + .priority = 2, +}; + +const struct OamData gOamData_837D00C = +{ + .affineMode = 3, + .objMode = 0, + .shape = 1, + .size = 1, + .priority = 2, +}; + +const struct OamData gOamData_837E014 = +{ + .affineMode = 3, + .objMode = 0, + .shape = 1, + .size = 2, + .priority = 2, +}; + +const struct OamData gOamData_837E01C = +{ + .affineMode = 3, + .objMode = 0, + .shape = 1, + .size = 3, + .priority = 2, +}; + +const struct OamData gOamData_837E024 = +{ + .affineMode = 3, + .objMode = 0, + .shape = 2, + .size = 0, + .priority = 2, +}; + +const struct OamData gOamData_837E02C = +{ + .affineMode = 3, + .objMode = 0, + .shape = 2, + .size = 1, + .priority = 2, +}; + +const struct OamData gOamData_837E034 = +{ + .affineMode = 3, + .objMode = 0, + .shape = 2, + .size = 2, + .priority = 2, +}; + +const struct OamData gOamData_837E03C = +{ + .affineMode = 3, + .objMode = 0, + .shape = 2, + .size = 3, + .priority = 2, +}; + +const struct OamData gOamData_837E044 = +{ + .affineMode = 0, + .objMode = 1, + .shape = 0, + .size = 0, + .priority = 2, +}; + +const struct OamData gOamData_837E04C = +{ + .affineMode = 0, + .objMode = 1, + .shape = 0, + .size = 1, + .priority = 2, +}; + +const struct OamData gOamData_837E054 = +{ + .affineMode = 0, + .objMode = 1, + .shape = 0, + .size = 2, + .priority = 2, +}; + +const struct OamData gOamData_837E05C = +{ + .affineMode = 0, + .objMode = 1, + .shape = 0, + .size = 3, + .priority = 2, +}; + +const struct OamData gOamData_837E064 = +{ + .affineMode = 0, + .objMode = 1, + .shape = 1, + .size = 0, + .priority = 2, +}; + +const struct OamData gOamData_837E06C = +{ + .affineMode = 0, + .objMode = 1, + .shape = 1, + .size = 1, + .priority = 2, +}; + +const struct OamData gOamData_837E074 = +{ + .affineMode = 0, + .objMode = 1, + .shape = 1, + .size = 2, + .priority = 2, +}; + +const struct OamData gOamData_837E07C = +{ + .affineMode = 0, + .objMode = 1, + .shape = 1, + .size = 3, + .priority = 2, +}; + +const struct OamData gOamData_837E084 = +{ + .affineMode = 0, + .objMode = 1, + .shape = 2, + .size = 0, + .priority = 2, +}; + +const struct OamData gOamData_837E08C = +{ + .affineMode = 0, + .objMode = 1, + .shape = 2, + .size = 1, + .priority = 2, +}; + +const struct OamData gOamData_837E094 = +{ + .affineMode = 0, + .objMode = 1, + .shape = 2, + .size = 2, + .priority = 2, +}; + +const struct OamData gOamData_837E09C = +{ + .affineMode = 0, + .objMode = 1, + .shape = 2, + .size = 3, + .priority = 2, +}; + +const struct OamData gOamData_837E0A4 = +{ + .affineMode = 1, + .objMode = 1, + .shape = 0, + .size = 0, + .priority = 2, +}; + +const struct OamData gOamData_837E0AC = +{ + .affineMode = 1, + .objMode = 1, + .shape = 0, + .size = 1, + .priority = 2, +}; + +const struct OamData gOamData_837E0B4 = +{ + .affineMode = 1, + .objMode = 1, + .shape = 0, + .size = 2, + .priority = 2, +}; + +const struct OamData gOamData_837E0BC = +{ + .affineMode = 1, + .objMode = 1, + .shape = 0, + .size = 3, + .priority = 2, +}; + +const struct OamData gOamData_837E0C4 = +{ + .affineMode = 1, + .objMode = 1, + .shape = 1, + .size = 0, + .priority = 2, +}; + +const struct OamData gOamData_837E0CC = +{ + .affineMode = 1, + .objMode = 1, + .shape = 1, + .size = 1, + .priority = 2, +}; + +const struct OamData gOamData_837E0D4 = +{ + .affineMode = 1, + .objMode = 1, + .shape = 1, + .size = 2, + .priority = 2, +}; + +const struct OamData gOamData_837E0DC = +{ + .affineMode = 1, + .objMode = 1, + .shape = 1, + .size = 3, + .priority = 2, +}; + +const struct OamData gOamData_837E0E4 = +{ + .affineMode = 1, + .objMode = 1, + .shape = 2, + .size = 0, + .priority = 2, +}; + +const struct OamData gOamData_837E0EC = +{ + .affineMode = 1, + .objMode = 1, + .shape = 2, + .size = 1, + .priority = 2, +}; + +const struct OamData gOamData_837E0F4 = +{ + .affineMode = 1, + .objMode = 1, + .shape = 2, + .size = 2, + .priority = 2, +}; + +const struct OamData gOamData_837E0FC = +{ + .affineMode = 1, + .objMode = 1, + .shape = 2, + .size = 3, + .priority = 2, +}; + +const struct OamData gOamData_837E104 = +{ + .affineMode = 3, + .objMode = 1, + .shape = 0, + .size = 0, + .priority = 2, +}; + +const struct OamData gOamData_837E10C = +{ + .affineMode = 3, + .objMode = 1, + .shape = 0, + .size = 1, + .priority = 2, +}; + +const struct OamData gOamData_837E114 = +{ + .affineMode = 3, + .objMode = 1, + .shape = 0, + .size = 2, + .priority = 2, +}; + +const struct OamData gOamData_837E11C = +{ + .affineMode = 3, + .objMode = 1, + .shape = 0, + .size = 3, + .priority = 2, +}; + +const struct OamData gOamData_837E124 = +{ + .affineMode = 3, + .objMode = 1, + .shape = 1, + .size = 0, + .priority = 2, +}; + +const struct OamData gOamData_837E12C = +{ + .affineMode = 3, + .objMode = 1, + .shape = 1, + .size = 1, + .priority = 2, +}; + +const struct OamData gOamData_837E134 = +{ + .affineMode = 3, + .objMode = 1, + .shape = 1, + .size = 2, + .priority = 2, +}; + +const struct OamData gOamData_837E13C = +{ + .affineMode = 3, + .objMode = 1, + .shape = 1, + .size = 3, + .priority = 2, +}; + +const struct OamData gOamData_837E144 = +{ + .affineMode = 3, + .objMode = 1, + .shape = 2, + .size = 0, + .priority = 2, +}; + +const struct OamData gOamData_837E14C = +{ + .affineMode = 3, + .objMode = 1, + .shape = 2, + .size = 1, + .priority = 2, +}; + +const struct OamData gOamData_837E154 = +{ + .affineMode = 3, + .objMode = 1, + .shape = 2, + .size = 2, + .priority = 2, +}; + +const struct OamData gOamData_837E15C = +{ + .affineMode = 3, + .objMode = 1, + .shape = 2, + .size = 3, + .priority = 2, +}; + +const struct CompressedSpriteSheet gBattleAnimPicTable[] = +{ + { (u8 *) &gBattleAnimSpriteSheet_000, 0x200, 10000 }, + { (u8 *) &gBattleAnimSpriteSheet_001, 0x300, 10001 }, + { (u8 *) &gBattleAnimSpriteSheet_002, 0x200, 10002 }, + { (u8 *) &gBattleAnimSpriteSheet_003, 0x100, 10003 }, + { (u8 *) &gBattleAnimSpriteSheet_004, 0x200, 10004 }, + { (u8 *) &gBattleAnimSpriteSheet_005, 0x400, 10005 }, + { (u8 *) &gBattleAnimSpriteSheet_006, 0x180, 10006 }, + { (u8 *) &gBattleAnimSpriteSheet_007, 0x800, 10007 }, + { (u8 *) &gBattleAnimSpriteSheet_008, 0x20, 10008 }, + { (u8 *) &gBattleAnimSpriteSheet_009, 0x400, 10009 }, + { (u8 *) &gBattleAnimSpriteSheet_010, 0x1200, 10010 }, + { (u8 *) &gBattleAnimSpriteSheet_011, 0x180, 10011 }, + { (u8 *) &gBattleAnimSpriteSheet_012, 0x80, 10012 }, + { (u8 *) &gBattleAnimSpriteSheet_013, 0x80, 10013 }, + { (u8 *) &gBattleAnimSpriteSheet_014, 0x280, 10014 }, + { (u8 *) &gBattleAnimSpriteSheet_015, 0x80, 10015 }, + { (u8 *) &gBattleAnimSpriteSheet_016, 0x100, 10016 }, + { (u8 *) &gBattleAnimSpriteSheet_017, 0x20, 10017 }, + { (u8 *) &gBattleAnimSpriteSheet_018, 0x80, 10018 }, + { (u8 *) &gBattleAnimSpriteSheet_019, 0x400, 10019 }, + { (u8 *) &gBattleAnimSpriteSheet_020, 0x200, 10020 }, + { (u8 *) &gBattleAnimSpriteSheet_021, 0xA00, 10021 }, + { (u8 *) &gBattleAnimSpriteSheet_021, 0xA00, 10022 }, + { (u8 *) &gBattleAnimSpriteSheet_023, 0x380, 10023 }, + { (u8 *) &gBattleAnimSpriteSheet_024, 0x300, 10024 }, + { (u8 *) &gBattleAnimSpriteSheet_025, 0xA00, 10025 }, + { (u8 *) &gBattleAnimSpriteSheet_026, 0xA00, 10026 }, + { (u8 *) &gBattleAnimSpriteSheet_027, 0xA00, 10027 }, + { (u8 *) &gBattleAnimSpriteSheet_028, 0xA00, 10028 }, + { (u8 *) &gBattleAnimSpriteSheet_029, 0xA00, 10029 }, + { (u8 *) &gBattleAnimSpriteSheet_030, 0xA00, 10030 }, + { (u8 *) &gBattleAnimSpriteSheet_031, 0xE00, 10031 }, + { (u8 *) &gBattleAnimSpriteSheet_032, 0x380, 10032 }, + { (u8 *) &gBattleAnimSpriteSheet_033, 0x1000, 10033 }, + { (u8 *) &gBattleAnimSpriteSheet_034, 0x800, 10034 }, + { (u8 *) &gBattleAnimSpriteSheet_035, 0xA00, 10035 }, + { (u8 *) &gBattleAnimSpriteSheet_036, 0x800, 10036 }, + { (u8 *) &gBattleAnimSpriteSheet_037, 0xA00, 10037 }, + { (u8 *) &gBattleAnimSpriteSheet_038, 0xA00, 10038 }, + { (u8 *) &gBattleAnimSpriteSheet_039, 0xA00, 10039 }, + { (u8 *) &gBattleAnimSpriteSheet_040, 0xA00, 10040 }, + { (u8 *) &gBattleAnimSpriteSheet_041, 0xA00, 10041 }, + { (u8 *) &gBattleAnimSpriteSheet_042, 0xA00, 10042 }, + { (u8 *) &gBattleAnimSpriteSheet_043, 0xA00, 10043 }, + { (u8 *) &gBattleAnimSpriteSheet_044, 0xA00, 10044 }, + { (u8 *) &gBattleAnimSpriteSheet_045, 0xA00, 10045 }, + { (u8 *) &gBattleAnimSpriteSheet_046, 0x1000, 10046 }, + { (u8 *) &gBattleAnimSpriteSheet_046, 0x1000, 10047 }, + { (u8 *) &gBattleAnimSpriteSheet_048, 0x1000, 10048 }, + { (u8 *) &gBattleAnimSpriteSheet_048, 0x1000, 10049 }, + { (u8 *) &gBattleAnimSpriteSheet_050, 0x200, 10050 }, + { (u8 *) &gBattleAnimSpriteSheet_051, 0x200, 10051 }, + { (u8 *) &gBattleAnimSpriteSheet_052, 0x200, 10052 }, + { (u8 *) &gBattleAnimSpriteSheet_053, 0x800, 10053 }, + { (u8 *) &gBattleAnimSpriteSheet_054, 0x80, 10054 }, + { (u8 *) &gBattleAnimSpriteSheet_055, 0x200, 10055 }, + { (u8 *) &gBattleAnimSpriteSheet_056, 0x1000, 10056 }, + { (u8 *) &gBattleAnimSpriteSheet_057, 0x180, 10057 }, + { (u8 *) &gBattleAnimSpriteSheet_058, 0xC00, 10058 }, + { (u8 *) &gBattleAnimSpriteSheet_059, 0x100, 10059 }, + { (u8 *) &gBattleAnimSpriteSheet_060, 0x40, 10060 }, + { (u8 *) &gBattleAnimSpriteSheet_061, 0x180, 10061 }, + { (u8 *) &gBattleAnimSpriteSheet_062, 0x800, 10062 }, + { (u8 *) &gBattleAnimSpriteSheet_063, 0x480, 10063 }, + { (u8 *) &gBattleAnimSpriteSheet_064, 0x200, 10064 }, + { (u8 *) &gBattleAnimSpriteSheet_065, 0x200, 10065 }, + { (u8 *) &gBattleAnimSpriteSheet_066, 0x100, 10066 }, + { (u8 *) &gBattleAnimSpriteSheet_065, 0x200, 10067 }, + { (u8 *) &gBattleAnimSpriteSheet_065, 0x200, 10068 }, + { (u8 *) &gBattleAnimSpriteSheet_065, 0x200, 10069 }, + { (u8 *) &gBattleAnimSpriteSheet_070, 0x200, 10070 }, + { (u8 *) &gBattleAnimSpriteSheet_071, 0xA00, 10071 }, + { (u8 *) &gBattleAnimSpriteSheet_072, 0x300, 10072 }, + { (u8 *) &gBattleAnimSpriteSheet_073, 0x180, 10073 }, + { (u8 *) &gBattleAnimSpriteSheet_074, 0xA0, 10074 }, + { (u8 *) &gBattleAnimSpriteSheet_075, 0x700, 10075 }, + { (u8 *) &gBattleAnimSpriteSheet_076, 0x400, 10076 }, + { (u8 *) &gBattleAnimSpriteSheet_077, 0x200, 10077 }, + { (u8 *) &gBattleAnimSpriteSheet_078, 0x300, 10078 }, + { (u8 *) &gBattleAnimSpriteSheet_079, 0xC00, 10079 }, + { (u8 *) &gBattleAnimSpriteSheet_080, 0xA00, 10080 }, + { (u8 *) &gBattleAnimSpriteSheet_081, 0x80, 10081 }, + { (u8 *) &gBattleAnimSpriteSheet_082, 0x40, 10082 }, + { (u8 *) &gBattleAnimSpriteSheet_083, 0xE00, 10083 }, + { (u8 *) &gBattleAnimSpriteSheet_084, 0xE00, 10084 }, + { (u8 *) &gBattleAnimSpriteSheet_085, 0x280, 10085 }, + { (u8 *) &gBattleAnimSpriteSheet_086, 0x200, 10086 }, + { (u8 *) &gBattleAnimSpriteSheet_087, 0x80, 10087 }, + { (u8 *) &gBattleAnimSpriteSheet_088, 0xC0, 10088 }, + { (u8 *) &gBattleAnimSpriteSheet_089, 0xA00, 10089 }, + { (u8 *) &gBattleAnimSpriteSheet_090, 0x200, 10090 }, + { (u8 *) &gBattleAnimSpriteSheet_091, 0x180, 10091 }, + { (u8 *) &gBattleAnimSpriteSheet_092, 0x80, 10092 }, + { (u8 *) &gBattleAnimSpriteSheet_093, 0x1000, 10093 }, + { (u8 *) &gBattleAnimSpriteSheet_094, 0xA00, 10094 }, + { (u8 *) &gBattleAnimSpriteSheet_095, 0x180, 10095 }, + { (u8 *) &gBattleAnimSpriteSheet_096, 0x380, 10096 }, + { (u8 *) &gBattleAnimSpriteSheet_097, 0xC00, 10097 }, + { (u8 *) &gBattleAnimSpriteSheet_098, 0x200, 10098 }, + { (u8 *) &gBattleAnimSpriteSheet_099, 0x200, 10099 }, + { (u8 *) &gBattleAnimSpriteSheet_100, 0x200, 10100 }, + { (u8 *) &gBattleAnimSpriteSheet_101, 0x200, 10101 }, + { (u8 *) &gBattleAnimSpriteSheet_102, 0x400, 10102 }, + { (u8 *) &gBattleAnimSpriteSheet_103, 0x80, 10103 }, + { (u8 *) &gBattleAnimSpriteSheet_104, 0x400, 10104 }, + { (u8 *) &gBattleAnimSpriteSheet_105, 0xC00, 10105 }, + { (u8 *) &gBattleAnimSpriteSheet_106, 0x200, 10106 }, + { (u8 *) &gBattleAnimSpriteSheet_107, 0x1000, 10107 }, + { (u8 *) &gBattleAnimSpriteSheet_108, 0xA00, 10108 }, + { (u8 *) &gBattleAnimSpriteSheet_109, 0x20, 10109 }, + { (u8 *) &gBattleAnimSpriteSheet_110, 0xE00, 10110 }, + { (u8 *) &gBattleAnimSpriteSheet_111, 0x80, 10111 }, + { (u8 *) &gBattleAnimSpriteSheet_112, 0xA00, 10112 }, + { (u8 *) &gBattleAnimSpriteSheet_113, 0x400, 10113 }, + { (u8 *) &gBattleAnimSpriteSheet_114, 0x200, 10114 }, + { (u8 *) &gBattleAnimSpriteSheet_115, 0x700, 10115 }, + { (u8 *) &gBattleAnimSpriteSheet_116, 0x800, 10116 }, + { (u8 *) &gBattleAnimSpriteSheet_117, 0xA00, 10117 }, + { (u8 *) &gBattleAnimSpriteSheet_118, 0x600, 10118 }, + { (u8 *) &gBattleAnimSpriteSheet_119, 0x800, 10119 }, + { (u8 *) &gBattleAnimSpriteSheet_120, 0x200, 10120 }, + { (u8 *) &gBattleAnimSpriteSheet_121, 0x40, 10121 }, + { (u8 *) &gBattleAnimSpriteSheet_122, 0x180, 10122 }, + { (u8 *) &gBattleAnimSpriteSheet_123, 0x600, 10123 }, + { (u8 *) &gBattleAnimSpriteSheet_124, 0x600, 10124 }, + { (u8 *) &gBattleAnimSpriteSheet_125, 0x200, 10125 }, + { (u8 *) &gBattleAnimSpriteSheet_126, 0x80, 10126 }, + { (u8 *) &gBattleAnimSpriteSheet_127, 0x200, 10127 }, + { (u8 *) &gBattleAnimSpriteSheet_128, 0x800, 10128 }, + { (u8 *) &gBattleAnimSpriteSheet_129, 0x80, 10129 }, + { (u8 *) &gBattleAnimSpriteSheet_130, 0xA00, 10130 }, + { (u8 *) &gBattleAnimSpriteSheet_131, 0x280, 10131 }, + { (u8 *) &gBattleAnimSpriteSheet_132, 0x280, 10132 }, + { (u8 *) &gBattleAnimSpriteSheet_133, 0x100, 10133 }, + { (u8 *) &gBattleAnimSpriteSheet_134, 0x200, 10134 }, + { (u8 *) &gBattleAnimSpriteSheet_135, 0x200, 10135 }, + { (u8 *) &gBattleAnimSpriteSheet_136, 0x20, 10136 }, + { (u8 *) &gBattleAnimSpriteSheet_137, 0xA00, 10137 }, + { (u8 *) &gBattleAnimSpriteSheet_138, 0x800, 10138 }, + { (u8 *) &gBattleAnimSpriteSheet_139, 0x800, 10139 }, + { (u8 *) &gBattleAnimSpriteSheet_140, 0xC0, 10140 }, + { (u8 *) &gBattleAnimSpriteSheet_141, 0x1C0, 10141 }, + { (u8 *) &gBattleAnimSpriteSheet_142, 0x100, 10142 }, + { (u8 *) &gBattleAnimSpriteSheet_143, 0x800, 10143 }, + { (u8 *) &gBattleAnimSpriteSheet_144, 0x200, 10144 }, + { (u8 *) &gBattleAnimSpriteSheet_145, 0x800, 10145 }, + { (u8 *) &gBattleAnimSpriteSheet_146, 0x180, 10146 }, + { (u8 *) &gBattleAnimSpriteSheet_147, 0x180, 10147 }, + { (u8 *) &gBattleAnimSpriteSheet_148, 0x200, 10148 }, + { (u8 *) &gBattleAnimSpriteSheet_149, 0x200, 10149 }, + { (u8 *) &gBattleAnimSpriteSheet_150, 0x180, 10150 }, + { (u8 *) &gBattleAnimSpriteSheet_151, 0x400, 10151 }, + { (u8 *) &gBattleAnimSpriteSheet_152, 0x80, 10152 }, + { (u8 *) &gBattleAnimSpriteSheet_153, 0x100, 10153 }, + { (u8 *) &gBattleAnimSpriteSheet_154, 0x100, 10154 }, + { (u8 *) &gBattleAnimSpriteSheet_155, 0x140, 10155 }, + { (u8 *) &gBattleAnimSpriteSheet_156, 0x800, 10156 }, + { (u8 *) &gBattleAnimSpriteSheet_157, 0x200, 10157 }, + { (u8 *) &gBattleAnimSpriteSheet_158, 0x100, 10158 }, + { (u8 *) &gBattleAnimSpriteSheet_159, 0xA0, 10159 }, + { (u8 *) &gBattleAnimSpriteSheet_160, 0x100, 10160 }, + { (u8 *) &gBattleAnimSpriteSheet_161, 0x80, 10161 }, + { (u8 *) &gBattleAnimSpriteSheet_162, 0x300, 10162 }, + { (u8 *) &gBattleAnimSpriteSheet_163, 0x100, 10163 }, + { (u8 *) &gBattleAnimSpriteSheet_163, 0x100, 10164 }, + { (u8 *) &gBattleAnimSpriteSheet_163, 0x100, 10165 }, + { (u8 *) &gBattleAnimSpriteSheet_166, 0x800, 10166 }, + { (u8 *) &gBattleAnimSpriteSheet_166, 0x800, 10167 }, + { (u8 *) &gBattleAnimSpriteSheet_166, 0x800, 10168 }, + { (u8 *) &gBattleAnimSpriteSheet_166, 0x800, 10169 }, + { (u8 *) &gBattleAnimSpriteSheet_166, 0x800, 10170 }, + { (u8 *) &gBattleAnimSpriteSheet_171, 0x80, 10171 }, + { (u8 *) &gBattleAnimSpriteSheet_144, 0x200, 10172 }, + { (u8 *) &gBattleAnimSpriteSheet_173, 0x200, 10173 }, + { (u8 *) &gBattleAnimSpriteSheet_174, 0x200, 10174 }, + { (u8 *) &gBattleAnimSpriteSheet_175, 0x80, 10175 }, + { (u8 *) &gBattleAnimSpriteSheet_176, 0x200, 10176 }, + { (u8 *) &gBattleAnimSpriteSheet_177, 0x500, 10177 }, + { (u8 *) &gBattleAnimSpriteSheet_178, 0x800, 10178 }, + { (u8 *) &gBattleAnimSpriteSheet_179, 0x400, 10179 }, + { (u8 *) &gBattleAnimSpriteSheet_180, 0x20, 10180 }, + { (u8 *) &gBattleAnimSpriteSheet_181, 0x800, 10181 }, + { (u8 *) &gBattleAnimSpriteSheet_182, 0x100, 10182 }, + { (u8 *) &gBattleAnimSpriteSheet_183, 0x800, 10183 }, + { (u8 *) &gBattleAnimSpriteSheet_184, 0x400, 10184 }, + { (u8 *) &gBattleAnimSpriteSheet_185, 0xA00, 10185 }, + { (u8 *) &gBattleAnimSpriteSheet_186, 0x1000, 10186 }, + { (u8 *) &gBattleAnimSpriteSheet_187, 0x800, 10187 }, + { (u8 *) &gBattleAnimSpriteSheet_188, 0x400, 10188 }, + { (u8 *) &gBattleAnimSpriteSheet_189, 0x200, 10189 }, + { (u8 *) &gBattleAnimSpriteSheet_190, 0x800, 10190 }, + { (u8 *) &gBattleAnimSpriteSheet_191, 0x800, 10191 }, + { (u8 *) &gBattleAnimSpriteSheet_192, 0x800, 10192 }, + { (u8 *) &gBattleAnimSpriteSheet_193, 0x200, 10193 }, + { (u8 *) &gBattleAnimSpriteSheet_194, 0x800, 10194 }, + { (u8 *) &gBattleAnimSpriteSheet_195, 0x200, 10195 }, + { (u8 *) &gBattleAnimSpriteSheet_196, 0x800, 10196 }, + { (u8 *) &gBattleAnimSpriteSheet_197, 0x200, 10197 }, + { (u8 *) &gBattleAnimSpriteSheet_198, 0x800, 10198 }, + { (u8 *) &gBattleAnimSpriteSheet_199, 0x400, 10199 }, + { (u8 *) &gBattleAnimSpriteSheet_200, 0x200, 10200 }, + { (u8 *) &gBattleAnimSpriteSheet_201, 0xA80, 10201 }, + { (u8 *) &gBattleAnimSpriteSheet_202, 0x600, 10202 }, + { (u8 *) &gBattleAnimSpriteSheet_203, 0x800, 10203 }, + { (u8 *) &gBattleAnimSpriteSheet_204, 0x200, 10204 }, + { (u8 *) &gBattleAnimSpriteSheet_205, 0x600, 10205 }, + { (u8 *) &gBattleAnimSpriteSheet_206, 0x800, 10206 }, + { (u8 *) &gBattleAnimSpriteSheet_207, 0x180, 10207 }, + { (u8 *) &gBattleAnimSpriteSheet_208, 0x800, 10208 }, + { (u8 *) &gBattleAnimSpriteSheet_209, 0x800, 10209 }, + { (u8 *) &gBattleAnimSpriteSheet_210, 0x80, 10210 }, + { (u8 *) &gBattleAnimSpriteSheet_211, 0x80, 10211 }, + { (u8 *) &gBattleAnimSpriteSheet_212, 0x800, 10212 }, + { (u8 *) &gBattleAnimSpriteSheet_213, 0x800, 10213 }, + { (u8 *) &gBattleAnimSpriteSheet_214, 0x600, 10214 }, + { (u8 *) &gBattleAnimSpriteSheet_215, 0x600, 10215 }, + { (u8 *) &gBattleAnimSpriteSheet_210, 0x80, 10216 }, + { (u8 *) &gBattleAnimSpriteSheet_217, 0x80, 10217 }, + { (u8 *) &gBattleAnimSpriteSheet_218, 0x180, 10218 }, + { (u8 *) &gBattleAnimSpriteSheet_210, 0x80, 10219 }, + { (u8 *) &gBattleAnimSpriteSheet_220, 0x200, 10220 }, + { (u8 *) &gBattleAnimSpriteSheet_221, 0x400, 10221 }, + { (u8 *) &gBattleAnimSpriteSheet_222, 0xA00, 10222 }, + { (u8 *) &gBattleAnimSpriteSheet_223, 0x800, 10223 }, + { (u8 *) &gBattleAnimSpriteSheet_224, 0x200, 10224 }, + { (u8 *) &gBattleAnimSpriteSheet_225, 0x400, 10225 }, + { (u8 *) &gBattleAnimSpriteSheet_226, 0x80, 10226 }, + { (u8 *) &gBattleAnimSpriteSheet_227, 0x800, 10227 }, + { (u8 *) &gBattleAnimSpriteSheet_228, 0x200, 10228 }, + { (u8 *) &gBattleAnimSpriteSheet_229, 0x300, 10229 }, + { (u8 *) &gBattleAnimSpriteSheet_230, 0x800, 10230 }, + { (u8 *) &gBattleAnimSpriteSheet_231, 0x380, 10231 }, + { (u8 *) &gBattleAnimSpriteSheet_232, 0x800, 10232 }, + { (u8 *) &gBattleAnimSpriteSheet_233, 0xC0, 10233 }, + { (u8 *) &gBattleAnimSpriteSheet_234, 0x800, 10234 }, + { (u8 *) &gBattleAnimSpriteSheet_235, 0x60, 10235 }, + { (u8 *) &gBattleAnimSpriteSheet_235, 0x60, 10236 }, + { (u8 *) &gBattleAnimSpriteSheet_235, 0x60, 10237 }, + { (u8 *) &gBattleAnimSpriteSheet_238, 0x80, 10238 }, + { (u8 *) &gBattleAnimSpriteSheet_239, 0x180, 10239 }, + { (u8 *) &gBattleAnimSpriteSheet_240, 0x180, 10240 }, + { (u8 *) &gBattleAnimSpriteSheet_241, 0x200, 10241 }, + { (u8 *) &gBattleAnimSpriteSheet_242, 0x200, 10242 }, + { (u8 *) &gBattleAnimSpriteSheet_243, 0x20, 10243 }, + { (u8 *) &gBattleAnimSpriteSheet_244, 0x400, 10244 }, + { (u8 *) &gBattleAnimSpriteSheet_245, 0x600, 10245 }, + { (u8 *) &gBattleAnimSpriteSheet_246, 0x1000, 10246 }, + { (u8 *) &gBattleAnimSpriteSheet_247, 0x400, 10247 }, + { (u8 *) &gBattleAnimSpriteSheet_248, 0x20, 10248 }, + { (u8 *) &gBattleAnimSpriteSheet_249, 0x80, 10249 }, + { (u8 *) &gBattleAnimSpriteSheet_250, 0x800, 10250 }, + { (u8 *) &gBattleAnimSpriteSheet_251, 0x80, 10251 }, + { (u8 *) &gBattleAnimSpriteSheet_252, 0x200, 10252 }, + { (u8 *) &gBattleAnimSpriteSheet_253, 0x400, 10253 }, + { (u8 *) &gBattleAnimSpriteSheet_254, 0x200, 10254 }, + { (u8 *) &gBattleAnimSpriteSheet_255, 0x200, 10255 }, + { (u8 *) &gBattleAnimSpriteSheet_256, 0x800, 10256 }, + { (u8 *) &gBattleAnimSpriteSheet_257, 0x280, 10257 }, + { (u8 *) &gBattleAnimSpriteSheet_258, 0x200, 10258 }, + { (u8 *) &gBattleAnimSpriteSheet_149, 0x200, 10259 }, + { (u8 *) &gBattleAnimSpriteSheet_260, 0x400, 10260 }, + { (u8 *) &gBattleAnimSpriteSheet_261, 0x200, 10261 }, + { (u8 *) &gBattleAnimSpriteSheet_262, 0x200, 10262 }, + { (u8 *) &gBattleAnimSpriteSheet_263, 0x80, 10263 }, + { (u8 *) &gBattleAnimSpriteSheet_264, 0x20, 10264 }, + { (u8 *) &gBattleAnimSpriteSheet_264, 0x20, 10265 }, + { (u8 *) &gBattleAnimSpriteSheet_266, 0x80, 10266 }, + { (u8 *) &gBattleAnimSpriteSheet_212, 0x800, 10267 }, + { (u8 *) &gBattleAnimSpriteSheet_264, 0x20, 10268 }, + { (u8 *) &gBattleAnimSpriteSheet_269, 0x80, 10269 }, + { (u8 *) &gBattleAnimSpriteSheet_270, 0x400, 10270 }, + { (u8 *) &gBattleAnimSpriteSheet_271, 0x80, 10271 }, + { (u8 *) &gBattleAnimSpriteSheet_272, 0x800, 10272 }, + { (u8 *) &gBattleAnimSpriteSheet_273, 0x20, 10273 }, + { (u8 *) &gBattleAnimSpriteSheet_274, 0x800, 10274 }, + { (u8 *) &gBattleAnimSpriteSheet_275, 0x800, 10275 }, + { (u8 *) &gBattleAnimSpriteSheet_276, 0x800, 10276 }, + { (u8 *) &gBattleAnimSpriteSheet_277, 0x1000, 10277 }, + { (u8 *) &gBattleAnimSpriteSheet_278, 0x800, 10278 }, + { (u8 *) &gBattleAnimSpriteSheet_279, 0xA0, 10279 }, + { (u8 *) &gBattleAnimSpriteSheet_280, 0x800, 10280 }, + { (u8 *) &gBattleAnimSpriteSheet_281, 0x200, 10281 }, + { (u8 *) &gBattleAnimSpriteSheet_282, 0x600, 10282 }, + { (u8 *) &gBattleAnimSpriteSheet_283, 0x200, 10283 }, + { (u8 *) &gBattleAnimSpriteSheet_284, 0x800, 10284 }, + { (u8 *) &gBattleAnimSpriteSheet_285, 0x200, 10285 }, + { (u8 *) &gBattleAnimSpriteSheet_183, 0x800, 10286 }, + { (u8 *) &gBattleAnimSpriteSheet_056, 0x1000, 10287 }, + { (u8 *) &gBattleAnimSpriteSheet_163, 0x100, 10288 }, +}; + +const struct CompressedSpritePalette gBattleAnimPaletteTable[] = +{ + { (u8 *) &gBattleAnimSpritePalette_000, 10000 }, + { (u8 *) &gBattleAnimSpritePalette_001, 10001 }, + { (u8 *) &gBattleAnimSpritePalette_002, 10002 }, + { (u8 *) &gBattleAnimSpritePalette_003, 10003 }, + { (u8 *) &gBattleAnimSpritePalette_004, 10004 }, + { (u8 *) &gBattleAnimSpritePalette_005, 10005 }, + { (u8 *) &gBattleAnimSpritePalette_006, 10006 }, + { (u8 *) &gBattleAnimSpritePalette_007, 10007 }, + { (u8 *) &gBattleAnimSpritePalette_008, 10008 }, + { (u8 *) &gBattleAnimSpritePalette_009, 10009 }, + { (u8 *) &gBattleAnimSpritePalette_010, 10010 }, + { (u8 *) &gBattleAnimSpritePalette_011, 10011 }, + { (u8 *) &gBattleAnimSpritePalette_012, 10012 }, + { (u8 *) &gBattleAnimSpritePalette_013, 10013 }, + { (u8 *) &gBattleAnimSpritePalette_014, 10014 }, + { (u8 *) &gBattleAnimSpritePalette_015, 10015 }, + { (u8 *) &gBattleAnimSpritePalette_016, 10016 }, + { (u8 *) &gBattleAnimSpritePalette_016, 10017 }, + { (u8 *) &gBattleAnimSpritePalette_018, 10018 }, + { (u8 *) &gBattleAnimSpritePalette_019, 10019 }, + { (u8 *) &gBattleAnimSpritePalette_020, 10020 }, + { (u8 *) &gBattleAnimSpritePalette_021, 10021 }, + { (u8 *) &gBattleAnimSpritePalette_022, 10022 }, + { (u8 *) &gBattleAnimSpritePalette_023, 10023 }, + { (u8 *) &gBattleAnimSpritePalette_024, 10024 }, + { (u8 *) &gBattleAnimSpritePalette_025, 10025 }, + { (u8 *) &gBattleAnimSpritePalette_026, 10026 }, + { (u8 *) &gBattleAnimSpritePalette_027, 10027 }, + { (u8 *) &gBattleAnimSpritePalette_028, 10028 }, + { (u8 *) &gBattleAnimSpritePalette_029, 10029 }, + { (u8 *) &gBattleAnimSpritePalette_030, 10030 }, + { (u8 *) &gBattleAnimSpritePalette_031, 10031 }, + { (u8 *) &gBattleAnimSpritePalette_032, 10032 }, + { (u8 *) &gBattleAnimSpritePalette_033, 10033 }, + { (u8 *) &gBattleAnimSpritePalette_033, 10034 }, + { (u8 *) &gBattleAnimSpritePalette_033, 10035 }, + { (u8 *) &gBattleAnimSpritePalette_036, 10036 }, + { (u8 *) &gBattleAnimSpritePalette_036, 10037 }, + { (u8 *) &gBattleAnimSpritePalette_038, 10038 }, + { (u8 *) &gBattleAnimSpritePalette_039, 10039 }, + { (u8 *) &gBattleAnimSpritePalette_038, 10040 }, + { (u8 *) &gBattleAnimSpritePalette_038, 10041 }, + { (u8 *) &gBattleAnimSpritePalette_042, 10042 }, + { (u8 *) &gBattleAnimSpritePalette_043, 10043 }, + { (u8 *) &gBattleAnimSpritePalette_044, 10044 }, + { (u8 *) &gBattleAnimSpritePalette_045, 10045 }, + { (u8 *) &gBattleAnimSpritePalette_046, 10046 }, + { (u8 *) &gBattleAnimSpritePalette_047, 10046 }, + { (u8 *) &gBattleAnimSpritePalette_048, 10048 }, + { (u8 *) &gBattleAnimSpritePalette_049, 10049 }, + { (u8 *) &gBattleAnimSpritePalette_050, 10050 }, + { (u8 *) &gBattleAnimSpritePalette_050, 10051 }, + { (u8 *) &gBattleAnimSpritePalette_050, 10052 }, + { (u8 *) &gBattleAnimSpritePalette_026, 10053 }, + { (u8 *) &gBattleAnimSpritePalette_054, 10054 }, + { (u8 *) &gBattleAnimSpritePalette_050, 10055 }, + { (u8 *) &gBattleAnimSpritePalette_056, 10056 }, + { (u8 *) &gBattleAnimSpritePalette_057, 10057 }, + { (u8 *) &gBattleAnimSpritePalette_058, 10058 }, + { (u8 *) &gBattleAnimSpritePalette_059, 10059 }, + { (u8 *) &gBattleAnimSpritePalette_060, 10060 }, + { (u8 *) &gBattleAnimSpritePalette_061, 10061 }, + { (u8 *) &gBattleAnimSpritePalette_062, 10062 }, + { (u8 *) &gBattleAnimSpritePalette_063, 10063 }, + { (u8 *) &gBattleAnimSpritePalette_064, 10064 }, + { (u8 *) &gBattleAnimSpritePalette_065, 10065 }, + { (u8 *) &gBattleAnimSpritePalette_066, 10066 }, + { (u8 *) &gBattleAnimSpritePalette_067, 10067 }, + { (u8 *) &gBattleAnimSpritePalette_068, 10068 }, + { (u8 *) &gBattleAnimSpritePalette_065, 10069 }, + { (u8 *) &gBattleAnimSpritePalette_070, 10070 }, + { (u8 *) &gBattleAnimSpritePalette_070, 10071 }, + { (u8 *) &gBattleAnimSpritePalette_072, 10072 }, + { (u8 *) &gBattleAnimSpritePalette_073, 10073 }, + { (u8 *) &gBattleAnimSpritePalette_074, 10074 }, + { (u8 *) &gBattleAnimSpritePalette_075, 10075 }, + { (u8 *) &gBattleAnimSpritePalette_076, 10076 }, + { (u8 *) &gBattleAnimSpritePalette_076, 10077 }, + { (u8 *) &gBattleAnimSpritePalette_078, 10078 }, + { (u8 *) &gBattleAnimSpritePalette_078, 10079 }, + { (u8 *) &gBattleAnimSpritePalette_080, 10080 }, + { (u8 *) &gBattleAnimSpritePalette_081, 10081 }, + { (u8 *) &gBattleAnimSpritePalette_082, 10082 }, + { (u8 *) &gBattleAnimSpritePalette_083, 10083 }, + { (u8 *) &gBattleAnimSpritePalette_084, 10084 }, + { (u8 *) &gBattleAnimSpritePalette_085, 10085 }, + { (u8 *) &gBattleAnimSpritePalette_086, 10086 }, + { (u8 *) &gBattleAnimSpritePalette_087, 10087 }, + { (u8 *) &gBattleAnimSpritePalette_088, 10088 }, + { (u8 *) &gBattleAnimSpritePalette_089, 10089 }, + { (u8 *) &gBattleAnimSpritePalette_090, 10090 }, + { (u8 *) &gBattleAnimSpritePalette_091, 10091 }, + { (u8 *) &gBattleAnimSpritePalette_092, 10092 }, + { (u8 *) &gBattleAnimSpritePalette_093, 10093 }, + { (u8 *) &gBattleAnimSpritePalette_094, 10094 }, + { (u8 *) &gBattleAnimSpritePalette_095, 10095 }, + { (u8 *) &gBattleAnimSpritePalette_096, 10096 }, + { (u8 *) &gBattleAnimSpritePalette_097, 10097 }, + { (u8 *) &gBattleAnimSpritePalette_094, 10098 }, + { (u8 *) &gBattleAnimSpritePalette_099, 10099 }, + { (u8 *) &gBattleAnimSpritePalette_100, 10100 }, + { (u8 *) &gBattleAnimSpritePalette_101, 10101 }, + { (u8 *) &gBattleAnimSpritePalette_101, 10102 }, + { (u8 *) &gBattleAnimSpritePalette_103, 10103 }, + { (u8 *) &gBattleAnimSpritePalette_104, 10104 }, + { (u8 *) &gBattleAnimSpritePalette_105, 10105 }, + { (u8 *) &gBattleAnimSpritePalette_105, 10106 }, + { (u8 *) &gBattleAnimSpritePalette_107, 10107 }, + { (u8 *) &gBattleAnimSpritePalette_107, 10108 }, + { (u8 *) &gBattleAnimSpritePalette_109, 10109 }, + { (u8 *) &gBattleAnimSpritePalette_109, 10110 }, + { (u8 *) &gBattleAnimSpritePalette_111, 10111 }, + { (u8 *) &gBattleAnimSpritePalette_112, 10112 }, + { (u8 *) &gBattleAnimSpritePalette_113, 10113 }, + { (u8 *) &gBattleAnimSpritePalette_114, 10114 }, + { (u8 *) &gBattleAnimSpritePalette_115, 10115 }, + { (u8 *) &gBattleAnimSpritePalette_116, 10116 }, + { (u8 *) &gBattleAnimSpritePalette_117, 10117 }, + { (u8 *) &gBattleAnimSpritePalette_118, 10118 }, + { (u8 *) &gBattleAnimSpritePalette_119, 10119 }, + { (u8 *) &gBattleAnimSpritePalette_120, 10120 }, + { (u8 *) &gBattleAnimSpritePalette_121, 10121 }, + { (u8 *) &gBattleAnimSpritePalette_122, 10122 }, + { (u8 *) &gBattleAnimSpritePalette_122, 10123 }, + { (u8 *) &gBattleAnimSpritePalette_124, 10124 }, + { (u8 *) &gBattleAnimSpritePalette_125, 10125 }, + { (u8 *) &gBattleAnimSpritePalette_126, 10126 }, + { (u8 *) &gBattleAnimSpritePalette_127, 10127 }, + { (u8 *) &gBattleAnimSpritePalette_128, 10128 }, + { (u8 *) &gBattleAnimSpritePalette_128, 10129 }, + { (u8 *) &gBattleAnimSpritePalette_130, 10130 }, + { (u8 *) &gBattleAnimSpritePalette_130, 10131 }, + { (u8 *) &gBattleAnimSpritePalette_132, 10132 }, + { (u8 *) &gBattleAnimSpritePalette_133, 10133 }, + { (u8 *) &gBattleAnimSpritePalette_133, 10134 }, + { (u8 *) &gBattleAnimSpritePalette_135, 10135 }, + { (u8 *) &gBattleAnimSpritePalette_136, 10136 }, + { (u8 *) &gBattleAnimSpritePalette_135, 10137 }, + { (u8 *) &gBattleAnimSpritePalette_135, 10138 }, + { (u8 *) &gBattleAnimSpritePalette_139, 10139 }, + { (u8 *) &gBattleAnimSpritePalette_140, 10140 }, + { (u8 *) &gBattleAnimSpritePalette_141, 10141 }, + { (u8 *) &gBattleAnimSpritePalette_141, 10142 }, + { (u8 *) &gBattleAnimSpritePalette_143, 10143 }, + { (u8 *) &gBattleAnimSpritePalette_144, 10144 }, + { (u8 *) &gBattleAnimSpritePalette_139, 10145 }, + { (u8 *) &gBattleAnimSpritePalette_115, 10146 }, + { (u8 *) &gBattleAnimSpritePalette_147, 10147 }, + { (u8 *) &gBattleAnimSpritePalette_148, 10148 }, + { (u8 *) &gBattleAnimSpritePalette_148, 10149 }, + { (u8 *) &gBattleAnimSpritePalette_150, 10150 }, + { (u8 *) &gBattleAnimSpritePalette_150, 10151 }, + { (u8 *) &gBattleAnimSpritePalette_152, 10152 }, + { (u8 *) &gBattleAnimSpritePalette_153, 10153 }, + { (u8 *) &gBattleAnimSpritePalette_154, 10154 }, + { (u8 *) &gBattleAnimSpritePalette_155, 10155 }, + { (u8 *) &gBattleAnimSpritePalette_156, 10156 }, + { (u8 *) &gBattleAnimSpritePalette_157, 10157 }, + { (u8 *) &gBattleAnimSpritePalette_158, 10158 }, + { (u8 *) &gBattleAnimSpritePalette_159, 10159 }, + { (u8 *) &gBattleAnimSpritePalette_160, 10160 }, + { (u8 *) &gBattleAnimSpritePalette_161, 10161 }, + { (u8 *) &gBattleAnimSpritePalette_162, 10162 }, + { (u8 *) &gBattleAnimSpritePalette_163, 10163 }, + { (u8 *) &gBattleAnimSpritePalette_164, 10164 }, + { (u8 *) &gBattleAnimSpritePalette_165, 10165 }, + { (u8 *) &gBattleAnimSpritePalette_166, 10166 }, + { (u8 *) &gBattleAnimSpritePalette_167, 10167 }, + { (u8 *) &gBattleAnimSpritePalette_168, 10168 }, + { (u8 *) &gBattleAnimSpritePalette_169, 10169 }, + { (u8 *) &gBattleAnimSpritePalette_170, 10170 }, + { (u8 *) &gBattleAnimSpritePalette_171, 10171 }, + { (u8 *) &gBattleAnimSpritePalette_172, 10172 }, + { (u8 *) &gBattleAnimSpritePalette_001, 10173 }, + { (u8 *) &gBattleAnimSpritePalette_174, 10174 }, + { (u8 *) &gBattleAnimSpritePalette_175, 10175 }, + { (u8 *) &gBattleAnimSpritePalette_176, 10176 }, + { (u8 *) &gBattleAnimSpritePalette_177, 10177 }, + { (u8 *) &gBattleAnimSpritePalette_178, 10178 }, + { (u8 *) &gBattleAnimSpritePalette_179, 10179 }, + { (u8 *) &gBattleAnimSpritePalette_179, 10180 }, + { (u8 *) &gBattleAnimSpritePalette_179, 10181 }, + { (u8 *) &gBattleAnimSpritePalette_182, 10182 }, + { (u8 *) &gBattleAnimSpritePalette_183, 10183 }, + { (u8 *) &gBattleAnimSpritePalette_184, 10184 }, + { (u8 *) &gBattleAnimSpritePalette_185, 10185 }, + { (u8 *) &gBattleAnimSpritePalette_186, 10186 }, + { (u8 *) &gBattleAnimSpritePalette_187, 10187 }, + { (u8 *) &gBattleAnimSpritePalette_188, 10188 }, + { (u8 *) &gBattleAnimSpritePalette_189, 10189 }, + { (u8 *) &gBattleAnimSpritePalette_190, 10190 }, + { (u8 *) &gBattleAnimSpritePalette_191, 10191 }, + { (u8 *) &gBattleAnimSpritePalette_192, 10192 }, + { (u8 *) &gBattleAnimSpritePalette_193, 10193 }, + { (u8 *) &gBattleAnimSpritePalette_194, 10194 }, + { (u8 *) &gBattleAnimSpritePalette_195, 10195 }, + { (u8 *) &gBattleAnimSpritePalette_196, 10196 }, + { (u8 *) &gBattleAnimSpritePalette_197, 10197 }, + { (u8 *) &gBattleAnimSpritePalette_198, 10198 }, + { (u8 *) &gBattleAnimSpritePalette_199, 10199 }, + { (u8 *) &gBattleAnimSpritePalette_200, 10200 }, + { (u8 *) &gBattleAnimSpritePalette_201, 10201 }, + { (u8 *) &gBattleAnimSpritePalette_202, 10202 }, + { (u8 *) &gBattleAnimSpritePalette_203, 10203 }, + { (u8 *) &gBattleAnimSpritePalette_204, 10204 }, + { (u8 *) &gBattleAnimSpritePalette_205, 10205 }, + { (u8 *) &gBattleAnimSpritePalette_206, 10206 }, + { (u8 *) &gBattleAnimSpritePalette_207, 10207 }, + { (u8 *) &gBattleAnimSpritePalette_167, 10208 }, + { (u8 *) &gBattleAnimSpritePalette_209, 10209 }, + { (u8 *) &gBattleAnimSpritePalette_210, 10210 }, + { (u8 *) &gBattleAnimSpritePalette_211, 10211 }, + { (u8 *) &gBattleAnimSpritePalette_211, 10212 }, + { (u8 *) &gBattleAnimSpritePalette_211, 10213 }, + { (u8 *) &gBattleAnimSpritePalette_064, 10214 }, + { (u8 *) &gBattleAnimSpritePalette_215, 10215 }, + { (u8 *) &gBattleAnimSpritePalette_216, 10216 }, + { (u8 *) &gBattleAnimSpritePalette_217, 10217 }, + { (u8 *) &gBattleAnimSpritePalette_218, 10218 }, + { (u8 *) &gBattleAnimSpritePalette_219, 10219 }, + { (u8 *) &gBattleAnimSpritePalette_220, 10220 }, + { (u8 *) &gBattleAnimSpritePalette_221, 10221 }, + { (u8 *) &gBattleAnimSpritePalette_222, 10222 }, + { (u8 *) &gBattleAnimSpritePalette_223, 10223 }, + { (u8 *) &gBattleAnimSpritePalette_224, 10224 }, + { (u8 *) &gBattleAnimSpritePalette_225, 10225 }, + { (u8 *) &gBattleAnimSpritePalette_226, 10226 }, + { (u8 *) &gBattleAnimSpritePalette_226, 10227 }, + { (u8 *) &gBattleAnimSpritePalette_228, 10228 }, + { (u8 *) &gBattleAnimSpritePalette_229, 10229 }, + { (u8 *) &gBattleAnimSpritePalette_230, 10230 }, + { (u8 *) &gBattleAnimSpritePalette_231, 10231 }, + { (u8 *) &gBattleAnimSpritePalette_231, 10232 }, + { (u8 *) &gBattleAnimSpritePalette_233, 10233 }, + { (u8 *) &gBattleAnimSpritePalette_234, 10234 }, + { (u8 *) &gBattleAnimSpritePalette_235, 10235 }, + { (u8 *) &gBattleAnimSpritePalette_236, 10236 }, + { (u8 *) &gBattleAnimSpritePalette_237, 10237 }, + { (u8 *) &gBattleAnimSpritePalette_238, 10238 }, + { (u8 *) &gBattleAnimSpritePalette_239, 10239 }, + { (u8 *) &gBattleAnimSpritePalette_240, 10240 }, + { (u8 *) &gBattleAnimSpritePalette_241, 10241 }, + { (u8 *) &gBattleAnimSpritePalette_242, 10242 }, + { (u8 *) &gBattleAnimSpritePalette_243, 10243 }, + { (u8 *) &gBattleAnimSpritePalette_244, 10244 }, + { (u8 *) &gBattleAnimSpritePalette_245, 10245 }, + { (u8 *) &gBattleAnimSpritePalette_245, 10246 }, + { (u8 *) &gBattleAnimSpritePalette_064, 10247 }, + { (u8 *) &gBattleAnimSpritePalette_248, 10248 }, + { (u8 *) &gBattleAnimSpritePalette_249, 10249 }, + { (u8 *) &gBattleAnimSpritePalette_249, 10250 }, + { (u8 *) &gBattleAnimSpritePalette_251, 10251 }, + { (u8 *) &gBattleAnimSpritePalette_252, 10252 }, + { (u8 *) &gBattleAnimSpritePalette_253, 10253 }, + { (u8 *) &gBattleAnimSpritePalette_254, 10254 }, + { (u8 *) &gBattleAnimSpritePalette_255, 10255 }, + { (u8 *) &gBattleAnimSpritePalette_256, 10256 }, + { (u8 *) &gBattleAnimSpritePalette_257, 10257 }, + { (u8 *) &gBattleAnimSpritePalette_258, 10258 }, + { (u8 *) &gBattleAnimSpritePalette_259, 10259 }, + { (u8 *) &gBattleAnimSpritePalette_260, 10260 }, + { (u8 *) &gBattleAnimSpritePalette_261, 10261 }, + { (u8 *) &gBattleAnimSpritePalette_262, 10262 }, + { (u8 *) &gBattleAnimSpritePalette_263, 10263 }, + { (u8 *) &gBattleAnimSpritePalette_264, 10264 }, + { (u8 *) &gBattleAnimSpritePalette_265, 10265 }, + { (u8 *) &gBattleAnimSpritePalette_266, 10266 }, + { (u8 *) &gBattleAnimSpritePalette_267, 10267 }, + { (u8 *) &gBattleAnimSpritePalette_268, 10268 }, + { (u8 *) &gBattleAnimSpritePalette_269, 10269 }, + { (u8 *) &gBattleAnimSpritePalette_270, 10270 }, + { (u8 *) &gBattleAnimSpritePalette_271, 10271 }, + { (u8 *) &gBattleAnimSpritePalette_272, 10272 }, + { (u8 *) &gBattleAnimSpritePalette_272, 10273 }, + { (u8 *) &gBattleAnimSpritePalette_274, 10274 }, + { (u8 *) &gBattleAnimSpritePalette_274, 10275 }, + { (u8 *) &gBattleAnimSpritePalette_274, 10276 }, + { (u8 *) &gBattleAnimSpritePalette_277, 10277 }, + { (u8 *) &gBattleAnimSpritePalette_278, 10278 }, + { (u8 *) &gBattleAnimSpritePalette_279, 10279 }, + { (u8 *) &gBattleAnimSpritePalette_280, 10280 }, + { (u8 *) &gBattleAnimSpritePalette_281, 10281 }, + { (u8 *) &gBattleAnimSpritePalette_282, 10282 }, + { (u8 *) &gBattleAnimSpritePalette_283, 10283 }, + { (u8 *) &gBattleAnimSpritePalette_284, 10284 }, + { (u8 *) &gBattleAnimSpritePalette_285, 10285 }, + { (u8 *) &gBattleAnimSpritePalette_286, 10286 }, + { (u8 *) &gBattleAnimSpritePalette_287, 10287 }, + { (u8 *) &gBattleAnimSpritePalette_288, 10288 }, +}; + +const struct BattleAnimBackground gBattleAnimBackgroundTable[] = +{ + &gBattleAnimBackgroundImage_00, &gBattleAnimBackgroundPalette_00, &gBattleAnimBackgroundTilemap_00, + &gBattleAnimBackgroundImage_00, &gBattleAnimBackgroundPalette_00, &gBattleAnimBackgroundTilemap_00, + &gBattleAnimBackgroundImage_02, &gBattleAnimBackgroundPalette_02, &gBattleAnimBackgroundTilemap_02, + &gBattleAnimBackgroundImage_03, &gBattleAnimBackgroundPalette_03, &gBattleAnimBackgroundTilemap_03, + &gBattleAnimBackgroundImage_04, &gBattleAnimBackgroundPalette_04, &gBattleAnimBackgroundTilemap_04, + &gBattleAnimBackgroundImage_04, &gBattleAnimBackgroundPalette_04, &gBattleAnimBackgroundTilemap_05, + &gBattleAnimBackgroundImage_04, &gBattleAnimBackgroundPalette_04, &gBattleAnimBackgroundTilemap_06, + &gBattleAnimBackgroundImage_07, &gBattleAnimBackgroundPalette_07, &gBattleAnimBackgroundTilemap_07, + &gBattleAnimBackgroundImage_07, &gBattleAnimBackgroundPalette_07, &gBattleAnimBackgroundTilemap_08, + &gBattleAnimBackgroundImage_09, &gBattleAnimBackgroundPalette_09, &gBattleAnimBackgroundTilemap_09, + &gBattleAnimBackgroundImage_09, &gBattleAnimBackgroundPalette_09, &gBattleAnimBackgroundTilemap_10, + &gBattleAnimBackgroundImage_11, &gBattleAnimBackgroundPalette_11, &gBattleAnimBackgroundTilemap_11, + &gBattleAnimBackgroundImage_12, &gBattleAnimBackgroundPalette_12, &gBattleAnimBackgroundTilemap_12, + &gBattleAnimBackgroundImage_12, &gBattleAnimBackgroundPalette_12, &gBattleAnimBackgroundTilemap_13, + &gBattleAnimBackgroundImage_12, &gBattleAnimBackgroundPalette_12, &gBattleAnimBackgroundTilemap_14, + &gBattleAnimBackgroundImage_15, &gBattleAnimBackgroundPalette_15, &gBattleAnimBackgroundTilemap_15, + &gBattleAnimBackgroundImage_16, &gBattleAnimBackgroundPalette_16, &gBattleAnimBackgroundTilemap_16, + &gBattleAnimBackgroundImage_17, &gBattleAnimBackgroundPalette_17, &gBattleAnimBackgroundTilemap_17, + &gBattleAnimBackgroundImage_07, &gBattleAnimBackgroundPalette_18, &gBattleAnimBackgroundTilemap_07, + &gBattleAnimBackgroundImage_07, &gBattleAnimBackgroundPalette_18, &gBattleAnimBackgroundTilemap_08, + &gBattleAnimBackgroundImage_20, &gBattleAnimBackgroundPalette_20, &gBattleAnimBackgroundTilemap_20, + &gBattleAnimBackgroundImage_21, &gBattleAnimBackgroundPalette_21, &gBattleAnimBackgroundTilemap_21, + &gBattleAnimBackgroundImage_09, &gBattleAnimBackgroundPalette_22, &gBattleAnimBackgroundTilemap_09, + &gBattleAnimBackgroundImage_09, &gBattleAnimBackgroundPalette_22, &gBattleAnimBackgroundTilemap_10, + &gBattleAnimBackgroundImage_04, &gBattleAnimBackgroundPalette_24, &gBattleAnimBackgroundTilemap_04, + &gBattleAnimBackgroundImage_04, &gBattleAnimBackgroundPalette_24, &gBattleAnimBackgroundTilemap_05, + &gBattleAnimBackgroundImage_04, &gBattleAnimBackgroundPalette_24, &gBattleAnimBackgroundTilemap_06, +}; + extern u16 gBattlePartyID[4]; extern u8 gObjectBankIDs[]; extern u8 gBankAttacker; @@ -43,7 +1309,7 @@ EWRAM_DATA u16 sAnimMoveIndex = 0; // set but unused. EWRAM_DATA u8 gAnimBankAttacker = 0; EWRAM_DATA u8 gAnimBankTarget = 0; EWRAM_DATA u16 gAnimSpeciesByBanks[4] = {0}; -EWRAM_DATA u8 gUnknown_0202F7D2 = 0; +EWRAM_DATA u8 gUnknown_0202F7D2 = 0; // some global pan variable extern u16 gBattle_BG1_Y; extern u16 gBattle_WIN1H; extern u16 gBattle_WIN0V; @@ -63,9 +1329,6 @@ extern struct MusicPlayerInfo gMPlay_SE2; extern const u16 gUnknown_081C7160[]; extern const u8 *const gBattleAnims_Moves[]; -extern const struct CompressedSpriteSheet gBattleAnimPicTable[]; -extern const struct CompressedSpritePalette gBattleAnimPaletteTable[]; -extern const struct BattleAnimBackground gBattleAnimBackgroundTable[]; static void RunAnimScriptCommand(void); static void ScriptCmd_loadspritegfx(void); @@ -647,36 +1910,19 @@ bool8 IsAnimBankSpriteVisible(u8 bank) void sub_8076034(u8 a, u8 b) { - volatile u8 pointlessZero; - u16 *addr2; u8 spriteId; if (b == 0) { + volatile u8 pointlessZero; struct UnknownStruct2 s; - u8 *addr; - u32 size; u8 r2; - u16 *addr3; sub_8078914(&s); - addr = s.unk0; - size = 0x2000; - while (1) - { - DmaFill32(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill32(3, 0, addr, size); - break; - } - } - pointlessZero = 0; - pointlessZero = 0; - addr2 = (void *)s.unk4; - DmaFill16(3, 0xFF, addr2, 0x1000); + DmaFill32Large(3, 0, s.unk0, 0x2000, 0x1000); + pointlessZero = 0; // is there a stubbed out Dma macro here that left the 0 load in? + pointlessZero = 0; // is there a stubbed out Dma macro here that left the 0 load in? + DmaFill16Defvars(3, 0xFF, (void *)s.unk4, 0x1000); REG_BG1CNT_BITFIELD.priority = 2; REG_BG1CNT_BITFIELD.screenSize = 1; @@ -693,8 +1939,7 @@ void sub_8076034(u8 a, u8 b) REG_BG1VOFS = gBattle_BG1_Y; LoadPalette(gPlttBufferUnfaded + 0x100 + a * 16, s.unk8 * 16, 32); - addr3 = (u16 *)PLTT + s.unk8 * 16; - DmaCopy32(3, gPlttBufferUnfaded + 0x100 + a * 16, addr3, 32); + DmaCopy32Defvars(3, gPlttBufferUnfaded + 0x100 + a * 16, (u16 *)PLTT + s.unk8 * 16, 32); if (IsContest() != 0) r2 = 0; @@ -706,27 +1951,12 @@ void sub_8076034(u8 a, u8 b) } else { - u8 *addr; - u32 size; - u16 *addr3; + volatile u8 pointlessZero; - addr = (void *)(VRAM + 0x6000); - size = 0x2000; - while (1) - { - DmaFill32(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill32(3, 0, addr, size); - break; - } - } - pointlessZero = 0; - pointlessZero = 0; - addr2 = (void *)(VRAM + 0xF000); - DmaFill32(3, 0, addr2, 0x800); + DmaFill32Large(3, 0, (void *)(VRAM + 0x6000), 0x2000, 0x1000); + pointlessZero = 0; // is there a stubbed out Dma macro here that left the 0 load in? + pointlessZero = 0; // is there a stubbed out Dma macro here that left the 0 load in? + DmaFill32Defvars(3, 0, (void *)(VRAM + 0xF000), 0x800); REG_BG2CNT_BITFIELD.priority = 2; REG_BG2CNT_BITFIELD.screenSize = 1; @@ -741,8 +1971,7 @@ void sub_8076034(u8 a, u8 b) REG_BG2VOFS = gBattle_BG2_Y; LoadPalette(gPlttBufferUnfaded + 0x100 + a * 16, 0x90, 32); - addr3 = (void *)(PLTT + 0x120); - DmaCopy32(3, gPlttBufferUnfaded + 0x100 + a * 16, addr3, 32); + DmaCopy32Defvars(3, gPlttBufferUnfaded + 0x100 + a * 16, (void *)(PLTT + 0x120), 32); sub_80E4EF8(0, 0, GetBankIdentity(a), 9, 0x6000, 0x1E, REG_BG2CNT_BITFIELD.charBaseBlock); } @@ -797,57 +2026,25 @@ void sub_80763FC(u16 a, u16 *b, u32 c, u8 d) void sub_8076464(u8 a) { - u8 *addr; - u32 size; volatile u8 pointlessZero; struct UnknownStruct2 s; sub_8078914(&s); if (a == 0 || IsContest() != 0) { - u16 *addr2; - - addr = s.unk0; - size = 0x2000; - while (1) - { - DmaFill32(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill32(3, 0, addr, size); - break; - } - } - pointlessZero = 0; - pointlessZero = 0; - addr2 = s.unk4; - DmaFill32(3, 0, addr2, 0x800); + DmaFill32Large(3, 0, s.unk0, 0x2000, 0x1000); + pointlessZero = 0; // is there a stubbed out Dma macro here that left the 0 load in? + pointlessZero = 0; // is there a stubbed out Dma macro here that left the 0 load in? + DmaFill32Defvars(3, 0, s.unk4, 0x800); gBattle_BG1_X = 0; gBattle_BG1_Y = 0; } else { - u16 *addr2; - - addr = (void *)(VRAM + 0x6000); - size = 0x2000; - while (1) - { - DmaFill32(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill32(3, 0, addr, size); - break; - } - } - pointlessZero = 0; - pointlessZero = 0; - addr2 = (void *)(VRAM + 0xF000); - DmaFill32(3, 0, addr2, 0x800); + DmaFill32Large(3, 0, (void *)(VRAM + 0x6000), 0x2000, 0x1000); + pointlessZero = 0; // is there a stubbed out Dma macro here that left the 0 load in? + pointlessZero = 0; // is there a stubbed out Dma macro here that left the 0 load in? + DmaFill32Defvars(3, 0, (void *)(VRAM + 0xF000), 0x800); gBattle_BG2_X = 0; gBattle_BG2_Y = 0; } @@ -867,25 +2064,15 @@ static void task_pA_ma0A_obj_to_bg_pal(u8 taskId) if (gTasks[taskId].data[5] == 0) { - u16 *src; - u16 *dst; - gBattle_BG1_X = x + gTasks[taskId].data[3]; gBattle_BG1_Y = y + gTasks[taskId].data[4]; - src = gPlttBufferFaded + 0x100 + palIndex * 16; - dst = gPlttBufferFaded + 0x100 + s.unk8 * 16 - 256; - DmaCopy32(3, src, dst, 32); + DmaCopy32Defvars(3, gPlttBufferFaded + 0x100 + palIndex * 16, gPlttBufferFaded + 0x100 + s.unk8 * 16 - 256, 32); } else { - u16 *src; - u16 *dst; - gBattle_BG2_X = x + gTasks[taskId].data[3]; gBattle_BG2_Y = y + gTasks[taskId].data[4]; - src = gPlttBufferFaded + 0x100 + palIndex * 16; - dst = gPlttBufferFaded + 0x100 - 112; - DmaCopy32(3, src, dst, 32); + DmaCopy32Defvars(3, gPlttBufferFaded + 0x100 + palIndex * 16, gPlttBufferFaded + 0x100 - 112, 32); } } @@ -1229,14 +2416,10 @@ static void LoadMoveBg(u16 bgId) if (IsContest()) { void *tilemap = gBattleAnimBackgroundTable[bgId].tilemap; - void *dmaSrc; - void *dmaDest; LZDecompressWram(tilemap, IsContest() ? EWRAM_14800 : EWRAM_18000); sub_80763FC(sub_80789BC(), IsContest() ? EWRAM_14800 : EWRAM_18000, 0x100, 0); - dmaSrc = IsContest() ? EWRAM_14800 : EWRAM_18000; - dmaDest = (void *)(VRAM + 0xD000); - DmaCopy32(3, dmaSrc, dmaDest, 0x800); + DmaCopy32Defvars(3, IsContest() ? EWRAM_14800 : EWRAM_18000, (void *)(VRAM + 0xD000), 0x800); LZDecompressVram(gBattleAnimBackgroundTable[bgId].image, (void *)(VRAM + 0x2000)); LoadCompressedPalette(gBattleAnimBackgroundTable[bgId].palette, sub_80789BC() * 16, 32); } @@ -1489,9 +2672,9 @@ s8 BattleAnimAdjustPanning2(s8 pan) return pan; } -s16 sub_8077104(s16 a) +s16 sub_8077104(s16 newPan, int oldPan) { - s16 var = a; + s16 var = newPan; if (var > 63) var = 63; diff --git a/src/battle/battle_anim_80A7E7C.c b/src/battle/battle_anim_80A7E7C.c index 3097f1a0e..f109333e3 100644 --- a/src/battle/battle_anim_80A7E7C.c +++ b/src/battle/battle_anim_80A7E7C.c @@ -20,17 +20,77 @@ static void sub_80A808C(u8 taskId); static void sub_80A81D8(u8 taskId); static void sub_80A8374(u8 taskId); static void sub_80A8488(u8 taskId); +static void sub_80A8530(struct Sprite *sprite); static void sub_80A85A4(struct Sprite *sprite); -void sub_80A8614(struct Sprite* sprite); +static void sub_80A85C8(struct Sprite *sprite); +static void sub_80A8614(struct Sprite* sprite); +static void sub_80A8638(struct Sprite *sprite); static void sub_80A86F4(struct Sprite *sprite); +static void sub_80A8764(struct Sprite *sprite); +static void sub_80A8818(struct Sprite *sprite); static void sub_80A88F0(struct Sprite *sprite); static void sub_80A89B4(u8 taskId); static void sub_80A8A18(u8 taskId); static void sub_80A8C0C(u8 taskId); static void sub_80A8D8C(u8 taskId); -void sub_80A8FD8(u8 taskId); +static void sub_80A8FD8(u8 taskId); static void sub_80A913C(u8 taskId); +const struct SpriteTemplate gBattleAnimSpriteTemplate_83C1FB0 = +{ + .tileTag = 0, + .paletteTag = 0, + .oam = &gDummyOamData, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80A8530, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83C1FC8 = +{ + .tileTag = 0, + .paletteTag = 0, + .oam = &gDummyOamData, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80A85C8, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83C1FE0 = +{ + .tileTag = 0, + .paletteTag = 0, + .oam = &gDummyOamData, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80A8638, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83C1FF8 = +{ + .tileTag = 0, + .paletteTag = 0, + .oam = &gDummyOamData, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80A8764, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83C2010 = +{ + .tileTag = 0, + .paletteTag = 0, + .oam = &gDummyOamData, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80A8818, +}; + void sub_80A7E7C(u8 taskId) { u8 sprite; @@ -108,17 +168,17 @@ void sub_80A7FA0(u8 taskId) switch (gBattleAnimArgs[0]) { case 4: - side = GetBankByPlayerAI(0); + side = GetBankByIdentity(0); break; case 5: - side = GetBankByPlayerAI(2); + side = GetBankByIdentity(2); break; case 6: - side = GetBankByPlayerAI(1); + side = GetBankByIdentity(1); break; case 7: default: - side = GetBankByPlayerAI(3); + side = GetBankByIdentity(3); break; } if (IsAnimBankSpriteVisible(side) == FALSE) @@ -335,7 +395,7 @@ void sub_80A8500(u8 taskId) sub_80A8408(taskId); } -void sub_80A8530(struct Sprite *sprite) +static void sub_80A8530(struct Sprite *sprite) { sprite->invisible = TRUE; if (GetBankSide(gAnimBankAttacker)) @@ -362,7 +422,7 @@ static void sub_80A85A4(struct Sprite *sprite) StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } -void sub_80A85C8(struct Sprite *sprite) +static void sub_80A85C8(struct Sprite *sprite) { u8 spriteId; sprite->invisible = TRUE; @@ -376,7 +436,7 @@ void sub_80A85C8(struct Sprite *sprite) sprite->callback = sub_8078458; } -void sub_80A8614(struct Sprite *sprite) +static void sub_80A8614(struct Sprite *sprite) { sprite->data[0] = sprite->data[4]; sprite->data[2] = -sprite->data[2]; @@ -384,7 +444,7 @@ void sub_80A8614(struct Sprite *sprite) StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } -void sub_80A8638(struct Sprite *sprite) +static void sub_80A8638(struct Sprite *sprite) { int something; int spriteId; @@ -451,7 +511,7 @@ static void sub_80A86F4(struct Sprite *sprite) } } -void sub_80A8764(struct Sprite *sprite) +static void sub_80A8764(struct Sprite *sprite) { u8 v1; u8 spriteId; @@ -486,7 +546,7 @@ void sub_80A8764(struct Sprite *sprite) sprite->callback = sub_80784A8; } -void sub_80A8818(struct Sprite *sprite) +static void sub_80A8818(struct Sprite *sprite) { u8 spriteId; u8 v1; @@ -833,7 +893,7 @@ void sub_80A8EFC(u8 taskId) TASK.func = sub_80A8FD8; } -void sub_80A8FD8(u8 taskId) +static void sub_80A8FD8(u8 taskId) { TASK.data[3] += TASK.data[4]; obj_id_set_rotscale(TASK.data[5], 0x100, 0x100, TASK.data[3]); diff --git a/src/battle/battle_controller_linkopponent.c b/src/battle/battle_controller_linkopponent.c index 35d8f33c8..40f50d7ff 100644 --- a/src/battle/battle_controller_linkopponent.c +++ b/src/battle/battle_controller_linkopponent.c @@ -48,8 +48,8 @@ extern u8 gUnknown_02024E68[]; extern struct SpriteTemplate gUnknown_02024E8C; extern u8 gAnimMoveTurn; extern struct Window gUnknown_03004210; -extern u16 gUnknown_030042A0; -extern u16 gUnknown_030042A4; +extern u16 gBattle_BG0_Y; +extern u16 gBattle_BG0_X; extern u8 gUnknown_0300434C[]; extern u32 gBattleExecBuffer; extern MainCallback gPreBattleCallback1; @@ -93,7 +93,7 @@ extern void move_anim_start_t2_for_situation(); extern void dp01t_0F_4_move_anim(void); extern void sub_8047858(); extern u8 GetBankSide(u8); -extern void sub_80E43C0(); +extern void StartBattleIntroAnim(); extern void sub_803A3A8(struct Sprite *); extern void sub_8044CA0(u8); extern void nullsub_47(void); @@ -1410,10 +1410,10 @@ void sub_8039B64(void) void LinkOpponentHandlePrintString(void) { - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; BufferStringBattle(*(u16 *)&gBattleBufferA[gActiveBank][2]); - sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); gBattleBankFunc[gActiveBank] = sub_8037C2C; } @@ -1620,7 +1620,7 @@ void LinkOpponentHandleFaintingCry(void) void LinkOpponentHandleIntroSlide(void) { - sub_80E43C0(gBattleBufferA[gActiveBank][1]); + StartBattleIntroAnim(gBattleBufferA[gActiveBank][1]); gUnknown_02024DE8 |= 1; LinkOpponentBufferExecCompleted(); } diff --git a/src/battle/battle_controller_linkpartner.c b/src/battle/battle_controller_linkpartner.c index adc3c1c85..3a16e12e6 100644 --- a/src/battle/battle_controller_linkpartner.c +++ b/src/battle/battle_controller_linkpartner.c @@ -48,8 +48,8 @@ extern u8 gAnimFriendship; extern u16 gWeatherMoveAnim; extern u8 gAnimMoveTurn; extern struct Window gUnknown_03004210; -extern u16 gUnknown_030042A0; -extern u16 gUnknown_030042A4; +extern u16 gBattle_BG0_Y; +extern u16 gBattle_BG0_X; extern MainCallback gPreBattleCallback1; extern void (*gBattleBankFunc[])(void); extern u8 gHealthboxIDs[]; @@ -62,7 +62,7 @@ extern u8 move_anim_start_t3(); extern u8 IsBankSpritePresent(); extern void sub_8044CA0(u8); extern void sub_8030E38(struct Sprite *); -extern void sub_80E43C0(); +extern void StartBattleIntroAnim(); extern void sub_8047858(); extern void move_anim_start_t2_for_situation(); extern void load_gfxc_health_bar(); @@ -94,7 +94,7 @@ extern void sub_804777C(); extern void sub_8043DFC(); //extern s16 sub_8045C78(); extern void sub_80440EC(); -extern void sub_80324F8(); +extern void HandleLowHpMusicChange(); extern void nullsub_9(u16); extern void sub_8043DB0(); extern void move_anim_start_t4(); @@ -355,7 +355,7 @@ void bx_t3_healthbar_update(void) } else { - sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); LinkPartnerBufferExecCompleted(); } } @@ -434,7 +434,7 @@ void sub_811E0CC(void) FreeSpriteTilesByTag(0x27F9); FreeSpritePaletteByTag(0x27F9); CreateTask(c3_0802FDF4, 10); - sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 0); sub_8045A5C(gHealthboxIDs[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], 0); sub_804777C(gActiveBank); @@ -1084,7 +1084,7 @@ void sub_811EC68(u8 a) SetMonData(&gPlayerParty[a], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBank][3]); break; } - sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); } void LinkPartnerHandlecmd3(void) @@ -1243,7 +1243,7 @@ void LinkPartnerHandlecmd10(void) else if (!ewram17810[gActiveBank].unk0_6) { ewram17810[gActiveBank].unk4 = 0; - sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); PlaySE12WithPanning(SE_POKE_DEAD, -64); gSprites[gObjectBankIDs[gActiveBank]].data[1] = 0; gSprites[gObjectBankIDs[gActiveBank]].data[2] = 5; @@ -1355,10 +1355,10 @@ void sub_811FF30(void) void LinkPartnerHandlePrintString(void) { - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; BufferStringBattle(*(u16 *)&gBattleBufferA[gActiveBank][2]); - sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); gBattleBankFunc[gActiveBank] = sub_811DFA0; } @@ -1565,7 +1565,7 @@ void LinkPartnerHandleFaintingCry(void) void LinkPartnerHandleIntroSlide(void) { - sub_80E43C0(gBattleBufferA[gActiveBank][1]); + StartBattleIntroAnim(gBattleBufferA[gActiveBank][1]); gUnknown_02024DE8 |= 1; LinkPartnerBufferExecCompleted(); } diff --git a/src/battle/battle_controller_opponent.c b/src/battle/battle_controller_opponent.c index 54bb9d7f9..338f8d418 100644 --- a/src/battle/battle_controller_opponent.c +++ b/src/battle/battle_controller_opponent.c @@ -30,6 +30,7 @@ struct MovePpInfo u8 ppBonuses; }; +extern u8 gUnknown_02023A14_50; extern u8 gActiveBank; extern u8 gBattleBufferA[][0x200]; extern u16 gBattlePartyID[]; @@ -50,8 +51,8 @@ extern u8 gAnimMoveTurn; extern u8 gAnimScriptActive; extern void (*gAnimScriptCallback)(void); extern struct Window gUnknown_03004210; -extern u16 gUnknown_030042A0; -extern u16 gUnknown_030042A4; +extern u16 gBattle_BG0_Y; +extern u16 gBattle_BG0_X; extern u8 gDisplayedStringBattle[]; extern u8 gBankTarget; extern u8 gAbsentBankFlags; @@ -98,7 +99,7 @@ extern void sub_80324BC(); extern void BufferStringBattle(); extern void sub_80331D0(void); extern void sub_8036B0C(void); -extern u8 GetBankByPlayerAI(u8); +extern u8 GetBankByIdentity(u8); extern u8 sub_8036CD4(void); extern void sub_80330C8(void); extern void sub_8043D84(); @@ -108,7 +109,7 @@ extern void move_anim_start_t2_for_situation(); extern void bx_blink_t7(void); extern void sub_8047858(); extern u8 GetBankSide(u8); -extern void sub_80E43C0(); +extern void StartBattleIntroAnim(); extern void sub_8044CA0(u8); extern void nullsub_45(void); extern void sub_8031B74(); @@ -1213,14 +1214,23 @@ void OpponentHandleTrainerThrow(void) { u32 trainerPicIndex; - if (gTrainerBattleOpponent == 0x400) - trainerPicIndex = GetSecretBaseTrainerPicIndex(); - else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) - trainerPicIndex = get_trainer_class_pic_index(); - else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) - trainerPicIndex = GetEReaderTrainerPicIndex(); +#if DEBUG + if (gUnknown_02023A14_50 & 0x10) + { + trainerPicIndex = gSharedMem[0x160A3]; + } else - trainerPicIndex = gTrainers[gTrainerBattleOpponent].trainerPic; +#endif + { + if (gTrainerBattleOpponent == 0x400) + trainerPicIndex = GetSecretBaseTrainerPicIndex(); + else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) + trainerPicIndex = get_trainer_class_pic_index(); + else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) + trainerPicIndex = GetEReaderTrainerPicIndex(); + else + trainerPicIndex = gTrainers[gTrainerBattleOpponent].trainerPic; + } sub_8031A6C(trainerPicIndex, gActiveBank); GetMonSpriteTemplate_803C5A0(trainerPicIndex, GetBankIdentity(gActiveBank)); @@ -1404,10 +1414,10 @@ void sub_8035238(void) void OpponentHandlePrintString(void) { - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; BufferStringBattle(*(u16 *)&gBattleBufferA[gActiveBank][2]); - sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); gBattleBankFunc[gActiveBank] = sub_80331D0; } @@ -1427,6 +1437,315 @@ void OpponentHandlecmd19(void) OpponentBufferExecCompleted(); } +#if DEBUG +__attribute__((naked)) +void OpponentHandlecmd20(void) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + mov r7, sl\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5, r6, r7}\n\ + ldr r6, ._549 @ gActiveBank\n\ + ldrb r0, [r6]\n\ + lsl r0, r0, #0x9\n\ + ldr r1, ._549 + 4 @ gBattleBufferA\n\ + add r5, r0, r1\n\ + ldr r2, ._549 + 8 @ gUnknown_02023A14_50\n\ + ldrb r1, [r2]\n\ + mov r0, #0x4\n\ + and r0, r0, r1\n\ + mov sl, r6\n\ + cmp r0, #0\n\ + beq ._546 @cond_branch\n\ + ldr r0, ._549 + 12 @ gBattleMoves\n\ + mov r9, r0\n\ + ldr r1, ._549 + 16 @ \n\ + mov ip, r1\n\ + add r7, r6, #0\n\ + mov r0, #0x2\n\ + mov r8, r0\n\ + ldr r6, ._549 + 20 @ \n\ +._552:\n\ + ldrb r1, [r7]\n\ + mov r0, r8\n\ + and r0, r0, r1\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x19\n\ + add r0, r0, r6\n\ + mov r1, ip\n\ + add r3, r0, r1\n\ + ldrb r1, [r3]\n\ + lsl r0, r1, #0x1\n\ + add r0, r5, r0\n\ + ldrh r2, [r0]\n\ + add r4, r1, #0\n\ + cmp r2, #0\n\ + beq ._547 @cond_branch\n\ + add r0, r4, #1\n\ + strb r0, [r3]\n\ + b ._548\n\ +._550:\n\ + .align 2, 0\n\ +._549:\n\ + .word gActiveBank\n\ + .word gBattleBufferA+4\n\ + .word gUnknown_02023A14_50\n\ + .word gBattleMoves\n\ + .word +0x2000000\n\ + .word 0x1609e\n\ +._547:\n\ + strb r2, [r3]\n\ +._548:\n\ + ldrb r0, [r7]\n\ + mov r1, r8\n\ + and r1, r1, r0\n\ + lsl r1, r1, #0x18\n\ + lsr r1, r1, #0x19\n\ + add r1, r1, r6\n\ + add r1, r1, ip\n\ + ldrb r0, [r1]\n\ + cmp r0, #0x3\n\ + bls ._551 @cond_branch\n\ + mov r0, #0x0\n\ + strb r0, [r1]\n\ +._551:\n\ + cmp r2, #0\n\ + beq ._552 @cond_branch\n\ + lsl r0, r2, #0x1\n\ + add r0, r0, r2\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r9\n\ + ldrb r3, [r0, #0x6]\n\ + mov r0, #0x12\n\ + and r0, r0, r3\n\ + cmp r0, #0\n\ + beq ._553 @cond_branch\n\ + mov r1, sl\n\ + ldrb r0, [r1]\n\ + b ._561\n\ +._553:\n\ + ldr r0, ._559 @ gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._557 @cond_branch\n\ + ldr r0, ._559 + 4 @ gUnknown_02023A14_50\n\ + ldrb r1, [r0]\n\ + mov r5, #0x2\n\ + add r0, r5, #0\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._556 @cond_branch\n\ + cmp r3, #0\n\ + bne ._557 @cond_branch\n\ + mov r1, sl\n\ + ldrb r0, [r1]\n\ + bl GetBankIdentity\n\ + mov r1, #0x2\n\ + eor r0, r0, r1\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + b ._558\n\ +._560:\n\ + .align 2, 0\n\ +._559:\n\ + .word gBattleTypeFlags\n\ + .word gUnknown_02023A14_50\n\ +._556:\n\ + bl Random\n\ + add r1, r5, #0\n\ + and r1, r1, r0\n\ + lsl r1, r1, #0x10\n\ + lsr r0, r1, #0x10\n\ + b ._561\n\ +._557:\n\ + mov r0, #0x0\n\ +._558:\n\ + bl GetBankByIdentity\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ +._561:\n\ + lsl r2, r0, #0x8\n\ + orr r2, r2, r4\n\ + mov r0, #0x1\n\ + mov r1, #0xa\n\ +._569:\n\ + bl Emitcmd33\n\ +._573:\n\ + bl OpponentBufferExecCompleted\n\ + b ._562\n\ +._546:\n\ + ldr r0, ._567 @ gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + mov r0, #0x93\n\ + lsl r0, r0, #0x3\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._563 @cond_branch\n\ + bl BattleAI_SetupAIData\n\ + bl BattleAI_GetAIActionToUse\n\ + lsl r0, r0, #0x18\n\ + lsr r4, r0, #0x18\n\ + cmp r4, #0x4\n\ + beq ._564 @cond_branch\n\ + cmp r4, #0x5\n\ + bne ._565 @cond_branch\n\ + mov r0, #0x1\n\ + mov r1, #0x4\n\ + b ._566\n\ +._568:\n\ + .align 2, 0\n\ +._567:\n\ + .word gBattleTypeFlags\n\ +._564:\n\ + mov r0, #0x1\n\ + mov r1, #0x3\n\ +._566:\n\ + mov r2, #0x0\n\ + b ._569\n\ +._565:\n\ + ldr r3, ._574 @ gBattleMoves\n\ + lsl r0, r4, #0x1\n\ + add r2, r5, r0\n\ + ldrh r1, [r2]\n\ + lsl r0, r1, #0x1\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r3\n\ + ldrb r1, [r0, #0x6]\n\ + mov r0, #0x12\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._570 @cond_branch\n\ + ldr r1, ._574 + 4 @ gBankTarget\n\ + ldrb r0, [r6]\n\ + strb r0, [r1]\n\ +._570:\n\ + ldrh r1, [r2]\n\ + lsl r0, r1, #0x1\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r3\n\ + ldrb r1, [r0, #0x6]\n\ + mov r0, #0x8\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._572 @cond_branch\n\ + mov r0, #0x0\n\ + bl GetBankByIdentity\n\ + ldr r5, ._574 + 4 @ gBankTarget\n\ + strb r0, [r5]\n\ + ldr r0, ._574 + 8 @ gAbsentBankFlags\n\ + ldrb r1, [r0]\n\ + ldr r2, ._574 + 12 @ gBitTable\n\ + ldrb r0, [r5]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r2\n\ + ldr r0, [r0]\n\ + and r1, r1, r0\n\ + cmp r1, #0\n\ + beq ._572 @cond_branch\n\ + mov r0, #0x2\n\ + bl GetBankByIdentity\n\ + strb r0, [r5]\n\ +._572:\n\ + ldr r0, ._574 + 4 @ gBankTarget\n\ + ldrb r2, [r0]\n\ + lsl r2, r2, #0x8\n\ + orr r2, r2, r4\n\ + mov r0, #0x1\n\ + mov r1, #0xa\n\ + bl Emitcmd33\n\ + b ._573\n\ +._575:\n\ + .align 2, 0\n\ +._574:\n\ + .word gBattleMoves\n\ + .word gBankTarget\n\ + .word gAbsentBankFlags\n\ + .word gBitTable\n\ +._563:\n\ + mov r6, #0x3\n\ +._576:\n\ + bl Random\n\ + add r4, r0, #0\n\ + and r4, r4, r6\n\ + lsl r0, r4, #0x1\n\ + add r0, r5, r0\n\ + ldrh r2, [r0]\n\ + cmp r2, #0\n\ + beq ._576 @cond_branch\n\ + ldr r1, ._579 @ gBattleMoves\n\ + lsl r0, r2, #0x1\n\ + add r0, r0, r2\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldrb r1, [r0, #0x6]\n\ + mov r0, #0x12\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._577 @cond_branch\n\ + ldr r0, ._579 + 4 @ gActiveBank\n\ + ldrb r2, [r0]\n\ + lsl r2, r2, #0x8\n\ + b ._578\n\ +._580:\n\ + .align 2, 0\n\ +._579:\n\ + .word gBattleMoves\n\ + .word gActiveBank\n\ +._577:\n\ + ldr r0, ._583 @ gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._581 @cond_branch\n\ + bl Random\n\ + mov r1, #0x2\n\ + and r1, r1, r0\n\ + lsl r1, r1, #0x18\n\ + lsr r1, r1, #0x18\n\ + add r0, r1, #0\n\ + bl GetBankByIdentity\n\ + add r2, r0, #0\n\ + lsl r2, r2, #0x18\n\ + lsr r2, r2, #0x10\n\ +._578:\n\ + orr r2, r2, r4\n\ + mov r0, #0x1\n\ + mov r1, #0xa\n\ + bl Emitcmd33\n\ + b ._582\n\ +._584:\n\ + .align 2, 0\n\ +._583:\n\ + .word gBattleTypeFlags\n\ +._581:\n\ + mov r0, #0x0\n\ + bl GetBankByIdentity\n\ + add r2, r0, #0\n\ + lsl r2, r2, #0x18\n\ + lsr r2, r2, #0x10\n\ + orr r2, r2, r4\n\ + mov r0, #0x1\n\ + mov r1, #0xa\n\ + bl Emitcmd33\n\ +._582:\n\ + bl OpponentBufferExecCompleted\n\ +._562:\n\ + pop {r3, r4, r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov sl, r5\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0"); +} +#else #ifdef NONMATCHING void OpponentHandlecmd20(void) { @@ -1451,9 +1770,9 @@ void OpponentHandlecmd20(void) gBankTarget = gActiveBank; if (gBattleMoves[r5->moves[r4]].target & 8) { - gBankTarget = GetBankByPlayerAI(0); + gBankTarget = GetBankByIdentity(0); if (gAbsentBankFlags & gBitTable[gBankTarget]) - gBankTarget = GetBankByPlayerAI(2); + gBankTarget = GetBankByIdentity(2); } r4 |= gBankTarget << 8; Emitcmd33(1, 10, r4); @@ -1479,13 +1798,13 @@ void OpponentHandlecmd20(void) } else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { - u16 r2 = GetBankByPlayerAI(Random() & 2) << 8; + u16 r2 = GetBankByIdentity(Random() & 2) << 8; Emitcmd33(1, 10, r4 | r2); } else { - u16 r2 = GetBankByPlayerAI(0) << 8; + u16 r2 = GetBankByIdentity(0) << 8; Emitcmd33(1, 10, r4 | r2); } @@ -1501,7 +1820,7 @@ void OpponentHandlecmd20(void) ldr r6, _0803545C @ =gActiveBank\n\ ldrb r0, [r6]\n\ lsls r0, 9\n\ - ldr r1, _08035460 @ =gUnknown_02023A64\n\ + ldr r1, _08035460 @ =gBattleBufferA+4\n\ adds r5, r0, r1\n\ ldr r0, _08035464 @ =gBattleTypeFlags\n\ ldrh r1, [r0]\n\ @@ -1523,7 +1842,7 @@ void OpponentHandlecmd20(void) b _0803546C\n\ .align 2, 0\n\ _0803545C: .4byte gActiveBank\n\ -_08035460: .4byte gUnknown_02023A64\n\ +_08035460: .4byte gBattleBufferA+4\n\ _08035464: .4byte gBattleTypeFlags\n\ _08035468:\n\ movs r0, 0x1\n\ @@ -1561,7 +1880,7 @@ _08035494:\n\ cmp r0, 0\n\ beq _080354CE\n\ movs r0, 0\n\ - bl GetBankByPlayerAI\n\ + bl GetBankByIdentity\n\ ldr r5, _080354EC @ =gBankTarget\n\ strb r0, [r5]\n\ ldr r0, _080354F0 @ =gAbsentBankFlags\n\ @@ -1575,7 +1894,7 @@ _08035494:\n\ cmp r1, 0\n\ beq _080354CE\n\ movs r0, 0x2\n\ - bl GetBankByPlayerAI\n\ + bl GetBankByIdentity\n\ strb r0, [r5]\n\ _080354CE:\n\ ldr r0, _080354EC @ =gBankTarget\n\ @@ -1640,7 +1959,7 @@ _0803553C:\n\ lsls r1, 24\n\ lsrs r1, 24\n\ adds r0, r1, 0\n\ - bl GetBankByPlayerAI\n\ + bl GetBankByIdentity\n\ adds r2, r0, 0\n\ lsls r2, 24\n\ lsrs r2, 16\n\ @@ -1653,7 +1972,7 @@ _0803553C:\n\ _0803556C: .4byte gBattleTypeFlags\n\ _08035570:\n\ movs r0, 0\n\ - bl GetBankByPlayerAI\n\ + bl GetBankByIdentity\n\ adds r2, r0, 0\n\ lsls r2, 24\n\ lsrs r2, 16\n\ @@ -1670,6 +1989,7 @@ _0803558A:\n\ .syntax divided\n"); } #endif +#endif void OpponentHandleOpenBag(void) { @@ -1692,13 +2012,13 @@ void OpponentHandlecmd22(void) { if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) { - r5 = GetBankByPlayerAI(1); + r5 = GetBankByIdentity(1); r6 = r5; } else { - r6 = GetBankByPlayerAI(1); - r5 = GetBankByPlayerAI(3); + r6 = GetBankByIdentity(1); + r5 = GetBankByIdentity(3); } for (r4 = 0; r4 < 6; r4++) { @@ -1892,7 +2212,7 @@ void OpponentHandleFaintingCry(void) void OpponentHandleIntroSlide(void) { - sub_80E43C0(gBattleBufferA[gActiveBank][1]); + StartBattleIntroAnim(gBattleBufferA[gActiveBank][1]); gUnknown_02024DE8 |= 1; OpponentBufferExecCompleted(); } diff --git a/src/battle/battle_controller_player.c b/src/battle/battle_controller_player.c index 70773473d..e03e21849 100644 --- a/src/battle/battle_controller_player.c +++ b/src/battle/battle_controller_player.c @@ -35,13 +35,15 @@ struct MovePpInfo #define SUB_803037C_TILE_DATA_OFFSET 444 #endif -extern u16 gUnknown_030042A4; -extern u16 gUnknown_030042A0; +extern u16 gBattle_BG0_X; +extern u16 gBattle_BG0_Y; extern struct Window gUnknown_03004210; extern void (*gBattleBankFunc[])(void); +extern u32 gOamMatrixAllocBitmap; +extern u8 gUnknown_020297ED; extern u8 gActiveBank; extern u8 gActionSelectionCursor[]; extern u8 gDisplayedStringBattle[]; @@ -67,12 +69,12 @@ extern u8 gUnknown_02024E68[]; extern struct SpriteTemplate gUnknown_02024E8C; extern u8 gAnimMoveTurn; extern u8 gUnknown_02038470[]; -extern u16 gUnknown_030041B0; +extern u16 gBattle_BG3_X; extern u16 gBattle_BG1_Y; -extern u16 gUnknown_030041B8; +extern u16 gBattle_BG3_Y; extern u16 gBattle_BG2_Y; extern u16 gBattle_BG2_X; -extern u16 gUnknown_030042A4; +extern u16 gBattle_BG0_X; extern u16 gBattle_BG1_X; extern u8 gUnknown_03004344; extern u8 gUnknown_0300434C[]; @@ -87,7 +89,7 @@ extern void sub_802E220(); extern void sub_802E2D4(); extern void sub_802E004(void); extern void sub_802DF30(void); -extern void BattleMusicStop(void); +extern void BattleStopLowHpSound(void); extern void PlayerBufferExecCompleted(void); extern void bx_t1_healthbar_update(void); extern void nullsub_91(void); @@ -98,7 +100,7 @@ extern void move_anim_start_t2_for_situation(); extern void bx_blink_t1(void); extern void sub_8047858(); extern u8 GetBankSide(u8); -extern void sub_80E43C0(); +extern void StartBattleIntroAnim(); extern void oamt_add_pos2_onto_pos1(); extern void sub_8078B34(struct Sprite *); extern void StoreSpriteCallbackInData(); @@ -118,7 +120,7 @@ extern void sub_8031F24(void); extern void sub_80324BC(); extern u8 sub_8031720(); extern void bx_wait_t1(void); -extern u8 GetBankByPlayerAI(u8); +extern u8 GetBankByIdentity(u8); extern void sub_802DE10(void); extern void sub_80105EC(struct Sprite *); extern void sub_802D274(void); @@ -148,8 +150,8 @@ extern u8 gAbsentBankFlags; extern u8 gUnknown_03004344; extern u8 gNoOfAllBanks; extern u16 gBattlePartyID[]; -extern u16 gUnknown_030042A0; -extern u16 gUnknown_030042A4; +extern u16 gBattle_BG0_Y; +extern u16 gBattle_BG0_X; extern struct Window gUnknown_03004210; extern const u8 BattleText_SwitchWhich[]; extern u8 gUnknown_03004348; @@ -167,7 +169,7 @@ extern const u8 BattleText_LinkStandby[]; extern void dp11b_obj_instanciate(u8, u8, s8, s8); extern u8 GetBankIdentity(u8); -extern u8 GetBankByPlayerAI(u8); +extern u8 GetBankByIdentity(u8); extern void dp11b_obj_free(u8, u8); extern void sub_8010520(struct Sprite *); extern void sub_8010574(struct Sprite *); @@ -445,7 +447,7 @@ void sub_802C098(void) { if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && GetBankIdentity(gActiveBank) == 2 - && !(gAbsentBankFlags & gBitTable[GetBankByPlayerAI(0)]) + && !(gAbsentBankFlags & gBitTable[GetBankByIdentity(0)]) && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { if (gBattleBufferA[gActiveBank][1] == 1) @@ -529,7 +531,7 @@ void sub_802C2EC(void) i--; if (i < 0) i = 3; - gUnknown_03004344 = GetBankByPlayerAI(arr[i]); + gUnknown_03004344 = GetBankByIdentity(arr[i]); } while(gUnknown_03004344 == gNoOfAllBanks); i = 0; switch (GetBankIdentity(gUnknown_03004344)) @@ -576,7 +578,7 @@ void sub_802C2EC(void) i++; if (i > 3) i = 0; - gUnknown_03004344 = GetBankByPlayerAI(arr[i]); + gUnknown_03004344 = GetBankByIdentity(arr[i]); } while (gUnknown_03004344 == gNoOfAllBanks); i = 0; switch (GetBankIdentity(gUnknown_03004344)) @@ -617,9 +619,14 @@ struct ChooseMoveStruct const u8 gUnknown_081FAE80[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW WHITE LIGHT_BLUE WHITE2}"); +void debug_sub_8030C24(void); + void sub_802C68C(void) { u32 r8 = 0; +#if DEBUG + u8 count = 0; +#endif struct ChooseMoveStruct *r6 = (struct ChooseMoveStruct *)(gBattleBufferA[gActiveBank] + 4); if (gMain.newKeys & A_BUTTON) @@ -636,7 +643,7 @@ void sub_802C68C(void) if (r4 & 0x10) gUnknown_03004344 = gActiveBank; else - gUnknown_03004344 = GetBankByPlayerAI((GetBankIdentity(gActiveBank) & 1) ^ 1); + gUnknown_03004344 = GetBankByIdentity((GetBankIdentity(gActiveBank) & 1) ^ 1); if (gBattleBufferA[gActiveBank][1] == 0) { @@ -668,10 +675,10 @@ void sub_802C68C(void) gBattleBankFunc[gActiveBank] = sub_802C2EC; if (r4 & 0x12) gUnknown_03004344 = gActiveBank; - else if (gAbsentBankFlags & gBitTable[GetBankByPlayerAI(1)]) - gUnknown_03004344 = GetBankByPlayerAI(3); + else if (gAbsentBankFlags & gBitTable[GetBankByIdentity(1)]) + gUnknown_03004344 = GetBankByIdentity(3); else - gUnknown_03004344 = GetBankByPlayerAI(1); + gUnknown_03004344 = GetBankByIdentity(1); gSprites[gObjectBankIDs[gUnknown_03004344]].callback = sub_8010520; } } @@ -679,8 +686,8 @@ void sub_802C68C(void) { DestroyMenuCursor(); PlaySE(SE_SELECT); - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 320; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 320; Emitcmd33(1, 10, 0xFFFF); PlayerBufferExecCompleted(); } @@ -744,12 +751,49 @@ void sub_802C68C(void) else gUnknown_03004344 = gMoveSelectionCursor[gActiveBank] + 1; sub_802E3B4(gUnknown_03004344, 27); - FillWindowRect(&gUnknown_03004210, 0x1016, 0x17, 0x37, 0x1C, 0x3A); - InitWindow(&gUnknown_03004210, BattleText_SwitchWhich, 0x290, 0x17, 0x37); - sub_8002F44(&gUnknown_03004210); + Text_FillWindowRect(&gUnknown_03004210, 0x1016, 0x17, 0x37, 0x1C, 0x3A); + Text_InitWindow(&gUnknown_03004210, BattleText_SwitchWhich, 0x290, 0x17, 0x37); + Text_PrintWindow8002F44(&gUnknown_03004210); gBattleBankFunc[gActiveBank] = sub_802CA60; } } +#if DEBUG + else if (gUnknown_020297ED == 1 && (gMain.newKeys & START_BUTTON)) + { + const u8 *moveName; + s32 i; + + Text_FillWindowRect(&gUnknown_03004210, 0x1016, 1, 0x37, 16, 0x3A); + moveName = gMoveNames[GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1)]; + Text_InitWindowAndPrintText(&gUnknown_03004210, moveName, 0x100, 2, 0x37); + ConvertIntToDecimalStringN( + gDisplayedStringBattle, + GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1), + 2, 3); + Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x110, 10, 0x37); + Text_InitWindowAndPrintText(&gUnknown_03004210, gString_TurnJP, 0x116, 1, 0x39); + ConvertIntToDecimalStringN(gDisplayedStringBattle, gAnimMoveTurn, 2, 3); + Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x11C, 4, 0x39); + for (i = 0; i < 64; i++) + { + if (gSprites[i].inUse) + count++; + } + ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2); + Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x122, 8, 0x39); + count = GetTaskCount(); + ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2); + Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x126, 11, 0x39); + for (i = 0, count = 0; i < 32; i++) + { + if (gOamMatrixAllocBitmap & (1 << i)) + count++; + } + ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2); + Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x12A, 14, 0x39); + gBattleBankFunc[gActiveBank] = debug_sub_8030C24; + } +#endif } extern const u8 BattleText_Format[]; @@ -853,9 +897,9 @@ void sub_802CA60(void) gBattleBankFunc[gActiveBank] = sub_802C68C; gMoveSelectionCursor[gActiveBank] = gUnknown_03004344; sub_802E3B4(gMoveSelectionCursor[gActiveBank], 0); - FillWindowRect(&gUnknown_03004210, 0x1016, 0x17, 0x37, 0x1C, 0x3A); - InitWindow(&gUnknown_03004210, BattleText_PP, 0x290, 0x17, 0x37); - sub_8002F44(&gUnknown_03004210); + Text_FillWindowRect(&gUnknown_03004210, 0x1016, 0x17, 0x37, 0x1C, 0x3A); + Text_InitWindow(&gUnknown_03004210, BattleText_PP, 0x290, 0x17, 0x37); + Text_PrintWindow8002F44(&gUnknown_03004210); sub_802E220(); sub_802E2D4(); } @@ -866,9 +910,9 @@ void sub_802CA60(void) sub_802E3B4(gMoveSelectionCursor[gActiveBank], 0); sub_802E12C(gMoveSelectionCursor[gActiveBank], BattleText_Format); gBattleBankFunc[gActiveBank] = sub_802C68C; - FillWindowRect(&gUnknown_03004210, 0x1016, 0x17, 0x37, 0x1C, 0x3A); - InitWindow(&gUnknown_03004210, BattleText_PP, 0x290, 0x17, 0x37); - sub_8002F44(&gUnknown_03004210); + Text_FillWindowRect(&gUnknown_03004210, 0x1016, 0x17, 0x37, 0x1C, 0x3A); + Text_InitWindow(&gUnknown_03004210, BattleText_PP, 0x290, 0x17, 0x37); + Text_PrintWindow8002F44(&gUnknown_03004210); sub_802E220(); sub_802E2D4(); } @@ -956,6 +1000,688 @@ void sub_802D18C(void) } } +#if DEBUG +__attribute__((naked)) +void debug_sub_8030C24(void) +{ + asm("\ + push {r4, r5, r6, lr}\n\ + add sp, sp, #0xfffffff4\n\ + ldr r1, ._293 @ gBattlePartyID\n\ + ldr r4, ._293 + 4 @ gActiveBank\n\ + ldrb r0, [r4]\n\ + lsl r0, r0, #0x1\n\ + add r0, r0, r1\n\ + ldrh r1, [r0]\n\ + mov r0, #0x64\n\ + mul r0, r0, r1\n\ + ldr r1, ._293 + 8 @ gPlayerParty\n\ + add r0, r0, r1\n\ + mov r1, #0xd\n\ + bl GetMonData\n\ + add r1, sp, #0x8\n\ + strh r0, [r1]\n\ + ldr r5, ._293 + 12 @ gMain\n\ + ldrh r1, [r5, #0x30]\n\ + cmp r1, #0x20\n\ + bne ._286 @cond_branch\n\ + b ._287\n\ +._286:\n\ + cmp r1, #0x20\n\ + bgt ._288 @cond_branch\n\ + cmp r1, #0x8\n\ + beq ._289 @cond_branch\n\ + cmp r1, #0x8\n\ + bgt ._290 @cond_branch\n\ + cmp r1, #0x4\n\ + beq ._291 @cond_branch\n\ + b ._348\n\ +._294:\n\ + .align 2, 0\n\ +._293:\n\ + .word gBattlePartyID\n\ + .word gActiveBank\n\ + .word gPlayerParty\n\ + .word gMain\n\ +._290:\n\ + cmp r1, #0x10\n\ + bne ._295 @cond_branch\n\ + b ._296\n\ +._295:\n\ + b ._348\n\ +._288:\n\ + cmp r1, #0x80\n\ + bne ._298 @cond_branch\n\ + b ._302\n\ +._298:\n\ + cmp r1, #0x80\n\ + bgt ._300 @cond_branch\n\ + cmp r1, #0x40\n\ + bne ._301 @cond_branch\n\ + b ._302\n\ +._301:\n\ + b ._348\n\ +._300:\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x1\n\ + cmp r1, r0\n\ + bne ._304 @cond_branch\n\ + b ._305\n\ +._304:\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x2\n\ + cmp r1, r0\n\ + bne ._306 @cond_branch\n\ + b ._307\n\ +._306:\n\ + b ._348\n\ +._289:\n\ + ldrb r0, [r4]\n\ + mov r1, #0x1\n\ + bl dp11b_obj_free\n\ + ldrb r0, [r4]\n\ + mov r1, #0x0\n\ + bl dp11b_obj_free\n\ + ldr r0, ._312 @ gBankAttacker\n\ + ldrb r2, [r4]\n\ + strb r2, [r0]\n\ + ldrh r1, [r5, #0x28]\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._310 @cond_branch\n\ + ldr r0, ._312 + 4 @ gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._310 @cond_branch\n\ + ldr r0, ._312 + 8 @ gBankTarget\n\ + mov r1, #0x2\n\ + eor r1, r1, r2\n\ + strb r1, [r0]\n\ + b ._311\n\ +._313:\n\ + .align 2, 0\n\ +._312:\n\ + .word gBankAttacker\n\ + .word gBattleTypeFlags\n\ + .word gBankTarget\n\ +._310:\n\ + ldr r0, ._317 @ gMain\n\ + ldrh r1, [r0, #0x28]\n\ + mov r2, #0x1\n\ + add r0, r2, #0\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._315 @cond_branch\n\ + ldr r0, ._317 + 4 @ gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + add r0, r2, #0\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._315 @cond_branch\n\ + mov r0, #0x3\n\ + b ._316\n\ +._318:\n\ + .align 2, 0\n\ +._317:\n\ + .word gMain\n\ + .word gBattleTypeFlags\n\ +._315:\n\ + mov r0, #0x1\n\ +._316:\n\ + bl GetBankByIdentity\n\ + ldr r1, ._320 @ gBankTarget\n\ + strb r0, [r1]\n\ +._311:\n\ + mov r0, #0x0\n\ + bl sub_80326EC\n\ + add r0, sp, #0x8\n\ + ldrh r0, [r0]\n\ + bl DoMoveAnim\n\ + ldr r1, ._320 + 4 @ gBattleBankFunc\n\ + ldr r0, ._320 + 8 @ gActiveBank\n\ + ldrb r0, [r0]\n\ + b ._332\n\ +._321:\n\ + .align 2, 0\n\ +._320:\n\ + .word gBankTarget\n\ + .word gBattleBankFunc\n\ + .word gActiveBank\n\ +._291:\n\ + ldrb r0, [r4]\n\ + mov r1, #0x1\n\ + bl dp11b_obj_free\n\ + ldrb r0, [r4]\n\ + mov r1, #0x0\n\ + bl dp11b_obj_free\n\ + ldr r0, ._325 @ gBankTarget\n\ + ldrb r2, [r4]\n\ + strb r2, [r0]\n\ + ldrh r1, [r5, #0x28]\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._323 @cond_branch\n\ + ldr r0, ._325 + 4 @ gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._323 @cond_branch\n\ + ldr r0, ._325 + 8 @ gBankAttacker\n\ + mov r1, #0x2\n\ + eor r1, r1, r2\n\ + strb r1, [r0]\n\ + b ._324\n\ +._326:\n\ + .align 2, 0\n\ +._325:\n\ + .word gBankTarget\n\ + .word gBattleTypeFlags\n\ + .word gBankAttacker\n\ +._323:\n\ + ldr r0, ._330 @ gMain\n\ + ldrh r1, [r0, #0x28]\n\ + mov r2, #0x1\n\ + add r0, r2, #0\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._328 @cond_branch\n\ + ldr r0, ._330 + 4 @ gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + add r0, r2, #0\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._328 @cond_branch\n\ + mov r0, #0x3\n\ + b ._329\n\ +._331:\n\ + .align 2, 0\n\ +._330:\n\ + .word gMain\n\ + .word gBattleTypeFlags\n\ +._328:\n\ + mov r0, #0x1\n\ +._329:\n\ + bl GetBankByIdentity\n\ + ldr r1, ._333 @ gBankAttacker\n\ + strb r0, [r1]\n\ +._324:\n\ + mov r0, #0x0\n\ + bl sub_80326EC\n\ + add r0, sp, #0x8\n\ + ldrh r0, [r0]\n\ + bl DoMoveAnim\n\ + ldr r1, ._333 + 4 @ gBattleBankFunc\n\ + ldr r0, ._333 + 8 @ gActiveBank\n\ + ldrb r0, [r0]\n\ + b ._332\n\ +._334:\n\ + .align 2, 0\n\ +._333:\n\ + .word gBankAttacker\n\ + .word gBattleBankFunc\n\ + .word gActiveBank\n\ +._305:\n\ + ldrh r1, [r5, #0x28]\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._336 @cond_branch\n\ + ldr r0, ._338 @ gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._336 @cond_branch\n\ + ldrb r0, [r4]\n\ + mov r1, #0x1\n\ + bl dp11b_obj_free\n\ + ldrb r0, [r4]\n\ + mov r1, #0x0\n\ + bl dp11b_obj_free\n\ + mov r0, #0x3\n\ + bl GetBankByIdentity\n\ + ldr r1, ._338 + 4 @ gBankAttacker\n\ + strb r0, [r1]\n\ + mov r0, #0x1\n\ + b ._337\n\ +._339:\n\ + .align 2, 0\n\ +._338:\n\ + .word gBattleTypeFlags\n\ + .word gBankAttacker\n\ +._336:\n\ + add r0, sp, #0x8\n\ + mov r1, #0x0\n\ + ldsh r0, [r0, r1]\n\ + add r0, r0, #0x9\n\ + add r1, sp, #0x8\n\ + strh r0, [r1]\n\ +._296:\n\ + add r0, sp, #0x8\n\ + mov r2, #0x0\n\ + ldsh r0, [r0, r2]\n\ + add r0, r0, #0x1\n\ + lsl r2, r0, #0x10\n\ + add r1, sp, #0x8\n\ + strh r0, [r1]\n\ + mov r0, #0xb1\n\ + lsl r0, r0, #0x11\n\ + cmp r2, r0\n\ + ble ._347 @cond_branch\n\ + mov r1, #0x1\n\ + add r0, sp, #0x8\n\ + strh r1, [r0]\n\ + b ._347\n\ +._307:\n\ + ldrh r1, [r5, #0x28]\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._343 @cond_branch\n\ + ldr r0, ._345 @ gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._343 @cond_branch\n\ + ldrb r0, [r4]\n\ + mov r1, #0x1\n\ + bl dp11b_obj_free\n\ + ldrb r0, [r4]\n\ + mov r1, #0x0\n\ + bl dp11b_obj_free\n\ + mov r0, #0x1\n\ + bl GetBankByIdentity\n\ + ldr r1, ._345 + 4 @ gBankAttacker\n\ + strb r0, [r1]\n\ + mov r0, #0x3\n\ +._337:\n\ + bl GetBankByIdentity\n\ + ldr r1, ._345 + 8 @ gBankTarget\n\ + strb r0, [r1]\n\ + mov r0, #0x0\n\ + bl sub_80326EC\n\ + add r0, sp, #0x8\n\ + ldrh r0, [r0]\n\ + bl DoMoveAnim\n\ + ldr r1, ._345 + 12 @ gBattleBankFunc\n\ + ldrb r0, [r4]\n\ +._332:\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldr r1, ._345 + 16 @ debug_sub_803107C\n\ + str r1, [r0]\n\ + b ._348\n\ +._346:\n\ + .align 2, 0\n\ +._345:\n\ + .word gBattleTypeFlags\n\ + .word gBankAttacker\n\ + .word gBankTarget\n\ + .word gBattleBankFunc\n\ + .word debug_sub_803107C+1\n\ +._343:\n\ + add r1, sp, #0x8\n\ + add r0, r1, #0\n\ + ldrh r0, [r0]\n\ + sub r0, r0, #0x9\n\ + strh r0, [r1]\n\ +._287:\n\ + add r1, sp, #0x8\n\ + add r0, r1, #0\n\ + ldrh r0, [r0]\n\ + sub r0, r0, #0x1\n\ + strh r0, [r1]\n\ + lsl r0, r0, #0x10\n\ + cmp r0, #0\n\ + bgt ._347 @cond_branch\n\ + mov r2, #0xb1\n\ + lsl r2, r2, #0x1\n\ + add r0, r2, #0\n\ + strh r0, [r1]\n\ +._347:\n\ + ldr r1, ._349 @ gBattlePartyID\n\ + ldr r4, ._349 + 4 @ gActiveBank\n\ + ldrb r0, [r4]\n\ + lsl r0, r0, #0x1\n\ + add r0, r0, r1\n\ + ldrh r1, [r0]\n\ + mov r0, #0x64\n\ + mul r0, r0, r1\n\ + ldr r1, ._349 + 8 @ gPlayerParty\n\ + add r0, r0, r1\n\ + mov r1, #0xd\n\ + add r2, sp, #0x8\n\ + bl SetMonData\n\ + ldr r2, ._349 + 12 @ gBattleMons\n\ + ldrb r1, [r4]\n\ + mov r0, #0x58\n\ + mul r0, r0, r1\n\ + add r0, r0, r2\n\ + add r1, sp, #0x8\n\ + ldrh r1, [r1]\n\ + strh r1, [r0, #0xc]\n\ + ldr r5, ._349 + 16 @ gUnknown_03004210\n\ + ldr r1, ._349 + 20 @ 0x1016\n\ + mov r0, #0x10\n\ + str r0, [sp]\n\ + mov r0, #0x38\n\ + str r0, [sp, #0x4]\n\ + add r0, r5, #0\n\ + mov r2, #0x1\n\ + mov r3, #0x37\n\ + bl Text_FillWindowRect\n\ + add r0, sp, #0x8\n\ + mov r2, #0x0\n\ + ldsh r1, [r0, r2]\n\ + mov r0, #0xd\n\ + mul r1, r1, r0\n\ + ldr r0, ._349 + 24 @ gMoveNames\n\ + add r1, r1, r0\n\ + mov r2, #0x80\n\ + lsl r2, r2, #0x1\n\ + mov r6, #0x37\n\ + str r6, [sp]\n\ + add r0, r5, #0\n\ + mov r3, #0x2\n\ + bl Text_InitWindowAndPrintText\n\ + ldr r4, ._349 + 28 @ gDisplayedStringBattle\n\ + add r0, sp, #0x8\n\ + mov r2, #0x0\n\ + ldsh r1, [r0, r2]\n\ + add r0, r4, #0\n\ + mov r2, #0x2\n\ + mov r3, #0x3\n\ + bl ConvertIntToDecimalStringN\n\ + mov r2, #0x88\n\ + lsl r2, r2, #0x1\n\ + str r6, [sp]\n\ + add r0, r5, #0\n\ + add r1, r4, #0\n\ + mov r3, #0xa\n\ + bl Text_InitWindowAndPrintText\n\ + b ._348\n\ +._350:\n\ + .align 2, 0\n\ +._349:\n\ + .word gBattlePartyID\n\ + .word gActiveBank\n\ + .word gPlayerParty\n\ + .word gBattleMons\n\ + .word gUnknown_03004210\n\ + .word 0x1016\n\ + .word gMoveNames\n\ + .word gDisplayedStringBattle\n\ +._302:\n\ + ldr r0, ._353 @ gMain\n\ + ldrh r0, [r0, #0x30]\n\ + cmp r0, #0x40\n\ + bne ._351 @cond_branch\n\ + ldr r1, ._353 + 4 @ gAnimMoveTurn\n\ + ldrb r0, [r1]\n\ + sub r0, r0, #0x1\n\ + b ._352\n\ +._354:\n\ + .align 2, 0\n\ +._353:\n\ + .word gMain\n\ + .word gAnimMoveTurn\n\ +._351:\n\ + ldr r1, ._359 @ gAnimMoveTurn\n\ + ldrb r0, [r1]\n\ + add r0, r0, #0x1\n\ +._352:\n\ + strb r0, [r1]\n\ + ldr r4, ._359 + 4 @ gDisplayedStringBattle\n\ + ldrb r1, [r1]\n\ + add r0, r4, #0\n\ + mov r2, #0x2\n\ + mov r3, #0x3\n\ + bl ConvertIntToDecimalStringN\n\ + ldr r0, ._359 + 8 @ gUnknown_03004210\n\ + mov r2, #0x8e\n\ + lsl r2, r2, #0x1\n\ + mov r1, #0x39\n\ + str r1, [sp]\n\ + add r1, r4, #0\n\ + mov r3, #0x4\n\ + bl Text_InitWindowAndPrintText\n\ +._348:\n\ + ldr r0, ._359 + 12 @ gMain\n\ + ldrh r2, [r0, #0x28]\n\ + mov r1, #0xc0\n\ + lsl r1, r1, #0x2\n\ + add r0, r1, #0\n\ + and r0, r0, r2\n\ + cmp r0, r1\n\ + bne ._355 @cond_branch\n\ + mov r4, #0x0\n\ + ldr r5, ._359 + 4 @ gDisplayedStringBattle\n\ + ldr r6, ._359 + 8 @ gUnknown_03004210\n\ +._361:\n\ + add r0, r5, #0\n\ + ldr r1, ._359 + 16 @ BattleText_Format\n\ + bl StringCopy\n\ + ldr r1, ._359 + 20 @ gBattlePartyID\n\ + ldr r0, ._359 + 24 @ gActiveBank\n\ + ldrb r0, [r0]\n\ + lsl r0, r0, #0x1\n\ + add r0, r0, r1\n\ + ldrh r1, [r0]\n\ + mov r0, #0x64\n\ + mul r0, r0, r1\n\ + ldr r1, ._359 + 28 @ gPlayerParty\n\ + add r0, r0, r1\n\ + add r1, r4, #0\n\ + add r1, r1, #0xd\n\ + bl GetMonData\n\ + mov r1, #0xd\n\ + mul r1, r1, r0\n\ + ldr r0, ._359 + 32 @ gMoveNames\n\ + add r1, r1, r0\n\ + add r0, r5, #0\n\ + bl StringAppend\n\ + lsl r0, r4, #0x14\n\ + mov r1, #0x80\n\ + lsl r1, r1, #0x11\n\ + add r0, r0, r1\n\ + lsr r2, r0, #0x10\n\ + mov r0, #0x1\n\ + and r0, r0, r4\n\ + mov r3, #0x2\n\ + cmp r0, #0\n\ + beq ._356 @cond_branch\n\ + mov r3, #0xa\n\ +._356:\n\ + cmp r4, #0x1\n\ + bhi ._357 @cond_branch\n\ + mov r0, #0x37\n\ + b ._358\n\ +._360:\n\ + .align 2, 0\n\ +._359:\n\ + .word gAnimMoveTurn\n\ + .word gDisplayedStringBattle\n\ + .word gUnknown_03004210\n\ + .word gMain\n\ + .word BattleText_Format\n\ + .word gBattlePartyID\n\ + .word gActiveBank\n\ + .word gPlayerParty\n\ + .word gMoveNames\n\ +._357:\n\ + mov r0, #0x39\n\ +._358:\n\ + str r0, [sp]\n\ + add r0, r6, #0\n\ + add r1, r5, #0\n\ + bl Text_InitWindow\n\ + ldr r0, ._362 @ gUnknown_03004210\n\ + bl Text_PrintWindow8002F44\n\ + add r0, r4, #1\n\ + lsl r0, r0, #0x18\n\ + lsr r4, r0, #0x18\n\ + cmp r4, #0x3\n\ + bls ._361 @cond_branch\n\ + ldr r1, ._362 + 4 @ gBattleBankFunc\n\ + ldr r0, ._362 + 8 @ gActiveBank\n\ + ldrb r0, [r0]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldr r1, ._362 + 12 @ sub_802C68C\n\ + str r1, [r0]\n\ +._355:\n\ + add sp, sp, #0xc\n\ + pop {r4, r5, r6}\n\ + pop {r0}\n\ + bx r0\n\ +._363:\n\ + .align 2, 0\n\ +._362:\n\ + .word gUnknown_03004210\n\ + .word gBattleBankFunc\n\ + .word gActiveBank\n\ + .word sub_802C68C+1"); +} + +__attribute__((naked)) +void debug_sub_803107C(void) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + add sp, sp, #0xfffffffc\n\ + mov r7, #0x0\n\ + ldr r0, ._369 @ gAnimScriptCallback\n\ + ldr r0, [r0]\n\ + bl _call_via_r0\n\ + ldr r0, ._369 + 4 @ gAnimScriptActive\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + bne ._364 @cond_branch\n\ + mov r0, #0x1\n\ + bl sub_80326EC\n\ + ldr r4, ._369 + 8 @ gActiveBank\n\ + ldrb r0, [r4]\n\ + mov r1, #0x1\n\ + mov r2, #0x7\n\ + mov r3, #0x1\n\ + bl dp11b_obj_instanciate\n\ + ldrb r0, [r4]\n\ + mov r1, #0x0\n\ + mov r2, #0x7\n\ + mov r3, #0x1\n\ + bl dp11b_obj_instanciate\n\ + ldr r0, ._369 + 12 @ gSprites\n\ + add r2, r0, #0\n\ + add r2, r2, #0x3e\n\ + mov r1, #0x3f\n\ +._366:\n\ + ldrb r0, [r2]\n\ + lsl r0, r0, #0x1f\n\ + cmp r0, #0\n\ + beq ._365 @cond_branch\n\ + add r0, r7, #1\n\ + lsl r0, r0, #0x18\n\ + lsr r7, r0, #0x18\n\ +._365:\n\ + add r2, r2, #0x44\n\ + sub r1, r1, #0x1\n\ + cmp r1, #0\n\ + bge ._366 @cond_branch\n\ + ldr r4, ._369 + 16 @ gDisplayedStringBattle\n\ + add r0, r4, #0\n\ + add r1, r7, #0\n\ + mov r2, #0x2\n\ + mov r3, #0x2\n\ + bl ConvertIntToDecimalStringN\n\ + ldr r6, ._369 + 20 @ gUnknown_03004210\n\ + mov r2, #0x91\n\ + lsl r2, r2, #0x1\n\ + mov r5, #0x39\n\ + str r5, [sp]\n\ + add r0, r6, #0\n\ + add r1, r4, #0\n\ + mov r3, #0x8\n\ + bl Text_InitWindowAndPrintText\n\ + bl GetTaskCount\n\ + lsl r0, r0, #0x18\n\ + lsr r7, r0, #0x18\n\ + add r0, r4, #0\n\ + add r1, r7, #0\n\ + mov r2, #0x2\n\ + mov r3, #0x2\n\ + bl ConvertIntToDecimalStringN\n\ + mov r2, #0x93\n\ + lsl r2, r2, #0x1\n\ + str r5, [sp]\n\ + add r0, r6, #0\n\ + add r1, r4, #0\n\ + mov r3, #0xb\n\ + bl Text_InitWindowAndPrintText\n\ + mov r1, #0x0\n\ + mov r7, #0x0\n\ + ldr r0, ._369 + 24 @ gOamMatrixAllocBitmap\n\ + mov r3, #0x1\n\ + ldr r2, [r0]\n\ +._368:\n\ + add r0, r3, #0\n\ + LSL r0, r1\n\ + and r0, r0, r2\n\ + cmp r0, #0\n\ + beq ._367 @cond_branch\n\ + add r0, r7, #1\n\ + lsl r0, r0, #0x18\n\ + lsr r7, r0, #0x18\n\ +._367:\n\ + add r1, r1, #0x1\n\ + cmp r1, #0x1f\n\ + ble ._368 @cond_branch\n\ + ldr r4, ._369 + 16 @ gDisplayedStringBattle\n\ + add r0, r4, #0\n\ + add r1, r7, #0\n\ + mov r2, #0x2\n\ + mov r3, #0x2\n\ + bl ConvertIntToDecimalStringN\n\ + ldr r0, ._369 + 20 @ gUnknown_03004210\n\ + mov r2, #0x95\n\ + lsl r2, r2, #0x1\n\ + mov r1, #0x39\n\ + str r1, [sp]\n\ + add r1, r4, #0\n\ + mov r3, #0xe\n\ + bl Text_InitWindowAndPrintText\n\ + ldr r1, ._369 + 28 @ gBattleBankFunc\n\ + ldr r0, ._369 + 8 @ gActiveBank\n\ + ldrb r0, [r0]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldr r1, ._369 + 32 @ debug_sub_8030C24\n\ + str r1, [r0]\n\ +._364:\n\ + add sp, sp, #0x4\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._370:\n\ + .align 2, 0\n\ +._369:\n\ + .word gAnimScriptCallback\n\ + .word gAnimScriptActive\n\ + .word gActiveBank\n\ + .word gSprites\n\ + .word gDisplayedStringBattle\n\ + .word gUnknown_03004210\n\ + .word gOamMatrixAllocBitmap\n\ + .word gBattleBankFunc\n\ + .word debug_sub_8030C24+1"); +} +#endif + void sub_802D204(void) { if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) @@ -1019,9 +1745,9 @@ void sub_802D31C(void) m4aMPlayContinue(&gMPlay_BGM); else m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 256); - sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); if (IsDoubleBattle()) - sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank ^ 2]], gActiveBank ^ 2); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank ^ 2]], gActiveBank ^ 2); ewram17810[gActiveBank].unk9 = 3; gBattleBankFunc[gActiveBank] = sub_802D2E0; } @@ -1077,7 +1803,7 @@ void sub_802D730(void) if (!ewram17810[gActiveBank].unk0_6 && !IsCryPlayingOrClearCrySongs()) { m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100); - sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); PlayerBufferExecCompleted(); } } @@ -1118,7 +1844,7 @@ void bx_t1_healthbar_update(void) } else { - sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); PlayerBufferExecCompleted(); } } @@ -1495,7 +2221,7 @@ void sub_802DF30(void) void sub_802DF88(void) { - if (gMain.callback2 == sub_800F808 && !gPaletteFade.active) + if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { if (gUnknown_0202E8F4 == 1) Emitcmd34(1, gUnknown_0202E8F5, gUnknown_02038470); @@ -1519,7 +2245,7 @@ void sub_802E004(void) void sub_802E03C(void) { - if (gMain.callback2 == sub_800F808 && !gPaletteFade.active) + if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { Emitcmd35(1, gSpecialVar_ItemId); PlayerBufferExecCompleted(); @@ -1557,13 +2283,13 @@ void sub_802E12C(s32 a, const u8 *b) StringCopy(gDisplayedStringBattle, b); StringAppend(gDisplayedStringBattle, gMoveNames[r4->moves[a]]); - InitWindow( + Text_InitWindow( &gUnknown_03004210, gDisplayedStringBattle, 0x300 + a * 20, (a & 1) ? 11 : 1, (a < 2) ? 0x37 : 0x39); - sub_8002F44(&gUnknown_03004210); + Text_PrintWindow8002F44(&gUnknown_03004210); } void sub_802E1B0(void) @@ -1572,7 +2298,7 @@ void sub_802E1B0(void) s32 i; gUnknown_03004348 = 0; - FillWindowRect(&gUnknown_03004210, 0x1016, 1, 0x37, 0x14, 0x3A); + Text_FillWindowRect(&gUnknown_03004210, 0x1016, 1, 0x37, 0x14, 0x3A); for (i = 0; i < 4; i++) { nullsub_7(i); @@ -1601,8 +2327,8 @@ void sub_802E220(void) str = ConvertIntToDecimalStringN(str, r4->pp[gMoveSelectionCursor[gActiveBank]], 1, 2); *str++ = CHAR_SLASH; ConvertIntToDecimalStringN(str, r4->unkC[gMoveSelectionCursor[gActiveBank]], 1, 2); - InitWindow(&gUnknown_03004210, gDisplayedStringBattle, 0x2A2, 0x19, 0x37); - sub_8002F44(&gUnknown_03004210); + Text_InitWindow(&gUnknown_03004210, gDisplayedStringBattle, 0x2A2, 0x19, 0x37); + Text_PrintWindow8002F44(&gUnknown_03004210); } } @@ -1613,8 +2339,8 @@ void sub_802E2D4(void) { if (gBattleBufferA[gActiveBank][2] == 1) { - FillWindowRect(&gUnknown_03004210, 0x1016, 0x17, 0x37, 0x1C, 0x3A); - InitWindow(&gUnknown_03004210, BattleText_ForgetMove, 0x290, 0x13, 0x37); + Text_FillWindowRect(&gUnknown_03004210, 0x1016, 0x17, 0x37, 0x1C, 0x3A); + Text_InitWindow(&gUnknown_03004210, BattleText_ForgetMove, 0x290, 0x13, 0x37); } else { @@ -1623,10 +2349,10 @@ void sub_802E2D4(void) str = StringCopy(str, BattleText_Format); StringCopy(str, gTypeNames[gBattleMoves[r4->moves[gMoveSelectionCursor[gActiveBank]]].type]); - FillWindowRect(&gUnknown_03004210, 0x1016, 0x17, 0x39, 0x1C, 0x3A); - InitWindow(&gUnknown_03004210, gDisplayedStringBattle, 0x2C0, 0x17, 0x39); + Text_FillWindowRect(&gUnknown_03004210, 0x1016, 0x17, 0x39, 0x1C, 0x3A); + Text_InitWindow(&gUnknown_03004210, gDisplayedStringBattle, 0x2C0, 0x17, 0x39); } - sub_8002F44(&gUnknown_03004210); + Text_PrintWindow8002F44(&gUnknown_03004210); } const u8 gUnknown_081FAE89[][2] = @@ -1652,7 +2378,7 @@ const u8 gUnknown_081FAE91[][2] = void sub_802E3B4(u8 a, int unused) { sub_814A958(0x48); - sub_814A880(gUnknown_081FAE89[a][0], gUnknown_081FAE89[a][1]); + MenuCursor_SetPos814A880(gUnknown_081FAE89[a][0], gUnknown_081FAE89[a][1]); } void nullsub_7(u8 a) @@ -1662,7 +2388,7 @@ void nullsub_7(u8 a) void sub_802E3E4(u8 a, int unused) { sub_814A958(0x2A); - sub_814A880(gUnknown_081FAE91[a][0], gUnknown_081FAE91[a][1]); + MenuCursor_SetPos814A880(gUnknown_081FAE91[a][0], gUnknown_081FAE91[a][1]); } void nullsub_8(u8 a) @@ -1695,9 +2421,9 @@ void b_link_standby_message(void) { if (gBattleTypeFlags & BATTLE_TYPE_LINK) { - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; - sub_8002EB0(&gUnknown_03004210, BattleText_LinkStandby, 0x90, 2, 15); + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; + Text_InitWindow8002EB0(&gUnknown_03004210, BattleText_LinkStandby, 0x90, 2, 15); } } @@ -2278,7 +3004,7 @@ void dp01_setattr_by_ch1_for_player_pokemon(u8 a) SetMonData(&gPlayerParty[a], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBank][3]); break; } - sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); } void PlayerHandlecmd3(void) @@ -2438,7 +3164,7 @@ void PlayerHandlecmd10(void) if (ewram17810[gActiveBank].unk0_6 == 0) { ewram17810[gActiveBank].unk4 = 0; - sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); PlaySE12WithPanning(SE_POKE_DEAD, -64); gSprites[gObjectBankIDs[gActiveBank]].data[1] = 0; gSprites[gObjectBankIDs[gActiveBank]].data[2] = 5; @@ -2458,7 +3184,7 @@ void PlayerHandlecmd12(void) { ewram17840.unk8 = 4; gDoingBattleAnim = 1; - move_anim_start_t4(gActiveBank, gActiveBank, GetBankByPlayerAI(1), 3); + move_anim_start_t4(gActiveBank, gActiveBank, GetBankByIdentity(1), 3); gBattleBankFunc[gActiveBank] = bx_wait_t1; } @@ -2468,7 +3194,7 @@ void PlayerHandleBallThrow(void) ewram17840.unk8 = var; gDoingBattleAnim = 1; - move_anim_start_t4(gActiveBank, gActiveBank, GetBankByPlayerAI(1), 3); + move_anim_start_t4(gActiveBank, gActiveBank, GetBankByIdentity(1), 3); gBattleBankFunc[gActiveBank] = bx_wait_t1; } @@ -2559,10 +3285,10 @@ void sub_8030190(void) void PlayerHandlePrintString(void) { - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; BufferStringBattle(*(u16 *)&gBattleBufferA[gActiveBank][2]); - sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 0x90, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 0x90, 2, 15); gBattleBankFunc[gActiveBank] = sub_802DF18; } @@ -2578,16 +3304,16 @@ void PlayerHandlecmd18(void) { int r4; - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 160; - FillWindowRect(&gUnknown_03004210, 10, 2, 15, 27, 18); - FillWindowRect(&gUnknown_03004210, 10, 2, 35, 16, 38); + gBattle_BG0_X = 0; + gBattle_BG0_Y = 160; + Text_FillWindowRect(&gUnknown_03004210, 10, 2, 15, 27, 18); + Text_FillWindowRect(&gUnknown_03004210, 10, 2, 35, 16, 38); gBattleBankFunc[gActiveBank] = sub_802C098; - InitWindow(&gUnknown_03004210, BattleText_MenuOptions, 400, 18, 35); - sub_8002F44(&gUnknown_03004210); - sub_814A5C0(0, 0xFFFF, 12, 11679, 0); + Text_InitWindow(&gUnknown_03004210, BattleText_MenuOptions, 400, 18, 35); + Text_PrintWindow8002F44(&gUnknown_03004210); + MenuCursor_Create814A5C0(0, 0xFFFF, 12, 11679, 0); for (r4 = 0; r4 < 4; r4++) nullsub_8(r4); @@ -2595,8 +3321,8 @@ void PlayerHandlecmd18(void) sub_802E3E4(gActionSelectionCursor[gActiveBank], 0); StrCpyDecodeToDisplayedStringBattle(BattleText_OtherMenu); - InitWindow(&gUnknown_03004210, gDisplayedStringBattle, SUB_803037C_TILE_DATA_OFFSET, 2, 35); - sub_8002F44(&gUnknown_03004210); + Text_InitWindow(&gUnknown_03004210, gDisplayedStringBattle, SUB_803037C_TILE_DATA_OFFSET, 2, 35); + Text_PrintWindow8002F44(&gUnknown_03004210); } void PlayerHandlecmd19() @@ -2605,22 +3331,22 @@ void PlayerHandlecmd19() void PlayerHandlecmd20(void) { - sub_814A5C0(0, 0xFFFF, 12, 0x2D9F, 0); + MenuCursor_Create814A5C0(0, 0xFFFF, 12, 0x2D9F, 0); sub_80304A8(); gBattleBankFunc[gActiveBank] = sub_802C68C; } void sub_80304A8(void) { - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 320; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 320; sub_802E1B0(); gUnknown_03004344 = 0xFF; sub_802E3B4(gMoveSelectionCursor[gActiveBank], 0); if (gBattleBufferA[gActiveBank][2] != 1) { - InitWindow(&gUnknown_03004210, BattleText_PP, 656, 23, 55); - sub_8002F44(&gUnknown_03004210); + Text_InitWindow(&gUnknown_03004210, BattleText_PP, 656, 23, 55); + Text_PrintWindow8002F44(&gUnknown_03004210); } sub_802E220(); sub_802E2D4(); @@ -2655,7 +3381,7 @@ void PlayerHandlecmd22(void) void PlayerHandlecmd23(void) { - BattleMusicStop(); + BattleStopLowHpSound(); BeginNormalPaletteFade(0xFFFFFFFF, 2, 0, 16, 0); PlayerBufferExecCompleted(); } @@ -2749,22 +3475,7 @@ void PlayerHandleDMATransfer(void) | (gBattleBufferA[gActiveBank][4] << 24); u16 val2 = gBattleBufferA[gActiveBank][5] | (gBattleBufferA[gActiveBank][6] << 8); - const u8 *src = &gBattleBufferA[gActiveBank][7]; - u8 *dst = (u8 *)val1; - u32 size = val2; - - while (1) - { - if (size <= 0x1000) - { - DmaCopy16(3, src, dst, size); - break; - } - DmaCopy16(3, src, dst, 0x1000); - src += 0x1000; - dst += 0x1000; - size -= 0x1000; - } + Dma3CopyLarge16_(&gBattleBufferA[gActiveBank][7], (u8 *)val1, val2); PlayerBufferExecCompleted(); } @@ -2875,7 +3586,7 @@ void PlayerHandleFaintingCry(void) void PlayerHandleIntroSlide(void) { - sub_80E43C0(gBattleBufferA[gActiveBank][1]); + StartBattleIntroAnim(gBattleBufferA[gActiveBank][1]); gUnknown_02024DE8 |= 1; PlayerBufferExecCompleted(); } diff --git a/src/battle/battle_controller_safari.c b/src/battle/battle_controller_safari.c index 6f6286945..5896e5e18 100644 --- a/src/battle/battle_controller_safari.c +++ b/src/battle/battle_controller_safari.c @@ -1,6 +1,7 @@ #include "global.h" #include "battle_anim_81258BC.h" #include "battle.h" +#include "battle_interface.h" #include "battle_message.h" #include "data2.h" #include "link.h" @@ -23,8 +24,8 @@ extern u8 gActiveBank; extern const u8 BattleText_MenuOptionsSafari[]; extern void *gBattleBankFunc[]; -extern u16 gUnknown_030042A0; -extern u16 gUnknown_030042A4; +extern u16 gBattle_BG0_Y; +extern u16 gBattle_BG0_X; extern u8 gBattleBufferA[][0x200]; extern bool8 gDoingBattleAnim; extern u8 gObjectBankIDs[]; @@ -40,14 +41,14 @@ extern u16 gUnknown_02024DE8; extern u8 gBattleOutcome; extern u8 GetBankSide(u8); -extern u8 GetBankByPlayerAI(u8); +extern u8 GetBankByIdentity(u8); extern u8 GetBankIdentity(u8); extern void LoadPlayerTrainerBankSprite(); extern u8 sub_8079E90(); extern void sub_80313A0(struct Sprite *); extern void sub_810BADC(void); extern void sub_8045A5C(); -extern void sub_80E43C0(); +extern void StartBattleIntroAnim(); extern void sub_804777C(); extern void sub_8043DFC(); extern bool8 move_anim_start_t3(); @@ -272,6 +273,17 @@ void bx_battle_menu_t6_2(void) sub_802E3E4(gActionSelectionCursor[gActiveBank], 0); } } +#if DEBUG + else if (gMain.newKeys & R_BUTTON) + { + if (!ewram17810[gActiveBank].unk0_5) + move_anim_start_t3(gActiveBank, gActiveBank, gActiveBank, 4, 0); + } + else if (gMain.newKeys & START_BUTTON) + { + sub_804454C(); + } +#endif } void sub_812B65C(void) @@ -313,7 +325,7 @@ void sub_812B724(void) void sub_812B758(void) { - if (gMain.callback2 == sub_800F808 && !gPaletteFade.active) + if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { Emitcmd35(1, gSpecialVar_ItemId); SafariBufferExecCompleted(); @@ -423,7 +435,7 @@ void SafariHandlecmd12(void) { ewram17840.unk8 = 4; gDoingBattleAnim = 1; - move_anim_start_t4(gActiveBank, gActiveBank, GetBankByPlayerAI(1), 4); + move_anim_start_t4(gActiveBank, gActiveBank, GetBankByIdentity(1), 4); gBattleBankFunc[gActiveBank] = bx_wait_t6; } @@ -433,7 +445,7 @@ void SafariHandleBallThrow(void) ewram17840.unk8 = var; gDoingBattleAnim = 1; - move_anim_start_t4(gActiveBank, gActiveBank, GetBankByPlayerAI(1), 4); + move_anim_start_t4(gActiveBank, gActiveBank, GetBankByIdentity(1), 4); gBattleBankFunc[gActiveBank] = bx_wait_t6; } @@ -450,10 +462,10 @@ void SafariHandleMoveAnimation(void) void SafariHandlePrintString(void) { - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; BufferStringBattle(*(u16 *)&gBattleBufferA[gActiveBank][2]); - sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); gBattleBankFunc[gActiveBank] = sub_812B694; } @@ -469,16 +481,16 @@ void SafariHandlecmd18(void) { int i; - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 160; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 160; gUnknown_03004210.paletteNum = 0; - FillWindowRect_DefaultPalette(&gUnknown_03004210, 10, 2, 15, 27, 18); - FillWindowRect_DefaultPalette(&gUnknown_03004210, 10, 2, 35, 16, 36); + Text_FillWindowRectDefPalette(&gUnknown_03004210, 10, 2, 15, 27, 18); + Text_FillWindowRectDefPalette(&gUnknown_03004210, 10, 2, 35, 16, 36); gBattleBankFunc[gActiveBank] = bx_battle_menu_t6_2; - InitWindow(&gUnknown_03004210, BattleText_MenuOptionsSafari, 400, 18, 35); - sub_8002F44(&gUnknown_03004210); - sub_814A5C0(0, 0xFFFF, 12, 11679, 0); + Text_InitWindow(&gUnknown_03004210, BattleText_MenuOptionsSafari, 400, 18, 35); + Text_PrintWindow8002F44(&gUnknown_03004210); + MenuCursor_Create814A5C0(0, 0xFFFF, 12, 11679, 0); for (i = 0; i < 4; i++) nullsub_8(i); @@ -486,8 +498,8 @@ void SafariHandlecmd18(void) sub_802E3E4(gActionSelectionCursor[gActiveBank], 0); StrCpyDecodeToDisplayedStringBattle(BattleText_PlayerMenu); - InitWindow(&gUnknown_03004210, gDisplayedStringBattle, SUB_812BB10_TILE_DATA_OFFSET, 2, 35); - sub_8002F44(&gUnknown_03004210); + Text_InitWindow(&gUnknown_03004210, gDisplayedStringBattle, SUB_812BB10_TILE_DATA_OFFSET, 2, 35); + Text_PrintWindow8002F44(&gUnknown_03004210); } void SafariHandlecmd19(void) @@ -641,7 +653,7 @@ void SafariHandleFaintingCry(void) void SafariHandleIntroSlide(void) { - sub_80E43C0(gBattleBufferA[gActiveBank][1]); + StartBattleIntroAnim(gBattleBufferA[gActiveBank][1]); gUnknown_02024DE8 |= 1; SafariBufferExecCompleted(); } diff --git a/src/battle/battle_controller_wally.c b/src/battle/battle_controller_wally.c index 8ace11fc1..49f530129 100644 --- a/src/battle/battle_controller_wally.c +++ b/src/battle/battle_controller_wally.c @@ -53,8 +53,8 @@ extern u8 gUnknown_02024E68[]; extern struct SpriteTemplate gUnknown_02024E8C; extern u8 gAnimMoveTurn; extern struct Window gUnknown_03004210; -extern u16 gUnknown_030042A0; -extern u16 gUnknown_030042A4; +extern u16 gBattle_BG0_Y; +extern u16 gBattle_BG0_X; extern u8 gUnknown_0300434C[]; extern const u8 BattleText_WallyMenu[]; extern const u8 BattleText_MenuOptions[]; @@ -75,7 +75,7 @@ extern void PlayerHandlecmd1(void); extern void LoadPlayerTrainerBankSprite(); extern u8 GetBankIdentity(u8); extern void sub_80313A0(struct Sprite *); -extern u8 GetBankByPlayerAI(u8); +extern u8 GetBankByIdentity(u8); extern u8 sub_8031720(); extern void DoMoveAnim(); extern void sub_80326EC(); @@ -85,7 +85,7 @@ extern void BufferStringBattle(); extern u8 GetBankSide(u8); extern void sub_80304A8(void); extern void sub_8047858(); -extern void sub_80E43C0(); +extern void StartBattleIntroAnim(); extern void oamt_add_pos2_onto_pos1(); extern void sub_8078B34(struct Sprite *); extern void sub_8030E38(struct Sprite *); @@ -363,7 +363,7 @@ void sub_81374C4(void) void sub_81374FC(void) { - if (gMain.callback2 == sub_800F808 + if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { Emitcmd35(1, gSpecialVar_ItemId); @@ -412,7 +412,7 @@ void sub_81376B8(void) FreeSpriteTilesByTag(0x27F9); FreeSpritePaletteByTag(0x27F9); CreateTask(c3_0802FDF4, 10); - sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); WallyBufferExecCompleted(); } } @@ -429,7 +429,7 @@ void sub_81377B0(void) } else { - sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); WallyBufferExecCompleted(); } } @@ -1066,7 +1066,7 @@ void sub_8138294(u8 a) SetMonData(&gPlayerParty[a], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBank][3]); break; } - sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); } void WallyHandlecmd3(void) @@ -1149,7 +1149,7 @@ void WallyHandlecmd12(void) { ewram17840.unk8 = 4; gDoingBattleAnim = TRUE; - move_anim_start_t4(gActiveBank, gActiveBank, GetBankByPlayerAI(1), 4); + move_anim_start_t4(gActiveBank, gActiveBank, GetBankByIdentity(1), 4); gBattleBankFunc[gActiveBank] = bx_wait_t5; } @@ -1159,7 +1159,7 @@ void WallyHandleBallThrow(void) ewram17840.unk8 = val; gDoingBattleAnim = TRUE; - move_anim_start_t4(gActiveBank, gActiveBank, GetBankByPlayerAI(1), 4); + move_anim_start_t4(gActiveBank, gActiveBank, GetBankByIdentity(1), 4); gBattleBankFunc[gActiveBank] = bx_wait_t5; } @@ -1240,13 +1240,13 @@ void WallyHandlePrintString(void) { u16 *ptr; - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; ptr = (u16 *)&gBattleBufferA[gActiveBank][2]; if (*ptr == 2) DestroyMenuCursor(); BufferStringBattle(*ptr); - sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 0x90, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 0x90, 2, 15); gBattleBankFunc[gActiveBank] = sub_8137454; } @@ -1262,25 +1262,25 @@ void WallyHandlecmd18(void) { s32 i; - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 160; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 160; gUnknown_03004210.paletteNum = 0; - FillWindowRect_DefaultPalette(&gUnknown_03004210, 10, 2, 15, 27, 18); - FillWindowRect_DefaultPalette(&gUnknown_03004210, 10, 2, 35, 16, 36); + Text_FillWindowRectDefPalette(&gUnknown_03004210, 10, 2, 15, 27, 18); + Text_FillWindowRectDefPalette(&gUnknown_03004210, 10, 2, 35, 16, 36); gBattleBankFunc[gActiveBank] = sub_81372BC; - InitWindow(&gUnknown_03004210, BattleText_MenuOptions, 400, 18, 35); - sub_8002F44(&gUnknown_03004210); - sub_814A5C0(0, 0xFFFF, 12, 0x2D9F, 0); + Text_InitWindow(&gUnknown_03004210, BattleText_MenuOptions, 400, 18, 35); + Text_PrintWindow8002F44(&gUnknown_03004210); + MenuCursor_Create814A5C0(0, 0xFFFF, 12, 0x2D9F, 0); for (i = 0; i < 4; i++) nullsub_8(i); sub_802E3E4(0, 0); StrCpyDecodeToDisplayedStringBattle(BattleText_WallyMenu); #ifdef ENGLISH - InitWindow(&gUnknown_03004210, gDisplayedStringBattle, 440, 2, 35); + Text_InitWindow(&gUnknown_03004210, gDisplayedStringBattle, 440, 2, 35); #else - InitWindow(&gUnknown_03004210, gDisplayedStringBattle, 444, 2, 35); + Text_InitWindow(&gUnknown_03004210, gDisplayedStringBattle, 444, 2, 35); #endif - sub_8002F44(&gUnknown_03004210); + Text_PrintWindow8002F44(&gUnknown_03004210); } void WallyHandlecmd19(void) @@ -1470,7 +1470,7 @@ void WallyHandleFaintingCry(void) void WallyHandleIntroSlide(void) { - sub_80E43C0(gBattleBufferA[gActiveBank][1]); + StartBattleIntroAnim(gBattleBufferA[gActiveBank][1]); gUnknown_02024DE8 |= 1; WallyBufferExecCompleted(); } diff --git a/src/battle/battle_interface.c b/src/battle/battle_interface.c index 97568d254..9be026d53 100644 --- a/src/battle/battle_interface.c +++ b/src/battle/battle_interface.c @@ -79,8 +79,8 @@ extern const u16 gBattleInterfaceStatusIcons_DynPal[]; static void sub_8043D5C(struct Sprite *); static const void *sub_8043CDC(u8); -static void sub_8044210(u8, s16, u8); -static void draw_status_ailment_maybe(u8); +/*static*/ void sub_8044210(u8, s16, u8); +/*static*/ void draw_status_ailment_maybe(u8); extern void sub_8045180(struct Sprite *); static void sub_8045110(struct Sprite *); static void sub_8045048(struct Sprite *); @@ -651,7 +651,7 @@ void sub_8043F44(u8 a) #define CHAR_LV_SEPARATOR CHAR_PERIOD #endif -static void sub_8043FC0(u8 a, u8 b) +/*static*/ void sub_8043FC0(u8 a, u8 b) { u8 str[30]; void *const *r7; @@ -905,7 +905,7 @@ _0804420C: .4byte 0x04000008\n\ } #endif -static void sub_8044210(u8 a, s16 b, u8 c) +/*static*/ void sub_8044210(u8 a, s16 b, u8 c) { u8 str[0x14]; u8 *ptr; @@ -1277,6 +1277,8 @@ _08044548: .4byte 0x04000008\n\ } #endif +extern u8 gUnknown_020297ED; + void sub_804454C(void) { s32 i; @@ -1285,7 +1287,11 @@ void sub_804454C(void) for (i = 0; i < gNoOfAllBanks; i++) { if (gSprites[gHealthboxIDs[i]].callback == SpriteCallbackDummy +#if DEBUG + && (gUnknown_020297ED != 0 || GetBankSide(i) != 1) +#else && GetBankSide(i) != 1 +#endif && (IsDoubleBattle() || GetBankSide(i) != 0)) { u8 r6; @@ -2359,7 +2365,7 @@ void sub_8045180(struct Sprite *sprite) sprite->pos2.y = gSprites[spriteId].pos2.y; } -static void sub_80451A0(u8 a, struct Pokemon *pkmn) +/*static*/ void sub_80451A0(u8 a, struct Pokemon *pkmn) { u8 nickname[POKEMON_NAME_LENGTH]; u8 gender; @@ -2507,7 +2513,7 @@ static void sub_8045458(u8 a, u8 b) } } -static void draw_status_ailment_maybe(u8 a) +/*static*/ void draw_status_ailment_maybe(u8 a) { s32 r4; s32 r4_2; @@ -2649,7 +2655,7 @@ static u8 sub_80457E8(u8 a, u8 b) return ret; } -static void sub_80458B0(u8 a) +/*static*/ void sub_80458B0(u8 a) { u8 *r6; u8 r8; @@ -2675,7 +2681,7 @@ static void sub_80458B0(u8 a) } -static void sub_8045998(u8 a) +/*static*/ void sub_8045998(u8 a) { u8 *r7; u8 status; @@ -2752,6 +2758,15 @@ void sub_8045A5C(u8 a, struct Pokemon *pkmn, u8 c) { if (c == 3 || c == 0) sub_8043FC0(a, GetMonData(pkmn, MON_DATA_LEVEL)); +#if DEBUG + if (gUnknown_020297ED == 1) + { + if (c == 1 || c == 0) + sub_80440EC(a, GetMonData(pkmn, MON_DATA_HP), 0); + if (c == 2 || c == 0) + sub_80440EC(a, GetMonData(pkmn, MON_DATA_MAX_HP), 1); + } +#endif if (c == 5 || c == 0) { load_gfxc_health_bar(0); diff --git a/src/battle/battle_message.c b/src/battle/battle_message.c index 4ac8c7a6f..ed7ab3a35 100644 --- a/src/battle/battle_message.c +++ b/src/battle/battle_message.c @@ -25,6 +25,8 @@ #include "../data/battle_strings_en.h" #endif +// This is four lists of moves which use a different attack string in Japanese +// to the default. See the documentation for sub_8121D74 for more detail. const u16 gUnknown_084016BC[] = { MOVE_SWORDS_DANCE, @@ -69,7 +71,7 @@ const u16 gUnknown_084016BC[] = MOVE_MUDDY_WATER, MOVE_IRON_DEFENSE, MOVE_BOUNCE, - MOVE_NONE, + 0, MOVE_TELEPORT, MOVE_RECOVER, MOVE_BIDE, @@ -77,7 +79,7 @@ const u16 gUnknown_084016BC[] = MOVE_FLAIL, MOVE_TAUNT, MOVE_BULK_UP, - MOVE_NONE, + 0, MOVE_MEDITATE, MOVE_AGILITY, MOVE_MIMIC, @@ -96,7 +98,7 @@ const u16 gUnknown_084016BC[] = MOVE_FAKE_TEARS, MOVE_WATER_SPORT, MOVE_CALM_MIND, - MOVE_NONE, + 0, MOVE_POUND, MOVE_SCRATCH, MOVE_VICE_GRIP, @@ -144,7 +146,7 @@ const u16 gUnknown_084016BC[] = MOVE_ENDEAVOR, MOVE_TICKLE, MOVE_COVET, - MOVE_NONE, + 0, }; const u8 gUnknown_084017A8[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // empty flags @@ -158,7 +160,6 @@ extern u8 gBankAttacker; extern u8 gBankTarget; extern u8 gStringBank; extern u8 gEffectBank; -extern u8 gAbilitiesPerBank[4]; extern u8 gBattleTextBuff1[]; extern u8 gBattleTextBuff2[]; extern u8 gBattleTextBuff3[]; @@ -175,6 +176,8 @@ extern u16 gBattlePartyID[4]; extern struct BattleEnigmaBerry gEnigmaBerries[4]; extern u8 gBattleBufferA[4][0x200]; +EWRAM_DATA u8 gAbilitiesPerBank[4] = {0}; + extern const u8* const gUnknown_08401674[]; // table of pointers to 'a -TYPE' strings extern const u8* const gUnknown_08400F58[]; // table of pointers to stat strings extern const u8* const gUnknown_08400F78[]; // table of pointers to flavour strings @@ -199,7 +202,7 @@ s32 sub_803FC34(u16); void get_trainer_name(u8* dst); u8 get_trainer_class_name_index(void); u8 GetMultiplayerId(void); -u8 GetBankByPlayerAI(u8 ID); +u8 GetBankByIdentity(u8 ID); u8 GetBankSide(u8 bank); u8 GetBankIdentity(u8 bank); #ifdef GERMAN @@ -214,11 +217,11 @@ void BufferStringBattle(u16 stringID) gStringInfo = (struct StringInfoBattle*)(&gBattleBufferA[gActiveBank][4]); gLastUsedItem = gStringInfo->lastItem; gLastUsedAbility = gStringInfo->lastAbility; - BATTLE_STRUCT->scriptingActive = gStringInfo->scrActive; - BATTLE_STRUCT->unk1605E = gStringInfo->unk1605E; - BATTLE_STRUCT->hpScale = gStringInfo->hpScale; + gBattleStruct->scriptingActive = gStringInfo->scrActive; + gBattleStruct->unk1605E = gStringInfo->unk1605E; + gBattleStruct->hpScale = gStringInfo->hpScale; gStringBank = gStringInfo->StringBank; - BATTLE_STRUCT->stringMoveType = gStringInfo->moveType; + gBattleStruct->stringMoveType = gStringInfo->moveType; for (i = 0; i < 4; i++) { gAbilitiesPerBank[i] = gStringInfo->abilities[i]; @@ -304,11 +307,11 @@ void BufferStringBattle(u16 stringID) case 2: // sending poke to ball msg if (GetBankSide(gActiveBank) == 0) { - if (BATTLE_STRUCT->hpScale == 0) + if (gBattleStruct->hpScale == 0) stringPtr = BattleText_ComeBackSingle1; - else if (BATTLE_STRUCT->hpScale == 1 || gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + else if (gBattleStruct->hpScale == 1 || gBattleTypeFlags & BATTLE_TYPE_DOUBLE) stringPtr = BattleText_ComeBackSingle2; - else if (BATTLE_STRUCT->hpScale == 2) + else if (gBattleStruct->hpScale == 2) stringPtr = BattleText_ComeBackSingle3; else stringPtr = BattleText_ComeBackSingle4; @@ -332,13 +335,13 @@ void BufferStringBattle(u16 stringID) } break; case 3: // switch-in msg - if (GetBankSide(BATTLE_STRUCT->scriptingActive) == 0) + if (GetBankSide(gBattleStruct->scriptingActive) == 0) { - if (BATTLE_STRUCT->hpScale == 0 || gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (gBattleStruct->hpScale == 0 || gBattleTypeFlags & BATTLE_TYPE_DOUBLE) stringPtr = BattleText_SentOutSingle7; - else if (BATTLE_STRUCT->hpScale == 1) + else if (gBattleStruct->hpScale == 1) stringPtr = BattleText_SentOutSingle8; - else if (BATTLE_STRUCT->hpScale == 2) + else if (gBattleStruct->hpScale == 2) stringPtr = BattleText_SentOutSingle9; else stringPtr = BattleText_SentOutSingle10; @@ -364,7 +367,7 @@ void BufferStringBattle(u16 stringID) case 4: // pokemon used a move msg sub_8121D1C(gBattleTextBuff1); if (gStringInfo->currentMove > 0x162) - StringCopy(gBattleTextBuff2, gUnknown_08401674[BATTLE_STRUCT->stringMoveType]); + StringCopy(gBattleTextBuff2, gUnknown_08401674[gBattleStruct->stringMoveType]); else StringCopy(gBattleTextBuff2, gMoveNames[gStringInfo->currentMove]); sub_8121D74(gBattleTextBuff2); @@ -572,22 +575,22 @@ u32 StrCpyDecodeBattle(const u8* src, u8* dst) toCpy = gBattleTextBuff3; break; case 2: // first player poke name - GetMonData(&gPlayerParty[gBattlePartyID[GetBankByPlayerAI(0)]], MON_DATA_NICKNAME, text); + GetMonData(&gPlayerParty[gBattlePartyID[GetBankByIdentity(0)]], MON_DATA_NICKNAME, text); StringGetEnd10(text); toCpy = text; break; case 3: // first enemy poke name - GetMonData(&gEnemyParty[gBattlePartyID[GetBankByPlayerAI(1)]], MON_DATA_NICKNAME, text); + GetMonData(&gEnemyParty[gBattlePartyID[GetBankByIdentity(1)]], MON_DATA_NICKNAME, text); StringGetEnd10(text); toCpy = text; break; case 4: // second player poke name - GetMonData(&gPlayerParty[gBattlePartyID[GetBankByPlayerAI(2)]], MON_DATA_NICKNAME, text); + GetMonData(&gPlayerParty[gBattlePartyID[GetBankByIdentity(2)]], MON_DATA_NICKNAME, text); StringGetEnd10(text); toCpy = text; break; case 5: // second enemy poke name - GetMonData(&gEnemyParty[gBattlePartyID[GetBankByPlayerAI(3)]], MON_DATA_NICKNAME, text); + GetMonData(&gEnemyParty[gBattlePartyID[GetBankByIdentity(3)]], MON_DATA_NICKNAME, text); StringGetEnd10(text); toCpy = text; break; @@ -612,13 +615,13 @@ u32 StrCpyDecodeBattle(const u8* src, u8* dst) toCpy = text; break; case 10: // attacker name with prefix, only bank 0/1 - HANDLE_NICKNAME_STRING_CASE(gBankAttacker, gBattlePartyID[GetBankByPlayerAI(GetBankIdentity(gBankAttacker) & 1)]) + HANDLE_NICKNAME_STRING_CASE(gBankAttacker, gBattlePartyID[GetBankByIdentity(GetBankIdentity(gBankAttacker) & 1)]) break; case 11: // attacker partner name, only bank 0/1 if (GetBankSide(gBankAttacker) == 0) - GetMonData(&gPlayerParty[gBattlePartyID[GetBankByPlayerAI(GetBankIdentity(gBankAttacker) & 1) + 2]], MON_DATA_NICKNAME, text); + GetMonData(&gPlayerParty[gBattlePartyID[GetBankByIdentity(GetBankIdentity(gBankAttacker) & 1) + 2]], MON_DATA_NICKNAME, text); else - GetMonData(&gEnemyParty[gBattlePartyID[GetBankByPlayerAI(GetBankIdentity(gBankAttacker) & 1) + 2]], MON_DATA_NICKNAME, text); + GetMonData(&gEnemyParty[gBattlePartyID[GetBankByIdentity(GetBankIdentity(gBankAttacker) & 1) + 2]], MON_DATA_NICKNAME, text); StringGetEnd10(text); toCpy = text; @@ -636,17 +639,17 @@ u32 StrCpyDecodeBattle(const u8* src, u8* dst) HANDLE_NICKNAME_STRING_CASE(gActiveBank, gBattlePartyID[gActiveBank]) break; case 16: // scripting active bank name with prefix - HANDLE_NICKNAME_STRING_CASE(BATTLE_STRUCT->scriptingActive, gBattlePartyID[BATTLE_STRUCT->scriptingActive]) + HANDLE_NICKNAME_STRING_CASE(gBattleStruct->scriptingActive, gBattlePartyID[gBattleStruct->scriptingActive]) break; case 17: // current move name if (gStringInfo->currentMove > 0x162) - toCpy = (void*) &gUnknown_08401674[BATTLE_STRUCT->stringMoveType]; + toCpy = (void*) &gUnknown_08401674[gBattleStruct->stringMoveType]; else toCpy = gMoveNames[gStringInfo->currentMove]; break; case 18: // last used move name if (gStringInfo->lastMove > 0x162) - toCpy = (void*) &gUnknown_08401674[BATTLE_STRUCT->stringMoveType]; + toCpy = (void*) &gUnknown_08401674[gBattleStruct->stringMoveType]; else toCpy = gMoveNames[gStringInfo->lastMove]; break; @@ -655,7 +658,7 @@ u32 StrCpyDecodeBattle(const u8* src, u8* dst) { if (gLastUsedItem == ITEM_ENIGMA_BERRY) { - if (gLinkPlayers[BATTLE_STRUCT->linkPlayerIndex].lp_field_18 == gStringBank) + if (gLinkPlayers[gBattleStruct->linkPlayerIndex].lp_field_18 == gStringBank) { StringCopy(text, gEnigmaBerries[gStringBank].name); #ifdef ENGLISH @@ -690,7 +693,7 @@ u32 StrCpyDecodeBattle(const u8* src, u8* dst) toCpy = gAbilityNames[gAbilitiesPerBank[gBankTarget]]; break; case 23: // scripting active ability - toCpy = gAbilityNames[gAbilitiesPerBank[BATTLE_STRUCT->scriptingActive]]; + toCpy = gAbilityNames[gAbilitiesPerBank[gBattleStruct->scriptingActive]]; break; case 24: // effect bank ability toCpy = gAbilityNames[gAbilitiesPerBank[gEffectBank]]; @@ -750,7 +753,7 @@ u32 StrCpyDecodeBattle(const u8* src, u8* dst) toCpy = gLinkPlayers[sub_803FC34(3 ^ gLinkPlayers[multiplayerID].lp_field_18)].name; break; case 31: // link scripting active name - toCpy = gLinkPlayers[sub_803FC34(BATTLE_STRUCT->scriptingActive)].name; + toCpy = gLinkPlayers[sub_803FC34(gBattleStruct->scriptingActive)].name; break; case 32: // player name toCpy = gSaveBlock2.playerName; @@ -759,7 +762,7 @@ u32 StrCpyDecodeBattle(const u8* src, u8* dst) toCpy = GetTrainerLoseText(); break; case 34: // ? - HANDLE_NICKNAME_STRING_CASE(BATTLE_STRUCT->scriptingActive, BATTLE_STRUCT->unk1605E) + HANDLE_NICKNAME_STRING_CASE(gBattleStruct->scriptingActive, gBattleStruct->unk1605E) break; case 35: // lanette pc if (FlagGet(FLAG_SYS_PC_LANETTE)) @@ -946,7 +949,7 @@ void StrCpyDecodeBattleTextBuff(u8* src, u8* dst) { if (hword == ITEM_ENIGMA_BERRY) { - if (gLinkPlayers[BATTLE_STRUCT->linkPlayerIndex].lp_field_18 == gStringBank) + if (gLinkPlayers[gBattleStruct->linkPlayerIndex].lp_field_18 == gStringBank) { StringCopy(dst, gEnigmaBerries[gStringBank].name); #ifdef ENGLISH @@ -970,6 +973,10 @@ void StrCpyDecodeBattleTextBuff(u8* src, u8* dst) } } +// Loads one of two text strings into the provided buffer. This is functionally +// unused, since the value loaded into the buffer is not read; it loaded one of +// two particles (either "は" or "の") which works in tandem with sub_8121D74 +// below to effect changes in the meaning of the line. void sub_8121D1C(u8* textBuff) { s32 counter = 0; @@ -992,6 +999,24 @@ void sub_8121D1C(u8* textBuff) } } +// Appends "!" to the text buffer `dst`. In the original Japanese this looked +// into the table of moves at gUnknown_084016BC and varied the line accordingly. +// +// BattleText_Exclamation was a plain "!", used for any attack not on the list. +// It resulted in the translation "<NAME>'s <ATTACK>!". +// +// BattleText_Exclamation2 was "を つかった!". This resulted in the translation +// "<NAME> used <ATTACK>!", which was used for all attacks in English. +// +// BattleText_Exclamation3 was "した!". This was used for those moves whose +// names were verbs, such as Recover, and resulted in translations like "<NAME> +// recovered itself!". +// +// BattleText_Exclamation4 was "を した!" This resulted in a translation of +// "<NAME> did an <ATTACK>!". +// +// BattleText_Exclamation5 was " こうげき!" This resulted in a translation of +// "<NAME>'s <ATTACK> attack!". void sub_8121D74(u8* dst) { s32 counter = 0; diff --git a/src/battle/battle_party_menu.c b/src/battle/battle_party_menu.c index d4dcae0ca..ed8cf4583 100644 --- a/src/battle/battle_party_menu.c +++ b/src/battle/battle_party_menu.c @@ -40,7 +40,7 @@ extern u8 gUnknown_0202E8F6; extern u8 gUnknown_02038470[3]; extern u8 gUnknown_02038473; extern u8 gUnknown_020384F0; -extern void (*gUnknown_03004AE4)(); //don't know types yet +extern void (*gPokemonItemUseCallback)(); //don't know types yet extern struct PokemonStorage gPokemonStorage; extern void nullsub_14(); @@ -122,7 +122,7 @@ static void sub_8094998(u8 arg[3], u8 player_number) if (!IsDoubleBattle()) { pos = 1; - *temp = gBattlePartyID[GetBankByPlayerAI(0)]; + *temp = gBattlePartyID[GetBankByIdentity(0)]; for (i = 0; i <= 5; i++) if (i != *temp) temp[pos++] = i; @@ -130,8 +130,8 @@ static void sub_8094998(u8 arg[3], u8 player_number) else { pos = 2; - *temp = gBattlePartyID[GetBankByPlayerAI(0)]; - temp[1] = gBattlePartyID[GetBankByPlayerAI(2)]; + *temp = gBattlePartyID[GetBankByIdentity(0)]; + temp[1] = gBattlePartyID[GetBankByIdentity(2)]; for (i = 0; i <= 5; i++) if ((i != *temp) && (i != temp[1])) temp[pos++] = i; @@ -147,13 +147,13 @@ static void sub_8094A74(u8 arg[3], u8 player_number, u32 arg3) u8 temp[6]; if (!GetBankSide(arg3)) { - i = GetBankByPlayerAI(0); - j = GetBankByPlayerAI(2); + i = GetBankByIdentity(0); + j = GetBankByIdentity(2); } else { - i = GetBankByPlayerAI(1); - j = GetBankByPlayerAI(3); + i = GetBankByIdentity(1); + j = GetBankByIdentity(3); } if (IsLinkDoubleBattle() == TRUE) { @@ -466,7 +466,7 @@ void HandleBattlePartyMenu(u8 taskId) { if (gUnknown_02038473 == 3 && GetItemEffectType(gSpecialVar_ItemId) == 10) { - gUnknown_03004AE4(taskId, gSpecialVar_ItemId, Task_80952E4); + gPokemonItemUseCallback(taskId, gSpecialVar_ItemId, Task_80952E4); return; } @@ -480,7 +480,7 @@ void HandleBattlePartyMenu(u8 taskId) else { sub_806D5A4(); - gUnknown_03004AE4(taskId, gSpecialVar_ItemId, Task_80952E4); + gPokemonItemUseCallback(taskId, gSpecialVar_ItemId, Task_80952E4); } } else @@ -583,13 +583,13 @@ static void Task_HandlePopupMenuInput(u8 taskId) if (gMain.newAndRepeatedKeys & DPAD_UP) { PlaySE(SE_SELECT); - MoveMenuCursor(-1); + Menu_MoveCursor(-1); return; } if (gMain.newAndRepeatedKeys & DPAD_DOWN) { PlaySE(SE_SELECT); - MoveMenuCursor(1); + Menu_MoveCursor(1); return; } if (gMain.newKeys & A_BUTTON) @@ -598,7 +598,7 @@ static void Task_HandlePopupMenuInput(u8 taskId) func = PartyMenuGetPopupMenuFunc(gTasks[taskId].data[4], sBattlePartyPopupMenus, sBattlePartyMenuActions, - GetMenuCursorPos()); + Menu_GetCursorPos()); func(taskId); return; } @@ -723,7 +723,7 @@ static void Task_BattlePartyMenuShift(u8 taskId) static void Task_BattlePartyMenuCancel(u8 taskId) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); ClosePartyPopupMenu(gTasks[taskId].data[4], sBattlePartyPopupMenus); gTasks[taskId].data[4] = gTasks[taskId].data[5]; PrintPartyMenuPromptText(0, 0); diff --git a/src/battle/battle_records.c b/src/battle/battle_records.c index 97740e3da..1532a0b2f 100644 --- a/src/battle/battle_records.c +++ b/src/battle/battle_records.c @@ -8,9 +8,35 @@ #include "strings2.h" #include "trainer_card.h" +struct DebugStruct1 +{ + u16 var0; + u8 var1[10]; +}; + extern struct LinkPlayerMapObject gLinkPlayerMapObjects[4]; extern u8 gBattleOutcome; +#if DEBUG +const struct DebugStruct1 gUnknown_Debug_4245CC[] = +{ + { 1, _("NUMBER1") }, + { 2, _("ナンバー2") }, + { 3, _("ナンバー3") }, + { 4, _("ナンバー4") }, + { 5, _("ナンバー5") }, + { 6, _("ナンバー6") }, + { 7, _("ナンバー7") }, +}; + +const u8 gUnknown_Debug_8424620[][4] = +{ + { 1, 1, 0, 0 }, + { 2, 1, 0, 0 }, + { 3, 1, 0, 0 }, +}; +#endif + static void InitLinkBattleRecord(struct LinkBattleRecord *record) { CpuFill16(0, record, sizeof(struct LinkBattleRecord)); @@ -197,12 +223,72 @@ void UpdateLinkBattleRecords(int id) gLinkPlayers[gLinkPlayerMapObjects[id].linkPlayerId].language); } +#if DEBUG +__attribute__((naked)) +void debug_sub_81257E0(void) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + add sp, sp, #0xfffffffc\n\ + bl InitLinkBattleRecords\n\ + mov r5, #0x0\n\ + ldr r6, ._62 @ gUnknown_Debug_4245CC\n\ + sub r0, r6, #2\n\ + mov r8, r0\n\ + ldr r7, ._62 + 4 @ gLinkPlayers\n\ +._61:\n\ + ldr r0, ._62 + 8 @ gUnknown_Debug_8424620\n\ + lsl r3, r5, #0x2\n\ + add r3, r3, r0\n\ + ldrb r4, [r3]\n\ + sub r4, r4, #0x1\n\ + lsl r0, r4, #0x1\n\ + add r0, r0, r4\n\ + lsl r0, r0, #0x2\n\ + add r1, r0, r6\n\ + add r0, r0, r8\n\ + ldrh r2, [r0]\n\ + ldrb r3, [r3, #0x1]\n\ + ldr r0, ._62 + 12 @ gLinkPlayerMapObjects\n\ + lsl r4, r4, #0x2\n\ + add r4, r4, r0\n\ + ldrb r4, [r4, #0x1]\n\ + lsl r0, r4, #0x3\n\ + sub r0, r0, r4\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r7\n\ + ldrb r0, [r0, #0x1a]\n\ + str r0, [sp]\n\ + ldr r0, ._62 + 16 @ gSaveBlock1\n\ + bl UpdateLinkBattleRecords_\n\ + add r5, r5, #0x1\n\ + cmp r5, #0x2\n\ + bls ._61 @cond_branch\n\ + add sp, sp, #0x4\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._63:\n\ + .align 2, 0\n\ +._62:\n\ + .word gUnknown_Debug_4245CC+2\n\ + .word gLinkPlayers\n\ + .word gUnknown_Debug_8424620\n\ + .word gLinkPlayerMapObjects\n\ + .word gSaveBlock1+0x30b8"); +} +#endif + static void PrintLinkBattleWinsLossesDraws(struct LinkBattleRecord *records) { ConvertIntToDecimalStringN_DigitWidth6(gStringVar1, GetGameStat(GAME_STAT_LINK_BATTLE_WINS), STR_CONV_MODE_RIGHT_ALIGN, 4); ConvertIntToDecimalStringN_DigitWidth6(gStringVar2, GetGameStat(GAME_STAT_LINK_BATTLE_LOSSES), STR_CONV_MODE_RIGHT_ALIGN, 4); ConvertIntToDecimalStringN_DigitWidth6(gStringVar3, GetGameStat(GAME_STAT_LINK_BATTLE_DRAWS), STR_CONV_MODE_RIGHT_ALIGN, 4); - MenuPrint(gOtherText_WinRecord, 3, 3); + Menu_PrintText(gOtherText_WinRecord, 3, 3); } static void PrintLinkBattleRecord(struct LinkBattleRecord *record, u8 y) @@ -217,39 +303,40 @@ static void PrintLinkBattleRecord(struct LinkBattleRecord *record, u8 y) buffer[4] = 0x11; buffer[5] = 1; StringCopy(buffer + 6, gOtherText_SevenDashes); - MenuPrint(buffer, 3, y); + Menu_PrintText(buffer, 3, y); StringCopy(buffer + 6, gOtherText_FourDashes); - MenuPrint(buffer, 11, y); - MenuPrint(buffer, 17, y); - MenuPrint(buffer, 23, y); + Menu_PrintText(buffer, 11, y); + Menu_PrintText(buffer, 17, y); + Menu_PrintText(buffer, 23, y); } else { StringFillWithTerminator(gStringVar1, 8); StringCopyN(gStringVar1, record->name, 7); - MenuPrint(gStringVar1, 3, y); + Menu_PrintText(gStringVar1, 3, y); gStringVar1[0] = EXT_CTRL_CODE_BEGIN; gStringVar1[1] = 0x14; gStringVar1[2] = 6; ConvertIntToDecimalStringN(gStringVar1 + 3, record->wins, STR_CONV_MODE_RIGHT_ALIGN, 4); - MenuPrint(gStringVar1, 11, y); + Menu_PrintText(gStringVar1, 11, y); ConvertIntToDecimalStringN(gStringVar1 + 3, record->losses, STR_CONV_MODE_RIGHT_ALIGN, 4); - MenuPrint(gStringVar1, 17, y); + Menu_PrintText(gStringVar1, 17, y); ConvertIntToDecimalStringN(gStringVar1 + 3, record->draws, STR_CONV_MODE_RIGHT_ALIGN, 4); - MenuPrint(gStringVar1, 23, y); + Menu_PrintText(gStringVar1, 23, y); } } -void ShowLinkBattleRecords(void) { +void ShowLinkBattleRecords(void) +{ s32 i; - MenuDrawTextWindow(1, 0, 28, 18); + Menu_DrawStdWindowFrame(1, 0, 28, 18); sub_8072BD8(gOtherText_BattleResults, 0, 1, 240); PrintLinkBattleWinsLossesDraws(gSaveBlock1.linkBattleRecords); #if ENGLISH - MenuPrint(gOtherText_WinLoseDraw, 12, 6); + Menu_PrintText(gOtherText_WinLoseDraw, 12, 6); #elif GERMAN - MenuPrint_PixelCoords(gOtherText_WinLoseDraw, 88, 48, 1); + Menu_PrintTextPixelCoords(gOtherText_WinLoseDraw, 88, 48, 1); #endif for (i = 0; i < 5; i++) @@ -285,11 +372,11 @@ static bool32 sub_8110494(u8 level) static void PrintWinStreak(const u8 *str, u16 streak, u8 left, u8 top) { - MenuPrint(str, left, top); + Menu_PrintText(str, left, top); if (streak > 9999) streak = 9999; sub_8072C14(gStringVar1, streak, 24, 1); - MenuPrint(gOtherText_WinStreak, left + 7, top); + Menu_PrintText(gOtherText_WinStreak, left + 7, top); } static void PrintRecordWinStreak(u8 level, u8 left, u8 top) @@ -320,10 +407,10 @@ static void PrintLastWinStreak(u8 level, u8 left, u8 top) void ShowBattleTowerRecords(void) { u16 i; - MenuDrawTextWindow(3, 1, 27, 17); + Menu_DrawStdWindowFrame(3, 1, 27, 17); sub_8072BD8(gOtherText_BattleTowerResults, 3, 2, 0xC8); - MenuPrint(gOtherText_Lv50, 5, 6); - MenuPrint(gOtherText_Lv100, 5, 12); + Menu_PrintText(gOtherText_Lv50, 5, 6); + Menu_PrintText(gOtherText_Lv100, 5, 12); for (i = 5; i < 26; i++) { sub_8071F60(CHAR_HYPHEN, i, 10); diff --git a/src/battle/battle_setup.c b/src/battle/battle_setup.c index b4ff407fc..15555f833 100644 --- a/src/battle/battle_setup.c +++ b/src/battle/battle_setup.c @@ -475,7 +475,7 @@ static void Task_BattleStart(u8 taskId) switch (tState) { case 0: - if (!FieldPoisonEffectIsRunning()) // is poison not active? + if (!FldeffPoison_IsActive()) // is poison not active? { BattleTransition_StartOnField(tTransition); tState++; // go to case 1. @@ -520,8 +520,8 @@ static void DoStandardWildBattle(void) gMain.savedCallback = CB2_EndWildBattle; gBattleTypeFlags = 0; CreateBattleStartTask(GetWildBattleTransition(), 0); - IncrementGameStat(7); - IncrementGameStat(8); + IncrementGameStat(GAME_STAT_TOTAL_BATTLES); + IncrementGameStat(GAME_STAT_WILD_BATTLES); } void BattleSetup_StartRoamerBattle(void) @@ -532,8 +532,8 @@ void BattleSetup_StartRoamerBattle(void) gMain.savedCallback = CB2_EndWildBattle; gBattleTypeFlags = BATTLE_TYPE_ROAMER; CreateBattleStartTask(GetWildBattleTransition(), 0); - IncrementGameStat(7); - IncrementGameStat(8); + IncrementGameStat(GAME_STAT_TOTAL_BATTLES); + IncrementGameStat(GAME_STAT_WILD_BATTLES); } static void DoSafariBattle(void) @@ -549,8 +549,8 @@ static void DoSafariBattle(void) static void StartTheBattle(void) { CreateBattleStartTask(GetTrainerBattleTransition(), 0); - IncrementGameStat(7); - IncrementGameStat(9); + IncrementGameStat(GAME_STAT_TOTAL_BATTLES); + IncrementGameStat(GAME_STAT_TRAINER_BATTLES); } //Initiates battle where Wally catches Ralts @@ -569,8 +569,8 @@ void BattleSetup_StartScriptedWildBattle(void) gMain.savedCallback = CB2_EndScriptedWildBattle; gBattleTypeFlags = 0; CreateBattleStartTask(GetWildBattleTransition(), 0); - IncrementGameStat(7); - IncrementGameStat(8); + IncrementGameStat(GAME_STAT_TOTAL_BATTLES); + IncrementGameStat(GAME_STAT_WILD_BATTLES); } void ScrSpecial_StartSouthernIslandBattle(void) @@ -579,8 +579,8 @@ void ScrSpecial_StartSouthernIslandBattle(void) gMain.savedCallback = CB2_EndScriptedWildBattle; gBattleTypeFlags = BATTLE_TYPE_LEGENDARY; CreateBattleStartTask(GetWildBattleTransition(), 0); - IncrementGameStat(7); - IncrementGameStat(8); + IncrementGameStat(GAME_STAT_TOTAL_BATTLES); + IncrementGameStat(GAME_STAT_WILD_BATTLES); } void ScrSpecial_StartRayquazaBattle(void) @@ -589,8 +589,8 @@ void ScrSpecial_StartRayquazaBattle(void) gMain.savedCallback = CB2_EndScriptedWildBattle; gBattleTypeFlags = BATTLE_TYPE_LEGENDARY; CreateBattleStartTask(B_TRANSITION_BLUR, BGM_BATTLE34); - IncrementGameStat(7); - IncrementGameStat(8); + IncrementGameStat(GAME_STAT_TOTAL_BATTLES); + IncrementGameStat(GAME_STAT_WILD_BATTLES); } void ScrSpecial_StartGroudonKyogreBattle(void) @@ -602,8 +602,8 @@ void ScrSpecial_StartGroudonKyogreBattle(void) CreateBattleStartTask(B_TRANSITION_SHARDS, BGM_BATTLE34); // GROUDON else CreateBattleStartTask(B_TRANSITION_RIPPLE, BGM_BATTLE34); // KYOGRE - IncrementGameStat(7); - IncrementGameStat(8); + IncrementGameStat(GAME_STAT_TOTAL_BATTLES); + IncrementGameStat(GAME_STAT_WILD_BATTLES); } void ScrSpecial_StartRegiBattle(void) @@ -612,8 +612,8 @@ void ScrSpecial_StartRegiBattle(void) gMain.savedCallback = CB2_EndScriptedWildBattle; gBattleTypeFlags = BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_REGI; CreateBattleStartTask(B_TRANSITION_GRID_SQUARES, BGM_BATTLE36); - IncrementGameStat(7); - IncrementGameStat(8); + IncrementGameStat(GAME_STAT_TOTAL_BATTLES); + IncrementGameStat(GAME_STAT_WILD_BATTLES); } static void CB2_EndWildBattle(void) @@ -879,8 +879,8 @@ static void CB2_StartFirstBattle(void) SetMainCallback2(sub_800E7C4); prev_quest_postbuffer_cursor_backup_reset(); overworld_poison_timer_set(); - IncrementGameStat(7); - IncrementGameStat(8); + IncrementGameStat(GAME_STAT_TOTAL_BATTLES); + IncrementGameStat(GAME_STAT_WILD_BATTLES); } } diff --git a/src/battle/battle_transition.c b/src/battle/battle_transition.c index 985f43945..a94974b27 100644 --- a/src/battle/battle_transition.c +++ b/src/battle/battle_transition.c @@ -6,6 +6,7 @@ #include "palette.h" #include "trig.h" #include "field_effect.h" +#include "field_weather.h" #include "random.h" #include "sprite.h" #include "sound.h" @@ -13,12 +14,9 @@ #include "trainer.h" #include "field_camera.h" #include "ewram.h" -#include "unknown_task.h" +#include "scanline_effect.h" -void sub_807DE10(void); -void dp12_8087EA4(void); - -extern u16 gUnknown_03005560[]; +void ScanlineEffect_Clear(void); extern const struct OamData gFieldOamData_32x32; @@ -569,7 +567,7 @@ static void Task_BattleTransitionMain(u8 taskID) static bool8 Transition_Phase1(struct Task* task) { - sub_807DE10(); + SetWeatherScreenFadeOut(); CpuCopy32(gPlttBufferFaded, gPlttBufferUnfaded, 0x400); if (sPhase1_Tasks[task->tTransitionID] != NULL) { @@ -672,9 +670,9 @@ static bool8 Phase2_Transition_Swirl_Func1(struct Task* task) u16 savedIME; sub_811D658(); - dp12_8087EA4(); + ScanlineEffect_Clear(); BeginNormalPaletteFade(-1, 4, 0, 0x10, 0); - sub_811D6E8(gUnknown_03005560, TRANSITION_STRUCT.field_14, 0, 2, 0, 160); + sub_811D6E8(gScanlineEffectRegBuffers[1], TRANSITION_STRUCT.field_14, 0, 2, 0, 160); SetVBlankCallback(VBlankCB_Phase2_Transition_Swirl); SetHBlankCallback(HBlankCB_Phase2_Transition_Swirl); @@ -695,7 +693,7 @@ static bool8 Phase2_Transition_Swirl_Func2(struct Task* task) task->data[1] += 4; task->data[2] += 8; - sub_811D6E8(gUnknown_03004DE0[0], TRANSITION_STRUCT.field_14, task->data[1], 2, task->data[2], 160); + sub_811D6E8(gScanlineEffectRegBuffers[0], TRANSITION_STRUCT.field_14, task->data[1], 2, task->data[2], 160); if (!gPaletteFade.active) { @@ -711,12 +709,12 @@ static void VBlankCB_Phase2_Transition_Swirl(void) { VBlankCB_BattleTransition(); if (TRANSITION_STRUCT.VBlank_DMA) - DmaCopy16(3, gUnknown_03004DE0[0], gUnknown_03004DE0[1], 320); + DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320); } static void HBlankCB_Phase2_Transition_Swirl(void) { - u16 var = gUnknown_03004DE0[1][REG_VCOUNT]; + u16 var = gScanlineEffectRegBuffers[1][REG_VCOUNT]; REG_BG1HOFS = var; REG_BG2HOFS = var; REG_BG3HOFS = var; @@ -732,10 +730,10 @@ static bool8 Phase2_Transition_Shuffle_Func1(struct Task* task) u16 savedIME; sub_811D658(); - dp12_8087EA4(); + ScanlineEffect_Clear(); BeginNormalPaletteFade(-1, 4, 0, 0x10, 0); - memset(gUnknown_03005560, TRANSITION_STRUCT.field_16, 0x140); + memset(gScanlineEffectRegBuffers[1], TRANSITION_STRUCT.field_16, 0x140); SetVBlankCallback(VBlankCB_Phase2_Transition_Shuffle); SetHBlankCallback(HBlankCB_Phase2_Transition_Shuffle); @@ -764,7 +762,7 @@ static bool8 Phase2_Transition_Shuffle_Func2(struct Task* task) for (i = 0; i < 160; i++, r4 += 4224) { u16 var = r4 / 256; - gUnknown_03004DE0[0][i] = TRANSITION_STRUCT.field_16 + Sin(var, r3); + gScanlineEffectRegBuffers[0][i] = TRANSITION_STRUCT.field_16 + Sin(var, r3); } if (!gPaletteFade.active) @@ -778,12 +776,12 @@ static void VBlankCB_Phase2_Transition_Shuffle(void) { VBlankCB_BattleTransition(); if (TRANSITION_STRUCT.VBlank_DMA) - DmaCopy16(3, gUnknown_03004DE0[0], gUnknown_03004DE0[1], 320); + DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320); } static void HBlankCB_Phase2_Transition_Shuffle(void) { - u16 var = gUnknown_03004DE0[1][REG_VCOUNT]; + u16 var = gScanlineEffectRegBuffers[1][REG_VCOUNT]; REG_BG1VOFS = var; REG_BG2VOFS = var; REG_BG3VOFS = var; @@ -800,7 +798,7 @@ static bool8 Phase2_Transition_BigPokeball_Func1(struct Task* task) u16 *dst1, *dst2; sub_811D658(); - dp12_8087EA4(); + ScanlineEffect_Clear(); task->data[1] = 16; task->data[2] = 0; @@ -815,7 +813,7 @@ static bool8 Phase2_Transition_BigPokeball_Func1(struct Task* task) for (i = 0; i < 160; i++) { - gUnknown_03005560[i] = 240; + gScanlineEffectRegBuffers[1][i] = 240; } SetVBlankCallback(VBlankCB0_Phase2_Transition_BigPokeball); @@ -844,7 +842,7 @@ static bool8 Phase2_Transition_BigPokeball_Func2(struct Task* task) dst1[i * 32 + j] = *BigPokeballMap | 0xF000; } } - sub_811D6E8(gUnknown_03004DE0[0], 0, task->data[4], 132, task->data[5], 160); + sub_811D6E8(gScanlineEffectRegBuffers[0], 0, task->data[4], 132, task->data[5], 160); task->tState++; return TRUE; @@ -864,7 +862,7 @@ static bool8 Phase2_Transition_BigPokeball_Func3(struct Task* task) task->data[4] += 8; task->data[5] -= 256; - sub_811D6E8(gUnknown_03004DE0[0], 0, task->data[4], 132, task->data[5] >> 8, 160); + sub_811D6E8(gScanlineEffectRegBuffers[0], 0, task->data[4], 132, task->data[5] >> 8, 160); TRANSITION_STRUCT.VBlank_DMA++; return FALSE; @@ -884,7 +882,7 @@ static bool8 Phase2_Transition_BigPokeball_Func4(struct Task* task) task->data[4] += 8; task->data[5] -= 256; - sub_811D6E8(gUnknown_03004DE0[0], 0, task->data[4], 132, task->data[5] >> 8, 160); + sub_811D6E8(gScanlineEffectRegBuffers[0], 0, task->data[4], 132, task->data[5] >> 8, 160); TRANSITION_STRUCT.VBlank_DMA++; return FALSE; @@ -896,7 +894,7 @@ static bool8 Phase2_Transition_BigPokeball_Func5(struct Task* task) task->data[4] += 8; task->data[5] -= 256; - sub_811D6E8(gUnknown_03004DE0[0], 0, task->data[4], 132, task->data[5] >> 8, 160); + sub_811D6E8(gScanlineEffectRegBuffers[0], 0, task->data[4], 132, task->data[5] >> 8, 160); if (task->data[5] <= 0) { @@ -921,7 +919,7 @@ static bool8 Phase2_Transition_BigPokeball_Func6(struct Task* task) if (task->data[1] < 0) task->data[1] = 0; } - sub_811D764(gUnknown_03004DE0[0], 120, 80, task->data[1]); + sub_811D764(gScanlineEffectRegBuffers[0], 120, 80, task->data[1]); if (task->data[1] == 0) { DmaStop(0); @@ -943,7 +941,7 @@ static void Transition_BigPokeball_Vblank(void) DmaStop(0); VBlankCB_BattleTransition(); if (TRANSITION_STRUCT.VBlank_DMA) - DmaCopy16(3, gUnknown_03004DE0[0], gUnknown_03004DE0[1], 320); + DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320); REG_WININ = TRANSITION_STRUCT.WININ; REG_WINOUT = TRANSITION_STRUCT.WINOUT; REG_WIN0V = TRANSITION_STRUCT.WIN0V; @@ -954,13 +952,13 @@ static void Transition_BigPokeball_Vblank(void) static void VBlankCB0_Phase2_Transition_BigPokeball(void) { Transition_BigPokeball_Vblank(); - DmaSet(0, gUnknown_03005560, ®_BG0HOFS, 0xA2400001); + DmaSet(0, gScanlineEffectRegBuffers[1], ®_BG0HOFS, 0xA2400001); } static void VBlankCB1_Phase2_Transition_BigPokeball(void) { Transition_BigPokeball_Vblank(); - DmaSet(0, gUnknown_03005560, ®_WIN0H, 0xA2400001); + DmaSet(0, gScanlineEffectRegBuffers[1], ®_WIN0H, 0xA2400001); } static void Phase2Task_Transition_PokeballsTrail(u8 taskID) @@ -1078,7 +1076,7 @@ static bool8 Phase2_Transition_Clockwise_BlackFade_Func1(struct Task* task) u16 i; sub_811D658(); - dp12_8087EA4(); + ScanlineEffect_Clear(); TRANSITION_STRUCT.WININ = 0; TRANSITION_STRUCT.WINOUT = 63; @@ -1087,7 +1085,7 @@ static bool8 Phase2_Transition_Clockwise_BlackFade_Func1(struct Task* task) for (i = 0; i < 160; i++) { - gUnknown_03005560[i] = 0xF3F4; + gScanlineEffectRegBuffers[1][i] = 0xF3F4; } SetVBlankCallback(VBlankCB_Phase2_Transition_Clockwise_BlackFade); @@ -1104,7 +1102,7 @@ static bool8 Phase2_Transition_Clockwise_BlackFade_Func2(struct Task* task) sub_811D8FC(TRANSITION_STRUCT.data, 120, 80, TRANSITION_STRUCT.data[4], -1, 1, 1); do { - gUnknown_03004DE0[0][TRANSITION_STRUCT.data[3]] = (TRANSITION_STRUCT.data[2] + 1) | 0x7800; + gScanlineEffectRegBuffers[0][TRANSITION_STRUCT.data[3]] = (TRANSITION_STRUCT.data[2] + 1) | 0x7800; } while (!sub_811D978(TRANSITION_STRUCT.data, 1, 1)); TRANSITION_STRUCT.data[4] += 16; @@ -1132,7 +1130,7 @@ static bool8 Phase2_Transition_Clockwise_BlackFade_Func3(struct Task* task) r1 = 120, r3 = TRANSITION_STRUCT.data[2] + 1; if (TRANSITION_STRUCT.data[5] >= 80) r1 = TRANSITION_STRUCT.data[2], r3 = 240; - gUnknown_03004DE0[0][TRANSITION_STRUCT.data[3]] = (r3) | (r1 << 8); + gScanlineEffectRegBuffers[0][TRANSITION_STRUCT.data[3]] = (r3) | (r1 << 8); if (var != 0) break; var = sub_811D978(TRANSITION_STRUCT.data, 1, 1); @@ -1148,7 +1146,7 @@ static bool8 Phase2_Transition_Clockwise_BlackFade_Func3(struct Task* task) { while (TRANSITION_STRUCT.data[3] < TRANSITION_STRUCT.data[5]) { - gUnknown_03004DE0[0][++TRANSITION_STRUCT.data[3]] = (r3) | (r1 << 8); + gScanlineEffectRegBuffers[0][++TRANSITION_STRUCT.data[3]] = (r3) | (r1 << 8); } } @@ -1163,7 +1161,7 @@ static bool8 Phase2_Transition_Clockwise_BlackFade_Func4(struct Task* task) sub_811D8FC(TRANSITION_STRUCT.data, 120, 80, TRANSITION_STRUCT.data[4], 160, 1, 1); do { - gUnknown_03004DE0[0][TRANSITION_STRUCT.data[3]] = (TRANSITION_STRUCT.data[2] << 8) | 0xF0; + gScanlineEffectRegBuffers[0][TRANSITION_STRUCT.data[3]] = (TRANSITION_STRUCT.data[2] << 8) | 0xF0; } while (!sub_811D978(TRANSITION_STRUCT.data, 1, 1)); TRANSITION_STRUCT.data[4] -= 16; @@ -1188,10 +1186,10 @@ static bool8 Phase2_Transition_Clockwise_BlackFade_Func5(struct Task* task) while (1) { - r1 = gUnknown_03004DE0[0][TRANSITION_STRUCT.data[3]] & 0xFF, r2 = TRANSITION_STRUCT.data[2]; + r1 = gScanlineEffectRegBuffers[0][TRANSITION_STRUCT.data[3]] & 0xFF, r2 = TRANSITION_STRUCT.data[2]; if (TRANSITION_STRUCT.data[5] <= 80) r2 = 120, r1 = TRANSITION_STRUCT.data[2]; - gUnknown_03004DE0[0][TRANSITION_STRUCT.data[3]] = (r1) | (r2 << 8); + gScanlineEffectRegBuffers[0][TRANSITION_STRUCT.data[3]] = (r1) | (r2 << 8); r3 = 0; if (var != 0) break; @@ -1208,7 +1206,7 @@ static bool8 Phase2_Transition_Clockwise_BlackFade_Func5(struct Task* task) { while (TRANSITION_STRUCT.data[3] > TRANSITION_STRUCT.data[5]) { - gUnknown_03004DE0[0][--TRANSITION_STRUCT.data[3]] = (r1) | (r2 << 8); + gScanlineEffectRegBuffers[0][--TRANSITION_STRUCT.data[3]] = (r1) | (r2 << 8); } } @@ -1228,7 +1226,7 @@ static bool8 Phase2_Transition_Clockwise_BlackFade_Func6(struct Task* task) r2 = 120, r3 = TRANSITION_STRUCT.data[2]; if (TRANSITION_STRUCT.data[2] >= 120) r2 = 0, r3 = 240; - gUnknown_03004DE0[0][TRANSITION_STRUCT.data[3]] = (r3) | (r2 << 8); + gScanlineEffectRegBuffers[0][TRANSITION_STRUCT.data[3]] = (r3) | (r2 << 8); } while (!sub_811D978(TRANSITION_STRUCT.data, 1, 1)); @@ -1253,12 +1251,12 @@ static void VBlankCB_Phase2_Transition_Clockwise_BlackFade(void) DmaStop(0); VBlankCB_BattleTransition(); if (TRANSITION_STRUCT.VBlank_DMA != 0) - DmaCopy16(3, gUnknown_03004DE0[0], gUnknown_03004DE0[1], 320); + DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320); REG_WININ = TRANSITION_STRUCT.WININ; REG_WINOUT = TRANSITION_STRUCT.WINOUT; REG_WIN0V = TRANSITION_STRUCT.WIN0V; - REG_WIN0H = gUnknown_03004DE0[1][0]; - DmaSet(0, gUnknown_03004DE0[1], ®_WIN0H, 0xA2400001); + REG_WIN0H = gScanlineEffectRegBuffers[1][0]; + DmaSet(0, gScanlineEffectRegBuffers[1], ®_WIN0H, 0xA2400001); } static void Phase2Task_Transition_Ripple(u8 taskID) @@ -1271,11 +1269,11 @@ static bool8 Phase2_Transition_Ripple_Func1(struct Task* task) u8 i; sub_811D658(); - dp12_8087EA4(); + ScanlineEffect_Clear(); for (i = 0; i < 160; i++) { - gUnknown_03005560[i] = TRANSITION_STRUCT.field_16; + gScanlineEffectRegBuffers[1][i] = TRANSITION_STRUCT.field_16; } SetVBlankCallback(VBlankCB_Phase2_Transition_Ripple); @@ -1308,7 +1306,7 @@ static bool8 Phase2_Transition_Ripple_Func2(struct Task* task) // todo: fix the asm s16 var = r4 >> 8; asm(""); - gUnknown_03004DE0[0][i] = TRANSITION_STRUCT.field_16 + Sin(var, r3); + gScanlineEffectRegBuffers[0][i] = TRANSITION_STRUCT.field_16 + Sin(var, r3); asm(""); } @@ -1329,12 +1327,12 @@ static void VBlankCB_Phase2_Transition_Ripple(void) { VBlankCB_BattleTransition(); if (TRANSITION_STRUCT.VBlank_DMA) - DmaCopy16(3, gUnknown_03004DE0[0], gUnknown_03004DE0[1], 320); + DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320); } static void HBlankCB_Phase2_Transition_Ripple(void) { - u16 var = gUnknown_03004DE0[1][REG_VCOUNT]; + u16 var = gScanlineEffectRegBuffers[1][REG_VCOUNT]; REG_BG1VOFS = var; REG_BG2VOFS = var; REG_BG3VOFS = var; @@ -1350,7 +1348,7 @@ static bool8 Phase2_Transition_Wave_Func1(struct Task* task) u8 i; sub_811D658(); - dp12_8087EA4(); + ScanlineEffect_Clear(); TRANSITION_STRUCT.WININ = 63; TRANSITION_STRUCT.WINOUT = 0; @@ -1359,7 +1357,7 @@ static bool8 Phase2_Transition_Wave_Func1(struct Task* task) for (i = 0; i < 160; i++) { - gUnknown_03004DE0[1][i] = 242; + gScanlineEffectRegBuffers[1][i] = 242; } SetVBlankCallback(VBlankCB_Phase2_Transition_Wave); @@ -1375,7 +1373,7 @@ static bool8 Phase2_Transition_Wave_Func2(struct Task* task) bool8 nextFunc; TRANSITION_STRUCT.VBlank_DMA = 0; - toStore = gUnknown_03004DE0[0]; + toStore = gScanlineEffectRegBuffers[0]; r5 = task->data[2]; task->data[2] += 16; task->data[1] += 8; @@ -1411,11 +1409,11 @@ static void VBlankCB_Phase2_Transition_Wave(void) DmaStop(0); VBlankCB_BattleTransition(); if (TRANSITION_STRUCT.VBlank_DMA != 0) - DmaCopy16(3, gUnknown_03004DE0[0], gUnknown_03004DE0[1], 320); + DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320); REG_WININ = TRANSITION_STRUCT.WININ; REG_WINOUT = TRANSITION_STRUCT.WINOUT; REG_WIN0V = TRANSITION_STRUCT.WIN0V; - DmaSet(0, gUnknown_03004DE0[1], ®_WIN0H, 0xA2400001); + DmaSet(0, gScanlineEffectRegBuffers[1], ®_WIN0H, 0xA2400001); } #define tMugshotOpponentID data[13] @@ -1462,7 +1460,7 @@ static bool8 Phase2_Mugshot_Func1(struct Task* task) u8 i; sub_811D658(); - dp12_8087EA4(); + ScanlineEffect_Clear(); Mugshots_CreateOpponentPlayerSprites(task); task->data[1] = 0; @@ -1474,7 +1472,7 @@ static bool8 Phase2_Mugshot_Func1(struct Task* task) for (i = 0; i < 160; i++) { - gUnknown_03004DE0[1][i] = 0xF0F1; + gScanlineEffectRegBuffers[1][i] = 0xF0F1; } SetVBlankCallback(VBlankCB0_Phase2_Mugshots); @@ -1519,7 +1517,7 @@ static bool8 Phase2_Mugshot_Func3(struct Task* task) TRANSITION_STRUCT.VBlank_DMA = 0; - toStore = gUnknown_03004DE0[0]; + toStore = gScanlineEffectRegBuffers[0]; r5 = task->data[1]; task->data[1] += 0x10; @@ -1565,7 +1563,7 @@ static bool8 Phase2_Mugshot_Func4(struct Task* task) TRANSITION_STRUCT.VBlank_DMA = 0; - for (i = 0, toStore = gUnknown_03004DE0[0]; i < 160; i++, toStore++) + for (i = 0, toStore = gScanlineEffectRegBuffers[0]; i < 160; i++, toStore++) { *toStore = 0xF0; } @@ -1608,8 +1606,8 @@ static bool8 Phase2_Mugshot_Func6(struct Task* task) TRANSITION_STRUCT.VBlank_DMA = 0; SetVBlankCallback(NULL); DmaStop(0); - memset(gUnknown_03004DE0[0], 0, 0x140); - memset(gUnknown_03004DE0[1], 0, 0x140); + memset(gScanlineEffectRegBuffers[0], 0, 0x140); + memset(gScanlineEffectRegBuffers[1], 0, 0x140); REG_WIN0H = 0xF0; REG_BLDY = 0; task->tState++; @@ -1642,15 +1640,15 @@ static bool8 Phase2_Mugshot_Func7(struct Task* task) { s16 index1 = 0x50 - i; s16 index2 = 0x50 + i; - if (gUnknown_03004DE0[0][index1] <= 15) + if (gScanlineEffectRegBuffers[0][index1] <= 15) { r6 = TRUE; - gUnknown_03004DE0[0][index1]++; + gScanlineEffectRegBuffers[0][index1]++; } - if (gUnknown_03004DE0[0][index2] <= 15) + if (gScanlineEffectRegBuffers[0][index2] <= 15) { r6 = TRUE; - gUnknown_03004DE0[0][index2]++; + gScanlineEffectRegBuffers[0][index2]++; } } } @@ -1678,7 +1676,7 @@ static bool8 Phase2_Mugshot_Func9(struct Task* task) TRANSITION_STRUCT.VBlank_DMA = 0; task->data[3]++; - memset(gUnknown_03004DE0[0], task->data[3], 0x140); + memset(gScanlineEffectRegBuffers[0], task->data[3], 0x140); if (task->data[3] > 15) task->tState++; @@ -1699,12 +1697,12 @@ static void VBlankCB0_Phase2_Mugshots(void) DmaStop(0); VBlankCB_BattleTransition(); if (TRANSITION_STRUCT.VBlank_DMA != 0) - DmaCopy16(3, gUnknown_03004DE0[0], gUnknown_03004DE0[1], 320); + DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320); REG_BG0VOFS = TRANSITION_STRUCT.field_1C; REG_WININ = TRANSITION_STRUCT.WININ; REG_WINOUT = TRANSITION_STRUCT.WINOUT; REG_WIN0V = TRANSITION_STRUCT.WIN0V; - DmaSet(0, gUnknown_03004DE0[1], ®_WIN0H, 0xA2400001); + DmaSet(0, gScanlineEffectRegBuffers[1], ®_WIN0H, 0xA2400001); } static void VBlankCB1_Phase2_Mugshots(void) @@ -1712,9 +1710,9 @@ static void VBlankCB1_Phase2_Mugshots(void) DmaStop(0); VBlankCB_BattleTransition(); if (TRANSITION_STRUCT.VBlank_DMA != 0) - DmaCopy16(3, gUnknown_03004DE0[0], gUnknown_03004DE0[1], 320); + DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320); REG_BLDCNT = TRANSITION_STRUCT.BLDCNT; - DmaSet(0, gUnknown_03004DE0[1], ®_BLDY, 0xA2400001); + DmaSet(0, gScanlineEffectRegBuffers[1], ®_BLDY, 0xA2400001); } static void HBlankCB_Phase2_Mugshots(void) @@ -1846,7 +1844,7 @@ static bool8 Phase2_Transition_Slice_Func1(struct Task* task) u16 i; sub_811D658(); - dp12_8087EA4(); + ScanlineEffect_Clear(); task->data[2] = 256; task->data[3] = 1; @@ -1856,8 +1854,8 @@ static bool8 Phase2_Transition_Slice_Func1(struct Task* task) for (i = 0; i < 160; i++) { - gUnknown_03004DE0[1][i] = TRANSITION_STRUCT.field_14; - gUnknown_03004DE0[1][160 + i] = 0xF0; + gScanlineEffectRegBuffers[1][i] = TRANSITION_STRUCT.field_14; + gScanlineEffectRegBuffers[1][160 + i] = 0xF0; } REG_IE |= INTR_FLAG_HBLANK; @@ -1886,8 +1884,8 @@ static bool8 Phase2_Transition_Slice_Func2(struct Task* task) for (i = 0; i < 160; i++) { - u16* storeLoc1 = &gUnknown_03004DE0[0][i]; - u16* storeLoc2 = &gUnknown_03004DE0[0][i + 160]; + u16* storeLoc1 = &gScanlineEffectRegBuffers[0][i]; + u16* storeLoc2 = &gScanlineEffectRegBuffers[0][i + 160]; if (1 & i) { *storeLoc1 = TRANSITION_STRUCT.field_14 + task->data[1]; @@ -1923,13 +1921,13 @@ static void VBlankCB_Phase2_Transition_Slice(void) REG_WINOUT = TRANSITION_STRUCT.WINOUT; REG_WIN0V = TRANSITION_STRUCT.WIN0V; if (TRANSITION_STRUCT.VBlank_DMA) - DmaCopy16(3, gUnknown_03004DE0[0], gUnknown_03004DE0[1], 640); - DmaSet(0, &gUnknown_03004DE0[1][160], ®_WIN0H, 0xA2400001); + DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 640); + DmaSet(0, &gScanlineEffectRegBuffers[1][160], ®_WIN0H, 0xA2400001); } static void HBlankCB_Phase2_Transition_Slice(void) { - u16 var = gUnknown_03004DE0[1][REG_VCOUNT]; + u16 var = gScanlineEffectRegBuffers[1][REG_VCOUNT]; REG_BG1HOFS = var; REG_BG2HOFS = var; REG_BG3HOFS = var; @@ -1945,7 +1943,7 @@ static bool8 Phase2_Transition_WhiteFade_Func1(struct Task* task) u16 i; sub_811D658(); - dp12_8087EA4(); + ScanlineEffect_Clear(); TRANSITION_STRUCT.BLDCNT = 0xBF; TRANSITION_STRUCT.BLDY = 0; @@ -1955,8 +1953,8 @@ static bool8 Phase2_Transition_WhiteFade_Func1(struct Task* task) for (i = 0; i < 160; i++) { - gUnknown_03004DE0[1][i] = 0; - gUnknown_03004DE0[1][i + 160] = 0xF0; + gScanlineEffectRegBuffers[1][i] = 0; + gScanlineEffectRegBuffers[1][i + 160] = 0xF0; } REG_IE |= INTR_FLAG_HBLANK; @@ -2038,8 +2036,8 @@ static void VBlankCB0_Phase2_Transition_WhiteFade(void) REG_WINOUT = TRANSITION_STRUCT.WINOUT; REG_WIN0V = TRANSITION_STRUCT.field_6; if (TRANSITION_STRUCT.VBlank_DMA) - DmaCopy16(3, gUnknown_03004DE0[0], gUnknown_03004DE0[1], 640); - DmaSet(0, &gUnknown_03004DE0[1][160], ®_WIN0H, 0xA2400001); + DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 640); + DmaSet(0, &gScanlineEffectRegBuffers[1][160], ®_WIN0H, 0xA2400001); } static void VBlankCB1_Phase2_Transition_WhiteFade(void) @@ -2055,7 +2053,7 @@ static void VBlankCB1_Phase2_Transition_WhiteFade(void) static void HBlankCB_Phase2_Transition_WhiteFade(void) { - REG_BLDY = gUnknown_03004DE0[1][REG_VCOUNT]; + REG_BLDY = gScanlineEffectRegBuffers[1][REG_VCOUNT]; } static void sub_811CFD0(struct Sprite* sprite) @@ -2069,8 +2067,8 @@ static void sub_811CFD0(struct Sprite* sprite) else { u16 i; - u16* ptr1 = &gUnknown_03004DE0[0][sprite->pos1.y]; - u16* ptr2 = &gUnknown_03004DE0[0][sprite->pos1.y + 160]; + u16* ptr1 = &gScanlineEffectRegBuffers[0][sprite->pos1.y]; + u16* ptr2 = &gScanlineEffectRegBuffers[0][sprite->pos1.y + 160]; for (i = 0; i < 20; i++) { ptr1[i] = sprite->data[0] >> 8; @@ -2160,7 +2158,7 @@ static bool8 Phase2_Transition_Shards_Func1(struct Task* task) u16 i; sub_811D658(); - dp12_8087EA4(); + ScanlineEffect_Clear(); TRANSITION_STRUCT.WININ = 0x3F; TRANSITION_STRUCT.WINOUT = 0; @@ -2168,10 +2166,10 @@ static bool8 Phase2_Transition_Shards_Func1(struct Task* task) for (i = 0; i < 160; i++) { - gUnknown_03004DE0[0][i] = 0xF0; + gScanlineEffectRegBuffers[0][i] = 0xF0; } - CpuSet(gUnknown_03004DE0[0], gUnknown_03004DE0[1], 0xA0); + CpuSet(gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 0xA0); SetVBlankCallback(VBlankCB_Phase2_Transition_Shards); task->tState++; @@ -2200,8 +2198,8 @@ static bool8 Phase2_Transition_Shards_Func3(struct Task* task) for (i = 0, nextFunc = FALSE; i < 16; i++) { - s16 r3 = gUnknown_03004DE0[0][TRANSITION_STRUCT.data[3]] >> 8; - s16 r4 = gUnknown_03004DE0[0][TRANSITION_STRUCT.data[3]] & 0xFF; + s16 r3 = gScanlineEffectRegBuffers[0][TRANSITION_STRUCT.data[3]] >> 8; + s16 r4 = gScanlineEffectRegBuffers[0][TRANSITION_STRUCT.data[3]] & 0xFF; if (task->data[2] == 0) { if (r3 < TRANSITION_STRUCT.data[2]) @@ -2216,7 +2214,7 @@ static bool8 Phase2_Transition_Shards_Func3(struct Task* task) if (r4 <= r3) r4 = r3; } - gUnknown_03004DE0[0][TRANSITION_STRUCT.data[3]] = (r4) | (r3 << 8); + gScanlineEffectRegBuffers[0][TRANSITION_STRUCT.data[3]] = (r4) | (r3 << 8); if (nextFunc) { task->tState++; @@ -2263,12 +2261,12 @@ static void VBlankCB_Phase2_Transition_Shards(void) DmaStop(0); VBlankCB_BattleTransition(); if (TRANSITION_STRUCT.VBlank_DMA) - DmaCopy16(3, gUnknown_03004DE0[0], gUnknown_03004DE0[1], 320); + DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320); REG_WININ = TRANSITION_STRUCT.WININ; REG_WINOUT = TRANSITION_STRUCT.WINOUT; REG_WIN0V = TRANSITION_STRUCT.WIN0V; - REG_WIN0H = gUnknown_03004DE0[1][0]; - DmaSet(0, gUnknown_03004DE0[1], ®_WIN0H, 0xA2400001); + REG_WIN0H = gScanlineEffectRegBuffers[1][0]; + DmaSet(0, gScanlineEffectRegBuffers[1], ®_WIN0H, 0xA2400001); } static void CreatePhase1Task(s16 a0, s16 a1, s16 a2, s16 a3, s16 a4) diff --git a/src/battle/battle_3.c b/src/battle/battle_util.c index e5a730598..194a002d3 100644 --- a/src/battle/battle_3.c +++ b/src/battle/battle_util.c @@ -1,23 +1,30 @@ #include "global.h" -#include "constants/abilities.h" #include "battle.h" -#include "constants/moves.h" -#include "item.h" -#include "constants/items.h" +#include "battle_util.h" +#include "data2.h" #include "event_data.h" -#include "constants/hold_effects.h" -#include "constants/species.h" -#include "constants/weather.h" +#include "ewram.h" +#include "field_weather.h" +#include "item.h" +#include "link.h" #include "pokemon.h" -#include "data2.h" #include "random.h" +#include "rom_8077ABC.h" +#include "string_util.h" #include "text.h" +#include "util.h" +#include "constants/abilities.h" #include "constants/battle_move_effects.h" -#include "string_util.h" #include "constants/flags.h" -#include "ewram.h" +#include "constants/hold_effects.h" +#include "constants/items.h" +#include "constants/moves.h" +#include "constants/species.h" +#include "constants/weather.h" + +extern u8 gUnknown_02023A14_50; -extern u8* gBattlescriptCurrInstr; +extern const u8* gBattlescriptCurrInstr; extern u8 gActiveBank; extern u8 gBattleBufferB[4][0x200]; extern u8* gUnknown_02024C1C[4]; //battlescript location when you try to choose a move you're not allowed to @@ -33,7 +40,7 @@ extern u8 gNoOfAllBanks; extern u32 gStatuses3[4]; extern u8 gBankAttacker; extern u8 gBankTarget; -extern u8 gTurnOrder[4]; +extern u8 gBanksByTurnOrder[4]; extern u16 gSideAffecting[2]; extern u16 gBattleWeather; extern void (*gBattleMainFunc)(void); @@ -50,7 +57,7 @@ extern u8 gTakenDmgBanks[4]; extern u8 gBattleMoveFlags; extern u8 gLastUsedAbility; extern u8 gBattleTextBuff2[]; -extern u8 gFightStateTracker; +extern u8 gCurrentActionFuncId; extern struct BattleEnigmaBerry gEnigmaBerries[4]; extern u8 gUnknown_02024BE5; extern u8 gCurrMovePos; @@ -58,6 +65,7 @@ extern u16 gRandomMove; extern s32 gBattleMoveDamage; extern u16 gDynamicBasePower; extern u32 gBattleExecBuffer; +extern u8 gSentPokesToOpponent[2]; extern const u16 gSoundMovesTable[]; extern const u8 gStatusConditionString_PoisonJpn[]; extern const u8 gStatusConditionString_SleepJpn[]; @@ -69,26 +77,19 @@ extern const u8 gStatusConditionString_LoveJpn[]; extern const BattleCmdFunc gBattleScriptingCommandsTable[]; u8 IsImprisoned(u8 bank, u16 move); -u8 GetBankByPlayerAI(u8 ID); +u8 GetBankByIdentity(u8 ID); u8 GetBankIdentity(u8 bank); u8 GetBankSide(u8 bank); -void b_call_bc_move_exec(u8* BS_ptr); -bool8 sub_8015660(u8 bank); //check if a move failed void SetMoveEffect(bool8 primary, u8 certainArg); bool8 UproarWakeUpCheck(u8 bank); bool8 sub_8018018(u8 bank, u8, u8); -void sub_8015740(u8 bank); s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 a4, u16 powerOverride, u8 typeOverride, u8 bank_atk, u8 bank_def); u8 CountTrailingZeroBits(u32 a); u8 GetMoveTarget(u16 move, u8 useMoveTarget); u8 sub_803FC34(u8 bank); u16 sub_803FBFC(u8 a); -u8 weather_get_current(void); -void b_push_move_exec(u8* BS_ptr); void RecordAbilityBattle(u8 bank, u8 ability); void RecordItemBattle(u8 bank, u8 holdEffect); -void sub_8013F54(void); -void sub_8013FBC(void); s8 GetPokeFlavourRelation(u32 pid, u8 flavor); extern u8 BattleScript_MoveSelectionDisabledMove[]; @@ -206,22 +207,271 @@ extern u8 gUnknown_081D99A0[]; //disobedient, hits itself #define MULTISTRING_CHOOSER 0x5 #define MSG_DISPLAY 0x7 -void b_movescr_stack_push(u8* BS_ptr) +u8 GetBattleBank(u8 caseId) +{ + u8 ret = 0; + switch (caseId) + { + case BS_GET_TARGET: + ret = gBankTarget; + break; + case BS_GET_ATTACKER: + ret = gBankAttacker; + break; + case BS_GET_EFFECT_BANK: + ret = gEffectBank; + break; + case BS_GET_BANK_0: + ret = 0; + break; + case BS_GET_SCRIPTING_BANK: + ret = ewram16003; + break; + case BS_GET_gBank1: + ret = gBank1; + break; + case 5: + ret = gBank1; + break; + } + return ret; +} + +void PressurePPLose(u8 bankDef, u8 bankAtk, u16 move) +{ + s32 i; + + if (gBattleMons[bankDef].ability != ABILITY_PRESSURE) + return; + + for (i = 0; i < 4; i++) + { + if (gBattleMons[bankAtk].moves[i] == move) + break; + } + + if (i == 4) // mons don't share any moves + return; + + if (gBattleMons[bankAtk].pp[i] != 0) + gBattleMons[bankAtk].pp[i]--; + + if (!(gBattleMons[bankAtk].status2 & STATUS2_TRANSFORMED) + && !(gDisableStructs[bankAtk].unk18_b & gBitTable[i])) + { + gActiveBank = bankAtk; + EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + i, 0, 1, &gBattleMons[gActiveBank].pp[i]); + MarkBufferBankForExecution(gActiveBank); + } +} + +void PressurePPLoseOnUsingImprision(u8 bankAtk) +{ + s32 i, j; + s32 imprisionPos = 4; + u8 atkSide = GetBankSide(bankAtk); + + for (i = 0; i < gNoOfAllBanks; i++) + { + if (atkSide != GetBankSide(i) && gBattleMons[i].ability == ABILITY_PRESSURE) + { + for (j = 0; j < 4; j++) + { + if (gBattleMons[bankAtk].moves[j] == MOVE_IMPRISON) + break; + } + if (j != 4) + { + imprisionPos = j; + if (gBattleMons[bankAtk].pp[j] != 0) + gBattleMons[bankAtk].pp[j]--; + } + } + } + + if (imprisionPos != 4 + && !(gBattleMons[bankAtk].status2 & STATUS2_TRANSFORMED) + && !(gDisableStructs[bankAtk].unk18_b & gBitTable[imprisionPos])) + { + gActiveBank = bankAtk; + EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + imprisionPos, 0, 1, &gBattleMons[gActiveBank].pp[imprisionPos]); + MarkBufferBankForExecution(gActiveBank); + } +} + +void PressurePPLoseOnUsingPerishSong(u8 bankAtk) +{ + s32 i, j; + s32 perishSongPos = 4; + + for (i = 0; i < gNoOfAllBanks; i++) + { + if (gBattleMons[i].ability == ABILITY_PRESSURE && i != bankAtk) + { + for (j = 0; j < 4; j++) + { + if (gBattleMons[bankAtk].moves[j] == MOVE_PERISH_SONG) + break; + } + if (j != 4) + { + perishSongPos = j; + if (gBattleMons[bankAtk].pp[j] != 0) + gBattleMons[bankAtk].pp[j]--; + } + } + } + + if (perishSongPos != 4 + && !(gBattleMons[bankAtk].status2 & STATUS2_TRANSFORMED) + && !(gDisableStructs[bankAtk].unk18_b & gBitTable[perishSongPos])) + { + gActiveBank = bankAtk; + EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + perishSongPos, 0, 1, &gBattleMons[gActiveBank].pp[perishSongPos]); + MarkBufferBankForExecution(gActiveBank); + } +} + + +void MarkAllBufferBanksForExecution(void) // unused +{ + s32 i; + + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + for (i = 0; i < gNoOfAllBanks; i++) + gBattleExecBuffer |= gBitTable[i] << 0x1C; + } + else + { + for (i = 0; i < gNoOfAllBanks; i++) + gBattleExecBuffer |= gBitTable[i]; + } +} + +void MarkBufferBankForExecution(u8 bank) +{ + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + gBattleExecBuffer |= gBitTable[bank] << 0x1C; + } + else + { + gBattleExecBuffer |= gBitTable[bank]; + } +} + +void sub_80155A4(u8 arg0) +{ + s32 i; + + for (i = 0; i < GetLinkPlayerCount(); i++) + gBattleExecBuffer |= gBitTable[arg0] << (i << 2); + + gBattleExecBuffer &= ~(0x10000000 << arg0); +} + +void CancelMultiTurnMoves(u8 bank) +{ + gBattleMons[bank].status2 &= ~(STATUS2_MULTIPLETURNS); + gBattleMons[bank].status2 &= ~(STATUS2_LOCK_CONFUSE); + gBattleMons[bank].status2 &= ~(STATUS2_UPROAR); + gBattleMons[bank].status2 &= ~(STATUS2_BIDE); + + gStatuses3[bank] &= ~(STATUS3_SEMI_INVULNERABLE); + + gDisableStructs[bank].rolloutTimer1 = 0; + gDisableStructs[bank].furyCutterCounter = 0; +} + +bool8 WasUnableToUseMove(u8 bank) +{ + if (gProtectStructs[bank].prlzImmobility + || gProtectStructs[bank].notEffective + || gProtectStructs[bank].usedImprisionedMove + || gProtectStructs[bank].loveImmobility + || gProtectStructs[bank].usedDisabledMove + || gProtectStructs[bank].usedTauntedMove + || gProtectStructs[bank].flag2Unknown + || gProtectStructs[bank].flinchImmobility + || gProtectStructs[bank].confusionSelfDmg) + return TRUE; + else + return FALSE; +} + +void PrepareStringBattle(u16 stringId, u8 bank) +{ + gActiveBank = bank; + EmitPrintString(0, stringId); + MarkBufferBankForExecution(gActiveBank); +} + +void ResetSentPokesToOpponentValue(void) +{ + s32 i; + u32 bits = 0; + + gSentPokesToOpponent[0] = 0; + gSentPokesToOpponent[1] = 0; + + for (i = 0; i < gNoOfAllBanks; i += 2) + bits |= gBitTable[gBattlePartyID[i]]; + + for (i = 1; i < gNoOfAllBanks; i += 2) + gSentPokesToOpponent[(i & BIT_MON) >> 1] = bits; +} + +void sub_8015740(u8 bank) +{ + s32 i = 0; + u32 bits = 0; + + if (GetBankSide(bank) == SIDE_OPPONENT) + { + u8 id = ((bank & BIT_MON) >> 1); + gSentPokesToOpponent[id] = 0; + + for (i = 0; i < gNoOfAllBanks; i += 2) + { + if (!(gAbsentBankFlags & gBitTable[i])) + bits |= gBitTable[gBattlePartyID[i]]; + } + + gSentPokesToOpponent[id] = bits; + } +} + +void sub_80157C4(u8 bank) +{ + if (GetBankSide(bank) == SIDE_OPPONENT) + { + sub_8015740(bank); + } + else + { + s32 i; + for (i = 1; i < gNoOfAllBanks; i++) + gSentPokesToOpponent[(i & BIT_MON) >> 1] |= gBitTable[gBattlePartyID[bank]]; + } +} + +void BattleScriptPush(const u8* BS_ptr) { B_BATTLESCRIPTS_STACK->ptr[B_BATTLESCRIPTS_STACK->size++] = BS_ptr; } -void b_movescr_stack_push_cursor(void) +void BattleScriptPushCursor(void) { B_BATTLESCRIPTS_STACK->ptr[B_BATTLESCRIPTS_STACK->size++] = gBattlescriptCurrInstr; } -void b_movescr_stack_pop_cursor(void) +void BattleScriptPop(void) { gBattlescriptCurrInstr = B_BATTLESCRIPTS_STACK->ptr[--B_BATTLESCRIPTS_STACK->size]; } -u8 sub_8015894(void) //msg can't select a move +u8 TrySetCantSelectMoveBattleScript(void) //msg can't select a move { u8 limitations = 0; u16 move = gBattleMons[gActiveBank].moves[gBattleBufferB[gActiveBank][2]]; @@ -229,7 +479,7 @@ u8 sub_8015894(void) //msg can't select a move u16* choicedMove = CHOICED_MOVE(gActiveBank); if (gDisableStructs[gActiveBank].disabledMove == move && move) { - BATTLE_STRUCT->scriptingActive = gActiveBank; + gBattleStruct->scriptingActive = gActiveBank; gCurrentMove = move; gUnknown_02024C1C[gActiveBank] = BattleScript_MoveSelectionDisabledMove; limitations++; @@ -320,9 +570,9 @@ bool8 AreAllMovesUnusable(void) gProtectStructs[gActiveBank].onlyStruggle = 1; gUnknown_02024C1C[gActiveBank] = BattleScript_NoMovesLeft; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - gBattleBufferB[gActiveBank][3] = GetBankByPlayerAI((GetBankIdentity(gActiveBank) ^ 1) | (Random() & 2)); + gBattleBufferB[gActiveBank][3] = GetBankByIdentity((GetBankIdentity(gActiveBank) ^ 1) | (Random() & 2)); else - gBattleBufferB[gActiveBank][3] = GetBankByPlayerAI(GetBankIdentity(gActiveBank) ^ 1); + gBattleBufferB[gActiveBank][3] = GetBankByIdentity(GetBankIdentity(gActiveBank) ^ 1); } else gProtectStructs[gActiveBank].onlyStruggle = 0; @@ -367,36 +617,36 @@ u8 UpdateTurnCounters(void) { u8 sideBank; - switch (BATTLE_STRUCT->turncountersTracker) + switch (gBattleStruct->turncountersTracker) { case 0: for (i = 0; i < gNoOfAllBanks; i++) { - gTurnOrder[i] = i; + gBanksByTurnOrder[i] = i; } for (i = 0; i < gNoOfAllBanks - 1; i++) { s32 j; for (j = i + 1; j < gNoOfAllBanks; j++) { - if (GetWhoStrikesFirst(gTurnOrder[i], gTurnOrder[j], 0)) - sub_8012FBC(i, j); + if (GetWhoStrikesFirst(gBanksByTurnOrder[i], gBanksByTurnOrder[j], 0)) + SwapTurnOrder(i, j); } } - BATTLE_STRUCT->turncountersTracker++; - BATTLE_STRUCT->turnSideTracker = 0; + gBattleStruct->turncountersTracker++; + gBattleStruct->turnSideTracker = 0; case 1: - while (BATTLE_STRUCT->turnSideTracker < 2) + while (gBattleStruct->turnSideTracker < 2) { - gActiveBank = gBankAttacker = sideBank = BATTLE_STRUCT->turnSideTracker; + gActiveBank = gBankAttacker = sideBank = gBattleStruct->turnSideTracker; if (gSideAffecting[sideBank] & SIDE_STATUS_REFLECT) { - if (--gSideTimer[sideBank].reflectTimer == 0) + if (--gSideTimers[sideBank].reflectTimer == 0) { gSideAffecting[sideBank] &= ~SIDE_STATUS_REFLECT; - b_call_bc_move_exec(BattleScript_SideStatusWoreOff); + BattleScriptExecute(BattleScript_SideStatusWoreOff); gBattleTextBuff1[0] = 0xFD; gBattleTextBuff1[1] = 2; gBattleTextBuff1[2] = MOVE_REFLECT; @@ -405,26 +655,26 @@ u8 UpdateTurnCounters(void) effect++; } } - BATTLE_STRUCT->turnSideTracker++; + gBattleStruct->turnSideTracker++; if (effect) break; } if (!effect) { - BATTLE_STRUCT->turncountersTracker++; - BATTLE_STRUCT->turnSideTracker = 0; + gBattleStruct->turncountersTracker++; + gBattleStruct->turnSideTracker = 0; } break; case 2: - while (BATTLE_STRUCT->turnSideTracker < 2) + while (gBattleStruct->turnSideTracker < 2) { - gActiveBank = gBankAttacker = sideBank = BATTLE_STRUCT->turnSideTracker; + gActiveBank = gBankAttacker = sideBank = gBattleStruct->turnSideTracker; if (gSideAffecting[sideBank] & SIDE_STATUS_LIGHTSCREEN) { - if (--gSideTimer[sideBank].lightscreenTimer == 0) + if (--gSideTimers[sideBank].lightscreenTimer == 0) { gSideAffecting[sideBank] &= ~SIDE_STATUS_LIGHTSCREEN; - b_call_bc_move_exec(BattleScript_SideStatusWoreOff); + BattleScriptExecute(BattleScript_SideStatusWoreOff); gBattleCommunication[MULTISTRING_CHOOSER] = sideBank; gBattleTextBuff1[0] = 0xFD; gBattleTextBuff1[1] = 2; @@ -434,24 +684,24 @@ u8 UpdateTurnCounters(void) effect++; } } - BATTLE_STRUCT->turnSideTracker++; + gBattleStruct->turnSideTracker++; if (effect) break; } if (!effect) { - BATTLE_STRUCT->turncountersTracker++; - BATTLE_STRUCT->turnSideTracker = 0; + gBattleStruct->turncountersTracker++; + gBattleStruct->turnSideTracker = 0; } break; case 3: - while (BATTLE_STRUCT->turnSideTracker < 2) + while (gBattleStruct->turnSideTracker < 2) { - gActiveBank = gBankAttacker = sideBank = BATTLE_STRUCT->turnSideTracker; - if (gSideTimer[sideBank].mistTimer && --gSideTimer[sideBank].mistTimer == 0) + gActiveBank = gBankAttacker = sideBank = gBattleStruct->turnSideTracker; + if (gSideTimers[sideBank].mistTimer && --gSideTimers[sideBank].mistTimer == 0) { gSideAffecting[sideBank] &= ~SIDE_STATUS_MIST; - b_call_bc_move_exec(BattleScript_SideStatusWoreOff); + BattleScriptExecute(BattleScript_SideStatusWoreOff); gBattleCommunication[MULTISTRING_CHOOSER] = sideBank; gBattleTextBuff1[0] = 0xFD; gBattleTextBuff1[1] = 2; @@ -460,56 +710,56 @@ u8 UpdateTurnCounters(void) gBattleTextBuff1[4] = EOS; effect++; } - BATTLE_STRUCT->turnSideTracker++; + gBattleStruct->turnSideTracker++; if (effect) break; } if (!effect) { - BATTLE_STRUCT->turncountersTracker++; - BATTLE_STRUCT->turnSideTracker = 0; + gBattleStruct->turncountersTracker++; + gBattleStruct->turnSideTracker = 0; } break; case 4: - while (BATTLE_STRUCT->turnSideTracker < 2) + while (gBattleStruct->turnSideTracker < 2) { - gActiveBank = gBankAttacker = sideBank = BATTLE_STRUCT->turnSideTracker; + gActiveBank = gBankAttacker = sideBank = gBattleStruct->turnSideTracker; if (gSideAffecting[sideBank] & SIDE_STATUS_SAFEGUARD) { - if (--gSideTimer[sideBank].safeguardTimer == 0) + if (--gSideTimers[sideBank].safeguardTimer == 0) { gSideAffecting[sideBank] &= ~SIDE_STATUS_SAFEGUARD; - b_call_bc_move_exec(BattleScript_SafeguardEnds); + BattleScriptExecute(BattleScript_SafeguardEnds); effect++; } } - BATTLE_STRUCT->turnSideTracker++; + gBattleStruct->turnSideTracker++; if (effect) break; } if (!effect) { - BATTLE_STRUCT->turncountersTracker++; - BATTLE_STRUCT->turnSideTracker = 0; + gBattleStruct->turncountersTracker++; + gBattleStruct->turnSideTracker = 0; } break; case 5: - while (BATTLE_STRUCT->turnSideTracker < gNoOfAllBanks) + while (gBattleStruct->turnSideTracker < gNoOfAllBanks) { - gActiveBank = gTurnOrder[BATTLE_STRUCT->turnSideTracker]; + gActiveBank = gBanksByTurnOrder[gBattleStruct->turnSideTracker]; if (gWishFutureKnock.wishCounter[gActiveBank] && --gWishFutureKnock.wishCounter[gActiveBank] == 0 && gBattleMons[gActiveBank].hp) { gBankTarget = gActiveBank; - b_call_bc_move_exec(BattleScript_WishComesTrue); + BattleScriptExecute(BattleScript_WishComesTrue); effect++; } - BATTLE_STRUCT->turnSideTracker++; + gBattleStruct->turnSideTracker++; if (effect) break; } if (!effect) { - BATTLE_STRUCT->turncountersTracker++; + gBattleStruct->turncountersTracker++; } break; case 6: @@ -532,10 +782,10 @@ u8 UpdateTurnCounters(void) gBattleCommunication[MULTISTRING_CHOOSER] = 1; else gBattleCommunication[MULTISTRING_CHOOSER] = 0; - b_call_bc_move_exec(BattleScript_RainContinuesOrEnds); + BattleScriptExecute(BattleScript_RainContinuesOrEnds); effect++; } - BATTLE_STRUCT->turncountersTracker++; + gBattleStruct->turncountersTracker++; break; case 7: if (gBattleWeather & WEATHER_SANDSTORM_ANY) @@ -548,12 +798,12 @@ u8 UpdateTurnCounters(void) else gBattlescriptCurrInstr = BattleScript_DamagingWeatherContinues; - BATTLE_STRUCT->animArg1 = B_ANIM_SANDSTORM_CONTINUES; + gBattleStruct->animArg1 = B_ANIM_SANDSTORM_CONTINUES; gBattleCommunication[MULTISTRING_CHOOSER] = 0; - b_call_bc_move_exec(gBattlescriptCurrInstr); + BattleScriptExecute(gBattlescriptCurrInstr); effect++; } - BATTLE_STRUCT->turncountersTracker++; + gBattleStruct->turncountersTracker++; break; case 8: if (gBattleWeather & WEATHER_SUN_ANY) @@ -566,10 +816,10 @@ u8 UpdateTurnCounters(void) else gBattlescriptCurrInstr = BattleScript_SunlightContinues; - b_call_bc_move_exec(gBattlescriptCurrInstr); + BattleScriptExecute(gBattlescriptCurrInstr); effect++; } - BATTLE_STRUCT->turncountersTracker++; + gBattleStruct->turncountersTracker++; break; case 9: if (gBattleWeather & WEATHER_HAIL) @@ -582,12 +832,12 @@ u8 UpdateTurnCounters(void) else gBattlescriptCurrInstr = BattleScript_DamagingWeatherContinues; - BATTLE_STRUCT->animArg1 = B_ANIM_HAIL_CONTINUES; + gBattleStruct->animArg1 = B_ANIM_HAIL_CONTINUES; gBattleCommunication[MULTISTRING_CHOOSER] = 1; - b_call_bc_move_exec(gBattlescriptCurrInstr); + BattleScriptExecute(gBattlescriptCurrInstr); effect++; } - BATTLE_STRUCT->turncountersTracker++; + gBattleStruct->turncountersTracker++; break; case 10: effect++; @@ -604,16 +854,16 @@ u8 TurnBasedEffects(void) u8 effect = 0; gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_x20); - while (BATTLE_STRUCT->turnEffectsBank < gNoOfAllBanks && BATTLE_STRUCT->turnEffectsTracker <= TURNBASED_MAX_CASE) + while (gBattleStruct->turnEffectsBank < gNoOfAllBanks && gBattleStruct->turnEffectsTracker <= TURNBASED_MAX_CASE) { - gActiveBank = gBankAttacker = gTurnOrder[BATTLE_STRUCT->turnEffectsBank]; + gActiveBank = gBankAttacker = gBanksByTurnOrder[gBattleStruct->turnEffectsBank]; if (gAbsentBankFlags & gBitTable[gActiveBank]) { - BATTLE_STRUCT->turnEffectsBank++; + gBattleStruct->turnEffectsBank++; } else { - switch (BATTLE_STRUCT->turnEffectsTracker) + switch (gBattleStruct->turnEffectsTracker) { case 0: // ingrain if ((gStatuses3[gActiveBank] & STATUS3_ROOTED) @@ -624,25 +874,25 @@ u8 TurnBasedEffects(void) if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; - b_call_bc_move_exec(BattleScript_IngrainTurnHeal); + BattleScriptExecute(BattleScript_IngrainTurnHeal); effect++; } - BATTLE_STRUCT->turnEffectsTracker++; + gBattleStruct->turnEffectsTracker++; break; case 1: // end turn abilities if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, gActiveBank, 0, 0, 0)) effect++; - BATTLE_STRUCT->turnEffectsTracker++; + gBattleStruct->turnEffectsTracker++; break; case 2: // item effects if (ItemBattleEffects(1, gActiveBank, 0)) effect++; - BATTLE_STRUCT->turnEffectsTracker++; + gBattleStruct->turnEffectsTracker++; break; case 18: // item effects again if (ItemBattleEffects(1, gActiveBank, 1)) effect++; - BATTLE_STRUCT->turnEffectsTracker++; + gBattleStruct->turnEffectsTracker++; break; case 3: // leech seed if (gStatuses3[gActiveBank] & STATUS3_LEECHSEED && gBattleMons[gStatuses3[gActiveBank] & STATUS3_LEECHSEED_BANK].hp != 0 && gBattleMons[gActiveBank].hp != 0) @@ -651,12 +901,12 @@ u8 TurnBasedEffects(void) gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 8; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; - BATTLE_STRUCT->animArg1 = gBankTarget; - BATTLE_STRUCT->animArg2 = gBankAttacker; - b_call_bc_move_exec(BattleScript_LeechSeedTurnDrain); + gBattleStruct->animArg1 = gBankTarget; + gBattleStruct->animArg2 = gBankAttacker; + BattleScriptExecute(BattleScript_LeechSeedTurnDrain); effect++; } - BATTLE_STRUCT->turnEffectsTracker++; + gBattleStruct->turnEffectsTracker++; break; case 4: // poison if ((gBattleMons[gActiveBank].status1 & STATUS_POISON) && gBattleMons[gActiveBank].hp != 0) @@ -664,10 +914,10 @@ u8 TurnBasedEffects(void) gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 8; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; - b_call_bc_move_exec(BattleScript_PoisonTurnDmg); + BattleScriptExecute(BattleScript_PoisonTurnDmg); effect++; } - BATTLE_STRUCT->turnEffectsTracker++; + gBattleStruct->turnEffectsTracker++; break; case 5: // toxic poison if ((gBattleMons[gActiveBank].status1 & STATUS_TOXIC_POISON) && gBattleMons[gActiveBank].hp != 0) @@ -678,10 +928,10 @@ u8 TurnBasedEffects(void) if ((gBattleMons[gActiveBank].status1 & 0xF00) != 0xF00) //not 16 turns gBattleMons[gActiveBank].status1 += 0x100; gBattleMoveDamage *= (gBattleMons[gActiveBank].status1 & 0xF00) >> 8; - b_call_bc_move_exec(BattleScript_PoisonTurnDmg); + BattleScriptExecute(BattleScript_PoisonTurnDmg); effect++; } - BATTLE_STRUCT->turnEffectsTracker++; + gBattleStruct->turnEffectsTracker++; break; case 6: // burn if ((gBattleMons[gActiveBank].status1 & STATUS_BURN) && gBattleMons[gActiveBank].hp != 0) @@ -689,10 +939,10 @@ u8 TurnBasedEffects(void) gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 8; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; - b_call_bc_move_exec(BattleScript_BurnTurnDmg); + BattleScriptExecute(BattleScript_BurnTurnDmg); effect++; } - BATTLE_STRUCT->turnEffectsTracker++; + gBattleStruct->turnEffectsTracker++; break; case 7: // spooky nightmares if ((gBattleMons[gActiveBank].status2 & STATUS2_NIGHTMARE) && gBattleMons[gActiveBank].hp != 0) @@ -701,10 +951,10 @@ u8 TurnBasedEffects(void) gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 4; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; - b_call_bc_move_exec(BattleScript_NightmareTurnDmg); + BattleScriptExecute(BattleScript_NightmareTurnDmg); effect++; } - BATTLE_STRUCT->turnEffectsTracker++; + gBattleStruct->turnEffectsTracker++; break; case 8: // curse if ((gBattleMons[gActiveBank].status2 & STATUS2_CURSED) && gBattleMons[gActiveBank].hp != 0) @@ -712,10 +962,10 @@ u8 TurnBasedEffects(void) gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 4; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; - b_call_bc_move_exec(BattleScript_CurseTurnDmg); + BattleScriptExecute(BattleScript_CurseTurnDmg); effect++; } - BATTLE_STRUCT->turnEffectsTracker++; + gBattleStruct->turnEffectsTracker++; break; case 9: // wrap if ((gBattleMons[gActiveBank].status2 & STATUS2_WRAPPED) && gBattleMons[gActiveBank].hp != 0) @@ -723,8 +973,8 @@ u8 TurnBasedEffects(void) gBattleMons[gActiveBank].status2 -= 0x2000; if (gBattleMons[gActiveBank].status2 & STATUS2_WRAPPED) // damaged by wrap { - BATTLE_STRUCT->animArg1 = ewram16004arr(0, gActiveBank); - BATTLE_STRUCT->animArg2 = ewram16004arr(1, gActiveBank); + gBattleStruct->animArg1 = ewram16004arr(0, gActiveBank); + gBattleStruct->animArg2 = ewram16004arr(1, gActiveBank); gBattleTextBuff1[0] = 0xFD; gBattleTextBuff1[1] = 2; gBattleTextBuff1[2] = ewram16004arr(0, gActiveBank); @@ -744,10 +994,10 @@ u8 TurnBasedEffects(void) gBattleTextBuff1[4] = EOS; gBattlescriptCurrInstr = BattleScript_WrapEnds; } - b_call_bc_move_exec(gBattlescriptCurrInstr); + BattleScriptExecute(gBattlescriptCurrInstr); effect++; } - BATTLE_STRUCT->turnEffectsTracker++; + gBattleStruct->turnEffectsTracker++; break; case 10: // uproar if (gBattleMons[gActiveBank].status2 & STATUS2_UPROAR) @@ -760,9 +1010,9 @@ u8 TurnBasedEffects(void) gBattleMons[gBankAttacker].status1 &= ~(STATUS_SLEEP); gBattleMons[gBankAttacker].status2 &= ~(STATUS2_NIGHTMARE); gBattleCommunication[MULTISTRING_CHOOSER] = 1; - b_call_bc_move_exec(BattleScript_MonWokeUpInUproar); + BattleScriptExecute(BattleScript_MonWokeUpInUproar); gActiveBank = gBankAttacker; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); + EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); MarkBufferBankForExecution(gActiveBank); break; } @@ -776,7 +1026,7 @@ u8 TurnBasedEffects(void) { gBankAttacker = gActiveBank; gBattleMons[gActiveBank].status2 -= 0x10; // uproar timer goes down - if (sub_8015660(gActiveBank)) + if (WasUnableToUseMove(gActiveBank)) { CancelMultiTurnMoves(gActiveBank); gBattleCommunication[MULTISTRING_CHOOSER] = 1; @@ -791,18 +1041,18 @@ u8 TurnBasedEffects(void) gBattleCommunication[MULTISTRING_CHOOSER] = 1; CancelMultiTurnMoves(gActiveBank); } - b_call_bc_move_exec(BattleScript_PrintUproarOverTurns); + BattleScriptExecute(BattleScript_PrintUproarOverTurns); effect = 1; } } if (effect != 2) - BATTLE_STRUCT->turnEffectsTracker++; + gBattleStruct->turnEffectsTracker++; break; case 11: // thrash if (gBattleMons[gActiveBank].status2 & STATUS2_LOCK_CONFUSE) { gBattleMons[gActiveBank].status2 -= 0x400; - if (sub_8015660(gActiveBank)) + if (WasUnableToUseMove(gActiveBank)) CancelMultiTurnMoves(gActiveBank); else if (!(gBattleMons[gActiveBank].status2 & STATUS2_LOCK_CONFUSE) && (gBattleMons[gActiveBank].status2 & STATUS2_MULTIPLETURNS)) @@ -813,12 +1063,12 @@ u8 TurnBasedEffects(void) gBattleCommunication[MOVE_EFFECT_BYTE] = 0x47; SetMoveEffect(1, 0); if (gBattleMons[gActiveBank].status2 & STATUS2_CONFUSION) - b_call_bc_move_exec(BattleScript_ThrashConfuses); + BattleScriptExecute(BattleScript_ThrashConfuses); effect++; } } } - BATTLE_STRUCT->turnEffectsTracker++; + gBattleStruct->turnEffectsTracker++; break; case 12: // disable if (gDisableStructs[gActiveBank].disableTimer1 != 0) @@ -837,11 +1087,11 @@ u8 TurnBasedEffects(void) else if (--gDisableStructs[gActiveBank].disableTimer1 == 0) // disable ends { gDisableStructs[gActiveBank].disabledMove = 0; - b_call_bc_move_exec(BattleScript_DisabledNoMore); + BattleScriptExecute(BattleScript_DisabledNoMore); effect++; } } - BATTLE_STRUCT->turnEffectsTracker++; + gBattleStruct->turnEffectsTracker++; break; case 13: // encore if (gDisableStructs[gActiveBank].encoreTimer1 != 0) @@ -856,26 +1106,26 @@ u8 TurnBasedEffects(void) { gDisableStructs[gActiveBank].encoredMove = 0; gDisableStructs[gActiveBank].encoreTimer1 = 0; - b_call_bc_move_exec(BattleScript_EncoredNoMore); + BattleScriptExecute(BattleScript_EncoredNoMore); effect++; } } - BATTLE_STRUCT->turnEffectsTracker++; + gBattleStruct->turnEffectsTracker++; break; case 14: // lock-on decrement if (gStatuses3[gActiveBank] & STATUS3_ALWAYS_HITS) gStatuses3[gActiveBank] -= 0x8; - BATTLE_STRUCT->turnEffectsTracker++; + gBattleStruct->turnEffectsTracker++; break; case 15: // charge if (gDisableStructs[gActiveBank].chargeTimer1 && --gDisableStructs[gActiveBank].chargeTimer1 == 0) gStatuses3[gActiveBank] &= ~STATUS3_CHARGED_UP; - BATTLE_STRUCT->turnEffectsTracker++; + gBattleStruct->turnEffectsTracker++; break; case 16: // taunt if (gDisableStructs[gActiveBank].tauntTimer1) gDisableStructs[gActiveBank].tauntTimer1--; - BATTLE_STRUCT->turnEffectsTracker++; + gBattleStruct->turnEffectsTracker++; break; case 17: // yawn if (gStatuses3[gActiveBank] & STATUS3_YAWN) @@ -887,18 +1137,18 @@ u8 TurnBasedEffects(void) { CancelMultiTurnMoves(gActiveBank); gBattleMons[gActiveBank].status1 |= (Random() & 3) + 2; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); + EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); MarkBufferBankForExecution(gActiveBank); gEffectBank = gActiveBank; - b_call_bc_move_exec(BattleScript_YawnMakesAsleep); + BattleScriptExecute(BattleScript_YawnMakesAsleep); effect++; } } - BATTLE_STRUCT->turnEffectsTracker++; + gBattleStruct->turnEffectsTracker++; break; case 19: // done - BATTLE_STRUCT->turnEffectsTracker = 0; - BATTLE_STRUCT->turnEffectsBank++; + gBattleStruct->turnEffectsTracker = 0; + gBattleStruct->turnEffectsBank++; break; } if (effect != 0) @@ -909,20 +1159,20 @@ u8 TurnBasedEffects(void) return 0; } -bool8 sub_80170DC(void) // handle future sight and perish song +bool8 HandleWishPerishSongOnTurnEnd(void) { gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_x20); - switch (BATTLE_STRUCT->sub80170DC_Tracker) + switch (gBattleStruct->sub80170DC_Tracker) { case 0: // future sight - while (BATTLE_STRUCT->sub80170DC_Bank < gNoOfAllBanks) + while (gBattleStruct->sub80170DC_Bank < gNoOfAllBanks) { - gActiveBank = BATTLE_STRUCT->sub80170DC_Bank; + gActiveBank = gBattleStruct->sub80170DC_Bank; if (gAbsentBankFlags & gBitTable[gActiveBank]) - BATTLE_STRUCT->sub80170DC_Bank++; + gBattleStruct->sub80170DC_Bank++; else { - BATTLE_STRUCT->sub80170DC_Bank++; + gBattleStruct->sub80170DC_Bank++; if (gWishFutureKnock.futureSightCounter[gActiveBank] && --gWishFutureKnock.futureSightCounter[gActiveBank] == 0 && gBattleMons[gActiveBank].hp) { if (gWishFutureKnock.futureSightMove[gActiveBank] == MOVE_FUTURE_SIGHT) @@ -938,22 +1188,22 @@ bool8 sub_80170DC(void) // handle future sight and perish song gBankAttacker = gWishFutureKnock.futureSightAttacker[gActiveBank]; gBattleMoveDamage = gWishFutureKnock.futureSightDmg[gActiveBank]; gSpecialStatuses[gBankTarget].moveturnLostHP = 0xFFFF; - b_call_bc_move_exec(BattleScript_MonTookFutureAttack); + BattleScriptExecute(BattleScript_MonTookFutureAttack); return 1; } } } - BATTLE_STRUCT->sub80170DC_Tracker = 1; - BATTLE_STRUCT->sub80170DC_Bank = 0; + gBattleStruct->sub80170DC_Tracker = 1; + gBattleStruct->sub80170DC_Bank = 0; case 1: // perish song - while (BATTLE_STRUCT->sub80170DC_Bank < gNoOfAllBanks) + while (gBattleStruct->sub80170DC_Bank < gNoOfAllBanks) { - gActiveBank = gBankAttacker = gTurnOrder[BATTLE_STRUCT->sub80170DC_Bank]; + gActiveBank = gBankAttacker = gBanksByTurnOrder[gBattleStruct->sub80170DC_Bank]; if (gAbsentBankFlags & gBitTable[gActiveBank]) - BATTLE_STRUCT->sub80170DC_Bank++; + gBattleStruct->sub80170DC_Bank++; else { - BATTLE_STRUCT->sub80170DC_Bank++; + gBattleStruct->sub80170DC_Bank++; if (gStatuses3[gActiveBank] & STATUS3_PERISH_SONG) { gBattleTextBuff1[0] = 0xFD; @@ -973,7 +1223,7 @@ bool8 sub_80170DC(void) // handle future sight and perish song gDisableStructs[gActiveBank].perishSong1--; gBattlescriptCurrInstr = BattleScript_PerishSongTimerGoesDown; } - b_call_bc_move_exec(gBattlescriptCurrInstr); + BattleScriptExecute(gBattlescriptCurrInstr); return 1; } } @@ -984,20 +1234,20 @@ bool8 sub_80170DC(void) // handle future sight and perish song return 0; } -#define sub_80173A4_MAX_CASE 7 +#define HandleFaintedMonActions_MAX_CASE 7 -bool8 sub_80173A4(void) +bool8 HandleFaintedMonActions(void) { if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) return 0; do { int i; - switch (BATTLE_STRUCT->sub80173A4_Tracker) + switch (gBattleStruct->sub80173A4_Tracker) { case 0: - BATTLE_STRUCT->unk1605A = 0; - BATTLE_STRUCT->sub80173A4_Tracker++; + gBattleStruct->unk1605A = 0; + gBattleStruct->sub80173A4_Tracker++; for (i = 0; i < gNoOfAllBanks; i++) { if (gAbsentBankFlags & gBitTable[i] && !sub_8018018(i, 6, 6)) @@ -1006,58 +1256,58 @@ bool8 sub_80173A4(void) case 1: do { - gBank1 = gBankTarget = BATTLE_STRUCT->unk1605A; - if (gBattleMons[BATTLE_STRUCT->unk1605A].hp == 0 && !(BATTLE_STRUCT->unk16113 & gBitTable[gBattlePartyID[BATTLE_STRUCT->unk1605A]]) && !(gAbsentBankFlags & gBitTable[BATTLE_STRUCT->unk1605A])) + gBank1 = gBankTarget = gBattleStruct->unk1605A; + if (gBattleMons[gBattleStruct->unk1605A].hp == 0 && !(gBattleStruct->unk16113 & gBitTable[gBattlePartyID[gBattleStruct->unk1605A]]) && !(gAbsentBankFlags & gBitTable[gBattleStruct->unk1605A])) { - b_call_bc_move_exec(BattleScript_GiveExp); - BATTLE_STRUCT->sub80173A4_Tracker = 2; + BattleScriptExecute(BattleScript_GiveExp); + gBattleStruct->sub80173A4_Tracker = 2; return 1; } - } while (++BATTLE_STRUCT->unk1605A != gNoOfAllBanks); - BATTLE_STRUCT->sub80173A4_Tracker = 3; + } while (++gBattleStruct->unk1605A != gNoOfAllBanks); + gBattleStruct->sub80173A4_Tracker = 3; break; case 2: sub_8015740(gBank1); - if (++BATTLE_STRUCT->unk1605A == gNoOfAllBanks) - BATTLE_STRUCT->sub80173A4_Tracker = 3; + if (++gBattleStruct->unk1605A == gNoOfAllBanks) + gBattleStruct->sub80173A4_Tracker = 3; else - BATTLE_STRUCT->sub80173A4_Tracker = 1; + gBattleStruct->sub80173A4_Tracker = 1; break; case 3: - BATTLE_STRUCT->unk1605A = 0; - BATTLE_STRUCT->sub80173A4_Tracker++; + gBattleStruct->unk1605A = 0; + gBattleStruct->sub80173A4_Tracker++; case 4: do { - gBank1 = gBankTarget = BATTLE_STRUCT->unk1605A; //or should banks be switched? - if (gBattleMons[BATTLE_STRUCT->unk1605A].hp == 0 && !(gAbsentBankFlags & gBitTable[BATTLE_STRUCT->unk1605A])) + gBank1 = gBankTarget = gBattleStruct->unk1605A; //or should banks be switched? + if (gBattleMons[gBattleStruct->unk1605A].hp == 0 && !(gAbsentBankFlags & gBitTable[gBattleStruct->unk1605A])) { - b_call_bc_move_exec(BattleScript_HandleFaintedMon); - BATTLE_STRUCT->sub80173A4_Tracker = 5; + BattleScriptExecute(BattleScript_HandleFaintedMon); + gBattleStruct->sub80173A4_Tracker = 5; return 1; } - } while (++BATTLE_STRUCT->unk1605A != gNoOfAllBanks); - BATTLE_STRUCT->sub80173A4_Tracker = 6; + } while (++gBattleStruct->unk1605A != gNoOfAllBanks); + gBattleStruct->sub80173A4_Tracker = 6; break; case 5: - if (++BATTLE_STRUCT->unk1605A == gNoOfAllBanks) - BATTLE_STRUCT->sub80173A4_Tracker = 6; + if (++gBattleStruct->unk1605A == gNoOfAllBanks) + gBattleStruct->sub80173A4_Tracker = 6; else - BATTLE_STRUCT->sub80173A4_Tracker = 4; + gBattleStruct->sub80173A4_Tracker = 4; break; case 6: if (AbilityBattleEffects(9, 0, 0, 0, 0) || AbilityBattleEffects(0xB, 0, 0, 0, 0) || ItemBattleEffects(1, 0, 1) || AbilityBattleEffects(6, 0, 0, 0, 0)) return 1; - BATTLE_STRUCT->sub80173A4_Tracker++; + gBattleStruct->sub80173A4_Tracker++; break; case 7: break; } - } while (BATTLE_STRUCT->sub80173A4_Tracker != sub_80173A4_MAX_CASE); + } while (gBattleStruct->sub80173A4_Tracker != HandleFaintedMonActions_MAX_CASE); return 0; } -void b_clear_atk_up_if_hit_flag_unless_enraged(void) +void TryClearRageStatuses(void) { int i; for (i = 0; i < gNoOfAllBanks; i++) @@ -1072,15 +1322,15 @@ void b_clear_atk_up_if_hit_flag_unless_enraged(void) u8 AtkCanceller_UnableToUseMove(void) { u8 effect = 0; - s32* bideDmg = &BATTLE_STRUCT->bideDmg; + s32* bideDmg = &gBattleStruct->bideDmg; do { - switch (BATTLE_STRUCT->atkCancellerTracker) + switch (gBattleStruct->atkCancellerTracker) { case 0: // flags clear gBattleMons[gBankAttacker].status2 &= ~(STATUS2_DESTINY_BOND); gStatuses3[gBankAttacker] &= ~(STATUS3_GRUDGE); - BATTLE_STRUCT->atkCancellerTracker++; + gBattleStruct->atkCancellerTracker++; break; case 1: // check being asleep if (gBattleMons[gBankAttacker].status1 & STATUS_SLEEP) @@ -1089,7 +1339,7 @@ u8 AtkCanceller_UnableToUseMove(void) { gBattleMons[gBankAttacker].status1 &= ~(STATUS_SLEEP); gBattleMons[gBankAttacker].status2 &= ~(STATUS2_NIGHTMARE); - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattleCommunication[MULTISTRING_CHOOSER] = 1; gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp; effect = 2; @@ -1117,14 +1367,14 @@ u8 AtkCanceller_UnableToUseMove(void) else { gBattleMons[gBankAttacker].status2 &= ~(STATUS2_NIGHTMARE); - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattleCommunication[MULTISTRING_CHOOSER] = 0; gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp; effect = 2; } } } - BATTLE_STRUCT->atkCancellerTracker++; + gBattleStruct->atkCancellerTracker++; break; case 2: // check being frozen if (gBattleMons[gBankAttacker].status1 & STATUS_FREEZE) @@ -1138,20 +1388,20 @@ u8 AtkCanceller_UnableToUseMove(void) } else { - BATTLE_STRUCT->atkCancellerTracker++; + gBattleStruct->atkCancellerTracker++; break; } } else // unfreeze { gBattleMons[gBankAttacker].status1 &= ~(STATUS_FREEZE); - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze; gBattleCommunication[MULTISTRING_CHOOSER] = 0; } effect = 2; } - BATTLE_STRUCT->atkCancellerTracker++; + gBattleStruct->atkCancellerTracker++; break; case 3: // truant if (gBattleMons[gBankAttacker].ability == ABILITY_TRUANT && gDisableStructs[gBankAttacker].truantCounter) @@ -1163,7 +1413,7 @@ u8 AtkCanceller_UnableToUseMove(void) gBattleMoveFlags |= MOVESTATUS_MISSED; effect = 1; } - BATTLE_STRUCT->atkCancellerTracker++; + gBattleStruct->atkCancellerTracker++; break; case 4: // recharge if (gBattleMons[gBankAttacker].status2 & STATUS2_RECHARGE) @@ -1175,7 +1425,7 @@ u8 AtkCanceller_UnableToUseMove(void) gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; effect = 1; } - BATTLE_STRUCT->atkCancellerTracker++; + gBattleStruct->atkCancellerTracker++; break; case 5: // flinch if (gBattleMons[gBankAttacker].status2 & STATUS2_FLINCHED) @@ -1187,19 +1437,19 @@ u8 AtkCanceller_UnableToUseMove(void) gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; effect = 1; } - BATTLE_STRUCT->atkCancellerTracker++; + gBattleStruct->atkCancellerTracker++; break; case 6: // disabled move if (gDisableStructs[gBankAttacker].disabledMove == gCurrentMove && gDisableStructs[gBankAttacker].disabledMove != 0) { gProtectStructs[gBankAttacker].usedDisabledMove = 1; - BATTLE_STRUCT->scriptingActive = gBankAttacker; + gBattleStruct->scriptingActive = gBankAttacker; CancelMultiTurnMoves(gBankAttacker); gBattlescriptCurrInstr = BattleScript_MoveUsedIsDisabled; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; effect = 1; } - BATTLE_STRUCT->atkCancellerTracker++; + gBattleStruct->atkCancellerTracker++; break; case 7: // taunt if (gDisableStructs[gBankAttacker].tauntTimer1 && gBattleMoves[gCurrentMove].power == 0) @@ -1210,7 +1460,7 @@ u8 AtkCanceller_UnableToUseMove(void) gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; effect = 1; } - BATTLE_STRUCT->atkCancellerTracker++; + gBattleStruct->atkCancellerTracker++; break; case 8: // imprisoned if (IsImprisoned(gBankAttacker, gCurrentMove)) @@ -1221,7 +1471,7 @@ u8 AtkCanceller_UnableToUseMove(void) gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; effect = 1; } - BATTLE_STRUCT->atkCancellerTracker++; + gBattleStruct->atkCancellerTracker++; break; case 9: // confusion if (gBattleMons[gBankAttacker].status2 & STATUS2_CONFUSION) @@ -1232,7 +1482,7 @@ u8 AtkCanceller_UnableToUseMove(void) if (Random() & 1) { gBattleCommunication[MULTISTRING_CHOOSER] = 0; - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); } else // confusion dmg { @@ -1246,12 +1496,12 @@ u8 AtkCanceller_UnableToUseMove(void) } else // snapped out of confusion { - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfusedNoMore; } effect = 1; } - BATTLE_STRUCT->atkCancellerTracker++; + gBattleStruct->atkCancellerTracker++; break; case 10: // paralysis if (gBattleMons[gBankAttacker].status1 & STATUS_PARALYSIS && (Random() % 4) == 0) @@ -1262,17 +1512,17 @@ u8 AtkCanceller_UnableToUseMove(void) gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; effect = 1; } - BATTLE_STRUCT->atkCancellerTracker++; + gBattleStruct->atkCancellerTracker++; break; case 11: // infatuation if (gBattleMons[gBankAttacker].status2 & STATUS2_INFATUATION) { - BATTLE_STRUCT->scriptingActive = CountTrailingZeroBits((gBattleMons[gBankAttacker].status2 & STATUS2_INFATUATION) >> 0x10); + gBattleStruct->scriptingActive = CountTrailingZeroBits((gBattleMons[gBankAttacker].status2 & STATUS2_INFATUATION) >> 0x10); if (Random() & 1) - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); else { - b_movescr_stack_push(BattleScript_MoveUsedIsParalyzedCantAttack); + BattleScriptPush(BattleScript_MoveUsedIsParalyzedCantAttack); gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gProtectStructs[gBankAttacker].loveImmobility = 1; CancelMultiTurnMoves(gBankAttacker); @@ -1280,7 +1530,7 @@ u8 AtkCanceller_UnableToUseMove(void) gBattlescriptCurrInstr = BattleScript_MoveUsedIsInLove; effect = 1; } - BATTLE_STRUCT->atkCancellerTracker++; + gBattleStruct->atkCancellerTracker++; break; case 12: // bide if (gBattleMons[gBankAttacker].status2 & STATUS2_BIDE) @@ -1305,7 +1555,7 @@ u8 AtkCanceller_UnableToUseMove(void) } effect = 1; } - BATTLE_STRUCT->atkCancellerTracker++; + gBattleStruct->atkCancellerTracker++; break; case 13: // move thawing if (gBattleMons[gBankAttacker].status1 & STATUS_FREEZE) @@ -1313,24 +1563,24 @@ u8 AtkCanceller_UnableToUseMove(void) if (gBattleMoves[gCurrentMove].effect == EFFECT_THAW_HIT) { gBattleMons[gBankAttacker].status1 &= ~(STATUS_FREEZE); - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze; gBattleCommunication[MULTISTRING_CHOOSER] = 1; } effect = 2; } - BATTLE_STRUCT->atkCancellerTracker++; + gBattleStruct->atkCancellerTracker++; break; case 14: // last case break; } - } while (BATTLE_STRUCT->atkCancellerTracker != ATKCANCELLER_MAX_CASE && effect == 0); + } while (gBattleStruct->atkCancellerTracker != ATKCANCELLER_MAX_CASE && effect == 0); if (effect == 2) { gActiveBank = gBankAttacker; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); + EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); MarkBufferBankForExecution(gActiveBank); } return effect; @@ -1363,14 +1613,14 @@ bool8 sub_8018018(u8 bank, u8 r1, u8 r2) { if (GetBankSide(bank) == 1) { - r7 = GetBankByPlayerAI(1); - r6 = GetBankByPlayerAI(3); + r7 = GetBankByIdentity(1); + r6 = GetBankByIdentity(3); party = gEnemyParty; } else { - r7 = GetBankByPlayerAI(0); - r6 = GetBankByPlayerAI(2); + r7 = GetBankByIdentity(0); + r6 = GetBankByIdentity(2); party = gPlayerParty; } if (r1 == 6) @@ -1483,23 +1733,20 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) else move = gCurrentMove; - if (BATTLE_STRUCT->dynamicMoveType) - moveType = BATTLE_STRUCT->dynamicMoveType & 0x3F; + if (gBattleStruct->dynamicMoveType) + moveType = gBattleStruct->dynamicMoveType & 0x3F; else moveType = gBattleMoves[move].type; - //_080184AC switch (caseID) { case ABILITYEFFECT_ON_SWITCHIN: // 0 - //_08018518 if (gBankAttacker >= gNoOfAllBanks) gBankAttacker = bank; switch (gLastUsedAbility) { case 0xFF: //weather from overworld - //_08018586 - switch (weather_get_current()) + switch (GetCurrentWeather()) { case WEATHER_RAIN_LIGHT: case WEATHER_RAIN_MED: @@ -1507,8 +1754,8 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) if (!(gBattleWeather & WEATHER_RAIN_ANY)) { gBattleWeather = (WEATHER_RAIN_TEMPORARY | WEATHER_RAIN_PERMANENT); - BATTLE_STRUCT->animArg1 = B_ANIM_RAIN_CONTINUES; - BATTLE_STRUCT->scriptingActive = bank; + gBattleStruct->animArg1 = B_ANIM_RAIN_CONTINUES; + gBattleStruct->scriptingActive = bank; effect++; } break; @@ -1516,8 +1763,8 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) if (!(gBattleWeather & WEATHER_SANDSTORM_ANY)) { gBattleWeather = (WEATHER_SANDSTORM_PERMANENT | WEATHER_SANDSTORM_TEMPORARY); - BATTLE_STRUCT->animArg1 = B_ANIM_SANDSTORM_CONTINUES; - BATTLE_STRUCT->scriptingActive = bank; + gBattleStruct->animArg1 = B_ANIM_SANDSTORM_CONTINUES; + gBattleStruct->scriptingActive = bank; effect++; } break; @@ -1525,50 +1772,46 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) if (!(gBattleWeather & WEATHER_SUN_ANY)) { gBattleWeather = (WEATHER_SUN_PERMANENT | WEATHER_SUN_TEMPORARY); - BATTLE_STRUCT->animArg1 = B_ANIM_SUN_CONTINUES; - BATTLE_STRUCT->scriptingActive = bank; + gBattleStruct->animArg1 = B_ANIM_SUN_CONTINUES; + gBattleStruct->scriptingActive = bank; effect++; } break; } if (effect) { - gBattleCommunication[MULTISTRING_CHOOSER] = weather_get_current(); - b_push_move_exec(BattleScript_OverworldWeatherStarts); + gBattleCommunication[MULTISTRING_CHOOSER] = GetCurrentWeather(); + BattleScriptPushCursorAndCallback(BattleScript_OverworldWeatherStarts); } break; case ABILITY_DRIZZLE: - //_08018680 if (!(gBattleWeather & WEATHER_RAIN_PERMANENT)) { gBattleWeather = (WEATHER_RAIN_PERMANENT | WEATHER_RAIN_TEMPORARY); - b_push_move_exec(BattleScript_DrizzleActivates); - BATTLE_STRUCT->scriptingActive = bank; + BattleScriptPushCursorAndCallback(BattleScript_DrizzleActivates); + gBattleStruct->scriptingActive = bank; effect++; } break; case ABILITY_SAND_STREAM: - //_080186B8 if (!(gBattleWeather & WEATHER_SANDSTORM_PERMANENT)) { gBattleWeather = (WEATHER_SANDSTORM_PERMANENT | WEATHER_SANDSTORM_TEMPORARY); - b_push_move_exec(BattleScript_SandstreamActivates); - BATTLE_STRUCT->scriptingActive = bank; + BattleScriptPushCursorAndCallback(BattleScript_SandstreamActivates); + gBattleStruct->scriptingActive = bank; effect++; } break; case ABILITY_DROUGHT: - //_080186F0 if (!(gBattleWeather & WEATHER_SUN_PERMANENT)) { gBattleWeather = (WEATHER_SUN_PERMANENT | WEATHER_SUN_TEMPORARY); - b_push_move_exec(BattleScript_DroughtActivates); - BATTLE_STRUCT->scriptingActive = bank; + BattleScriptPushCursorAndCallback(BattleScript_DroughtActivates); + gBattleStruct->scriptingActive = bank; effect++; } break; case ABILITY_INTIMIDATE: - //_08018728 if (!(gSpecialStatuses[bank].intimidatedPoke)) { gStatuses3[bank] |= STATUS3_INTIMIDATE_POKES; @@ -1576,17 +1819,15 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITY_FORECAST: - //_0801875C effect = CastformDataTypeChange(bank); if (effect != 0) { - b_push_move_exec(BattleScript_CastformChange); - BATTLE_STRUCT->scriptingActive = bank; - BATTLE_STRUCT->castformToChangeInto = effect - 1; + BattleScriptPushCursorAndCallback(BattleScript_CastformChange); + gBattleStruct->scriptingActive = bank; + gBattleStruct->castformToChangeInto = effect - 1; } break; case ABILITY_TRACE: - //_080187A0 if (!(gSpecialStatuses[bank].traced)) { gStatuses3[bank] |= STATUS3_TRACE; @@ -1595,7 +1836,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) break; case ABILITY_CLOUD_NINE: case ABILITY_AIR_LOCK: - //_080187DC { // that's a weird choice for a variable, why not use i or bank? for (target1 = 0; target1 < gNoOfAllBanks; target1++) @@ -1603,9 +1843,9 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) effect = CastformDataTypeChange(target1); if (effect != 0) { - b_push_move_exec(BattleScript_CastformChange); - BATTLE_STRUCT->scriptingActive = target1; - BATTLE_STRUCT->castformToChangeInto = effect - 1; + BattleScriptPushCursorAndCallback(BattleScript_CastformChange); + gBattleStruct->scriptingActive = target1; + gBattleStruct->castformToChangeInto = effect - 1; break; } } @@ -1614,7 +1854,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_ENDTURN: // 1 - //_08018814 if (gBattleMons[bank].hp != 0) { gBankAttacker = bank; @@ -1625,7 +1864,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) && gBattleMons[bank].maxHP > gBattleMons[bank].hp) { gLastUsedAbility = ABILITY_RAIN_DISH; // why - b_push_move_exec(BattleScript_RainDishActivates); + BattleScriptPushCursorAndCallback(BattleScript_RainDishActivates); gBattleMoveDamage = gBattleMons[bank].maxHP / 16; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; @@ -1649,9 +1888,9 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) gBattleMons[bank].status1 = 0; // BUG: The nightmare status does not get cleared here. This was fixed in Emerald. //gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE); - BATTLE_STRUCT->scriptingActive = gActiveBank = bank; - b_push_move_exec(BattleScript_ShedSkinActivates); - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[bank].status1); + gBattleStruct->scriptingActive = gActiveBank = bank; + BattleScriptPushCursorAndCallback(BattleScript_ShedSkinActivates); + EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[bank].status1); MarkBufferBankForExecution(gActiveBank); effect++; } @@ -1660,10 +1899,10 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) if (gBattleMons[bank].statStages[STAT_STAGE_SPEED] < 0xC && gDisableStructs[bank].isFirstTurn != 2) { gBattleMons[bank].statStages[STAT_STAGE_SPEED]++; - BATTLE_STRUCT->animArg1 = 0x11; - BATTLE_STRUCT->animArg2 = 0; - b_push_move_exec(BattleScript_SpeedBoostActivates); - BATTLE_STRUCT->scriptingActive = bank; + gBattleStruct->animArg1 = 0x11; + gBattleStruct->animArg2 = 0; + BattleScriptPushCursorAndCallback(BattleScript_SpeedBoostActivates); + gBattleStruct->scriptingActive = bank; effect++; } break; @@ -1674,7 +1913,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_MOVES_BLOCK: // 2 - //_08018A40 if (gLastUsedAbility == ABILITY_SOUNDPROOF) { for (i = 0; gSoundMovesTable[i] != 0xFFFF; i++) @@ -1692,7 +1930,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_ABSORBING: // 3 - //_08018AD8 if (move) { switch (gLastUsedAbility) @@ -1762,11 +1999,9 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_CONTACT: // 4 - //_08018CF0 switch (gLastUsedAbility) { case ABILITY_COLOR_CHANGE: - //_08018DCC if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) && move != MOVE_STRUGGLE && gBattleMoves[move].power != 0 @@ -1781,13 +2016,12 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) gBattleTextBuff1[1] = 3; gBattleTextBuff1[2] = moveType; gBattleTextBuff1[3] = 0xFF; - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_ColorChangeActivates; effect++; } break; case ABILITY_ROUGH_SKIN: - //_08018E94 if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) && gBattleMons[gBankAttacker].hp != 0 && !gProtectStructs[gBankAttacker].confusionSelfDmg @@ -1797,106 +2031,201 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 16; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_RoughSkinActivates; effect++; } break; case ABILITY_EFFECT_SPORE: - //_08018F54 - if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) - && gBattleMons[gBankAttacker].hp != 0 - && !gProtectStructs[gBankAttacker].confusionSelfDmg - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) - && (Random() % 10) == 0) - { - do - { - gBattleCommunication[MOVE_EFFECT_BYTE] = Random() & 3; - } while (gBattleCommunication[MOVE_EFFECT_BYTE] == 0); - if (gBattleCommunication[MOVE_EFFECT_BYTE] == 3) - gBattleCommunication[MOVE_EFFECT_BYTE] += 2; - gBattleCommunication[MOVE_EFFECT_BYTE] += 0x40; - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - effect++; - } + if (DEBUG && (gUnknown_02023A14_50 & 4)) + { + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) + && gBattleMons[gBankAttacker].hp != 0 + && !gProtectStructs[gBankAttacker].confusionSelfDmg + && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)) + { + do + { + gBattleCommunication[MOVE_EFFECT_BYTE] = Random() & 3; + } while (gBattleCommunication[MOVE_EFFECT_BYTE] == 0); + if (gBattleCommunication[MOVE_EFFECT_BYTE] == 3) + gBattleCommunication[MOVE_EFFECT_BYTE] += 2; + gBattleCommunication[MOVE_EFFECT_BYTE] += 0x40; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; + gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + effect++; + } + } + else + { + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) + && gBattleMons[gBankAttacker].hp != 0 + && !gProtectStructs[gBankAttacker].confusionSelfDmg + && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + && (Random() % 10) == 0) + { + do + { + gBattleCommunication[MOVE_EFFECT_BYTE] = Random() & 3; + } while (gBattleCommunication[MOVE_EFFECT_BYTE] == 0); + if (gBattleCommunication[MOVE_EFFECT_BYTE] == 3) + gBattleCommunication[MOVE_EFFECT_BYTE] += 2; + gBattleCommunication[MOVE_EFFECT_BYTE] += 0x40; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; + gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + effect++; + } + } break; case ABILITY_POISON_POINT: - //_0801904C - if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) - && gBattleMons[gBankAttacker].hp != 0 - && !gProtectStructs[gBankAttacker].confusionSelfDmg - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) - && (Random() % 3) == 0) - { - gBattleCommunication[MOVE_EFFECT_BYTE] = 0x42; - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - effect++; - } + if (DEBUG && (gUnknown_02023A14_50 & 4)) + { + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) + && gBattleMons[gBankAttacker].hp != 0 + && !gProtectStructs[gBankAttacker].confusionSelfDmg + && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)) + { + gBattleCommunication[MOVE_EFFECT_BYTE] = 0x42; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; + gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + effect++; + } + } + else + { + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) + && gBattleMons[gBankAttacker].hp != 0 + && !gProtectStructs[gBankAttacker].confusionSelfDmg + && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + && (Random() % 3) == 0) + { + gBattleCommunication[MOVE_EFFECT_BYTE] = 0x42; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; + gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + effect++; + } + } break; case ABILITY_STATIC: - //_08019128 - if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) - && gBattleMons[gBankAttacker].hp != 0 - && !gProtectStructs[gBankAttacker].confusionSelfDmg - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) - && (Random() % 3) == 0) - { - gBattleCommunication[MOVE_EFFECT_BYTE] = 0x45; - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - effect++; - } + if (DEBUG && (gUnknown_02023A14_50 & 4)) + { + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) + && gBattleMons[gBankAttacker].hp != 0 + && !gProtectStructs[gBankAttacker].confusionSelfDmg + && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)) + { + gBattleCommunication[MOVE_EFFECT_BYTE] = 0x45; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; + gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + effect++; + } + } + else + { + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) + && gBattleMons[gBankAttacker].hp != 0 + && !gProtectStructs[gBankAttacker].confusionSelfDmg + && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + && (Random() % 3) == 0) + { + gBattleCommunication[MOVE_EFFECT_BYTE] = 0x45; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; + gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + effect++; + } + } break; case ABILITY_FLAME_BODY: - //_08019204 - if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) - && gBattleMons[gBankAttacker].hp != 0 - && !gProtectStructs[gBankAttacker].confusionSelfDmg - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) - && (Random() % 3) == 0) - { - gBattleCommunication[MOVE_EFFECT_BYTE] = 0x43; - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - effect++; - } + if (DEBUG && (gUnknown_02023A14_50 & 4)) + { + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) + && gBattleMons[gBankAttacker].hp != 0 + && !gProtectStructs[gBankAttacker].confusionSelfDmg + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special)) + { + gBattleCommunication[MOVE_EFFECT_BYTE] = 0x43; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; + gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + effect++; + } + } + else + { + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) + && gBattleMons[gBankAttacker].hp != 0 + && !gProtectStructs[gBankAttacker].confusionSelfDmg + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) + && (Random() % 3) == 0) + { + gBattleCommunication[MOVE_EFFECT_BYTE] = 0x43; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; + gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + effect++; + } + } break; case ABILITY_CUTE_CHARM: - //_080192E0 - if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) - && gBattleMons[gBankAttacker].hp != 0 - && !gProtectStructs[gBankAttacker].confusionSelfDmg - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) - && gBattleMons[gBankTarget].hp != 0 - && (Random() % 3) == 0 - && gBattleMons[gBankAttacker].ability != ABILITY_OBLIVIOUS - && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) - && !(gBattleMons[gBankAttacker].status2 & STATUS2_INFATUATION) - && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != 0xFF - && GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) != 0xFF) - { - gBattleMons[gBankAttacker].status2 |= (gBitTable[gBankTarget] << 0x10); - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_CuteCharmActivates; - effect++; - } + if (DEBUG && (gUnknown_02023A14_50 & 4)) + { + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) + && gBattleMons[gBankAttacker].hp != 0 + && !gProtectStructs[gBankAttacker].confusionSelfDmg + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) + && gBattleMons[gBankTarget].hp != 0 + && gBattleMons[gBankAttacker].ability != ABILITY_OBLIVIOUS + && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) + && !(gBattleMons[gBankAttacker].status2 & STATUS2_INFATUATION) + && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != 0xFF + && GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) != 0xFF) + { + gBattleMons[gBankAttacker].status2 |= (gBitTable[gBankTarget] << 0x10); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_CuteCharmActivates; + effect++; + } + } + else + { + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) + && gBattleMons[gBankAttacker].hp != 0 + && !gProtectStructs[gBankAttacker].confusionSelfDmg + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) + && gBattleMons[gBankTarget].hp != 0 + && (Random() % 3) == 0 + && gBattleMons[gBankAttacker].ability != ABILITY_OBLIVIOUS + && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) + && !(gBattleMons[gBankAttacker].status2 & STATUS2_INFATUATION) + && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != 0xFF + && GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) != 0xFF) + { + gBattleMons[gBankAttacker].status2 |= (gBitTable[gBankTarget] << 0x10); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_CuteCharmActivates; + effect++; + } + } break; } break; case ABILITYEFFECT_IMMUNITY: // 5 - //_08019448 { for (bank = 0; bank < gNoOfAllBanks; bank++) { @@ -1968,11 +2297,11 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) gBattleMons[bank].status2 &= ~(STATUS2_INFATUATION); break; } - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_AbilityCuredStatus; - BATTLE_STRUCT->scriptingActive = bank; + gBattleStruct->scriptingActive = bank; gActiveBank = bank; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); + EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); MarkBufferBankForExecution(gActiveBank); return effect; } @@ -1980,7 +2309,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_FORECAST: // 6 - //_080197B4 { for (bank = 0; bank < gNoOfAllBanks; bank++) { @@ -1989,9 +2317,9 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) effect = CastformDataTypeChange(bank); if (effect) { - b_push_move_exec(BattleScript_CastformChange); - BATTLE_STRUCT->scriptingActive = bank; - BATTLE_STRUCT->castformToChangeInto = effect - 1; + BattleScriptPushCursorAndCallback(BattleScript_CastformChange); + gBattleStruct->scriptingActive = bank; + gBattleStruct->castformToChangeInto = effect - 1; return effect; } } @@ -1999,76 +2327,70 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_SYNCHRONIZE: // 7 - //_08019804 if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT)) { gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT); - BATTLE_STRUCT->synchroniseEffect &= 0x3F; - if (BATTLE_STRUCT->synchroniseEffect == 6) - BATTLE_STRUCT->synchroniseEffect = 2; - gBattleCommunication[MOVE_EFFECT_BYTE] = BATTLE_STRUCT->synchroniseEffect + 0x40; - BATTLE_STRUCT->scriptingActive = gBankTarget; - b_movescr_stack_push_cursor(); + gBattleStruct->synchroniseEffect &= 0x3F; + if (gBattleStruct->synchroniseEffect == 6) + gBattleStruct->synchroniseEffect = 2; + gBattleCommunication[MOVE_EFFECT_BYTE] = gBattleStruct->synchroniseEffect + 0x40; + gBattleStruct->scriptingActive = gBankTarget; + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SynchronizeActivates; gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; effect++; } break; case ABILITYEFFECT_ATK_SYNCHRONIZE: // 8 - //_08019880 if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT)) { gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT); - BATTLE_STRUCT->synchroniseEffect &= 0x3F; - if (BATTLE_STRUCT->synchroniseEffect == 6) - BATTLE_STRUCT->synchroniseEffect = 2; - gBattleCommunication[MOVE_EFFECT_BYTE] = BATTLE_STRUCT->synchroniseEffect; - BATTLE_STRUCT->scriptingActive = gBankAttacker; - b_movescr_stack_push_cursor(); + gBattleStruct->synchroniseEffect &= 0x3F; + if (gBattleStruct->synchroniseEffect == 6) + gBattleStruct->synchroniseEffect = 2; + gBattleCommunication[MOVE_EFFECT_BYTE] = gBattleStruct->synchroniseEffect; + gBattleStruct->scriptingActive = gBankAttacker; + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SynchronizeActivates; gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; effect++; } break; case ABILITYEFFECT_INTIMIDATE1: // 9 - //_080198FC for (i = 0; i < gNoOfAllBanks; i++) { if (gBattleMons[i].ability == ABILITY_INTIMIDATE && gStatuses3[i] & STATUS3_INTIMIDATE_POKES) { gLastUsedAbility = ABILITY_INTIMIDATE; gStatuses3[i] &= ~(STATUS3_INTIMIDATE_POKES); - b_push_move_exec(gUnknown_081D978C); - BATTLE_STRUCT->intimidateBank = i; + BattleScriptPushCursorAndCallback(gUnknown_081D978C); + gBattleStruct->intimidateBank = i; effect++; break; } } break; case ABILITYEFFECT_TRACE: // 11 - //_08019940 for (i = 0; i < gNoOfAllBanks; i++) { if (gBattleMons[i].ability == ABILITY_TRACE && (gStatuses3[i] & STATUS3_TRACE)) { u8 target2; side = (GetBankIdentity(i) ^ 1) & 1; - target1 = GetBankByPlayerAI(side); - target2 = GetBankByPlayerAI(side + 2); + target1 = GetBankByIdentity(side); + target2 = GetBankByIdentity(side + 2); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { if (gBattleMons[target1].ability != 0 && gBattleMons[target1].hp != 0 && gBattleMons[target2].ability != 0 && gBattleMons[target2].hp != 0) { - //_080199AE - gActiveBank = GetBankByPlayerAI(((Random() & 1) * 2) | side); + gActiveBank = GetBankByIdentity(((Random() & 1) * 2) | side); gBattleMons[i].ability = gBattleMons[gActiveBank].ability; gLastUsedAbility = gBattleMons[gActiveBank].ability; effect++; } else if (gBattleMons[target1].ability != 0 && gBattleMons[target1].hp != 0) { - //_08019A34 gActiveBank = target1; gBattleMons[i].ability = gBattleMons[gActiveBank].ability; gLastUsedAbility = gBattleMons[gActiveBank].ability; @@ -2076,7 +2398,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } else if (gBattleMons[target2].ability != 0 && gBattleMons[target2].hp != 0) { - //_08019A78 gActiveBank = target2; gBattleMons[i].ability = gBattleMons[gActiveBank].ability; gLastUsedAbility = gBattleMons[gActiveBank].ability; @@ -2084,7 +2405,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } } else - //_08019ABC { gActiveBank = target1; if (gBattleMons[target1].ability && gBattleMons[target1].hp) @@ -2096,9 +2416,9 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } if (effect) { - b_push_move_exec(BattleScript_TraceActivates); + BattleScriptPushCursorAndCallback(BattleScript_TraceActivates); gStatuses3[i] &= ~(STATUS3_TRACE); - BATTLE_STRUCT->scriptingActive = i; + gBattleStruct->scriptingActive = i; gBattleTextBuff1[0] = 0xFD; gBattleTextBuff1[1] = 4; @@ -2116,23 +2436,21 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_INTIMIDATE2: // 10 - //_08019B1C for (i = 0; i < gNoOfAllBanks; i++) { if (gBattleMons[i].ability == ABILITY_INTIMIDATE && (gStatuses3[i] & STATUS3_INTIMIDATE_POKES)) { gLastUsedAbility = ABILITY_INTIMIDATE; gStatuses3[i] &= ~(STATUS3_INTIMIDATE_POKES); - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = gUnknown_081D9795; - BATTLE_STRUCT->intimidateBank = i; + gBattleStruct->intimidateBank = i; effect++; break; } } break; case ABILITYEFFECT_CHECK_OTHER_SIDE: // 12 - //_08019B60 side = GetBankSide(bank); for (i = 0; i < gNoOfAllBanks; i++) { @@ -2144,7 +2462,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_CHECK_BANK_SIDE: // 13 - //_08019BBC side = GetBankSide(bank); for (i = 0; i < gNoOfAllBanks; i++) { @@ -2156,7 +2473,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_FIELD_SPORT: // 14 - //_08019C18 switch (gLastUsedAbility) { case 0xFD: @@ -2186,7 +2502,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_CHECK_ON_FIELD: // 19 - //_08019CD4 for (i = 0; i < gNoOfAllBanks; i++) { if (gBattleMons[i].ability == ability && gBattleMons[i].hp != 0) @@ -2197,7 +2512,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_CHECK_FIELD_EXCEPT_BANK: // 15 - //_08019D18 for (i = 0; i < gNoOfAllBanks; i++) { if (gBattleMons[i].ability == ability && i != bank) @@ -2208,7 +2522,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_COUNT_OTHER_SIZE: // 16 - //_08019D5C side = GetBankSide(bank); for (i = 0; i < gNoOfAllBanks; i++) { @@ -2220,7 +2533,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_COUNT_BANK_SIDE: // 17 - //_08019DB8 side = GetBankSide(bank); for (i = 0; i < gNoOfAllBanks; i++) { @@ -2232,7 +2544,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_COUNT_ON_FIELD: // 18 - //_08019F44 for (i = 0; i < gNoOfAllBanks; i++) { if (gBattleMons[i].ability == ability && i != bank) @@ -2243,7 +2554,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; } - //_08019F76 if (effect && caseID < 0xC && gLastUsedAbility != 0xFF) RecordAbilityBattle(bank, gLastUsedAbility); } @@ -2251,20 +2561,20 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) return effect; } -void b_call_bc_move_exec(u8* BS_ptr) +void BattleScriptExecute(const u8* BS_ptr) { gBattlescriptCurrInstr = BS_ptr; B_FUNCTION_STACK->ptr[B_FUNCTION_STACK->size++] = gBattleMainFunc; - gBattleMainFunc = sub_8013F54; - gFightStateTracker = 0; + gBattleMainFunc = RunBattleScriptCommands_PopCallbacksStack; + gCurrentActionFuncId = 0; } -void b_push_move_exec(u8* BS_ptr) +void BattleScriptPushCursorAndCallback(u8* BS_ptr) { - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BS_ptr; B_FUNCTION_STACK->ptr[B_FUNCTION_STACK->size++] = gBattleMainFunc; - gBattleMainFunc = sub_8013FBC; + gBattleMainFunc = RunBattleScriptCommands; } enum @@ -2338,7 +2648,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) switch (bankHoldEffect) { case HOLD_EFFECT_DOUBLE_PRIZE: - BATTLE_STRUCT->moneyMultiplier = 2; + gBattleStruct->moneyMultiplier = 2; break; case HOLD_EFFECT_RESTORE_STATS: for (i = 0; i < 8; i++) @@ -2351,10 +2661,10 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) } if (effect) { - BATTLE_STRUCT->scriptingActive = bank; + gBattleStruct->scriptingActive = bank; gStringBank = bank; gActiveBank = gBankAttacker = bank; - b_call_bc_move_exec(BattleScript_WhiteHerbEnd2); + BattleScriptExecute(BattleScript_WhiteHerbEnd2); } break; } @@ -2371,7 +2681,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) if (gBattleMons[bank].hp + bankQuality > gBattleMons[bank].maxHP) gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp; gBattleMoveDamage *= -1; - b_call_bc_move_exec(BattleScript_ItemHealHP_RemoveItem); + BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); effect = 4; } break; @@ -2406,8 +2716,8 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) gBattleTextBuff1[2] = move; gBattleTextBuff1[3] = move >> 8; gBattleTextBuff1[4] = 0xFF; - b_call_bc_move_exec(BattleScript_BerryPPHealEnd2); - EmitSetAttributes(0, i + REQUEST_PPMOVE1_BATTLE, 0, 1, &changedPP); + BattleScriptExecute(BattleScript_BerryPPHealEnd2); + EmitSetMonData(0, i + REQUEST_PPMOVE1_BATTLE, 0, 1, &changedPP); MarkBufferBankForExecution(gActiveBank); effect = ITEM_PP_CHANGE; } @@ -2424,10 +2734,10 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) } if (effect) { - BATTLE_STRUCT->scriptingActive = bank; + gBattleStruct->scriptingActive = bank; gStringBank = bank; gActiveBank = gBankAttacker = bank; - b_call_bc_move_exec(BattleScript_WhiteHerbEnd2); + BattleScriptExecute(BattleScript_WhiteHerbEnd2); } break; case HOLD_EFFECT_LEFTOVERS: @@ -2439,7 +2749,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) if (gBattleMons[bank].hp + gBattleMoveDamage > gBattleMons[bank].maxHP) gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp; gBattleMoveDamage *= -1; - b_call_bc_move_exec(BattleScript_ItemHealHP_End2); + BattleScriptExecute(BattleScript_ItemHealHP_End2); effect = ITEM_HP_CHANGE; RecordItemBattle(bank, bankHoldEffect); } @@ -2459,9 +2769,9 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp; gBattleMoveDamage *= -1; if (GetPokeFlavourRelation(gBattleMons[bank].personality, FLAVOR_SPICY) < 0) - b_call_bc_move_exec(BattleScript_BerryConfuseHealEnd2); + BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); else - b_call_bc_move_exec(BattleScript_ItemHealHP_RemoveItem); + BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); effect = ITEM_HP_CHANGE; } break; @@ -2479,9 +2789,9 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp; gBattleMoveDamage *= -1; if (GetPokeFlavourRelation(gBattleMons[bank].personality, FLAVOR_DRY) < 0) - b_call_bc_move_exec(BattleScript_BerryConfuseHealEnd2); + BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); else - b_call_bc_move_exec(BattleScript_ItemHealHP_RemoveItem); + BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); effect = ITEM_HP_CHANGE; } break; @@ -2499,9 +2809,9 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp; gBattleMoveDamage *= -1; if (GetPokeFlavourRelation(gBattleMons[bank].personality, FLAVOR_SWEET) < 0) - b_call_bc_move_exec(BattleScript_BerryConfuseHealEnd2); + BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); else - b_call_bc_move_exec(BattleScript_ItemHealHP_RemoveItem); + BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); effect = ITEM_HP_CHANGE; } break; @@ -2519,9 +2829,9 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp; gBattleMoveDamage *= -1; if (GetPokeFlavourRelation(gBattleMons[bank].personality, FLAVOR_BITTER) < 0) - b_call_bc_move_exec(BattleScript_BerryConfuseHealEnd2); + BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); else - b_call_bc_move_exec(BattleScript_ItemHealHP_RemoveItem); + BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); effect = ITEM_HP_CHANGE; } break; @@ -2539,9 +2849,9 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp; gBattleMoveDamage *= -1; if (GetPokeFlavourRelation(gBattleMons[bank].personality, FLAVOR_SOUR) < 0) - b_call_bc_move_exec(BattleScript_BerryConfuseHealEnd2); + BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); else - b_call_bc_move_exec(BattleScript_ItemHealHP_RemoveItem); + BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); effect = ITEM_HP_CHANGE; } break; @@ -2561,10 +2871,10 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) gBattleTextBuff2[4] = EOS; gEffectBank = bank; - BATTLE_STRUCT->statChanger = 0x10 + STAT_STAGE_ATK; - BATTLE_STRUCT->animArg1 = 0xE + STAT_STAGE_ATK; - BATTLE_STRUCT->animArg2 = 0; - b_call_bc_move_exec(BattleScript_BerryStatRaiseEnd2); + gBattleStruct->statChanger = 0x10 + STAT_STAGE_ATK; + gBattleStruct->animArg1 = 0xE + STAT_STAGE_ATK; + gBattleStruct->animArg2 = 0; + BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); effect = ITEM_STATS_CHANGE; } break; @@ -2577,10 +2887,10 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) gBattleTextBuff1[3] = EOS; gEffectBank = bank; - BATTLE_STRUCT->statChanger = 0x10 + STAT_STAGE_DEF; - BATTLE_STRUCT->animArg1 = 0xE + STAT_STAGE_DEF; - BATTLE_STRUCT->animArg2 = 0; - b_call_bc_move_exec(BattleScript_BerryStatRaiseEnd2); + gBattleStruct->statChanger = 0x10 + STAT_STAGE_DEF; + gBattleStruct->animArg1 = 0xE + STAT_STAGE_DEF; + gBattleStruct->animArg2 = 0; + BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); effect = ITEM_STATS_CHANGE; } break; @@ -2593,10 +2903,10 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) gBattleTextBuff1[3] = EOS; gEffectBank = bank; - BATTLE_STRUCT->statChanger = 0x10 + STAT_STAGE_SPEED; - BATTLE_STRUCT->animArg1 = 0xE + STAT_STAGE_SPEED; - BATTLE_STRUCT->animArg2 = 0; - b_call_bc_move_exec(BattleScript_BerryStatRaiseEnd2); + gBattleStruct->statChanger = 0x10 + STAT_STAGE_SPEED; + gBattleStruct->animArg1 = 0xE + STAT_STAGE_SPEED; + gBattleStruct->animArg2 = 0; + BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); effect = ITEM_STATS_CHANGE; } break; @@ -2609,10 +2919,10 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) gBattleTextBuff1[3] = EOS; gEffectBank = bank; - BATTLE_STRUCT->statChanger = 0x10 + STAT_STAGE_SPATK; - BATTLE_STRUCT->animArg1 = 0xE + STAT_STAGE_SPATK; - BATTLE_STRUCT->animArg2 = 0; - b_call_bc_move_exec(BattleScript_BerryStatRaiseEnd2); + gBattleStruct->statChanger = 0x10 + STAT_STAGE_SPATK; + gBattleStruct->animArg1 = 0xE + STAT_STAGE_SPATK; + gBattleStruct->animArg2 = 0; + BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); effect = ITEM_STATS_CHANGE; } break; @@ -2625,10 +2935,10 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) gBattleTextBuff1[3] = EOS; gEffectBank = bank; - BATTLE_STRUCT->statChanger = 0x10 + STAT_STAGE_SPDEF; - BATTLE_STRUCT->animArg1 = 0xE + STAT_STAGE_SPDEF; - BATTLE_STRUCT->animArg2 = 0; - b_call_bc_move_exec(BattleScript_BerryStatRaiseEnd2); + gBattleStruct->statChanger = 0x10 + STAT_STAGE_SPDEF; + gBattleStruct->animArg1 = 0xE + STAT_STAGE_SPDEF; + gBattleStruct->animArg2 = 0; + BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); effect = ITEM_STATS_CHANGE; } break; @@ -2636,7 +2946,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / bankQuality && !moveTurn && !(gBattleMons[bank].status2 & STATUS2_FOCUS_ENERGY)) { gBattleMons[bank].status2 |= STATUS2_FOCUS_ENERGY; - b_call_bc_move_exec(BattleScript_BerryFocusEnergyEnd2); + BattleScriptExecute(BattleScript_BerryFocusEnergyEnd2); effect = ITEM_EFFECT_OTHER; } break; @@ -2670,10 +2980,10 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) gBattleTextBuff2[7] = EOS; gEffectBank = bank; - BATTLE_STRUCT->statChanger = 0x21 + i; - BATTLE_STRUCT->animArg1 = 0x21 + i + 6; - BATTLE_STRUCT->animArg2 = 0; - b_call_bc_move_exec(BattleScript_BerryStatRaiseEnd2); + gBattleStruct->statChanger = 0x21 + i; + gBattleStruct->animArg1 = 0x21 + i + 6; + gBattleStruct->animArg2 = 0; + BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); effect = ITEM_STATS_CHANGE; } } @@ -2682,7 +2992,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) if (gBattleMons[bank].status1 & STATUS_PARALYSIS) { gBattleMons[bank].status1 &= ~(STATUS_PARALYSIS); - b_call_bc_move_exec(BattleScript_BerryCurePrlzEnd2); + BattleScriptExecute(BattleScript_BerryCurePrlzEnd2); effect = ITEM_STATUS_CHANGE; } break; @@ -2690,7 +3000,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) if (gBattleMons[bank].status1 & STATUS_PSN_ANY) { gBattleMons[bank].status1 &= ~(STATUS_PSN_ANY | STATUS_TOXIC_COUNTER); - b_call_bc_move_exec(BattleScript_BerryCurePsnEnd2); + BattleScriptExecute(BattleScript_BerryCurePsnEnd2); effect = ITEM_STATUS_CHANGE; } break; @@ -2698,7 +3008,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) if (gBattleMons[bank].status1 & STATUS_BURN) { gBattleMons[bank].status1 &= ~(STATUS_BURN); - b_call_bc_move_exec(BattleScript_BerryCureBrnEnd2); + BattleScriptExecute(BattleScript_BerryCureBrnEnd2); effect = ITEM_STATUS_CHANGE; } break; @@ -2706,7 +3016,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) if (gBattleMons[bank].status1 & STATUS_FREEZE) { gBattleMons[bank].status1 &= ~(STATUS_FREEZE); - b_call_bc_move_exec(BattleScript_BerryCureFrzEnd2); + BattleScriptExecute(BattleScript_BerryCureFrzEnd2); effect = ITEM_STATUS_CHANGE; } break; @@ -2715,7 +3025,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) { gBattleMons[bank].status1 &= ~(STATUS_SLEEP); gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE); - b_call_bc_move_exec(BattleScript_BerryCureSlpEnd2); + BattleScriptExecute(BattleScript_BerryCureSlpEnd2); effect = ITEM_STATUS_CHANGE; } break; @@ -2723,7 +3033,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) if (gBattleMons[bank].status2 & STATUS2_CONFUSION) { gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION); - b_call_bc_move_exec(BattleScript_BerryCureConfusionEnd2); + BattleScriptExecute(BattleScript_BerryCureConfusionEnd2); effect = ITEM_EFFECT_OTHER; } break; @@ -2768,7 +3078,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) gBattleCommunication[MULTISTRING_CHOOSER] = 1; gBattleMons[bank].status1 = 0; gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION); - b_call_bc_move_exec(BattleScript_BerryCureChosenStatusEnd2); + BattleScriptExecute(BattleScript_BerryCureChosenStatusEnd2); effect = ITEM_STATUS_CHANGE; } break; @@ -2777,7 +3087,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) { gBattleMons[bank].status2 &= ~(STATUS2_INFATUATION); StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); - b_call_bc_move_exec(BattleScript_BerryCureChosenStatusEnd2); + BattleScriptExecute(BattleScript_BerryCureChosenStatusEnd2); gBattleCommunication[MULTISTRING_CHOOSER] = 0; effect = ITEM_EFFECT_OTHER; } @@ -2785,13 +3095,13 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) } if (effect) { - BATTLE_STRUCT->scriptingActive = bank; + gBattleStruct->scriptingActive = bank; gStringBank = bank; gActiveBank = gBankAttacker = bank; switch (effect) { case ITEM_STATUS_CHANGE: - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[bank].status1); + EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[bank].status1); MarkBufferBankForExecution(gActiveBank); break; case ITEM_PP_CHANGE: @@ -2824,7 +3134,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) if (gBattleMons[bank].status1 & STATUS_PARALYSIS) { gBattleMons[bank].status1 &= ~(STATUS_PARALYSIS); - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_BerryCureParRet; effect = ITEM_STATUS_CHANGE; } @@ -2833,7 +3143,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) if (gBattleMons[bank].status1 & STATUS_PSN_ANY) { gBattleMons[bank].status1 &= ~(STATUS_PSN_ANY | STATUS_TOXIC_COUNTER); - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_BerryCurePsnRet; effect = ITEM_STATUS_CHANGE; } @@ -2842,7 +3152,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) if (gBattleMons[bank].status1 & STATUS_BURN) { gBattleMons[bank].status1 &= ~(STATUS_BURN); - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_BerryCureBrnRet; effect = ITEM_STATUS_CHANGE; } @@ -2851,7 +3161,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) if (gBattleMons[bank].status1 & STATUS_FREEZE) { gBattleMons[bank].status1 &= ~(STATUS_FREEZE); - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_BerryCureFrzRet; effect = ITEM_STATUS_CHANGE; } @@ -2861,7 +3171,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) { gBattleMons[bank].status1 &= ~(STATUS_SLEEP); gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE); - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_BerryCureSlpRet; effect = ITEM_STATUS_CHANGE; } @@ -2870,7 +3180,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) if (gBattleMons[bank].status2 & STATUS2_CONFUSION) { gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION); - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_BerryCureConfusionRet; effect = ITEM_EFFECT_OTHER; } @@ -2880,7 +3190,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) { gBattleMons[bank].status2 &= ~(STATUS2_INFATUATION); StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattleCommunication[MULTISTRING_CHOOSER] = 0; gBattlescriptCurrInstr = BattleScript_BerryCureChosenStatusRet; effect = ITEM_EFFECT_OTHER; @@ -2916,7 +3226,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) } gBattleMons[bank].status1 = 0; gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION); - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattleCommunication[MULTISTRING_CHOOSER] = 0; gBattlescriptCurrInstr = BattleScript_BerryCureChosenStatusRet; effect = ITEM_STATUS_CHANGE; @@ -2933,9 +3243,9 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) } if (effect) { - BATTLE_STRUCT->scriptingActive = bank; + gBattleStruct->scriptingActive = bank; gStringBank = bank; - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_WhiteHerbRet; return effect; // unnecessary return } @@ -2943,10 +3253,10 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) } if (effect) { - BATTLE_STRUCT->scriptingActive = bank; + gBattleStruct->scriptingActive = bank; gStringBank = bank; gActiveBank = bank; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); + EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); MarkBufferBankForExecution(gActiveBank); break; } @@ -2965,9 +3275,9 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) && gBattleMons[gBankTarget].hp) { gBattleCommunication[MOVE_EFFECT_BYTE] = 8; - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); SetMoveEffect(0, 0); - b_movescr_stack_pop_cursor(); + BattleScriptPop(); } break; case HOLD_EFFECT_SHELL_BELL: @@ -2980,12 +3290,12 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) { gLastUsedItem = atkItem; gStringBank = gBankAttacker; - BATTLE_STRUCT->scriptingActive = gBankAttacker; + gBattleStruct->scriptingActive = gBankAttacker; gBattleMoveDamage = (gSpecialStatuses[gBankTarget].moveturnLostHP / atkQuality) * -1; if (gBattleMoveDamage == 0) gBattleMoveDamage = -1; gSpecialStatuses[gBankTarget].moveturnLostHP = 0; - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_ItemHealHP_Ret; effect++; } @@ -3028,14 +3338,14 @@ void unref_sub_801B40C(void) { if (sCombinedMoves[i].move1 == gChosenMovesByBanks[bank] && sCombinedMoves[i].move2 == gChosenMovesByBanks[bank + 2]) { - gSideTimer[GetBankIdentity(bank) & 1].field3 = (bank) | ((bank + 2) << 4); - gSideTimer[GetBankIdentity(bank) & 1].field4 = sCombinedMoves[i].newMove; + gSideTimers[GetBankIdentity(bank) & 1].field3 = (bank) | ((bank + 2) << 4); + gSideTimers[GetBankIdentity(bank) & 1].field4 = sCombinedMoves[i].newMove; gSideAffecting[GetBankIdentity(bank) & 1] |= SIDE_STATUS_X4; } if (sCombinedMoves[i].move1 == gChosenMovesByBanks[bank + 2] && sCombinedMoves[i].move2 == gChosenMovesByBanks[bank]) { - gSideTimer[GetBankIdentity(bank) & 1].field3 = (bank + 2) | ((bank) << 4); - gSideTimer[GetBankIdentity(bank) & 1].field4 = sCombinedMoves[i].newMove; + gSideTimers[GetBankIdentity(bank) & 1].field3 = (bank + 2) | ((bank) << 4); + gSideTimers[GetBankIdentity(bank) & 1].field4 = sCombinedMoves[i].newMove; gSideAffecting[GetBankIdentity(bank) & 1] |= SIDE_STATUS_X4; } bank++; @@ -3067,8 +3377,8 @@ u8 GetMoveTarget(u16 move, u8 useMoveTarget) //get move target { case 0: side = GetBankSide(gBankAttacker) ^ 1; - if (gSideTimer[side].followmeTimer && gBattleMons[gSideTimer[side].followmeTarget].hp) - targetBank = gSideTimer[side].followmeTarget; + if (gSideTimers[side].followmeTimer && gBattleMons[gSideTimers[side].followmeTarget].hp) + targetBank = gSideTimers[side].followmeTarget; else { side = GetBankSide(gBankAttacker); @@ -3090,35 +3400,35 @@ u8 GetMoveTarget(u16 move, u8 useMoveTarget) //get move target case 8: case 32: case 64: - targetBank = GetBankByPlayerAI((GetBankIdentity(gBankAttacker) & 1) ^ 1); + targetBank = GetBankByIdentity((GetBankIdentity(gBankAttacker) & 1) ^ 1); if (gAbsentBankFlags & gBitTable[targetBank]) targetBank ^= 2; break; case 4: side = GetBankSide(gBankAttacker) ^ 1; - if (gSideTimer[side].followmeTimer && gBattleMons[gSideTimer[side].followmeTarget].hp) - targetBank = gSideTimer[side].followmeTarget; + if (gSideTimers[side].followmeTimer && gBattleMons[gSideTimers[side].followmeTarget].hp) + targetBank = gSideTimers[side].followmeTarget; else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && moveTarget & 4) { if (GetBankSide(gBankAttacker) == 0) { if (Random() & 1) - targetBank = GetBankByPlayerAI(1); + targetBank = GetBankByIdentity(1); else - targetBank = GetBankByPlayerAI(3); + targetBank = GetBankByIdentity(3); } else { if (Random() & 1) - targetBank = GetBankByPlayerAI(0); + targetBank = GetBankByIdentity(0); else - targetBank = GetBankByPlayerAI(2); + targetBank = GetBankByIdentity(2); } if (gAbsentBankFlags & gBitTable[targetBank]) targetBank ^= 2; } else - targetBank = GetBankByPlayerAI((GetBankIdentity(gBankAttacker) & 1) ^ 1); + targetBank = GetBankByIdentity((GetBankIdentity(gBankAttacker) & 1) ^ 1); break; case 2: case 16: @@ -3129,7 +3439,7 @@ u8 GetMoveTarget(u16 move, u8 useMoveTarget) //get move target return targetBank; } -u8 IsPokeDisobedient(void) +u8 IsMonDisobedient(void) { u8 obedienceLevel; s32 rnd; @@ -3137,17 +3447,25 @@ u8 IsPokeDisobedient(void) if (gBattleTypeFlags & BATTLE_TYPE_LINK || GetBankSide(gBankAttacker) == 1 - || !IsOtherTrainer(gBattleMons[gBankAttacker].otId, gBattleMons[gBankAttacker].otName) - || FlagGet(FLAG_BADGE08_GET)) - return 0; + || !IsOtherTrainer(gBattleMons[gBankAttacker].otId, gBattleMons[gBankAttacker].otName)) + return 0; - obedienceLevel = 10; - if (FlagGet(FLAG_BADGE02_GET)) - obedienceLevel = 30; - if (FlagGet(FLAG_BADGE04_GET)) - obedienceLevel = 50; - if (FlagGet(FLAG_BADGE06_GET)) - obedienceLevel = 70; + if (DEBUG && (gUnknown_02023A14_50 & 0x40)) + { + obedienceLevel = 10; + } + else + { + if (FlagGet(FLAG_BADGE08_GET)) + return 0; + obedienceLevel = 10; + if (FlagGet(FLAG_BADGE02_GET)) + obedienceLevel = 30; + if (FlagGet(FLAG_BADGE04_GET)) + obedienceLevel = 50; + if (FlagGet(FLAG_BADGE06_GET)) + obedienceLevel = 70; + } if (gBattleMons[gBankAttacker].level <= obedienceLevel) return 0; @@ -3185,7 +3503,7 @@ u8 IsPokeDisobedient(void) gRandomMove = gBattleMons[gBankAttacker].moves[gCurrMovePos]; gBattleCommunication[3] = 0; gDynamicBasePower = 0; - BATTLE_STRUCT->dynamicMoveType = 0; + gBattleStruct->dynamicMoveType = 0; gBattlescriptCurrInstr = BattleScript_IgnoresAndUsesRandomMove; gBankTarget = GetMoveTarget(gRandomMove, 0); gHitMarker |= HITMARKER_x200000; diff --git a/src/battle/calculate_base_damage.c b/src/battle/calculate_base_damage.c index 5c91b3657..217ab28a3 100644 --- a/src/battle/calculate_base_damage.c +++ b/src/battle/calculate_base_damage.c @@ -1,16 +1,16 @@ #include "global.h" #include "constants/abilities.h" +#include "constants/battle_move_effects.h" +#include "constants/hold_effects.h" +#include "constants/items.h" +#include "constants/moves.h" +#include "constants/species.h" #include "battle.h" #include "berry.h" #include "data2.h" #include "event_data.h" -#include "constants/hold_effects.h" #include "item.h" -#include "constants/items.h" #include "pokemon.h" -#include "constants/species.h" -#include "constants/moves.h" -#include "constants/battle_move_effects.h" #include "ewram.h" extern u16 gBattleTypeFlags; @@ -22,8 +22,54 @@ extern struct BattleEnigmaBerry gEnigmaBerries[]; extern u16 gBattleMovePower; extern u16 gTrainerBattleOpponent; -extern const u8 gHoldEffectToType[][2]; -extern const u8 gStatStageRatios[][2]; +// Masks for getting PP Up count, also PP Max values +const u8 gUnknown_08208238[] = {0x03, 0x0c, 0x30, 0xc0}; + +// Masks for setting PP Up count +const u8 gUnknown_0820823C[] = {0xFC, 0xF3, 0xCF, 0x3F}; + +// Values added to PP Up count +const u8 gUnknown_08208240[] = {0x01, 0x04, 0x10, 0x40}; + +const u8 gStatStageRatios[][2] = +{ + {10, 40}, // -6 + {10, 35}, // -5 + {10, 30}, // -4 + {10, 25}, // -3 + {10, 20}, // -2 + {10, 15}, // -1 + {10, 10}, // 0 + {15, 10}, // 1 + {20, 10}, // 2 + {25, 10}, // 3 + {30, 10}, // 4 + {35, 10}, // 5 + {40, 10} // 6 +}; + +const u8 unknownGameFreakAbbrev_820825E[] = _("ゲーフリ"); + +const u8 gHoldEffectToType[][2] = +{ + {HOLD_EFFECT_BUG_POWER, TYPE_BUG}, + {HOLD_EFFECT_STEEL_POWER, TYPE_STEEL}, + {HOLD_EFFECT_GROUND_POWER, TYPE_GROUND}, + {HOLD_EFFECT_ROCK_POWER, TYPE_ROCK}, + {HOLD_EFFECT_GRASS_POWER, TYPE_GRASS}, + {HOLD_EFFECT_DARK_POWER, TYPE_DARK}, + {HOLD_EFFECT_FIGHTING_POWER, TYPE_FIGHTING}, + {HOLD_EFFECT_ELECTRIC_POWER, TYPE_ELECTRIC}, + {HOLD_EFFECT_WATER_POWER, TYPE_WATER}, + {HOLD_EFFECT_FLYING_POWER, TYPE_FLYING}, + {HOLD_EFFECT_POISON_POWER, TYPE_POISON}, + {HOLD_EFFECT_ICE_POWER, TYPE_ICE}, + {HOLD_EFFECT_GHOST_POWER, TYPE_GHOST}, + {HOLD_EFFECT_PSYCHIC_POWER, TYPE_PSYCHIC}, + {HOLD_EFFECT_FIRE_POWER, TYPE_FIRE}, + {HOLD_EFFECT_DRAGON_POWER, TYPE_DRAGON}, + {HOLD_EFFECT_NORMAL_POWER, TYPE_NORMAL} +}; u8 GetBankSide(u8 bank); diff --git a/src/battle/contest_link_80C857C.c b/src/battle/contest_link_80C857C.c index 0ae98af09..4fb236294 100644 --- a/src/battle/contest_link_80C857C.c +++ b/src/battle/contest_link_80C857C.c @@ -1,54 +1,754 @@ #include "global.h" +#include "ewram.h" +#include "random.h" +#include "task.h" +#include "contest.h" +#include "text.h" +#include "string_util.h" #include "link.h" +static void sub_80C8644(u8 taskId); +static void sub_80C8660(u8 taskId); #if GERMAN +static void de_sub_80C9274(bool32 arg0); +static void de_sub_80C9294(bool32 arg0); +#endif + +static void SendBlockToAllOpponents(const void *data, u16 size) +{ + memcpy(eContestLinkSendBuffer, data, size); + SendBlock(bitmask_all_link_players_but_self(), eContestLinkSendBuffer, size); +} + +static bool8 HasPlayerReceivedBlock(u8 who) +{ + u8 flag = 1 << who; + if (!(GetBlockReceivedStatus() & flag)) + return FALSE; + ResetBlockReceivedFlag(flag); + return TRUE; +} + +static bool8 HaveAllPlayersReceivedBlock(void) +{ + int i; + + for (i = 0; i < MAX_LINK_PLAYERS; i++) + { + if (!((GetBlockReceivedStatus() >> i) & 1)) + return FALSE; + } + ResetBlockReceivedFlags(); + return TRUE; +} + +void sub_80C8604(u8 taskId) +{ +#if ENGLISH + u8 i; + + for (i = 0; i < 4; i++) + gBlockRecvBuffer[i][0] = 0xff; +#endif + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = sub_80C8644; +} + +static void sub_80C8644(u8 taskId) +{ + gTasks[taskId].func = sub_80C8660; +} + +static void sub_80C8660(u8 taskId) +{ + if (gReceivedRemoteLinkPlayers) + { + gContestPlayerMonIndex = GetMultiplayerId(); + if (GetLinkPlayerCount() == MAX_LINK_PLAYERS) + { + gIsLinkContest = TRUE; + SwitchTaskToFollowupFunc(taskId); + } + } +} + +#ifdef NONMATCHING +u8 sub_80C86A0(const u8 *string) +{ + u8 language = GAME_LANGUAGE; + if (string[0] == EXT_CTRL_CODE_BEGIN && string[1] == 0x15) + return language; + if (StringLength(string) > 5) + return language; + for (; *string != EOS; string++) + { + if (!((*string >= CHAR_A && *string <= CHAR_z) || + (*string >= CHAR_0 + 0 && *string <= CHAR_0 + 9) || + *string == CHAR_SPACE || + *string == CHAR_PERIOD || + *string == CHAR_COMMA || + *string == 0xAB || + *string == CHAR_QUESTION_MARK || + *string == CHAR_MALE || + *string == CHAR_FEMALE || + *string == CHAR_SLASH || + *string == CHAR_HYPHEN || + *string == CHAR_ELLIPSIS || + *string == 0xB1 || + *string == 0xB2 || + *string == 0xB3 || + *string == 0xB1 + )) + { + language = LANGUAGE_JAPANESE; + break; + } + } + return language; +} +#else +__attribute__((naked)) u8 sub_80C86A0(const u8 *string) +{ + asm_unified("\tpush {r4,r5,lr}\n" + "\tadds r4, r0, 0\n" + ".ifdef ENGLISH\n" + "\tmovs r5, 0x2\n" + ".else\n" + "\tmovs r5, 0x5\n" + ".endif\n" + "\tldrb r0, [r4]\n" + "\tcmp r0, 0xFC\n" + "\tbne _080C86B6\n" + "\tldrb r0, [r4, 0x1]\n" + "\tcmp r0, 0x15\n" + "\tbne _080C86B6\n" + ".ifdef ENGLISH\n" + "\tmovs r0, 0x2\n" + ".else\n" + "\tmovs r0, 0x5\n" + ".endif\n" + "\tb _080C872C\n" + "_080C86B6:\n" + "\tadds r0, r4, 0\n" + "\tbl StringLength\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tcmp r0, 0x5\n" + "\tbhi _080C872A\n" + "\tldrb r0, [r4]\n" + "\tcmp r0, 0xFF\n" + "\tbeq _080C872A\n" + "_080C86CA:\n" + "\tldrb r1, [r4]\n" + "\tadds r0, r1, 0\n" + "\tadds r0, 0x45\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tcmp r0, 0x33\n" + "\tbls _080C871E\n" + "\tadds r0, r1, 0\n" + "\tadds r0, 0x5F\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tcmp r0, 0x9\n" + "\tbls _080C871E\n" + "\tadds r0, r1, 0\n" + "\tcmp r0, 0\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xAD\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xB8\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xAB\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xAC\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xB5\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xB6\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xBA\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xAE\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xB0\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xB1\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xB2\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xB3\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xB1\n" + "\tbne _080C8728\n" + "_080C871E:\n" + "\tadds r4, 0x1\n" + "\tldrb r0, [r4]\n" + "\tcmp r0, 0xFF\n" + "\tbne _080C86CA\n" + "\tb _080C872A\n" + "_080C8728:\n" + "\tmovs r5, 0x1\n" + "_080C872A:\n" + "\tadds r0, r5, 0\n" + "_080C872C:\n" + "\tpop {r4,r5}\n" + "\tpop {r1}\n" + "\tbx r1"); +} +#endif + +void sub_80C8734(u8 taskId) +{ + int i; + u8 *name; + + switch (gTasks[taskId].data[0]) { +#if ENGLISH + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; +#elif GERMAN + case 8: +#endif + case 0: + if (GetMultiplayerId() == 0) { + if (IsLinkTaskFinished()) { +#if ENGLISH + memcpy(gBlockSendBuffer, gContestMons + gContestPlayerMonIndex, sizeof(struct ContestPokemon)); + sub_8007E9C(2); + gTasks[taskId].data[0]++; +#elif GERMAN + if (gTasks[taskId].data[0] == 0) + { + gTasks[taskId].data[0] = 3; + } + else + { + memcpy(gBlockSendBuffer, gContestMons + gContestPlayerMonIndex, sizeof(struct ContestPokemon)); + de_sub_80C9274(FALSE); + sub_8007E9C(2); + gTasks[taskId].data[0] = 1; + } +#endif + } + } + else + { + memcpy(gBlockSendBuffer, gContestMons + gContestPlayerMonIndex, sizeof(struct ContestPokemon)); +#if GERMAN + de_sub_80C9294(FALSE); +#endif + gTasks[taskId].data[0]++; + } + break; + case 1: + if (HaveAllPlayersReceivedBlock()) + { + for (i = 0; i < MAX_LINK_PLAYERS; i++) + { + memcpy(gContestMons + i, gBlockRecvBuffer[i], sizeof(struct ContestPokemon)); + name = gContestMons[i].nickname; + if (gLinkPlayers[i].language == LANGUAGE_JAPANESE) + { + ConvertInternationalString(name, sub_80C86A0(name)); + } + else if (name[10] == EXT_CTRL_CODE_BEGIN) + { + ConvertInternationalString(name, LANGUAGE_JAPANESE); + } else + { + name[5] = name[10]; + name[10] = EOS; + } + name = gContestMons[i].trainerName; + if (gLinkPlayers[i].language == LANGUAGE_JAPANESE) + { + name[7] = EOS; + name[6] = name[4]; + name[5] = name[3]; + name[4] = name[2]; + name[3] = name[1]; + name[2] = name[0]; + name[1] = 0x15; + name[0] = EXT_CTRL_CODE_BEGIN; + } + else + { + name[5] = name[7]; + name[7] = EOS; + } + } + gTasks[taskId].data[0]++; + } + break; +#if GERMAN + case 2: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + default: + gTasks[taskId].data[0]++; + break; +#endif + } +} + +void sub_80C88AC(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + case 0: + if (GetMultiplayerId() == 0) + { + if (IsLinkTaskFinished()) + { + SendBlockToAllOpponents(&gRngValue, sizeof(u32)); + gTasks[taskId].data[0]++; + } + } + else + { + gTasks[taskId].data[0]++; + } + break; + case 1: + if (HasPlayerReceivedBlock(0)) + { + memcpy(&gRngValue, gBlockRecvBuffer[0], sizeof(u32)); + memcpy(&gContestRngValue, gBlockRecvBuffer[0], sizeof(u32)); + gTasks[taskId].data[0]++; + } + break; + } +} + +void sub_80C8938(u8 taskId) +{ + int i; + + switch (gTasks[taskId].data[0]) + { +#if ENGLISH + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; +#elif GERMAN + case 8: +#endif + case 0: + gBlockSendBuffer[0] = gTasks[taskId].data[9]; + if (GetMultiplayerId() == 0) + { + if (IsLinkTaskFinished()) + { +#if ENGLISH + sub_8007E9C(2); + gTasks[taskId].data[0]++; +#elif GERMAN + if (gTasks[taskId].data[0] == 0) + { + gTasks[taskId].data[0] = 3; + } + else + { + de_sub_80C9274(TRUE); + sub_8007E9C(2); + gTasks[taskId].data[0] = 1; + } +#endif + } + } + else + { +#if GERMAN + de_sub_80C9294(TRUE); +#endif + gTasks[taskId].data[0]++; + } + break; + case 1: + if (HaveAllPlayersReceivedBlock()) + { + for (i = 0; i < MAX_LINK_PLAYERS; i++) + { + gTasks[taskId].data[i + 1] = gBlockRecvBuffer[i][0]; + } + gTasks[taskId].data[0]++; + } + break; +#if GERMAN + case 2: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + default: + gTasks[taskId].data[0]++; + break; +#endif + } +} + +void sub_80C89DC(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + case 0: + if (IsLinkTaskFinished()) + { + SendBlockToAllOpponents(&gContestPlayerMonIndex, sizeof(u8)); + gTasks[taskId].data[0]++; + } + break; + case 1: + if (HaveAllPlayersReceivedBlock()) + { + gTasks[taskId].data[0]++; + } + break; + } +} + +void sub_80C8A38(u8 taskId) +{ + int i; + + switch (gTasks[taskId].data[0]) + { + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + case 0: + if (IsLinkTaskFinished()) + { + SendBlockToAllOpponents(&sContestantStatus[gContestPlayerMonIndex].currMove, sizeof(u16)); + gTasks[taskId].data[0]++; + } + break; + case 1: + if (HaveAllPlayersReceivedBlock()) + { + for (i = 0; i < MAX_LINK_PLAYERS; i++) + { + *&sContestantStatus[i].currMove = gBlockRecvBuffer[i][0]; + } + gTasks[taskId].data[0]++; + } + break; + } +} + +void sub_80C8AD0(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 0: + if (IsLinkTaskFinished()) + { + SendBlockToAllOpponents(gUnknown_02038678, sizeof gUnknown_02038678); + gTasks[taskId].data[0]++; + } + break; + case 1: + if (HaveAllPlayersReceivedBlock()) + { + memcpy(gUnknown_02038678, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038678); + gTasks[taskId].data[0]++; + } + break; + case 2: + case 5: + case 8: + case 11: + if (gTasks[taskId].data[1]++ > 10) + { + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[0]++; + } + break; + case 3: + if (IsLinkTaskFinished()) + { + SendBlockToAllOpponents(gUnknown_02038680, sizeof gUnknown_02038680); + gTasks[taskId].data[0]++; + } + break; + case 4: + if (HaveAllPlayersReceivedBlock()) + { + memcpy(gUnknown_02038680, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038680); + gTasks[taskId].data[0]++; + } + break; + case 6: + if (IsLinkTaskFinished()) + { + SendBlockToAllOpponents(gUnknown_02038688, sizeof gUnknown_02038688); + gTasks[taskId].data[0]++; + } + break; + case 7: + if (HaveAllPlayersReceivedBlock()) + { + memcpy(gUnknown_02038688, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038688); + gTasks[taskId].data[0]++; + } + break; + case 9: + if (IsLinkTaskFinished()) + { + SendBlockToAllOpponents(gContestFinalStandings, sizeof gContestFinalStandings); + gTasks[taskId].data[0]++; + } + break; + case 10: + if (HaveAllPlayersReceivedBlock()) + { + memcpy(gContestFinalStandings, gBlockRecvBuffer[gUnknown_0203869B], sizeof gContestFinalStandings); + gTasks[taskId].data[0]++; + } + break; + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + } +} -void de_sub_80C9274(bool32 arg0) { - if (deUnkValue2 != 1) +void sub_80C8C80(u8 taskId) +{ + switch (gTasks[taskId].data[0]) { - return; + case 0: + if (IsLinkTaskFinished()) + { + SendBlockToAllOpponents(sContestantStatus, 4 * sizeof(struct ContestantStatus)); + gTasks[taskId].data[0]++; + } + break; + case 1: + if (HaveAllPlayersReceivedBlock()) + { + memcpy(sContestantStatus, gBlockRecvBuffer[gUnknown_0203869B], 4 * sizeof(struct ContestantStatus)); + gTasks[taskId].data[0]++; + } + break; + case 2: + case 5: + case 8: + case 11: + if (gTasks[taskId].data[1]++ > 10) + { + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[0]++; + } + break; + case 3: + if (IsLinkTaskFinished()) + { + SendBlockToAllOpponents(&shared192D0, sizeof shared192D0); + gTasks[taskId].data[0]++; + } + break; + case 4: + if (HaveAllPlayersReceivedBlock()) + { + memcpy(&shared192D0, gBlockRecvBuffer[gUnknown_0203869B], sizeof shared192D0); + gTasks[taskId].data[0]++; + } + break; + case 6: + if (IsLinkTaskFinished()) + { + SendBlockToAllOpponents(&shared19328, sizeof shared19328); + gTasks[taskId].data[0]++; + } + break; + case 7: + if (HaveAllPlayersReceivedBlock()) + { + memcpy(&shared19328, gBlockRecvBuffer[gUnknown_0203869B], sizeof shared19328); + gTasks[taskId].data[0]++; + } + break; + case 9: + if (IsLinkTaskFinished()) + { + SendBlockToAllOpponents(gUnknown_02038696, sizeof gUnknown_02038696); + gTasks[taskId].data[0]++; + } + break; + case 10: + if (HaveAllPlayersReceivedBlock()) + { + memcpy(gUnknown_02038696, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038696); + gTasks[taskId].data[0]++; + } + break; + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + } +} + +void sub_80C8E1C(u8 taskId) +{ + int i; + + switch (gTasks[taskId].data[0]) + { +#if ENGLISH + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; +#elif GERMAN + case 8: +#endif + case 0: + gBlockSendBuffer[0] = 0x64; + if (GetMultiplayerId() == 0) + { + if (IsLinkTaskFinished()) + { +#if ENGLISH + sub_8007E9C(2); + gTasks[taskId].data[0]++; +#elif GERMAN + if (gTasks[taskId].data[0] == 0) + { + gTasks[taskId].data[0] = 3; + } + else + { + de_sub_80C9274(FALSE); + sub_8007E9C(2); + gTasks[taskId].data[0] = 1; + } +#endif + } + } + else + { +#if GERMAN + de_sub_80C9294(FALSE); +#endif + gTasks[taskId].data[0]++; + } + break; + case 1: + if (HaveAllPlayersReceivedBlock()) + { + for (i = 0; i < MAX_LINK_PLAYERS; i++) + { + gTasks[taskId].data[5 + i] = gBlockRecvBuffer[i][0]; + } + gTasks[taskId].data[0]++; + } + break; +#if GERMAN + case 2: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + default: + gTasks[taskId].data[0]++; + break; +#endif } +} - if (arg0) +void sub_80C8EBC(u8 taskId) +{ + switch (gTasks[taskId].data[0]) { - deUnkValue2 = 3; + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + case 0: + if (IsLinkTaskFinished()) + { + SendBlockToAllOpponents(gUnknown_02038670, sizeof gUnknown_02038670); + gTasks[taskId].data[0]++; + } + break; + case 1: + if (HaveAllPlayersReceivedBlock()) + { + memcpy(gUnknown_02038670, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038670); + gTasks[taskId].data[0]++; + } + break; } - else +} + +void sub_80C8F34(u8 taskId) +{ + switch (gTasks[taskId].data[0]) { - deUnkValue2 = 2; + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + case 0: + if (IsLinkTaskFinished()) + { + SendBlockToAllOpponents(gUnknown_02038696, sizeof gUnknown_02038696); + gTasks[taskId].data[0]++; + } + break; + case 1: + if (HaveAllPlayersReceivedBlock()) + { + memcpy(gUnknown_02038696, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038696); + gTasks[taskId].data[0]++; + } + break; } } -void de_sub_80C9294(bool32 arg0) { +#if GERMAN + +static void de_sub_80C9274(bool32 arg0) +{ if (deUnkValue2 == 1) { if (arg0) - { deUnkValue2 = 3; - } else - { deUnkValue2 = 2; - } - - return; } +} - - if (deUnkValue2 == 2) +static void de_sub_80C9294(bool32 arg0) +{ + if (deUnkValue2 == 1) + { + if (arg0) + deUnkValue2 = 3; + else + deUnkValue2 = 2; + } + else if (deUnkValue2 == 2) { SendBlock(0, sBlockRequestLookupTable[deUnkValue1].address, sBlockRequestLookupTable[deUnkValue1].size); - if (arg0) - { deUnkValue2 = 0; - } else - { deUnkValue2 = 1; - } - - return; } } diff --git a/src/battle/pokeball.c b/src/battle/pokeball.c index bcaaebcda..6f27469ce 100644 --- a/src/battle/pokeball.c +++ b/src/battle/pokeball.c @@ -383,7 +383,7 @@ static void sub_8046464(u8 taskId) gSprites[spriteId].callback = sub_8047254; break; default: - gBankTarget = GetBankByPlayerAI(1); + gBankTarget = GetBankByIdentity(1); sp0 = TRUE; break; } @@ -722,7 +722,7 @@ static void sub_8046C78(struct Sprite *sprite) r8 = -25; } species = GetMonData(pkmn, MON_DATA_SPECIES); - if ((r5 == GetBankByPlayerAI(0) || r5 == GetBankByPlayerAI(1)) + if ((r5 == GetBankByIdentity(0) || r5 == GetBankByIdentity(1)) && IsDoubleBattle() && ewram17840.unk9_0) { if (gBattleTypeFlags & BATTLE_TYPE_MULTI) @@ -737,7 +737,7 @@ static void sub_8046C78(struct Sprite *sprite) } if (!IsDoubleBattle() || !ewram17840.unk9_0) r4_2 = 0; - else if (r5 == GetBankByPlayerAI(0) || r5 == GetBankByPlayerAI(1)) + else if (r5 == GetBankByIdentity(0) || r5 == GetBankByIdentity(1)) r4_2 = 1; else r4_2 = 2; @@ -885,7 +885,7 @@ static void sub_80470C4(struct Sprite *sprite) sprite->data[6] = sprite->oam.affineParam & 0xFF; sprite->data[0] = 0; if (IsDoubleBattle() && ewram17840.unk9_0 - && sprite->data[6] == GetBankByPlayerAI(2)) + && sprite->data[6] == GetBankByIdentity(2)) sprite->callback = sub_8047230; else sprite->callback = sub_8046C78; @@ -910,7 +910,7 @@ static void sub_8047254(struct Sprite *sprite) { sprite->data[0] = 0; if (IsDoubleBattle() && ewram17840.unk9_0 - && sprite->data[6] == GetBankByPlayerAI(3)) + && sprite->data[6] == GetBankByIdentity(3)) sprite->callback = sub_8047230; else sprite->callback = sub_8046C78; diff --git a/src/battle/post_battle_event_funcs.c b/src/battle/post_battle_event_funcs.c index 0617763f6..a44cf028b 100644 --- a/src/battle/post_battle_event_funcs.c +++ b/src/battle/post_battle_event_funcs.c @@ -26,8 +26,8 @@ int GameClear(void) FlagSet(FLAG_SYS_GAME_CLEAR); } - if (!GetGameStat(1)) - SetGameStat(1, (gSaveBlock2.playTimeHours << 16) | (gSaveBlock2.playTimeMinutes << 8) | gSaveBlock2.playTimeSeconds); + if (!GetGameStat(GAME_STAT_FIRST_HOF_PLAY_TIME)) + SetGameStat(GAME_STAT_FIRST_HOF_PLAY_TIME, (gSaveBlock2.playTimeHours << 16) | (gSaveBlock2.playTimeMinutes << 8) | gSaveBlock2.playTimeSeconds); SetSecretBase2Field_9(); @@ -54,7 +54,7 @@ int GameClear(void) if (ribbonGet == TRUE) { - IncrementGameStat(42); + IncrementGameStat(GAME_STAT_RECEIVED_RIBBONS); FlagSet(FLAG_SYS_RIBBON_GET); } diff --git a/src/battle/reshow_battle_screen.c b/src/battle/reshow_battle_screen.c index 49b0854cc..a78cb20df 100644 --- a/src/battle/reshow_battle_screen.c +++ b/src/battle/reshow_battle_screen.c @@ -3,7 +3,7 @@ #include "battle_anim.h" #include "palette.h" #include "main.h" -#include "unknown_task.h" +#include "scanline_effect.h" #include "text.h" #include "rom_8077ABC.h" #include "data2.h" @@ -13,12 +13,12 @@ extern struct SpriteTemplate gUnknown_02024E8C; extern struct Window gUnknown_03004210; extern u16 gBattle_BG2_Y; extern u16 gBattle_BG2_X; -extern u16 gUnknown_030042A4; +extern u16 gBattle_BG0_X; extern u16 gBattle_BG1_X; -extern u16 gUnknown_030041B0; +extern u16 gBattle_BG3_X; extern u16 gBattle_BG1_Y; -extern u16 gUnknown_030041B8; -extern u16 gUnknown_030042A0; +extern u16 gBattle_BG3_Y; +extern u16 gBattle_BG0_Y; extern u8 gReservedSpritePaletteCount; extern u8 gActionSelectionCursor[4]; extern u8 gBankInMenu; @@ -77,18 +77,18 @@ static void CB2_ReshowBattleScreenAfterMenu(void) switch (gReshowState) { case 0: - dp12_8087EA4(); - SetUpWindowConfig(&gWindowConfig_81E6C58); + ScanlineEffect_Clear(); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C58); ResetPaletteFade(); - InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6C58); - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; + Text_InitWindowWithTemplate(&gUnknown_03004210, &gWindowTemplate_81E6C58); + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; gBattle_BG1_X = 0; gBattle_BG1_Y = 0; gBattle_BG2_X = 0; gBattle_BG2_Y = 0; - gUnknown_030041B0 = 0; - gUnknown_030041B8 = 0; + gBattle_BG3_X = 0; + gBattle_BG3_Y = 0; break; case 1: { @@ -171,13 +171,13 @@ static void CB2_ReshowBattleScreenAfterMenu(void) sub_80327CC(); - opponentBank = GetBankByPlayerAI(1); + opponentBank = GetBankByIdentity(1); species = GetMonData(&gEnemyParty[gBattlePartyID[opponentBank]], MON_DATA_SPECIES); sub_8032984(opponentBank, species); if (IsDoubleBattle()) { - opponentBank = GetBankByPlayerAI(3); + opponentBank = GetBankByIdentity(3); species = GetMonData(&gEnemyParty[gBattlePartyID[opponentBank]], MON_DATA_SPECIES); sub_8032984(opponentBank, species); } @@ -190,7 +190,7 @@ static void CB2_ReshowBattleScreenAfterMenu(void) sub_807B06C(); BeginHardwarePaletteFade(0xFF, 0, 0x10, 0, 1); gPaletteFade.bufferTransferDisabled = 0; - SetMainCallback2(sub_800F808); + SetMainCallback2(BattleMainCB2); break; } gReshowState++; diff --git a/src/contest.c b/src/contest.c index f5aab709d..e2695627e 100644 --- a/src/contest.c +++ b/src/contest.c @@ -29,184 +29,18 @@ #include "task.h" #include "text.h" #include "tv.h" -#include "unknown_task.h" +#include "scanline_effect.h" #include "util.h" +#include "contest_ai.h" + +extern u8 gUnknown_020297ED; extern u8 AreMovesContestCombo(u16, u16); // I don't think this is a bool extern void sub_80C8A38(u8); extern void sub_80C8AD0(u8); extern void sub_80C8C80(u8); -extern void sub_81288F4(); -extern u8 sub_8128944(void); - -struct Shared18000 -{ - /*0x18000*/ u8 unk18000; - /*0x18001*/ u8 filler18001[3]; - /*0x18004*/ u16 unk18004[16][16]; - /*0x18204*/ u16 unk18204[0x200]; - /*0x18604*/ u16 unk18604[0x200]; - /*0x18A04*/ u8 unk18A04[0x800]; -}; - -struct Contest -{ - /*0x19204*/ u8 playerMoveChoice; - /*0x19205*/ u8 turnNumber; - /*0x19206*/ u8 unk19206[4]; // seems to only be used by an unref function - /*0x1920A*/ u16 unk1920A_0:1; // Task active flags? - u16 unk1920A_1:1; - u16 unk1920A_2:1; - u16 unk1920A_3:1; - u16 unk1920A_4:1; - u16 unk1920A_5:1; - u16 unk1920A_6:1; - u16 unk1920A_7:1; - /*0x1920B*/ u16 unk1920B_0:1; - u16 unk1920B_1:1; - u16 unk1920B_2:1; - /*0x1920C*/ u8 mainTaskId; - /*0x1920D*/ u8 unk1920D[4]; - /*0x19211*/ u8 unk19211; - /*0x19212*/ u8 unk19212; - /*0x19213*/ u8 filler19213; - /*0x19214*/ u8 unk19214; - /*0x19215*/ u8 unk19215; - /*0x19216*/ u8 unk19216; // sprite ID - /*0x19217*/ s8 applauseLevel; - /*0x19218*/ u8 unk19218[4]; - /*0x1921C*/ u32 unk1921C; // saved RNG value? - u16 unk19220[5][4]; // move history? - u8 unk19248[5][4]; // excitement history - u8 applauseMeterSpriteId; // sprite ID - /*0x1925D*/ u8 unk1925D; - /*0x1925E*/ u8 unk1925E; -}; - -struct ContestantStatus -{ - s16 appeal1; // move appeal? - s16 appeal2; // final appeal after end of turn, maybe? - s16 unk4; - u16 currMove; - u16 prevMove; - u8 moveCategory; - u8 unkB_0:2; - u8 unkB_2:2; - u8 moveRepeatCount:3; - u8 unkB_7:1; // used a one-time move? - u8 unkC_0:1; - u8 unkC_1:2; - s8 unkD; - u8 unkE; - u8 unkF; - u8 unk10_0:1; - u8 unk10_1:1; - u8 unk10_2:1; - u8 unk10_3:1; - u8 unk10_4:2; - u8 unk10_6:2; - u8 unk11_0:2; - u8 unk11_2:1; - u8 unk11_3:1; - u8 unk11_4:1; - u8 unk11_5:1; - u8 unk12; - u8 unk13; // status action? - u8 unk14; - u8 disappointedRepeat:1; - u8 unk15_1:1; - u8 unk15_2:1; - u8 unk15_3:1; - u8 unk15_4:1; - u8 unk15_5:1; - u8 unk15_6:1; - u8 unk16; - u8 unk17; - u8 unk18; - u8 unk19; // turn position - u8 attentionLevel; // How much the Pokemon "stood out" - u8 unk1B; -}; - -struct UnknownContestStruct3 -{ - u8 unk0; - u8 unk1; - //u8 unk2_0:1; - //u8 unk2_1:1; - u8 unk2; // maybe a bitfield - u8 filler3; -}; - -// possibly the same as UnknownContestStruct3? -struct UnknownContestStruct4 -{ - u8 unk0; // sprite ID - u8 unk1; // sprite ID - u8 unk2_0:1; - u8 unk2_1:1; - u8 unk2_2:1; - u8 filler3; -}; - -struct UnknownContestStruct5 -{ - s8 bits_0; // current move excitement? - u8 bits_8:1; - u8 bits_9:3; - u8 bits_C:4; - s8 unk2; - u8 filler3; -}; - -struct UnknownContestStruct7 -{ - u8 unk0[4]; - u16 unk4; - u16 unk6; - u8 filler8[0xD-8]; - u8 unkD[4]; - u8 unk11; - u8 filler12[2]; -}; - -struct UnknownContestStruct8 -{ - u16 unk0; - u16 unk2; - u8 unk4_0:1; - u8 unk5; - u8 filler6[2]; - u32 unk8; - u32 unkC; - u32 unk10; -}; - -struct UnknownContestStruct6 -{ - s32 unk0; - s32 unk4; - s32 unk8; - s32 unkC; -}; - -#define shared15800 (gSharedMem + 0x15800) -#define shared15DE0 (*(struct ContestWinner *)(gSharedMem + 0x15DE0)) -#define shared16800 (gSharedMem + 0x16800) -#define shared18000 (*(struct Shared18000 *)(gSharedMem + 0x18000)) -#define shared18004 ((u16 *)(gSharedMem + 0x18004)) -#define sContest (*(struct Contest *)(gSharedMem + 0x19204)) -#define sContestantStatus ((struct ContestantStatus *)(gSharedMem + 0x19260)) -#define shared192D0_ (*(struct UnknownContestStruct7 *)(gSharedMem + 0x192D0)) -#define shared192E4 (gSharedMem + 0x192E4) -#define shared19328 (*(struct UnknownContestStruct5 *)(gSharedMem + 0x19328)) -#define shared19338 ((struct UnknownContestStruct4 *)(gSharedMem + 0x19338)) -#define shared19348_ (*(struct UnknownContestStruct8 *)(gSharedMem + 0x19348)) extern struct MusicPlayerInfo gMPlay_SE1; -extern u16 gSpecialVar_ContestCategory; -extern u16 gSpecialVar_ContestRank; extern u8 gBattleMonForms[]; extern u8 gDisplayedStringBattle[]; extern u16 gBattleTypeFlags; @@ -214,31 +48,21 @@ extern u8 gBankAttacker; extern u8 gBankTarget; extern u8 gBanksBySide[]; extern u8 gObjectBankIDs[]; -extern u8 gIsLinkContest; -extern u8 gContestPlayerMonIndex; -extern u16 gUnknown_030041B0; +extern u16 gBattle_BG3_X; extern s16 gBattle_BG1_Y; -extern u16 gUnknown_030041B8; +extern u16 gBattle_BG3_Y; extern u16 gBattle_WIN1H; extern struct Window gUnknown_03004210; extern u16 gBattle_WIN0V; extern u16 gBattle_WIN1V; extern u16 gBattle_BG2_Y; extern u16 gBattle_BG2_X; -extern u16 gUnknown_030042A0; -extern u16 gUnknown_030042A4; +extern u16 gBattle_BG0_Y; +extern u16 gBattle_BG0_X; extern u16 gBattle_BG1_X; extern u16 gBattle_WIN0H; -extern u32 gUnknown_03005D28; // saved RNG value - -extern s16 gUnknown_02038680[]; -extern u16 gUnknown_02038688[]; -extern u8 gUnknown_02038694; -extern u8 gUnknown_02038696[]; -extern u8 gUnknown_0203869B; -extern s16 gUnknown_02038670[]; -extern s16 gUnknown_02038678[]; -extern u8 gContestFinalStandings[]; // What "place" each participant came in. +extern u32 gContestRngValue; // saved RNG value + extern struct SpriteTemplate gUnknown_02024E8C; @@ -416,6 +240,7 @@ void sub_80B0BC4(u8, bool8); void sub_80B0C5C(struct Sprite *); void sub_80B0CB0(struct Sprite *); void sub_80B0CDC(u8, int); +void unref_sub_80B0CF4(void); void sub_80B0D7C(void); void sub_80B1118(void); void sub_80B114C(u8); @@ -458,6 +283,20 @@ void sub_80B292C(void); void sub_80B2968(void); void SelectContestMoveBankTarget(u16); +EWRAM_DATA u8 gUnknown_0203856C = 0; +EWRAM_DATA struct ContestPokemon gContestMons[4] = {0}; +EWRAM_DATA s16 gUnknown_02038670[4] = {0}; +EWRAM_DATA s16 gUnknown_02038678[4] = {0}; +EWRAM_DATA s16 gUnknown_02038680[4] = {0}; +EWRAM_DATA u16 gUnknown_02038688[4] = {0}; +EWRAM_DATA u8 gContestFinalStandings[4] = {0}; // What "place" each participant came in. +EWRAM_DATA u8 gUnknown_02038694 = 0; +EWRAM_DATA u8 gContestPlayerMonIndex = 0; +EWRAM_DATA u8 gUnknown_02038696[4] = {0}; +EWRAM_DATA u8 gIsLinkContest = 0; +EWRAM_DATA u8 gUnknown_0203869B = 0; +EWRAM_DATA u16 gSpecialVar_ContestCategory = 0; +EWRAM_DATA u16 gSpecialVar_ContestRank = 0; void nullsub_89(u8 taskId) { @@ -489,14 +328,14 @@ void ResetContestGpuRegs(void) REG_WINOUT = 0x3F3F; REG_DISPCNT |= 0x7F00; - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; gBattle_BG1_X = 0; gBattle_BG1_Y = 0; gBattle_BG2_X = 0; gBattle_BG2_Y = 0; - gUnknown_030041B0 = 0; - gUnknown_030041B8 = 0; + gBattle_BG3_X = 0; + gBattle_BG3_Y = 0; gBattle_WIN0H = 0; gBattle_WIN0V = 0; gBattle_WIN1H = 0; @@ -522,16 +361,16 @@ void LoadContestBgAfterMoveAnim(void) void SetUpContestWindow(void) { - SetUpWindowConfig(&gWindowConfig_81E6FD8); - InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6FD8); - InitWindowFromConfig(&gMenuWindow, &gWindowConfig_81E6FF4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6FD8); + Text_InitWindowWithTemplate(&gUnknown_03004210, &gWindowTemplate_81E6FD8); + Text_InitWindowWithTemplate(&gMenuWindow, &gWindowTemplate_81E6FF4); } void sub_80AB350(void) { u8 i; - LoadFontDefaultPalette(&gWindowConfig_81E6FD8); + LoadFontDefaultPalette(&gWindowTemplate_81E6FD8); FillPalette(0, 0, 2); for (i = 10; i < 14; i++) LoadPalette(gPlttBufferUnfaded + 241, 240 + i, 2); @@ -555,8 +394,8 @@ void ClearContestVars(void) sContestantStatus[i].unk14 = 0xFF; } - memset(&shared192D0_, 0, sizeof(shared192D0_)); - memset(shared192E4, 0, 0x44 * sizeof(*shared192E4)); + memset(&shared192D0, 0, sizeof(shared192D0)); + memset(eContestAI, 0, sizeof(struct ContestAIInfo)); memset(&shared19328, 0, sizeof(shared19328)); memset(shared19338, 0, 4 * sizeof(*shared19338)); if (!(gIsLinkContest & 1)) @@ -577,7 +416,7 @@ void CB2_StartContest(void) SetVBlankCallback(NULL); SetUpContestWindow(); ResetContestGpuRegs(); - dp12_8087EA4(); + ScanlineEffect_Clear(); ResetPaletteFade(); gPaletteFade.bufferTransferDisabled = TRUE; DmaClearLarge32(3, (void *)VRAM, VRAM_SIZE, 0x1000); @@ -659,7 +498,7 @@ void sub_80AB6B4(u8 taskId) GetMultiplayerId(); // unused return value DestroyTask(taskId); gTasks[sContest.mainTaskId].func = sub_80AB960; - gRngValue = gUnknown_03005D28; + gRngValue = gContestRngValue; } } @@ -777,6 +616,10 @@ void sub_80AB9A0(u8 taskId) void ContestMainCallback2(void) { +#if DEBUG + if (gUnknown_020297ED == 1 && gMain.newKeys == 4) + unref_sub_80B0CF4(); +#endif AnimateSprites(); RunTasks(); BuildOamBuffer(); @@ -785,14 +628,14 @@ void ContestMainCallback2(void) void ContestVBlankCallback(void) { - REG_BG0HOFS = gUnknown_030042A4; - REG_BG0VOFS = gUnknown_030042A0; + REG_BG0HOFS = gBattle_BG0_X; + REG_BG0VOFS = gBattle_BG0_Y; REG_BG1HOFS = gBattle_BG1_X; REG_BG1VOFS = gBattle_BG1_Y; REG_BG2HOFS = gBattle_BG2_X; REG_BG2VOFS = gBattle_BG2_Y; - REG_BG3HOFS = gUnknown_030041B0; - REG_BG3VOFS = gUnknown_030041B8; + REG_BG3HOFS = gBattle_BG3_X; + REG_BG3VOFS = gBattle_BG3_Y; REG_WIN0H = gBattle_WIN0H; REG_WIN0V = gBattle_WIN0V; REG_WIN1H = gBattle_WIN1H; @@ -800,12 +643,12 @@ void ContestVBlankCallback(void) TransferPlttBuffer(); LoadOam(); ProcessSpriteCopyRequests(); - sub_8089668(); + ScanlineEffect_InitHBlankDmaTransfer(); } void sub_80ABB70(u8 taskId) { - gUnknown_030042A0 = 0; + gBattle_BG0_Y = 0; gBattle_BG2_Y = 0; sub_80B0D7C(); DmaCopy32Defvars(3, gPlttBufferUnfaded, shared18000.unk18204, 0x400); @@ -816,13 +659,13 @@ void sub_80ABB70(u8 taskId) InsertStringDigit(gDisplayedStringBattle, sContest.turnNumber + 1); sub_80AF138(); StringExpandPlaceholders(gStringVar4, gDisplayedStringBattle); - sub_8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15); + Text_InitWindow8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15); gTasks[taskId].func = sub_80ABC3C; } void sub_80ABC3C(u8 taskId) { - if (sub_80037A0(&gMenuWindow) == 1) + if (Text_UpdateWindowInContest(&gMenuWindow) == 1) gTasks[taskId].func = sub_80ABC70; } @@ -849,9 +692,9 @@ void sub_80ABCDC(u8 taskId) u8 i; u8 sp8[32]; - gUnknown_030042A0 = 0xA0; + gBattle_BG0_Y = 0xA0; gBattle_BG2_Y = 0xA0; - FillWindowRect_DefaultPalette( + Text_FillWindowRectDefPalette( &gUnknown_03004210, 0, gUnknown_083CA340[0][0], @@ -880,22 +723,24 @@ void sub_80ABCDC(u8 taskId) } r5 = StringCopy(r5, gMoveNames[move]); - sub_8002E4C( + Text_InitWindow8002E4C( &gUnknown_03004210, sp8, 776 + i * 20, gUnknown_083CA340[i][0] * 8 + 4, gUnknown_083CA340[i][1] * 8, 1); - sub_8002F44(&gUnknown_03004210); + Text_PrintWindow8002F44(&gUnknown_03004210); } - sub_814A5C0(0, 0xFFFF, 12, 0x2D9F, 72); + MenuCursor_Create814A5C0(0, 0xFFFF, 12, 0x2D9F, 72); sub_80AC0AC(sContest.playerMoveChoice); sub_80AEBEC(gContestMons[gContestPlayerMonIndex].moves[sContest.playerMoveChoice]); gTasks[taskId].func = sub_80ABEA0; } +void debug_sub_80B9EBC(u8); + // Handle move selection input void sub_80ABEA0(u8 taskId) { @@ -922,7 +767,7 @@ void sub_80ABEA0(u8 taskId) sub_814A904(); PlaySE(SE_SELECT); sub_80AFFE0(FALSE); - FillWindowRect_DefaultPalette( + Text_FillWindowRectDefPalette( &gUnknown_03004210, 0, gUnknown_083CA340[0][0], @@ -936,8 +781,8 @@ void sub_80ABEA0(u8 taskId) InsertStringDigit(gDisplayedStringBattle, sContest.turnNumber + 1); sub_80AF138(); StringExpandPlaceholders(gStringVar4, gDisplayedStringBattle); - sub_8003460(&gMenuWindow, gStringVar4, 776, 1, 15); - gUnknown_030042A0 = 0; + Text_InitWindowAndPrintText(&gMenuWindow, gStringVar4, 776, 1, 15); + gBattle_BG0_Y = 0; gBattle_BG2_Y = 0; gTasks[taskId].func = sub_80ABC70; break; @@ -968,13 +813,196 @@ void sub_80ABEA0(u8 taskId) if (numMoves > 1) PlaySE(SE_SELECT); break; +#if DEBUG + case START_BUTTON: + if (gUnknown_020297ED == 1 && !(gIsLinkContest & 1)) + { + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = gContestMons[gContestPlayerMonIndex].moves[0]; + gTasks[taskId].func = debug_sub_80B9EBC; + } + break; +#endif } } } +#if DEBUG + +void debug_sub_80BA054(u8); + +void debug_sub_80B9EBC(u8 taskId) +{ + u8 text[100]; + + switch (gTasks[taskId].data[0]) + { + case 0: + Text_FillWindowRectDefPalette( + &gUnknown_03004210, + 0, + gUnknown_083CA340[0][0], + gUnknown_083CA340[0][1], + gUnknown_083CA340[0][2], + gUnknown_083CA340[0][3]); + Text_InitWindowAndPrintText( + &gUnknown_03004210, + gMoveNames[gTasks[taskId].data[1]], + 776, + gUnknown_083CA340[0][0], + gUnknown_083CA340[0][1]); + ConvertIntToDecimalStringN(text, gTasks[taskId].data[1], 2, 3); + Text_InitWindowAndPrintText( + &gUnknown_03004210, + text, + 796, + gUnknown_083CA340[1][0], + gUnknown_083CA340[1][1]); + sub_80AED58(); + sub_80AEBEC(gTasks[taskId].data[1]); + gTasks[taskId].data[0]++; + break; + case 1: + switch (gMain.newAndRepeatedKeys) + { + case 0x20: + gTasks[taskId].data[1] -= 1; + if (gTasks[taskId].data[1] < 1) + gTasks[taskId].data[1] = 354; + gTasks[taskId].data[0]--; + break; + case 0x200: + gTasks[taskId].data[1] -= 10; + if (gTasks[taskId].data[1] < 1) + gTasks[taskId].data[1] = 354; + gTasks[taskId].data[0]--; + break; + case 0x10: + gTasks[taskId].data[1] += 1; + if (gTasks[taskId].data[1] > 354) + gTasks[taskId].data[1] = 1; + gTasks[taskId].data[0]--; + break; + case 0x100: + gTasks[taskId].data[1] += 10; + if (gTasks[taskId].data[1] > 354) + gTasks[taskId].data[1] = 1; + gTasks[taskId].data[0]--; + break; + case 4: + case 8: + gBattle_BG0_Y = 0; + gBattle_BG2_Y = 0; + sub_80B1BDC(); + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = debug_sub_80BA054; + break; + case 2: + gBattle_BG0_Y = DISPLAY_HEIGHT; + gBattle_BG2_Y = DISPLAY_HEIGHT; + gContestMons[gContestPlayerMonIndex].moves[0] = gTasks[taskId].data[1]; + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 0; + gTasks[taskId].func = sub_80ABCDC; + break; + } + break; + } +} + +void debug_sub_80BA054(u8 taskId) +{ + s32 i; + u8 r6; + + switch (gTasks[taskId].data[0]) + { + case 0: + for (i = 0; i < 4; i++) + gBattleMonForms[i] = 0; + memset(&shared19348, 0, sizeof(shared19348)); + sub_80B28F0(gContestPlayerMonIndex); + r6 = sub_80AE9FC( + gContestMons[gContestPlayerMonIndex].species, + gContestMons[gContestPlayerMonIndex].otId, + gContestMons[gContestPlayerMonIndex].personality); + gSprites[r6].pos2.x = 120; + gSprites[r6].callback = sub_80AD8FC; + gTasks[taskId].data[2] = r6; + gObjectBankIDs[gBankAttacker] = r6; + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[0]++; + sContest.unk1925E = 0; + break; + case 1: + r6 = gTasks[taskId].data[2]; + if (gSprites[r6].callback == SpriteCallbackDummy) + { + sContestantStatus[gContestPlayerMonIndex].currMove = gTasks[taskId].data[1]; + sub_80B2790(gContestPlayerMonIndex); + sub_80B28F0(gContestPlayerMonIndex); + SelectContestMoveBankTarget(gTasks[taskId].data[1]); + DoMoveAnim(gTasks[taskId].data[1]); + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[0]++; + } + break; + case 2: + gAnimScriptCallback(); + if (!gAnimScriptActive) + { + sub_80B28CC(gContestPlayerMonIndex); + if (sContest.unk1925E != 0) + { + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[0] = 20; + } + else + { + gTasks[taskId].data[0]++; + } + } + break; + case 3: + gTasks[taskId].data[3]++; + if (gTasks[taskId].data[3] == 21) + { + r6 = gTasks[taskId].data[2]; + gSprites[r6].callback = sub_80AD92C; + sub_80B1B14(); + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[0]++; + } + break; + case 4: + r6 = gTasks[taskId].data[2]; + if (gSprites[r6].invisible) + { + FreeSpriteOamMatrix(&gSprites[r6]); + DestroySprite(&gSprites[r6]); + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = debug_sub_80B9EBC; + gBattle_BG0_Y = DISPLAY_HEIGHT; + gBattle_BG2_Y = DISPLAY_HEIGHT; + } + break; + case 20: + if (gTasks[taskId].data[10]++ > 30) + { + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[0] = 1; + } + break; + } +} + +#endif + void sub_80AC0AC(s8 a) { - sub_814A880(4, 88 + a * 16); + MenuCursor_SetPos814A880(4, 88 + a * 16); } void nullsub_17(s8 a) @@ -1011,7 +1039,7 @@ void sub_80AC15C(u8 taskId) void sub_80AC188(u8 taskId) { sub_80AF138(); - gUnknown_030042A0 = 0; + gBattle_BG0_Y = 0; gBattle_BG2_Y = 0; sub_80AFFE0(FALSE); DmaCopy32Defvars(3, gPlttBufferFaded, shared18000.unk18604, 0x400); @@ -1063,7 +1091,7 @@ void sub_80AC2CC(u8 taskId) { case 0: sub_80B0D7C(); - for (i = 0; sContest.unk19214 != shared192D0_.unk0[i]; i++) + for (i = 0; sContest.unk19214 != shared192D0.unk0[i]; i++) ; sContest.unk19215 = i; r7 = sContest.unk19215; @@ -1106,7 +1134,7 @@ void sub_80AC2CC(u8 taskId) case 3: for (i = 0; i < 4; i++) gBattleMonForms[i] = 0; - memset(&shared19348_, 0, sizeof(shared19348_)); + memset(&shared19348, 0, sizeof(shared19348)); sub_80B28F0(sContest.unk19215); spriteId = sub_80AE9FC( gContestMons[sContest.unk19215].species, @@ -1141,12 +1169,12 @@ void sub_80AC2CC(u8 taskId) else StringCopy(gStringVar2, gUnknown_083CC330[sContestantStatus[r7].moveCategory]); StringExpandPlaceholders(gStringVar4, gUnknown_083CAFD7); - sub_8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15); + Text_InitWindow8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15); gTasks[taskId].data[0] = 6; } return; case 6: - if (sub_80037A0(&gMenuWindow) != 0) + if (Text_UpdateWindowInContest(&gMenuWindow) != 0) { sContest.unk1925E = 0; gTasks[taskId].data[0] = 7; @@ -1224,7 +1252,7 @@ void sub_80AC2CC(u8 taskId) } return; case 24: - if (sub_80037A0(&gMenuWindow) != 0) + if (Text_UpdateWindowInContest(&gMenuWindow) != 0) gTasks[taskId].data[0] = 23; return; case 48: @@ -1336,7 +1364,7 @@ void sub_80AC2CC(u8 taskId) } return; case 27: - if (sub_80037A0(&gMenuWindow) != 0) + if (Text_UpdateWindowInContest(&gMenuWindow) != 0) gTasks[taskId].data[0] = 28; return; case 28: @@ -1399,13 +1427,13 @@ void sub_80AC2CC(u8 taskId) sub_80AF138(); StringCopy(gStringVar1, gContestMons[r7].nickname); StringExpandPlaceholders(gStringVar4, ContestString_CantAppealNextTurn); - sub_8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15); + Text_InitWindow8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15); } gTasks[taskId].data[0] = 52; } return; case 52: - if (sub_80037A0(&gMenuWindow) != 0) + if (Text_UpdateWindowInContest(&gMenuWindow) != 0) { if (!sContestantStatus[r7].unk15_6) gTasks[taskId].data[0] = 17; @@ -1419,11 +1447,11 @@ void sub_80AC2CC(u8 taskId) { sub_80AF138(); if (r4 == 1) - sub_8002EB0(&gMenuWindow, ContestString_WentOverWell, 776, 1, 15); + Text_InitWindow8002EB0(&gMenuWindow, ContestString_WentOverWell, 776, 1, 15); else if (r4 == 2) - sub_8002EB0(&gMenuWindow, ContestString_WentOverVeryWell, 776, 1, 15); + Text_InitWindow8002EB0(&gMenuWindow, ContestString_WentOverVeryWell, 776, 1, 15); else - sub_8002EB0(&gMenuWindow, ContestString_AppealComboExcellently, 776, 1, 15); + Text_InitWindow8002EB0(&gMenuWindow, ContestString_AppealComboExcellently, 776, 1, 15); sub_80B1710(3); gTasks[taskId].data[10] = 0; gTasks[taskId].data[0] = 45; @@ -1433,7 +1461,7 @@ void sub_80AC2CC(u8 taskId) sub_80AF138(); StringCopy(gStringVar1, gContestMons[r7].nickname); StringExpandPlaceholders(gStringVar4, ContestString_JudgeExpectantly2); - sub_8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15); + Text_InitWindow8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15); sub_80B1710(2); gTasks[taskId].data[10] = 0; gTasks[taskId].data[0] = 45; @@ -1447,7 +1475,7 @@ void sub_80AC2CC(u8 taskId) } return; case 15: - if (sub_80037A0(&gMenuWindow) != 0) + if (Text_UpdateWindowInContest(&gMenuWindow) != 0) { if (++gTasks[taskId].data[10] > 50) { @@ -1476,7 +1504,7 @@ void sub_80AC2CC(u8 taskId) sub_80AF138(); StringCopy(gStringVar1, gContestMons[r7].nickname); StringExpandPlaceholders(gStringVar4, ContestString_DissapointedRepeat); - sub_8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15); + Text_InitWindow8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15); gTasks[taskId].data[10] = 0; sub_80B1710(0); gTasks[taskId].data[0] = 46; @@ -1491,7 +1519,7 @@ void sub_80AC2CC(u8 taskId) gTasks[taskId].data[0] = 19; return; case 19: - if (sub_80037A0(&gMenuWindow) != 0) + if (Text_UpdateWindowInContest(&gMenuWindow) != 0) { sub_80AFBA0(sContestantStatus[r7].appeal2, -sContestantStatus[r7].unk18, r7); sContestantStatus[r7].appeal2 -= sContestantStatus[r7].unk18; @@ -1546,7 +1574,7 @@ void sub_80AC2CC(u8 taskId) StringExpandPlaceholders(gStringVar4, ContestString_WentOverGreat); else StringExpandPlaceholders(gStringVar4, ContestString_GotCrowdGoing); - sub_8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15); + Text_InitWindow8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15); gTasks[taskId].data[10] = 0; gTasks[taskId].data[11] = 0; if (r4 < 0) @@ -1565,7 +1593,7 @@ void sub_80AC2CC(u8 taskId) gTasks[taskId].data[10]++; break; case 1: - if (!sContest.unk1920B_0 && sub_80037A0(&gMenuWindow) != 0) + if (!sContest.unk1920B_0 && Text_UpdateWindowInContest(&gMenuWindow) != 0) { sub_80B1CBC(-1); gTasks[taskId].data[10]++; @@ -1596,7 +1624,7 @@ void sub_80AC2CC(u8 taskId) switch (gTasks[taskId].data[10]) { case 0: - if (sub_80037A0(&gMenuWindow) != 0) + if (Text_UpdateWindowInContest(&gMenuWindow) != 0) { sub_80B1EA8(1, 1); gTasks[taskId].data[10]++; @@ -1656,20 +1684,20 @@ void sub_80AC2CC(u8 taskId) StringCopy(gStringVar1, gContestMons[r7].nickname); StringCopy(gStringVar2, gMoveNames[sContestantStatus[r7].currMove]); StringExpandPlaceholders(gStringVar4, ContestString_CrowdWatches); - sub_8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15); + Text_InitWindow8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15); gTasks[taskId].data[0] = 58; return; case 58: - if (sub_80037A0(&gMenuWindow) != 0) + if (Text_UpdateWindowInContest(&gMenuWindow) != 0) { sub_80AF138(); StringExpandPlaceholders(gStringVar4, ContestString_Ignored2); - sub_8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15); + Text_InitWindow8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15); gTasks[taskId].data[0] = 59; } return; case 59: - if (sub_80037A0(&gMenuWindow) != 0) + if (Text_UpdateWindowInContest(&gMenuWindow) != 0) { sub_80AF138(); gTasks[taskId].data[0] = 55; @@ -1682,11 +1710,11 @@ void sub_80AC2CC(u8 taskId) StringCopy(gStringVar1, gContestMons[r7].nickname); StringCopy(gStringVar2, gMoveNames[sContestantStatus[r7].currMove]); StringExpandPlaceholders(gStringVar4, gUnknown_083CBF60); - sub_8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15); + Text_InitWindow8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15); gTasks[taskId].data[0] = 34; return; case 34: - if (sub_80037A0(&gMenuWindow) != 0) + if (Text_UpdateWindowInContest(&gMenuWindow) != 0) gTasks[taskId].data[0] = 55; return; case 55: @@ -1728,11 +1756,11 @@ void sub_80AC2CC(u8 taskId) sub_80AF138(); StringCopy(gStringVar1, gContestMons[r7].nickname); StringExpandPlaceholders(gStringVar4, gUnknown_083CB00D); - sub_8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15); + Text_InitWindow8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15); gTasks[taskId].data[0] = 32; return; case 32: - if (sub_80037A0(&gMenuWindow) != 0) + if (Text_UpdateWindowInContest(&gMenuWindow) != 0) gTasks[taskId].data[0] = 21; return; case 21: @@ -1899,13 +1927,13 @@ void sub_80ADB88(u8 taskId) sub_80AF138(); StringCopy(gStringVar1, gContestMons[gContestPlayerMonIndex].nickname); StringExpandPlaceholders(gStringVar4, gContestStandOutStrings[r4]); - sub_8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15); + Text_InitWindow8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15); gTasks[taskId].func = sub_80ADC10; } void sub_80ADC10(u8 taskId) { - if (sub_80037A0(&gMenuWindow) == 1) + if (Text_UpdateWindowInContest(&gMenuWindow) == 1) { gTasks[taskId].data[0] = 0; gTasks[taskId].func = sub_80ADC4C; @@ -1969,23 +1997,23 @@ void sub_80ADDA4(u8 taskId) { s32 i; - gUnknown_030042A0 = 0; + gBattle_BG0_Y = 0; gBattle_BG2_Y = 0; for (i = 0; i < 4; i++) gUnknown_02038680[i] = sContestantStatus[i].unk4; sub_80AF668(); sub_80AF138(); sub_80BE23C(sContestantStatus[gContestPlayerMonIndex].prevMove); - gUnknown_03005D28 = gRngValue; + gContestRngValue = gRngValue; StringExpandPlaceholders(gStringVar4, gUnknown_083CB02C); - sub_8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15); + Text_InitWindow8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15); gTasks[taskId].data[2] = 0; gTasks[taskId].func = sub_80ADE54; } void sub_80ADE54(u8 taskId) { - if (sub_80037A0(&gMenuWindow) == 1) + if (Text_UpdateWindowInContest(&gMenuWindow) == 1) { sub_80B2184(); gBattle_BG1_X = 0; @@ -2105,7 +2133,7 @@ void Contest_CreatePlayerMon(u8 partyIndex) s16 tough; StringCopy(name, gSaveBlock2.playerName); - StripExtCtrlCodes(name); + Text_StripExtCtrlCodes(name); if (gIsLinkContest & 1) { u8 temp = name[5]; @@ -2125,7 +2153,7 @@ void Contest_CreatePlayerMon(u8 partyIndex) StringGetEnd10(name); if (gIsLinkContest & 1) { - StripExtCtrlCodes(name); + Text_StripExtCtrlCodes(name); if (GetMonData(&gPlayerParty[partyIndex], MON_DATA_LANGUAGE) == LANGUAGE_JAPANESE) { name[5] = EOS; @@ -2286,7 +2314,7 @@ void sub_80AE514(void) for (i = 0; i < 4; i++) { - FillWindowRect_DefaultPalette( + Text_FillWindowRectDefPalette( &gUnknown_03004210, 0, gUnknown_083CA308[gUnknown_02038696[i]][0], @@ -2326,7 +2354,7 @@ void sub_80AE5D4(u8 p, u8 b) if ((gIsLinkContest & 1) && gLinkPlayers[p].language == LANGUAGE_JAPANESE) { StringCopy(str, gLinkPlayers[p].name); - sub_8004D04( + Text_InitWindow8004D04( &gUnknown_03004210, gDisplayedStringBattle, 592 + gUnknown_02038696[p] * 22, @@ -2337,7 +2365,7 @@ void sub_80AE5D4(u8 p, u8 b) else { StringCopy(str, gContestMons[p].trainerName); - sub_8003460( + Text_InitWindowAndPrintText( &gUnknown_03004210, gDisplayedStringBattle, 592 + gUnknown_02038696[p] * 22, @@ -2363,7 +2391,7 @@ void sub_80AE6E4(u8 a, u8 b) str = sub_80AE598(str, gContestMons[a].nickname, b); *str = EOS; - sub_8004D04( + Text_InitWindow8004D04( &gUnknown_03004210, gDisplayedStringBattle, 512 + gUnknown_02038696[a] * 20, @@ -2548,7 +2576,7 @@ void sub_80AEBEC(u16 a) s32 i; u8 numHearts; - FillWindowRect_DefaultPalette(&gUnknown_03004210, 0, 11, 31, 16, 34); + Text_FillWindowRectDefPalette(&gUnknown_03004210, 0, 11, 31, 16, 34); category = gContestMoves[a].contestCategory; if (category == CONTEST_CATEGORY_COOL) @@ -2597,13 +2625,13 @@ void sub_80AEBEC(u16 a) *(u16 *)(VRAM + 0xC82A + i * 2) = 0x5036; } - sub_8003460(&gUnknown_03004210, gContestEffectStrings[gContestMoves[a].effect], 868, 11, 35); - sub_8003460(&gUnknown_03004210, gUnknown_083CC5A2, 866, 16, 31); + Text_InitWindowAndPrintText(&gUnknown_03004210, gContestEffectStrings[gContestMoves[a].effect], 868, 11, 35); + Text_InitWindowAndPrintText(&gUnknown_03004210, gUnknown_083CC5A2, 866, 16, 31); } void sub_80AED58(void) { - FillWindowRect_DefaultPalette(&gUnknown_03004210, 0, 11, 35, 28, 40); + Text_FillWindowRectDefPalette(&gUnknown_03004210, 0, 11, 35, 28, 40); } // unused @@ -2779,7 +2807,7 @@ void sub_80AF120(void) void sub_80AF138(void) { - FillWindowRect_DefaultPalette(&gUnknown_03004210, 0, 1, 15, 17, 18); + Text_FillWindowRectDefPalette(&gUnknown_03004210, 0, 1, 15, 17, 18); } u16 GetChosenMove(u8 a) @@ -2794,8 +2822,8 @@ u16 GetChosenMove(u8 a) { u8 moveChoice; - sub_81288F4(a); - moveChoice = sub_8128944(); + ContestAI_ResetAI(a); + moveChoice = ContestAI_GetActionToUse(); return gContestMons[a].moves[moveChoice]; } } @@ -2821,7 +2849,7 @@ void sub_80AF1E4(u8 a, u8 b) else sub_80AE598(gDisplayedStringBattle, gMoveNames[sContestantStatus[a].currMove], r3); sub_80AF2A0(a); - sub_8003460( + Text_InitWindowAndPrintText( &gUnknown_03004210, gDisplayedStringBattle, 696 + a * 20, @@ -2839,7 +2867,7 @@ void unref_sub_80AF280(u8 a) void sub_80AF2A0(u8 a) { - FillWindowRect_DefaultPalette( + Text_FillWindowRectDefPalette( &gUnknown_03004210, 0, gUnknown_083CA318[a][0], @@ -3115,10 +3143,10 @@ bool8 sub_80AF828(s32 a, s32 b, struct UnknownContestStruct6 *c) void sub_80AF860(void) { - gUnknown_030042A0 = 0; + gBattle_BG0_Y = 0; gBattle_BG2_Y = 0; sub_80AF138(); - sub_8003460(&gMenuWindow, gUnknownText_LinkStandbyAndWinner, 776, 1, 15); + Text_InitWindowAndPrintText(&gMenuWindow, gUnknownText_LinkStandbyAndWinner, 776, 1, 15); } u8 unref_sub_80AF89C(s16 a, s16 b, u8 c, u8 d) @@ -3837,12 +3865,8 @@ void sub_80B0748(u8 taskId) { // What the hell? These aren't pointers. // This code would crash if run. - { - void *src = (void *)(u32)gPlttBufferFaded[(r4 + 5) * 16 + 1]; - void *dest = (void *)(u32)gPlttBufferUnfaded[(r4 + 5) * 16 + 1]; - u32 size = 6; - DmaCopy16(3, src, dest, size); - } + DmaCopy16Defvars(3, (void *)(u32)gPlttBufferFaded[(r4 + 5) * 16 + 1], + (void *)(u32)gPlttBufferUnfaded[(r4 + 5) * 16 + 1], 6); gTasks[taskId].data[r1 + 0] = 0; } } @@ -4212,21 +4236,13 @@ u8 sub_80B09E4(u8 a) CopySpriteTiles(0, 3, (void *)VRAM, (u16 *)(VRAM + 0xE000 + gUnknown_02038696[a] * 5 * 64 + 0x26), (u8 *)(VRAM + 0x10000 + gSprites[r8].oam.tileNum * 32)); CopySpriteTiles(0, 3, (void *)VRAM, (u16 *)(VRAM + 0xE000 + gUnknown_02038696[a] * 5 * 64 + 0x36), (u8 *)(VRAM + 0x10000 + gSprites[r6].oam.tileNum * 32)); - { - void *dest = (void *)(VRAM + 0x10000 + (0x28 + gSprites[r8].oam.tileNum) * 32); - u32 size = 0x300; - DmaFill32(3, 0, dest, size); - } + DmaFill32Defvars(3, 0, (void *)(VRAM + 0x10000 + (0x28 + gSprites[r8].oam.tileNum) * 32), 0x300); // What is this? zero = 0; zero = 0; - { - void *dest = (void *)(VRAM + 0x10000 + (0x28 + gSprites[r6].oam.tileNum) * 32); - u32 size = 0x300; - DmaFill32(3, 0, dest, size); - } + DmaFill32Defvars(3, 0, (void *)(VRAM + 0x10000 + (0x28 + gSprites[r6].oam.tileNum) * 32), 0x300); gSprites[r8].data[0] = r6; gSprites[r6].data[0] = r8; @@ -4311,7 +4327,7 @@ void unref_sub_80B0CF4(void) for (i = 0; i < 4; i++) { - FillWindowRect_DefaultPalette( + Text_FillWindowRectDefPalette( &gUnknown_03004210, 0, gUnknown_083CA308[i][0], @@ -4340,7 +4356,7 @@ void sub_80B0D7C(void) for (i = 0; i < 4; i++) { - FillWindowRect_DefaultPalette( + Text_FillWindowRectDefPalette( &gUnknown_03004210, 0, gUnknown_083CA308[i][0], @@ -4358,7 +4374,7 @@ void sub_80B0D7C(void) r5++; } ConvertIntToDecimalStringN(sp8 + r5, r2, 0, 4); - sub_8003460( + Text_InitWindowAndPrintText( &gUnknown_03004210, sp8, 592 + gUnknown_02038696[i] * 22, @@ -4376,7 +4392,7 @@ void sub_80B0D7C(void) r5++; } ConvertIntToDecimalStringN(sp8 + r5, r2, 0, 4); - sub_8003460( + Text_InitWindowAndPrintText( &gUnknown_03004210, sp8, 512 + gUnknown_02038696[i] * 20, @@ -4528,13 +4544,13 @@ void sub_80B114C(u8 contestant) } sContestantStatus[contestant].appeal1 = gContestEffects[effect].appeal; sContestantStatus[contestant].appeal2 = gContestEffects[effect].appeal; - shared192D0_.unk4 = gContestEffects[effect].jam; - shared192D0_.unk6 = gContestEffects[effect].jam; - shared192D0_.unk11 = contestant; + shared192D0.unk4 = gContestEffects[effect].jam; + shared192D0.unk6 = gContestEffects[effect].jam; + shared192D0.unk11 = contestant; for (i = 0; i < 4; i++) { sContestantStatus[i].unkE = 0; - shared192D0_.unkD[i] = 0; + shared192D0.unkD[i] = 0; } if (sContestantStatus[contestant].unk15_4 && AreMovesContestCombo(sContestantStatus[contestant].prevMove, sContestantStatus[contestant].currMove) == 0) sContestantStatus[contestant].unk15_4 = 0; @@ -4637,19 +4653,19 @@ void sub_80B146C(u8 a, u8 b) { StringCopy(gStringVar1, gContestMons[a].nickname); StringCopy(gStringVar2, gMoveNames[sContestantStatus[a].currMove]); - if (gContestMoves[sContestantStatus[shared192D0_.unk11].currMove].contestCategory == CONTEST_CATEGORY_COOL) + if (gContestMoves[sContestantStatus[shared192D0.unk11].currMove].contestCategory == CONTEST_CATEGORY_COOL) StringCopy(gStringVar3, gText_Contest_Shyness); - else if (gContestMoves[sContestantStatus[shared192D0_.unk11].currMove].contestCategory == CONTEST_CATEGORY_BEAUTY) + else if (gContestMoves[sContestantStatus[shared192D0.unk11].currMove].contestCategory == CONTEST_CATEGORY_BEAUTY) StringCopy(gStringVar3, gText_Contest_Anxiety); - else if (gContestMoves[sContestantStatus[shared192D0_.unk11].currMove].contestCategory == CONTEST_CATEGORY_CUTE) + else if (gContestMoves[sContestantStatus[shared192D0.unk11].currMove].contestCategory == CONTEST_CATEGORY_CUTE) StringCopy(gStringVar3, gText_Contest_Laziness); - else if (gContestMoves[sContestantStatus[shared192D0_.unk11].currMove].contestCategory == CONTEST_CATEGORY_SMART) + else if (gContestMoves[sContestantStatus[shared192D0.unk11].currMove].contestCategory == CONTEST_CATEGORY_SMART) StringCopy(gStringVar3, gText_Contest_Hesitancy); else StringCopy(gStringVar3, gText_Contest_Fear); StringExpandPlaceholders(gStringVar4, gUnknown_083CC188[b]); sub_80AF138(); - sub_8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15); + Text_InitWindow8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15); } void sub_80B157C(u8 p) @@ -4708,7 +4724,7 @@ void sub_80B159C(void) for (i = 0; i < 4; i++) { - shared192D0_.unk0[i] = sp0[i]; + shared192D0.unk0[i] = sp0[i]; sContestantStatus[i].unk19 = 0xFF; sContestantStatus[i].unk10_6 = 0; gUnknown_02038696[i] = sp0[i]; @@ -4796,7 +4812,7 @@ void unref_sub_80B19D0(void) { u8 str[20]; StringCopy(str, gUnknown_083CC2EC); - sub_8003460(&gUnknown_03004210, str, 680, 0, 0); + Text_InitWindowAndPrintText(&gUnknown_03004210, str, 680, 0, 0); } s8 Contest_GetMoveExcitement(u16 move) @@ -5083,7 +5099,7 @@ void sub_80B20C4(void) for (i = 0; i < 4; i++) { - if (shared192D0_.unkD[i] != 0 && !Contest_IsMonsTurnDisabled(i)) + if (shared192D0.unkD[i] != 0 && !Contest_IsMonsTurnDisabled(i)) { u8 r4 = gUnknown_02038696[i] * 5 + 2; u16 r0 = sub_80AEFE8(i, 3); @@ -5339,7 +5355,7 @@ void sub_80B2790(u8 a) u16 species = SanitizeSpecies(gContestMons[a].species); u8 r5_2; - memset(&shared19348_, 0, sizeof(shared19348_)); + memset(&shared19348, 0, sizeof(shared19348)); ClearBattleAnimationVars(); for (i = 0; i < 4; i++) gBattleMonForms[i] = 0; @@ -5354,9 +5370,9 @@ void sub_80B2790(u8 a) case MOVE_TRANSFORM: case MOVE_ROLE_PLAY: r5_2 = sContestantStatus[a].unk1B; - shared19348_.unk2 = SanitizeSpecies(gContestMons[r5_2].species); - shared19348_.unk10 = gContestMons[r5_2].personality; - shared19348_.unk4_0 = 1; + shared19348.unk2 = SanitizeSpecies(gContestMons[r5_2].species); + shared19348.unk10 = gContestMons[r5_2].personality; + shared19348.unk4_0 = 1; break; case MOVE_RETURN: gAnimFriendship = 0xFF; @@ -5384,17 +5400,17 @@ void sub_80B2790(u8 a) void sub_80B28CC(int unused) { - memset(&shared19348_, 0, sizeof(shared19348_)); + memset(&shared19348, 0, sizeof(shared19348)); if (sContest.unk1925E != 0) sContest.unk1925E--; } void sub_80B28F0(u8 a) { - shared19348_.unk5 = a; - shared19348_.unk0 = SanitizeSpecies(gContestMons[a].species); - shared19348_.unk8 = gContestMons[a].personality; - shared19348_.unkC = gContestMons[a].otId; + shared19348.unk5 = a; + shared19348.unk0 = SanitizeSpecies(gContestMons[a].species); + shared19348.unk8 = gContestMons[a].personality; + shared19348.unkC = gContestMons[a].otId; } void sub_80B292C(void) diff --git a/src/contest_ai.c b/src/contest_ai.c new file mode 100644 index 000000000..1e249083b --- /dev/null +++ b/src/contest_ai.c @@ -0,0 +1,1762 @@ +#include "global.h" +#include "contest.h" +#include "random.h" +#include "contest_ai.h" +#include "ewram.h" + +extern u8 AreMovesContestCombo(u16, u16); +extern bool8 sub_80B214C(u8); +extern bool8 Contest_IsMonsTurnDisabled(u8); + +extern u16 gSpecialVar_ContestCategory; + +extern u8 *gAIScriptPtr; +extern u8 *gContestAIs[]; + +static void ContestAICmd_unk_00(void); +static void ContestAICmd_get_turn(void); +static void ContestAICmd_unk_02(void); +static void ContestAICmd_unk_03(void); +static void ContestAICmd_unk_04(void); +static void ContestAICmd_unk_05(void); +static void ContestAICmd_get_excitement(void); +static void ContestAICmd_unk_07(void); +static void ContestAICmd_unk_08(void); +static void ContestAICmd_unk_09(void); +static void ContestAICmd_unk_0A(void); +static void ContestAICmd_get_user_order(void); +static void ContestAICmd_unk_0C(void); +static void ContestAICmd_unk_0D(void); +static void ContestAICmd_unk_0E(void); +static void ContestAICmd_unk_0F(void); +static void ContestAICmd_get_user_condition_maybe(void); +static void ContestAICmd_unk_11(void); +static void ContestAICmd_unk_12(void); +static void ContestAICmd_unk_13(void); +static void ContestAICmd_unk_14(void); +static void ContestAICmd_unk_15(void); +static void ContestAICmd_unk_16(void); +static void ContestAICmd_unk_17(void); +static void ContestAICmd_unk_18(void); +static void ContestAICmd_unk_19(void); +static void ContestAICmd_unk_1A(void); +static void ContestAICmd_unk_1B(void); +static void ContestAICmd_unk_1C(void); +static void ContestAICmd_unk_1D(void); +static void ContestAICmd_unk_1E(void); +static void ContestAICmd_get_contest_type(void); +static void ContestAICmd_unk_20(void); +static void ContestAICmd_unk_21(void); +static void ContestAICmd_get_move_excitement(void); +static void ContestAICmd_unk_23(void); +static void ContestAICmd_unk_24(void); +static void ContestAICmd_unk_25(void); +static void ContestAICmd_unk_26(void); +static void ContestAICmd_get_move_effect(void); +static void ContestAICmd_unk_28(void); +static void ContestAICmd_unk_29(void); +static void ContestAICmd_get_move_effect_type(void); +static void ContestAICmd_unk_2B(void); +static void ContestAICmd_unk_2C(void); +static void ContestAICmd_check_move_has_highest_appeal(void); +static void ContestAICmd_unk_2E(void); +static void ContestAICmd_unk_2F(void); +static void ContestAICmd_unk_30(void); +static void ContestAICmd_unk_31(void); +static void ContestAICmd_unk_32(void); +static void ContestAICmd_unk_33(void); +static void ContestAICmd_unk_34(void); +static void ContestAICmd_unk_35(void); +static void ContestAICmd_unk_36(void); +static void ContestAICmd_unk_37(void); +static void ContestAICmd_unk_38(void); +static void ContestAICmd_unk_39(void); +static void ContestAICmd_unk_3A(void); +static void ContestAICmd_get_move_used_count(void); +static void ContestAICmd_unk_3C(void); +static void ContestAICmd_unk_3D(void); +static void ContestAICmd_unk_3E(void); +static void ContestAICmd_unk_3F(void); +static void ContestAICmd_check_combo_starter(void); +static void ContestAICmd_unk_41(void); +static void ContestAICmd_unk_42(void); +static void ContestAICmd_check_combo_finisher(void); +static void ContestAICmd_unk_44(void); +static void ContestAICmd_unk_45(void); +static void ContestAICmd_check_would_finish_combo(void); +static void ContestAICmd_unk_47(void); +static void ContestAICmd_unk_48(void); +static void ContestAICmd_get_condition(void); +static void ContestAICmd_unk_4A(void); +static void ContestAICmd_unk_4B(void); +static void ContestAICmd_unk_4C(void); +static void ContestAICmd_unk_4D(void); +static void ContestAICmd_get_used_combo_starter(void); +static void ContestAICmd_unk_4F(void); +static void ContestAICmd_unk_50(void); +static void ContestAICmd_unk_51(void); +static void ContestAICmd_unk_52(void); +static void ContestAICmd_check_can_participate(void); +static void ContestAICmd_unk_54(void); +static void ContestAICmd_unk_55(void); +static void ContestAICmd_get_val_812A188(void); +static void ContestAICmd_unk_57(void); +static void ContestAICmd_unk_58(void); +static void ContestAICmd_unk_59(void); +static void ContestAICmd_unk_5A(void); +static void ContestAICmd_unk_5B(void); +static void ContestAICmd_unk_5C(void); +static void ContestAICmd_unk_5D(void); +static void ContestAICmd_unk_5E(void); +static void ContestAICmd_unk_5F(void); +static void ContestAICmd_unk_60(void); +static void ContestAICmd_unk_61(void); +static void ContestAICmd_unk_62(void); +static void ContestAICmd_unk_63(void); +static void ContestAICmd_unk_64(void); +static void ContestAICmd_unk_65(void); +static void ContestAICmd_unk_66(void); +static void ContestAICmd_unk_67(void); +static void ContestAICmd_unk_68(void); +static void ContestAICmd_unk_69(void); +static void ContestAICmd_unk_6A(void); +static void ContestAICmd_unk_6B(void); +static void ContestAICmd_unk_6C(void); +static void ContestAICmd_unk_6D(void); +static void ContestAICmd_unk_6E(void); +static void ContestAICmd_unk_6F(void); +static void ContestAICmd_unk_70(void); +static void ContestAICmd_unk_71(void); +static void ContestAICmd_unk_72(void); +static void ContestAICmd_unk_73(void); +static void ContestAICmd_unk_74(void); +static void ContestAICmd_unk_75(void); +static void ContestAICmd_unk_76(void); +static void ContestAICmd_unk_77(void); +static void ContestAICmd_unk_78(void); +static void ContestAICmd_unk_79(void); +static void ContestAICmd_unk_7A(void); +static void ContestAICmd_unk_7B(void); +static void ContestAICmd_unk_7C(void); +static void ContestAICmd_unk_7D(void); +static void ContestAICmd_unk_7E(void); +static void ContestAICmd_unk_7F(void); +static void ContestAICmd_unk_80(void); +static void ContestAICmd_unk_81(void); +static void ContestAICmd_check_for_exciting_move(void); +static void ContestAICmd_unk_83(void); +static void ContestAICmd_unk_84(void); +static void ContestAICmd_unk_85(void); +static void ContestAICmd_unk_86(void); +static void ContestAICmd_unk_87(void); + +typedef void (* ContestAICmdFunc)(void); + +static const ContestAICmdFunc sContestAICmdTable[] = +{ + ContestAICmd_unk_00, // 0x00 + ContestAICmd_get_turn, // 0x01 + ContestAICmd_unk_02, // 0x02 + ContestAICmd_unk_03, // 0x03 + ContestAICmd_unk_04, // 0x04 + ContestAICmd_unk_05, // 0x05 + ContestAICmd_get_excitement, // 0x06 + ContestAICmd_unk_07, // 0x07 + ContestAICmd_unk_08, // 0x08 + ContestAICmd_unk_09, // 0x09 + ContestAICmd_unk_0A, // 0x0A + ContestAICmd_get_user_order, // 0x0B + ContestAICmd_unk_0C, // 0x0C + ContestAICmd_unk_0D, // 0x0D + ContestAICmd_unk_0E, // 0x0E + ContestAICmd_unk_0F, // 0x0F + ContestAICmd_get_user_condition_maybe, // 0x10 + ContestAICmd_unk_11, // 0x11 + ContestAICmd_unk_12, // 0x12 + ContestAICmd_unk_13, // 0x13 + ContestAICmd_unk_14, // 0x14 + ContestAICmd_unk_15, // 0x15 + ContestAICmd_unk_16, // 0x16 + ContestAICmd_unk_17, // 0x17 + ContestAICmd_unk_18, // 0x18 + ContestAICmd_unk_19, // 0x19 + ContestAICmd_unk_1A, // 0x1A + ContestAICmd_unk_1B, // 0x1B + ContestAICmd_unk_1C, // 0x1C + ContestAICmd_unk_1D, // 0x1D + ContestAICmd_unk_1E, // 0x1E + ContestAICmd_get_contest_type, // 0x1F + ContestAICmd_unk_20, // 0x20 + ContestAICmd_unk_21, // 0x21 + ContestAICmd_get_move_excitement, // 0x22 + ContestAICmd_unk_23, // 0x23 + ContestAICmd_unk_24, // 0x24 + ContestAICmd_unk_25, // 0x25 + ContestAICmd_unk_26, // 0x26 + ContestAICmd_get_move_effect, // 0x27 + ContestAICmd_unk_28, // 0x28 + ContestAICmd_unk_29, // 0x29 + ContestAICmd_get_move_effect_type, // 0x2A + ContestAICmd_unk_2B, // 0x2B + ContestAICmd_unk_2C, // 0x2C + ContestAICmd_check_move_has_highest_appeal, // 0x2D + ContestAICmd_unk_2E, // 0x2E + ContestAICmd_unk_2F, // 0x2F + ContestAICmd_unk_30, // 0x30 + ContestAICmd_unk_31, // 0x31 + ContestAICmd_unk_32, // 0x32 + ContestAICmd_unk_33, // 0x33 + ContestAICmd_unk_34, // 0x34 + ContestAICmd_unk_35, // 0x35 + ContestAICmd_unk_36, // 0x36 + ContestAICmd_unk_37, // 0x37 + ContestAICmd_unk_38, // 0x38 + ContestAICmd_unk_39, // 0x39 + ContestAICmd_unk_3A, // 0x3A + ContestAICmd_get_move_used_count, // 0x3B + ContestAICmd_unk_3C, // 0x3C + ContestAICmd_unk_3D, // 0x3D + ContestAICmd_unk_3E, // 0x3E + ContestAICmd_unk_3F, // 0x3F + ContestAICmd_check_combo_starter, // 0x40 + ContestAICmd_unk_41, // 0x41 + ContestAICmd_unk_42, // 0x42 + ContestAICmd_check_combo_finisher, // 0x43 + ContestAICmd_unk_44, // 0x44 + ContestAICmd_unk_45, // 0x45 + ContestAICmd_check_would_finish_combo, // 0x46 + ContestAICmd_unk_47, // 0x47 + ContestAICmd_unk_48, // 0x48 + ContestAICmd_get_condition, // 0x49 + ContestAICmd_unk_4A, // 0x4A + ContestAICmd_unk_4B, // 0x4B + ContestAICmd_unk_4C, // 0x4C + ContestAICmd_unk_4D, // 0x4D + ContestAICmd_get_used_combo_starter, // 0x4E + ContestAICmd_unk_4F, // 0x4F + ContestAICmd_unk_50, // 0x50 + ContestAICmd_unk_51, // 0x51 + ContestAICmd_unk_52, // 0x52 + ContestAICmd_check_can_participate, // 0x53 + ContestAICmd_unk_54, // 0x54 + ContestAICmd_unk_55, // 0x55 + ContestAICmd_get_val_812A188, // 0x56 + ContestAICmd_unk_57, // 0x57 + ContestAICmd_unk_58, // 0x58 + ContestAICmd_unk_59, // 0x59 + ContestAICmd_unk_5A, // 0x5A + ContestAICmd_unk_5B, // 0x5B + ContestAICmd_unk_5C, // 0x5C + ContestAICmd_unk_5D, // 0x5D + ContestAICmd_unk_5E, // 0x5E + ContestAICmd_unk_5F, // 0x5F + ContestAICmd_unk_60, // 0x60 + ContestAICmd_unk_61, // 0x61 + ContestAICmd_unk_62, // 0x62 + ContestAICmd_unk_63, // 0x63 + ContestAICmd_unk_64, // 0x64 + ContestAICmd_unk_65, // 0x65 + ContestAICmd_unk_66, // 0x66 + ContestAICmd_unk_67, // 0x67 + ContestAICmd_unk_68, // 0x68 + ContestAICmd_unk_69, // 0x69 + ContestAICmd_unk_6A, // 0x6A + ContestAICmd_unk_6B, // 0x6B + ContestAICmd_unk_6C, // 0x6C + ContestAICmd_unk_6D, // 0x6D + ContestAICmd_unk_6E, // 0x6E + ContestAICmd_unk_6F, // 0x6F + ContestAICmd_unk_70, // 0x70 + ContestAICmd_unk_71, // 0x71 + ContestAICmd_unk_72, // 0x72 + ContestAICmd_unk_73, // 0x73 + ContestAICmd_unk_74, // 0x74 + ContestAICmd_unk_75, // 0x75 + ContestAICmd_unk_76, // 0x76 + ContestAICmd_unk_77, // 0x77 + ContestAICmd_unk_78, // 0x78 + ContestAICmd_unk_79, // 0x79 + ContestAICmd_unk_7A, // 0x7A + ContestAICmd_unk_7B, // 0x7B + ContestAICmd_unk_7C, // 0x7C + ContestAICmd_unk_7D, // 0x7D + ContestAICmd_unk_7E, // 0x7E + ContestAICmd_unk_7F, // 0x7F + ContestAICmd_unk_80, // 0x80 + ContestAICmd_unk_81, // 0x81 + ContestAICmd_check_for_exciting_move, // 0x82 + ContestAICmd_unk_83, // 0x83 + ContestAICmd_unk_84, // 0x84 + ContestAICmd_unk_85, // 0x85 + ContestAICmd_unk_86, // 0x86 + ContestAICmd_unk_87, // 0x87 +}; + +static void ContestAI_DoAIProcessing(void); +static bool8 sub_8128A7C(u8); +static void sub_812ACA4(u8 *); +static u8 sub_812ACC8(void); + +void ContestAI_ResetAI(u8 var) +{ + int i; + memset(eContestAI, 0, sizeof(struct ContestAIInfo)); + + for(i = 0; i < 4; i++) + eContestAI->unk5[i] = 100; + + eContestAI->unk41 = var; + eContestAI->unk40 = 0; + eContestAI->flags = gContestMons[eContestAI->unk41].flags; +} + +u8 ContestAI_GetActionToUse(void) +{ + while(eContestAI->flags != 0) + { + if(eContestAI->flags & 1) + { + eContestAI->aiState = 0; + ContestAI_DoAIProcessing(); + } + eContestAI->flags >>= 1; + eContestAI->unk10++; + eContestAI->unk4 = 0; + } + + while (1) + { + u8 rval = Random() & 3; + u8 r2 = eContestAI->unk5[rval]; + int i; + for (i = 0; i < 4; i++) + { + if (r2 < eContestAI->unk5[i]) + break; + } + if (i == 4) + return rval; + } +} + +static void ContestAI_DoAIProcessing(void) +{ + while(eContestAI->aiState != CONTESTAI_FINISHED) + { + switch(eContestAI->aiState) + { + case CONTESTAI_DO_NOT_PROCESS: + break; + case CONTESTAI_SETTING_UP: + gAIScriptPtr = gContestAIs[eContestAI->unk10]; + + if(gContestMons[eContestAI->unk41].moves[eContestAI->unk4] == 0) + eContestAI->unk2 = 0; // don't process a move that doesn't exist. + else + eContestAI->unk2 = gContestMons[eContestAI->unk41].moves[eContestAI->unk4]; + eContestAI->aiState++; + break; + case CONTESTAI_PROCESSING: + if(eContestAI->unk2 != 0) + sContestAICmdTable[*gAIScriptPtr](); // run the command. + else + { + eContestAI->unk5[eContestAI->unk4] = 0; // don't consider a move that doesn't exist. + eContestAI->aiAction |= 1; + } + if(eContestAI->aiAction & 1) + { + eContestAI->unk4++; + if(eContestAI->unk4 < 4) + eContestAI->aiState = 0; + else + eContestAI->aiState++; + eContestAI->aiAction &= 0xFE; // TODO: Define action flags + } + break; + } + } +} + +static u8 sub_8128A7C(u8 var) +{ + int i; + + for(i = 0; i < 4; i++) + if(shared192D0.unk0[i] == var) + break; + + return i; +} + +static void ContestAICmd_unk_00(void) +{ + s16 score = eContestAI->unk5[eContestAI->unk4] + (s8)gAIScriptPtr[1]; + + if (score > 255) + score = 255; + else if (score < 0) + score = 0; + + eContestAI->unk5[eContestAI->unk4] = score; + + gAIScriptPtr += 2; +} + +static void ContestAICmd_get_turn(void) +{ + eContestAI->scriptResult = sContest.turnNumber; + gAIScriptPtr += 1; +} + +static void ContestAICmd_unk_02(void) +{ + ContestAICmd_get_turn(); + + if(eContestAI->scriptResult < gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_03(void) +{ + ContestAICmd_get_turn(); + + if(eContestAI->scriptResult > gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_04(void) +{ + ContestAICmd_get_turn(); + + if(eContestAI->scriptResult == gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_05(void) +{ + ContestAICmd_get_turn(); + + if(eContestAI->scriptResult != gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_get_excitement(void) +{ + eContestAI->scriptResult = sContest.applauseLevel; + gAIScriptPtr += 1; +} + +static void ContestAICmd_unk_07(void) +{ + ContestAICmd_get_excitement(); + + if(eContestAI->scriptResult < gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_08(void) +{ + ContestAICmd_get_excitement(); + + if(eContestAI->scriptResult > gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_09(void) +{ + ContestAICmd_get_excitement(); + + if(eContestAI->scriptResult == gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_0A(void) +{ + ContestAICmd_get_excitement(); + + if(eContestAI->scriptResult != gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_get_user_order(void) +{ + eContestAI->scriptResult = shared192D0.unk0[eContestAI->unk41]; + gAIScriptPtr += 1; +} + +static void ContestAICmd_unk_0C(void) +{ + ContestAICmd_get_user_order(); + + if(eContestAI->scriptResult < gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_0D(void) +{ + ContestAICmd_get_user_order(); + + if(eContestAI->scriptResult > gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_0E(void) +{ + ContestAICmd_get_user_order(); + + if(eContestAI->scriptResult == gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_0F(void) +{ + ContestAICmd_get_user_order(); + + if(eContestAI->scriptResult != gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_get_user_condition_maybe(void) +{ + eContestAI->scriptResult = sContestantStatus[eContestAI->unk41].unkD / 10; + gAIScriptPtr += 1; +} + +static void ContestAICmd_unk_11(void) +{ + ContestAICmd_get_user_condition_maybe(); + + if(eContestAI->scriptResult < gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_12(void) +{ + ContestAICmd_get_user_condition_maybe(); + + if(eContestAI->scriptResult > gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_13(void) +{ + ContestAICmd_get_user_condition_maybe(); + + if(eContestAI->scriptResult == gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_14(void) +{ + ContestAICmd_get_user_condition_maybe(); + + if(eContestAI->scriptResult != gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_15(void) +{ + eContestAI->scriptResult = sContestantStatus[eContestAI->unk41].unk4; + gAIScriptPtr += 1; +} + +static void ContestAICmd_unk_16(void) +{ + ContestAICmd_unk_15(); + + if(eContestAI->scriptResult < (s16)T1_READ_16(gAIScriptPtr + 0)) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; +} + +static void ContestAICmd_unk_17(void) +{ + ContestAICmd_unk_15(); + + if(eContestAI->scriptResult > (s16)T1_READ_16(gAIScriptPtr + 0)) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; +} + +static void ContestAICmd_unk_18(void) +{ + ContestAICmd_unk_15(); + + if(eContestAI->scriptResult == (s16)T1_READ_16(gAIScriptPtr + 0)) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; +} + +static void ContestAICmd_unk_19(void) +{ + ContestAICmd_unk_15(); + + if(eContestAI->scriptResult != (s16)T1_READ_16(gAIScriptPtr + 0)) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; +} + +static void ContestAICmd_unk_1A(void) +{ + eContestAI->scriptResult = gUnknown_02038670[eContestAI->unk41]; + gAIScriptPtr += 1; +} + +static void ContestAICmd_unk_1B(void) +{ + ContestAICmd_unk_1A(); + + if(eContestAI->scriptResult < (s16)T1_READ_16(gAIScriptPtr + 0)) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; +} + +static void ContestAICmd_unk_1C(void) +{ + ContestAICmd_unk_1A(); + + if(eContestAI->scriptResult > (s16)T1_READ_16(gAIScriptPtr + 0)) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; +} + +static void ContestAICmd_unk_1D(void) +{ + ContestAICmd_unk_1A(); + + if(eContestAI->scriptResult == (s16)T1_READ_16(gAIScriptPtr + 0)) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; +} + +static void ContestAICmd_unk_1E(void) +{ + ContestAICmd_unk_1A(); + + if(eContestAI->scriptResult != (s16)T1_READ_16(gAIScriptPtr + 0)) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; +} + +static void ContestAICmd_get_contest_type(void) +{ + eContestAI->scriptResult = gSpecialVar_ContestCategory; + gAIScriptPtr += 1; +} + +static void ContestAICmd_unk_20(void) +{ + ContestAICmd_get_contest_type(); + + if(eContestAI->scriptResult == gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_21(void) +{ + ContestAICmd_get_contest_type(); + + if(eContestAI->scriptResult != gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_get_move_excitement(void) +{ + eContestAI->scriptResult = Contest_GetMoveExcitement(gContestMons[eContestAI->unk41].moves[eContestAI->unk4]); + gAIScriptPtr += 1; +} + +static void ContestAICmd_unk_23(void) +{ + ContestAICmd_get_move_excitement(); + + if(eContestAI->scriptResult < (s8)gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_24(void) +{ + ContestAICmd_get_move_excitement(); + + if(eContestAI->scriptResult > (s8)gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_25(void) +{ + ContestAICmd_get_move_excitement(); + + if(eContestAI->scriptResult == (s8)gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_26(void) +{ + ContestAICmd_get_move_excitement(); + + if(eContestAI->scriptResult != (s8)gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_get_move_effect(void) +{ + u16 move = gContestMons[eContestAI->unk41].moves[eContestAI->unk4]; + + eContestAI->scriptResult = gContestMoves[move].effect; + gAIScriptPtr += 1; +} + +static void ContestAICmd_unk_28(void) +{ + ContestAICmd_get_move_effect(); + + if(eContestAI->scriptResult == gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_29(void) +{ + ContestAICmd_get_move_effect(); + + if(eContestAI->scriptResult != gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_get_move_effect_type(void) +{ + u16 move = gContestMons[eContestAI->unk41].moves[eContestAI->unk4]; + + eContestAI->scriptResult = gContestEffects[gContestMoves[move].effect].effectType; + gAIScriptPtr += 1; +} + +static void ContestAICmd_unk_2B(void) +{ + ContestAICmd_get_move_effect_type(); + + if(eContestAI->scriptResult == gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_2C(void) +{ + ContestAICmd_get_move_effect_type(); + + if(eContestAI->scriptResult != gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_check_move_has_highest_appeal(void) +{ + int i; + u16 move = gContestMons[eContestAI->unk41].moves[eContestAI->unk4]; + u8 appeal = gContestEffects[gContestMoves[move].effect].appeal; + + for(i = 0; i < 4; i++) + { + u16 newMove = gContestMons[eContestAI->unk41].moves[i]; + if(newMove != 0 && appeal < gContestEffects[gContestMoves[newMove].effect].appeal) + break; + } + + if(i == 4) + eContestAI->scriptResult = TRUE; + else + eContestAI->scriptResult = FALSE; + + gAIScriptPtr += 1; +} + +static void ContestAICmd_unk_2E(void) +{ + ContestAICmd_check_move_has_highest_appeal(); + + if(eContestAI->scriptResult != FALSE) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 0); + else + gAIScriptPtr += 4; +} + +static void ContestAICmd_unk_2F(void) +{ + int i; + u16 move = gContestMons[eContestAI->unk41].moves[eContestAI->unk4]; + u8 jam = gContestEffects[gContestMoves[move].effect].jam; + + for(i = 0; i < 4; i++) + { + u16 newMove = gContestMons[eContestAI->unk41].moves[i]; + if(newMove != 0 && jam < gContestEffects[gContestMoves[newMove].effect].jam) + break; + } + + if(i == 4) + eContestAI->scriptResult = TRUE; + else + eContestAI->scriptResult = FALSE; + + gAIScriptPtr += 1; +} + +static void ContestAICmd_unk_30(void) +{ + ContestAICmd_unk_2F(); + + if(eContestAI->scriptResult != FALSE) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_31(void) +{ + u16 move = gContestMons[eContestAI->unk41].moves[eContestAI->unk4]; + + eContestAI->scriptResult = gContestEffects[gContestMoves[move].effect].appeal / 10; + gAIScriptPtr += 1; +} + +static void ContestAICmd_unk_32(void) +{ + ContestAICmd_unk_31(); + + if(eContestAI->scriptResult < gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_33(void) +{ + ContestAICmd_unk_31(); + + if(eContestAI->scriptResult > gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_34(void) +{ + ContestAICmd_unk_31(); + + if(eContestAI->scriptResult == gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_35(void) +{ + ContestAICmd_unk_31(); + + if(eContestAI->scriptResult != gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_36(void) +{ + u16 move = gContestMons[eContestAI->unk41].moves[eContestAI->unk4]; + + eContestAI->scriptResult = gContestEffects[gContestMoves[move].effect].jam / 10; + gAIScriptPtr += 1; +} + +static void ContestAICmd_unk_37(void) +{ + ContestAICmd_unk_36(); + + if(eContestAI->scriptResult < gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_38(void) +{ + ContestAICmd_unk_36(); + + if(eContestAI->scriptResult > gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_39(void) +{ + ContestAICmd_unk_36(); + + if(eContestAI->scriptResult == gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_3A(void) +{ + ContestAICmd_unk_36(); + + if(eContestAI->scriptResult != gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_get_move_used_count(void) +{ + s16 result; + u16 move = gContestMons[eContestAI->unk41].moves[eContestAI->unk4]; + + if(move != sContestantStatus[eContestAI->unk41].prevMove) + result = 0; // move is unique and not reused. + else + result = sContestantStatus[eContestAI->unk41].moveRepeatCount + 1; + + eContestAI->scriptResult = result; + gAIScriptPtr += 1; +} + +static void ContestAICmd_unk_3C(void) +{ + ContestAICmd_get_move_used_count(); + + if(eContestAI->scriptResult < gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_3D(void) +{ + ContestAICmd_get_move_used_count(); + + if(eContestAI->scriptResult > gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_3E(void) +{ + ContestAICmd_get_move_used_count(); + + if(eContestAI->scriptResult == gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_3F(void) +{ + ContestAICmd_get_move_used_count(); + + if(eContestAI->scriptResult != gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_check_combo_starter(void) +{ + u8 result = 0; + int i; + u16 move = gContestMons[eContestAI->unk41].moves[eContestAI->unk4]; + + for(i = 0; i < 4; i++) + { + if (gContestMons[eContestAI->unk41].moves[i]) + { + result = AreMovesContestCombo(move, gContestMons[eContestAI->unk41].moves[i]); + if (result) + { + result = 1; + break; + } + } + } + + if (result) + result = 1; + + eContestAI->scriptResult = result; + gAIScriptPtr += 1; +} + +static void ContestAICmd_unk_41(void) +{ + ContestAICmd_check_combo_starter(); + + if(eContestAI->scriptResult != 0) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 0); + else + gAIScriptPtr += 4; +} + +static void ContestAICmd_unk_42(void) +{ + ContestAICmd_check_combo_starter(); + + if(eContestAI->scriptResult == 0) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 0); + else + gAIScriptPtr += 4; +} + +static void ContestAICmd_check_combo_finisher(void) +{ + u8 result = 0; + int i; + u16 move = gContestMons[eContestAI->unk41].moves[eContestAI->unk4]; + + for(i = 0; i < 4; i++) + { + if (gContestMons[eContestAI->unk41].moves[i]) + { + result = AreMovesContestCombo(gContestMons[eContestAI->unk41].moves[i], move); + if (result) + { + result = 1; + break; + } + } + } + + if (result) + result = 1; + + eContestAI->scriptResult = result; + gAIScriptPtr += 1; +} + +static void ContestAICmd_unk_44(void) +{ + ContestAICmd_check_combo_finisher(); + + if(eContestAI->scriptResult != 0) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 0); + else + gAIScriptPtr += 4; +} + +static void ContestAICmd_unk_45(void) +{ + ContestAICmd_check_combo_finisher(); + + if(eContestAI->scriptResult == 0) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 0); + else + gAIScriptPtr += 4; +} + +static void ContestAICmd_check_would_finish_combo(void) +{ + u8 result = 0; + u16 move = gContestMons[eContestAI->unk41].moves[eContestAI->unk4]; + + if(sContestantStatus[eContestAI->unk41].prevMove) + result = AreMovesContestCombo(sContestantStatus[eContestAI->unk41].prevMove, move); + + if(result) + result = 1; + + eContestAI->scriptResult = result; + gAIScriptPtr += 1; +} + +static void ContestAICmd_unk_47(void) +{ + ContestAICmd_check_would_finish_combo(); + + if(eContestAI->scriptResult != 0) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 0); + else + gAIScriptPtr += 4; +} + +static void ContestAICmd_unk_48(void) +{ + ContestAICmd_check_would_finish_combo(); + + if(eContestAI->scriptResult == 0) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 0); + else + gAIScriptPtr += 4; +} + +static void ContestAICmd_get_condition(void) +{ + int var = sub_8128A7C(gAIScriptPtr[1]); + + eContestAI->scriptResult = sContestantStatus[var].unkD / 10; + gAIScriptPtr += 2; +} + +static void ContestAICmd_unk_4A(void) +{ + ContestAICmd_get_condition(); + + if(eContestAI->scriptResult < gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_4B(void) +{ + ContestAICmd_get_condition(); + + if(eContestAI->scriptResult > gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_4C(void) +{ + ContestAICmd_get_condition(); + + if(eContestAI->scriptResult == gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_4D(void) +{ + ContestAICmd_get_condition(); + + if(eContestAI->scriptResult != gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_get_used_combo_starter(void) +{ + u16 result = 0; + u8 var = sub_8128A7C(gAIScriptPtr[1]); + + if(sub_80B214C(var)) + result = gContestMoves[sContestantStatus[var].prevMove].comboStarterId ? 1 : 0; + + eContestAI->scriptResult = result; + gAIScriptPtr += 2; +} + +static void ContestAICmd_unk_4F(void) +{ + ContestAICmd_get_used_combo_starter(); + + if(eContestAI->scriptResult < gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_50(void) +{ + ContestAICmd_get_used_combo_starter(); + + if(eContestAI->scriptResult > gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_51(void) +{ + ContestAICmd_get_used_combo_starter(); + + if(eContestAI->scriptResult == gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_52(void) +{ + ContestAICmd_get_used_combo_starter(); + + if(eContestAI->scriptResult != gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_check_can_participate(void) +{ + if(Contest_IsMonsTurnDisabled(sub_8128A7C(gAIScriptPtr[1]))) + eContestAI->scriptResult = FALSE; + else + eContestAI->scriptResult = TRUE; + + gAIScriptPtr += 2; +} + +static void ContestAICmd_unk_54(void) +{ + ContestAICmd_check_can_participate(); + + if(eContestAI->scriptResult != 0) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 0); + else + gAIScriptPtr += 4; +} + +static void ContestAICmd_unk_55(void) +{ + ContestAICmd_check_can_participate(); + + if(eContestAI->scriptResult == 0) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 0); + else + gAIScriptPtr += 4; +} + +static void ContestAICmd_get_val_812A188(void) +{ + u8 var = sub_8128A7C(gAIScriptPtr[1]); + + eContestAI->scriptResult = sContestantStatus[var].unk15_3; + gAIScriptPtr += 2; +} + +static void ContestAICmd_unk_57(void) +{ + ContestAICmd_get_val_812A188(); + + if(eContestAI->scriptResult != 0) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 0); + else + gAIScriptPtr += 4; +} + +static void ContestAICmd_unk_58(void) +{ + ContestAICmd_get_val_812A188(); + + if(eContestAI->scriptResult == 0) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 0); + else + gAIScriptPtr += 4; +} + +static void ContestAICmd_unk_59(void) +{ + u8 var = sub_8128A7C(gAIScriptPtr[1]); + + eContestAI->scriptResult = sContestantStatus[var].unk4 - sContestantStatus[eContestAI->unk41].unk4; + gAIScriptPtr += 2; +} + +static void ContestAICmd_unk_5A(void) +{ + ContestAICmd_unk_59(); + + if(eContestAI->scriptResult < 0) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 0); + else + gAIScriptPtr += 4; +} + +static void ContestAICmd_unk_5B(void) +{ + ContestAICmd_unk_59(); + + if(eContestAI->scriptResult > 0) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 0); + else + gAIScriptPtr += 4; +} + +static void ContestAICmd_unk_5C(void) +{ + ContestAICmd_unk_59(); + + if(eContestAI->scriptResult == 0) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 0); + else + gAIScriptPtr += 4; +} + +static void ContestAICmd_unk_5D(void) +{ + ContestAICmd_unk_59(); + + if(eContestAI->scriptResult != 0) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 0); + else + gAIScriptPtr += 4; +} + +static void ContestAICmd_unk_5E(void) +{ + u8 var = sub_8128A7C(gAIScriptPtr[1]); + + eContestAI->scriptResult = gUnknown_02038670[var] - gUnknown_02038670[eContestAI->unk41]; + gAIScriptPtr += 2; +} + +static void ContestAICmd_unk_5F(void) +{ + ContestAICmd_unk_5E(); + + if(eContestAI->scriptResult < 0) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 0); + else + gAIScriptPtr += 4; +} + +static void ContestAICmd_unk_60(void) +{ + ContestAICmd_unk_5E(); + + if(eContestAI->scriptResult > 0) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 0); + else + gAIScriptPtr += 4; +} + +static void ContestAICmd_unk_61(void) +{ + ContestAICmd_unk_5E(); + + if(eContestAI->scriptResult == 0) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 0); + else + gAIScriptPtr += 4; +} + +static void ContestAICmd_unk_62(void) +{ + ContestAICmd_unk_5E(); + + if(eContestAI->scriptResult != 0) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 0); + else + gAIScriptPtr += 4; +} + +static void ContestAICmd_unk_63(void) +{ + u8 var = sub_8128A7C(gAIScriptPtr[1]); + u8 var2 = gAIScriptPtr[2]; + u16 move = sContest.unk19220[var2][var]; + + eContestAI->scriptResult = gContestMoves[move].effect; + gAIScriptPtr += 3; +} + +static void ContestAICmd_unk_64(void) +{ + ContestAICmd_unk_63(); + + if(eContestAI->scriptResult < gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_65(void) +{ + ContestAICmd_unk_63(); + + if(eContestAI->scriptResult > gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_66(void) +{ + ContestAICmd_unk_63(); + + if(eContestAI->scriptResult == gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_67(void) +{ + ContestAICmd_unk_63(); + + if(eContestAI->scriptResult != gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_68(void) +{ + u8 var = sub_8128A7C(gAIScriptPtr[1]); + u8 var2 = gAIScriptPtr[2]; + s8 result = sContest.unk19248[var2][var]; + + eContestAI->scriptResult = result; + gAIScriptPtr += 3; +} + +static void ContestAICmd_unk_69(void) +{ + ContestAICmd_unk_68(); + + if(eContestAI->scriptResult < gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_6A(void) +{ + ContestAICmd_unk_68(); + + if(eContestAI->scriptResult > gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_6B(void) +{ + ContestAICmd_unk_68(); + + if(eContestAI->scriptResult == gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_6C(void) +{ + ContestAICmd_unk_68(); + + if(eContestAI->scriptResult != gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_6D(void) +{ + u8 var = sub_8128A7C(gAIScriptPtr[1]); + u8 var2 = gAIScriptPtr[2]; + u16 move = sContest.unk19220[var2][var]; + + eContestAI->scriptResult = gContestEffects[gContestMoves[move].effect].effectType; + gAIScriptPtr += 3; +} + +static void ContestAICmd_unk_6E(void) +{ + ContestAICmd_unk_6D(); + + if(eContestAI->scriptResult == gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_6F(void) +{ + ContestAICmd_unk_6D(); + + if(eContestAI->scriptResult != gAIScriptPtr[0]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void ContestAICmd_unk_70(void) +{ + eContestAI->scriptArr[gAIScriptPtr[1]] = eContestAI->scriptResult; + gAIScriptPtr += 2; +} + +static void ContestAICmd_unk_71(void) +{ + eContestAI->scriptArr[gAIScriptPtr[1]] = T1_READ_16(gAIScriptPtr + 2); + gAIScriptPtr += 4; +} + +static void ContestAICmd_unk_72(void) +{ + // wtf? shouldn't T1_READ_16 work here? why the signed 8 load by gAIScriptPtr[2]? + eContestAI->scriptArr[gAIScriptPtr[1]] += ((s8)gAIScriptPtr[2] | gAIScriptPtr[3] << 8); + gAIScriptPtr += 4; +} + +static void ContestAICmd_unk_73(void) +{ + eContestAI->scriptArr[gAIScriptPtr[1]] += eContestAI->scriptArr[gAIScriptPtr[2]]; + gAIScriptPtr += 3; +} + +static void ContestAICmd_unk_74(void) +{ + eContestAI->scriptArr[gAIScriptPtr[1]] += eContestAI->scriptArr[gAIScriptPtr[2]]; + gAIScriptPtr += 3; +} + +static void ContestAICmd_unk_75(void) +{ + if(eContestAI->scriptArr[gAIScriptPtr[1]] < T1_READ_16(gAIScriptPtr + 2)) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); + else + gAIScriptPtr += 8; +} + +static void ContestAICmd_unk_76(void) +{ + if(eContestAI->scriptArr[gAIScriptPtr[1]] > T1_READ_16(gAIScriptPtr + 2)) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); + else + gAIScriptPtr += 8; +} + +static void ContestAICmd_unk_77(void) +{ + if(eContestAI->scriptArr[gAIScriptPtr[1]] == T1_READ_16(gAIScriptPtr + 2)) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); + else + gAIScriptPtr += 8; +} + +static void ContestAICmd_unk_78(void) +{ + if(eContestAI->scriptArr[gAIScriptPtr[1]] != T1_READ_16(gAIScriptPtr + 2)) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); + else + gAIScriptPtr += 8; +} + +static void ContestAICmd_unk_79(void) +{ + if(eContestAI->scriptArr[gAIScriptPtr[1]] < (eContestAI->scriptArr[gAIScriptPtr[2]])) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); + else + gAIScriptPtr += 7; +} + +static void ContestAICmd_unk_7A(void) +{ + if(eContestAI->scriptArr[gAIScriptPtr[1]] > (eContestAI->scriptArr[gAIScriptPtr[2]])) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); + else + gAIScriptPtr += 7; +} + +static void ContestAICmd_unk_7B(void) +{ + if(eContestAI->scriptArr[gAIScriptPtr[1]] == (eContestAI->scriptArr[gAIScriptPtr[2]])) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); + else + gAIScriptPtr += 7; +} + +static void ContestAICmd_unk_7C(void) +{ + if(eContestAI->scriptArr[gAIScriptPtr[1]] != (eContestAI->scriptArr[gAIScriptPtr[2]])) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); + else + gAIScriptPtr += 7; +} + +static void ContestAICmd_unk_7D(void) +{ + if((Random() & 0xFF) < eContestAI->scriptArr[gAIScriptPtr[1]]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; +} + +static void ContestAICmd_unk_7E(void) +{ + if((Random() & 0xFF) > eContestAI->scriptArr[gAIScriptPtr[1]]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; +} + +// jump +static void ContestAICmd_unk_7F(void) +{ + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); +} + +static void ContestAICmd_unk_80(void) +{ + sub_812ACA4(gAIScriptPtr + 5); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); +} + +static void ContestAICmd_unk_81(void) +{ + if(!sub_812ACC8()) + eContestAI->aiAction |= 1; +} + +// push stack? +static void sub_812ACA4(u8 *ptr) +{ + u8 unk40 = eContestAI->unk40++; + eContestAI->stack[unk40] = (u32)ptr; +} + +// pop stack? +static bool8 sub_812ACC8(void) +{ + if(eContestAI->unk40 != 0) + { + --eContestAI->unk40; + gAIScriptPtr = (u8 *)eContestAI->stack[eContestAI->unk40]; + return TRUE; + } + else + return FALSE; +} + +static void ContestAICmd_check_for_exciting_move(void) +{ + int result = 0; + int i; + + for(i = 0; i < 4; i++) + { + if(gContestMons[eContestAI->unk41].moves[i]) + { + // why is it using gSharedMem + 0x19325? that does not exist... + if(Contest_GetMoveExcitement(gContestMons[eContestAI->unk41].moves[i]) == 1) + { + result = 1; + break; + } + } + } + + eContestAI->scriptResult = result; + gAIScriptPtr += 1; +} + +static void ContestAICmd_unk_83(void) +{ + ContestAICmd_check_for_exciting_move(); + + if(eContestAI->scriptResult != 0) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 0); + else + gAIScriptPtr += 4; +} + +static void ContestAICmd_unk_84(void) +{ + ContestAICmd_check_for_exciting_move(); + + if(eContestAI->scriptResult == 0) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 0); + else + gAIScriptPtr += 4; +} + +static void ContestAICmd_unk_85(void) +{ + int result = 0; + int i; + u16 arg = T1_READ_16(gAIScriptPtr + 1); + + for(i = 0; i < 4; i++) + { + u16 move = gContestMons[eContestAI->unk41].moves[i]; + if(move == arg) + { + result = 1; + break; + } + } + + eContestAI->scriptResult = result; + gAIScriptPtr += 3; +} + +static void ContestAICmd_unk_86(void) +{ + ContestAICmd_unk_85(); + + if(eContestAI->scriptResult != 0) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 0); + else + gAIScriptPtr += 4; +} + +static void ContestAICmd_unk_87(void) +{ + ContestAICmd_unk_85(); + + if(eContestAI->scriptResult == 0) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 0); + else + gAIScriptPtr += 4; +} diff --git a/src/crt0.s b/src/crt0.s new file mode 100644 index 000000000..049392be9 --- /dev/null +++ b/src/crt0.s @@ -0,0 +1,227 @@ + .include "constants/gba_constants.inc" + .include "constants/misc_constants.inc" + .include "constants/version.inc" + + .syntax unified + + .global Start + + .text + + .arm + +Start: @ 8000000 + b Init + + .include "asm/rom_header.inc" + +@ 80000C0 + .word 0 + + .global GPIOPortData +GPIOPortData: @ 80000C4 + .hword 0 + + .global GPIOPortDirection +GPIOPortDirection: @ 80000C6 + .hword 0 + + .global GPIOPortReadEnable +GPIOPortReadEnable: @ 80000C8 + .hword 0 + + .space 6 + +@ 80000D0 + +@ TODO: figure out what this data is + + .ifdef GERMAN + .4byte 0xFFFFFFFF + .4byte 0xFFFFFFFF + .4byte 0xFFFFFFFF + .4byte 0xFFFFFFFF + .4byte 0xFFFFFFFF + .4byte 0xFFFFFFFF + .4byte 0xFFFFFFFF + .4byte 0xFFFFFFFF + .4byte 0xFFFFFFFF + .4byte 0xFFFFFFFF + .4byte 0xFFFFFFFF + .4byte 0xFFFFFFFF + .4byte GAME_VERSION + .4byte GAME_LANGUAGE + .ifdef SAPPHIRE + .ascii "pokemon sapphire version" + .space 8 + .else + .ascii "pokemon ruby version" + .space 12 + .endif + .4byte gMonFrontPicTable + .4byte gMonBackPicTable + .4byte gMonPaletteTable + .4byte gMonShinyPaletteTable + .4byte gMonIconTable + .4byte gMonIconPaletteIndices + .4byte gMonIconPaletteTable + .4byte gSpeciesNames + .4byte gMoveNames + .4byte gDecorations + .4byte 0x1220 + .4byte 0x1340 + .4byte 0x18 + .4byte 0x938 + .4byte 0x3A8C + .4byte 0x46 + .4byte 0x836 + .4byte 0x84C + .4byte 0x182 + .4byte 0xA0A0A07 + .4byte 0xC060C0C + .4byte 0xC121006 + .4byte 0x8010B0F + .4byte 0xC + .4byte 0x890 + .4byte 0x3AC0 + .4byte 0x234 + .4byte 0x238 + .4byte 9 + .4byte 0xA + .4byte 0 + .4byte 8 + .4byte 0x556 + .4byte 0x557 + .4byte 0x312F + .4byte 0x311B + .4byte 0 + .4byte 0 + .4byte 0 + .4byte 0 + .4byte 0 + .4byte 0 + .4byte 0 + .4byte 0 + .4byte 0 + .4byte 0 + .4byte 0 + .4byte 0 + .4byte 0 + .4byte 0 + .4byte 0 + .4byte 0 + .4byte 0 + .4byte 0 + .4byte 0xFFFFFFFF + .endif + + .arm + .align 2, 0 + .global Init +Init: + 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 + mov lr, pc + bx r1 + b Init + + .align 2, 0 +sp_sys: .word IWRAM_END - 0x1a0 +sp_irq: .word IWRAM_END - 0x60 + + .arm + .align 2, 0 + .global IntrMain +IntrMain: + 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, 1 + strh r0, [r3, OFFSET_REG_IME - 0x200] + and r1, r2, r2, lsr 16 + mov r12, 0 + 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_VCOUNT + 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] +IntrMain_Loop: + bne IntrMain_Loop +IntrMain_FoundIntr: + strh r0, [r3, OFFSET_REG_IF - 0x200] + mov r1, INTR_FLAG_SERIAL | INTR_FLAG_TIMER3 | INTR_FLAG_HBLANK + bic r2, r2, r0 + 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/battle_strings_de.h b/src/data/battle_strings_de.h index a3d51f2a5..a19c0fc6c 100755..100644 --- a/src/data/battle_strings_de.h +++ b/src/data/battle_strings_de.h @@ -1218,7 +1218,7 @@ const u8 *const gBattleStringsTable[] = }; // below are lists of battle string enums and NOT pointers to the strings. -const u16 gMissStrings[] = +const u16 gMissStringIds[] = { BATTLE_TEXT_AttackMissed, BATTLE_TEXT_ProtectedItself, diff --git a/src/data/battle_strings_en.h b/src/data/battle_strings_en.h index f29e48410..67eb70ee1 100755..100644 --- a/src/data/battle_strings_en.h +++ b/src/data/battle_strings_en.h @@ -1218,7 +1218,7 @@ const u8 *const gBattleStringsTable[] = }; // below are lists of battle string enums and NOT pointers to the strings. -const u16 gMissStrings[] = +const u16 gMissStringIds[] = { BATTLE_TEXT_AttackMissed, BATTLE_TEXT_ProtectedItself, diff --git a/src/data/battle_tower/trainers.h b/src/data/battle_tower/trainers.h index b5eb3da7a..ae204f8ea 100644 --- a/src/data/battle_tower/trainers.h +++ b/src/data/battle_tower/trainers.h @@ -1,7 +1,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = { { - .trainerClass = TRAINER_CLASS_YOUNGSTER, + .trainerClass = FACILITY_CLASS_YOUNGSTER, .name = _("ALVIN"), .teamFlags = 0x01, .greeting = { @@ -16,7 +16,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .trainerClass = FACILITY_CLASS_BIRD_KEEPER, .name = _("DIRK"), .teamFlags = 0x01, .greeting = { @@ -31,7 +31,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_LADY, + .trainerClass = FACILITY_CLASS_LADY, .name = _("CYBIL"), .teamFlags = 0x02, .greeting = { @@ -46,7 +46,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BLACK_BELT, + .trainerClass = FACILITY_CLASS_BLACK_BELT, .name = _("CHEN"), .teamFlags = 0x05, .greeting = { @@ -61,7 +61,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_NINJA_BOY, + .trainerClass = FACILITY_CLASS_NINJA_BOY, .name = _("YOSHI"), .teamFlags = 0x05, .greeting = { @@ -76,7 +76,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SCHOOL_KID_F, + .trainerClass = FACILITY_CLASS_SCHOOL_KID_F, .name = _("TINA"), .teamFlags = 0x0A, .greeting = { @@ -91,7 +91,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BUG_MANIAC, + .trainerClass = FACILITY_CLASS_BUG_MANIAC, .name = _("COREY"), .teamFlags = 0x41, .greeting = { @@ -106,7 +106,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_FISHERMAN, + .trainerClass = FACILITY_CLASS_FISHERMAN, .name = _("GORDON"), .teamFlags = 0x01, .greeting = { @@ -121,7 +121,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_TUBER_F, + .trainerClass = FACILITY_CLASS_TUBER_F, .name = _("ANN"), .teamFlags = 0x02, .greeting = { @@ -136,7 +136,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEFAN_F, + .trainerClass = FACILITY_CLASS_POKEFAN_F, .name = _("JULIA"), .teamFlags = 0x42, .greeting = { @@ -151,7 +151,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_GENTLEMAN, + .trainerClass = FACILITY_CLASS_GENTLEMAN, .name = _("GREGORY"), .teamFlags = 0x01, .greeting = { @@ -166,7 +166,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_CAMPER, + .trainerClass = FACILITY_CLASS_CAMPER, .name = _("KEITH"), .teamFlags = 0x01, .greeting = { @@ -181,7 +181,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_RUNNING_TRIATHLETE_F, + .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_F, .name = _("KENDRA"), .teamFlags = 0x0A, .greeting = { @@ -196,7 +196,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_HIKER, + .trainerClass = FACILITY_CLASS_HIKER, .name = _("DEV"), .teamFlags = 0x01, .greeting = { @@ -211,7 +211,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .trainerClass = FACILITY_CLASS_BATTLE_GIRL, .name = _("CASSIE"), .teamFlags = 0x0A, .greeting = { @@ -226,7 +226,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_PSYCHIC_M, + .trainerClass = FACILITY_CLASS_PSYCHIC_M, .name = _("JULIAN"), .teamFlags = 0x05, .greeting = { @@ -241,7 +241,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_LASS, + .trainerClass = FACILITY_CLASS_LASS, .name = _("JOYCE"), .teamFlags = 0x02, .greeting = { @@ -256,7 +256,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_GUITARIST, + .trainerClass = FACILITY_CLASS_GUITARIST, .name = _("LES"), .teamFlags = 0x01, .greeting = { @@ -271,7 +271,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_RICH_BOY, + .trainerClass = FACILITY_CLASS_RICH_BOY, .name = _("CLINTON"), .teamFlags = 0x01, .greeting = { @@ -286,7 +286,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BUG_CATCHER, + .trainerClass = FACILITY_CLASS_BUG_CATCHER, .name = _("LEWIS"), .teamFlags = 0x01, .greeting = { @@ -301,7 +301,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_PICNICKER, + .trainerClass = FACILITY_CLASS_PICNICKER, .name = _("RACHAEL"), .teamFlags = 0x02, .greeting = { @@ -316,7 +316,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_COLLECTOR, + .trainerClass = FACILITY_CLASS_COLLECTOR, .name = _("HAROLD"), .teamFlags = 0x09, .greeting = { @@ -331,7 +331,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_TUBER_M, + .trainerClass = FACILITY_CLASS_TUBER_M, .name = _("KIPP"), .teamFlags = 0x01, .greeting = { @@ -346,7 +346,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_KINDLER, + .trainerClass = FACILITY_CLASS_KINDLER, .name = _("IRWIN"), .teamFlags = 0x05, .greeting = { @@ -361,7 +361,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_PSYCHIC_F, + .trainerClass = FACILITY_CLASS_PSYCHIC_F, .name = _("EILEEN"), .teamFlags = 0x0A, .greeting = { @@ -376,7 +376,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMER_F, + .trainerClass = FACILITY_CLASS_SWIMMER_F, .name = _("ANNE"), .teamFlags = 0x02, .greeting = { @@ -391,7 +391,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_CYCLING_TRIATHLETE_F, + .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_F, .name = _("RUTH"), .teamFlags = 0x06, .greeting = { @@ -406,7 +406,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMANIAC, + .trainerClass = FACILITY_CLASS_POKEMANIAC, .name = _("JEREMY"), .teamFlags = 0x40, .greeting = { @@ -421,7 +421,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SAILOR, + .trainerClass = FACILITY_CLASS_SAILOR, .name = _("TREVOR"), .teamFlags = 0x09, .greeting = { @@ -436,7 +436,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_BREEDER_F, + .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_F, .name = _("COLETTE"), .teamFlags = 0x06, .greeting = { @@ -451,7 +451,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_HEX_MANIAC, + .trainerClass = FACILITY_CLASS_HEX_MANIAC, .name = _("PAULA"), .teamFlags = 0x42, .greeting = { @@ -466,7 +466,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, + .trainerClass = FACILITY_CLASS_RUIN_MANIAC, .name = _("STANLY"), .teamFlags = 0x41, .greeting = { @@ -481,7 +481,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMING_TRIATHLETE_M, + .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, .name = _("TROY"), .teamFlags = 0x09, .greeting = { @@ -496,7 +496,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SCHOOL_KID_M, + .trainerClass = FACILITY_CLASS_SCHOOL_KID_M, .name = _("ED"), .teamFlags = 0x08, .greeting = { @@ -511,7 +511,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_RANGER_F, + .trainerClass = FACILITY_CLASS_POKEMON_RANGER_F, .name = _("ELLEN"), .teamFlags = 0x04, .greeting = { @@ -526,7 +526,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMER_M, + .trainerClass = FACILITY_CLASS_SWIMMER_M, .name = _("ARNIE"), .teamFlags = 0x09, .greeting = { @@ -541,7 +541,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_RUNNING_TRIATHLETE_M, + .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_M, .name = _("HAL"), .teamFlags = 0x09, .greeting = { @@ -556,7 +556,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BEAUTY, + .trainerClass = FACILITY_CLASS_BEAUTY, .name = _("LAUREN"), .teamFlags = 0x06, .greeting = { @@ -571,7 +571,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_AROMA_LADY, + .trainerClass = FACILITY_CLASS_AROMA_LADY, .name = _("STACY"), .teamFlags = 0x06, .greeting = { @@ -586,7 +586,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_COLLECTOR, + .trainerClass = FACILITY_CLASS_COLLECTOR, .name = _("DARYL"), .teamFlags = 0x81, .greeting = { @@ -601,7 +601,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMING_TRIATHLETE_F, + .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_F, .name = _("KATHY"), .teamFlags = 0x04, .greeting = { @@ -616,7 +616,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_RANGER_M, + .trainerClass = FACILITY_CLASS_POKEMON_RANGER_M, .name = _("HARRIS"), .teamFlags = 0x0C, .greeting = { @@ -631,7 +631,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEFAN_M, + .trainerClass = FACILITY_CLASS_POKEFAN_M, .name = _("GLENN"), .teamFlags = 0x80, .greeting = { @@ -646,7 +646,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_CYCLING_TRIATHLETE_M, + .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_M, .name = _("NICO"), .teamFlags = 0x04, .greeting = { @@ -661,7 +661,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_BREEDER_M, + .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_M, .name = _("BAILEY"), .teamFlags = 0x41, .greeting = { @@ -676,7 +676,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_PARASOL_LADY, + .trainerClass = FACILITY_CLASS_PARASOL_LADY, .name = _("ABBIE"), .teamFlags = 0x08, .greeting = { @@ -691,7 +691,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_CAMPER, + .trainerClass = FACILITY_CLASS_CAMPER, .name = _("AL"), .teamFlags = 0x0C, .greeting = { @@ -706,7 +706,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SCHOOL_KID_F, + .trainerClass = FACILITY_CLASS_SCHOOL_KID_F, .name = _("PEGGY"), .teamFlags = 0x42, .greeting = { @@ -721,7 +721,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BEAUTY, + .trainerClass = FACILITY_CLASS_BEAUTY, .name = _("NAOMI"), .teamFlags = 0x04, .greeting = { @@ -736,7 +736,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_NINJA_BOY, + .trainerClass = FACILITY_CLASS_NINJA_BOY, .name = _("KENJI"), .teamFlags = 0x0C, .greeting = { @@ -751,7 +751,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_CYCLING_TRIATHLETE_M, + .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_M, .name = _("ROSS"), .teamFlags = 0x01, .greeting = { @@ -766,7 +766,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_RANGER_F, + .trainerClass = FACILITY_CLASS_POKEMON_RANGER_F, .name = _("EDNA"), .teamFlags = 0x02, .greeting = { @@ -781,7 +781,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, + .trainerClass = FACILITY_CLASS_RUIN_MANIAC, .name = _("ANTON"), .teamFlags = 0x41, .greeting = { @@ -796,7 +796,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMER_M, + .trainerClass = FACILITY_CLASS_SWIMMER_M, .name = _("MITCH"), .teamFlags = 0x81, .greeting = { @@ -811,7 +811,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_HEX_MANIAC, + .trainerClass = FACILITY_CLASS_HEX_MANIAC, .name = _("ROD"), .teamFlags = 0x42, .greeting = { @@ -826,7 +826,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_RUNNING_TRIATHLETE_M, + .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_M, .name = _("RICH"), .teamFlags = 0x01, .greeting = { @@ -841,7 +841,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEFAN_M, + .trainerClass = FACILITY_CLASS_POKEFAN_M, .name = _("DANIEL"), .teamFlags = 0x80, .greeting = { @@ -856,7 +856,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_PSYCHIC_F, + .trainerClass = FACILITY_CLASS_PSYCHIC_F, .name = _("GLORIA"), .teamFlags = 0x82, .greeting = { @@ -871,7 +871,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_GUITARIST, + .trainerClass = FACILITY_CLASS_GUITARIST, .name = _("NELSON"), .teamFlags = 0x01, .greeting = { @@ -886,7 +886,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_KINDLER, + .trainerClass = FACILITY_CLASS_KINDLER, .name = _("FERRIS"), .teamFlags = 0x41, .greeting = { @@ -901,7 +901,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_AROMA_LADY, + .trainerClass = FACILITY_CLASS_AROMA_LADY, .name = _("AMANDA"), .teamFlags = 0x82, .greeting = { @@ -916,7 +916,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMING_TRIATHLETE_M, + .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, .name = _("MASON"), .teamFlags = 0x10, .greeting = { @@ -931,7 +931,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_DRAGON_TAMER, + .trainerClass = FACILITY_CLASS_DRAGON_TAMER, .name = _("NATE"), .teamFlags = 0x10, .greeting = { @@ -946,7 +946,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_LASS, + .trainerClass = FACILITY_CLASS_LASS, .name = _("MIRIAM"), .teamFlags = 0x82, .greeting = { @@ -961,7 +961,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMANIAC, + .trainerClass = FACILITY_CLASS_POKEMANIAC, .name = _("THEO"), .teamFlags = 0x40, .greeting = { @@ -976,7 +976,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMING_TRIATHLETE_F, + .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_F, .name = _("PAMELA"), .teamFlags = 0x10, .greeting = { @@ -991,7 +991,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEFAN_F, + .trainerClass = FACILITY_CLASS_POKEFAN_F, .name = _("ALISSA"), .teamFlags = 0x20, .greeting = { @@ -1006,7 +1006,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_GENTLEMAN, + .trainerClass = FACILITY_CLASS_GENTLEMAN, .name = _("ARTHUR"), .teamFlags = 0x20, .greeting = { @@ -1021,7 +1021,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMER_F, + .trainerClass = FACILITY_CLASS_SWIMMER_F, .name = _("MARCY"), .teamFlags = 0x82, .greeting = { @@ -1036,7 +1036,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_COOL_TRAINER_M, + .trainerClass = FACILITY_CLASS_COOL_TRAINER_M, .name = _("MILLER"), .teamFlags = 0x10, .greeting = { @@ -1051,7 +1051,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .trainerClass = FACILITY_CLASS_BIRD_KEEPER, .name = _("OLIVER"), .teamFlags = 0x11, .greeting = { @@ -1066,7 +1066,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_CYCLING_TRIATHLETE_F, + .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_F, .name = _("MOLLY"), .teamFlags = 0x12, .greeting = { @@ -1081,7 +1081,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BUG_MANIAC, + .trainerClass = FACILITY_CLASS_BUG_MANIAC, .name = _("JASON"), .teamFlags = 0x40, .greeting = { @@ -1096,7 +1096,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .trainerClass = FACILITY_CLASS_BATTLE_GIRL, .name = _("AVA"), .teamFlags = 0x20, .greeting = { @@ -1111,7 +1111,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_FISHERMAN, + .trainerClass = FACILITY_CLASS_FISHERMAN, .name = _("HANK"), .teamFlags = 0x10, .greeting = { @@ -1126,7 +1126,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SAILOR, + .trainerClass = FACILITY_CLASS_SAILOR, .name = _("PETER"), .teamFlags = 0x20, .greeting = { @@ -1141,7 +1141,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_EXPERT_F, + .trainerClass = FACILITY_CLASS_EXPERT_F, .name = _("MINDY"), .teamFlags = 0x20, .greeting = { @@ -1156,7 +1156,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BUG_MANIAC, + .trainerClass = FACILITY_CLASS_BUG_MANIAC, .name = _("DWIGHT"), .teamFlags = 0x11, .greeting = { @@ -1171,7 +1171,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_BREEDER_F, + .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_F, .name = _("REENA"), .teamFlags = 0x12, .greeting = { @@ -1186,7 +1186,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_PARASOL_LADY, + .trainerClass = FACILITY_CLASS_PARASOL_LADY, .name = _("MEGAN"), .teamFlags = 0x10, .greeting = { @@ -1201,7 +1201,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_RUNNING_TRIATHLETE_F, + .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_F, .name = _("SIERRA"), .teamFlags = 0x04, .greeting = { @@ -1216,7 +1216,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_RANGER_M, + .trainerClass = FACILITY_CLASS_POKEMON_RANGER_M, .name = _("ARNOLD"), .teamFlags = 0x08, .greeting = { @@ -1231,7 +1231,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BLACK_BELT, + .trainerClass = FACILITY_CLASS_BLACK_BELT, .name = _("XIN"), .teamFlags = 0x04, .greeting = { @@ -1246,7 +1246,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_COOL_TRAINER_F, + .trainerClass = FACILITY_CLASS_COOL_TRAINER_F, .name = _("KELLY"), .teamFlags = 0x02, .greeting = { @@ -1261,7 +1261,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_COLLECTOR, + .trainerClass = FACILITY_CLASS_COLLECTOR, .name = _("VANCE"), .teamFlags = 0x80, .greeting = { @@ -1276,7 +1276,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMING_TRIATHLETE_M, + .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, .name = _("TOBY"), .teamFlags = 0x01, .greeting = { @@ -1291,7 +1291,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_GENTLEMAN, + .trainerClass = FACILITY_CLASS_GENTLEMAN, .name = _("NORTON"), .teamFlags = 0x20, .greeting = { @@ -1306,7 +1306,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .trainerClass = FACILITY_CLASS_BATTLE_GIRL, .name = _("ZOE"), .teamFlags = 0x02, .greeting = { @@ -1321,7 +1321,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BEAUTY, + .trainerClass = FACILITY_CLASS_BEAUTY, .name = _("EMMA"), .teamFlags = 0x20, .greeting = { @@ -1336,7 +1336,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_HIKER, + .trainerClass = FACILITY_CLASS_HIKER, .name = _("VINCE"), .teamFlags = 0x04, .greeting = { @@ -1351,7 +1351,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_EXPERT_M, + .trainerClass = FACILITY_CLASS_EXPERT_M, .name = _("MARV"), .teamFlags = 0x10, .greeting = { @@ -1366,7 +1366,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_BREEDER_M, + .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_M, .name = _("TODD"), .teamFlags = 0x40, .greeting = { @@ -1381,7 +1381,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_GUITARIST, + .trainerClass = FACILITY_CLASS_GUITARIST, .name = _("GAVIN"), .teamFlags = 0x01, .greeting = { @@ -1396,7 +1396,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_PSYCHIC_M, + .trainerClass = FACILITY_CLASS_PSYCHIC_M, .name = _("QUINN"), .teamFlags = 0x08, .greeting = { @@ -1411,7 +1411,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_COOL_TRAINER_F, + .trainerClass = FACILITY_CLASS_COOL_TRAINER_F, .name = _("JENN"), .teamFlags = 0x02, .greeting = { @@ -1426,7 +1426,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_EXPERT_M, + .trainerClass = FACILITY_CLASS_EXPERT_M, .name = _("JOEL"), .teamFlags = 0x10, .greeting = { @@ -1441,7 +1441,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_DRAGON_TAMER, + .trainerClass = FACILITY_CLASS_DRAGON_TAMER, .name = _("KYLE"), .teamFlags = 0x0C, .greeting = { @@ -1456,7 +1456,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_COOL_TRAINER_M, + .trainerClass = FACILITY_CLASS_COOL_TRAINER_M, .name = _("BRET"), .teamFlags = 0x01, .greeting = { @@ -1471,7 +1471,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_EXPERT_F, + .trainerClass = FACILITY_CLASS_EXPERT_F, .name = _("CARRIE"), .teamFlags = 0x10, .greeting = { @@ -1486,7 +1486,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_LADY, + .trainerClass = FACILITY_CLASS_LADY, .name = _("GILLIAN"), .teamFlags = 0x02, .greeting = { diff --git a/src/data/battle_tower/trainers_de.h b/src/data/battle_tower/trainers_de.h index 86182da9d..db226c6a6 100644 --- a/src/data/battle_tower/trainers_de.h +++ b/src/data/battle_tower/trainers_de.h @@ -1,7 +1,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = { { - .trainerClass = TRAINER_CLASS_YOUNGSTER, + .trainerClass = FACILITY_CLASS_YOUNGSTER, .name = _("ALWIN"), .teamFlags = 0x01, .greeting = { @@ -16,7 +16,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .trainerClass = FACILITY_CLASS_BIRD_KEEPER, .name = _("DIRK"), .teamFlags = 0x01, .greeting = { @@ -31,7 +31,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_LADY, + .trainerClass = FACILITY_CLASS_LADY, .name = _("SIBILLE"), .teamFlags = 0x02, .greeting = { @@ -46,7 +46,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BLACK_BELT, + .trainerClass = FACILITY_CLASS_BLACK_BELT, .name = _("OLAF"), .teamFlags = 0x05, .greeting = { @@ -61,7 +61,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_NINJA_BOY, + .trainerClass = FACILITY_CLASS_NINJA_BOY, .name = _("JOST"), .teamFlags = 0x05, .greeting = { @@ -76,7 +76,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SCHOOL_KID_F, + .trainerClass = FACILITY_CLASS_SCHOOL_KID_F, .name = _("TINA"), .teamFlags = 0x0A, .greeting = { @@ -91,7 +91,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BUG_MANIAC, + .trainerClass = FACILITY_CLASS_BUG_MANIAC, .name = _("HAJO"), .teamFlags = 0x41, .greeting = { @@ -106,7 +106,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_FISHERMAN, + .trainerClass = FACILITY_CLASS_FISHERMAN, .name = _("GEORG"), .teamFlags = 0x01, .greeting = { @@ -121,7 +121,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_TUBER_F, + .trainerClass = FACILITY_CLASS_TUBER_F, .name = _("ANNE"), .teamFlags = 0x02, .greeting = { @@ -136,7 +136,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEFAN_F, + .trainerClass = FACILITY_CLASS_POKEFAN_F, .name = _("JULIA"), .teamFlags = 0x42, .greeting = { @@ -151,7 +151,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_GENTLEMAN, + .trainerClass = FACILITY_CLASS_GENTLEMAN, .name = _("JOHANN"), .teamFlags = 0x01, .greeting = { @@ -166,7 +166,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_CAMPER, + .trainerClass = FACILITY_CLASS_CAMPER, .name = _("KARL"), .teamFlags = 0x01, .greeting = { @@ -181,7 +181,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_RUNNING_TRIATHLETE_F, + .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_F, .name = _("KENDRA"), .teamFlags = 0x0A, .greeting = { @@ -196,7 +196,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_HIKER, + .trainerClass = FACILITY_CLASS_HIKER, .name = _("DAVID"), .teamFlags = 0x01, .greeting = { @@ -211,7 +211,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .trainerClass = FACILITY_CLASS_BATTLE_GIRL, .name = _("KEA"), .teamFlags = 0x0A, .greeting = { @@ -226,7 +226,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_PSYCHIC_M, + .trainerClass = FACILITY_CLASS_PSYCHIC_M, .name = _("JULIAN"), .teamFlags = 0x05, .greeting = { @@ -241,7 +241,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_LASS, + .trainerClass = FACILITY_CLASS_LASS, .name = _("JOSI"), .teamFlags = 0x02, .greeting = { @@ -256,7 +256,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_GUITARIST, + .trainerClass = FACILITY_CLASS_GUITARIST, .name = _("LEIF"), .teamFlags = 0x01, .greeting = { @@ -271,7 +271,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_RICH_BOY, + .trainerClass = FACILITY_CLASS_RICH_BOY, .name = _("INGO"), .teamFlags = 0x01, .greeting = { @@ -286,7 +286,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BUG_CATCHER, + .trainerClass = FACILITY_CLASS_BUG_CATCHER, .name = _("LUDWIG"), .teamFlags = 0x01, .greeting = { @@ -301,7 +301,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_PICNICKER, + .trainerClass = FACILITY_CLASS_PICNICKER, .name = _("RAJA"), .teamFlags = 0x02, .greeting = { @@ -316,7 +316,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_COLLECTOR, + .trainerClass = FACILITY_CLASS_COLLECTOR, .name = _("HARALD"), .teamFlags = 0x09, .greeting = { @@ -331,7 +331,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_TUBER_M, + .trainerClass = FACILITY_CLASS_TUBER_M, .name = _("KIM"), .teamFlags = 0x01, .greeting = { @@ -346,7 +346,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_KINDLER, + .trainerClass = FACILITY_CLASS_KINDLER, .name = _("ERWIN"), .teamFlags = 0x05, .greeting = { @@ -361,7 +361,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_PSYCHIC_F, + .trainerClass = FACILITY_CLASS_PSYCHIC_F, .name = _("EIKA"), .teamFlags = 0x0A, .greeting = { @@ -376,7 +376,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMER_F, + .trainerClass = FACILITY_CLASS_SWIMMER_F, .name = _("ANNINA"), .teamFlags = 0x02, .greeting = { @@ -391,7 +391,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_CYCLING_TRIATHLETE_F, + .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_F, .name = _("RUTH"), .teamFlags = 0x06, .greeting = { @@ -406,7 +406,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMANIAC, + .trainerClass = FACILITY_CLASS_POKEMANIAC, .name = _("JENS"), .teamFlags = 0x40, .greeting = { @@ -421,7 +421,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SAILOR, + .trainerClass = FACILITY_CLASS_SAILOR, .name = _("TITUS"), .teamFlags = 0x09, .greeting = { @@ -436,7 +436,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_BREEDER_F, + .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_F, .name = _("NICOLA"), .teamFlags = 0x06, .greeting = { @@ -451,7 +451,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_HEX_MANIAC, + .trainerClass = FACILITY_CLASS_HEX_MANIAC, .name = _("PAULA"), .teamFlags = 0x42, .greeting = { @@ -466,7 +466,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, + .trainerClass = FACILITY_CLASS_RUIN_MANIAC, .name = _("SÖREN"), .teamFlags = 0x41, .greeting = { @@ -481,7 +481,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMING_TRIATHLETE_M, + .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, .name = _("RAINER"), .teamFlags = 0x09, .greeting = { @@ -496,7 +496,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SCHOOL_KID_M, + .trainerClass = FACILITY_CLASS_SCHOOL_KID_M, .name = _("FABIAN"), .teamFlags = 0x08, .greeting = { @@ -511,7 +511,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_RANGER_F, + .trainerClass = FACILITY_CLASS_POKEMON_RANGER_F, .name = _("ELLEN"), .teamFlags = 0x04, .greeting = { @@ -526,7 +526,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMER_M, + .trainerClass = FACILITY_CLASS_SWIMMER_M, .name = _("ARNIE"), .teamFlags = 0x09, .greeting = { @@ -541,7 +541,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_RUNNING_TRIATHLETE_M, + .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_M, .name = _("HARDI"), .teamFlags = 0x09, .greeting = { @@ -556,7 +556,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BEAUTY, + .trainerClass = FACILITY_CLASS_BEAUTY, .name = _("LINA"), .teamFlags = 0x06, .greeting = { @@ -571,7 +571,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_AROMA_LADY, + .trainerClass = FACILITY_CLASS_AROMA_LADY, .name = _("SELINA"), .teamFlags = 0x06, .greeting = { @@ -586,7 +586,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_COLLECTOR, + .trainerClass = FACILITY_CLASS_COLLECTOR, .name = _("DANTE"), .teamFlags = 0x81, .greeting = { @@ -601,7 +601,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMING_TRIATHLETE_F, + .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_F, .name = _("KATJA"), .teamFlags = 0x04, .greeting = { @@ -616,7 +616,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_RANGER_M, + .trainerClass = FACILITY_CLASS_POKEMON_RANGER_M, .name = _("HORST"), .teamFlags = 0x0C, .greeting = { @@ -631,7 +631,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEFAN_M, + .trainerClass = FACILITY_CLASS_POKEFAN_M, .name = _("GERRIT"), .teamFlags = 0x80, .greeting = { @@ -646,7 +646,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_CYCLING_TRIATHLETE_M, + .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_M, .name = _("NIKO"), .teamFlags = 0x04, .greeting = { @@ -661,7 +661,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_BREEDER_M, + .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_M, .name = _("BALDO"), .teamFlags = 0x41, .greeting = { @@ -676,7 +676,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_PARASOL_LADY, + .trainerClass = FACILITY_CLASS_PARASOL_LADY, .name = _("ALMA"), .teamFlags = 0x08, .greeting = { @@ -691,7 +691,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_CAMPER, + .trainerClass = FACILITY_CLASS_CAMPER, .name = _("ADAM"), .teamFlags = 0x0C, .greeting = { @@ -706,7 +706,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SCHOOL_KID_F, + .trainerClass = FACILITY_CLASS_SCHOOL_KID_F, .name = _("GRETE"), .teamFlags = 0x42, .greeting = { @@ -721,7 +721,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BEAUTY, + .trainerClass = FACILITY_CLASS_BEAUTY, .name = _("NAOMI"), .teamFlags = 0x04, .greeting = { @@ -736,7 +736,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_NINJA_BOY, + .trainerClass = FACILITY_CLASS_NINJA_BOY, .name = _("KENO"), .teamFlags = 0x0C, .greeting = { @@ -751,7 +751,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_CYCLING_TRIATHLETE_M, + .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_M, .name = _("REMUS"), .teamFlags = 0x01, .greeting = { @@ -766,7 +766,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_RANGER_F, + .trainerClass = FACILITY_CLASS_POKEMON_RANGER_F, .name = _("EDITH"), .teamFlags = 0x02, .greeting = { @@ -781,7 +781,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, + .trainerClass = FACILITY_CLASS_RUIN_MANIAC, .name = _("ANTON"), .teamFlags = 0x41, .greeting = { @@ -796,7 +796,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMER_M, + .trainerClass = FACILITY_CLASS_SWIMMER_M, .name = _("MALTE"), .teamFlags = 0x81, .greeting = { @@ -811,7 +811,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_HEX_MANIAC, + .trainerClass = FACILITY_CLASS_HEX_MANIAC, .name = _("RAOUL"), .teamFlags = 0x42, .greeting = { @@ -826,7 +826,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_RUNNING_TRIATHLETE_M, + .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_M, .name = _("RICK"), .teamFlags = 0x01, .greeting = { @@ -841,7 +841,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEFAN_M, + .trainerClass = FACILITY_CLASS_POKEFAN_M, .name = _("DENNIS"), .teamFlags = 0x80, .greeting = { @@ -856,7 +856,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_PSYCHIC_F, + .trainerClass = FACILITY_CLASS_PSYCHIC_F, .name = _("GLORIA"), .teamFlags = 0x82, .greeting = { @@ -871,7 +871,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_GUITARIST, + .trainerClass = FACILITY_CLASS_GUITARIST, .name = _("NINO"), .teamFlags = 0x01, .greeting = { @@ -886,7 +886,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_KINDLER, + .trainerClass = FACILITY_CLASS_KINDLER, .name = _("FIETE"), .teamFlags = 0x41, .greeting = { @@ -901,7 +901,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_AROMA_LADY, + .trainerClass = FACILITY_CLASS_AROMA_LADY, .name = _("AMANDA"), .teamFlags = 0x82, .greeting = { @@ -916,7 +916,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMING_TRIATHLETE_M, + .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, .name = _("MAREK"), .teamFlags = 0x10, .greeting = { @@ -931,7 +931,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_DRAGON_TAMER, + .trainerClass = FACILITY_CLASS_DRAGON_TAMER, .name = _("NATHAN"), .teamFlags = 0x10, .greeting = { @@ -946,7 +946,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_LASS, + .trainerClass = FACILITY_CLASS_LASS, .name = _("MIRIAM"), .teamFlags = 0x82, .greeting = { @@ -961,7 +961,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMANIAC, + .trainerClass = FACILITY_CLASS_POKEMANIAC, .name = _("THEO"), .teamFlags = 0x40, .greeting = { @@ -976,7 +976,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMING_TRIATHLETE_F, + .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_F, .name = _("PIA"), .teamFlags = 0x10, .greeting = { @@ -991,7 +991,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEFAN_F, + .trainerClass = FACILITY_CLASS_POKEFAN_F, .name = _("ALISSA"), .teamFlags = 0x20, .greeting = { @@ -1006,7 +1006,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_GENTLEMAN, + .trainerClass = FACILITY_CLASS_GENTLEMAN, .name = _("ARTUR"), .teamFlags = 0x20, .greeting = { @@ -1021,7 +1021,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMER_F, + .trainerClass = FACILITY_CLASS_SWIMMER_F, .name = _("MAJA"), .teamFlags = 0x82, .greeting = { @@ -1036,7 +1036,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_COOL_TRAINER_M, + .trainerClass = FACILITY_CLASS_COOL_TRAINER_M, .name = _("MARIUS"), .teamFlags = 0x10, .greeting = { @@ -1051,7 +1051,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .trainerClass = FACILITY_CLASS_BIRD_KEEPER, .name = _("OLIVER"), .teamFlags = 0x11, .greeting = { @@ -1066,7 +1066,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_CYCLING_TRIATHLETE_F, + .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_F, .name = _("MOLLY"), .teamFlags = 0x12, .greeting = { @@ -1081,7 +1081,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BUG_MANIAC, + .trainerClass = FACILITY_CLASS_BUG_MANIAC, .name = _("JÖRG"), .teamFlags = 0x40, .greeting = { @@ -1096,7 +1096,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .trainerClass = FACILITY_CLASS_BATTLE_GIRL, .name = _("ANKE"), .teamFlags = 0x20, .greeting = { @@ -1111,7 +1111,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_FISHERMAN, + .trainerClass = FACILITY_CLASS_FISHERMAN, .name = _("HANS"), .teamFlags = 0x10, .greeting = { @@ -1126,7 +1126,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SAILOR, + .trainerClass = FACILITY_CLASS_SAILOR, .name = _("PETER"), .teamFlags = 0x20, .greeting = { @@ -1141,7 +1141,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_EXPERT_F, + .trainerClass = FACILITY_CLASS_EXPERT_F, .name = _("MARA"), .teamFlags = 0x20, .greeting = { @@ -1156,7 +1156,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BUG_MANIAC, + .trainerClass = FACILITY_CLASS_BUG_MANIAC, .name = _("DARIUS"), .teamFlags = 0x11, .greeting = { @@ -1171,7 +1171,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_BREEDER_F, + .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_F, .name = _("REGINA"), .teamFlags = 0x12, .greeting = { @@ -1186,7 +1186,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_PARASOL_LADY, + .trainerClass = FACILITY_CLASS_PARASOL_LADY, .name = _("MAIKE"), .teamFlags = 0x10, .greeting = { @@ -1201,7 +1201,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_RUNNING_TRIATHLETE_F, + .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_F, .name = _("SANDRA"), .teamFlags = 0x04, .greeting = { @@ -1216,7 +1216,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_RANGER_M, + .trainerClass = FACILITY_CLASS_POKEMON_RANGER_M, .name = _("ARNOLD"), .teamFlags = 0x08, .greeting = { @@ -1231,7 +1231,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BLACK_BELT, + .trainerClass = FACILITY_CLASS_BLACK_BELT, .name = _("XENO"), .teamFlags = 0x04, .greeting = { @@ -1246,7 +1246,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_COOL_TRAINER_F, + .trainerClass = FACILITY_CLASS_COOL_TRAINER_F, .name = _("KARLA"), .teamFlags = 0x02, .greeting = { @@ -1261,7 +1261,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_COLLECTOR, + .trainerClass = FACILITY_CLASS_COLLECTOR, .name = _("VOLKER"), .teamFlags = 0x80, .greeting = { @@ -1276,7 +1276,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMING_TRIATHLETE_M, + .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, .name = _("TOBIAS"), .teamFlags = 0x01, .greeting = { @@ -1291,7 +1291,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_GENTLEMAN, + .trainerClass = FACILITY_CLASS_GENTLEMAN, .name = _("NORBERT"), .teamFlags = 0x20, .greeting = { @@ -1306,7 +1306,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .trainerClass = FACILITY_CLASS_BATTLE_GIRL, .name = _("ZITA"), .teamFlags = 0x02, .greeting = { @@ -1321,7 +1321,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BEAUTY, + .trainerClass = FACILITY_CLASS_BEAUTY, .name = _("ELKE"), .teamFlags = 0x20, .greeting = { @@ -1336,7 +1336,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_HIKER, + .trainerClass = FACILITY_CLASS_HIKER, .name = _("VITUS"), .teamFlags = 0x04, .greeting = { @@ -1351,7 +1351,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_EXPERT_M, + .trainerClass = FACILITY_CLASS_EXPERT_M, .name = _("MALTE"), .teamFlags = 0x10, .greeting = { @@ -1366,7 +1366,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_BREEDER_M, + .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_M, .name = _("TIM"), .teamFlags = 0x40, .greeting = { @@ -1381,7 +1381,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_GUITARIST, + .trainerClass = FACILITY_CLASS_GUITARIST, .name = _("GAVIN"), .teamFlags = 0x01, .greeting = { @@ -1396,7 +1396,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_PSYCHIC_M, + .trainerClass = FACILITY_CLASS_PSYCHIC_M, .name = _("RALF"), .teamFlags = 0x08, .greeting = { @@ -1411,7 +1411,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_COOL_TRAINER_F, + .trainerClass = FACILITY_CLASS_COOL_TRAINER_F, .name = _("JENNY"), .teamFlags = 0x02, .greeting = { @@ -1426,7 +1426,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_EXPERT_M, + .trainerClass = FACILITY_CLASS_EXPERT_M, .name = _("JOEL"), .teamFlags = 0x10, .greeting = { @@ -1441,7 +1441,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_DRAGON_TAMER, + .trainerClass = FACILITY_CLASS_DRAGON_TAMER, .name = _("KOLJA"), .teamFlags = 0x0C, .greeting = { @@ -1456,7 +1456,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_COOL_TRAINER_M, + .trainerClass = FACILITY_CLASS_COOL_TRAINER_M, .name = _("BILL"), .teamFlags = 0x01, .greeting = { @@ -1471,7 +1471,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_EXPERT_F, + .trainerClass = FACILITY_CLASS_EXPERT_F, .name = _("CALLA"), .teamFlags = 0x10, .greeting = { @@ -1486,7 +1486,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_LADY, + .trainerClass = FACILITY_CLASS_LADY, .name = _("GESA"), .teamFlags = 0x02, .greeting = { diff --git a/src/data/credits_de.h b/src/data/credits_de.h index 570c0d4c5..570c0d4c5 100755..100644 --- a/src/data/credits_de.h +++ b/src/data/credits_de.h diff --git a/src/data/credits_en.h b/src/data/credits_en.h index 8ce0bad03..8ce0bad03 100755..100644 --- a/src/data/credits_en.h +++ b/src/data/credits_en.h diff --git a/src/data/items_de.h b/src/data/items_de.h index 0453a95d0..92304e8b0 100644 --- a/src/data/items_de.h +++ b/src/data/items_de.h @@ -4626,7 +4626,7 @@ const struct Item gItems[] = }, { .name = _("TM01"), - .itemId = ITEM_TM01, + .itemId = ITEM_TM01_FOCUS_PUNCH, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4642,7 +4642,7 @@ const struct Item gItems[] = }, { .name = _("TM02"), - .itemId = ITEM_TM02, + .itemId = ITEM_TM02_DRAGON_CLAW, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4658,7 +4658,7 @@ const struct Item gItems[] = }, { .name = _("TM03"), - .itemId = ITEM_TM03, + .itemId = ITEM_TM03_WATER_PULSE, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4674,7 +4674,7 @@ const struct Item gItems[] = }, { .name = _("TM04"), - .itemId = ITEM_TM04, + .itemId = ITEM_TM04_CALM_MIND, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4690,7 +4690,7 @@ const struct Item gItems[] = }, { .name = _("TM05"), - .itemId = ITEM_TM05, + .itemId = ITEM_TM05_ROAR, .price = 1000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4706,7 +4706,7 @@ const struct Item gItems[] = }, { .name = _("TM06"), - .itemId = ITEM_TM06, + .itemId = ITEM_TM06_TOXIC, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4722,7 +4722,7 @@ const struct Item gItems[] = }, { .name = _("TM07"), - .itemId = ITEM_TM07, + .itemId = ITEM_TM07_HAIL, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4738,7 +4738,7 @@ const struct Item gItems[] = }, { .name = _("TM08"), - .itemId = ITEM_TM08, + .itemId = ITEM_TM08_BULK_UP, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4754,7 +4754,7 @@ const struct Item gItems[] = }, { .name = _("TM09"), - .itemId = ITEM_TM09, + .itemId = ITEM_TM09_BULLET_SEED, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4770,7 +4770,7 @@ const struct Item gItems[] = }, { .name = _("TM10"), - .itemId = ITEM_TM10, + .itemId = ITEM_TM10_HIDDEN_POWER, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4786,7 +4786,7 @@ const struct Item gItems[] = }, { .name = _("TM11"), - .itemId = ITEM_TM11, + .itemId = ITEM_TM11_SUNNY_DAY, .price = 2000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4802,7 +4802,7 @@ const struct Item gItems[] = }, { .name = _("TM12"), - .itemId = ITEM_TM12, + .itemId = ITEM_TM12_TAUNT, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4818,7 +4818,7 @@ const struct Item gItems[] = }, { .name = _("TM13"), - .itemId = ITEM_TM13, + .itemId = ITEM_TM13_ICE_BEAM, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4834,7 +4834,7 @@ const struct Item gItems[] = }, { .name = _("TM14"), - .itemId = ITEM_TM14, + .itemId = ITEM_TM14_BLIZZARD, .price = 5500, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4850,7 +4850,7 @@ const struct Item gItems[] = }, { .name = _("TM15"), - .itemId = ITEM_TM15, + .itemId = ITEM_TM15_HYPER_BEAM, .price = 7500, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4866,7 +4866,7 @@ const struct Item gItems[] = }, { .name = _("TM16"), - .itemId = ITEM_TM16, + .itemId = ITEM_TM16_LIGHT_SCREEN, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4882,7 +4882,7 @@ const struct Item gItems[] = }, { .name = _("TM17"), - .itemId = ITEM_TM17, + .itemId = ITEM_TM17_PROTECT, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4898,7 +4898,7 @@ const struct Item gItems[] = }, { .name = _("TM18"), - .itemId = ITEM_TM18, + .itemId = ITEM_TM18_RAIN_DANCE, .price = 2000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4914,7 +4914,7 @@ const struct Item gItems[] = }, { .name = _("TM19"), - .itemId = ITEM_TM19, + .itemId = ITEM_TM19_GIGA_DRAIN, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4930,7 +4930,7 @@ const struct Item gItems[] = }, { .name = _("TM20"), - .itemId = ITEM_TM20, + .itemId = ITEM_TM20_SAFEGUARD, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4946,7 +4946,7 @@ const struct Item gItems[] = }, { .name = _("TM21"), - .itemId = ITEM_TM21, + .itemId = ITEM_TM21_FRUSTRATION, .price = 1000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4962,7 +4962,7 @@ const struct Item gItems[] = }, { .name = _("TM22"), - .itemId = ITEM_TM22, + .itemId = ITEM_TM22_SOLARBEAM, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4978,7 +4978,7 @@ const struct Item gItems[] = }, { .name = _("TM23"), - .itemId = ITEM_TM23, + .itemId = ITEM_TM23_IRON_TAIL, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4994,7 +4994,7 @@ const struct Item gItems[] = }, { .name = _("TM24"), - .itemId = ITEM_TM24, + .itemId = ITEM_TM24_THUNDERBOLT, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5010,7 +5010,7 @@ const struct Item gItems[] = }, { .name = _("TM25"), - .itemId = ITEM_TM25, + .itemId = ITEM_TM25_THUNDER, .price = 5500, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5026,7 +5026,7 @@ const struct Item gItems[] = }, { .name = _("TM26"), - .itemId = ITEM_TM26, + .itemId = ITEM_TM26_EARTHQUAKE, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5042,7 +5042,7 @@ const struct Item gItems[] = }, { .name = _("TM27"), - .itemId = ITEM_TM27, + .itemId = ITEM_TM27_RETURN, .price = 1000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5058,7 +5058,7 @@ const struct Item gItems[] = }, { .name = _("TM28"), - .itemId = ITEM_TM28, + .itemId = ITEM_TM28_DIG, .price = 2000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5074,7 +5074,7 @@ const struct Item gItems[] = }, { .name = _("TM29"), - .itemId = ITEM_TM29, + .itemId = ITEM_TM29_PSYCHIC, .price = 2000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5090,7 +5090,7 @@ const struct Item gItems[] = }, { .name = _("TM30"), - .itemId = ITEM_TM30, + .itemId = ITEM_TM30_SHADOW_BALL, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5106,7 +5106,7 @@ const struct Item gItems[] = }, { .name = _("TM31"), - .itemId = ITEM_TM31, + .itemId = ITEM_TM31_BRICK_BREAK, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5122,7 +5122,7 @@ const struct Item gItems[] = }, { .name = _("TM32"), - .itemId = ITEM_TM32, + .itemId = ITEM_TM32_DOUBLE_TEAM, .price = 2000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5138,7 +5138,7 @@ const struct Item gItems[] = }, { .name = _("TM33"), - .itemId = ITEM_TM33, + .itemId = ITEM_TM33_REFLECT, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5154,7 +5154,7 @@ const struct Item gItems[] = }, { .name = _("TM34"), - .itemId = ITEM_TM34, + .itemId = ITEM_TM34_SHOCK_WAVE, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5170,7 +5170,7 @@ const struct Item gItems[] = }, { .name = _("TM35"), - .itemId = ITEM_TM35, + .itemId = ITEM_TM35_FLAMETHROWER, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5186,7 +5186,7 @@ const struct Item gItems[] = }, { .name = _("TM36"), - .itemId = ITEM_TM36, + .itemId = ITEM_TM36_SLUDGE_BOMB, .price = 1000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5202,7 +5202,7 @@ const struct Item gItems[] = }, { .name = _("TM37"), - .itemId = ITEM_TM37, + .itemId = ITEM_TM37_SANDSTORM, .price = 2000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5218,7 +5218,7 @@ const struct Item gItems[] = }, { .name = _("TM38"), - .itemId = ITEM_TM38, + .itemId = ITEM_TM38_FIRE_BLAST, .price = 5500, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5234,7 +5234,7 @@ const struct Item gItems[] = }, { .name = _("TM39"), - .itemId = ITEM_TM39, + .itemId = ITEM_TM39_ROCK_TOMB, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5250,7 +5250,7 @@ const struct Item gItems[] = }, { .name = _("TM40"), - .itemId = ITEM_TM40, + .itemId = ITEM_TM40_AERIAL_ACE, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5266,7 +5266,7 @@ const struct Item gItems[] = }, { .name = _("TM41"), - .itemId = ITEM_TM41, + .itemId = ITEM_TM41_TORMENT, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5282,7 +5282,7 @@ const struct Item gItems[] = }, { .name = _("TM42"), - .itemId = ITEM_TM42, + .itemId = ITEM_TM42_FACADE, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5298,7 +5298,7 @@ const struct Item gItems[] = }, { .name = _("TM43"), - .itemId = ITEM_TM43, + .itemId = ITEM_TM43_SECRET_POWER, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5314,7 +5314,7 @@ const struct Item gItems[] = }, { .name = _("TM44"), - .itemId = ITEM_TM44, + .itemId = ITEM_TM44_REST, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5330,7 +5330,7 @@ const struct Item gItems[] = }, { .name = _("TM45"), - .itemId = ITEM_TM45, + .itemId = ITEM_TM45_ATTRACT, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5346,7 +5346,7 @@ const struct Item gItems[] = }, { .name = _("TM46"), - .itemId = ITEM_TM46, + .itemId = ITEM_TM46_THIEF, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5362,7 +5362,7 @@ const struct Item gItems[] = }, { .name = _("TM47"), - .itemId = ITEM_TM47, + .itemId = ITEM_TM47_STEEL_WING, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5378,7 +5378,7 @@ const struct Item gItems[] = }, { .name = _("TM48"), - .itemId = ITEM_TM48, + .itemId = ITEM_TM48_SKILL_SWAP, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5394,7 +5394,7 @@ const struct Item gItems[] = }, { .name = _("TM49"), - .itemId = ITEM_TM49, + .itemId = ITEM_TM49_SNATCH, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5410,7 +5410,7 @@ const struct Item gItems[] = }, { .name = _("TM50"), - .itemId = ITEM_TM50, + .itemId = ITEM_TM50_OVERHEAT, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5426,7 +5426,7 @@ const struct Item gItems[] = }, { .name = _("VM01"), - .itemId = ITEM_HM01, + .itemId = ITEM_HM01_CUT, .price = 0, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5442,7 +5442,7 @@ const struct Item gItems[] = }, { .name = _("VM02"), - .itemId = ITEM_HM02, + .itemId = ITEM_HM02_FLY, .price = 0, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5458,7 +5458,7 @@ const struct Item gItems[] = }, { .name = _("VM03"), - .itemId = ITEM_HM03, + .itemId = ITEM_HM03_SURF, .price = 0, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5474,7 +5474,7 @@ const struct Item gItems[] = }, { .name = _("VM04"), - .itemId = ITEM_HM04, + .itemId = ITEM_HM04_STRENGTH, .price = 0, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5490,7 +5490,7 @@ const struct Item gItems[] = }, { .name = _("VM05"), - .itemId = ITEM_HM05, + .itemId = ITEM_HM05_FLASH, .price = 0, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5506,7 +5506,7 @@ const struct Item gItems[] = }, { .name = _("VM06"), - .itemId = ITEM_HM06, + .itemId = ITEM_HM06_ROCK_SMASH, .price = 0, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5522,7 +5522,7 @@ const struct Item gItems[] = }, { .name = _("VM07"), - .itemId = ITEM_HM07, + .itemId = ITEM_HM07_WATERFALL, .price = 0, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5538,7 +5538,7 @@ const struct Item gItems[] = }, { .name = _("VM08"), - .itemId = ITEM_HM08, + .itemId = ITEM_HM08_DIVE, .price = 0, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, diff --git a/src/data/items_en.h b/src/data/items_en.h index a3e822370..3660f4590 100644 --- a/src/data/items_en.h +++ b/src/data/items_en.h @@ -4626,7 +4626,7 @@ const struct Item gItems[] = }, { .name = _("TM01"), - .itemId = ITEM_TM01, + .itemId = ITEM_TM01_FOCUS_PUNCH, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4642,7 +4642,7 @@ const struct Item gItems[] = }, { .name = _("TM02"), - .itemId = ITEM_TM02, + .itemId = ITEM_TM02_DRAGON_CLAW, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4658,7 +4658,7 @@ const struct Item gItems[] = }, { .name = _("TM03"), - .itemId = ITEM_TM03, + .itemId = ITEM_TM03_WATER_PULSE, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4674,7 +4674,7 @@ const struct Item gItems[] = }, { .name = _("TM04"), - .itemId = ITEM_TM04, + .itemId = ITEM_TM04_CALM_MIND, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4690,7 +4690,7 @@ const struct Item gItems[] = }, { .name = _("TM05"), - .itemId = ITEM_TM05, + .itemId = ITEM_TM05_ROAR, .price = 1000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4706,7 +4706,7 @@ const struct Item gItems[] = }, { .name = _("TM06"), - .itemId = ITEM_TM06, + .itemId = ITEM_TM06_TOXIC, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4722,7 +4722,7 @@ const struct Item gItems[] = }, { .name = _("TM07"), - .itemId = ITEM_TM07, + .itemId = ITEM_TM07_HAIL, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4738,7 +4738,7 @@ const struct Item gItems[] = }, { .name = _("TM08"), - .itemId = ITEM_TM08, + .itemId = ITEM_TM08_BULK_UP, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4754,7 +4754,7 @@ const struct Item gItems[] = }, { .name = _("TM09"), - .itemId = ITEM_TM09, + .itemId = ITEM_TM09_BULLET_SEED, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4770,7 +4770,7 @@ const struct Item gItems[] = }, { .name = _("TM10"), - .itemId = ITEM_TM10, + .itemId = ITEM_TM10_HIDDEN_POWER, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4786,7 +4786,7 @@ const struct Item gItems[] = }, { .name = _("TM11"), - .itemId = ITEM_TM11, + .itemId = ITEM_TM11_SUNNY_DAY, .price = 2000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4802,7 +4802,7 @@ const struct Item gItems[] = }, { .name = _("TM12"), - .itemId = ITEM_TM12, + .itemId = ITEM_TM12_TAUNT, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4818,7 +4818,7 @@ const struct Item gItems[] = }, { .name = _("TM13"), - .itemId = ITEM_TM13, + .itemId = ITEM_TM13_ICE_BEAM, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4834,7 +4834,7 @@ const struct Item gItems[] = }, { .name = _("TM14"), - .itemId = ITEM_TM14, + .itemId = ITEM_TM14_BLIZZARD, .price = 5500, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4850,7 +4850,7 @@ const struct Item gItems[] = }, { .name = _("TM15"), - .itemId = ITEM_TM15, + .itemId = ITEM_TM15_HYPER_BEAM, .price = 7500, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4866,7 +4866,7 @@ const struct Item gItems[] = }, { .name = _("TM16"), - .itemId = ITEM_TM16, + .itemId = ITEM_TM16_LIGHT_SCREEN, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4882,7 +4882,7 @@ const struct Item gItems[] = }, { .name = _("TM17"), - .itemId = ITEM_TM17, + .itemId = ITEM_TM17_PROTECT, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4898,7 +4898,7 @@ const struct Item gItems[] = }, { .name = _("TM18"), - .itemId = ITEM_TM18, + .itemId = ITEM_TM18_RAIN_DANCE, .price = 2000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4914,7 +4914,7 @@ const struct Item gItems[] = }, { .name = _("TM19"), - .itemId = ITEM_TM19, + .itemId = ITEM_TM19_GIGA_DRAIN, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4930,7 +4930,7 @@ const struct Item gItems[] = }, { .name = _("TM20"), - .itemId = ITEM_TM20, + .itemId = ITEM_TM20_SAFEGUARD, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4946,7 +4946,7 @@ const struct Item gItems[] = }, { .name = _("TM21"), - .itemId = ITEM_TM21, + .itemId = ITEM_TM21_FRUSTRATION, .price = 1000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4962,7 +4962,7 @@ const struct Item gItems[] = }, { .name = _("TM22"), - .itemId = ITEM_TM22, + .itemId = ITEM_TM22_SOLARBEAM, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4978,7 +4978,7 @@ const struct Item gItems[] = }, { .name = _("TM23"), - .itemId = ITEM_TM23, + .itemId = ITEM_TM23_IRON_TAIL, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -4994,7 +4994,7 @@ const struct Item gItems[] = }, { .name = _("TM24"), - .itemId = ITEM_TM24, + .itemId = ITEM_TM24_THUNDERBOLT, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5010,7 +5010,7 @@ const struct Item gItems[] = }, { .name = _("TM25"), - .itemId = ITEM_TM25, + .itemId = ITEM_TM25_THUNDER, .price = 5500, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5026,7 +5026,7 @@ const struct Item gItems[] = }, { .name = _("TM26"), - .itemId = ITEM_TM26, + .itemId = ITEM_TM26_EARTHQUAKE, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5042,7 +5042,7 @@ const struct Item gItems[] = }, { .name = _("TM27"), - .itemId = ITEM_TM27, + .itemId = ITEM_TM27_RETURN, .price = 1000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5058,7 +5058,7 @@ const struct Item gItems[] = }, { .name = _("TM28"), - .itemId = ITEM_TM28, + .itemId = ITEM_TM28_DIG, .price = 2000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5074,7 +5074,7 @@ const struct Item gItems[] = }, { .name = _("TM29"), - .itemId = ITEM_TM29, + .itemId = ITEM_TM29_PSYCHIC, .price = 2000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5090,7 +5090,7 @@ const struct Item gItems[] = }, { .name = _("TM30"), - .itemId = ITEM_TM30, + .itemId = ITEM_TM30_SHADOW_BALL, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5106,7 +5106,7 @@ const struct Item gItems[] = }, { .name = _("TM31"), - .itemId = ITEM_TM31, + .itemId = ITEM_TM31_BRICK_BREAK, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5122,7 +5122,7 @@ const struct Item gItems[] = }, { .name = _("TM32"), - .itemId = ITEM_TM32, + .itemId = ITEM_TM32_DOUBLE_TEAM, .price = 2000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5138,7 +5138,7 @@ const struct Item gItems[] = }, { .name = _("TM33"), - .itemId = ITEM_TM33, + .itemId = ITEM_TM33_REFLECT, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5154,7 +5154,7 @@ const struct Item gItems[] = }, { .name = _("TM34"), - .itemId = ITEM_TM34, + .itemId = ITEM_TM34_SHOCK_WAVE, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5170,7 +5170,7 @@ const struct Item gItems[] = }, { .name = _("TM35"), - .itemId = ITEM_TM35, + .itemId = ITEM_TM35_FLAMETHROWER, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5186,7 +5186,7 @@ const struct Item gItems[] = }, { .name = _("TM36"), - .itemId = ITEM_TM36, + .itemId = ITEM_TM36_SLUDGE_BOMB, .price = 1000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5202,7 +5202,7 @@ const struct Item gItems[] = }, { .name = _("TM37"), - .itemId = ITEM_TM37, + .itemId = ITEM_TM37_SANDSTORM, .price = 2000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5218,7 +5218,7 @@ const struct Item gItems[] = }, { .name = _("TM38"), - .itemId = ITEM_TM38, + .itemId = ITEM_TM38_FIRE_BLAST, .price = 5500, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5234,7 +5234,7 @@ const struct Item gItems[] = }, { .name = _("TM39"), - .itemId = ITEM_TM39, + .itemId = ITEM_TM39_ROCK_TOMB, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5250,7 +5250,7 @@ const struct Item gItems[] = }, { .name = _("TM40"), - .itemId = ITEM_TM40, + .itemId = ITEM_TM40_AERIAL_ACE, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5266,7 +5266,7 @@ const struct Item gItems[] = }, { .name = _("TM41"), - .itemId = ITEM_TM41, + .itemId = ITEM_TM41_TORMENT, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5282,7 +5282,7 @@ const struct Item gItems[] = }, { .name = _("TM42"), - .itemId = ITEM_TM42, + .itemId = ITEM_TM42_FACADE, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5298,7 +5298,7 @@ const struct Item gItems[] = }, { .name = _("TM43"), - .itemId = ITEM_TM43, + .itemId = ITEM_TM43_SECRET_POWER, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5314,7 +5314,7 @@ const struct Item gItems[] = }, { .name = _("TM44"), - .itemId = ITEM_TM44, + .itemId = ITEM_TM44_REST, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5330,7 +5330,7 @@ const struct Item gItems[] = }, { .name = _("TM45"), - .itemId = ITEM_TM45, + .itemId = ITEM_TM45_ATTRACT, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5346,7 +5346,7 @@ const struct Item gItems[] = }, { .name = _("TM46"), - .itemId = ITEM_TM46, + .itemId = ITEM_TM46_THIEF, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5362,7 +5362,7 @@ const struct Item gItems[] = }, { .name = _("TM47"), - .itemId = ITEM_TM47, + .itemId = ITEM_TM47_STEEL_WING, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5378,7 +5378,7 @@ const struct Item gItems[] = }, { .name = _("TM48"), - .itemId = ITEM_TM48, + .itemId = ITEM_TM48_SKILL_SWAP, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5394,7 +5394,7 @@ const struct Item gItems[] = }, { .name = _("TM49"), - .itemId = ITEM_TM49, + .itemId = ITEM_TM49_SNATCH, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5410,7 +5410,7 @@ const struct Item gItems[] = }, { .name = _("TM50"), - .itemId = ITEM_TM50, + .itemId = ITEM_TM50_OVERHEAT, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5426,7 +5426,7 @@ const struct Item gItems[] = }, { .name = _("HM01"), - .itemId = ITEM_HM01, + .itemId = ITEM_HM01_CUT, .price = 0, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5442,7 +5442,7 @@ const struct Item gItems[] = }, { .name = _("HM02"), - .itemId = ITEM_HM02, + .itemId = ITEM_HM02_FLY, .price = 0, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5458,7 +5458,7 @@ const struct Item gItems[] = }, { .name = _("HM03"), - .itemId = ITEM_HM03, + .itemId = ITEM_HM03_SURF, .price = 0, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5474,7 +5474,7 @@ const struct Item gItems[] = }, { .name = _("HM04"), - .itemId = ITEM_HM04, + .itemId = ITEM_HM04_STRENGTH, .price = 0, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5490,7 +5490,7 @@ const struct Item gItems[] = }, { .name = _("HM05"), - .itemId = ITEM_HM05, + .itemId = ITEM_HM05_FLASH, .price = 0, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5506,7 +5506,7 @@ const struct Item gItems[] = }, { .name = _("HM06"), - .itemId = ITEM_HM06, + .itemId = ITEM_HM06_ROCK_SMASH, .price = 0, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5522,7 +5522,7 @@ const struct Item gItems[] = }, { .name = _("HM07"), - .itemId = ITEM_HM07, + .itemId = ITEM_HM07_WATERFALL, .price = 0, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, @@ -5538,7 +5538,7 @@ const struct Item gItems[] = }, { .name = _("HM08"), - .itemId = ITEM_HM08, + .itemId = ITEM_HM08_DIVE, .price = 0, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, diff --git a/src/data/pokedex_entries_de.h b/src/data/pokedex_entries_de.h index 0f64cba66..413b73d90 100644 --- a/src/data/pokedex_entries_de.h +++ b/src/data/pokedex_entries_de.h @@ -6337,7 +6337,8 @@ static const u8 DexDescription_Deoxys_2[] = _( "dieses POKéMON ist sein Gehirn."); #endif -static const struct PokedexEntry gPokedexEntries[] = { +const struct PokedexEntry gPokedexEntries[] = +{ { // Dummy .categoryName = _("UNBEKANNT"), diff --git a/src/data/pokedex_entries_en.h b/src/data/pokedex_entries_en.h index 86da3d67b..933b1fc7d 100644 --- a/src/data/pokedex_entries_en.h +++ b/src/data/pokedex_entries_en.h @@ -5389,7 +5389,7 @@ static const u8 DexDescription_Deoxys_2[] = _( "chest appears to be its brain."); #endif -static const struct PokedexEntry gPokedexEntries[] = +const struct PokedexEntry gPokedexEntries[] = { { //Dummy .categoryName = _("UNKNOWN"), diff --git a/src/data/pokemon/base_stats.h b/src/data/pokemon/base_stats.h index 37f59e1c6..bc6572b46 100644 --- a/src/data/pokemon/base_stats.h +++ b/src/data/pokemon/base_stats.h @@ -1,7823 +1,13576 @@ -// - -// - -#ifndef POKERUBY_BASE_STATS_H -#define POKERUBY_BASE_STATS_H - -const struct BaseStats gBaseStats[] = { - { // ?????????? - }, { - // Bulbasaur - 45, 49, 49, 45, 65, 65, - TYPE_GRASS, - TYPE_POISON, - 45, // catch rate - 64, // base exp. yield - 0, 0, 0, 0, 1, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_GRASS, - ABILITY_OVERGROW, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Ivysaur - 60, 62, 63, 60, 80, 80, - TYPE_GRASS, - TYPE_POISON, - 45, // catch rate - 141, // base exp. yield - 0, 0, 0, 0, 1, 1, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_GRASS, - ABILITY_OVERGROW, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Venusaur - 80, 82, 83, 80, 100, 100, - TYPE_GRASS, - TYPE_POISON, - 45, // catch rate - 208, // base exp. yield - 0, 0, 0, 0, 2, 1, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_GRASS, - ABILITY_OVERGROW, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Charmander - 39, 52, 43, 65, 60, 50, - TYPE_FIRE, - TYPE_FIRE, - 45, // catch rate - 65, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_DRAGON, - ABILITY_BLAZE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Charmeleon - 58, 64, 58, 80, 80, 65, - TYPE_FIRE, - TYPE_FIRE, - 45, // catch rate - 142, // base exp. yield - 0, 0, 0, 1, 1, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_DRAGON, - ABILITY_BLAZE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Charizard - 78, 84, 78, 100, 109, 85, - TYPE_FIRE, - TYPE_FLYING, - 45, // catch rate - 209, // base exp. yield - 0, 0, 0, 0, 3, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_DRAGON, - ABILITY_BLAZE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Squirtle - 44, 48, 65, 43, 50, 64, - TYPE_WATER, - TYPE_WATER, - 45, // catch rate - 66, // base exp. yield - 0, 0, 1, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_WATER_1, - ABILITY_TORRENT, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Wartortle - 59, 63, 80, 58, 65, 80, - TYPE_WATER, - TYPE_WATER, - 45, // catch rate - 143, // base exp. yield - 0, 0, 1, 0, 0, 1, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_WATER_1, - ABILITY_TORRENT, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Blastoise - 79, 83, 100, 78, 85, 105, - TYPE_WATER, - TYPE_WATER, - 45, // catch rate - 210, // base exp. yield - 0, 0, 0, 0, 0, 3, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_WATER_1, - ABILITY_TORRENT, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Caterpie - 45, 30, 35, 45, 20, 20, - TYPE_BUG, - TYPE_BUG, - 255, // catch rate - 53, // base exp. yield - 1, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_SHIELD_DUST, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Metapod - 50, 20, 55, 30, 25, 25, - TYPE_BUG, - TYPE_BUG, - 120, // catch rate - 72, // base exp. yield - 0, 0, 2, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_SHED_SKIN, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Butterfree - 60, 45, 50, 70, 80, 80, - TYPE_BUG, - TYPE_FLYING, - 45, // catch rate - 160, // base exp. yield - 0, 0, 0, 0, 2, 1, - ITEM_NONE, - ITEM_SILVER_POWDER, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_COMPOUND_EYES, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_WHITE - }, { // Weedle - 40, 35, 30, 50, 20, 20, - TYPE_BUG, - TYPE_POISON, - 255, // catch rate - 52, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_SHIELD_DUST, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Kakuna - 45, 25, 50, 35, 25, 25, - TYPE_BUG, - TYPE_POISON, - 120, // catch rate - 71, // base exp. yield - 0, 0, 2, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_SHED_SKIN, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Beedrill - 65, 80, 40, 75, 45, 80, - TYPE_BUG, - TYPE_POISON, - 45, // catch rate - 159, // base exp. yield - 0, 2, 0, 0, 0, 1, - ITEM_NONE, - ITEM_POISON_BARB, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_SWARM, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Pidgey - 40, 45, 40, 56, 35, 35, - TYPE_NORMAL, - TYPE_FLYING, - 255, // catch rate - 55, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_FLYING, - EGG_GROUP_FLYING, - ABILITY_KEEN_EYE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Pidgeotto - 63, 60, 55, 71, 50, 50, - TYPE_NORMAL, - TYPE_FLYING, - 120, // catch rate - 113, // base exp. yield - 0, 0, 0, 2, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_FLYING, - EGG_GROUP_FLYING, - ABILITY_KEEN_EYE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Pidgeot - 83, 80, 75, 91, 70, 70, - TYPE_NORMAL, - TYPE_FLYING, - 45, // catch rate - 172, // base exp. yield - 0, 0, 0, 3, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_FLYING, - EGG_GROUP_FLYING, - ABILITY_KEEN_EYE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Rattata - 30, 56, 35, 72, 25, 35, - TYPE_NORMAL, - TYPE_NORMAL, - 255, // catch rate - 57, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_RUN_AWAY, - ABILITY_GUTS, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Raticate - 55, 81, 60, 97, 50, 70, - TYPE_NORMAL, - TYPE_NORMAL, - 127, // catch rate - 116, // base exp. yield - 0, 0, 0, 2, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_RUN_AWAY, - ABILITY_GUTS, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Spearow - 40, 60, 30, 70, 31, 31, - TYPE_NORMAL, - TYPE_FLYING, - 255, // catch rate - 58, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FLYING, - EGG_GROUP_FLYING, - ABILITY_KEEN_EYE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Fearow - 65, 90, 65, 100, 61, 61, - TYPE_NORMAL, - TYPE_FLYING, - 90, // catch rate - 162, // base exp. yield - 0, 0, 0, 2, 0, 0, - ITEM_NONE, - ITEM_SHARP_BEAK, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FLYING, - EGG_GROUP_FLYING, - ABILITY_KEEN_EYE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Ekans - 35, 60, 44, 55, 40, 54, - TYPE_POISON, - TYPE_POISON, - 255, // catch rate - 62, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_DRAGON, - ABILITY_INTIMIDATE, - ABILITY_SHED_SKIN, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Arbok - 60, 85, 69, 80, 65, 79, - TYPE_POISON, - TYPE_POISON, - 90, // catch rate - 147, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_DRAGON, - ABILITY_INTIMIDATE, - ABILITY_SHED_SKIN, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Pikachu - 35, 55, 30, 90, 50, 40, - TYPE_ELECTRIC, - TYPE_ELECTRIC, - 190, // catch rate - 82, // base exp. yield - 0, 0, 0, 2, 0, 0, - ITEM_ORAN_BERRY, - ITEM_LIGHT_BALL, - 127, // gender - 10, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FAIRY, - ABILITY_STATIC, - ABILITY_NONE, - 6, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Raichu - 60, 90, 55, 100, 90, 80, - TYPE_ELECTRIC, - TYPE_ELECTRIC, - 75, // catch rate - 122, // base exp. yield - 0, 0, 0, 3, 0, 0, - ITEM_NONE, - ITEM_ORAN_BERRY, - 127, // gender - 10, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FAIRY, - ABILITY_STATIC, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Sandshrew - 50, 75, 85, 40, 20, 30, - TYPE_GROUND, - TYPE_GROUND, - 255, // catch rate - 93, // base exp. yield - 0, 0, 1, 0, 0, 0, - ITEM_NONE, - ITEM_QUICK_CLAW, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_SAND_VEIL, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Sandslash - 75, 100, 110, 65, 45, 55, - TYPE_GROUND, - TYPE_GROUND, - 90, // catch rate - 163, // base exp. yield - 0, 0, 2, 0, 0, 0, - ITEM_NONE, - ITEM_QUICK_CLAW, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_SAND_VEIL, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Nidoran♀ - 55, 47, 52, 41, 40, 40, - TYPE_POISON, - TYPE_POISON, - 235, // catch rate - 59, // base exp. yield - 1, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 254, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_FIELD, - ABILITY_POISON_POINT, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Nidorina - 70, 62, 67, 56, 55, 55, - TYPE_POISON, - TYPE_POISON, - 120, // catch rate - 117, // base exp. yield - 2, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 254, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_POISON_POINT, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Nidoqueen - 90, 82, 87, 76, 75, 85, - TYPE_POISON, - TYPE_GROUND, - 45, // catch rate - 194, // base exp. yield - 3, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 254, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_POISON_POINT, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Nidoran♂ - 46, 57, 40, 50, 40, 40, - TYPE_POISON, - TYPE_POISON, - 235, // catch rate - 60, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 0, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_FIELD, - ABILITY_POISON_POINT, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Nidorino - 61, 72, 57, 65, 55, 55, - TYPE_POISON, - TYPE_POISON, - 120, // catch rate - 118, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 0, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_FIELD, - ABILITY_POISON_POINT, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Nidoking - 81, 92, 77, 85, 85, 75, - TYPE_POISON, - TYPE_GROUND, - 45, // catch rate - 195, // base exp. yield - 0, 3, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 0, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_FIELD, - ABILITY_POISON_POINT, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Clefairy - 70, 45, 48, 35, 60, 65, - TYPE_NORMAL, - TYPE_NORMAL, - 150, // catch rate - 68, // base exp. yield - 2, 0, 0, 0, 0, 0, - ITEM_LEPPA_BERRY, - ITEM_MOON_STONE, - 191, // gender - 10, // egg cycles - 140, // base friendship - GROWTH_FAST, - EGG_GROUP_FAIRY, - EGG_GROUP_FAIRY, - ABILITY_CUTE_CHARM, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PINK - }, { // Clefable - 95, 70, 73, 60, 85, 90, - TYPE_NORMAL, - TYPE_NORMAL, - 25, // catch rate - 129, // base exp. yield - 3, 0, 0, 0, 0, 0, - ITEM_LEPPA_BERRY, - ITEM_MOON_STONE, - 191, // gender - 10, // egg cycles - 140, // base friendship - GROWTH_FAST, - EGG_GROUP_FAIRY, - EGG_GROUP_FAIRY, - ABILITY_CUTE_CHARM, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PINK - }, { // Vulpix - 38, 41, 40, 65, 50, 65, - TYPE_FIRE, - TYPE_FIRE, - 190, // catch rate - 63, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_RAWST_BERRY, - ITEM_RAWST_BERRY, - 191, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_FLASH_FIRE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Ninetales - 73, 76, 75, 100, 81, 100, - TYPE_FIRE, - TYPE_FIRE, - 75, // catch rate - 178, // base exp. yield - 0, 0, 0, 1, 0, 1, - ITEM_RAWST_BERRY, - ITEM_RAWST_BERRY, - 191, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_FLASH_FIRE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Jigglypuff - 115, 45, 20, 20, 45, 25, - TYPE_NORMAL, - TYPE_NORMAL, - 170, // catch rate - 76, // base exp. yield - 2, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 191, // gender - 10, // egg cycles - 70, // base friendship - GROWTH_FAST, - EGG_GROUP_FAIRY, - EGG_GROUP_FAIRY, - ABILITY_CUTE_CHARM, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PINK - }, { // Wigglytuff - 140, 70, 45, 45, 75, 50, - TYPE_NORMAL, - TYPE_NORMAL, - 50, // catch rate - 109, // base exp. yield - 3, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 191, // gender - 10, // egg cycles - 70, // base friendship - GROWTH_FAST, - EGG_GROUP_FAIRY, - EGG_GROUP_FAIRY, - ABILITY_CUTE_CHARM, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PINK - }, { // Zubat - 40, 45, 35, 55, 30, 40, - TYPE_POISON, - TYPE_FLYING, - 255, // catch rate - 54, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FLYING, - EGG_GROUP_FLYING, - ABILITY_INNER_FOCUS, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Golbat - 75, 80, 70, 90, 65, 75, - TYPE_POISON, - TYPE_FLYING, - 90, // catch rate - 171, // base exp. yield - 0, 0, 0, 2, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FLYING, - EGG_GROUP_FLYING, - ABILITY_INNER_FOCUS, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Oddish - 45, 50, 55, 30, 75, 65, - TYPE_GRASS, - TYPE_POISON, - 255, // catch rate - 78, // base exp. yield - 0, 0, 0, 0, 1, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_GRASS, - EGG_GROUP_GRASS, - ABILITY_CHLOROPHYLL, - ABILITY_NONE, - 4, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Gloom - 60, 65, 70, 40, 85, 75, - TYPE_GRASS, - TYPE_POISON, - 120, // catch rate - 132, // base exp. yield - 0, 0, 0, 0, 2, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_GRASS, - EGG_GROUP_GRASS, - ABILITY_CHLOROPHYLL, - ABILITY_NONE, - 6, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Vileplume - 75, 80, 85, 50, 100, 90, - TYPE_GRASS, - TYPE_POISON, - 45, // catch rate - 184, // base exp. yield - 0, 0, 0, 0, 3, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_GRASS, - EGG_GROUP_GRASS, - ABILITY_CHLOROPHYLL, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Paras - 35, 70, 55, 25, 45, 55, - TYPE_BUG, - TYPE_GRASS, - 190, // catch rate - 70, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_TINY_MUSHROOM, - ITEM_BIG_MUSHROOM, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_BUG, - EGG_GROUP_GRASS, - ABILITY_EFFECT_SPORE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Parasect - 60, 95, 80, 30, 60, 80, - TYPE_BUG, - TYPE_GRASS, - 75, // catch rate - 128, // base exp. yield - 0, 2, 1, 0, 0, 0, - ITEM_TINY_MUSHROOM, - ITEM_BIG_MUSHROOM, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_BUG, - EGG_GROUP_GRASS, - ABILITY_EFFECT_SPORE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Venonat - 60, 55, 50, 45, 40, 55, - TYPE_BUG, - TYPE_POISON, - 190, // catch rate - 75, // base exp. yield - 0, 0, 0, 0, 0, 1, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_COMPOUND_EYES, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Venomoth - 70, 65, 60, 90, 90, 75, - TYPE_BUG, - TYPE_POISON, - 75, // catch rate - 138, // base exp. yield - 0, 0, 0, 1, 1, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_SHIELD_DUST, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Diglett - 10, 55, 25, 95, 35, 45, - TYPE_GROUND, - TYPE_GROUND, - 255, // catch rate - 81, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_SAND_VEIL, - ABILITY_ARENA_TRAP, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Dugtrio - 35, 80, 50, 120, 50, 70, - TYPE_GROUND, - TYPE_GROUND, - 50, // catch rate - 153, // base exp. yield - 0, 0, 0, 2, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_SAND_VEIL, - ABILITY_ARENA_TRAP, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Meowth - 40, 45, 35, 90, 40, 40, - TYPE_NORMAL, - TYPE_NORMAL, - 255, // catch rate - 69, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_PICKUP, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Persian - 65, 70, 60, 115, 65, 65, - TYPE_NORMAL, - TYPE_NORMAL, - 90, // catch rate - 148, // base exp. yield - 0, 0, 0, 2, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_LIMBER, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Psyduck - 50, 52, 48, 55, 65, 50, - TYPE_WATER, - TYPE_WATER, - 190, // catch rate - 80, // base exp. yield - 0, 0, 0, 0, 1, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_WATER_1, - EGG_GROUP_FIELD, - ABILITY_DAMP, - ABILITY_CLOUD_NINE, - 6, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Golduck - 80, 82, 78, 85, 95, 80, - TYPE_WATER, - TYPE_WATER, - 75, // catch rate - 174, // base exp. yield - 0, 0, 0, 0, 2, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_WATER_1, - EGG_GROUP_FIELD, - ABILITY_DAMP, - ABILITY_CLOUD_NINE, - 8, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Mankey - 40, 80, 35, 70, 35, 45, - TYPE_FIGHTING, - TYPE_FIGHTING, - 190, // catch rate - 74, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_VITAL_SPIRIT, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Primeape - 65, 105, 60, 95, 60, 70, - TYPE_FIGHTING, - TYPE_FIGHTING, - 75, // catch rate - 149, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_VITAL_SPIRIT, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Growlithe - 55, 70, 45, 60, 70, 50, - TYPE_FIRE, - TYPE_FIRE, - 190, // catch rate - 91, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_RAWST_BERRY, - ITEM_RAWST_BERRY, - 63, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_INTIMIDATE, - ABILITY_FLASH_FIRE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Arcanine - 90, 110, 80, 95, 100, 80, - TYPE_FIRE, - TYPE_FIRE, - 75, // catch rate - 213, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_RAWST_BERRY, - ITEM_RAWST_BERRY, - 63, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_INTIMIDATE, - ABILITY_FLASH_FIRE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Poliwag - 40, 50, 40, 90, 40, 40, - TYPE_WATER, - TYPE_WATER, - 255, // catch rate - 77, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_WATER_1, - EGG_GROUP_WATER_1, - ABILITY_WATER_ABSORB, - ABILITY_DAMP, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE, TRUE - }, { // Poliwhirl - 65, 65, 65, 90, 50, 50, - TYPE_WATER, - TYPE_WATER, - 120, // catch rate - 131, // base exp. yield - 0, 0, 0, 2, 0, 0, - ITEM_NONE, - ITEM_KINGS_ROCK, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_WATER_1, - EGG_GROUP_WATER_1, - ABILITY_WATER_ABSORB, - ABILITY_DAMP, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE, TRUE - }, { // Poliwrath - 90, 85, 95, 70, 70, 90, - TYPE_WATER, - TYPE_FIGHTING, - 45, // catch rate - 185, // base exp. yield - 0, 0, 3, 0, 0, 0, - ITEM_NONE, - ITEM_KINGS_ROCK, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_WATER_1, - EGG_GROUP_WATER_1, - ABILITY_WATER_ABSORB, - ABILITY_DAMP, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE, TRUE - }, { // Abra - 25, 20, 15, 90, 105, 55, - TYPE_PSYCHIC, - TYPE_PSYCHIC, - 200, // catch rate - 73, // base exp. yield - 0, 0, 0, 0, 1, 0, - ITEM_NONE, - ITEM_TWISTED_SPOON, - 63, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_HUMAN_LIKE, - EGG_GROUP_HUMAN_LIKE, - ABILITY_SYNCHRONIZE, - ABILITY_INNER_FOCUS, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Kadabra - 40, 35, 30, 105, 120, 70, - TYPE_PSYCHIC, - TYPE_PSYCHIC, - 100, // catch rate - 145, // base exp. yield - 0, 0, 0, 0, 2, 0, - ITEM_NONE, - ITEM_TWISTED_SPOON, - 63, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_HUMAN_LIKE, - EGG_GROUP_HUMAN_LIKE, - ABILITY_SYNCHRONIZE, - ABILITY_INNER_FOCUS, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Alakazam - 55, 50, 45, 120, 135, 85, - TYPE_PSYCHIC, - TYPE_PSYCHIC, - 50, // catch rate - 186, // base exp. yield - 0, 0, 0, 0, 3, 0, - ITEM_NONE, - ITEM_TWISTED_SPOON, - 63, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_HUMAN_LIKE, - EGG_GROUP_HUMAN_LIKE, - ABILITY_SYNCHRONIZE, - ABILITY_INNER_FOCUS, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Machop - 70, 80, 50, 35, 35, 35, - TYPE_FIGHTING, - TYPE_FIGHTING, - 180, // catch rate - 88, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 63, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_HUMAN_LIKE, - EGG_GROUP_HUMAN_LIKE, - ABILITY_GUTS, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Machoke - 80, 100, 70, 45, 50, 60, - TYPE_FIGHTING, - TYPE_FIGHTING, - 90, // catch rate - 146, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 63, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_HUMAN_LIKE, - EGG_GROUP_HUMAN_LIKE, - ABILITY_GUTS, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Machamp - 90, 130, 80, 55, 65, 85, - TYPE_FIGHTING, - TYPE_FIGHTING, - 45, // catch rate - 193, // base exp. yield - 0, 3, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 63, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_HUMAN_LIKE, - EGG_GROUP_HUMAN_LIKE, - ABILITY_GUTS, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Bellsprout - 50, 75, 35, 40, 70, 30, - TYPE_GRASS, - TYPE_POISON, - 255, // catch rate - 84, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_GRASS, - EGG_GROUP_GRASS, - ABILITY_CHLOROPHYLL, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Weepinbell - 65, 90, 50, 55, 85, 45, - TYPE_GRASS, - TYPE_POISON, - 120, // catch rate - 151, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_GRASS, - EGG_GROUP_GRASS, - ABILITY_CHLOROPHYLL, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Victreebel - 80, 105, 65, 70, 100, 60, - TYPE_GRASS, - TYPE_POISON, - 45, // catch rate - 191, // base exp. yield - 0, 3, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_GRASS, - EGG_GROUP_GRASS, - ABILITY_CHLOROPHYLL, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Tentacool - 40, 40, 35, 70, 50, 100, - TYPE_WATER, - TYPE_POISON, - 190, // catch rate - 105, // base exp. yield - 0, 0, 0, 0, 0, 1, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_WATER_3, - EGG_GROUP_WATER_3, - ABILITY_CLEAR_BODY, - ABILITY_LIQUID_OOZE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Tentacruel - 80, 70, 65, 100, 80, 120, - TYPE_WATER, - TYPE_POISON, - 60, // catch rate - 205, // base exp. yield - 0, 0, 0, 0, 0, 2, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_WATER_3, - EGG_GROUP_WATER_3, - ABILITY_CLEAR_BODY, - ABILITY_LIQUID_OOZE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Geodude - 40, 80, 100, 20, 30, 30, - TYPE_ROCK, - TYPE_GROUND, - 255, // catch rate - 86, // base exp. yield - 0, 0, 1, 0, 0, 0, - ITEM_NONE, - ITEM_EVERSTONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MINERAL, - EGG_GROUP_MINERAL, - ABILITY_ROCK_HEAD, - ABILITY_STURDY, - 4, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Graveler - 55, 95, 115, 35, 45, 45, - TYPE_ROCK, - TYPE_GROUND, - 120, // catch rate - 134, // base exp. yield - 0, 0, 2, 0, 0, 0, - ITEM_NONE, - ITEM_EVERSTONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MINERAL, - EGG_GROUP_MINERAL, - ABILITY_ROCK_HEAD, - ABILITY_STURDY, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Golem - 80, 110, 130, 45, 55, 65, - TYPE_ROCK, - TYPE_GROUND, - 45, // catch rate - 177, // base exp. yield - 0, 0, 3, 0, 0, 0, - ITEM_NONE, - ITEM_EVERSTONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MINERAL, - EGG_GROUP_MINERAL, - ABILITY_ROCK_HEAD, - ABILITY_STURDY, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Ponyta - 50, 85, 55, 90, 65, 65, - TYPE_FIRE, - TYPE_FIRE, - 190, // catch rate - 152, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_RUN_AWAY, - ABILITY_FLASH_FIRE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Rapidash - 65, 100, 70, 105, 80, 80, - TYPE_FIRE, - TYPE_FIRE, - 60, // catch rate - 192, // base exp. yield - 0, 0, 0, 2, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_RUN_AWAY, - ABILITY_FLASH_FIRE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Slowpoke - 90, 65, 65, 15, 40, 40, - TYPE_WATER, - TYPE_PSYCHIC, - 190, // catch rate - 99, // base exp. yield - 1, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_KINGS_ROCK, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_MONSTER, - EGG_GROUP_WATER_1, - ABILITY_OBLIVIOUS, - ABILITY_OWN_TEMPO, - 0, // Safari Zone flee rate - BODY_COLOR_PINK - }, { // Slowbro - 95, 75, 110, 30, 100, 80, - TYPE_WATER, - TYPE_PSYCHIC, - 75, // catch rate - 164, // base exp. yield - 0, 0, 2, 0, 0, 0, - ITEM_NONE, - ITEM_KINGS_ROCK, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_MONSTER, - EGG_GROUP_WATER_1, - ABILITY_OBLIVIOUS, - ABILITY_OWN_TEMPO, - 0, // Safari Zone flee rate - BODY_COLOR_PINK - }, { // Magnemite - 25, 35, 70, 45, 95, 55, - TYPE_ELECTRIC, - TYPE_STEEL, - 190, // catch rate - 89, // base exp. yield - 0, 0, 0, 0, 1, 0, - ITEM_NONE, - ITEM_METAL_COAT, - 255, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_MINERAL, - EGG_GROUP_MINERAL, - ABILITY_MAGNET_PULL, - ABILITY_STURDY, - 0, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Magneton - 50, 60, 95, 70, 120, 70, - TYPE_ELECTRIC, - TYPE_STEEL, - 60, // catch rate - 161, // base exp. yield - 0, 0, 0, 0, 2, 0, - ITEM_NONE, - ITEM_METAL_COAT, - 255, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_MINERAL, - EGG_GROUP_MINERAL, - ABILITY_MAGNET_PULL, - ABILITY_STURDY, - 0, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Farfetch'd - 52, 65, 55, 60, 58, 62, - TYPE_NORMAL, - TYPE_FLYING, - 45, // catch rate - 94, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_STICK, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FLYING, - EGG_GROUP_FIELD, - ABILITY_KEEN_EYE, - ABILITY_INNER_FOCUS, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Doduo - 35, 85, 45, 75, 35, 35, - TYPE_NORMAL, - TYPE_FLYING, - 190, // catch rate - 96, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_SHARP_BEAK, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FLYING, - EGG_GROUP_FLYING, - ABILITY_RUN_AWAY, - ABILITY_EARLY_BIRD, - 8, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Dodrio - 60, 110, 70, 100, 60, 60, - TYPE_NORMAL, - TYPE_FLYING, - 45, // catch rate - 158, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_SHARP_BEAK, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FLYING, - EGG_GROUP_FLYING, - ABILITY_RUN_AWAY, - ABILITY_EARLY_BIRD, - 10, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Seel - 65, 45, 55, 45, 45, 70, - TYPE_WATER, - TYPE_WATER, - 190, // catch rate - 100, // base exp. yield - 0, 0, 0, 0, 0, 1, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_WATER_1, - EGG_GROUP_FIELD, - ABILITY_THICK_FAT, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_WHITE - }, { // Dewgong - 90, 70, 80, 70, 70, 95, - TYPE_WATER, - TYPE_ICE, - 75, // catch rate - 176, // base exp. yield - 0, 0, 0, 0, 0, 2, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_WATER_1, - EGG_GROUP_FIELD, - ABILITY_THICK_FAT, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_WHITE - }, { // Grimer - 80, 80, 50, 25, 40, 50, - TYPE_POISON, - TYPE_POISON, - 190, // catch rate - 90, // base exp. yield - 1, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NUGGET, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_AMORPHOUS, - EGG_GROUP_AMORPHOUS, - ABILITY_STENCH, - ABILITY_STICKY_HOLD, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Muk - 105, 105, 75, 50, 65, 100, - TYPE_POISON, - TYPE_POISON, - 75, // catch rate - 157, // base exp. yield - 1, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NUGGET, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_AMORPHOUS, - EGG_GROUP_AMORPHOUS, - ABILITY_STENCH, - ABILITY_STICKY_HOLD, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Shellder - 30, 65, 100, 40, 45, 25, - TYPE_WATER, - TYPE_WATER, - 190, // catch rate - 97, // base exp. yield - 0, 0, 1, 0, 0, 0, - ITEM_PEARL, - ITEM_BIG_PEARL, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_WATER_3, - EGG_GROUP_WATER_3, - ABILITY_SHELL_ARMOR, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Cloyster - 50, 95, 180, 70, 85, 45, - TYPE_WATER, - TYPE_ICE, - 60, // catch rate - 203, // base exp. yield - 0, 0, 2, 0, 0, 0, - ITEM_PEARL, - ITEM_BIG_PEARL, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_WATER_3, - EGG_GROUP_WATER_3, - ABILITY_SHELL_ARMOR, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Gastly - 30, 35, 30, 80, 100, 35, - TYPE_GHOST, - TYPE_POISON, - 190, // catch rate - 95, // base exp. yield - 0, 0, 0, 0, 1, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_AMORPHOUS, - EGG_GROUP_AMORPHOUS, - ABILITY_LEVITATE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Haunter - 45, 50, 45, 95, 115, 55, - TYPE_GHOST, - TYPE_POISON, - 90, // catch rate - 126, // base exp. yield - 0, 0, 0, 0, 2, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_AMORPHOUS, - EGG_GROUP_AMORPHOUS, - ABILITY_LEVITATE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Gengar - 60, 65, 60, 110, 130, 75, - TYPE_GHOST, - TYPE_POISON, - 45, // catch rate - 190, // base exp. yield - 0, 0, 0, 0, 3, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_AMORPHOUS, - EGG_GROUP_AMORPHOUS, - ABILITY_LEVITATE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Onix - 35, 45, 160, 70, 30, 45, - TYPE_ROCK, - TYPE_GROUND, - 45, // catch rate - 108, // base exp. yield - 0, 0, 1, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 25, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_MINERAL, - EGG_GROUP_MINERAL, - ABILITY_ROCK_HEAD, - ABILITY_STURDY, - 0, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Drowzee - 60, 48, 45, 42, 43, 90, - TYPE_PSYCHIC, - TYPE_PSYCHIC, - 190, // catch rate - 102, // base exp. yield - 0, 0, 0, 0, 0, 1, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_HUMAN_LIKE, - EGG_GROUP_HUMAN_LIKE, - ABILITY_INSOMNIA, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Hypno - 85, 73, 70, 67, 73, 115, - TYPE_PSYCHIC, - TYPE_PSYCHIC, - 75, // catch rate - 165, // base exp. yield - 0, 0, 0, 0, 0, 2, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_HUMAN_LIKE, - EGG_GROUP_HUMAN_LIKE, - ABILITY_INSOMNIA, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Krabby - 30, 105, 90, 50, 25, 25, - TYPE_WATER, - TYPE_WATER, - 225, // catch rate - 115, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_WATER_3, - EGG_GROUP_WATER_3, - ABILITY_HYPER_CUTTER, - ABILITY_SHELL_ARMOR, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Kingler - 55, 130, 115, 75, 50, 50, - TYPE_WATER, - TYPE_WATER, - 60, // catch rate - 206, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_WATER_3, - EGG_GROUP_WATER_3, - ABILITY_HYPER_CUTTER, - ABILITY_SHELL_ARMOR, - 0, // Safari Zone flee rate - BODY_COLOR_RED, TRUE - }, { // Voltorb - 40, 30, 50, 100, 55, 55, - TYPE_ELECTRIC, - TYPE_ELECTRIC, - 190, // catch rate - 103, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_MINERAL, - EGG_GROUP_MINERAL, - ABILITY_SOUNDPROOF, - ABILITY_STATIC, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Electrode - 60, 50, 70, 140, 80, 80, - TYPE_ELECTRIC, - TYPE_ELECTRIC, - 60, // catch rate - 150, // base exp. yield - 0, 0, 0, 2, 0, 0, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_MINERAL, - EGG_GROUP_MINERAL, - ABILITY_SOUNDPROOF, - ABILITY_STATIC, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Exeggcute - 60, 40, 80, 40, 60, 45, - TYPE_GRASS, - TYPE_PSYCHIC, - 90, // catch rate - 98, // base exp. yield - 0, 0, 1, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_GRASS, - EGG_GROUP_GRASS, - ABILITY_CHLOROPHYLL, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PINK - }, { // Exeggutor - 95, 95, 85, 55, 125, 65, - TYPE_GRASS, - TYPE_PSYCHIC, - 45, // catch rate - 212, // base exp. yield - 0, 0, 0, 0, 2, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_GRASS, - EGG_GROUP_GRASS, - ABILITY_CHLOROPHYLL, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Cubone - 50, 50, 95, 35, 40, 50, - TYPE_GROUND, - TYPE_GROUND, - 190, // catch rate - 87, // base exp. yield - 0, 0, 1, 0, 0, 0, - ITEM_NONE, - ITEM_THICK_CLUB, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_MONSTER, - EGG_GROUP_MONSTER, - ABILITY_ROCK_HEAD, - ABILITY_LIGHTNING_ROD, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Marowak - 60, 80, 110, 45, 50, 80, - TYPE_GROUND, - TYPE_GROUND, - 75, // catch rate - 124, // base exp. yield - 0, 0, 2, 0, 0, 0, - ITEM_NONE, - ITEM_THICK_CLUB, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_MONSTER, - EGG_GROUP_MONSTER, - ABILITY_ROCK_HEAD, - ABILITY_LIGHTNING_ROD, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Hitmonlee - 50, 120, 53, 87, 35, 110, - TYPE_FIGHTING, - TYPE_FIGHTING, - 45, // catch rate - 139, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 0, // gender - 25, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_HUMAN_LIKE, - EGG_GROUP_HUMAN_LIKE, - ABILITY_LIMBER, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Hitmonchan - 50, 105, 79, 76, 35, 110, - TYPE_FIGHTING, - TYPE_FIGHTING, - 45, // catch rate - 140, // base exp. yield - 0, 0, 0, 0, 0, 2, - ITEM_NONE, - ITEM_NONE, - 0, // gender - 25, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_HUMAN_LIKE, - EGG_GROUP_HUMAN_LIKE, - ABILITY_KEEN_EYE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Lickitung - 90, 55, 75, 30, 60, 75, - TYPE_NORMAL, - TYPE_NORMAL, - 45, // catch rate - 127, // base exp. yield - 2, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_MONSTER, - EGG_GROUP_MONSTER, - ABILITY_OWN_TEMPO, - ABILITY_OBLIVIOUS, - 0, // Safari Zone flee rate - BODY_COLOR_PINK - }, { // Koffing - 40, 65, 95, 35, 60, 45, - TYPE_POISON, - TYPE_POISON, - 190, // catch rate - 114, // base exp. yield - 0, 0, 1, 0, 0, 0, - ITEM_NONE, - ITEM_SMOKE_BALL, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_AMORPHOUS, - EGG_GROUP_AMORPHOUS, - ABILITY_LEVITATE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Weezing - 65, 90, 120, 60, 85, 70, - TYPE_POISON, - TYPE_POISON, - 60, // catch rate - 173, // base exp. yield - 0, 0, 2, 0, 0, 0, - ITEM_NONE, - ITEM_SMOKE_BALL, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_AMORPHOUS, - EGG_GROUP_AMORPHOUS, - ABILITY_LEVITATE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Rhyhorn - 80, 85, 95, 25, 30, 30, - TYPE_GROUND, - TYPE_ROCK, - 120, // catch rate - 135, // base exp. yield - 0, 0, 1, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_FIELD, - ABILITY_LIGHTNING_ROD, - ABILITY_ROCK_HEAD, - 4, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Rhydon - 105, 130, 120, 40, 45, 45, - TYPE_GROUND, - TYPE_ROCK, - 60, // catch rate - 204, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_FIELD, - ABILITY_LIGHTNING_ROD, - ABILITY_ROCK_HEAD, - 0, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Chansey - 250, 5, 5, 50, 35, 105, - TYPE_NORMAL, - TYPE_NORMAL, - 30, // catch rate - 255, // base exp. yield - 2, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_LUCKY_EGG, - 254, // gender - 40, // egg cycles - 140, // base friendship - GROWTH_FAST, - EGG_GROUP_FAIRY, - EGG_GROUP_FAIRY, - ABILITY_NATURAL_CURE, - ABILITY_SERENE_GRACE, - 0, // Safari Zone flee rate - BODY_COLOR_PINK - }, { // Tangela - 65, 55, 115, 60, 100, 40, - TYPE_GRASS, - TYPE_GRASS, - 45, // catch rate - 166, // base exp. yield - 0, 0, 1, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_GRASS, - EGG_GROUP_GRASS, - ABILITY_CHLOROPHYLL, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Kangaskhan - 105, 95, 80, 90, 40, 80, - TYPE_NORMAL, - TYPE_NORMAL, - 45, // catch rate - 175, // base exp. yield - 2, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 254, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_MONSTER, - EGG_GROUP_MONSTER, - ABILITY_EARLY_BIRD, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Horsea - 30, 40, 70, 60, 70, 25, - TYPE_WATER, - TYPE_WATER, - 225, // catch rate - 83, // base exp. yield - 0, 0, 0, 0, 1, 0, - ITEM_NONE, - ITEM_DRAGON_SCALE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_WATER_1, - EGG_GROUP_DRAGON, - ABILITY_SWIFT_SWIM, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Seadra - 55, 65, 95, 85, 95, 45, - TYPE_WATER, - TYPE_WATER, - 75, // catch rate - 155, // base exp. yield - 0, 0, 1, 0, 1, 0, - ITEM_NONE, - ITEM_DRAGON_SCALE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_WATER_1, - EGG_GROUP_DRAGON, - ABILITY_POISON_POINT, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Goldeen - 45, 67, 60, 63, 35, 50, - TYPE_WATER, - TYPE_WATER, - 225, // catch rate - 111, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_WATER_2, - EGG_GROUP_WATER_2, - ABILITY_SWIFT_SWIM, - ABILITY_WATER_VEIL, - 4, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Seaking - 80, 92, 65, 68, 65, 80, - TYPE_WATER, - TYPE_WATER, - 60, // catch rate - 170, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_WATER_2, - EGG_GROUP_WATER_2, - ABILITY_SWIFT_SWIM, - ABILITY_WATER_VEIL, - 6, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Staryu - 30, 45, 55, 85, 70, 55, - TYPE_WATER, - TYPE_WATER, - 225, // catch rate - 106, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_STARDUST, - ITEM_STAR_PIECE, - 255, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_WATER_3, - EGG_GROUP_WATER_3, - ABILITY_ILLUMINATE, - ABILITY_NATURAL_CURE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Starmie - 60, 75, 85, 115, 100, 85, - TYPE_WATER, - TYPE_PSYCHIC, - 60, // catch rate - 207, // base exp. yield - 0, 0, 0, 2, 0, 0, - ITEM_STARDUST, - ITEM_STAR_PIECE, - 255, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_WATER_3, - EGG_GROUP_WATER_3, - ABILITY_ILLUMINATE, - ABILITY_NATURAL_CURE, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Mr. mime - 40, 45, 65, 90, 100, 120, - TYPE_PSYCHIC, - TYPE_PSYCHIC, - 45, // catch rate - 136, // base exp. yield - 0, 0, 0, 0, 0, 2, - ITEM_NONE, - ITEM_LEPPA_BERRY, - 127, // gender - 25, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_HUMAN_LIKE, - EGG_GROUP_HUMAN_LIKE, - ABILITY_SOUNDPROOF, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PINK - }, { // Scyther - 70, 110, 80, 105, 55, 80, - TYPE_BUG, - TYPE_FLYING, - 45, // catch rate - 187, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 25, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_SWARM, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Jynx - 65, 50, 35, 95, 115, 95, - TYPE_ICE, - TYPE_PSYCHIC, - 45, // catch rate - 137, // base exp. yield - 0, 0, 0, 0, 2, 0, - ITEM_ASPEAR_BERRY, - ITEM_ASPEAR_BERRY, - 254, // gender - 25, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_HUMAN_LIKE, - EGG_GROUP_HUMAN_LIKE, - ABILITY_OBLIVIOUS, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Electabuzz - 65, 83, 57, 105, 95, 85, - TYPE_ELECTRIC, - TYPE_ELECTRIC, - 45, // catch rate - 156, // base exp. yield - 0, 0, 0, 2, 0, 0, - ITEM_NONE, - ITEM_NONE, - 63, // gender - 25, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_HUMAN_LIKE, - EGG_GROUP_HUMAN_LIKE, - ABILITY_STATIC, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW, TRUE - }, { // Magmar - 65, 95, 57, 93, 100, 85, - TYPE_FIRE, - TYPE_FIRE, - 45, // catch rate - 167, // base exp. yield - 0, 0, 0, 0, 2, 0, - ITEM_RAWST_BERRY, - ITEM_RAWST_BERRY, - 63, // gender - 25, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_HUMAN_LIKE, - EGG_GROUP_HUMAN_LIKE, - ABILITY_FLAME_BODY, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Pinsir - 65, 125, 100, 85, 55, 70, - TYPE_BUG, - TYPE_BUG, - 45, // catch rate - 200, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 25, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_HYPER_CUTTER, - ABILITY_NONE, - 8, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Tauros - 75, 100, 95, 110, 40, 70, - TYPE_NORMAL, - TYPE_NORMAL, - 45, // catch rate - 211, // base exp. yield - 0, 1, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 0, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_INTIMIDATE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Magikarp - 20, 10, 55, 80, 15, 20, - TYPE_WATER, - TYPE_WATER, - 255, // catch rate - 20, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 5, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_WATER_2, - EGG_GROUP_DRAGON, - ABILITY_SWIFT_SWIM, - ABILITY_NONE, - 4, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Gyarados - 95, 125, 79, 81, 60, 100, - TYPE_WATER, - TYPE_FLYING, - 45, // catch rate - 214, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 5, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_WATER_2, - EGG_GROUP_DRAGON, - ABILITY_INTIMIDATE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Lapras - 130, 85, 80, 60, 85, 95, - TYPE_WATER, - TYPE_ICE, - 45, // catch rate - 219, // base exp. yield - 2, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 40, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_WATER_1, - ABILITY_WATER_ABSORB, - ABILITY_SHELL_ARMOR, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Ditto - 48, 48, 48, 48, 48, 48, - TYPE_NORMAL, - TYPE_NORMAL, - 35, // catch rate - 61, // base exp. yield - 1, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_METAL_POWDER, - 255, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_DITTO, - EGG_GROUP_DITTO, - ABILITY_LIMBER, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Eevee - 55, 55, 50, 55, 45, 65, - TYPE_NORMAL, - TYPE_NORMAL, - 45, // catch rate - 92, // base exp. yield - 0, 0, 0, 0, 0, 1, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 35, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_RUN_AWAY, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Vaporeon - 130, 65, 60, 65, 110, 95, - TYPE_WATER, - TYPE_WATER, - 45, // catch rate - 196, // base exp. yield - 2, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 35, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_WATER_ABSORB, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Jolteon - 65, 65, 60, 130, 110, 95, - TYPE_ELECTRIC, - TYPE_ELECTRIC, - 45, // catch rate - 197, // base exp. yield - 0, 0, 0, 2, 0, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 35, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_VOLT_ABSORB, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Flareon - 65, 130, 60, 65, 95, 110, - TYPE_FIRE, - TYPE_FIRE, - 45, // catch rate - 198, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 35, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_FLASH_FIRE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Porygon - 65, 60, 70, 40, 85, 75, - TYPE_NORMAL, - TYPE_NORMAL, - 45, // catch rate - 130, // base exp. yield - 0, 0, 0, 0, 1, 0, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_MINERAL, - EGG_GROUP_MINERAL, - ABILITY_TRACE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PINK - }, { // Omanyte - 35, 40, 100, 35, 90, 55, - TYPE_ROCK, - TYPE_WATER, - 45, // catch rate - 120, // base exp. yield - 0, 0, 1, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 30, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_WATER_1, - EGG_GROUP_WATER_3, - ABILITY_SWIFT_SWIM, - ABILITY_SHELL_ARMOR, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Omastar - 70, 60, 125, 55, 115, 70, - TYPE_ROCK, - TYPE_WATER, - 45, // catch rate - 199, // base exp. yield - 0, 0, 2, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 30, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_WATER_1, - EGG_GROUP_WATER_3, - ABILITY_SWIFT_SWIM, - ABILITY_SHELL_ARMOR, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Kabuto - 30, 80, 90, 55, 55, 45, - TYPE_ROCK, - TYPE_WATER, - 45, // catch rate - 119, // base exp. yield - 0, 0, 1, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 30, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_WATER_1, - EGG_GROUP_WATER_3, - ABILITY_SWIFT_SWIM, - ABILITY_BATTLE_ARMOR, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Kabutops - 60, 115, 105, 80, 65, 70, - TYPE_ROCK, - TYPE_WATER, - 45, // catch rate - 201, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 30, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_WATER_1, - EGG_GROUP_WATER_3, - ABILITY_SWIFT_SWIM, - ABILITY_BATTLE_ARMOR, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Aerodactyl - 80, 105, 65, 130, 60, 75, - TYPE_ROCK, - TYPE_FLYING, - 45, // catch rate - 202, // base exp. yield - 0, 0, 0, 2, 0, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 35, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_FLYING, - EGG_GROUP_FLYING, - ABILITY_ROCK_HEAD, - ABILITY_PRESSURE, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Snorlax - 160, 110, 65, 30, 65, 110, - TYPE_NORMAL, - TYPE_NORMAL, - 25, // catch rate - 154, // base exp. yield - 2, 0, 0, 0, 0, 0, - ITEM_LEFTOVERS, - ITEM_LEFTOVERS, - 31, // gender - 40, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_MONSTER, - ABILITY_IMMUNITY, - ABILITY_THICK_FAT, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // Articuno - 90, 85, 100, 85, 95, 125, - TYPE_ICE, - TYPE_FLYING, - 3, // catch rate - 215, // base exp. yield - 0, 0, 0, 0, 0, 3, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 80, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_PRESSURE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Zapdos - 90, 90, 85, 100, 125, 90, - TYPE_ELECTRIC, - TYPE_FLYING, - 3, // catch rate - 216, // base exp. yield - 0, 0, 0, 0, 3, 0, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 80, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_PRESSURE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Moltres - 90, 100, 90, 90, 125, 85, - TYPE_FIRE, - TYPE_FLYING, - 3, // catch rate - 217, // base exp. yield - 0, 0, 0, 0, 3, 0, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 80, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_PRESSURE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Dratini - 41, 64, 45, 50, 50, 50, - TYPE_DRAGON, - TYPE_DRAGON, - 45, // catch rate - 67, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_DRAGON_SCALE, - 127, // gender - 40, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_WATER_1, - EGG_GROUP_DRAGON, - ABILITY_SHED_SKIN, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Dragonair - 61, 84, 65, 70, 70, 70, - TYPE_DRAGON, - TYPE_DRAGON, - 45, // catch rate - 144, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_DRAGON_SCALE, - 127, // gender - 40, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_WATER_1, - EGG_GROUP_DRAGON, - ABILITY_SHED_SKIN, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Dragonite - 91, 134, 95, 80, 100, 100, - TYPE_DRAGON, - TYPE_FLYING, - 45, // catch rate - 218, // base exp. yield - 0, 3, 0, 0, 0, 0, - ITEM_NONE, - ITEM_DRAGON_SCALE, - 127, // gender - 40, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_WATER_1, - EGG_GROUP_DRAGON, - ABILITY_INNER_FOCUS, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Mewtwo - 106, 110, 90, 130, 154, 90, - TYPE_PSYCHIC, - TYPE_PSYCHIC, - 3, // catch rate - 220, // base exp. yield - 0, 0, 0, 0, 3, 0, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_SLOW, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_PRESSURE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Mew - 100, 100, 100, 100, 100, 100, - TYPE_PSYCHIC, - TYPE_PSYCHIC, - 45, // catch rate - 64, // base exp. yield - 3, 0, 0, 0, 0, 0, - ITEM_LUM_BERRY, - ITEM_LUM_BERRY, - 255, // gender - 120, // egg cycles - 100, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_SYNCHRONIZE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PINK - }, { // Chikorita - 45, 49, 65, 45, 49, 65, - TYPE_GRASS, - TYPE_GRASS, - 45, // catch rate - 64, // base exp. yield - 0, 0, 0, 0, 0, 1, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_GRASS, - ABILITY_OVERGROW, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Bayleef - 60, 62, 80, 60, 63, 80, - TYPE_GRASS, - TYPE_GRASS, - 45, // catch rate - 141, // base exp. yield - 0, 0, 1, 0, 0, 1, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_GRASS, - ABILITY_OVERGROW, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Meganium - 80, 82, 100, 80, 83, 100, - TYPE_GRASS, - TYPE_GRASS, - 45, // catch rate - 208, // base exp. yield - 0, 0, 1, 0, 0, 2, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_GRASS, - ABILITY_OVERGROW, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Cyndaquil - 39, 52, 43, 65, 60, 50, - TYPE_FIRE, - TYPE_FIRE, - 45, // catch rate - 65, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_BLAZE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Quilava - 58, 64, 58, 80, 80, 65, - TYPE_FIRE, - TYPE_FIRE, - 45, // catch rate - 142, // base exp. yield - 0, 0, 0, 1, 1, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_BLAZE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Typhlosion - 78, 84, 78, 100, 109, 85, - TYPE_FIRE, - TYPE_FIRE, - 45, // catch rate - 209, // base exp. yield - 0, 0, 0, 0, 3, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_BLAZE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Totodile - 50, 65, 64, 43, 44, 48, - TYPE_WATER, - TYPE_WATER, - 45, // catch rate - 66, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_WATER_1, - ABILITY_TORRENT, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Croconaw - 65, 80, 80, 58, 59, 63, - TYPE_WATER, - TYPE_WATER, - 45, // catch rate - 143, // base exp. yield - 0, 1, 1, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_WATER_1, - ABILITY_TORRENT, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE, TRUE - }, { // Feraligatr - 85, 105, 100, 78, 79, 83, - TYPE_WATER, - TYPE_WATER, - 45, // catch rate - 210, // base exp. yield - 0, 2, 1, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_WATER_1, - ABILITY_TORRENT, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Sentret - 35, 46, 34, 20, 35, 45, - TYPE_NORMAL, - TYPE_NORMAL, - 255, // catch rate - 57, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_ORAN_BERRY, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_RUN_AWAY, - ABILITY_KEEN_EYE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Furret - 85, 76, 64, 90, 45, 55, - TYPE_NORMAL, - TYPE_NORMAL, - 90, // catch rate - 116, // base exp. yield - 0, 0, 0, 2, 0, 0, - ITEM_ORAN_BERRY, - ITEM_SITRUS_BERRY, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_RUN_AWAY, - ABILITY_KEEN_EYE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Hoothoot - 60, 30, 30, 50, 36, 56, - TYPE_NORMAL, - TYPE_FLYING, - 255, // catch rate - 58, // base exp. yield - 1, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FLYING, - EGG_GROUP_FLYING, - ABILITY_INSOMNIA, - ABILITY_KEEN_EYE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Noctowl - 100, 50, 50, 70, 76, 96, - TYPE_NORMAL, - TYPE_FLYING, - 90, // catch rate - 162, // base exp. yield - 2, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FLYING, - EGG_GROUP_FLYING, - ABILITY_INSOMNIA, - ABILITY_KEEN_EYE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Ledyba - 40, 20, 30, 55, 40, 80, - TYPE_BUG, - TYPE_FLYING, - 255, // catch rate - 54, // base exp. yield - 0, 0, 0, 0, 0, 1, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_FAST, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_SWARM, - ABILITY_EARLY_BIRD, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Ledian - 55, 35, 50, 85, 55, 110, - TYPE_BUG, - TYPE_FLYING, - 90, // catch rate - 134, // base exp. yield - 0, 0, 0, 0, 0, 2, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_FAST, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_SWARM, - ABILITY_EARLY_BIRD, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Spinarak - 40, 60, 40, 30, 40, 40, - TYPE_BUG, - TYPE_POISON, - 255, // catch rate - 54, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_FAST, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_SWARM, - ABILITY_INSOMNIA, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Ariados - 70, 90, 70, 40, 60, 60, - TYPE_BUG, - TYPE_POISON, - 90, // catch rate - 134, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_FAST, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_SWARM, - ABILITY_INSOMNIA, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Crobat - 85, 90, 80, 130, 70, 80, - TYPE_POISON, - TYPE_FLYING, - 90, // catch rate - 204, // base exp. yield - 0, 0, 0, 3, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FLYING, - EGG_GROUP_FLYING, - ABILITY_INNER_FOCUS, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Chinchou - 75, 38, 38, 67, 56, 56, - TYPE_WATER, - TYPE_ELECTRIC, - 190, // catch rate - 90, // base exp. yield - 1, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_YELLOW_SHARD, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_WATER_2, - EGG_GROUP_WATER_2, - ABILITY_VOLT_ABSORB, - ABILITY_ILLUMINATE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Lanturn - 125, 58, 58, 67, 76, 76, - TYPE_WATER, - TYPE_ELECTRIC, - 75, // catch rate - 156, // base exp. yield - 2, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_YELLOW_SHARD, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_WATER_2, - EGG_GROUP_WATER_2, - ABILITY_VOLT_ABSORB, - ABILITY_ILLUMINATE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Pichu - 20, 40, 15, 60, 35, 35, - TYPE_ELECTRIC, - TYPE_ELECTRIC, - 190, // catch rate - 42, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_ORAN_BERRY, - 127, // gender - 10, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_STATIC, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Cleffa - 50, 25, 28, 15, 45, 55, - TYPE_NORMAL, - TYPE_NORMAL, - 150, // catch rate - 37, // base exp. yield - 0, 0, 0, 0, 0, 1, - ITEM_LEPPA_BERRY, - ITEM_MOON_STONE, - 191, // gender - 10, // egg cycles - 140, // base friendship - GROWTH_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_CUTE_CHARM, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PINK - }, { // Igglybuff - 90, 30, 15, 15, 40, 20, - TYPE_NORMAL, - TYPE_NORMAL, - 170, // catch rate - 39, // base exp. yield - 1, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 191, // gender - 10, // egg cycles - 70, // base friendship - GROWTH_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_CUTE_CHARM, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PINK, TRUE - }, { // Togepi - 35, 20, 65, 20, 40, 65, - TYPE_NORMAL, - TYPE_NORMAL, - 190, // catch rate - 74, // base exp. yield - 0, 0, 0, 0, 0, 1, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 10, // egg cycles - 70, // base friendship - GROWTH_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_HUSTLE, - ABILITY_SERENE_GRACE, - 0, // Safari Zone flee rate - BODY_COLOR_WHITE - }, { // Togetic - 55, 40, 85, 40, 80, 105, - TYPE_NORMAL, - TYPE_FLYING, - 75, // catch rate - 114, // base exp. yield - 0, 0, 0, 0, 0, 2, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 10, // egg cycles - 70, // base friendship - GROWTH_FAST, - EGG_GROUP_FLYING, - EGG_GROUP_FAIRY, - ABILITY_HUSTLE, - ABILITY_SERENE_GRACE, - 0, // Safari Zone flee rate - BODY_COLOR_WHITE - }, { // Natu - 40, 50, 45, 70, 70, 45, - TYPE_PSYCHIC, - TYPE_FLYING, - 190, // catch rate - 73, // base exp. yield - 0, 0, 0, 0, 1, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FLYING, - EGG_GROUP_FLYING, - ABILITY_SYNCHRONIZE, - ABILITY_EARLY_BIRD, - 6, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Xatu - 65, 75, 70, 95, 95, 70, - TYPE_PSYCHIC, - TYPE_FLYING, - 75, // catch rate - 171, // base exp. yield - 0, 0, 0, 1, 1, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FLYING, - EGG_GROUP_FLYING, - ABILITY_SYNCHRONIZE, - ABILITY_EARLY_BIRD, - 8, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Mareep - 55, 40, 40, 35, 65, 45, - TYPE_ELECTRIC, - TYPE_ELECTRIC, - 235, // catch rate - 59, // base exp. yield - 0, 0, 0, 0, 1, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_FIELD, - ABILITY_STATIC, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_WHITE - }, { // Flaaffy - 70, 55, 55, 45, 80, 60, - TYPE_ELECTRIC, - TYPE_ELECTRIC, - 120, // catch rate - 117, // base exp. yield - 0, 0, 0, 0, 2, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_FIELD, - ABILITY_STATIC, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PINK - }, { // Ampharos - 90, 75, 75, 55, 115, 90, - TYPE_ELECTRIC, - TYPE_ELECTRIC, - 45, // catch rate - 194, // base exp. yield - 0, 0, 0, 0, 3, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_FIELD, - ABILITY_STATIC, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Bellossom - 75, 80, 85, 50, 90, 100, - TYPE_GRASS, - TYPE_GRASS, - 45, // catch rate - 184, // base exp. yield - 0, 0, 0, 0, 0, 3, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_GRASS, - EGG_GROUP_GRASS, - ABILITY_CHLOROPHYLL, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Marill - 70, 20, 50, 40, 20, 50, - TYPE_WATER, - TYPE_WATER, - 190, // catch rate - 58, // base exp. yield - 2, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 10, // egg cycles - 70, // base friendship - GROWTH_FAST, - EGG_GROUP_WATER_1, - EGG_GROUP_FAIRY, - ABILITY_THICK_FAT, - ABILITY_HUGE_POWER, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Azumarill - 100, 50, 80, 50, 50, 80, - TYPE_WATER, - TYPE_WATER, - 75, // catch rate - 153, // base exp. yield - 3, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 10, // egg cycles - 70, // base friendship - GROWTH_FAST, - EGG_GROUP_WATER_1, - EGG_GROUP_FAIRY, - ABILITY_THICK_FAT, - ABILITY_HUGE_POWER, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Sudowoodo - 70, 100, 115, 30, 30, 65, - TYPE_ROCK, - TYPE_ROCK, - 65, // catch rate - 135, // base exp. yield - 0, 0, 2, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_MINERAL, - EGG_GROUP_MINERAL, - ABILITY_STURDY, - ABILITY_ROCK_HEAD, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Politoed - 90, 75, 75, 70, 90, 100, - TYPE_WATER, - TYPE_WATER, - 45, // catch rate - 185, // base exp. yield - 0, 0, 0, 0, 0, 3, - ITEM_NONE, - ITEM_KINGS_ROCK, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_WATER_1, - EGG_GROUP_WATER_1, - ABILITY_WATER_ABSORB, - ABILITY_DAMP, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN, TRUE - }, { // Hoppip - 35, 35, 40, 50, 35, 55, - TYPE_GRASS, - TYPE_FLYING, - 255, // catch rate - 74, // base exp. yield - 0, 0, 0, 0, 0, 1, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_FAIRY, - EGG_GROUP_GRASS, - ABILITY_CHLOROPHYLL, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PINK - }, { // Skiploom - 55, 45, 50, 80, 45, 65, - TYPE_GRASS, - TYPE_FLYING, - 120, // catch rate - 136, // base exp. yield - 0, 0, 0, 2, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_FAIRY, - EGG_GROUP_GRASS, - ABILITY_CHLOROPHYLL, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Jumpluff - 75, 55, 70, 110, 55, 85, - TYPE_GRASS, - TYPE_FLYING, - 45, // catch rate - 176, // base exp. yield - 0, 0, 0, 3, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_FAIRY, - EGG_GROUP_GRASS, - ABILITY_CHLOROPHYLL, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Aipom - 55, 70, 55, 85, 40, 55, - TYPE_NORMAL, - TYPE_NORMAL, - 45, // catch rate - 94, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_RUN_AWAY, - ABILITY_PICKUP, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Sunkern - 30, 30, 30, 30, 30, 30, - TYPE_GRASS, - TYPE_GRASS, - 235, // catch rate - 52, // base exp. yield - 0, 0, 0, 0, 1, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_GRASS, - EGG_GROUP_GRASS, - ABILITY_CHLOROPHYLL, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Sunflora - 75, 75, 55, 30, 105, 85, - TYPE_GRASS, - TYPE_GRASS, - 120, // catch rate - 146, // base exp. yield - 0, 0, 0, 0, 2, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_GRASS, - EGG_GROUP_GRASS, - ABILITY_CHLOROPHYLL, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Yanma - 65, 65, 45, 95, 75, 45, - TYPE_BUG, - TYPE_FLYING, - 75, // catch rate - 147, // base exp. yield - 0, 0, 0, 2, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_SPEED_BOOST, - ABILITY_COMPOUND_EYES, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Wooper - 55, 45, 45, 15, 25, 25, - TYPE_WATER, - TYPE_GROUND, - 255, // catch rate - 52, // base exp. yield - 1, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_WATER_1, - EGG_GROUP_FIELD, - ABILITY_DAMP, - ABILITY_WATER_ABSORB, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Quagsire - 95, 85, 85, 35, 65, 65, - TYPE_WATER, - TYPE_GROUND, - 90, // catch rate - 137, // base exp. yield - 2, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_WATER_1, - EGG_GROUP_FIELD, - ABILITY_DAMP, - ABILITY_WATER_ABSORB, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Espeon - 65, 65, 60, 110, 130, 95, - TYPE_PSYCHIC, - TYPE_PSYCHIC, - 45, // catch rate - 197, // base exp. yield - 0, 0, 0, 0, 2, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 35, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_SYNCHRONIZE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Umbreon - 95, 65, 110, 65, 60, 130, - TYPE_DARK, - TYPE_DARK, - 45, // catch rate - 197, // base exp. yield - 0, 0, 0, 0, 0, 2, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 35, // egg cycles - 35, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_SYNCHRONIZE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // Murkrow - 60, 85, 42, 91, 85, 42, - TYPE_DARK, - TYPE_FLYING, - 30, // catch rate - 107, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 35, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_FLYING, - EGG_GROUP_FLYING, - ABILITY_INSOMNIA, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // Slowking - 95, 75, 80, 30, 100, 110, - TYPE_WATER, - TYPE_PSYCHIC, - 70, // catch rate - 164, // base exp. yield - 0, 0, 0, 0, 0, 3, - ITEM_NONE, - ITEM_KINGS_ROCK, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_MONSTER, - EGG_GROUP_WATER_1, - ABILITY_OBLIVIOUS, - ABILITY_OWN_TEMPO, - 0, // Safari Zone flee rate - BODY_COLOR_PINK - }, { // Misdreavus - 60, 60, 60, 85, 85, 85, - TYPE_GHOST, - TYPE_GHOST, - 45, // catch rate - 147, // base exp. yield - 0, 0, 0, 0, 1, 1, - ITEM_NONE, - ITEM_SPELL_TAG, - 127, // gender - 25, // egg cycles - 35, // base friendship - GROWTH_FAST, - EGG_GROUP_AMORPHOUS, - EGG_GROUP_AMORPHOUS, - ABILITY_LEVITATE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Unown - 48, 72, 48, 48, 72, 48, - TYPE_PSYCHIC, - TYPE_PSYCHIC, - 225, // catch rate - 61, // base exp. yield - 0, 1, 0, 0, 1, 0, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 40, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_LEVITATE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK, TRUE - }, { // Wobbuffet - 190, 33, 58, 33, 33, 58, - TYPE_PSYCHIC, - TYPE_PSYCHIC, - 45, // catch rate - 177, // base exp. yield - 2, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_AMORPHOUS, - EGG_GROUP_AMORPHOUS, - ABILITY_SHADOW_TAG, - ABILITY_NONE, - 4, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Girafarig - 70, 80, 65, 85, 90, 65, - TYPE_NORMAL, - TYPE_PSYCHIC, - 60, // catch rate - 149, // base exp. yield - 0, 0, 0, 0, 2, 0, - ITEM_NONE, - ITEM_PERSIM_BERRY, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_INNER_FOCUS, - ABILITY_EARLY_BIRD, - 4, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Pineco - 50, 65, 90, 15, 35, 35, - TYPE_BUG, - TYPE_BUG, - 190, // catch rate - 60, // base exp. yield - 0, 0, 1, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_STURDY, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Forretress - 75, 90, 140, 40, 60, 60, - TYPE_BUG, - TYPE_STEEL, - 75, // catch rate - 118, // base exp. yield - 0, 0, 2, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_STURDY, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Dunsparce - 100, 70, 70, 45, 65, 65, - TYPE_NORMAL, - TYPE_NORMAL, - 190, // catch rate - 75, // base exp. yield - 1, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_SERENE_GRACE, - ABILITY_RUN_AWAY, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Gligar - 65, 75, 105, 85, 35, 65, - TYPE_GROUND, - TYPE_FLYING, - 60, // catch rate - 108, // base exp. yield - 0, 0, 1, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_HYPER_CUTTER, - ABILITY_SAND_VEIL, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Steelix - 75, 85, 200, 30, 55, 65, - TYPE_STEEL, - TYPE_GROUND, - 25, // catch rate - 196, // base exp. yield - 0, 0, 2, 0, 0, 0, - ITEM_NONE, - ITEM_METAL_COAT, - 127, // gender - 25, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_MINERAL, - EGG_GROUP_MINERAL, - ABILITY_ROCK_HEAD, - ABILITY_STURDY, - 0, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Snubbull - 60, 80, 50, 30, 40, 40, - TYPE_NORMAL, - TYPE_NORMAL, - 190, // catch rate - 63, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 191, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FAIRY, - ABILITY_INTIMIDATE, - ABILITY_RUN_AWAY, - 0, // Safari Zone flee rate - BODY_COLOR_PINK - }, { // Granbull - 90, 120, 75, 45, 60, 60, - TYPE_NORMAL, - TYPE_NORMAL, - 75, // catch rate - 178, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 191, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FAIRY, - ABILITY_INTIMIDATE, - ABILITY_INTIMIDATE, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Qwilfish - 65, 95, 75, 85, 55, 55, - TYPE_WATER, - TYPE_POISON, - 45, // catch rate - 100, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_WATER_2, - EGG_GROUP_WATER_2, - ABILITY_POISON_POINT, - ABILITY_SWIFT_SWIM, - 0, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Scizor - 70, 130, 100, 65, 55, 80, - TYPE_BUG, - TYPE_STEEL, - 25, // catch rate - 200, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 25, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_SWARM, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Shuckle - 20, 10, 230, 5, 10, 230, - TYPE_BUG, - TYPE_ROCK, - 190, // catch rate - 80, // base exp. yield - 0, 0, 1, 0, 0, 1, - ITEM_ORAN_BERRY, - ITEM_ORAN_BERRY, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_STURDY, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Heracross - 80, 125, 75, 85, 40, 95, - TYPE_BUG, - TYPE_FIGHTING, - 45, // catch rate - 200, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 25, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_SWARM, - ABILITY_GUTS, - 8, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Sneasel - 55, 95, 55, 115, 35, 75, - TYPE_DARK, - TYPE_ICE, - 60, // catch rate - 132, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_QUICK_CLAW, - 127, // gender - 20, // egg cycles - 35, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_INNER_FOCUS, - ABILITY_KEEN_EYE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK, TRUE - }, { // Teddiursa - 60, 80, 50, 40, 50, 50, - TYPE_NORMAL, - TYPE_NORMAL, - 120, // catch rate - 124, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_PICKUP, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN, TRUE - }, { // Ursaring - 90, 130, 75, 55, 75, 75, - TYPE_NORMAL, - TYPE_NORMAL, - 60, // catch rate - 189, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_GUTS, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Slugma - 40, 40, 40, 20, 70, 40, - TYPE_FIRE, - TYPE_FIRE, - 190, // catch rate - 78, // base exp. yield - 0, 0, 0, 0, 1, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_AMORPHOUS, - EGG_GROUP_AMORPHOUS, - ABILITY_MAGMA_ARMOR, - ABILITY_FLAME_BODY, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Magcargo - 50, 50, 120, 30, 80, 80, - TYPE_FIRE, - TYPE_ROCK, - 75, // catch rate - 154, // base exp. yield - 0, 0, 2, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_AMORPHOUS, - EGG_GROUP_AMORPHOUS, - ABILITY_MAGMA_ARMOR, - ABILITY_FLAME_BODY, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Swinub - 50, 50, 40, 50, 30, 30, - TYPE_ICE, - TYPE_GROUND, - 225, // catch rate - 78, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_OBLIVIOUS, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Piloswine - 100, 100, 80, 50, 60, 60, - TYPE_ICE, - TYPE_GROUND, - 75, // catch rate - 160, // base exp. yield - 1, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_OBLIVIOUS, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Corsola - 55, 55, 85, 35, 65, 85, - TYPE_WATER, - TYPE_ROCK, - 60, // catch rate - 113, // base exp. yield - 0, 0, 1, 0, 0, 1, - ITEM_NONE, - ITEM_RED_SHARD, - 191, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_FAST, - EGG_GROUP_WATER_1, - EGG_GROUP_WATER_3, - ABILITY_HUSTLE, - ABILITY_NATURAL_CURE, - 0, // Safari Zone flee rate - BODY_COLOR_PINK - }, { // Remoraid - 35, 65, 35, 65, 65, 35, - TYPE_WATER, - TYPE_WATER, - 190, // catch rate - 78, // base exp. yield - 0, 0, 0, 0, 1, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_WATER_1, - EGG_GROUP_WATER_2, - ABILITY_HUSTLE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Octillery - 75, 105, 75, 45, 105, 75, - TYPE_WATER, - TYPE_WATER, - 75, // catch rate - 164, // base exp. yield - 0, 1, 0, 0, 1, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_WATER_1, - EGG_GROUP_WATER_2, - ABILITY_SUCTION_CUPS, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Delibird - 45, 55, 45, 75, 65, 45, - TYPE_ICE, - TYPE_FLYING, - 45, // catch rate - 183, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_FAST, - EGG_GROUP_WATER_1, - EGG_GROUP_FIELD, - ABILITY_VITAL_SPIRIT, - ABILITY_HUSTLE, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Mantine - 65, 40, 70, 70, 80, 140, - TYPE_WATER, - TYPE_FLYING, - 25, // catch rate - 168, // base exp. yield - 0, 0, 0, 0, 0, 2, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 25, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_WATER_1, - EGG_GROUP_WATER_1, - ABILITY_SWIFT_SWIM, - ABILITY_WATER_ABSORB, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Skarmory - 65, 80, 140, 70, 40, 70, - TYPE_STEEL, - TYPE_FLYING, - 25, // catch rate - 168, // base exp. yield - 0, 0, 2, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 25, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_FLYING, - EGG_GROUP_FLYING, - ABILITY_KEEN_EYE, - ABILITY_STURDY, - 0, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Houndour - 45, 60, 30, 65, 80, 50, - TYPE_DARK, - TYPE_FIRE, - 120, // catch rate - 114, // base exp. yield - 0, 0, 0, 0, 1, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_EARLY_BIRD, - ABILITY_FLASH_FIRE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // Houndoom - 75, 90, 50, 95, 110, 80, - TYPE_DARK, - TYPE_FIRE, - 45, // catch rate - 204, // base exp. yield - 0, 0, 0, 0, 2, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_EARLY_BIRD, - ABILITY_FLASH_FIRE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // Kingdra - 75, 95, 95, 85, 95, 95, - TYPE_WATER, - TYPE_DRAGON, - 45, // catch rate - 207, // base exp. yield - 0, 1, 0, 0, 1, 1, - ITEM_NONE, - ITEM_DRAGON_SCALE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_WATER_1, - EGG_GROUP_DRAGON, - ABILITY_SWIFT_SWIM, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Phanpy - 90, 60, 60, 40, 40, 40, - TYPE_GROUND, - TYPE_GROUND, - 120, // catch rate - 124, // base exp. yield - 1, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_PICKUP, - ABILITY_NONE, - 10, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Donphan - 90, 120, 120, 50, 60, 60, - TYPE_GROUND, - TYPE_GROUND, - 60, // catch rate - 189, // base exp. yield - 0, 1, 1, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_STURDY, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Porygon2 - 85, 80, 90, 60, 105, 95, - TYPE_NORMAL, - TYPE_NORMAL, - 45, // catch rate - 180, // base exp. yield - 0, 0, 0, 0, 2, 0, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_MINERAL, - EGG_GROUP_MINERAL, - ABILITY_TRACE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Stantler - 73, 95, 62, 85, 85, 65, - TYPE_NORMAL, - TYPE_NORMAL, - 45, // catch rate - 165, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_INTIMIDATE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Smeargle - 55, 20, 35, 75, 20, 45, - TYPE_NORMAL, - TYPE_NORMAL, - 45, // catch rate - 106, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_OWN_TEMPO, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_WHITE - }, { // Tyrogue - 35, 35, 35, 35, 35, 35, - TYPE_FIGHTING, - TYPE_FIGHTING, - 75, // catch rate - 91, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 0, // gender - 25, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_GUTS, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Hitmontop - 50, 95, 95, 70, 35, 110, - TYPE_FIGHTING, - TYPE_FIGHTING, - 45, // catch rate - 138, // base exp. yield - 0, 0, 0, 0, 0, 2, - ITEM_NONE, - ITEM_NONE, - 0, // gender - 25, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_HUMAN_LIKE, - EGG_GROUP_HUMAN_LIKE, - ABILITY_INTIMIDATE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Smoochum - 45, 30, 15, 65, 85, 65, - TYPE_ICE, - TYPE_PSYCHIC, - 45, // catch rate - 87, // base exp. yield - 0, 0, 0, 0, 1, 0, - ITEM_ASPEAR_BERRY, - ITEM_ASPEAR_BERRY, - 254, // gender - 25, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_OBLIVIOUS, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PINK - }, { // Elekid - 45, 63, 37, 95, 65, 55, - TYPE_ELECTRIC, - TYPE_ELECTRIC, - 45, // catch rate - 106, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 63, // gender - 25, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_STATIC, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW, TRUE - }, { // Magby - 45, 75, 37, 83, 70, 55, - TYPE_FIRE, - TYPE_FIRE, - 45, // catch rate - 117, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_RAWST_BERRY, - ITEM_RAWST_BERRY, - 63, // gender - 25, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_FLAME_BODY, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Miltank - 95, 80, 105, 100, 40, 70, - TYPE_NORMAL, - TYPE_NORMAL, - 45, // catch rate - 200, // base exp. yield - 0, 0, 2, 0, 0, 0, - ITEM_MOOMOO_MILK, - ITEM_MOOMOO_MILK, - 254, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_THICK_FAT, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PINK - }, { // Blissey - 255, 10, 10, 55, 75, 135, - TYPE_NORMAL, - TYPE_NORMAL, - 30, // catch rate - 255, // base exp. yield - 2, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_LUCKY_EGG, - 254, // gender - 40, // egg cycles - 140, // base friendship - GROWTH_FAST, - EGG_GROUP_FAIRY, - EGG_GROUP_FAIRY, - ABILITY_NATURAL_CURE, - ABILITY_SERENE_GRACE, - 0, // Safari Zone flee rate - BODY_COLOR_PINK - }, { // Raikou - 90, 85, 75, 115, 115, 100, - TYPE_ELECTRIC, - TYPE_ELECTRIC, - 3, // catch rate - 216, // base exp. yield - 0, 0, 0, 2, 1, 0, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 80, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_PRESSURE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Entei - 115, 115, 85, 100, 90, 75, - TYPE_FIRE, - TYPE_FIRE, - 3, // catch rate - 217, // base exp. yield - 1, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 80, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_PRESSURE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Suicune - 100, 75, 115, 85, 90, 115, - TYPE_WATER, - TYPE_WATER, - 3, // catch rate - 215, // base exp. yield - 0, 0, 1, 0, 0, 2, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 80, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_PRESSURE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Larvitar - 50, 64, 50, 41, 45, 50, - TYPE_ROCK, - TYPE_GROUND, - 45, // catch rate - 67, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 40, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_MONSTER, - ABILITY_GUTS, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Pupitar - 70, 84, 70, 51, 65, 70, - TYPE_ROCK, - TYPE_GROUND, - 45, // catch rate - 144, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 40, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_MONSTER, - ABILITY_SHED_SKIN, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Tyranitar - 100, 134, 110, 61, 95, 100, - TYPE_ROCK, - TYPE_DARK, - 45, // catch rate - 218, // base exp. yield - 0, 3, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 40, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_MONSTER, - ABILITY_SAND_STREAM, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Lugia - 106, 90, 130, 110, 90, 154, - TYPE_PSYCHIC, - TYPE_FLYING, - 3, // catch rate - 220, // base exp. yield - 0, 0, 0, 0, 0, 3, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_SLOW, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_PRESSURE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_WHITE - }, { // Ho-Oh - 106, 130, 90, 90, 110, 154, - TYPE_FIRE, - TYPE_FLYING, - 3, // catch rate - 220, // base exp. yield - 0, 0, 0, 0, 0, 3, - ITEM_SACRED_ASH, - ITEM_SACRED_ASH, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_SLOW, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_PRESSURE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Celebi - 100, 100, 100, 100, 100, 100, - TYPE_PSYCHIC, - TYPE_GRASS, - 45, // catch rate - 64, // base exp. yield - 3, 0, 0, 0, 0, 0, - ITEM_LUM_BERRY, - ITEM_LUM_BERRY, - 255, // gender - 120, // egg cycles - 100, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_NATURAL_CURE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // ? - 50, 150, 50, 150, 150, 50, - TYPE_NORMAL, - TYPE_NORMAL, - 3, // catch rate - 1, // base exp. yield - 2, 2, 2, 2, 2, 2, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_NONE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // ? - 50, 150, 50, 150, 150, 50, - TYPE_NORMAL, - TYPE_NORMAL, - 3, // catch rate - 1, // base exp. yield - 2, 2, 2, 2, 2, 2, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_NONE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // ? - 50, 150, 50, 150, 150, 50, - TYPE_NORMAL, - TYPE_NORMAL, - 3, // catch rate - 1, // base exp. yield - 2, 2, 2, 2, 2, 2, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_NONE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // ? - 50, 150, 50, 150, 150, 50, - TYPE_NORMAL, - TYPE_NORMAL, - 3, // catch rate - 1, // base exp. yield - 2, 2, 2, 2, 2, 2, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_NONE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // ? - 50, 150, 50, 150, 150, 50, - TYPE_NORMAL, - TYPE_NORMAL, - 3, // catch rate - 1, // base exp. yield - 2, 2, 2, 2, 2, 2, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_NONE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // ? - 50, 150, 50, 150, 150, 50, - TYPE_NORMAL, - TYPE_NORMAL, - 3, // catch rate - 1, // base exp. yield - 2, 2, 2, 2, 2, 2, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_NONE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // ? - 50, 150, 50, 150, 150, 50, - TYPE_NORMAL, - TYPE_NORMAL, - 3, // catch rate - 1, // base exp. yield - 2, 2, 2, 2, 2, 2, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_NONE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // ? - 50, 150, 50, 150, 150, 50, - TYPE_NORMAL, - TYPE_NORMAL, - 3, // catch rate - 1, // base exp. yield - 2, 2, 2, 2, 2, 2, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_NONE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // ? - 50, 150, 50, 150, 150, 50, - TYPE_NORMAL, - TYPE_NORMAL, - 3, // catch rate - 1, // base exp. yield - 2, 2, 2, 2, 2, 2, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_NONE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // ? - 50, 150, 50, 150, 150, 50, - TYPE_NORMAL, - TYPE_NORMAL, - 3, // catch rate - 1, // base exp. yield - 2, 2, 2, 2, 2, 2, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_NONE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // ? - 50, 150, 50, 150, 150, 50, - TYPE_NORMAL, - TYPE_NORMAL, - 3, // catch rate - 1, // base exp. yield - 2, 2, 2, 2, 2, 2, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_NONE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // ? - 50, 150, 50, 150, 150, 50, - TYPE_NORMAL, - TYPE_NORMAL, - 3, // catch rate - 1, // base exp. yield - 2, 2, 2, 2, 2, 2, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_NONE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // ? - 50, 150, 50, 150, 150, 50, - TYPE_NORMAL, - TYPE_NORMAL, - 3, // catch rate - 1, // base exp. yield - 2, 2, 2, 2, 2, 2, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_NONE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // ? - 50, 150, 50, 150, 150, 50, - TYPE_NORMAL, - TYPE_NORMAL, - 3, // catch rate - 1, // base exp. yield - 2, 2, 2, 2, 2, 2, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_NONE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // ? - 50, 150, 50, 150, 150, 50, - TYPE_NORMAL, - TYPE_NORMAL, - 3, // catch rate - 1, // base exp. yield - 2, 2, 2, 2, 2, 2, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_NONE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // ? - 50, 150, 50, 150, 150, 50, - TYPE_NORMAL, - TYPE_NORMAL, - 3, // catch rate - 1, // base exp. yield - 2, 2, 2, 2, 2, 2, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_NONE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // ? - 50, 150, 50, 150, 150, 50, - TYPE_NORMAL, - TYPE_NORMAL, - 3, // catch rate - 1, // base exp. yield - 2, 2, 2, 2, 2, 2, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_NONE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // ? - 50, 150, 50, 150, 150, 50, - TYPE_NORMAL, - TYPE_NORMAL, - 3, // catch rate - 1, // base exp. yield - 2, 2, 2, 2, 2, 2, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_NONE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // ? - 50, 150, 50, 150, 150, 50, - TYPE_NORMAL, - TYPE_NORMAL, - 3, // catch rate - 1, // base exp. yield - 2, 2, 2, 2, 2, 2, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_NONE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // ? - 50, 150, 50, 150, 150, 50, - TYPE_NORMAL, - TYPE_NORMAL, - 3, // catch rate - 1, // base exp. yield - 2, 2, 2, 2, 2, 2, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_NONE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // ? - 50, 150, 50, 150, 150, 50, - TYPE_NORMAL, - TYPE_NORMAL, - 3, // catch rate - 1, // base exp. yield - 2, 2, 2, 2, 2, 2, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_NONE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // ? - 50, 150, 50, 150, 150, 50, - TYPE_NORMAL, - TYPE_NORMAL, - 3, // catch rate - 1, // base exp. yield - 2, 2, 2, 2, 2, 2, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_NONE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // ? - 50, 150, 50, 150, 150, 50, - TYPE_NORMAL, - TYPE_NORMAL, - 3, // catch rate - 1, // base exp. yield - 2, 2, 2, 2, 2, 2, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_NONE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // ? - 50, 150, 50, 150, 150, 50, - TYPE_NORMAL, - TYPE_NORMAL, - 3, // catch rate - 1, // base exp. yield - 2, 2, 2, 2, 2, 2, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_NONE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // ? - 50, 150, 50, 150, 150, 50, - TYPE_NORMAL, - TYPE_NORMAL, - 3, // catch rate - 1, // base exp. yield - 2, 2, 2, 2, 2, 2, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_NONE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // Treecko - 40, 45, 35, 70, 65, 55, - TYPE_GRASS, - TYPE_GRASS, - 45, // catch rate - 65, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_DRAGON, - ABILITY_OVERGROW, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Grovyle - 50, 65, 45, 95, 85, 65, - TYPE_GRASS, - TYPE_GRASS, - 45, // catch rate - 141, // base exp. yield - 0, 0, 0, 2, 0, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_DRAGON, - ABILITY_OVERGROW, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Sceptile - 70, 85, 65, 120, 105, 85, - TYPE_GRASS, - TYPE_GRASS, - 45, // catch rate - 208, // base exp. yield - 0, 0, 0, 3, 0, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_DRAGON, - ABILITY_OVERGROW, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Torchic - 45, 60, 40, 45, 70, 50, - TYPE_FIRE, - TYPE_FIRE, - 45, // catch rate - 65, // base exp. yield - 0, 0, 0, 0, 1, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_BLAZE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Combusken - 60, 85, 60, 55, 85, 60, - TYPE_FIRE, - TYPE_FIGHTING, - 45, // catch rate - 142, // base exp. yield - 0, 1, 0, 0, 1, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_BLAZE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Blaziken - 80, 120, 70, 80, 110, 70, - TYPE_FIRE, - TYPE_FIGHTING, - 45, // catch rate - 209, // base exp. yield - 0, 3, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_BLAZE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Mudkip - 50, 70, 50, 40, 50, 50, - TYPE_WATER, - TYPE_WATER, - 45, // catch rate - 65, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_WATER_1, - ABILITY_TORRENT, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Marshtomp - 70, 85, 70, 50, 60, 70, - TYPE_WATER, - TYPE_GROUND, - 45, // catch rate - 143, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_WATER_1, - ABILITY_TORRENT, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Swampert - 100, 110, 90, 60, 85, 90, - TYPE_WATER, - TYPE_GROUND, - 45, // catch rate - 210, // base exp. yield - 0, 3, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_WATER_1, - ABILITY_TORRENT, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Poochyena - 35, 55, 35, 35, 30, 30, - TYPE_DARK, - TYPE_DARK, - 255, // catch rate - 55, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_PECHA_BERRY, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_RUN_AWAY, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Mightyena - 70, 90, 70, 70, 60, 60, - TYPE_DARK, - TYPE_DARK, - 127, // catch rate - 128, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_PECHA_BERRY, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_INTIMIDATE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Zigzagoon - 38, 30, 41, 60, 30, 41, - TYPE_NORMAL, - TYPE_NORMAL, - 255, // catch rate - 60, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_ORAN_BERRY, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_PICKUP, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Linoone - 78, 70, 61, 100, 50, 61, - TYPE_NORMAL, - TYPE_NORMAL, - 90, // catch rate - 128, // base exp. yield - 0, 0, 0, 2, 0, 0, - ITEM_ORAN_BERRY, - ITEM_SITRUS_BERRY, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_PICKUP, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_WHITE - }, { // Wurmple - 45, 45, 35, 20, 20, 30, - TYPE_BUG, - TYPE_BUG, - 255, // catch rate - 54, // base exp. yield - 1, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_SHIELD_DUST, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Silcoon - 50, 35, 55, 15, 25, 25, - TYPE_BUG, - TYPE_BUG, - 120, // catch rate - 71, // base exp. yield - 0, 0, 2, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_SHED_SKIN, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_WHITE - }, { // Beautifly - 60, 70, 50, 65, 90, 50, - TYPE_BUG, - TYPE_FLYING, - 45, // catch rate - 161, // base exp. yield - 0, 0, 0, 0, 3, 0, - ITEM_NONE, - ITEM_SILVER_POWDER, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_SWARM, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Cascoon - 50, 35, 55, 15, 25, 25, - TYPE_BUG, - TYPE_BUG, - 120, // catch rate - 72, // base exp. yield - 0, 0, 2, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_SHED_SKIN, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Dustox - 60, 50, 70, 65, 50, 90, - TYPE_BUG, - TYPE_POISON, - 45, // catch rate - 160, // base exp. yield - 0, 0, 0, 0, 0, 3, - ITEM_NONE, - ITEM_SILVER_POWDER, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_SHIELD_DUST, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Lotad - 40, 30, 30, 30, 40, 50, - TYPE_WATER, - TYPE_GRASS, - 255, // catch rate - 74, // base exp. yield - 0, 0, 0, 0, 0, 1, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_WATER_1, - EGG_GROUP_GRASS, - ABILITY_SWIFT_SWIM, - ABILITY_RAIN_DISH, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Lombre - 60, 50, 50, 50, 60, 70, - TYPE_WATER, - TYPE_GRASS, - 120, // catch rate - 141, // base exp. yield - 0, 0, 0, 0, 0, 2, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_WATER_1, - EGG_GROUP_GRASS, - ABILITY_SWIFT_SWIM, - ABILITY_RAIN_DISH, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Ludicolo - 80, 70, 70, 70, 90, 100, - TYPE_WATER, - TYPE_GRASS, - 45, // catch rate - 181, // base exp. yield - 0, 0, 0, 0, 0, 3, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_WATER_1, - EGG_GROUP_GRASS, - ABILITY_SWIFT_SWIM, - ABILITY_RAIN_DISH, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Seedot - 40, 40, 50, 30, 30, 30, - TYPE_GRASS, - TYPE_GRASS, - 255, // catch rate - 74, // base exp. yield - 0, 0, 1, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_FIELD, - EGG_GROUP_GRASS, - ABILITY_CHLOROPHYLL, - ABILITY_EARLY_BIRD, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Nuzleaf - 70, 70, 40, 60, 60, 40, - TYPE_GRASS, - TYPE_DARK, - 120, // catch rate - 141, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_FIELD, - EGG_GROUP_GRASS, - ABILITY_CHLOROPHYLL, - ABILITY_EARLY_BIRD, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Shiftry - 90, 100, 60, 80, 90, 60, - TYPE_GRASS, - TYPE_DARK, - 45, // catch rate - 181, // base exp. yield - 0, 3, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_FIELD, - EGG_GROUP_GRASS, - ABILITY_CHLOROPHYLL, - ABILITY_EARLY_BIRD, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Nincada - 31, 45, 90, 40, 30, 30, - TYPE_BUG, - TYPE_GROUND, - 255, // catch rate - 65, // base exp. yield - 0, 0, 1, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_ERRATIC, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_COMPOUND_EYES, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Ninjask - 61, 90, 45, 160, 50, 50, - TYPE_BUG, - TYPE_FLYING, - 120, // catch rate - 155, // base exp. yield - 0, 0, 0, 2, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_ERRATIC, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_SPEED_BOOST, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Shedinja - 1, 90, 45, 40, 30, 30, - TYPE_BUG, - TYPE_GHOST, - 45, // catch rate - 95, // base exp. yield - 2, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_ERRATIC, - EGG_GROUP_MINERAL, - EGG_GROUP_MINERAL, - ABILITY_WONDER_GUARD, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Taillow - 40, 55, 30, 85, 30, 30, - TYPE_NORMAL, - TYPE_FLYING, - 200, // catch rate - 59, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_FLYING, - EGG_GROUP_FLYING, - ABILITY_GUTS, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Swellow - 60, 85, 60, 125, 50, 50, - TYPE_NORMAL, - TYPE_FLYING, - 45, // catch rate - 162, // base exp. yield - 0, 0, 0, 2, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_FLYING, - EGG_GROUP_FLYING, - ABILITY_GUTS, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Shroomish - 60, 40, 60, 35, 40, 60, - TYPE_GRASS, - TYPE_GRASS, - 255, // catch rate - 65, // base exp. yield - 1, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_FLUCTUATING, - EGG_GROUP_FAIRY, - EGG_GROUP_GRASS, - ABILITY_EFFECT_SPORE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Breloom - 60, 130, 80, 70, 60, 60, - TYPE_GRASS, - TYPE_FIGHTING, - 90, // catch rate - 165, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_FLUCTUATING, - EGG_GROUP_FAIRY, - EGG_GROUP_GRASS, - ABILITY_EFFECT_SPORE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Spinda - 60, 60, 60, 60, 60, 60, - TYPE_NORMAL, - TYPE_NORMAL, - 255, // catch rate - 85, // base exp. yield - 0, 0, 0, 0, 1, 0, - ITEM_NONE, - ITEM_CHESTO_BERRY, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_HUMAN_LIKE, - ABILITY_OWN_TEMPO, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN, TRUE - }, { // Wingull - 40, 30, 30, 85, 55, 30, - TYPE_WATER, - TYPE_FLYING, - 190, // catch rate - 64, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_WATER_1, - EGG_GROUP_FLYING, - ABILITY_KEEN_EYE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_WHITE - }, { // Pelipper - 60, 50, 100, 65, 85, 70, - TYPE_WATER, - TYPE_FLYING, - 45, // catch rate - 164, // base exp. yield - 0, 0, 2, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_WATER_1, - EGG_GROUP_FLYING, - ABILITY_KEEN_EYE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Surskit - 40, 30, 32, 65, 50, 52, - TYPE_BUG, - TYPE_WATER, - 200, // catch rate - 63, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_WATER_1, - EGG_GROUP_BUG, - ABILITY_SWIFT_SWIM, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Masquerain - 70, 60, 62, 60, 80, 82, - TYPE_BUG, - TYPE_FLYING, - 75, // catch rate - 128, // base exp. yield - 0, 0, 0, 0, 1, 1, - ITEM_NONE, - ITEM_SILVER_POWDER, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_WATER_1, - EGG_GROUP_BUG, - ABILITY_INTIMIDATE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Wailmer - 130, 70, 35, 60, 70, 35, - TYPE_WATER, - TYPE_WATER, - 125, // catch rate - 137, // base exp. yield - 1, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 40, // egg cycles - 70, // base friendship - GROWTH_FLUCTUATING, - EGG_GROUP_FIELD, - EGG_GROUP_WATER_2, - ABILITY_WATER_VEIL, - ABILITY_OBLIVIOUS, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Wailord - 170, 90, 45, 60, 90, 45, - TYPE_WATER, - TYPE_WATER, - 60, // catch rate - 206, // base exp. yield - 2, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 40, // egg cycles - 70, // base friendship - GROWTH_FLUCTUATING, - EGG_GROUP_FIELD, - EGG_GROUP_WATER_2, - ABILITY_WATER_VEIL, - ABILITY_OBLIVIOUS, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Skitty - 50, 45, 45, 50, 35, 35, - TYPE_NORMAL, - TYPE_NORMAL, - 255, // catch rate - 65, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_LEPPA_BERRY, - 191, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FAIRY, - ABILITY_CUTE_CHARM, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PINK - }, { // Delcatty - 70, 65, 65, 70, 55, 55, - TYPE_NORMAL, - TYPE_NORMAL, - 60, // catch rate - 138, // base exp. yield - 1, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_LEPPA_BERRY, - 191, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FAIRY, - ABILITY_CUTE_CHARM, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Kecleon - 60, 90, 70, 40, 60, 120, - TYPE_NORMAL, - TYPE_NORMAL, - 200, // catch rate - 132, // base exp. yield - 0, 0, 0, 0, 0, 1, - ITEM_NONE, - ITEM_PERSIM_BERRY, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_COLOR_CHANGE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Baltoy - 40, 40, 55, 55, 40, 70, - TYPE_GROUND, - TYPE_PSYCHIC, - 255, // catch rate - 58, // base exp. yield - 0, 0, 0, 0, 0, 1, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_MINERAL, - EGG_GROUP_MINERAL, - ABILITY_LEVITATE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Claydol - 60, 70, 105, 75, 70, 120, - TYPE_GROUND, - TYPE_PSYCHIC, - 90, // catch rate - 189, // base exp. yield - 0, 0, 0, 0, 0, 2, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_MINERAL, - EGG_GROUP_MINERAL, - ABILITY_LEVITATE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // Nosepass - 30, 45, 135, 30, 45, 90, - TYPE_ROCK, - TYPE_ROCK, - 255, // catch rate - 108, // base exp. yield - 0, 0, 1, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_MINERAL, - EGG_GROUP_MINERAL, - ABILITY_STURDY, - ABILITY_MAGNET_PULL, - 0, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Torkoal - 70, 85, 140, 20, 85, 70, - TYPE_FIRE, - TYPE_FIRE, - 90, // catch rate - 161, // base exp. yield - 0, 0, 2, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_WHITE_SMOKE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Sableye - 50, 75, 75, 50, 65, 65, - TYPE_DARK, - TYPE_GHOST, - 45, // catch rate - 98, // base exp. yield - 0, 1, 1, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 25, // egg cycles - 35, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_HUMAN_LIKE, - EGG_GROUP_HUMAN_LIKE, - ABILITY_KEEN_EYE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Barboach - 50, 48, 43, 60, 46, 41, - TYPE_WATER, - TYPE_GROUND, - 190, // catch rate - 92, // base exp. yield - 1, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_WATER_2, - EGG_GROUP_WATER_2, - ABILITY_OBLIVIOUS, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Whiscash - 110, 78, 73, 60, 76, 71, - TYPE_WATER, - TYPE_GROUND, - 75, // catch rate - 158, // base exp. yield - 2, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_WATER_2, - EGG_GROUP_WATER_2, - ABILITY_OBLIVIOUS, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Luvdisc - 43, 30, 55, 97, 40, 65, - TYPE_WATER, - TYPE_WATER, - 225, // catch rate - 110, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_HEART_SCALE, - ITEM_NONE, - 191, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_FAST, - EGG_GROUP_WATER_2, - EGG_GROUP_WATER_2, - ABILITY_SWIFT_SWIM, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PINK - }, { // Corphish - 43, 80, 65, 35, 50, 35, - TYPE_WATER, - TYPE_WATER, - 205, // catch rate - 111, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_FLUCTUATING, - EGG_GROUP_WATER_1, - EGG_GROUP_WATER_3, - ABILITY_HYPER_CUTTER, - ABILITY_SHELL_ARMOR, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Crawdaunt - 63, 120, 85, 55, 90, 55, - TYPE_WATER, - TYPE_DARK, - 155, // catch rate - 161, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_FLUCTUATING, - EGG_GROUP_WATER_1, - EGG_GROUP_WATER_3, - ABILITY_HYPER_CUTTER, - ABILITY_SHELL_ARMOR, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Feebas - 20, 15, 20, 80, 10, 55, - TYPE_WATER, - TYPE_WATER, - 255, // catch rate - 61, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_ERRATIC, - EGG_GROUP_WATER_1, - EGG_GROUP_DRAGON, - ABILITY_SWIFT_SWIM, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Milotic - 95, 60, 79, 81, 100, 125, - TYPE_WATER, - TYPE_WATER, - 60, // catch rate - 213, // base exp. yield - 0, 0, 0, 0, 0, 2, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_ERRATIC, - EGG_GROUP_WATER_1, - EGG_GROUP_DRAGON, - ABILITY_MARVEL_SCALE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PINK - }, { // Carvanha - 45, 90, 20, 65, 65, 20, - TYPE_WATER, - TYPE_DARK, - 225, // catch rate - 88, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_WATER_2, - EGG_GROUP_WATER_2, - ABILITY_ROUGH_SKIN, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Sharpedo - 70, 120, 40, 95, 95, 40, - TYPE_WATER, - TYPE_DARK, - 60, // catch rate - 175, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_WATER_2, - EGG_GROUP_WATER_2, - ABILITY_ROUGH_SKIN, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Trapinch - 45, 100, 45, 10, 45, 45, - TYPE_GROUND, - TYPE_GROUND, - 255, // catch rate - 73, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_SOFT_SAND, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_HYPER_CUTTER, - ABILITY_ARENA_TRAP, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Vibrava - 50, 70, 50, 70, 50, 50, - TYPE_GROUND, - TYPE_DRAGON, - 120, // catch rate - 126, // base exp. yield - 0, 1, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_LEVITATE, - ABILITY_LEVITATE, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Flygon - 80, 100, 80, 100, 80, 80, - TYPE_GROUND, - TYPE_DRAGON, - 45, // catch rate - 197, // base exp. yield - 0, 1, 0, 2, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_BUG, - EGG_GROUP_BUG, - ABILITY_LEVITATE, - ABILITY_LEVITATE, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Makuhita - 72, 60, 30, 25, 20, 30, - TYPE_FIGHTING, - TYPE_FIGHTING, - 180, // catch rate - 87, // base exp. yield - 1, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 63, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_FLUCTUATING, - EGG_GROUP_HUMAN_LIKE, - EGG_GROUP_HUMAN_LIKE, - ABILITY_THICK_FAT, - ABILITY_GUTS, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Hariyama - 144, 120, 60, 50, 40, 60, - TYPE_FIGHTING, - TYPE_FIGHTING, - 200, // catch rate - 184, // base exp. yield - 2, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_KINGS_ROCK, - 63, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_FLUCTUATING, - EGG_GROUP_HUMAN_LIKE, - EGG_GROUP_HUMAN_LIKE, - ABILITY_THICK_FAT, - ABILITY_GUTS, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Electrike - 40, 45, 40, 65, 65, 40, - TYPE_ELECTRIC, - TYPE_ELECTRIC, - 120, // catch rate - 104, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_STATIC, - ABILITY_LIGHTNING_ROD, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Manectric - 70, 75, 60, 105, 105, 60, - TYPE_ELECTRIC, - TYPE_ELECTRIC, - 45, // catch rate - 168, // base exp. yield - 0, 0, 0, 2, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_STATIC, - ABILITY_LIGHTNING_ROD, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Numel - 60, 60, 40, 35, 65, 45, - TYPE_FIRE, - TYPE_GROUND, - 255, // catch rate - 88, // base exp. yield - 0, 0, 0, 0, 1, 0, - ITEM_RAWST_BERRY, - ITEM_RAWST_BERRY, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_OBLIVIOUS, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Camerupt - 70, 100, 70, 40, 105, 75, - TYPE_FIRE, - TYPE_GROUND, - 150, // catch rate - 175, // base exp. yield - 0, 1, 0, 0, 1, 0, - ITEM_RAWST_BERRY, - ITEM_RAWST_BERRY, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_MAGMA_ARMOR, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Spheal - 70, 40, 50, 25, 55, 50, - TYPE_ICE, - TYPE_WATER, - 255, // catch rate - 75, // base exp. yield - 1, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_WATER_1, - EGG_GROUP_FIELD, - ABILITY_THICK_FAT, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Sealeo - 90, 60, 70, 45, 75, 70, - TYPE_ICE, - TYPE_WATER, - 120, // catch rate - 128, // base exp. yield - 2, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_WATER_1, - EGG_GROUP_FIELD, - ABILITY_THICK_FAT, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Walrein - 110, 80, 90, 65, 95, 90, - TYPE_ICE, - TYPE_WATER, - 45, // catch rate - 192, // base exp. yield - 3, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_WATER_1, - EGG_GROUP_FIELD, - ABILITY_THICK_FAT, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Cacnea - 50, 85, 40, 35, 85, 40, - TYPE_GRASS, - TYPE_GRASS, - 190, // catch rate - 97, // base exp. yield - 0, 0, 0, 0, 1, 0, - ITEM_NONE, - ITEM_POISON_BARB, - 127, // gender - 20, // egg cycles - 35, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_GRASS, - EGG_GROUP_HUMAN_LIKE, - ABILITY_SAND_VEIL, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Cacturne - 70, 115, 60, 55, 115, 60, - TYPE_GRASS, - TYPE_DARK, - 60, // catch rate - 177, // base exp. yield - 0, 1, 0, 0, 1, 0, - ITEM_NONE, - ITEM_POISON_BARB, - 127, // gender - 20, // egg cycles - 35, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_GRASS, - EGG_GROUP_HUMAN_LIKE, - ABILITY_SAND_VEIL, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Snorunt - 50, 50, 50, 50, 50, 50, - TYPE_ICE, - TYPE_ICE, - 190, // catch rate - 74, // base exp. yield - 1, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FAIRY, - EGG_GROUP_MINERAL, - ABILITY_INNER_FOCUS, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Glalie - 80, 80, 80, 80, 80, 80, - TYPE_ICE, - TYPE_ICE, - 75, // catch rate - 187, // base exp. yield - 2, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NEVER_MELT_ICE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FAIRY, - EGG_GROUP_MINERAL, - ABILITY_INNER_FOCUS, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Lunatone - 70, 55, 65, 70, 95, 85, - TYPE_ROCK, - TYPE_PSYCHIC, - 45, // catch rate - 150, // base exp. yield - 0, 0, 0, 0, 2, 0, - ITEM_NONE, - ITEM_MOON_STONE, - 255, // gender - 25, // egg cycles - 70, // base friendship - GROWTH_FAST, - EGG_GROUP_MINERAL, - EGG_GROUP_MINERAL, - ABILITY_LEVITATE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Solrock - 70, 95, 85, 70, 55, 65, - TYPE_ROCK, - TYPE_PSYCHIC, - 45, // catch rate - 150, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_SUN_STONE, - 255, // gender - 25, // egg cycles - 70, // base friendship - GROWTH_FAST, - EGG_GROUP_MINERAL, - EGG_GROUP_MINERAL, - ABILITY_LEVITATE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Azurill - 50, 20, 40, 20, 20, 40, - TYPE_NORMAL, - TYPE_NORMAL, - 150, // catch rate - 33, // base exp. yield - 1, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 191, // gender - 10, // egg cycles - 70, // base friendship - GROWTH_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_THICK_FAT, - ABILITY_HUGE_POWER, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Spoink - 60, 25, 35, 60, 70, 80, - TYPE_PSYCHIC, - TYPE_PSYCHIC, - 255, // catch rate - 89, // base exp. yield - 0, 0, 0, 0, 0, 1, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_THICK_FAT, - ABILITY_OWN_TEMPO, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // Grumpig - 80, 45, 65, 80, 90, 110, - TYPE_PSYCHIC, - TYPE_PSYCHIC, - 60, // catch rate - 164, // base exp. yield - 0, 0, 0, 0, 0, 2, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_THICK_FAT, - ABILITY_OWN_TEMPO, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Plusle - 60, 50, 40, 95, 85, 75, - TYPE_ELECTRIC, - TYPE_ELECTRIC, - 200, // catch rate - 120, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FAIRY, - EGG_GROUP_FAIRY, - ABILITY_PLUS, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Minun - 60, 40, 50, 95, 75, 85, - TYPE_ELECTRIC, - TYPE_ELECTRIC, - 200, // catch rate - 120, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FAIRY, - EGG_GROUP_FAIRY, - ABILITY_MINUS, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Mawile - 50, 85, 85, 50, 55, 55, - TYPE_STEEL, - TYPE_STEEL, - 45, // catch rate - 98, // base exp. yield - 0, 1, 1, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_FAST, - EGG_GROUP_FIELD, - EGG_GROUP_FAIRY, - ABILITY_HYPER_CUTTER, - ABILITY_INTIMIDATE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // Meditite - 30, 40, 55, 60, 40, 55, - TYPE_FIGHTING, - TYPE_PSYCHIC, - 180, // catch rate - 91, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_HUMAN_LIKE, - EGG_GROUP_HUMAN_LIKE, - ABILITY_PURE_POWER, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Medicham - 60, 60, 75, 80, 60, 75, - TYPE_FIGHTING, - TYPE_PSYCHIC, - 90, // catch rate - 153, // base exp. yield - 0, 0, 0, 2, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_HUMAN_LIKE, - EGG_GROUP_HUMAN_LIKE, - ABILITY_PURE_POWER, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Swablu - 45, 40, 60, 50, 40, 75, - TYPE_NORMAL, - TYPE_FLYING, - 255, // catch rate - 74, // base exp. yield - 0, 0, 0, 0, 0, 1, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_ERRATIC, - EGG_GROUP_FLYING, - EGG_GROUP_DRAGON, - ABILITY_NATURAL_CURE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Altaria - 75, 70, 90, 80, 70, 105, - TYPE_DRAGON, - TYPE_FLYING, - 45, // catch rate - 188, // base exp. yield - 0, 0, 0, 0, 0, 2, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_ERRATIC, - EGG_GROUP_FLYING, - EGG_GROUP_DRAGON, - ABILITY_NATURAL_CURE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Wynaut - 95, 23, 48, 23, 23, 48, - TYPE_PSYCHIC, - TYPE_PSYCHIC, - 125, // catch rate - 44, // base exp. yield - 1, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_SHADOW_TAG, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Duskull - 20, 40, 90, 25, 30, 90, - TYPE_GHOST, - TYPE_GHOST, - 190, // catch rate - 97, // base exp. yield - 0, 0, 1, 0, 0, 1, - ITEM_NONE, - ITEM_SPELL_TAG, - 127, // gender - 25, // egg cycles - 35, // base friendship - GROWTH_FAST, - EGG_GROUP_AMORPHOUS, - EGG_GROUP_AMORPHOUS, - ABILITY_LEVITATE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // Dusclops - 40, 70, 130, 25, 60, 130, - TYPE_GHOST, - TYPE_GHOST, - 90, // catch rate - 179, // base exp. yield - 0, 0, 1, 0, 0, 2, - ITEM_NONE, - ITEM_SPELL_TAG, - 127, // gender - 25, // egg cycles - 35, // base friendship - GROWTH_FAST, - EGG_GROUP_AMORPHOUS, - EGG_GROUP_AMORPHOUS, - ABILITY_PRESSURE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // Roselia - 50, 60, 45, 65, 100, 80, - TYPE_GRASS, - TYPE_POISON, - 150, // catch rate - 152, // base exp. yield - 0, 0, 0, 0, 1, 0, - ITEM_NONE, - ITEM_POISON_BARB, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_FAIRY, - EGG_GROUP_GRASS, - ABILITY_NATURAL_CURE, - ABILITY_POISON_POINT, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN, TRUE - }, { // Slakoth - 60, 60, 60, 30, 35, 35, - TYPE_NORMAL, - TYPE_NORMAL, - 255, // catch rate - 83, // base exp. yield - 1, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_TRUANT, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Vigoroth - 80, 80, 80, 90, 55, 55, - TYPE_NORMAL, - TYPE_NORMAL, - 120, // catch rate - 126, // base exp. yield - 0, 0, 0, 2, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_VITAL_SPIRIT, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_WHITE - }, { // Slaking - 150, 160, 100, 100, 95, 65, - TYPE_NORMAL, - TYPE_NORMAL, - 45, // catch rate - 210, // base exp. yield - 3, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_TRUANT, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Gulpin - 70, 43, 53, 40, 43, 53, - TYPE_POISON, - TYPE_POISON, - 225, // catch rate - 75, // base exp. yield - 1, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_BIG_PEARL, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_FLUCTUATING, - EGG_GROUP_AMORPHOUS, - EGG_GROUP_AMORPHOUS, - ABILITY_LIQUID_OOZE, - ABILITY_STICKY_HOLD, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Swalot - 100, 73, 83, 55, 73, 83, - TYPE_POISON, - TYPE_POISON, - 75, // catch rate - 168, // base exp. yield - 2, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_BIG_PEARL, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_FLUCTUATING, - EGG_GROUP_AMORPHOUS, - EGG_GROUP_AMORPHOUS, - ABILITY_LIQUID_OOZE, - ABILITY_STICKY_HOLD, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Tropius - 99, 68, 83, 51, 72, 87, - TYPE_GRASS, - TYPE_FLYING, - 200, // catch rate - 169, // base exp. yield - 2, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 25, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_GRASS, - ABILITY_CHLOROPHYLL, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Whismur - 64, 51, 23, 28, 51, 23, - TYPE_NORMAL, - TYPE_NORMAL, - 190, // catch rate - 68, // base exp. yield - 1, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_CHESTO_BERRY, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_FIELD, - ABILITY_SOUNDPROOF, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PINK - }, { // Loudred - 84, 71, 43, 48, 71, 43, - TYPE_NORMAL, - TYPE_NORMAL, - 120, // catch rate - 126, // base exp. yield - 2, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_CHESTO_BERRY, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_FIELD, - ABILITY_SOUNDPROOF, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Exploud - 104, 91, 63, 68, 91, 63, - TYPE_NORMAL, - TYPE_NORMAL, - 45, // catch rate - 184, // base exp. yield - 3, 0, 0, 0, 0, 0, - ITEM_NONE, - ITEM_CHESTO_BERRY, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_FIELD, - ABILITY_SOUNDPROOF, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Clamperl - 35, 64, 85, 32, 74, 55, - TYPE_WATER, - TYPE_WATER, - 255, // catch rate - 142, // base exp. yield - 0, 0, 1, 0, 0, 0, - ITEM_NONE, - ITEM_BLUE_SHARD, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_ERRATIC, - EGG_GROUP_WATER_1, - EGG_GROUP_WATER_1, - ABILITY_SHELL_ARMOR, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Huntail - 55, 104, 105, 52, 94, 75, - TYPE_WATER, - TYPE_WATER, - 60, // catch rate - 178, // base exp. yield - 0, 1, 1, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_ERRATIC, - EGG_GROUP_WATER_1, - EGG_GROUP_WATER_1, - ABILITY_SWIFT_SWIM, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Gorebyss - 55, 84, 105, 52, 114, 75, - TYPE_WATER, - TYPE_WATER, - 60, // catch rate - 178, // base exp. yield - 0, 0, 0, 0, 2, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_ERRATIC, - EGG_GROUP_WATER_1, - EGG_GROUP_WATER_1, - ABILITY_SWIFT_SWIM, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PINK - }, { // Absol - 65, 130, 60, 75, 75, 60, - TYPE_DARK, - TYPE_DARK, - 30, // catch rate - 174, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 25, // egg cycles - 35, // base friendship - GROWTH_MEDIUM_SLOW, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_PRESSURE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_WHITE, TRUE - }, { // Shuppet - 44, 75, 35, 45, 63, 33, - TYPE_GHOST, - TYPE_GHOST, - 225, // catch rate - 97, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_SPELL_TAG, - 127, // gender - 25, // egg cycles - 35, // base friendship - GROWTH_FAST, - EGG_GROUP_AMORPHOUS, - EGG_GROUP_AMORPHOUS, - ABILITY_INSOMNIA, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // Banette - 64, 115, 65, 65, 83, 63, - TYPE_GHOST, - TYPE_GHOST, - 45, // catch rate - 179, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_SPELL_TAG, - 127, // gender - 25, // egg cycles - 35, // base friendship - GROWTH_FAST, - EGG_GROUP_AMORPHOUS, - EGG_GROUP_AMORPHOUS, - ABILITY_INSOMNIA, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK - }, { // Seviper - 73, 100, 60, 65, 100, 60, - TYPE_POISON, - TYPE_POISON, - 90, // catch rate - 165, // base exp. yield - 0, 1, 0, 0, 1, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_FLUCTUATING, - EGG_GROUP_FIELD, - EGG_GROUP_DRAGON, - ABILITY_SHED_SKIN, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLACK, TRUE - }, { // Zangoose - 73, 115, 60, 90, 60, 60, - TYPE_NORMAL, - TYPE_NORMAL, - 90, // catch rate - 165, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 70, // base friendship - GROWTH_ERRATIC, - EGG_GROUP_FIELD, - EGG_GROUP_FIELD, - ABILITY_IMMUNITY, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_WHITE, TRUE - }, { // Relicanth - 100, 90, 130, 55, 45, 65, - TYPE_WATER, - TYPE_ROCK, - 25, // catch rate - 198, // base exp. yield - 1, 0, 1, 0, 0, 0, - ITEM_NONE, - ITEM_GREEN_SHARD, - 31, // gender - 40, // egg cycles - 70, // base friendship - GROWTH_SLOW, - EGG_GROUP_WATER_1, - EGG_GROUP_WATER_2, - ABILITY_SWIFT_SWIM, - ABILITY_ROCK_HEAD, - 0, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Aron - 50, 70, 100, 30, 40, 40, - TYPE_STEEL, - TYPE_ROCK, - 180, // catch rate - 96, // base exp. yield - 0, 0, 1, 0, 0, 0, - ITEM_NONE, - ITEM_HARD_STONE, - 127, // gender - 35, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_MONSTER, - ABILITY_STURDY, - ABILITY_ROCK_HEAD, - 0, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Lairon - 60, 90, 140, 40, 50, 50, - TYPE_STEEL, - TYPE_ROCK, - 90, // catch rate - 152, // base exp. yield - 0, 0, 2, 0, 0, 0, - ITEM_NONE, - ITEM_HARD_STONE, - 127, // gender - 35, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_MONSTER, - ABILITY_STURDY, - ABILITY_ROCK_HEAD, - 0, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Aggron - 70, 110, 180, 50, 60, 60, - TYPE_STEEL, - TYPE_ROCK, - 45, // catch rate - 205, // base exp. yield - 0, 0, 3, 0, 0, 0, - ITEM_NONE, - ITEM_HARD_STONE, - 127, // gender - 35, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_MONSTER, - EGG_GROUP_MONSTER, - ABILITY_STURDY, - ABILITY_ROCK_HEAD, - 0, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Castform - 70, 70, 70, 70, 70, 70, - TYPE_NORMAL, - TYPE_NORMAL, - 45, // catch rate - 145, // base exp. yield - 1, 0, 0, 0, 0, 0, - ITEM_MYSTIC_WATER, - ITEM_MYSTIC_WATER, - 127, // gender - 25, // egg cycles - 70, // base friendship - GROWTH_MEDIUM_FAST, - EGG_GROUP_FAIRY, - EGG_GROUP_AMORPHOUS, - ABILITY_FORECAST, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_WHITE - }, { // Volbeat - 65, 73, 55, 85, 47, 75, - TYPE_BUG, - TYPE_BUG, - 150, // catch rate - 146, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 0, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_ERRATIC, - EGG_GROUP_BUG, - EGG_GROUP_HUMAN_LIKE, - ABILITY_ILLUMINATE, - ABILITY_SWARM, - 0, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Illumise - 65, 47, 55, 85, 73, 75, - TYPE_BUG, - TYPE_BUG, - 150, // catch rate - 146, // base exp. yield - 0, 0, 0, 1, 0, 0, - ITEM_NONE, - ITEM_NONE, - 254, // gender - 15, // egg cycles - 70, // base friendship - GROWTH_FLUCTUATING, - EGG_GROUP_BUG, - EGG_GROUP_HUMAN_LIKE, - ABILITY_OBLIVIOUS, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Lileep - 66, 41, 77, 23, 61, 87, - TYPE_ROCK, - TYPE_GRASS, - 45, // catch rate - 121, // base exp. yield - 0, 0, 0, 0, 0, 1, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 30, // egg cycles - 70, // base friendship - GROWTH_ERRATIC, - EGG_GROUP_WATER_3, - EGG_GROUP_WATER_3, - ABILITY_SUCTION_CUPS, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_PURPLE - }, { // Cradily - 86, 81, 97, 43, 81, 107, - TYPE_ROCK, - TYPE_GRASS, - 45, // catch rate - 201, // base exp. yield - 0, 0, 0, 0, 0, 2, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 30, // egg cycles - 70, // base friendship - GROWTH_ERRATIC, - EGG_GROUP_WATER_3, - EGG_GROUP_WATER_3, - ABILITY_SUCTION_CUPS, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Anorith - 45, 95, 50, 75, 40, 50, - TYPE_ROCK, - TYPE_BUG, - 45, // catch rate - 119, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 30, // egg cycles - 70, // base friendship - GROWTH_ERRATIC, - EGG_GROUP_WATER_3, - EGG_GROUP_WATER_3, - ABILITY_BATTLE_ARMOR, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Armaldo - 75, 125, 100, 45, 70, 80, - TYPE_ROCK, - TYPE_BUG, - 45, // catch rate - 200, // base exp. yield - 0, 2, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 31, // gender - 30, // egg cycles - 70, // base friendship - GROWTH_ERRATIC, - EGG_GROUP_WATER_3, - EGG_GROUP_WATER_3, - ABILITY_BATTLE_ARMOR, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Ralts - 28, 25, 25, 40, 45, 35, - TYPE_PSYCHIC, - TYPE_PSYCHIC, - 235, // catch rate - 70, // base exp. yield - 0, 0, 0, 0, 1, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_AMORPHOUS, - EGG_GROUP_AMORPHOUS, - ABILITY_SYNCHRONIZE, - ABILITY_TRACE, - 0, // Safari Zone flee rate - BODY_COLOR_WHITE - }, { // Kirlia - 38, 35, 35, 50, 65, 55, - TYPE_PSYCHIC, - TYPE_PSYCHIC, - 120, // catch rate - 140, // base exp. yield - 0, 0, 0, 0, 2, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_AMORPHOUS, - EGG_GROUP_AMORPHOUS, - ABILITY_SYNCHRONIZE, - ABILITY_TRACE, - 0, // Safari Zone flee rate - BODY_COLOR_WHITE - }, { // Gardevoir - 68, 65, 65, 80, 125, 115, - TYPE_PSYCHIC, - TYPE_PSYCHIC, - 45, // catch rate - 208, // base exp. yield - 0, 0, 0, 0, 3, 0, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 20, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_AMORPHOUS, - EGG_GROUP_AMORPHOUS, - ABILITY_SYNCHRONIZE, - ABILITY_TRACE, - 0, // Safari Zone flee rate - BODY_COLOR_WHITE - }, { // Bagon - 45, 75, 60, 50, 40, 30, - TYPE_DRAGON, - TYPE_DRAGON, - 45, // catch rate - 89, // base exp. yield - 0, 1, 0, 0, 0, 0, - ITEM_NONE, - ITEM_DRAGON_SCALE, - 127, // gender - 40, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_DRAGON, - EGG_GROUP_DRAGON, - ABILITY_ROCK_HEAD, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Shelgon - 65, 95, 100, 50, 60, 50, - TYPE_DRAGON, - TYPE_DRAGON, - 45, // catch rate - 144, // base exp. yield - 0, 0, 2, 0, 0, 0, - ITEM_NONE, - ITEM_DRAGON_SCALE, - 127, // gender - 40, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_DRAGON, - EGG_GROUP_DRAGON, - ABILITY_ROCK_HEAD, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_WHITE - }, { // Salamence - 95, 135, 80, 100, 110, 80, - TYPE_DRAGON, - TYPE_FLYING, - 45, // catch rate - 218, // base exp. yield - 0, 3, 0, 0, 0, 0, - ITEM_NONE, - ITEM_DRAGON_SCALE, - 127, // gender - 40, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_DRAGON, - EGG_GROUP_DRAGON, - ABILITY_INTIMIDATE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Beldum - 40, 55, 80, 30, 35, 60, - TYPE_STEEL, - TYPE_PSYCHIC, - 3, // catch rate - 103, // base exp. yield - 0, 0, 1, 0, 0, 0, - ITEM_NONE, - ITEM_METAL_COAT, - 255, // gender - 40, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_MINERAL, - EGG_GROUP_MINERAL, - ABILITY_CLEAR_BODY, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Metang - 60, 75, 100, 50, 55, 80, - TYPE_STEEL, - TYPE_PSYCHIC, - 3, // catch rate - 153, // base exp. yield - 0, 0, 2, 0, 0, 0, - ITEM_NONE, - ITEM_METAL_COAT, - 255, // gender - 40, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_MINERAL, - EGG_GROUP_MINERAL, - ABILITY_CLEAR_BODY, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Metagross - 80, 135, 130, 70, 95, 90, - TYPE_STEEL, - TYPE_PSYCHIC, - 3, // catch rate - 210, // base exp. yield - 0, 0, 3, 0, 0, 0, - ITEM_NONE, - ITEM_METAL_COAT, - 255, // gender - 40, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_MINERAL, - EGG_GROUP_MINERAL, - ABILITY_CLEAR_BODY, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Regirock - 80, 100, 200, 50, 50, 100, - TYPE_ROCK, - TYPE_ROCK, - 3, // catch rate - 217, // base exp. yield - 0, 0, 3, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 80, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_CLEAR_BODY, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BROWN - }, { // Regice - 80, 50, 100, 50, 100, 200, - TYPE_ICE, - TYPE_ICE, - 3, // catch rate - 216, // base exp. yield - 0, 0, 0, 0, 0, 3, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 80, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_CLEAR_BODY, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Registeel - 80, 75, 150, 50, 75, 150, - TYPE_STEEL, - TYPE_STEEL, - 3, // catch rate - 215, // base exp. yield - 0, 0, 2, 0, 0, 1, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 80, // egg cycles - 35, // base friendship - GROWTH_SLOW, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_CLEAR_BODY, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GRAY - }, { // Kyogre - 100, 100, 90, 90, 150, 140, - TYPE_WATER, - TYPE_WATER, - 5, // catch rate - 218, // base exp. yield - 0, 0, 0, 0, 3, 0, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_SLOW, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_DRIZZLE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Groudon - 100, 150, 140, 90, 100, 90, - TYPE_GROUND, - TYPE_GROUND, - 5, // catch rate - 218, // base exp. yield - 0, 3, 0, 0, 0, 0, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_SLOW, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_DROUGHT, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Rayquaza - 105, 150, 90, 95, 150, 90, - TYPE_DRAGON, - TYPE_FLYING, - 3, // catch rate - 220, // base exp. yield - 0, 2, 0, 0, 1, 0, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_SLOW, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_AIR_LOCK, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_GREEN - }, { // Latias - 80, 80, 90, 110, 110, 130, - TYPE_DRAGON, - TYPE_PSYCHIC, - 3, // catch rate - 211, // base exp. yield - 0, 0, 0, 0, 0, 3, - ITEM_NONE, - ITEM_NONE, - 254, // gender - 120, // egg cycles - 90, // base friendship - GROWTH_SLOW, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_LEVITATE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_RED - }, { // Latios - 80, 90, 80, 110, 130, 110, - TYPE_DRAGON, - TYPE_PSYCHIC, - 3, // catch rate - 211, // base exp. yield - 0, 0, 0, 0, 3, 0, - ITEM_NONE, - ITEM_NONE, - 0, // gender - 120, // egg cycles - 90, // base friendship - GROWTH_SLOW, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_LEVITATE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE - }, { // Jirachi - 100, 100, 100, 100, 100, 100, - TYPE_STEEL, - TYPE_PSYCHIC, - 3, // catch rate - 215, // base exp. yield - 3, 0, 0, 0, 0, 0, - ITEM_STAR_PIECE, - ITEM_STAR_PIECE, - 255, // gender - 120, // egg cycles - 100, // base friendship - GROWTH_SLOW, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_SERENE_GRACE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_YELLOW - }, { // Deoxys - 50, 150, 50, 150, 150, 50, - TYPE_PSYCHIC, - TYPE_PSYCHIC, - 3, // catch rate - 215, // base exp. yield - 0, 1, 0, 1, 1, 0, - ITEM_NONE, - ITEM_NONE, - 255, // gender - 120, // egg cycles - 0, // base friendship - GROWTH_SLOW, - EGG_GROUP_UNDISCOVERED, - EGG_GROUP_UNDISCOVERED, - ABILITY_PRESSURE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_RED, TRUE - }, { // Chimecho - 65, 50, 70, 65, 95, 80, - TYPE_PSYCHIC, - TYPE_PSYCHIC, - 45, // catch rate - 147, // base exp. yield - 0, 0, 0, 0, 1, 1, - ITEM_NONE, - ITEM_NONE, - 127, // gender - 25, // egg cycles - 70, // base friendship - GROWTH_FAST, - EGG_GROUP_AMORPHOUS, - EGG_GROUP_AMORPHOUS, - ABILITY_LEVITATE, - ABILITY_NONE, - 0, // Safari Zone flee rate - BODY_COLOR_BLUE +#ifndef GUARD_BASE_STATS_H +#define GUARD_BASE_STATS_H + +// Maximum value for a female pokemon is 254 (MON_FEMALE) which is 100% female. +// 255 (MON_GENDERLESS) is reserved for genderless pokemon. +#define PERCENT_FEMALE(percent) min(254, ((percent * 255) / 100)) + +const struct BaseStats gBaseStats[] = +{ + [SPECIES_NONE] = {0}, + + [SPECIES_BULBASAUR] = + { + .baseHP = 45, + .baseAttack = 49, + .baseDefense = 49, + .baseSpeed = 45, + .baseSpAttack = 65, + .baseSpDefense = 65, + .type1 = TYPE_GRASS, + .type2 = TYPE_POISON, + .catchRate = 45, + .expYield = 64, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_OVERGROW, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_IVYSAUR] = + { + .baseHP = 60, + .baseAttack = 62, + .baseDefense = 63, + .baseSpeed = 60, + .baseSpAttack = 80, + .baseSpDefense = 80, + .type1 = TYPE_GRASS, + .type2 = TYPE_POISON, + .catchRate = 45, + .expYield = 141, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 1, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_OVERGROW, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_VENUSAUR] = + { + .baseHP = 80, + .baseAttack = 82, + .baseDefense = 83, + .baseSpeed = 80, + .baseSpAttack = 100, + .baseSpDefense = 100, + .type1 = TYPE_GRASS, + .type2 = TYPE_POISON, + .catchRate = 45, + .expYield = 208, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 2, + .evYield_SpDefense = 1, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_OVERGROW, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_CHARMANDER] = + { + .baseHP = 39, + .baseAttack = 52, + .baseDefense = 43, + .baseSpeed = 65, + .baseSpAttack = 60, + .baseSpDefense = 50, + .type1 = TYPE_FIRE, + .type2 = TYPE_FIRE, + .catchRate = 45, + .expYield = 65, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_DRAGON, + .ability1 = ABILITY_BLAZE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_CHARMELEON] = + { + .baseHP = 58, + .baseAttack = 64, + .baseDefense = 58, + .baseSpeed = 80, + .baseSpAttack = 80, + .baseSpDefense = 65, + .type1 = TYPE_FIRE, + .type2 = TYPE_FIRE, + .catchRate = 45, + .expYield = 142, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_DRAGON, + .ability1 = ABILITY_BLAZE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_CHARIZARD] = + { + .baseHP = 78, + .baseAttack = 84, + .baseDefense = 78, + .baseSpeed = 100, + .baseSpAttack = 109, + .baseSpDefense = 85, + .type1 = TYPE_FIRE, + .type2 = TYPE_FLYING, + .catchRate = 45, + .expYield = 209, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 3, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_DRAGON, + .ability1 = ABILITY_BLAZE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_SQUIRTLE] = + { + .baseHP = 44, + .baseAttack = 48, + .baseDefense = 65, + .baseSpeed = 43, + .baseSpAttack = 50, + .baseSpDefense = 64, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 45, + .expYield = 66, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_WATER_1, + .ability1 = ABILITY_TORRENT, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_WARTORTLE] = + { + .baseHP = 59, + .baseAttack = 63, + .baseDefense = 80, + .baseSpeed = 58, + .baseSpAttack = 65, + .baseSpDefense = 80, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 45, + .expYield = 143, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 1, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_WATER_1, + .ability1 = ABILITY_TORRENT, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_BLASTOISE] = + { + .baseHP = 79, + .baseAttack = 83, + .baseDefense = 100, + .baseSpeed = 78, + .baseSpAttack = 85, + .baseSpDefense = 105, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 45, + .expYield = 210, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 3, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_WATER_1, + .ability1 = ABILITY_TORRENT, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_CATERPIE] = + { + .baseHP = 45, + .baseAttack = 30, + .baseDefense = 35, + .baseSpeed = 45, + .baseSpAttack = 20, + .baseSpDefense = 20, + .type1 = TYPE_BUG, + .type2 = TYPE_BUG, + .catchRate = 255, + .expYield = 53, + .evYield_HP = 1, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_SHIELD_DUST, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_METAPOD] = + { + .baseHP = 50, + .baseAttack = 20, + .baseDefense = 55, + .baseSpeed = 30, + .baseSpAttack = 25, + .baseSpDefense = 25, + .type1 = TYPE_BUG, + .type2 = TYPE_BUG, + .catchRate = 120, + .expYield = 72, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 2, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_SHED_SKIN, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_BUTTERFREE] = + { + .baseHP = 60, + .baseAttack = 45, + .baseDefense = 50, + .baseSpeed = 70, + .baseSpAttack = 80, + .baseSpDefense = 80, + .type1 = TYPE_BUG, + .type2 = TYPE_FLYING, + .catchRate = 45, + .expYield = 160, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 2, + .evYield_SpDefense = 1, + .item1 = ITEM_NONE, + .item2 = ITEM_SILVER_POWDER, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_COMPOUND_EYES, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_WHITE, + .noFlip = FALSE, + }, + + [SPECIES_WEEDLE] = + { + .baseHP = 40, + .baseAttack = 35, + .baseDefense = 30, + .baseSpeed = 50, + .baseSpAttack = 20, + .baseSpDefense = 20, + .type1 = TYPE_BUG, + .type2 = TYPE_POISON, + .catchRate = 255, + .expYield = 52, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_SHIELD_DUST, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_KAKUNA] = + { + .baseHP = 45, + .baseAttack = 25, + .baseDefense = 50, + .baseSpeed = 35, + .baseSpAttack = 25, + .baseSpDefense = 25, + .type1 = TYPE_BUG, + .type2 = TYPE_POISON, + .catchRate = 120, + .expYield = 71, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 2, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_SHED_SKIN, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_BEEDRILL] = + { + .baseHP = 65, + .baseAttack = 80, + .baseDefense = 40, + .baseSpeed = 75, + .baseSpAttack = 45, + .baseSpDefense = 80, + .type1 = TYPE_BUG, + .type2 = TYPE_POISON, + .catchRate = 45, + .expYield = 159, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 1, + .item1 = ITEM_NONE, + .item2 = ITEM_POISON_BARB, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_SWARM, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_PIDGEY] = + { + .baseHP = 40, + .baseAttack = 45, + .baseDefense = 40, + .baseSpeed = 56, + .baseSpAttack = 35, + .baseSpDefense = 35, + .type1 = TYPE_NORMAL, + .type2 = TYPE_FLYING, + .catchRate = 255, + .expYield = 55, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_FLYING, + .eggGroup2 = EGG_GROUP_FLYING, + .ability1 = ABILITY_KEEN_EYE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_PIDGEOTTO] = + { + .baseHP = 63, + .baseAttack = 60, + .baseDefense = 55, + .baseSpeed = 71, + .baseSpAttack = 50, + .baseSpDefense = 50, + .type1 = TYPE_NORMAL, + .type2 = TYPE_FLYING, + .catchRate = 120, + .expYield = 113, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 2, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_FLYING, + .eggGroup2 = EGG_GROUP_FLYING, + .ability1 = ABILITY_KEEN_EYE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_PIDGEOT] = + { + .baseHP = 83, + .baseAttack = 80, + .baseDefense = 75, + .baseSpeed = 91, + .baseSpAttack = 70, + .baseSpDefense = 70, + .type1 = TYPE_NORMAL, + .type2 = TYPE_FLYING, + .catchRate = 45, + .expYield = 172, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 3, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_FLYING, + .eggGroup2 = EGG_GROUP_FLYING, + .ability1 = ABILITY_KEEN_EYE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_RATTATA] = + { + .baseHP = 30, + .baseAttack = 56, + .baseDefense = 35, + .baseSpeed = 72, + .baseSpAttack = 25, + .baseSpDefense = 35, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 255, + .expYield = 57, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_RUN_AWAY, + .ability2 = ABILITY_GUTS, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_RATICATE] = + { + .baseHP = 55, + .baseAttack = 81, + .baseDefense = 60, + .baseSpeed = 97, + .baseSpAttack = 50, + .baseSpDefense = 70, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 127, + .expYield = 116, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 2, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_RUN_AWAY, + .ability2 = ABILITY_GUTS, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_SPEAROW] = + { + .baseHP = 40, + .baseAttack = 60, + .baseDefense = 30, + .baseSpeed = 70, + .baseSpAttack = 31, + .baseSpDefense = 31, + .type1 = TYPE_NORMAL, + .type2 = TYPE_FLYING, + .catchRate = 255, + .expYield = 58, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FLYING, + .eggGroup2 = EGG_GROUP_FLYING, + .ability1 = ABILITY_KEEN_EYE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_FEAROW] = + { + .baseHP = 65, + .baseAttack = 90, + .baseDefense = 65, + .baseSpeed = 100, + .baseSpAttack = 61, + .baseSpDefense = 61, + .type1 = TYPE_NORMAL, + .type2 = TYPE_FLYING, + .catchRate = 90, + .expYield = 162, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 2, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_SHARP_BEAK, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FLYING, + .eggGroup2 = EGG_GROUP_FLYING, + .ability1 = ABILITY_KEEN_EYE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_EKANS] = + { + .baseHP = 35, + .baseAttack = 60, + .baseDefense = 44, + .baseSpeed = 55, + .baseSpAttack = 40, + .baseSpDefense = 54, + .type1 = TYPE_POISON, + .type2 = TYPE_POISON, + .catchRate = 255, + .expYield = 62, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_DRAGON, + .ability1 = ABILITY_INTIMIDATE, + .ability2 = ABILITY_SHED_SKIN, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_ARBOK] = + { + .baseHP = 60, + .baseAttack = 85, + .baseDefense = 69, + .baseSpeed = 80, + .baseSpAttack = 65, + .baseSpDefense = 79, + .type1 = TYPE_POISON, + .type2 = TYPE_POISON, + .catchRate = 90, + .expYield = 147, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_DRAGON, + .ability1 = ABILITY_INTIMIDATE, + .ability2 = ABILITY_SHED_SKIN, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_PIKACHU] = + { + .baseHP = 35, + .baseAttack = 55, + .baseDefense = 30, + .baseSpeed = 90, + .baseSpAttack = 50, + .baseSpDefense = 40, + .type1 = TYPE_ELECTRIC, + .type2 = TYPE_ELECTRIC, + .catchRate = 190, + .expYield = 82, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 2, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_ORAN_BERRY, + .item2 = ITEM_LIGHT_BALL, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 10, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FAIRY, + .ability1 = ABILITY_STATIC, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 6, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_RAICHU] = + { + .baseHP = 60, + .baseAttack = 90, + .baseDefense = 55, + .baseSpeed = 100, + .baseSpAttack = 90, + .baseSpDefense = 80, + .type1 = TYPE_ELECTRIC, + .type2 = TYPE_ELECTRIC, + .catchRate = 75, + .expYield = 122, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 3, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_ORAN_BERRY, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 10, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FAIRY, + .ability1 = ABILITY_STATIC, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_SANDSHREW] = + { + .baseHP = 50, + .baseAttack = 75, + .baseDefense = 85, + .baseSpeed = 40, + .baseSpAttack = 20, + .baseSpDefense = 30, + .type1 = TYPE_GROUND, + .type2 = TYPE_GROUND, + .catchRate = 255, + .expYield = 93, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_QUICK_CLAW, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_SAND_VEIL, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_SANDSLASH] = + { + .baseHP = 75, + .baseAttack = 100, + .baseDefense = 110, + .baseSpeed = 65, + .baseSpAttack = 45, + .baseSpDefense = 55, + .type1 = TYPE_GROUND, + .type2 = TYPE_GROUND, + .catchRate = 90, + .expYield = 163, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 2, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_QUICK_CLAW, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_SAND_VEIL, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_NIDORAN_F] = + { + .baseHP = 55, + .baseAttack = 47, + .baseDefense = 52, + .baseSpeed = 41, + .baseSpAttack = 40, + .baseSpDefense = 40, + .type1 = TYPE_POISON, + .type2 = TYPE_POISON, + .catchRate = 235, + .expYield = 59, + .evYield_HP = 1, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_FEMALE, + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_POISON_POINT, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_NIDORINA] = + { + .baseHP = 70, + .baseAttack = 62, + .baseDefense = 67, + .baseSpeed = 56, + .baseSpAttack = 55, + .baseSpDefense = 55, + .type1 = TYPE_POISON, + .type2 = TYPE_POISON, + .catchRate = 120, + .expYield = 117, + .evYield_HP = 2, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_FEMALE, + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_POISON_POINT, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_NIDOQUEEN] = + { + .baseHP = 90, + .baseAttack = 82, + .baseDefense = 87, + .baseSpeed = 76, + .baseSpAttack = 75, + .baseSpDefense = 85, + .type1 = TYPE_POISON, + .type2 = TYPE_GROUND, + .catchRate = 45, + .expYield = 194, + .evYield_HP = 3, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_FEMALE, + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_POISON_POINT, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_NIDORAN_M] = + { + .baseHP = 46, + .baseAttack = 57, + .baseDefense = 40, + .baseSpeed = 50, + .baseSpAttack = 40, + .baseSpDefense = 40, + .type1 = TYPE_POISON, + .type2 = TYPE_POISON, + .catchRate = 235, + .expYield = 60, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_MALE, + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_POISON_POINT, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_NIDORINO] = + { + .baseHP = 61, + .baseAttack = 72, + .baseDefense = 57, + .baseSpeed = 65, + .baseSpAttack = 55, + .baseSpDefense = 55, + .type1 = TYPE_POISON, + .type2 = TYPE_POISON, + .catchRate = 120, + .expYield = 118, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_MALE, + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_POISON_POINT, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_NIDOKING] = + { + .baseHP = 81, + .baseAttack = 92, + .baseDefense = 77, + .baseSpeed = 85, + .baseSpAttack = 85, + .baseSpDefense = 75, + .type1 = TYPE_POISON, + .type2 = TYPE_GROUND, + .catchRate = 45, + .expYield = 195, + .evYield_HP = 0, + .evYield_Attack = 3, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_MALE, + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_POISON_POINT, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_CLEFAIRY] = + { + .baseHP = 70, + .baseAttack = 45, + .baseDefense = 48, + .baseSpeed = 35, + .baseSpAttack = 60, + .baseSpDefense = 65, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 150, + .expYield = 68, + .evYield_HP = 2, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_LEPPA_BERRY, + .item2 = ITEM_MOON_STONE, + .genderRatio = PERCENT_FEMALE(75), + .eggCycles = 10, + .friendship = 140, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_FAIRY, + .eggGroup2 = EGG_GROUP_FAIRY, + .ability1 = ABILITY_CUTE_CHARM, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PINK, + .noFlip = FALSE, + }, + + [SPECIES_CLEFABLE] = + { + .baseHP = 95, + .baseAttack = 70, + .baseDefense = 73, + .baseSpeed = 60, + .baseSpAttack = 85, + .baseSpDefense = 90, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 25, + .expYield = 129, + .evYield_HP = 3, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_LEPPA_BERRY, + .item2 = ITEM_MOON_STONE, + .genderRatio = PERCENT_FEMALE(75), + .eggCycles = 10, + .friendship = 140, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_FAIRY, + .eggGroup2 = EGG_GROUP_FAIRY, + .ability1 = ABILITY_CUTE_CHARM, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PINK, + .noFlip = FALSE, + }, + + [SPECIES_VULPIX] = + { + .baseHP = 38, + .baseAttack = 41, + .baseDefense = 40, + .baseSpeed = 65, + .baseSpAttack = 50, + .baseSpDefense = 65, + .type1 = TYPE_FIRE, + .type2 = TYPE_FIRE, + .catchRate = 190, + .expYield = 63, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_RAWST_BERRY, + .item2 = ITEM_RAWST_BERRY, + .genderRatio = PERCENT_FEMALE(75), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_FLASH_FIRE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_NINETALES] = + { + .baseHP = 73, + .baseAttack = 76, + .baseDefense = 75, + .baseSpeed = 100, + .baseSpAttack = 81, + .baseSpDefense = 100, + .type1 = TYPE_FIRE, + .type2 = TYPE_FIRE, + .catchRate = 75, + .expYield = 178, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 1, + .item1 = ITEM_RAWST_BERRY, + .item2 = ITEM_RAWST_BERRY, + .genderRatio = PERCENT_FEMALE(75), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_FLASH_FIRE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_JIGGLYPUFF] = + { + .baseHP = 115, + .baseAttack = 45, + .baseDefense = 20, + .baseSpeed = 20, + .baseSpAttack = 45, + .baseSpDefense = 25, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 170, + .expYield = 76, + .evYield_HP = 2, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(75), + .eggCycles = 10, + .friendship = 70, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_FAIRY, + .eggGroup2 = EGG_GROUP_FAIRY, + .ability1 = ABILITY_CUTE_CHARM, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PINK, + .noFlip = FALSE, + }, + + [SPECIES_WIGGLYTUFF] = + { + .baseHP = 140, + .baseAttack = 70, + .baseDefense = 45, + .baseSpeed = 45, + .baseSpAttack = 75, + .baseSpDefense = 50, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 50, + .expYield = 109, + .evYield_HP = 3, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(75), + .eggCycles = 10, + .friendship = 70, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_FAIRY, + .eggGroup2 = EGG_GROUP_FAIRY, + .ability1 = ABILITY_CUTE_CHARM, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PINK, + .noFlip = FALSE, + }, + + [SPECIES_ZUBAT] = + { + .baseHP = 40, + .baseAttack = 45, + .baseDefense = 35, + .baseSpeed = 55, + .baseSpAttack = 30, + .baseSpDefense = 40, + .type1 = TYPE_POISON, + .type2 = TYPE_FLYING, + .catchRate = 255, + .expYield = 54, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FLYING, + .eggGroup2 = EGG_GROUP_FLYING, + .ability1 = ABILITY_INNER_FOCUS, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_GOLBAT] = + { + .baseHP = 75, + .baseAttack = 80, + .baseDefense = 70, + .baseSpeed = 90, + .baseSpAttack = 65, + .baseSpDefense = 75, + .type1 = TYPE_POISON, + .type2 = TYPE_FLYING, + .catchRate = 90, + .expYield = 171, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 2, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FLYING, + .eggGroup2 = EGG_GROUP_FLYING, + .ability1 = ABILITY_INNER_FOCUS, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_ODDISH] = + { + .baseHP = 45, + .baseAttack = 50, + .baseDefense = 55, + .baseSpeed = 30, + .baseSpAttack = 75, + .baseSpDefense = 65, + .type1 = TYPE_GRASS, + .type2 = TYPE_POISON, + .catchRate = 255, + .expYield = 78, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_GRASS, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_CHLOROPHYLL, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 4, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_GLOOM] = + { + .baseHP = 60, + .baseAttack = 65, + .baseDefense = 70, + .baseSpeed = 40, + .baseSpAttack = 85, + .baseSpDefense = 75, + .type1 = TYPE_GRASS, + .type2 = TYPE_POISON, + .catchRate = 120, + .expYield = 132, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 2, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_GRASS, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_CHLOROPHYLL, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 6, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_VILEPLUME] = + { + .baseHP = 75, + .baseAttack = 80, + .baseDefense = 85, + .baseSpeed = 50, + .baseSpAttack = 100, + .baseSpDefense = 90, + .type1 = TYPE_GRASS, + .type2 = TYPE_POISON, + .catchRate = 45, + .expYield = 184, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 3, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_GRASS, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_CHLOROPHYLL, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_PARAS] = + { + .baseHP = 35, + .baseAttack = 70, + .baseDefense = 55, + .baseSpeed = 25, + .baseSpAttack = 45, + .baseSpDefense = 55, + .type1 = TYPE_BUG, + .type2 = TYPE_GRASS, + .catchRate = 190, + .expYield = 70, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_TINY_MUSHROOM, + .item2 = ITEM_BIG_MUSHROOM, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_EFFECT_SPORE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_PARASECT] = + { + .baseHP = 60, + .baseAttack = 95, + .baseDefense = 80, + .baseSpeed = 30, + .baseSpAttack = 60, + .baseSpDefense = 80, + .type1 = TYPE_BUG, + .type2 = TYPE_GRASS, + .catchRate = 75, + .expYield = 128, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_TINY_MUSHROOM, + .item2 = ITEM_BIG_MUSHROOM, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_EFFECT_SPORE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_VENONAT] = + { + .baseHP = 60, + .baseAttack = 55, + .baseDefense = 50, + .baseSpeed = 45, + .baseSpAttack = 40, + .baseSpDefense = 55, + .type1 = TYPE_BUG, + .type2 = TYPE_POISON, + .catchRate = 190, + .expYield = 75, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 1, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_COMPOUND_EYES, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_VENOMOTH] = + { + .baseHP = 70, + .baseAttack = 65, + .baseDefense = 60, + .baseSpeed = 90, + .baseSpAttack = 90, + .baseSpDefense = 75, + .type1 = TYPE_BUG, + .type2 = TYPE_POISON, + .catchRate = 75, + .expYield = 138, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_SHIELD_DUST, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_DIGLETT] = + { + .baseHP = 10, + .baseAttack = 55, + .baseDefense = 25, + .baseSpeed = 95, + .baseSpAttack = 35, + .baseSpDefense = 45, + .type1 = TYPE_GROUND, + .type2 = TYPE_GROUND, + .catchRate = 255, + .expYield = 81, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_SAND_VEIL, + .ability2 = ABILITY_ARENA_TRAP, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_DUGTRIO] = + { + .baseHP = 35, + .baseAttack = 80, + .baseDefense = 50, + .baseSpeed = 120, + .baseSpAttack = 50, + .baseSpDefense = 70, + .type1 = TYPE_GROUND, + .type2 = TYPE_GROUND, + .catchRate = 50, + .expYield = 153, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 2, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_SAND_VEIL, + .ability2 = ABILITY_ARENA_TRAP, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_MEOWTH] = + { + .baseHP = 40, + .baseAttack = 45, + .baseDefense = 35, + .baseSpeed = 90, + .baseSpAttack = 40, + .baseSpDefense = 40, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 255, + .expYield = 69, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_PICKUP, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_PERSIAN] = + { + .baseHP = 65, + .baseAttack = 70, + .baseDefense = 60, + .baseSpeed = 115, + .baseSpAttack = 65, + .baseSpDefense = 65, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 90, + .expYield = 148, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 2, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_LIMBER, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_PSYDUCK] = + { + .baseHP = 50, + .baseAttack = 52, + .baseDefense = 48, + .baseSpeed = 55, + .baseSpAttack = 65, + .baseSpDefense = 50, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 190, + .expYield = 80, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_DAMP, + .ability2 = ABILITY_CLOUD_NINE, + .safariZoneFleeRate = 6, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_GOLDUCK] = + { + .baseHP = 80, + .baseAttack = 82, + .baseDefense = 78, + .baseSpeed = 85, + .baseSpAttack = 95, + .baseSpDefense = 80, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 75, + .expYield = 174, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 2, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_DAMP, + .ability2 = ABILITY_CLOUD_NINE, + .safariZoneFleeRate = 8, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_MANKEY] = + { + .baseHP = 40, + .baseAttack = 80, + .baseDefense = 35, + .baseSpeed = 70, + .baseSpAttack = 35, + .baseSpDefense = 45, + .type1 = TYPE_FIGHTING, + .type2 = TYPE_FIGHTING, + .catchRate = 190, + .expYield = 74, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_VITAL_SPIRIT, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_PRIMEAPE] = + { + .baseHP = 65, + .baseAttack = 105, + .baseDefense = 60, + .baseSpeed = 95, + .baseSpAttack = 60, + .baseSpDefense = 70, + .type1 = TYPE_FIGHTING, + .type2 = TYPE_FIGHTING, + .catchRate = 75, + .expYield = 149, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_VITAL_SPIRIT, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_GROWLITHE] = + { + .baseHP = 55, + .baseAttack = 70, + .baseDefense = 45, + .baseSpeed = 60, + .baseSpAttack = 70, + .baseSpDefense = 50, + .type1 = TYPE_FIRE, + .type2 = TYPE_FIRE, + .catchRate = 190, + .expYield = 91, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_RAWST_BERRY, + .item2 = ITEM_RAWST_BERRY, + .genderRatio = PERCENT_FEMALE(25), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_INTIMIDATE, + .ability2 = ABILITY_FLASH_FIRE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_ARCANINE] = + { + .baseHP = 90, + .baseAttack = 110, + .baseDefense = 80, + .baseSpeed = 95, + .baseSpAttack = 100, + .baseSpDefense = 80, + .type1 = TYPE_FIRE, + .type2 = TYPE_FIRE, + .catchRate = 75, + .expYield = 213, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_RAWST_BERRY, + .item2 = ITEM_RAWST_BERRY, + .genderRatio = PERCENT_FEMALE(25), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_INTIMIDATE, + .ability2 = ABILITY_FLASH_FIRE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_POLIWAG] = + { + .baseHP = 40, + .baseAttack = 50, + .baseDefense = 40, + .baseSpeed = 90, + .baseSpAttack = 40, + .baseSpDefense = 40, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 255, + .expYield = 77, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_WATER_1, + .ability1 = ABILITY_WATER_ABSORB, + .ability2 = ABILITY_DAMP, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = TRUE, + }, + + [SPECIES_POLIWHIRL] = + { + .baseHP = 65, + .baseAttack = 65, + .baseDefense = 65, + .baseSpeed = 90, + .baseSpAttack = 50, + .baseSpDefense = 50, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 120, + .expYield = 131, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 2, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_KINGS_ROCK, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_WATER_1, + .ability1 = ABILITY_WATER_ABSORB, + .ability2 = ABILITY_DAMP, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = TRUE, + }, + + [SPECIES_POLIWRATH] = + { + .baseHP = 90, + .baseAttack = 85, + .baseDefense = 95, + .baseSpeed = 70, + .baseSpAttack = 70, + .baseSpDefense = 90, + .type1 = TYPE_WATER, + .type2 = TYPE_FIGHTING, + .catchRate = 45, + .expYield = 185, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 3, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_KINGS_ROCK, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_WATER_1, + .ability1 = ABILITY_WATER_ABSORB, + .ability2 = ABILITY_DAMP, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = TRUE, + }, + + [SPECIES_ABRA] = + { + .baseHP = 25, + .baseAttack = 20, + .baseDefense = 15, + .baseSpeed = 90, + .baseSpAttack = 105, + .baseSpDefense = 55, + .type1 = TYPE_PSYCHIC, + .type2 = TYPE_PSYCHIC, + .catchRate = 200, + .expYield = 73, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_TWISTED_SPOON, + .genderRatio = PERCENT_FEMALE(25), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_HUMAN_LIKE, + .eggGroup2 = EGG_GROUP_HUMAN_LIKE, + .ability1 = ABILITY_SYNCHRONIZE, + .ability2 = ABILITY_INNER_FOCUS, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_KADABRA] = + { + .baseHP = 40, + .baseAttack = 35, + .baseDefense = 30, + .baseSpeed = 105, + .baseSpAttack = 120, + .baseSpDefense = 70, + .type1 = TYPE_PSYCHIC, + .type2 = TYPE_PSYCHIC, + .catchRate = 100, + .expYield = 145, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 2, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_TWISTED_SPOON, + .genderRatio = PERCENT_FEMALE(25), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_HUMAN_LIKE, + .eggGroup2 = EGG_GROUP_HUMAN_LIKE, + .ability1 = ABILITY_SYNCHRONIZE, + .ability2 = ABILITY_INNER_FOCUS, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_ALAKAZAM] = + { + .baseHP = 55, + .baseAttack = 50, + .baseDefense = 45, + .baseSpeed = 120, + .baseSpAttack = 135, + .baseSpDefense = 85, + .type1 = TYPE_PSYCHIC, + .type2 = TYPE_PSYCHIC, + .catchRate = 50, + .expYield = 186, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 3, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_TWISTED_SPOON, + .genderRatio = PERCENT_FEMALE(25), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_HUMAN_LIKE, + .eggGroup2 = EGG_GROUP_HUMAN_LIKE, + .ability1 = ABILITY_SYNCHRONIZE, + .ability2 = ABILITY_INNER_FOCUS, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_MACHOP] = + { + .baseHP = 70, + .baseAttack = 80, + .baseDefense = 50, + .baseSpeed = 35, + .baseSpAttack = 35, + .baseSpDefense = 35, + .type1 = TYPE_FIGHTING, + .type2 = TYPE_FIGHTING, + .catchRate = 180, + .expYield = 88, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(25), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_HUMAN_LIKE, + .eggGroup2 = EGG_GROUP_HUMAN_LIKE, + .ability1 = ABILITY_GUTS, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_MACHOKE] = + { + .baseHP = 80, + .baseAttack = 100, + .baseDefense = 70, + .baseSpeed = 45, + .baseSpAttack = 50, + .baseSpDefense = 60, + .type1 = TYPE_FIGHTING, + .type2 = TYPE_FIGHTING, + .catchRate = 90, + .expYield = 146, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(25), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_HUMAN_LIKE, + .eggGroup2 = EGG_GROUP_HUMAN_LIKE, + .ability1 = ABILITY_GUTS, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_MACHAMP] = + { + .baseHP = 90, + .baseAttack = 130, + .baseDefense = 80, + .baseSpeed = 55, + .baseSpAttack = 65, + .baseSpDefense = 85, + .type1 = TYPE_FIGHTING, + .type2 = TYPE_FIGHTING, + .catchRate = 45, + .expYield = 193, + .evYield_HP = 0, + .evYield_Attack = 3, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(25), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_HUMAN_LIKE, + .eggGroup2 = EGG_GROUP_HUMAN_LIKE, + .ability1 = ABILITY_GUTS, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_BELLSPROUT] = + { + .baseHP = 50, + .baseAttack = 75, + .baseDefense = 35, + .baseSpeed = 40, + .baseSpAttack = 70, + .baseSpDefense = 30, + .type1 = TYPE_GRASS, + .type2 = TYPE_POISON, + .catchRate = 255, + .expYield = 84, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_GRASS, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_CHLOROPHYLL, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_WEEPINBELL] = + { + .baseHP = 65, + .baseAttack = 90, + .baseDefense = 50, + .baseSpeed = 55, + .baseSpAttack = 85, + .baseSpDefense = 45, + .type1 = TYPE_GRASS, + .type2 = TYPE_POISON, + .catchRate = 120, + .expYield = 151, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_GRASS, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_CHLOROPHYLL, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_VICTREEBEL] = + { + .baseHP = 80, + .baseAttack = 105, + .baseDefense = 65, + .baseSpeed = 70, + .baseSpAttack = 100, + .baseSpDefense = 60, + .type1 = TYPE_GRASS, + .type2 = TYPE_POISON, + .catchRate = 45, + .expYield = 191, + .evYield_HP = 0, + .evYield_Attack = 3, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_GRASS, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_CHLOROPHYLL, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_TENTACOOL] = + { + .baseHP = 40, + .baseAttack = 40, + .baseDefense = 35, + .baseSpeed = 70, + .baseSpAttack = 50, + .baseSpDefense = 100, + .type1 = TYPE_WATER, + .type2 = TYPE_POISON, + .catchRate = 190, + .expYield = 105, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 1, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_WATER_3, + .eggGroup2 = EGG_GROUP_WATER_3, + .ability1 = ABILITY_CLEAR_BODY, + .ability2 = ABILITY_LIQUID_OOZE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_TENTACRUEL] = + { + .baseHP = 80, + .baseAttack = 70, + .baseDefense = 65, + .baseSpeed = 100, + .baseSpAttack = 80, + .baseSpDefense = 120, + .type1 = TYPE_WATER, + .type2 = TYPE_POISON, + .catchRate = 60, + .expYield = 205, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_WATER_3, + .eggGroup2 = EGG_GROUP_WATER_3, + .ability1 = ABILITY_CLEAR_BODY, + .ability2 = ABILITY_LIQUID_OOZE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_GEODUDE] = + { + .baseHP = 40, + .baseAttack = 80, + .baseDefense = 100, + .baseSpeed = 20, + .baseSpAttack = 30, + .baseSpDefense = 30, + .type1 = TYPE_ROCK, + .type2 = TYPE_GROUND, + .catchRate = 255, + .expYield = 86, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_EVERSTONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MINERAL, + .eggGroup2 = EGG_GROUP_MINERAL, + .ability1 = ABILITY_ROCK_HEAD, + .ability2 = ABILITY_STURDY, + .safariZoneFleeRate = 4, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_GRAVELER] = + { + .baseHP = 55, + .baseAttack = 95, + .baseDefense = 115, + .baseSpeed = 35, + .baseSpAttack = 45, + .baseSpDefense = 45, + .type1 = TYPE_ROCK, + .type2 = TYPE_GROUND, + .catchRate = 120, + .expYield = 134, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 2, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_EVERSTONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MINERAL, + .eggGroup2 = EGG_GROUP_MINERAL, + .ability1 = ABILITY_ROCK_HEAD, + .ability2 = ABILITY_STURDY, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_GOLEM] = + { + .baseHP = 80, + .baseAttack = 110, + .baseDefense = 130, + .baseSpeed = 45, + .baseSpAttack = 55, + .baseSpDefense = 65, + .type1 = TYPE_ROCK, + .type2 = TYPE_GROUND, + .catchRate = 45, + .expYield = 177, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 3, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_EVERSTONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MINERAL, + .eggGroup2 = EGG_GROUP_MINERAL, + .ability1 = ABILITY_ROCK_HEAD, + .ability2 = ABILITY_STURDY, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_PONYTA] = + { + .baseHP = 50, + .baseAttack = 85, + .baseDefense = 55, + .baseSpeed = 90, + .baseSpAttack = 65, + .baseSpDefense = 65, + .type1 = TYPE_FIRE, + .type2 = TYPE_FIRE, + .catchRate = 190, + .expYield = 152, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_RUN_AWAY, + .ability2 = ABILITY_FLASH_FIRE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_RAPIDASH] = + { + .baseHP = 65, + .baseAttack = 100, + .baseDefense = 70, + .baseSpeed = 105, + .baseSpAttack = 80, + .baseSpDefense = 80, + .type1 = TYPE_FIRE, + .type2 = TYPE_FIRE, + .catchRate = 60, + .expYield = 192, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 2, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_RUN_AWAY, + .ability2 = ABILITY_FLASH_FIRE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_SLOWPOKE] = + { + .baseHP = 90, + .baseAttack = 65, + .baseDefense = 65, + .baseSpeed = 15, + .baseSpAttack = 40, + .baseSpDefense = 40, + .type1 = TYPE_WATER, + .type2 = TYPE_PSYCHIC, + .catchRate = 190, + .expYield = 99, + .evYield_HP = 1, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_KINGS_ROCK, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_WATER_1, + .ability1 = ABILITY_OBLIVIOUS, + .ability2 = ABILITY_OWN_TEMPO, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PINK, + .noFlip = FALSE, + }, + + [SPECIES_SLOWBRO] = + { + .baseHP = 95, + .baseAttack = 75, + .baseDefense = 110, + .baseSpeed = 30, + .baseSpAttack = 100, + .baseSpDefense = 80, + .type1 = TYPE_WATER, + .type2 = TYPE_PSYCHIC, + .catchRate = 75, + .expYield = 164, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 2, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_KINGS_ROCK, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_WATER_1, + .ability1 = ABILITY_OBLIVIOUS, + .ability2 = ABILITY_OWN_TEMPO, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PINK, + .noFlip = FALSE, + }, + + [SPECIES_MAGNEMITE] = + { + .baseHP = 25, + .baseAttack = 35, + .baseDefense = 70, + .baseSpeed = 45, + .baseSpAttack = 95, + .baseSpDefense = 55, + .type1 = TYPE_ELECTRIC, + .type2 = TYPE_STEEL, + .catchRate = 190, + .expYield = 89, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_METAL_COAT, + .genderRatio = MON_GENDERLESS, + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_MINERAL, + .eggGroup2 = EGG_GROUP_MINERAL, + .ability1 = ABILITY_MAGNET_PULL, + .ability2 = ABILITY_STURDY, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_MAGNETON] = + { + .baseHP = 50, + .baseAttack = 60, + .baseDefense = 95, + .baseSpeed = 70, + .baseSpAttack = 120, + .baseSpDefense = 70, + .type1 = TYPE_ELECTRIC, + .type2 = TYPE_STEEL, + .catchRate = 60, + .expYield = 161, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 2, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_METAL_COAT, + .genderRatio = MON_GENDERLESS, + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_MINERAL, + .eggGroup2 = EGG_GROUP_MINERAL, + .ability1 = ABILITY_MAGNET_PULL, + .ability2 = ABILITY_STURDY, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_FARFETCHD] = + { + .baseHP = 52, + .baseAttack = 65, + .baseDefense = 55, + .baseSpeed = 60, + .baseSpAttack = 58, + .baseSpDefense = 62, + .type1 = TYPE_NORMAL, + .type2 = TYPE_FLYING, + .catchRate = 45, + .expYield = 94, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_STICK, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FLYING, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_KEEN_EYE, + .ability2 = ABILITY_INNER_FOCUS, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_DODUO] = + { + .baseHP = 35, + .baseAttack = 85, + .baseDefense = 45, + .baseSpeed = 75, + .baseSpAttack = 35, + .baseSpDefense = 35, + .type1 = TYPE_NORMAL, + .type2 = TYPE_FLYING, + .catchRate = 190, + .expYield = 96, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_SHARP_BEAK, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FLYING, + .eggGroup2 = EGG_GROUP_FLYING, + .ability1 = ABILITY_RUN_AWAY, + .ability2 = ABILITY_EARLY_BIRD, + .safariZoneFleeRate = 8, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_DODRIO] = + { + .baseHP = 60, + .baseAttack = 110, + .baseDefense = 70, + .baseSpeed = 100, + .baseSpAttack = 60, + .baseSpDefense = 60, + .type1 = TYPE_NORMAL, + .type2 = TYPE_FLYING, + .catchRate = 45, + .expYield = 158, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_SHARP_BEAK, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FLYING, + .eggGroup2 = EGG_GROUP_FLYING, + .ability1 = ABILITY_RUN_AWAY, + .ability2 = ABILITY_EARLY_BIRD, + .safariZoneFleeRate = 10, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_SEEL] = + { + .baseHP = 65, + .baseAttack = 45, + .baseDefense = 55, + .baseSpeed = 45, + .baseSpAttack = 45, + .baseSpDefense = 70, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 190, + .expYield = 100, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 1, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_THICK_FAT, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_WHITE, + .noFlip = FALSE, + }, + + [SPECIES_DEWGONG] = + { + .baseHP = 90, + .baseAttack = 70, + .baseDefense = 80, + .baseSpeed = 70, + .baseSpAttack = 70, + .baseSpDefense = 95, + .type1 = TYPE_WATER, + .type2 = TYPE_ICE, + .catchRate = 75, + .expYield = 176, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_THICK_FAT, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_WHITE, + .noFlip = FALSE, + }, + + [SPECIES_GRIMER] = + { + .baseHP = 80, + .baseAttack = 80, + .baseDefense = 50, + .baseSpeed = 25, + .baseSpAttack = 40, + .baseSpDefense = 50, + .type1 = TYPE_POISON, + .type2 = TYPE_POISON, + .catchRate = 190, + .expYield = 90, + .evYield_HP = 1, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NUGGET, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_AMORPHOUS, + .eggGroup2 = EGG_GROUP_AMORPHOUS, + .ability1 = ABILITY_STENCH, + .ability2 = ABILITY_STICKY_HOLD, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_MUK] = + { + .baseHP = 105, + .baseAttack = 105, + .baseDefense = 75, + .baseSpeed = 50, + .baseSpAttack = 65, + .baseSpDefense = 100, + .type1 = TYPE_POISON, + .type2 = TYPE_POISON, + .catchRate = 75, + .expYield = 157, + .evYield_HP = 1, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NUGGET, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_AMORPHOUS, + .eggGroup2 = EGG_GROUP_AMORPHOUS, + .ability1 = ABILITY_STENCH, + .ability2 = ABILITY_STICKY_HOLD, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_SHELLDER] = + { + .baseHP = 30, + .baseAttack = 65, + .baseDefense = 100, + .baseSpeed = 40, + .baseSpAttack = 45, + .baseSpDefense = 25, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 190, + .expYield = 97, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_PEARL, + .item2 = ITEM_BIG_PEARL, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_WATER_3, + .eggGroup2 = EGG_GROUP_WATER_3, + .ability1 = ABILITY_SHELL_ARMOR, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_CLOYSTER] = + { + .baseHP = 50, + .baseAttack = 95, + .baseDefense = 180, + .baseSpeed = 70, + .baseSpAttack = 85, + .baseSpDefense = 45, + .type1 = TYPE_WATER, + .type2 = TYPE_ICE, + .catchRate = 60, + .expYield = 203, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 2, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_PEARL, + .item2 = ITEM_BIG_PEARL, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_WATER_3, + .eggGroup2 = EGG_GROUP_WATER_3, + .ability1 = ABILITY_SHELL_ARMOR, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_GASTLY] = + { + .baseHP = 30, + .baseAttack = 35, + .baseDefense = 30, + .baseSpeed = 80, + .baseSpAttack = 100, + .baseSpDefense = 35, + .type1 = TYPE_GHOST, + .type2 = TYPE_POISON, + .catchRate = 190, + .expYield = 95, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_AMORPHOUS, + .eggGroup2 = EGG_GROUP_AMORPHOUS, + .ability1 = ABILITY_LEVITATE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_HAUNTER] = + { + .baseHP = 45, + .baseAttack = 50, + .baseDefense = 45, + .baseSpeed = 95, + .baseSpAttack = 115, + .baseSpDefense = 55, + .type1 = TYPE_GHOST, + .type2 = TYPE_POISON, + .catchRate = 90, + .expYield = 126, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 2, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_AMORPHOUS, + .eggGroup2 = EGG_GROUP_AMORPHOUS, + .ability1 = ABILITY_LEVITATE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_GENGAR] = + { + .baseHP = 60, + .baseAttack = 65, + .baseDefense = 60, + .baseSpeed = 110, + .baseSpAttack = 130, + .baseSpDefense = 75, + .type1 = TYPE_GHOST, + .type2 = TYPE_POISON, + .catchRate = 45, + .expYield = 190, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 3, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_AMORPHOUS, + .eggGroup2 = EGG_GROUP_AMORPHOUS, + .ability1 = ABILITY_LEVITATE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_ONIX] = + { + .baseHP = 35, + .baseAttack = 45, + .baseDefense = 160, + .baseSpeed = 70, + .baseSpAttack = 30, + .baseSpDefense = 45, + .type1 = TYPE_ROCK, + .type2 = TYPE_GROUND, + .catchRate = 45, + .expYield = 108, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 25, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_MINERAL, + .eggGroup2 = EGG_GROUP_MINERAL, + .ability1 = ABILITY_ROCK_HEAD, + .ability2 = ABILITY_STURDY, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_DROWZEE] = + { + .baseHP = 60, + .baseAttack = 48, + .baseDefense = 45, + .baseSpeed = 42, + .baseSpAttack = 43, + .baseSpDefense = 90, + .type1 = TYPE_PSYCHIC, + .type2 = TYPE_PSYCHIC, + .catchRate = 190, + .expYield = 102, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 1, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_HUMAN_LIKE, + .eggGroup2 = EGG_GROUP_HUMAN_LIKE, + .ability1 = ABILITY_INSOMNIA, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_HYPNO] = + { + .baseHP = 85, + .baseAttack = 73, + .baseDefense = 70, + .baseSpeed = 67, + .baseSpAttack = 73, + .baseSpDefense = 115, + .type1 = TYPE_PSYCHIC, + .type2 = TYPE_PSYCHIC, + .catchRate = 75, + .expYield = 165, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_HUMAN_LIKE, + .eggGroup2 = EGG_GROUP_HUMAN_LIKE, + .ability1 = ABILITY_INSOMNIA, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_KRABBY] = + { + .baseHP = 30, + .baseAttack = 105, + .baseDefense = 90, + .baseSpeed = 50, + .baseSpAttack = 25, + .baseSpDefense = 25, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 225, + .expYield = 115, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_WATER_3, + .eggGroup2 = EGG_GROUP_WATER_3, + .ability1 = ABILITY_HYPER_CUTTER, + .ability2 = ABILITY_SHELL_ARMOR, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_KINGLER] = + { + .baseHP = 55, + .baseAttack = 130, + .baseDefense = 115, + .baseSpeed = 75, + .baseSpAttack = 50, + .baseSpDefense = 50, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 60, + .expYield = 206, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_WATER_3, + .eggGroup2 = EGG_GROUP_WATER_3, + .ability1 = ABILITY_HYPER_CUTTER, + .ability2 = ABILITY_SHELL_ARMOR, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = TRUE, + }, + + [SPECIES_VOLTORB] = + { + .baseHP = 40, + .baseAttack = 30, + .baseDefense = 50, + .baseSpeed = 100, + .baseSpAttack = 55, + .baseSpDefense = 55, + .type1 = TYPE_ELECTRIC, + .type2 = TYPE_ELECTRIC, + .catchRate = 190, + .expYield = 103, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_MINERAL, + .eggGroup2 = EGG_GROUP_MINERAL, + .ability1 = ABILITY_SOUNDPROOF, + .ability2 = ABILITY_STATIC, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_ELECTRODE] = + { + .baseHP = 60, + .baseAttack = 50, + .baseDefense = 70, + .baseSpeed = 140, + .baseSpAttack = 80, + .baseSpDefense = 80, + .type1 = TYPE_ELECTRIC, + .type2 = TYPE_ELECTRIC, + .catchRate = 60, + .expYield = 150, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 2, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_MINERAL, + .eggGroup2 = EGG_GROUP_MINERAL, + .ability1 = ABILITY_SOUNDPROOF, + .ability2 = ABILITY_STATIC, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_EXEGGCUTE] = + { + .baseHP = 60, + .baseAttack = 40, + .baseDefense = 80, + .baseSpeed = 40, + .baseSpAttack = 60, + .baseSpDefense = 45, + .type1 = TYPE_GRASS, + .type2 = TYPE_PSYCHIC, + .catchRate = 90, + .expYield = 98, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_GRASS, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_CHLOROPHYLL, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PINK, + .noFlip = FALSE, + }, + + [SPECIES_EXEGGUTOR] = + { + .baseHP = 95, + .baseAttack = 95, + .baseDefense = 85, + .baseSpeed = 55, + .baseSpAttack = 125, + .baseSpDefense = 65, + .type1 = TYPE_GRASS, + .type2 = TYPE_PSYCHIC, + .catchRate = 45, + .expYield = 212, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 2, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_GRASS, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_CHLOROPHYLL, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_CUBONE] = + { + .baseHP = 50, + .baseAttack = 50, + .baseDefense = 95, + .baseSpeed = 35, + .baseSpAttack = 40, + .baseSpDefense = 50, + .type1 = TYPE_GROUND, + .type2 = TYPE_GROUND, + .catchRate = 190, + .expYield = 87, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_THICK_CLUB, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_MONSTER, + .ability1 = ABILITY_ROCK_HEAD, + .ability2 = ABILITY_LIGHTNING_ROD, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_MAROWAK] = + { + .baseHP = 60, + .baseAttack = 80, + .baseDefense = 110, + .baseSpeed = 45, + .baseSpAttack = 50, + .baseSpDefense = 80, + .type1 = TYPE_GROUND, + .type2 = TYPE_GROUND, + .catchRate = 75, + .expYield = 124, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 2, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_THICK_CLUB, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_MONSTER, + .ability1 = ABILITY_ROCK_HEAD, + .ability2 = ABILITY_LIGHTNING_ROD, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_HITMONLEE] = + { + .baseHP = 50, + .baseAttack = 120, + .baseDefense = 53, + .baseSpeed = 87, + .baseSpAttack = 35, + .baseSpDefense = 110, + .type1 = TYPE_FIGHTING, + .type2 = TYPE_FIGHTING, + .catchRate = 45, + .expYield = 139, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_MALE, + .eggCycles = 25, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_HUMAN_LIKE, + .eggGroup2 = EGG_GROUP_HUMAN_LIKE, + .ability1 = ABILITY_LIMBER, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_HITMONCHAN] = + { + .baseHP = 50, + .baseAttack = 105, + .baseDefense = 79, + .baseSpeed = 76, + .baseSpAttack = 35, + .baseSpDefense = 110, + .type1 = TYPE_FIGHTING, + .type2 = TYPE_FIGHTING, + .catchRate = 45, + .expYield = 140, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_MALE, + .eggCycles = 25, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_HUMAN_LIKE, + .eggGroup2 = EGG_GROUP_HUMAN_LIKE, + .ability1 = ABILITY_KEEN_EYE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_LICKITUNG] = + { + .baseHP = 90, + .baseAttack = 55, + .baseDefense = 75, + .baseSpeed = 30, + .baseSpAttack = 60, + .baseSpDefense = 75, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 45, + .expYield = 127, + .evYield_HP = 2, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_MONSTER, + .ability1 = ABILITY_OWN_TEMPO, + .ability2 = ABILITY_OBLIVIOUS, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PINK, + .noFlip = FALSE, + }, + + [SPECIES_KOFFING] = + { + .baseHP = 40, + .baseAttack = 65, + .baseDefense = 95, + .baseSpeed = 35, + .baseSpAttack = 60, + .baseSpDefense = 45, + .type1 = TYPE_POISON, + .type2 = TYPE_POISON, + .catchRate = 190, + .expYield = 114, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_SMOKE_BALL, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_AMORPHOUS, + .eggGroup2 = EGG_GROUP_AMORPHOUS, + .ability1 = ABILITY_LEVITATE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_WEEZING] = + { + .baseHP = 65, + .baseAttack = 90, + .baseDefense = 120, + .baseSpeed = 60, + .baseSpAttack = 85, + .baseSpDefense = 70, + .type1 = TYPE_POISON, + .type2 = TYPE_POISON, + .catchRate = 60, + .expYield = 173, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 2, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_SMOKE_BALL, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_AMORPHOUS, + .eggGroup2 = EGG_GROUP_AMORPHOUS, + .ability1 = ABILITY_LEVITATE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_RHYHORN] = + { + .baseHP = 80, + .baseAttack = 85, + .baseDefense = 95, + .baseSpeed = 25, + .baseSpAttack = 30, + .baseSpDefense = 30, + .type1 = TYPE_GROUND, + .type2 = TYPE_ROCK, + .catchRate = 120, + .expYield = 135, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_LIGHTNING_ROD, + .ability2 = ABILITY_ROCK_HEAD, + .safariZoneFleeRate = 4, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_RHYDON] = + { + .baseHP = 105, + .baseAttack = 130, + .baseDefense = 120, + .baseSpeed = 40, + .baseSpAttack = 45, + .baseSpDefense = 45, + .type1 = TYPE_GROUND, + .type2 = TYPE_ROCK, + .catchRate = 60, + .expYield = 204, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_LIGHTNING_ROD, + .ability2 = ABILITY_ROCK_HEAD, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_CHANSEY] = + { + .baseHP = 250, + .baseAttack = 5, + .baseDefense = 5, + .baseSpeed = 50, + .baseSpAttack = 35, + .baseSpDefense = 105, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 30, + .expYield = 255, + .evYield_HP = 2, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_LUCKY_EGG, + .genderRatio = MON_FEMALE, + .eggCycles = 40, + .friendship = 140, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_FAIRY, + .eggGroup2 = EGG_GROUP_FAIRY, + .ability1 = ABILITY_NATURAL_CURE, + .ability2 = ABILITY_SERENE_GRACE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PINK, + .noFlip = FALSE, + }, + + [SPECIES_TANGELA] = + { + .baseHP = 65, + .baseAttack = 55, + .baseDefense = 115, + .baseSpeed = 60, + .baseSpAttack = 100, + .baseSpDefense = 40, + .type1 = TYPE_GRASS, + .type2 = TYPE_GRASS, + .catchRate = 45, + .expYield = 166, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_GRASS, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_CHLOROPHYLL, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_KANGASKHAN] = + { + .baseHP = 105, + .baseAttack = 95, + .baseDefense = 80, + .baseSpeed = 90, + .baseSpAttack = 40, + .baseSpDefense = 80, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 45, + .expYield = 175, + .evYield_HP = 2, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_FEMALE, + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_MONSTER, + .ability1 = ABILITY_EARLY_BIRD, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_HORSEA] = + { + .baseHP = 30, + .baseAttack = 40, + .baseDefense = 70, + .baseSpeed = 60, + .baseSpAttack = 70, + .baseSpDefense = 25, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 225, + .expYield = 83, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_DRAGON_SCALE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_DRAGON, + .ability1 = ABILITY_SWIFT_SWIM, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_SEADRA] = + { + .baseHP = 55, + .baseAttack = 65, + .baseDefense = 95, + .baseSpeed = 85, + .baseSpAttack = 95, + .baseSpDefense = 45, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 75, + .expYield = 155, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_DRAGON_SCALE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_DRAGON, + .ability1 = ABILITY_POISON_POINT, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_GOLDEEN] = + { + .baseHP = 45, + .baseAttack = 67, + .baseDefense = 60, + .baseSpeed = 63, + .baseSpAttack = 35, + .baseSpDefense = 50, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 225, + .expYield = 111, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_WATER_2, + .eggGroup2 = EGG_GROUP_WATER_2, + .ability1 = ABILITY_SWIFT_SWIM, + .ability2 = ABILITY_WATER_VEIL, + .safariZoneFleeRate = 4, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_SEAKING] = + { + .baseHP = 80, + .baseAttack = 92, + .baseDefense = 65, + .baseSpeed = 68, + .baseSpAttack = 65, + .baseSpDefense = 80, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 60, + .expYield = 170, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_WATER_2, + .eggGroup2 = EGG_GROUP_WATER_2, + .ability1 = ABILITY_SWIFT_SWIM, + .ability2 = ABILITY_WATER_VEIL, + .safariZoneFleeRate = 6, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_STARYU] = + { + .baseHP = 30, + .baseAttack = 45, + .baseDefense = 55, + .baseSpeed = 85, + .baseSpAttack = 70, + .baseSpDefense = 55, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 225, + .expYield = 106, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_STARDUST, + .item2 = ITEM_STAR_PIECE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_WATER_3, + .eggGroup2 = EGG_GROUP_WATER_3, + .ability1 = ABILITY_ILLUMINATE, + .ability2 = ABILITY_NATURAL_CURE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_STARMIE] = + { + .baseHP = 60, + .baseAttack = 75, + .baseDefense = 85, + .baseSpeed = 115, + .baseSpAttack = 100, + .baseSpDefense = 85, + .type1 = TYPE_WATER, + .type2 = TYPE_PSYCHIC, + .catchRate = 60, + .expYield = 207, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 2, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_STARDUST, + .item2 = ITEM_STAR_PIECE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_WATER_3, + .eggGroup2 = EGG_GROUP_WATER_3, + .ability1 = ABILITY_ILLUMINATE, + .ability2 = ABILITY_NATURAL_CURE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_MR_MIME] = + { + .baseHP = 40, + .baseAttack = 45, + .baseDefense = 65, + .baseSpeed = 90, + .baseSpAttack = 100, + .baseSpDefense = 120, + .type1 = TYPE_PSYCHIC, + .type2 = TYPE_PSYCHIC, + .catchRate = 45, + .expYield = 136, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_LEPPA_BERRY, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 25, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_HUMAN_LIKE, + .eggGroup2 = EGG_GROUP_HUMAN_LIKE, + .ability1 = ABILITY_SOUNDPROOF, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PINK, + .noFlip = FALSE, + }, + + [SPECIES_SCYTHER] = + { + .baseHP = 70, + .baseAttack = 110, + .baseDefense = 80, + .baseSpeed = 105, + .baseSpAttack = 55, + .baseSpDefense = 80, + .type1 = TYPE_BUG, + .type2 = TYPE_FLYING, + .catchRate = 45, + .expYield = 187, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 25, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_SWARM, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_JYNX] = + { + .baseHP = 65, + .baseAttack = 50, + .baseDefense = 35, + .baseSpeed = 95, + .baseSpAttack = 115, + .baseSpDefense = 95, + .type1 = TYPE_ICE, + .type2 = TYPE_PSYCHIC, + .catchRate = 45, + .expYield = 137, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 2, + .evYield_SpDefense = 0, + .item1 = ITEM_ASPEAR_BERRY, + .item2 = ITEM_ASPEAR_BERRY, + .genderRatio = MON_FEMALE, + .eggCycles = 25, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_HUMAN_LIKE, + .eggGroup2 = EGG_GROUP_HUMAN_LIKE, + .ability1 = ABILITY_OBLIVIOUS, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_ELECTABUZZ] = + { + .baseHP = 65, + .baseAttack = 83, + .baseDefense = 57, + .baseSpeed = 105, + .baseSpAttack = 95, + .baseSpDefense = 85, + .type1 = TYPE_ELECTRIC, + .type2 = TYPE_ELECTRIC, + .catchRate = 45, + .expYield = 156, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 2, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(25), + .eggCycles = 25, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_HUMAN_LIKE, + .eggGroup2 = EGG_GROUP_HUMAN_LIKE, + .ability1 = ABILITY_STATIC, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = TRUE, + }, + + [SPECIES_MAGMAR] = + { + .baseHP = 65, + .baseAttack = 95, + .baseDefense = 57, + .baseSpeed = 93, + .baseSpAttack = 100, + .baseSpDefense = 85, + .type1 = TYPE_FIRE, + .type2 = TYPE_FIRE, + .catchRate = 45, + .expYield = 167, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 2, + .evYield_SpDefense = 0, + .item1 = ITEM_RAWST_BERRY, + .item2 = ITEM_RAWST_BERRY, + .genderRatio = PERCENT_FEMALE(25), + .eggCycles = 25, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_HUMAN_LIKE, + .eggGroup2 = EGG_GROUP_HUMAN_LIKE, + .ability1 = ABILITY_FLAME_BODY, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_PINSIR] = + { + .baseHP = 65, + .baseAttack = 125, + .baseDefense = 100, + .baseSpeed = 85, + .baseSpAttack = 55, + .baseSpDefense = 70, + .type1 = TYPE_BUG, + .type2 = TYPE_BUG, + .catchRate = 45, + .expYield = 200, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 25, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_HYPER_CUTTER, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 8, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_TAUROS] = + { + .baseHP = 75, + .baseAttack = 100, + .baseDefense = 95, + .baseSpeed = 110, + .baseSpAttack = 40, + .baseSpDefense = 70, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 45, + .expYield = 211, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_MALE, + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_INTIMIDATE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_MAGIKARP] = + { + .baseHP = 20, + .baseAttack = 10, + .baseDefense = 55, + .baseSpeed = 80, + .baseSpAttack = 15, + .baseSpDefense = 20, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 255, + .expYield = 20, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 5, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_WATER_2, + .eggGroup2 = EGG_GROUP_DRAGON, + .ability1 = ABILITY_SWIFT_SWIM, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 4, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_GYARADOS] = + { + .baseHP = 95, + .baseAttack = 125, + .baseDefense = 79, + .baseSpeed = 81, + .baseSpAttack = 60, + .baseSpDefense = 100, + .type1 = TYPE_WATER, + .type2 = TYPE_FLYING, + .catchRate = 45, + .expYield = 214, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 5, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_WATER_2, + .eggGroup2 = EGG_GROUP_DRAGON, + .ability1 = ABILITY_INTIMIDATE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_LAPRAS] = + { + .baseHP = 130, + .baseAttack = 85, + .baseDefense = 80, + .baseSpeed = 60, + .baseSpAttack = 85, + .baseSpDefense = 95, + .type1 = TYPE_WATER, + .type2 = TYPE_ICE, + .catchRate = 45, + .expYield = 219, + .evYield_HP = 2, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 40, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_WATER_1, + .ability1 = ABILITY_WATER_ABSORB, + .ability2 = ABILITY_SHELL_ARMOR, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_DITTO] = + { + .baseHP = 48, + .baseAttack = 48, + .baseDefense = 48, + .baseSpeed = 48, + .baseSpAttack = 48, + .baseSpDefense = 48, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 35, + .expYield = 61, + .evYield_HP = 1, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_METAL_POWDER, + .genderRatio = MON_GENDERLESS, + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_DITTO, + .eggGroup2 = EGG_GROUP_DITTO, + .ability1 = ABILITY_LIMBER, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_EEVEE] = + { + .baseHP = 55, + .baseAttack = 55, + .baseDefense = 50, + .baseSpeed = 55, + .baseSpAttack = 45, + .baseSpDefense = 65, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 45, + .expYield = 92, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 1, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 35, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_RUN_AWAY, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_VAPOREON] = + { + .baseHP = 130, + .baseAttack = 65, + .baseDefense = 60, + .baseSpeed = 65, + .baseSpAttack = 110, + .baseSpDefense = 95, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 45, + .expYield = 196, + .evYield_HP = 2, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 35, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_WATER_ABSORB, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_JOLTEON] = + { + .baseHP = 65, + .baseAttack = 65, + .baseDefense = 60, + .baseSpeed = 130, + .baseSpAttack = 110, + .baseSpDefense = 95, + .type1 = TYPE_ELECTRIC, + .type2 = TYPE_ELECTRIC, + .catchRate = 45, + .expYield = 197, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 2, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 35, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_VOLT_ABSORB, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_FLAREON] = + { + .baseHP = 65, + .baseAttack = 130, + .baseDefense = 60, + .baseSpeed = 65, + .baseSpAttack = 95, + .baseSpDefense = 110, + .type1 = TYPE_FIRE, + .type2 = TYPE_FIRE, + .catchRate = 45, + .expYield = 198, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 35, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_FLASH_FIRE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_PORYGON] = + { + .baseHP = 65, + .baseAttack = 60, + .baseDefense = 70, + .baseSpeed = 40, + .baseSpAttack = 85, + .baseSpDefense = 75, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 45, + .expYield = 130, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_MINERAL, + .eggGroup2 = EGG_GROUP_MINERAL, + .ability1 = ABILITY_TRACE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PINK, + .noFlip = FALSE, + }, + + [SPECIES_OMANYTE] = + { + .baseHP = 35, + .baseAttack = 40, + .baseDefense = 100, + .baseSpeed = 35, + .baseSpAttack = 90, + .baseSpDefense = 55, + .type1 = TYPE_ROCK, + .type2 = TYPE_WATER, + .catchRate = 45, + .expYield = 120, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 30, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_WATER_3, + .ability1 = ABILITY_SWIFT_SWIM, + .ability2 = ABILITY_SHELL_ARMOR, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_OMASTAR] = + { + .baseHP = 70, + .baseAttack = 60, + .baseDefense = 125, + .baseSpeed = 55, + .baseSpAttack = 115, + .baseSpDefense = 70, + .type1 = TYPE_ROCK, + .type2 = TYPE_WATER, + .catchRate = 45, + .expYield = 199, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 2, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 30, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_WATER_3, + .ability1 = ABILITY_SWIFT_SWIM, + .ability2 = ABILITY_SHELL_ARMOR, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_KABUTO] = + { + .baseHP = 30, + .baseAttack = 80, + .baseDefense = 90, + .baseSpeed = 55, + .baseSpAttack = 55, + .baseSpDefense = 45, + .type1 = TYPE_ROCK, + .type2 = TYPE_WATER, + .catchRate = 45, + .expYield = 119, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 30, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_WATER_3, + .ability1 = ABILITY_SWIFT_SWIM, + .ability2 = ABILITY_BATTLE_ARMOR, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_KABUTOPS] = + { + .baseHP = 60, + .baseAttack = 115, + .baseDefense = 105, + .baseSpeed = 80, + .baseSpAttack = 65, + .baseSpDefense = 70, + .type1 = TYPE_ROCK, + .type2 = TYPE_WATER, + .catchRate = 45, + .expYield = 201, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 30, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_WATER_3, + .ability1 = ABILITY_SWIFT_SWIM, + .ability2 = ABILITY_BATTLE_ARMOR, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_AERODACTYL] = + { + .baseHP = 80, + .baseAttack = 105, + .baseDefense = 65, + .baseSpeed = 130, + .baseSpAttack = 60, + .baseSpDefense = 75, + .type1 = TYPE_ROCK, + .type2 = TYPE_FLYING, + .catchRate = 45, + .expYield = 202, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 2, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 35, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_FLYING, + .eggGroup2 = EGG_GROUP_FLYING, + .ability1 = ABILITY_ROCK_HEAD, + .ability2 = ABILITY_PRESSURE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_SNORLAX] = + { + .baseHP = 160, + .baseAttack = 110, + .baseDefense = 65, + .baseSpeed = 30, + .baseSpAttack = 65, + .baseSpDefense = 110, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 25, + .expYield = 154, + .evYield_HP = 2, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_LEFTOVERS, + .item2 = ITEM_LEFTOVERS, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 40, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_MONSTER, + .ability1 = ABILITY_IMMUNITY, + .ability2 = ABILITY_THICK_FAT, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_ARTICUNO] = + { + .baseHP = 90, + .baseAttack = 85, + .baseDefense = 100, + .baseSpeed = 85, + .baseSpAttack = 95, + .baseSpDefense = 125, + .type1 = TYPE_ICE, + .type2 = TYPE_FLYING, + .catchRate = 3, + .expYield = 215, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 3, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 80, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_PRESSURE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_ZAPDOS] = + { + .baseHP = 90, + .baseAttack = 90, + .baseDefense = 85, + .baseSpeed = 100, + .baseSpAttack = 125, + .baseSpDefense = 90, + .type1 = TYPE_ELECTRIC, + .type2 = TYPE_FLYING, + .catchRate = 3, + .expYield = 216, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 3, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 80, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_PRESSURE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_MOLTRES] = + { + .baseHP = 90, + .baseAttack = 100, + .baseDefense = 90, + .baseSpeed = 90, + .baseSpAttack = 125, + .baseSpDefense = 85, + .type1 = TYPE_FIRE, + .type2 = TYPE_FLYING, + .catchRate = 3, + .expYield = 217, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 3, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 80, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_PRESSURE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_DRATINI] = + { + .baseHP = 41, + .baseAttack = 64, + .baseDefense = 45, + .baseSpeed = 50, + .baseSpAttack = 50, + .baseSpDefense = 50, + .type1 = TYPE_DRAGON, + .type2 = TYPE_DRAGON, + .catchRate = 45, + .expYield = 67, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_DRAGON_SCALE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 40, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_DRAGON, + .ability1 = ABILITY_SHED_SKIN, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_DRAGONAIR] = + { + .baseHP = 61, + .baseAttack = 84, + .baseDefense = 65, + .baseSpeed = 70, + .baseSpAttack = 70, + .baseSpDefense = 70, + .type1 = TYPE_DRAGON, + .type2 = TYPE_DRAGON, + .catchRate = 45, + .expYield = 144, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_DRAGON_SCALE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 40, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_DRAGON, + .ability1 = ABILITY_SHED_SKIN, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_DRAGONITE] = + { + .baseHP = 91, + .baseAttack = 134, + .baseDefense = 95, + .baseSpeed = 80, + .baseSpAttack = 100, + .baseSpDefense = 100, + .type1 = TYPE_DRAGON, + .type2 = TYPE_FLYING, + .catchRate = 45, + .expYield = 218, + .evYield_HP = 0, + .evYield_Attack = 3, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_DRAGON_SCALE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 40, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_DRAGON, + .ability1 = ABILITY_INNER_FOCUS, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_MEWTWO] = + { + .baseHP = 106, + .baseAttack = 110, + .baseDefense = 90, + .baseSpeed = 130, + .baseSpAttack = 154, + .baseSpDefense = 90, + .type1 = TYPE_PSYCHIC, + .type2 = TYPE_PSYCHIC, + .catchRate = 3, + .expYield = 220, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 3, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_PRESSURE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_MEW] = + { + .baseHP = 100, + .baseAttack = 100, + .baseDefense = 100, + .baseSpeed = 100, + .baseSpAttack = 100, + .baseSpDefense = 100, + .type1 = TYPE_PSYCHIC, + .type2 = TYPE_PSYCHIC, + .catchRate = 45, + .expYield = 64, + .evYield_HP = 3, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_LUM_BERRY, + .item2 = ITEM_LUM_BERRY, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 100, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_SYNCHRONIZE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PINK, + .noFlip = FALSE, + }, + + [SPECIES_CHIKORITA] = + { + .baseHP = 45, + .baseAttack = 49, + .baseDefense = 65, + .baseSpeed = 45, + .baseSpAttack = 49, + .baseSpDefense = 65, + .type1 = TYPE_GRASS, + .type2 = TYPE_GRASS, + .catchRate = 45, + .expYield = 64, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 1, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_OVERGROW, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_BAYLEEF] = + { + .baseHP = 60, + .baseAttack = 62, + .baseDefense = 80, + .baseSpeed = 60, + .baseSpAttack = 63, + .baseSpDefense = 80, + .type1 = TYPE_GRASS, + .type2 = TYPE_GRASS, + .catchRate = 45, + .expYield = 141, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 1, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_OVERGROW, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_MEGANIUM] = + { + .baseHP = 80, + .baseAttack = 82, + .baseDefense = 100, + .baseSpeed = 80, + .baseSpAttack = 83, + .baseSpDefense = 100, + .type1 = TYPE_GRASS, + .type2 = TYPE_GRASS, + .catchRate = 45, + .expYield = 208, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_OVERGROW, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_CYNDAQUIL] = + { + .baseHP = 39, + .baseAttack = 52, + .baseDefense = 43, + .baseSpeed = 65, + .baseSpAttack = 60, + .baseSpDefense = 50, + .type1 = TYPE_FIRE, + .type2 = TYPE_FIRE, + .catchRate = 45, + .expYield = 65, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_BLAZE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_QUILAVA] = + { + .baseHP = 58, + .baseAttack = 64, + .baseDefense = 58, + .baseSpeed = 80, + .baseSpAttack = 80, + .baseSpDefense = 65, + .type1 = TYPE_FIRE, + .type2 = TYPE_FIRE, + .catchRate = 45, + .expYield = 142, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_BLAZE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_TYPHLOSION] = + { + .baseHP = 78, + .baseAttack = 84, + .baseDefense = 78, + .baseSpeed = 100, + .baseSpAttack = 109, + .baseSpDefense = 85, + .type1 = TYPE_FIRE, + .type2 = TYPE_FIRE, + .catchRate = 45, + .expYield = 209, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 3, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_BLAZE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_TOTODILE] = + { + .baseHP = 50, + .baseAttack = 65, + .baseDefense = 64, + .baseSpeed = 43, + .baseSpAttack = 44, + .baseSpDefense = 48, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 45, + .expYield = 66, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_WATER_1, + .ability1 = ABILITY_TORRENT, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_CROCONAW] = + { + .baseHP = 65, + .baseAttack = 80, + .baseDefense = 80, + .baseSpeed = 58, + .baseSpAttack = 59, + .baseSpDefense = 63, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 45, + .expYield = 143, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_WATER_1, + .ability1 = ABILITY_TORRENT, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = TRUE, + }, + + [SPECIES_FERALIGATR] = + { + .baseHP = 85, + .baseAttack = 105, + .baseDefense = 100, + .baseSpeed = 78, + .baseSpAttack = 79, + .baseSpDefense = 83, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 45, + .expYield = 210, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_WATER_1, + .ability1 = ABILITY_TORRENT, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_SENTRET] = + { + .baseHP = 35, + .baseAttack = 46, + .baseDefense = 34, + .baseSpeed = 20, + .baseSpAttack = 35, + .baseSpDefense = 45, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 255, + .expYield = 57, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_ORAN_BERRY, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_RUN_AWAY, + .ability2 = ABILITY_KEEN_EYE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_FURRET] = + { + .baseHP = 85, + .baseAttack = 76, + .baseDefense = 64, + .baseSpeed = 90, + .baseSpAttack = 45, + .baseSpDefense = 55, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 90, + .expYield = 116, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 2, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_ORAN_BERRY, + .item2 = ITEM_SITRUS_BERRY, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_RUN_AWAY, + .ability2 = ABILITY_KEEN_EYE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_HOOTHOOT] = + { + .baseHP = 60, + .baseAttack = 30, + .baseDefense = 30, + .baseSpeed = 50, + .baseSpAttack = 36, + .baseSpDefense = 56, + .type1 = TYPE_NORMAL, + .type2 = TYPE_FLYING, + .catchRate = 255, + .expYield = 58, + .evYield_HP = 1, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FLYING, + .eggGroup2 = EGG_GROUP_FLYING, + .ability1 = ABILITY_INSOMNIA, + .ability2 = ABILITY_KEEN_EYE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_NOCTOWL] = + { + .baseHP = 100, + .baseAttack = 50, + .baseDefense = 50, + .baseSpeed = 70, + .baseSpAttack = 76, + .baseSpDefense = 96, + .type1 = TYPE_NORMAL, + .type2 = TYPE_FLYING, + .catchRate = 90, + .expYield = 162, + .evYield_HP = 2, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FLYING, + .eggGroup2 = EGG_GROUP_FLYING, + .ability1 = ABILITY_INSOMNIA, + .ability2 = ABILITY_KEEN_EYE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_LEDYBA] = + { + .baseHP = 40, + .baseAttack = 20, + .baseDefense = 30, + .baseSpeed = 55, + .baseSpAttack = 40, + .baseSpDefense = 80, + .type1 = TYPE_BUG, + .type2 = TYPE_FLYING, + .catchRate = 255, + .expYield = 54, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 1, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_SWARM, + .ability2 = ABILITY_EARLY_BIRD, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_LEDIAN] = + { + .baseHP = 55, + .baseAttack = 35, + .baseDefense = 50, + .baseSpeed = 85, + .baseSpAttack = 55, + .baseSpDefense = 110, + .type1 = TYPE_BUG, + .type2 = TYPE_FLYING, + .catchRate = 90, + .expYield = 134, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_SWARM, + .ability2 = ABILITY_EARLY_BIRD, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_SPINARAK] = + { + .baseHP = 40, + .baseAttack = 60, + .baseDefense = 40, + .baseSpeed = 30, + .baseSpAttack = 40, + .baseSpDefense = 40, + .type1 = TYPE_BUG, + .type2 = TYPE_POISON, + .catchRate = 255, + .expYield = 54, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_SWARM, + .ability2 = ABILITY_INSOMNIA, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_ARIADOS] = + { + .baseHP = 70, + .baseAttack = 90, + .baseDefense = 70, + .baseSpeed = 40, + .baseSpAttack = 60, + .baseSpDefense = 60, + .type1 = TYPE_BUG, + .type2 = TYPE_POISON, + .catchRate = 90, + .expYield = 134, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_SWARM, + .ability2 = ABILITY_INSOMNIA, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_CROBAT] = + { + .baseHP = 85, + .baseAttack = 90, + .baseDefense = 80, + .baseSpeed = 130, + .baseSpAttack = 70, + .baseSpDefense = 80, + .type1 = TYPE_POISON, + .type2 = TYPE_FLYING, + .catchRate = 90, + .expYield = 204, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 3, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FLYING, + .eggGroup2 = EGG_GROUP_FLYING, + .ability1 = ABILITY_INNER_FOCUS, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_CHINCHOU] = + { + .baseHP = 75, + .baseAttack = 38, + .baseDefense = 38, + .baseSpeed = 67, + .baseSpAttack = 56, + .baseSpDefense = 56, + .type1 = TYPE_WATER, + .type2 = TYPE_ELECTRIC, + .catchRate = 190, + .expYield = 90, + .evYield_HP = 1, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_YELLOW_SHARD, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_WATER_2, + .eggGroup2 = EGG_GROUP_WATER_2, + .ability1 = ABILITY_VOLT_ABSORB, + .ability2 = ABILITY_ILLUMINATE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_LANTURN] = + { + .baseHP = 125, + .baseAttack = 58, + .baseDefense = 58, + .baseSpeed = 67, + .baseSpAttack = 76, + .baseSpDefense = 76, + .type1 = TYPE_WATER, + .type2 = TYPE_ELECTRIC, + .catchRate = 75, + .expYield = 156, + .evYield_HP = 2, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_YELLOW_SHARD, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_WATER_2, + .eggGroup2 = EGG_GROUP_WATER_2, + .ability1 = ABILITY_VOLT_ABSORB, + .ability2 = ABILITY_ILLUMINATE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_PICHU] = + { + .baseHP = 20, + .baseAttack = 40, + .baseDefense = 15, + .baseSpeed = 60, + .baseSpAttack = 35, + .baseSpDefense = 35, + .type1 = TYPE_ELECTRIC, + .type2 = TYPE_ELECTRIC, + .catchRate = 190, + .expYield = 42, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_ORAN_BERRY, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 10, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_STATIC, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_CLEFFA] = + { + .baseHP = 50, + .baseAttack = 25, + .baseDefense = 28, + .baseSpeed = 15, + .baseSpAttack = 45, + .baseSpDefense = 55, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 150, + .expYield = 37, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 1, + .item1 = ITEM_LEPPA_BERRY, + .item2 = ITEM_MOON_STONE, + .genderRatio = PERCENT_FEMALE(75), + .eggCycles = 10, + .friendship = 140, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_CUTE_CHARM, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PINK, + .noFlip = FALSE, + }, + + [SPECIES_IGGLYBUFF] = + { + .baseHP = 90, + .baseAttack = 30, + .baseDefense = 15, + .baseSpeed = 15, + .baseSpAttack = 40, + .baseSpDefense = 20, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 170, + .expYield = 39, + .evYield_HP = 1, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(75), + .eggCycles = 10, + .friendship = 70, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_CUTE_CHARM, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PINK, + .noFlip = TRUE, + }, + + [SPECIES_TOGEPI] = + { + .baseHP = 35, + .baseAttack = 20, + .baseDefense = 65, + .baseSpeed = 20, + .baseSpAttack = 40, + .baseSpDefense = 65, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 190, + .expYield = 74, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 1, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 10, + .friendship = 70, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_HUSTLE, + .ability2 = ABILITY_SERENE_GRACE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_WHITE, + .noFlip = FALSE, + }, + + [SPECIES_TOGETIC] = + { + .baseHP = 55, + .baseAttack = 40, + .baseDefense = 85, + .baseSpeed = 40, + .baseSpAttack = 80, + .baseSpDefense = 105, + .type1 = TYPE_NORMAL, + .type2 = TYPE_FLYING, + .catchRate = 75, + .expYield = 114, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 10, + .friendship = 70, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_FLYING, + .eggGroup2 = EGG_GROUP_FAIRY, + .ability1 = ABILITY_HUSTLE, + .ability2 = ABILITY_SERENE_GRACE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_WHITE, + .noFlip = FALSE, + }, + + [SPECIES_NATU] = + { + .baseHP = 40, + .baseAttack = 50, + .baseDefense = 45, + .baseSpeed = 70, + .baseSpAttack = 70, + .baseSpDefense = 45, + .type1 = TYPE_PSYCHIC, + .type2 = TYPE_FLYING, + .catchRate = 190, + .expYield = 73, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FLYING, + .eggGroup2 = EGG_GROUP_FLYING, + .ability1 = ABILITY_SYNCHRONIZE, + .ability2 = ABILITY_EARLY_BIRD, + .safariZoneFleeRate = 6, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_XATU] = + { + .baseHP = 65, + .baseAttack = 75, + .baseDefense = 70, + .baseSpeed = 95, + .baseSpAttack = 95, + .baseSpDefense = 70, + .type1 = TYPE_PSYCHIC, + .type2 = TYPE_FLYING, + .catchRate = 75, + .expYield = 171, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FLYING, + .eggGroup2 = EGG_GROUP_FLYING, + .ability1 = ABILITY_SYNCHRONIZE, + .ability2 = ABILITY_EARLY_BIRD, + .safariZoneFleeRate = 8, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_MAREEP] = + { + .baseHP = 55, + .baseAttack = 40, + .baseDefense = 40, + .baseSpeed = 35, + .baseSpAttack = 65, + .baseSpDefense = 45, + .type1 = TYPE_ELECTRIC, + .type2 = TYPE_ELECTRIC, + .catchRate = 235, + .expYield = 59, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_STATIC, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_WHITE, + .noFlip = FALSE, + }, + + [SPECIES_FLAAFFY] = + { + .baseHP = 70, + .baseAttack = 55, + .baseDefense = 55, + .baseSpeed = 45, + .baseSpAttack = 80, + .baseSpDefense = 60, + .type1 = TYPE_ELECTRIC, + .type2 = TYPE_ELECTRIC, + .catchRate = 120, + .expYield = 117, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 2, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_STATIC, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PINK, + .noFlip = FALSE, + }, + + [SPECIES_AMPHAROS] = + { + .baseHP = 90, + .baseAttack = 75, + .baseDefense = 75, + .baseSpeed = 55, + .baseSpAttack = 115, + .baseSpDefense = 90, + .type1 = TYPE_ELECTRIC, + .type2 = TYPE_ELECTRIC, + .catchRate = 45, + .expYield = 194, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 3, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_STATIC, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_BELLOSSOM] = + { + .baseHP = 75, + .baseAttack = 80, + .baseDefense = 85, + .baseSpeed = 50, + .baseSpAttack = 90, + .baseSpDefense = 100, + .type1 = TYPE_GRASS, + .type2 = TYPE_GRASS, + .catchRate = 45, + .expYield = 184, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 3, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_GRASS, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_CHLOROPHYLL, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_MARILL] = + { + .baseHP = 70, + .baseAttack = 20, + .baseDefense = 50, + .baseSpeed = 40, + .baseSpAttack = 20, + .baseSpDefense = 50, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 190, + .expYield = 58, + .evYield_HP = 2, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 10, + .friendship = 70, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_FAIRY, + .ability1 = ABILITY_THICK_FAT, + .ability2 = ABILITY_HUGE_POWER, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_AZUMARILL] = + { + .baseHP = 100, + .baseAttack = 50, + .baseDefense = 80, + .baseSpeed = 50, + .baseSpAttack = 50, + .baseSpDefense = 80, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 75, + .expYield = 153, + .evYield_HP = 3, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 10, + .friendship = 70, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_FAIRY, + .ability1 = ABILITY_THICK_FAT, + .ability2 = ABILITY_HUGE_POWER, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_SUDOWOODO] = + { + .baseHP = 70, + .baseAttack = 100, + .baseDefense = 115, + .baseSpeed = 30, + .baseSpAttack = 30, + .baseSpDefense = 65, + .type1 = TYPE_ROCK, + .type2 = TYPE_ROCK, + .catchRate = 65, + .expYield = 135, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 2, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_MINERAL, + .eggGroup2 = EGG_GROUP_MINERAL, + .ability1 = ABILITY_STURDY, + .ability2 = ABILITY_ROCK_HEAD, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_POLITOED] = + { + .baseHP = 90, + .baseAttack = 75, + .baseDefense = 75, + .baseSpeed = 70, + .baseSpAttack = 90, + .baseSpDefense = 100, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 45, + .expYield = 185, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 3, + .item1 = ITEM_NONE, + .item2 = ITEM_KINGS_ROCK, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_WATER_1, + .ability1 = ABILITY_WATER_ABSORB, + .ability2 = ABILITY_DAMP, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = TRUE, + }, + + [SPECIES_HOPPIP] = + { + .baseHP = 35, + .baseAttack = 35, + .baseDefense = 40, + .baseSpeed = 50, + .baseSpAttack = 35, + .baseSpDefense = 55, + .type1 = TYPE_GRASS, + .type2 = TYPE_FLYING, + .catchRate = 255, + .expYield = 74, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 1, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_FAIRY, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_CHLOROPHYLL, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PINK, + .noFlip = FALSE, + }, + + [SPECIES_SKIPLOOM] = + { + .baseHP = 55, + .baseAttack = 45, + .baseDefense = 50, + .baseSpeed = 80, + .baseSpAttack = 45, + .baseSpDefense = 65, + .type1 = TYPE_GRASS, + .type2 = TYPE_FLYING, + .catchRate = 120, + .expYield = 136, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 2, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_FAIRY, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_CHLOROPHYLL, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_JUMPLUFF] = + { + .baseHP = 75, + .baseAttack = 55, + .baseDefense = 70, + .baseSpeed = 110, + .baseSpAttack = 55, + .baseSpDefense = 85, + .type1 = TYPE_GRASS, + .type2 = TYPE_FLYING, + .catchRate = 45, + .expYield = 176, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 3, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_FAIRY, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_CHLOROPHYLL, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_AIPOM] = + { + .baseHP = 55, + .baseAttack = 70, + .baseDefense = 55, + .baseSpeed = 85, + .baseSpAttack = 40, + .baseSpDefense = 55, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 45, + .expYield = 94, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_RUN_AWAY, + .ability2 = ABILITY_PICKUP, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_SUNKERN] = + { + .baseHP = 30, + .baseAttack = 30, + .baseDefense = 30, + .baseSpeed = 30, + .baseSpAttack = 30, + .baseSpDefense = 30, + .type1 = TYPE_GRASS, + .type2 = TYPE_GRASS, + .catchRate = 235, + .expYield = 52, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_GRASS, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_CHLOROPHYLL, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_SUNFLORA] = + { + .baseHP = 75, + .baseAttack = 75, + .baseDefense = 55, + .baseSpeed = 30, + .baseSpAttack = 105, + .baseSpDefense = 85, + .type1 = TYPE_GRASS, + .type2 = TYPE_GRASS, + .catchRate = 120, + .expYield = 146, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 2, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_GRASS, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_CHLOROPHYLL, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_YANMA] = + { + .baseHP = 65, + .baseAttack = 65, + .baseDefense = 45, + .baseSpeed = 95, + .baseSpAttack = 75, + .baseSpDefense = 45, + .type1 = TYPE_BUG, + .type2 = TYPE_FLYING, + .catchRate = 75, + .expYield = 147, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 2, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_SPEED_BOOST, + .ability2 = ABILITY_COMPOUND_EYES, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_WOOPER] = + { + .baseHP = 55, + .baseAttack = 45, + .baseDefense = 45, + .baseSpeed = 15, + .baseSpAttack = 25, + .baseSpDefense = 25, + .type1 = TYPE_WATER, + .type2 = TYPE_GROUND, + .catchRate = 255, + .expYield = 52, + .evYield_HP = 1, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_DAMP, + .ability2 = ABILITY_WATER_ABSORB, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_QUAGSIRE] = + { + .baseHP = 95, + .baseAttack = 85, + .baseDefense = 85, + .baseSpeed = 35, + .baseSpAttack = 65, + .baseSpDefense = 65, + .type1 = TYPE_WATER, + .type2 = TYPE_GROUND, + .catchRate = 90, + .expYield = 137, + .evYield_HP = 2, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_DAMP, + .ability2 = ABILITY_WATER_ABSORB, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_ESPEON] = + { + .baseHP = 65, + .baseAttack = 65, + .baseDefense = 60, + .baseSpeed = 110, + .baseSpAttack = 130, + .baseSpDefense = 95, + .type1 = TYPE_PSYCHIC, + .type2 = TYPE_PSYCHIC, + .catchRate = 45, + .expYield = 197, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 2, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 35, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_SYNCHRONIZE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_UMBREON] = + { + .baseHP = 95, + .baseAttack = 65, + .baseDefense = 110, + .baseSpeed = 65, + .baseSpAttack = 60, + .baseSpDefense = 130, + .type1 = TYPE_DARK, + .type2 = TYPE_DARK, + .catchRate = 45, + .expYield = 197, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 35, + .friendship = 35, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_SYNCHRONIZE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_MURKROW] = + { + .baseHP = 60, + .baseAttack = 85, + .baseDefense = 42, + .baseSpeed = 91, + .baseSpAttack = 85, + .baseSpDefense = 42, + .type1 = TYPE_DARK, + .type2 = TYPE_FLYING, + .catchRate = 30, + .expYield = 107, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 35, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_FLYING, + .eggGroup2 = EGG_GROUP_FLYING, + .ability1 = ABILITY_INSOMNIA, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_SLOWKING] = + { + .baseHP = 95, + .baseAttack = 75, + .baseDefense = 80, + .baseSpeed = 30, + .baseSpAttack = 100, + .baseSpDefense = 110, + .type1 = TYPE_WATER, + .type2 = TYPE_PSYCHIC, + .catchRate = 70, + .expYield = 164, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 3, + .item1 = ITEM_NONE, + .item2 = ITEM_KINGS_ROCK, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_WATER_1, + .ability1 = ABILITY_OBLIVIOUS, + .ability2 = ABILITY_OWN_TEMPO, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PINK, + .noFlip = FALSE, + }, + + [SPECIES_MISDREAVUS] = + { + .baseHP = 60, + .baseAttack = 60, + .baseDefense = 60, + .baseSpeed = 85, + .baseSpAttack = 85, + .baseSpDefense = 85, + .type1 = TYPE_GHOST, + .type2 = TYPE_GHOST, + .catchRate = 45, + .expYield = 147, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 1, + .item1 = ITEM_NONE, + .item2 = ITEM_SPELL_TAG, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 25, + .friendship = 35, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_AMORPHOUS, + .eggGroup2 = EGG_GROUP_AMORPHOUS, + .ability1 = ABILITY_LEVITATE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_UNOWN] = + { + .baseHP = 48, + .baseAttack = 72, + .baseDefense = 48, + .baseSpeed = 48, + .baseSpAttack = 72, + .baseSpDefense = 48, + .type1 = TYPE_PSYCHIC, + .type2 = TYPE_PSYCHIC, + .catchRate = 225, + .expYield = 61, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 40, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_LEVITATE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = TRUE, + }, + + [SPECIES_WOBBUFFET] = + { + .baseHP = 190, + .baseAttack = 33, + .baseDefense = 58, + .baseSpeed = 33, + .baseSpAttack = 33, + .baseSpDefense = 58, + .type1 = TYPE_PSYCHIC, + .type2 = TYPE_PSYCHIC, + .catchRate = 45, + .expYield = 177, + .evYield_HP = 2, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_AMORPHOUS, + .eggGroup2 = EGG_GROUP_AMORPHOUS, + .ability1 = ABILITY_SHADOW_TAG, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 4, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_GIRAFARIG] = + { + .baseHP = 70, + .baseAttack = 80, + .baseDefense = 65, + .baseSpeed = 85, + .baseSpAttack = 90, + .baseSpDefense = 65, + .type1 = TYPE_NORMAL, + .type2 = TYPE_PSYCHIC, + .catchRate = 60, + .expYield = 149, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 2, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_PERSIM_BERRY, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_INNER_FOCUS, + .ability2 = ABILITY_EARLY_BIRD, + .safariZoneFleeRate = 4, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_PINECO] = + { + .baseHP = 50, + .baseAttack = 65, + .baseDefense = 90, + .baseSpeed = 15, + .baseSpAttack = 35, + .baseSpDefense = 35, + .type1 = TYPE_BUG, + .type2 = TYPE_BUG, + .catchRate = 190, + .expYield = 60, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_STURDY, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_FORRETRESS] = + { + .baseHP = 75, + .baseAttack = 90, + .baseDefense = 140, + .baseSpeed = 40, + .baseSpAttack = 60, + .baseSpDefense = 60, + .type1 = TYPE_BUG, + .type2 = TYPE_STEEL, + .catchRate = 75, + .expYield = 118, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 2, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_STURDY, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_DUNSPARCE] = + { + .baseHP = 100, + .baseAttack = 70, + .baseDefense = 70, + .baseSpeed = 45, + .baseSpAttack = 65, + .baseSpDefense = 65, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 190, + .expYield = 75, + .evYield_HP = 1, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_SERENE_GRACE, + .ability2 = ABILITY_RUN_AWAY, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_GLIGAR] = + { + .baseHP = 65, + .baseAttack = 75, + .baseDefense = 105, + .baseSpeed = 85, + .baseSpAttack = 35, + .baseSpDefense = 65, + .type1 = TYPE_GROUND, + .type2 = TYPE_FLYING, + .catchRate = 60, + .expYield = 108, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_HYPER_CUTTER, + .ability2 = ABILITY_SAND_VEIL, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_STEELIX] = + { + .baseHP = 75, + .baseAttack = 85, + .baseDefense = 200, + .baseSpeed = 30, + .baseSpAttack = 55, + .baseSpDefense = 65, + .type1 = TYPE_STEEL, + .type2 = TYPE_GROUND, + .catchRate = 25, + .expYield = 196, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 2, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_METAL_COAT, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 25, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_MINERAL, + .eggGroup2 = EGG_GROUP_MINERAL, + .ability1 = ABILITY_ROCK_HEAD, + .ability2 = ABILITY_STURDY, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_SNUBBULL] = + { + .baseHP = 60, + .baseAttack = 80, + .baseDefense = 50, + .baseSpeed = 30, + .baseSpAttack = 40, + .baseSpDefense = 40, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 190, + .expYield = 63, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(75), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FAIRY, + .ability1 = ABILITY_INTIMIDATE, + .ability2 = ABILITY_RUN_AWAY, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PINK, + .noFlip = FALSE, + }, + + [SPECIES_GRANBULL] = + { + .baseHP = 90, + .baseAttack = 120, + .baseDefense = 75, + .baseSpeed = 45, + .baseSpAttack = 60, + .baseSpDefense = 60, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 75, + .expYield = 178, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(75), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FAIRY, + .ability1 = ABILITY_INTIMIDATE, + .ability2 = ABILITY_INTIMIDATE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_QWILFISH] = + { + .baseHP = 65, + .baseAttack = 95, + .baseDefense = 75, + .baseSpeed = 85, + .baseSpAttack = 55, + .baseSpDefense = 55, + .type1 = TYPE_WATER, + .type2 = TYPE_POISON, + .catchRate = 45, + .expYield = 100, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_WATER_2, + .eggGroup2 = EGG_GROUP_WATER_2, + .ability1 = ABILITY_POISON_POINT, + .ability2 = ABILITY_SWIFT_SWIM, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_SCIZOR] = + { + .baseHP = 70, + .baseAttack = 130, + .baseDefense = 100, + .baseSpeed = 65, + .baseSpAttack = 55, + .baseSpDefense = 80, + .type1 = TYPE_BUG, + .type2 = TYPE_STEEL, + .catchRate = 25, + .expYield = 200, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 25, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_SWARM, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_SHUCKLE] = + { + .baseHP = 20, + .baseAttack = 10, + .baseDefense = 230, + .baseSpeed = 5, + .baseSpAttack = 10, + .baseSpDefense = 230, + .type1 = TYPE_BUG, + .type2 = TYPE_ROCK, + .catchRate = 190, + .expYield = 80, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 1, + .item1 = ITEM_ORAN_BERRY, + .item2 = ITEM_ORAN_BERRY, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_STURDY, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_HERACROSS] = + { + .baseHP = 80, + .baseAttack = 125, + .baseDefense = 75, + .baseSpeed = 85, + .baseSpAttack = 40, + .baseSpDefense = 95, + .type1 = TYPE_BUG, + .type2 = TYPE_FIGHTING, + .catchRate = 45, + .expYield = 200, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 25, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_SWARM, + .ability2 = ABILITY_GUTS, + .safariZoneFleeRate = 8, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_SNEASEL] = + { + .baseHP = 55, + .baseAttack = 95, + .baseDefense = 55, + .baseSpeed = 115, + .baseSpAttack = 35, + .baseSpDefense = 75, + .type1 = TYPE_DARK, + .type2 = TYPE_ICE, + .catchRate = 60, + .expYield = 132, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_QUICK_CLAW, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 35, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_INNER_FOCUS, + .ability2 = ABILITY_KEEN_EYE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = TRUE, + }, + + [SPECIES_TEDDIURSA] = + { + .baseHP = 60, + .baseAttack = 80, + .baseDefense = 50, + .baseSpeed = 40, + .baseSpAttack = 50, + .baseSpDefense = 50, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 120, + .expYield = 124, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_PICKUP, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = TRUE, + }, + + [SPECIES_URSARING] = + { + .baseHP = 90, + .baseAttack = 130, + .baseDefense = 75, + .baseSpeed = 55, + .baseSpAttack = 75, + .baseSpDefense = 75, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 60, + .expYield = 189, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_GUTS, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_SLUGMA] = + { + .baseHP = 40, + .baseAttack = 40, + .baseDefense = 40, + .baseSpeed = 20, + .baseSpAttack = 70, + .baseSpDefense = 40, + .type1 = TYPE_FIRE, + .type2 = TYPE_FIRE, + .catchRate = 190, + .expYield = 78, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_AMORPHOUS, + .eggGroup2 = EGG_GROUP_AMORPHOUS, + .ability1 = ABILITY_MAGMA_ARMOR, + .ability2 = ABILITY_FLAME_BODY, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_MAGCARGO] = + { + .baseHP = 50, + .baseAttack = 50, + .baseDefense = 120, + .baseSpeed = 30, + .baseSpAttack = 80, + .baseSpDefense = 80, + .type1 = TYPE_FIRE, + .type2 = TYPE_ROCK, + .catchRate = 75, + .expYield = 154, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 2, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_AMORPHOUS, + .eggGroup2 = EGG_GROUP_AMORPHOUS, + .ability1 = ABILITY_MAGMA_ARMOR, + .ability2 = ABILITY_FLAME_BODY, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_SWINUB] = + { + .baseHP = 50, + .baseAttack = 50, + .baseDefense = 40, + .baseSpeed = 50, + .baseSpAttack = 30, + .baseSpDefense = 30, + .type1 = TYPE_ICE, + .type2 = TYPE_GROUND, + .catchRate = 225, + .expYield = 78, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_OBLIVIOUS, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_PILOSWINE] = + { + .baseHP = 100, + .baseAttack = 100, + .baseDefense = 80, + .baseSpeed = 50, + .baseSpAttack = 60, + .baseSpDefense = 60, + .type1 = TYPE_ICE, + .type2 = TYPE_GROUND, + .catchRate = 75, + .expYield = 160, + .evYield_HP = 1, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_OBLIVIOUS, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_CORSOLA] = + { + .baseHP = 55, + .baseAttack = 55, + .baseDefense = 85, + .baseSpeed = 35, + .baseSpAttack = 65, + .baseSpDefense = 85, + .type1 = TYPE_WATER, + .type2 = TYPE_ROCK, + .catchRate = 60, + .expYield = 113, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 1, + .item1 = ITEM_NONE, + .item2 = ITEM_RED_SHARD, + .genderRatio = PERCENT_FEMALE(75), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_WATER_3, + .ability1 = ABILITY_HUSTLE, + .ability2 = ABILITY_NATURAL_CURE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PINK, + .noFlip = FALSE, + }, + + [SPECIES_REMORAID] = + { + .baseHP = 35, + .baseAttack = 65, + .baseDefense = 35, + .baseSpeed = 65, + .baseSpAttack = 65, + .baseSpDefense = 35, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 190, + .expYield = 78, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_WATER_2, + .ability1 = ABILITY_HUSTLE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_OCTILLERY] = + { + .baseHP = 75, + .baseAttack = 105, + .baseDefense = 75, + .baseSpeed = 45, + .baseSpAttack = 105, + .baseSpDefense = 75, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 75, + .expYield = 164, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_WATER_2, + .ability1 = ABILITY_SUCTION_CUPS, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_DELIBIRD] = + { + .baseHP = 45, + .baseAttack = 55, + .baseDefense = 45, + .baseSpeed = 75, + .baseSpAttack = 65, + .baseSpDefense = 45, + .type1 = TYPE_ICE, + .type2 = TYPE_FLYING, + .catchRate = 45, + .expYield = 183, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_VITAL_SPIRIT, + .ability2 = ABILITY_HUSTLE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_MANTINE] = + { + .baseHP = 65, + .baseAttack = 40, + .baseDefense = 70, + .baseSpeed = 70, + .baseSpAttack = 80, + .baseSpDefense = 140, + .type1 = TYPE_WATER, + .type2 = TYPE_FLYING, + .catchRate = 25, + .expYield = 168, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 25, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_WATER_1, + .ability1 = ABILITY_SWIFT_SWIM, + .ability2 = ABILITY_WATER_ABSORB, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_SKARMORY] = + { + .baseHP = 65, + .baseAttack = 80, + .baseDefense = 140, + .baseSpeed = 70, + .baseSpAttack = 40, + .baseSpDefense = 70, + .type1 = TYPE_STEEL, + .type2 = TYPE_FLYING, + .catchRate = 25, + .expYield = 168, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 2, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 25, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_FLYING, + .eggGroup2 = EGG_GROUP_FLYING, + .ability1 = ABILITY_KEEN_EYE, + .ability2 = ABILITY_STURDY, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_HOUNDOUR] = + { + .baseHP = 45, + .baseAttack = 60, + .baseDefense = 30, + .baseSpeed = 65, + .baseSpAttack = 80, + .baseSpDefense = 50, + .type1 = TYPE_DARK, + .type2 = TYPE_FIRE, + .catchRate = 120, + .expYield = 114, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_EARLY_BIRD, + .ability2 = ABILITY_FLASH_FIRE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_HOUNDOOM] = + { + .baseHP = 75, + .baseAttack = 90, + .baseDefense = 50, + .baseSpeed = 95, + .baseSpAttack = 110, + .baseSpDefense = 80, + .type1 = TYPE_DARK, + .type2 = TYPE_FIRE, + .catchRate = 45, + .expYield = 204, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 2, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_EARLY_BIRD, + .ability2 = ABILITY_FLASH_FIRE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_KINGDRA] = + { + .baseHP = 75, + .baseAttack = 95, + .baseDefense = 95, + .baseSpeed = 85, + .baseSpAttack = 95, + .baseSpDefense = 95, + .type1 = TYPE_WATER, + .type2 = TYPE_DRAGON, + .catchRate = 45, + .expYield = 207, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 1, + .item1 = ITEM_NONE, + .item2 = ITEM_DRAGON_SCALE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_DRAGON, + .ability1 = ABILITY_SWIFT_SWIM, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_PHANPY] = + { + .baseHP = 90, + .baseAttack = 60, + .baseDefense = 60, + .baseSpeed = 40, + .baseSpAttack = 40, + .baseSpDefense = 40, + .type1 = TYPE_GROUND, + .type2 = TYPE_GROUND, + .catchRate = 120, + .expYield = 124, + .evYield_HP = 1, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_PICKUP, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 10, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_DONPHAN] = + { + .baseHP = 90, + .baseAttack = 120, + .baseDefense = 120, + .baseSpeed = 50, + .baseSpAttack = 60, + .baseSpDefense = 60, + .type1 = TYPE_GROUND, + .type2 = TYPE_GROUND, + .catchRate = 60, + .expYield = 189, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_STURDY, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_PORYGON2] = + { + .baseHP = 85, + .baseAttack = 80, + .baseDefense = 90, + .baseSpeed = 60, + .baseSpAttack = 105, + .baseSpDefense = 95, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 45, + .expYield = 180, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 2, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_MINERAL, + .eggGroup2 = EGG_GROUP_MINERAL, + .ability1 = ABILITY_TRACE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_STANTLER] = + { + .baseHP = 73, + .baseAttack = 95, + .baseDefense = 62, + .baseSpeed = 85, + .baseSpAttack = 85, + .baseSpDefense = 65, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 45, + .expYield = 165, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_INTIMIDATE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_SMEARGLE] = + { + .baseHP = 55, + .baseAttack = 20, + .baseDefense = 35, + .baseSpeed = 75, + .baseSpAttack = 20, + .baseSpDefense = 45, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 45, + .expYield = 106, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_OWN_TEMPO, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_WHITE, + .noFlip = FALSE, + }, + + [SPECIES_TYROGUE] = + { + .baseHP = 35, + .baseAttack = 35, + .baseDefense = 35, + .baseSpeed = 35, + .baseSpAttack = 35, + .baseSpDefense = 35, + .type1 = TYPE_FIGHTING, + .type2 = TYPE_FIGHTING, + .catchRate = 75, + .expYield = 91, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_MALE, + .eggCycles = 25, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_GUTS, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_HITMONTOP] = + { + .baseHP = 50, + .baseAttack = 95, + .baseDefense = 95, + .baseSpeed = 70, + .baseSpAttack = 35, + .baseSpDefense = 110, + .type1 = TYPE_FIGHTING, + .type2 = TYPE_FIGHTING, + .catchRate = 45, + .expYield = 138, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_MALE, + .eggCycles = 25, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_HUMAN_LIKE, + .eggGroup2 = EGG_GROUP_HUMAN_LIKE, + .ability1 = ABILITY_INTIMIDATE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_SMOOCHUM] = + { + .baseHP = 45, + .baseAttack = 30, + .baseDefense = 15, + .baseSpeed = 65, + .baseSpAttack = 85, + .baseSpDefense = 65, + .type1 = TYPE_ICE, + .type2 = TYPE_PSYCHIC, + .catchRate = 45, + .expYield = 87, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_ASPEAR_BERRY, + .item2 = ITEM_ASPEAR_BERRY, + .genderRatio = MON_FEMALE, + .eggCycles = 25, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_OBLIVIOUS, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PINK, + .noFlip = FALSE, + }, + + [SPECIES_ELEKID] = + { + .baseHP = 45, + .baseAttack = 63, + .baseDefense = 37, + .baseSpeed = 95, + .baseSpAttack = 65, + .baseSpDefense = 55, + .type1 = TYPE_ELECTRIC, + .type2 = TYPE_ELECTRIC, + .catchRate = 45, + .expYield = 106, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(25), + .eggCycles = 25, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_STATIC, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = TRUE, + }, + + [SPECIES_MAGBY] = + { + .baseHP = 45, + .baseAttack = 75, + .baseDefense = 37, + .baseSpeed = 83, + .baseSpAttack = 70, + .baseSpDefense = 55, + .type1 = TYPE_FIRE, + .type2 = TYPE_FIRE, + .catchRate = 45, + .expYield = 117, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_RAWST_BERRY, + .item2 = ITEM_RAWST_BERRY, + .genderRatio = PERCENT_FEMALE(25), + .eggCycles = 25, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_FLAME_BODY, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_MILTANK] = + { + .baseHP = 95, + .baseAttack = 80, + .baseDefense = 105, + .baseSpeed = 100, + .baseSpAttack = 40, + .baseSpDefense = 70, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 45, + .expYield = 200, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 2, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_MOOMOO_MILK, + .item2 = ITEM_MOOMOO_MILK, + .genderRatio = MON_FEMALE, + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_THICK_FAT, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PINK, + .noFlip = FALSE, + }, + + [SPECIES_BLISSEY] = + { + .baseHP = 255, + .baseAttack = 10, + .baseDefense = 10, + .baseSpeed = 55, + .baseSpAttack = 75, + .baseSpDefense = 135, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 30, + .expYield = 255, + .evYield_HP = 2, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_LUCKY_EGG, + .genderRatio = MON_FEMALE, + .eggCycles = 40, + .friendship = 140, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_FAIRY, + .eggGroup2 = EGG_GROUP_FAIRY, + .ability1 = ABILITY_NATURAL_CURE, + .ability2 = ABILITY_SERENE_GRACE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PINK, + .noFlip = FALSE, + }, + + [SPECIES_RAIKOU] = + { + .baseHP = 90, + .baseAttack = 85, + .baseDefense = 75, + .baseSpeed = 115, + .baseSpAttack = 115, + .baseSpDefense = 100, + .type1 = TYPE_ELECTRIC, + .type2 = TYPE_ELECTRIC, + .catchRate = 3, + .expYield = 216, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 2, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 80, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_PRESSURE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_ENTEI] = + { + .baseHP = 115, + .baseAttack = 115, + .baseDefense = 85, + .baseSpeed = 100, + .baseSpAttack = 90, + .baseSpDefense = 75, + .type1 = TYPE_FIRE, + .type2 = TYPE_FIRE, + .catchRate = 3, + .expYield = 217, + .evYield_HP = 1, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 80, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_PRESSURE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_SUICUNE] = + { + .baseHP = 100, + .baseAttack = 75, + .baseDefense = 115, + .baseSpeed = 85, + .baseSpAttack = 90, + .baseSpDefense = 115, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 3, + .expYield = 215, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 80, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_PRESSURE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_LARVITAR] = + { + .baseHP = 50, + .baseAttack = 64, + .baseDefense = 50, + .baseSpeed = 41, + .baseSpAttack = 45, + .baseSpDefense = 50, + .type1 = TYPE_ROCK, + .type2 = TYPE_GROUND, + .catchRate = 45, + .expYield = 67, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 40, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_MONSTER, + .ability1 = ABILITY_GUTS, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_PUPITAR] = + { + .baseHP = 70, + .baseAttack = 84, + .baseDefense = 70, + .baseSpeed = 51, + .baseSpAttack = 65, + .baseSpDefense = 70, + .type1 = TYPE_ROCK, + .type2 = TYPE_GROUND, + .catchRate = 45, + .expYield = 144, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 40, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_MONSTER, + .ability1 = ABILITY_SHED_SKIN, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_TYRANITAR] = + { + .baseHP = 100, + .baseAttack = 134, + .baseDefense = 110, + .baseSpeed = 61, + .baseSpAttack = 95, + .baseSpDefense = 100, + .type1 = TYPE_ROCK, + .type2 = TYPE_DARK, + .catchRate = 45, + .expYield = 218, + .evYield_HP = 0, + .evYield_Attack = 3, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 40, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_MONSTER, + .ability1 = ABILITY_SAND_STREAM, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_LUGIA] = + { + .baseHP = 106, + .baseAttack = 90, + .baseDefense = 130, + .baseSpeed = 110, + .baseSpAttack = 90, + .baseSpDefense = 154, + .type1 = TYPE_PSYCHIC, + .type2 = TYPE_FLYING, + .catchRate = 3, + .expYield = 220, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 3, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_PRESSURE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_WHITE, + .noFlip = FALSE, + }, + + [SPECIES_HO_OH] = + { + .baseHP = 106, + .baseAttack = 130, + .baseDefense = 90, + .baseSpeed = 90, + .baseSpAttack = 110, + .baseSpDefense = 154, + .type1 = TYPE_FIRE, + .type2 = TYPE_FLYING, + .catchRate = 3, + .expYield = 220, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 3, + .item1 = ITEM_SACRED_ASH, + .item2 = ITEM_SACRED_ASH, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_PRESSURE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_CELEBI] = + { + .baseHP = 100, + .baseAttack = 100, + .baseDefense = 100, + .baseSpeed = 100, + .baseSpAttack = 100, + .baseSpDefense = 100, + .type1 = TYPE_PSYCHIC, + .type2 = TYPE_GRASS, + .catchRate = 45, + .expYield = 64, + .evYield_HP = 3, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_LUM_BERRY, + .item2 = ITEM_LUM_BERRY, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 100, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_NATURAL_CURE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_OLD_UNOWN_B] = + { + .baseHP = 50, + .baseAttack = 150, + .baseDefense = 50, + .baseSpeed = 150, + .baseSpAttack = 150, + .baseSpDefense = 50, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 3, + .expYield = 1, + .evYield_HP = 2, + .evYield_Attack = 2, + .evYield_Defense = 2, + .evYield_Speed = 2, + .evYield_SpAttack = 2, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_NONE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_OLD_UNOWN_C] = + { + .baseHP = 50, + .baseAttack = 150, + .baseDefense = 50, + .baseSpeed = 150, + .baseSpAttack = 150, + .baseSpDefense = 50, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 3, + .expYield = 1, + .evYield_HP = 2, + .evYield_Attack = 2, + .evYield_Defense = 2, + .evYield_Speed = 2, + .evYield_SpAttack = 2, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_NONE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_OLD_UNOWN_D] = + { + .baseHP = 50, + .baseAttack = 150, + .baseDefense = 50, + .baseSpeed = 150, + .baseSpAttack = 150, + .baseSpDefense = 50, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 3, + .expYield = 1, + .evYield_HP = 2, + .evYield_Attack = 2, + .evYield_Defense = 2, + .evYield_Speed = 2, + .evYield_SpAttack = 2, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_NONE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_OLD_UNOWN_E] = + { + .baseHP = 50, + .baseAttack = 150, + .baseDefense = 50, + .baseSpeed = 150, + .baseSpAttack = 150, + .baseSpDefense = 50, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 3, + .expYield = 1, + .evYield_HP = 2, + .evYield_Attack = 2, + .evYield_Defense = 2, + .evYield_Speed = 2, + .evYield_SpAttack = 2, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_NONE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_OLD_UNOWN_F] = + { + .baseHP = 50, + .baseAttack = 150, + .baseDefense = 50, + .baseSpeed = 150, + .baseSpAttack = 150, + .baseSpDefense = 50, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 3, + .expYield = 1, + .evYield_HP = 2, + .evYield_Attack = 2, + .evYield_Defense = 2, + .evYield_Speed = 2, + .evYield_SpAttack = 2, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_NONE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_OLD_UNOWN_G] = + { + .baseHP = 50, + .baseAttack = 150, + .baseDefense = 50, + .baseSpeed = 150, + .baseSpAttack = 150, + .baseSpDefense = 50, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 3, + .expYield = 1, + .evYield_HP = 2, + .evYield_Attack = 2, + .evYield_Defense = 2, + .evYield_Speed = 2, + .evYield_SpAttack = 2, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_NONE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_OLD_UNOWN_H] = + { + .baseHP = 50, + .baseAttack = 150, + .baseDefense = 50, + .baseSpeed = 150, + .baseSpAttack = 150, + .baseSpDefense = 50, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 3, + .expYield = 1, + .evYield_HP = 2, + .evYield_Attack = 2, + .evYield_Defense = 2, + .evYield_Speed = 2, + .evYield_SpAttack = 2, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_NONE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_OLD_UNOWN_I] = + { + .baseHP = 50, + .baseAttack = 150, + .baseDefense = 50, + .baseSpeed = 150, + .baseSpAttack = 150, + .baseSpDefense = 50, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 3, + .expYield = 1, + .evYield_HP = 2, + .evYield_Attack = 2, + .evYield_Defense = 2, + .evYield_Speed = 2, + .evYield_SpAttack = 2, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_NONE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_OLD_UNOWN_J] = + { + .baseHP = 50, + .baseAttack = 150, + .baseDefense = 50, + .baseSpeed = 150, + .baseSpAttack = 150, + .baseSpDefense = 50, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 3, + .expYield = 1, + .evYield_HP = 2, + .evYield_Attack = 2, + .evYield_Defense = 2, + .evYield_Speed = 2, + .evYield_SpAttack = 2, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_NONE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_OLD_UNOWN_K] = + { + .baseHP = 50, + .baseAttack = 150, + .baseDefense = 50, + .baseSpeed = 150, + .baseSpAttack = 150, + .baseSpDefense = 50, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 3, + .expYield = 1, + .evYield_HP = 2, + .evYield_Attack = 2, + .evYield_Defense = 2, + .evYield_Speed = 2, + .evYield_SpAttack = 2, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_NONE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_OLD_UNOWN_L] = + { + .baseHP = 50, + .baseAttack = 150, + .baseDefense = 50, + .baseSpeed = 150, + .baseSpAttack = 150, + .baseSpDefense = 50, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 3, + .expYield = 1, + .evYield_HP = 2, + .evYield_Attack = 2, + .evYield_Defense = 2, + .evYield_Speed = 2, + .evYield_SpAttack = 2, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_NONE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_OLD_UNOWN_M] = + { + .baseHP = 50, + .baseAttack = 150, + .baseDefense = 50, + .baseSpeed = 150, + .baseSpAttack = 150, + .baseSpDefense = 50, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 3, + .expYield = 1, + .evYield_HP = 2, + .evYield_Attack = 2, + .evYield_Defense = 2, + .evYield_Speed = 2, + .evYield_SpAttack = 2, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_NONE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_OLD_UNOWN_N] = + { + .baseHP = 50, + .baseAttack = 150, + .baseDefense = 50, + .baseSpeed = 150, + .baseSpAttack = 150, + .baseSpDefense = 50, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 3, + .expYield = 1, + .evYield_HP = 2, + .evYield_Attack = 2, + .evYield_Defense = 2, + .evYield_Speed = 2, + .evYield_SpAttack = 2, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_NONE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_OLD_UNOWN_O] = + { + .baseHP = 50, + .baseAttack = 150, + .baseDefense = 50, + .baseSpeed = 150, + .baseSpAttack = 150, + .baseSpDefense = 50, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 3, + .expYield = 1, + .evYield_HP = 2, + .evYield_Attack = 2, + .evYield_Defense = 2, + .evYield_Speed = 2, + .evYield_SpAttack = 2, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_NONE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_OLD_UNOWN_P] = + { + .baseHP = 50, + .baseAttack = 150, + .baseDefense = 50, + .baseSpeed = 150, + .baseSpAttack = 150, + .baseSpDefense = 50, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 3, + .expYield = 1, + .evYield_HP = 2, + .evYield_Attack = 2, + .evYield_Defense = 2, + .evYield_Speed = 2, + .evYield_SpAttack = 2, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_NONE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_OLD_UNOWN_Q] = + { + .baseHP = 50, + .baseAttack = 150, + .baseDefense = 50, + .baseSpeed = 150, + .baseSpAttack = 150, + .baseSpDefense = 50, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 3, + .expYield = 1, + .evYield_HP = 2, + .evYield_Attack = 2, + .evYield_Defense = 2, + .evYield_Speed = 2, + .evYield_SpAttack = 2, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_NONE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_OLD_UNOWN_R] = + { + .baseHP = 50, + .baseAttack = 150, + .baseDefense = 50, + .baseSpeed = 150, + .baseSpAttack = 150, + .baseSpDefense = 50, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 3, + .expYield = 1, + .evYield_HP = 2, + .evYield_Attack = 2, + .evYield_Defense = 2, + .evYield_Speed = 2, + .evYield_SpAttack = 2, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_NONE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_OLD_UNOWN_S] = + { + .baseHP = 50, + .baseAttack = 150, + .baseDefense = 50, + .baseSpeed = 150, + .baseSpAttack = 150, + .baseSpDefense = 50, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 3, + .expYield = 1, + .evYield_HP = 2, + .evYield_Attack = 2, + .evYield_Defense = 2, + .evYield_Speed = 2, + .evYield_SpAttack = 2, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_NONE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_OLD_UNOWN_T] = + { + .baseHP = 50, + .baseAttack = 150, + .baseDefense = 50, + .baseSpeed = 150, + .baseSpAttack = 150, + .baseSpDefense = 50, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 3, + .expYield = 1, + .evYield_HP = 2, + .evYield_Attack = 2, + .evYield_Defense = 2, + .evYield_Speed = 2, + .evYield_SpAttack = 2, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_NONE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_OLD_UNOWN_U] = + { + .baseHP = 50, + .baseAttack = 150, + .baseDefense = 50, + .baseSpeed = 150, + .baseSpAttack = 150, + .baseSpDefense = 50, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 3, + .expYield = 1, + .evYield_HP = 2, + .evYield_Attack = 2, + .evYield_Defense = 2, + .evYield_Speed = 2, + .evYield_SpAttack = 2, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_NONE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_OLD_UNOWN_V] = + { + .baseHP = 50, + .baseAttack = 150, + .baseDefense = 50, + .baseSpeed = 150, + .baseSpAttack = 150, + .baseSpDefense = 50, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 3, + .expYield = 1, + .evYield_HP = 2, + .evYield_Attack = 2, + .evYield_Defense = 2, + .evYield_Speed = 2, + .evYield_SpAttack = 2, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_NONE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_OLD_UNOWN_W] = + { + .baseHP = 50, + .baseAttack = 150, + .baseDefense = 50, + .baseSpeed = 150, + .baseSpAttack = 150, + .baseSpDefense = 50, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 3, + .expYield = 1, + .evYield_HP = 2, + .evYield_Attack = 2, + .evYield_Defense = 2, + .evYield_Speed = 2, + .evYield_SpAttack = 2, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_NONE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_OLD_UNOWN_X] = + { + .baseHP = 50, + .baseAttack = 150, + .baseDefense = 50, + .baseSpeed = 150, + .baseSpAttack = 150, + .baseSpDefense = 50, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 3, + .expYield = 1, + .evYield_HP = 2, + .evYield_Attack = 2, + .evYield_Defense = 2, + .evYield_Speed = 2, + .evYield_SpAttack = 2, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_NONE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_OLD_UNOWN_Y] = + { + .baseHP = 50, + .baseAttack = 150, + .baseDefense = 50, + .baseSpeed = 150, + .baseSpAttack = 150, + .baseSpDefense = 50, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 3, + .expYield = 1, + .evYield_HP = 2, + .evYield_Attack = 2, + .evYield_Defense = 2, + .evYield_Speed = 2, + .evYield_SpAttack = 2, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_NONE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_OLD_UNOWN_Z] = + { + .baseHP = 50, + .baseAttack = 150, + .baseDefense = 50, + .baseSpeed = 150, + .baseSpAttack = 150, + .baseSpDefense = 50, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 3, + .expYield = 1, + .evYield_HP = 2, + .evYield_Attack = 2, + .evYield_Defense = 2, + .evYield_Speed = 2, + .evYield_SpAttack = 2, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_NONE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_TREECKO] = + { + .baseHP = 40, + .baseAttack = 45, + .baseDefense = 35, + .baseSpeed = 70, + .baseSpAttack = 65, + .baseSpDefense = 55, + .type1 = TYPE_GRASS, + .type2 = TYPE_GRASS, + .catchRate = 45, + .expYield = 65, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_DRAGON, + .ability1 = ABILITY_OVERGROW, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_GROVYLE] = + { + .baseHP = 50, + .baseAttack = 65, + .baseDefense = 45, + .baseSpeed = 95, + .baseSpAttack = 85, + .baseSpDefense = 65, + .type1 = TYPE_GRASS, + .type2 = TYPE_GRASS, + .catchRate = 45, + .expYield = 141, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 2, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_DRAGON, + .ability1 = ABILITY_OVERGROW, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_SCEPTILE] = + { + .baseHP = 70, + .baseAttack = 85, + .baseDefense = 65, + .baseSpeed = 120, + .baseSpAttack = 105, + .baseSpDefense = 85, + .type1 = TYPE_GRASS, + .type2 = TYPE_GRASS, + .catchRate = 45, + .expYield = 208, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 3, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_DRAGON, + .ability1 = ABILITY_OVERGROW, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_TORCHIC] = + { + .baseHP = 45, + .baseAttack = 60, + .baseDefense = 40, + .baseSpeed = 45, + .baseSpAttack = 70, + .baseSpDefense = 50, + .type1 = TYPE_FIRE, + .type2 = TYPE_FIRE, + .catchRate = 45, + .expYield = 65, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_BLAZE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_COMBUSKEN] = + { + .baseHP = 60, + .baseAttack = 85, + .baseDefense = 60, + .baseSpeed = 55, + .baseSpAttack = 85, + .baseSpDefense = 60, + .type1 = TYPE_FIRE, + .type2 = TYPE_FIGHTING, + .catchRate = 45, + .expYield = 142, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_BLAZE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_BLAZIKEN] = + { + .baseHP = 80, + .baseAttack = 120, + .baseDefense = 70, + .baseSpeed = 80, + .baseSpAttack = 110, + .baseSpDefense = 70, + .type1 = TYPE_FIRE, + .type2 = TYPE_FIGHTING, + .catchRate = 45, + .expYield = 209, + .evYield_HP = 0, + .evYield_Attack = 3, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_BLAZE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_MUDKIP] = + { + .baseHP = 50, + .baseAttack = 70, + .baseDefense = 50, + .baseSpeed = 40, + .baseSpAttack = 50, + .baseSpDefense = 50, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 45, + .expYield = 65, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_WATER_1, + .ability1 = ABILITY_TORRENT, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_MARSHTOMP] = + { + .baseHP = 70, + .baseAttack = 85, + .baseDefense = 70, + .baseSpeed = 50, + .baseSpAttack = 60, + .baseSpDefense = 70, + .type1 = TYPE_WATER, + .type2 = TYPE_GROUND, + .catchRate = 45, + .expYield = 143, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_WATER_1, + .ability1 = ABILITY_TORRENT, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_SWAMPERT] = + { + .baseHP = 100, + .baseAttack = 110, + .baseDefense = 90, + .baseSpeed = 60, + .baseSpAttack = 85, + .baseSpDefense = 90, + .type1 = TYPE_WATER, + .type2 = TYPE_GROUND, + .catchRate = 45, + .expYield = 210, + .evYield_HP = 0, + .evYield_Attack = 3, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_WATER_1, + .ability1 = ABILITY_TORRENT, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_POOCHYENA] = + { + .baseHP = 35, + .baseAttack = 55, + .baseDefense = 35, + .baseSpeed = 35, + .baseSpAttack = 30, + .baseSpDefense = 30, + .type1 = TYPE_DARK, + .type2 = TYPE_DARK, + .catchRate = 255, + .expYield = 55, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_PECHA_BERRY, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_RUN_AWAY, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_MIGHTYENA] = + { + .baseHP = 70, + .baseAttack = 90, + .baseDefense = 70, + .baseSpeed = 70, + .baseSpAttack = 60, + .baseSpDefense = 60, + .type1 = TYPE_DARK, + .type2 = TYPE_DARK, + .catchRate = 127, + .expYield = 128, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_PECHA_BERRY, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_INTIMIDATE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_ZIGZAGOON] = + { + .baseHP = 38, + .baseAttack = 30, + .baseDefense = 41, + .baseSpeed = 60, + .baseSpAttack = 30, + .baseSpDefense = 41, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 255, + .expYield = 60, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_ORAN_BERRY, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_PICKUP, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_LINOONE] = + { + .baseHP = 78, + .baseAttack = 70, + .baseDefense = 61, + .baseSpeed = 100, + .baseSpAttack = 50, + .baseSpDefense = 61, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 90, + .expYield = 128, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 2, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_ORAN_BERRY, + .item2 = ITEM_SITRUS_BERRY, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_PICKUP, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_WHITE, + .noFlip = FALSE, + }, + + [SPECIES_WURMPLE] = + { + .baseHP = 45, + .baseAttack = 45, + .baseDefense = 35, + .baseSpeed = 20, + .baseSpAttack = 20, + .baseSpDefense = 30, + .type1 = TYPE_BUG, + .type2 = TYPE_BUG, + .catchRate = 255, + .expYield = 54, + .evYield_HP = 1, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_SHIELD_DUST, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_SILCOON] = + { + .baseHP = 50, + .baseAttack = 35, + .baseDefense = 55, + .baseSpeed = 15, + .baseSpAttack = 25, + .baseSpDefense = 25, + .type1 = TYPE_BUG, + .type2 = TYPE_BUG, + .catchRate = 120, + .expYield = 71, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 2, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_SHED_SKIN, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_WHITE, + .noFlip = FALSE, + }, + + [SPECIES_BEAUTIFLY] = + { + .baseHP = 60, + .baseAttack = 70, + .baseDefense = 50, + .baseSpeed = 65, + .baseSpAttack = 90, + .baseSpDefense = 50, + .type1 = TYPE_BUG, + .type2 = TYPE_FLYING, + .catchRate = 45, + .expYield = 161, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 3, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_SILVER_POWDER, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_SWARM, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_CASCOON] = + { + .baseHP = 50, + .baseAttack = 35, + .baseDefense = 55, + .baseSpeed = 15, + .baseSpAttack = 25, + .baseSpDefense = 25, + .type1 = TYPE_BUG, + .type2 = TYPE_BUG, + .catchRate = 120, + .expYield = 72, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 2, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_SHED_SKIN, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_DUSTOX] = + { + .baseHP = 60, + .baseAttack = 50, + .baseDefense = 70, + .baseSpeed = 65, + .baseSpAttack = 50, + .baseSpDefense = 90, + .type1 = TYPE_BUG, + .type2 = TYPE_POISON, + .catchRate = 45, + .expYield = 160, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 3, + .item1 = ITEM_NONE, + .item2 = ITEM_SILVER_POWDER, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_SHIELD_DUST, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_LOTAD] = + { + .baseHP = 40, + .baseAttack = 30, + .baseDefense = 30, + .baseSpeed = 30, + .baseSpAttack = 40, + .baseSpDefense = 50, + .type1 = TYPE_WATER, + .type2 = TYPE_GRASS, + .catchRate = 255, + .expYield = 74, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 1, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_SWIFT_SWIM, + .ability2 = ABILITY_RAIN_DISH, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_LOMBRE] = + { + .baseHP = 60, + .baseAttack = 50, + .baseDefense = 50, + .baseSpeed = 50, + .baseSpAttack = 60, + .baseSpDefense = 70, + .type1 = TYPE_WATER, + .type2 = TYPE_GRASS, + .catchRate = 120, + .expYield = 141, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_SWIFT_SWIM, + .ability2 = ABILITY_RAIN_DISH, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_LUDICOLO] = + { + .baseHP = 80, + .baseAttack = 70, + .baseDefense = 70, + .baseSpeed = 70, + .baseSpAttack = 90, + .baseSpDefense = 100, + .type1 = TYPE_WATER, + .type2 = TYPE_GRASS, + .catchRate = 45, + .expYield = 181, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 3, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_SWIFT_SWIM, + .ability2 = ABILITY_RAIN_DISH, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_SEEDOT] = + { + .baseHP = 40, + .baseAttack = 40, + .baseDefense = 50, + .baseSpeed = 30, + .baseSpAttack = 30, + .baseSpDefense = 30, + .type1 = TYPE_GRASS, + .type2 = TYPE_GRASS, + .catchRate = 255, + .expYield = 74, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_CHLOROPHYLL, + .ability2 = ABILITY_EARLY_BIRD, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_NUZLEAF] = + { + .baseHP = 70, + .baseAttack = 70, + .baseDefense = 40, + .baseSpeed = 60, + .baseSpAttack = 60, + .baseSpDefense = 40, + .type1 = TYPE_GRASS, + .type2 = TYPE_DARK, + .catchRate = 120, + .expYield = 141, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_CHLOROPHYLL, + .ability2 = ABILITY_EARLY_BIRD, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_SHIFTRY] = + { + .baseHP = 90, + .baseAttack = 100, + .baseDefense = 60, + .baseSpeed = 80, + .baseSpAttack = 90, + .baseSpDefense = 60, + .type1 = TYPE_GRASS, + .type2 = TYPE_DARK, + .catchRate = 45, + .expYield = 181, + .evYield_HP = 0, + .evYield_Attack = 3, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_CHLOROPHYLL, + .ability2 = ABILITY_EARLY_BIRD, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_NINCADA] = + { + .baseHP = 31, + .baseAttack = 45, + .baseDefense = 90, + .baseSpeed = 40, + .baseSpAttack = 30, + .baseSpDefense = 30, + .type1 = TYPE_BUG, + .type2 = TYPE_GROUND, + .catchRate = 255, + .expYield = 65, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_ERRATIC, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_COMPOUND_EYES, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_NINJASK] = + { + .baseHP = 61, + .baseAttack = 90, + .baseDefense = 45, + .baseSpeed = 160, + .baseSpAttack = 50, + .baseSpDefense = 50, + .type1 = TYPE_BUG, + .type2 = TYPE_FLYING, + .catchRate = 120, + .expYield = 155, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 2, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_ERRATIC, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_SPEED_BOOST, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_SHEDINJA] = + { + .baseHP = 1, + .baseAttack = 90, + .baseDefense = 45, + .baseSpeed = 40, + .baseSpAttack = 30, + .baseSpDefense = 30, + .type1 = TYPE_BUG, + .type2 = TYPE_GHOST, + .catchRate = 45, + .expYield = 95, + .evYield_HP = 2, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_ERRATIC, + .eggGroup1 = EGG_GROUP_MINERAL, + .eggGroup2 = EGG_GROUP_MINERAL, + .ability1 = ABILITY_WONDER_GUARD, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_TAILLOW] = + { + .baseHP = 40, + .baseAttack = 55, + .baseDefense = 30, + .baseSpeed = 85, + .baseSpAttack = 30, + .baseSpDefense = 30, + .type1 = TYPE_NORMAL, + .type2 = TYPE_FLYING, + .catchRate = 200, + .expYield = 59, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_FLYING, + .eggGroup2 = EGG_GROUP_FLYING, + .ability1 = ABILITY_GUTS, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_SWELLOW] = + { + .baseHP = 60, + .baseAttack = 85, + .baseDefense = 60, + .baseSpeed = 125, + .baseSpAttack = 50, + .baseSpDefense = 50, + .type1 = TYPE_NORMAL, + .type2 = TYPE_FLYING, + .catchRate = 45, + .expYield = 162, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 2, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_FLYING, + .eggGroup2 = EGG_GROUP_FLYING, + .ability1 = ABILITY_GUTS, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_SHROOMISH] = + { + .baseHP = 60, + .baseAttack = 40, + .baseDefense = 60, + .baseSpeed = 35, + .baseSpAttack = 40, + .baseSpDefense = 60, + .type1 = TYPE_GRASS, + .type2 = TYPE_GRASS, + .catchRate = 255, + .expYield = 65, + .evYield_HP = 1, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_FLUCTUATING, + .eggGroup1 = EGG_GROUP_FAIRY, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_EFFECT_SPORE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_BRELOOM] = + { + .baseHP = 60, + .baseAttack = 130, + .baseDefense = 80, + .baseSpeed = 70, + .baseSpAttack = 60, + .baseSpDefense = 60, + .type1 = TYPE_GRASS, + .type2 = TYPE_FIGHTING, + .catchRate = 90, + .expYield = 165, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_FLUCTUATING, + .eggGroup1 = EGG_GROUP_FAIRY, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_EFFECT_SPORE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_SPINDA] = + { + .baseHP = 60, + .baseAttack = 60, + .baseDefense = 60, + .baseSpeed = 60, + .baseSpAttack = 60, + .baseSpDefense = 60, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 255, + .expYield = 85, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_CHESTO_BERRY, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_HUMAN_LIKE, + .ability1 = ABILITY_OWN_TEMPO, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = TRUE, + }, + + [SPECIES_WINGULL] = + { + .baseHP = 40, + .baseAttack = 30, + .baseDefense = 30, + .baseSpeed = 85, + .baseSpAttack = 55, + .baseSpDefense = 30, + .type1 = TYPE_WATER, + .type2 = TYPE_FLYING, + .catchRate = 190, + .expYield = 64, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_FLYING, + .ability1 = ABILITY_KEEN_EYE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_WHITE, + .noFlip = FALSE, + }, + + [SPECIES_PELIPPER] = + { + .baseHP = 60, + .baseAttack = 50, + .baseDefense = 100, + .baseSpeed = 65, + .baseSpAttack = 85, + .baseSpDefense = 70, + .type1 = TYPE_WATER, + .type2 = TYPE_FLYING, + .catchRate = 45, + .expYield = 164, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 2, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_FLYING, + .ability1 = ABILITY_KEEN_EYE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_SURSKIT] = + { + .baseHP = 40, + .baseAttack = 30, + .baseDefense = 32, + .baseSpeed = 65, + .baseSpAttack = 50, + .baseSpDefense = 52, + .type1 = TYPE_BUG, + .type2 = TYPE_WATER, + .catchRate = 200, + .expYield = 63, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_SWIFT_SWIM, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_MASQUERAIN] = + { + .baseHP = 70, + .baseAttack = 60, + .baseDefense = 62, + .baseSpeed = 60, + .baseSpAttack = 80, + .baseSpDefense = 82, + .type1 = TYPE_BUG, + .type2 = TYPE_FLYING, + .catchRate = 75, + .expYield = 128, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 1, + .item1 = ITEM_NONE, + .item2 = ITEM_SILVER_POWDER, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_INTIMIDATE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_WAILMER] = + { + .baseHP = 130, + .baseAttack = 70, + .baseDefense = 35, + .baseSpeed = 60, + .baseSpAttack = 70, + .baseSpDefense = 35, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 125, + .expYield = 137, + .evYield_HP = 1, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 40, + .friendship = 70, + .growthRate = GROWTH_FLUCTUATING, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_WATER_2, + .ability1 = ABILITY_WATER_VEIL, + .ability2 = ABILITY_OBLIVIOUS, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_WAILORD] = + { + .baseHP = 170, + .baseAttack = 90, + .baseDefense = 45, + .baseSpeed = 60, + .baseSpAttack = 90, + .baseSpDefense = 45, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 60, + .expYield = 206, + .evYield_HP = 2, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 40, + .friendship = 70, + .growthRate = GROWTH_FLUCTUATING, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_WATER_2, + .ability1 = ABILITY_WATER_VEIL, + .ability2 = ABILITY_OBLIVIOUS, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_SKITTY] = + { + .baseHP = 50, + .baseAttack = 45, + .baseDefense = 45, + .baseSpeed = 50, + .baseSpAttack = 35, + .baseSpDefense = 35, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 255, + .expYield = 65, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_LEPPA_BERRY, + .genderRatio = PERCENT_FEMALE(75), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FAIRY, + .ability1 = ABILITY_CUTE_CHARM, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PINK, + .noFlip = FALSE, + }, + + [SPECIES_DELCATTY] = + { + .baseHP = 70, + .baseAttack = 65, + .baseDefense = 65, + .baseSpeed = 70, + .baseSpAttack = 55, + .baseSpDefense = 55, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 60, + .expYield = 138, + .evYield_HP = 1, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_LEPPA_BERRY, + .genderRatio = PERCENT_FEMALE(75), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FAIRY, + .ability1 = ABILITY_CUTE_CHARM, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_KECLEON] = + { + .baseHP = 60, + .baseAttack = 90, + .baseDefense = 70, + .baseSpeed = 40, + .baseSpAttack = 60, + .baseSpDefense = 120, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 200, + .expYield = 132, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 1, + .item1 = ITEM_NONE, + .item2 = ITEM_PERSIM_BERRY, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_COLOR_CHANGE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_BALTOY] = + { + .baseHP = 40, + .baseAttack = 40, + .baseDefense = 55, + .baseSpeed = 55, + .baseSpAttack = 40, + .baseSpDefense = 70, + .type1 = TYPE_GROUND, + .type2 = TYPE_PSYCHIC, + .catchRate = 255, + .expYield = 58, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 1, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_MINERAL, + .eggGroup2 = EGG_GROUP_MINERAL, + .ability1 = ABILITY_LEVITATE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_CLAYDOL] = + { + .baseHP = 60, + .baseAttack = 70, + .baseDefense = 105, + .baseSpeed = 75, + .baseSpAttack = 70, + .baseSpDefense = 120, + .type1 = TYPE_GROUND, + .type2 = TYPE_PSYCHIC, + .catchRate = 90, + .expYield = 189, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_MINERAL, + .eggGroup2 = EGG_GROUP_MINERAL, + .ability1 = ABILITY_LEVITATE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_NOSEPASS] = + { + .baseHP = 30, + .baseAttack = 45, + .baseDefense = 135, + .baseSpeed = 30, + .baseSpAttack = 45, + .baseSpDefense = 90, + .type1 = TYPE_ROCK, + .type2 = TYPE_ROCK, + .catchRate = 255, + .expYield = 108, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_MINERAL, + .eggGroup2 = EGG_GROUP_MINERAL, + .ability1 = ABILITY_STURDY, + .ability2 = ABILITY_MAGNET_PULL, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_TORKOAL] = + { + .baseHP = 70, + .baseAttack = 85, + .baseDefense = 140, + .baseSpeed = 20, + .baseSpAttack = 85, + .baseSpDefense = 70, + .type1 = TYPE_FIRE, + .type2 = TYPE_FIRE, + .catchRate = 90, + .expYield = 161, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 2, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_WHITE_SMOKE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_SABLEYE] = + { + .baseHP = 50, + .baseAttack = 75, + .baseDefense = 75, + .baseSpeed = 50, + .baseSpAttack = 65, + .baseSpDefense = 65, + .type1 = TYPE_DARK, + .type2 = TYPE_GHOST, + .catchRate = 45, + .expYield = 98, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 25, + .friendship = 35, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_HUMAN_LIKE, + .eggGroup2 = EGG_GROUP_HUMAN_LIKE, + .ability1 = ABILITY_KEEN_EYE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_BARBOACH] = + { + .baseHP = 50, + .baseAttack = 48, + .baseDefense = 43, + .baseSpeed = 60, + .baseSpAttack = 46, + .baseSpDefense = 41, + .type1 = TYPE_WATER, + .type2 = TYPE_GROUND, + .catchRate = 190, + .expYield = 92, + .evYield_HP = 1, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_WATER_2, + .eggGroup2 = EGG_GROUP_WATER_2, + .ability1 = ABILITY_OBLIVIOUS, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_WHISCASH] = + { + .baseHP = 110, + .baseAttack = 78, + .baseDefense = 73, + .baseSpeed = 60, + .baseSpAttack = 76, + .baseSpDefense = 71, + .type1 = TYPE_WATER, + .type2 = TYPE_GROUND, + .catchRate = 75, + .expYield = 158, + .evYield_HP = 2, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_WATER_2, + .eggGroup2 = EGG_GROUP_WATER_2, + .ability1 = ABILITY_OBLIVIOUS, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_LUVDISC] = + { + .baseHP = 43, + .baseAttack = 30, + .baseDefense = 55, + .baseSpeed = 97, + .baseSpAttack = 40, + .baseSpDefense = 65, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 225, + .expYield = 110, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_HEART_SCALE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(75), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_WATER_2, + .eggGroup2 = EGG_GROUP_WATER_2, + .ability1 = ABILITY_SWIFT_SWIM, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PINK, + .noFlip = FALSE, + }, + + [SPECIES_CORPHISH] = + { + .baseHP = 43, + .baseAttack = 80, + .baseDefense = 65, + .baseSpeed = 35, + .baseSpAttack = 50, + .baseSpDefense = 35, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 205, + .expYield = 111, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_FLUCTUATING, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_WATER_3, + .ability1 = ABILITY_HYPER_CUTTER, + .ability2 = ABILITY_SHELL_ARMOR, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_CRAWDAUNT] = + { + .baseHP = 63, + .baseAttack = 120, + .baseDefense = 85, + .baseSpeed = 55, + .baseSpAttack = 90, + .baseSpDefense = 55, + .type1 = TYPE_WATER, + .type2 = TYPE_DARK, + .catchRate = 155, + .expYield = 161, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_FLUCTUATING, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_WATER_3, + .ability1 = ABILITY_HYPER_CUTTER, + .ability2 = ABILITY_SHELL_ARMOR, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_FEEBAS] = + { + .baseHP = 20, + .baseAttack = 15, + .baseDefense = 20, + .baseSpeed = 80, + .baseSpAttack = 10, + .baseSpDefense = 55, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 255, + .expYield = 61, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_ERRATIC, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_DRAGON, + .ability1 = ABILITY_SWIFT_SWIM, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_MILOTIC] = + { + .baseHP = 95, + .baseAttack = 60, + .baseDefense = 79, + .baseSpeed = 81, + .baseSpAttack = 100, + .baseSpDefense = 125, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 60, + .expYield = 213, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_ERRATIC, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_DRAGON, + .ability1 = ABILITY_MARVEL_SCALE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PINK, + .noFlip = FALSE, + }, + + [SPECIES_CARVANHA] = + { + .baseHP = 45, + .baseAttack = 90, + .baseDefense = 20, + .baseSpeed = 65, + .baseSpAttack = 65, + .baseSpDefense = 20, + .type1 = TYPE_WATER, + .type2 = TYPE_DARK, + .catchRate = 225, + .expYield = 88, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_WATER_2, + .eggGroup2 = EGG_GROUP_WATER_2, + .ability1 = ABILITY_ROUGH_SKIN, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_SHARPEDO] = + { + .baseHP = 70, + .baseAttack = 120, + .baseDefense = 40, + .baseSpeed = 95, + .baseSpAttack = 95, + .baseSpDefense = 40, + .type1 = TYPE_WATER, + .type2 = TYPE_DARK, + .catchRate = 60, + .expYield = 175, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_WATER_2, + .eggGroup2 = EGG_GROUP_WATER_2, + .ability1 = ABILITY_ROUGH_SKIN, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_TRAPINCH] = + { + .baseHP = 45, + .baseAttack = 100, + .baseDefense = 45, + .baseSpeed = 10, + .baseSpAttack = 45, + .baseSpDefense = 45, + .type1 = TYPE_GROUND, + .type2 = TYPE_GROUND, + .catchRate = 255, + .expYield = 73, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_SOFT_SAND, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_HYPER_CUTTER, + .ability2 = ABILITY_ARENA_TRAP, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_VIBRAVA] = + { + .baseHP = 50, + .baseAttack = 70, + .baseDefense = 50, + .baseSpeed = 70, + .baseSpAttack = 50, + .baseSpDefense = 50, + .type1 = TYPE_GROUND, + .type2 = TYPE_DRAGON, + .catchRate = 120, + .expYield = 126, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_LEVITATE, + .ability2 = ABILITY_LEVITATE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_FLYGON] = + { + .baseHP = 80, + .baseAttack = 100, + .baseDefense = 80, + .baseSpeed = 100, + .baseSpAttack = 80, + .baseSpDefense = 80, + .type1 = TYPE_GROUND, + .type2 = TYPE_DRAGON, + .catchRate = 45, + .expYield = 197, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 2, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_BUG, + .ability1 = ABILITY_LEVITATE, + .ability2 = ABILITY_LEVITATE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_MAKUHITA] = + { + .baseHP = 72, + .baseAttack = 60, + .baseDefense = 30, + .baseSpeed = 25, + .baseSpAttack = 20, + .baseSpDefense = 30, + .type1 = TYPE_FIGHTING, + .type2 = TYPE_FIGHTING, + .catchRate = 180, + .expYield = 87, + .evYield_HP = 1, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(25), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_FLUCTUATING, + .eggGroup1 = EGG_GROUP_HUMAN_LIKE, + .eggGroup2 = EGG_GROUP_HUMAN_LIKE, + .ability1 = ABILITY_THICK_FAT, + .ability2 = ABILITY_GUTS, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_HARIYAMA] = + { + .baseHP = 144, + .baseAttack = 120, + .baseDefense = 60, + .baseSpeed = 50, + .baseSpAttack = 40, + .baseSpDefense = 60, + .type1 = TYPE_FIGHTING, + .type2 = TYPE_FIGHTING, + .catchRate = 200, + .expYield = 184, + .evYield_HP = 2, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_KINGS_ROCK, + .genderRatio = PERCENT_FEMALE(25), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_FLUCTUATING, + .eggGroup1 = EGG_GROUP_HUMAN_LIKE, + .eggGroup2 = EGG_GROUP_HUMAN_LIKE, + .ability1 = ABILITY_THICK_FAT, + .ability2 = ABILITY_GUTS, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_ELECTRIKE] = + { + .baseHP = 40, + .baseAttack = 45, + .baseDefense = 40, + .baseSpeed = 65, + .baseSpAttack = 65, + .baseSpDefense = 40, + .type1 = TYPE_ELECTRIC, + .type2 = TYPE_ELECTRIC, + .catchRate = 120, + .expYield = 104, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_STATIC, + .ability2 = ABILITY_LIGHTNING_ROD, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_MANECTRIC] = + { + .baseHP = 70, + .baseAttack = 75, + .baseDefense = 60, + .baseSpeed = 105, + .baseSpAttack = 105, + .baseSpDefense = 60, + .type1 = TYPE_ELECTRIC, + .type2 = TYPE_ELECTRIC, + .catchRate = 45, + .expYield = 168, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 2, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_STATIC, + .ability2 = ABILITY_LIGHTNING_ROD, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_NUMEL] = + { + .baseHP = 60, + .baseAttack = 60, + .baseDefense = 40, + .baseSpeed = 35, + .baseSpAttack = 65, + .baseSpDefense = 45, + .type1 = TYPE_FIRE, + .type2 = TYPE_GROUND, + .catchRate = 255, + .expYield = 88, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_RAWST_BERRY, + .item2 = ITEM_RAWST_BERRY, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_OBLIVIOUS, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_CAMERUPT] = + { + .baseHP = 70, + .baseAttack = 100, + .baseDefense = 70, + .baseSpeed = 40, + .baseSpAttack = 105, + .baseSpDefense = 75, + .type1 = TYPE_FIRE, + .type2 = TYPE_GROUND, + .catchRate = 150, + .expYield = 175, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_RAWST_BERRY, + .item2 = ITEM_RAWST_BERRY, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_MAGMA_ARMOR, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_SPHEAL] = + { + .baseHP = 70, + .baseAttack = 40, + .baseDefense = 50, + .baseSpeed = 25, + .baseSpAttack = 55, + .baseSpDefense = 50, + .type1 = TYPE_ICE, + .type2 = TYPE_WATER, + .catchRate = 255, + .expYield = 75, + .evYield_HP = 1, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_THICK_FAT, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_SEALEO] = + { + .baseHP = 90, + .baseAttack = 60, + .baseDefense = 70, + .baseSpeed = 45, + .baseSpAttack = 75, + .baseSpDefense = 70, + .type1 = TYPE_ICE, + .type2 = TYPE_WATER, + .catchRate = 120, + .expYield = 128, + .evYield_HP = 2, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_THICK_FAT, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_WALREIN] = + { + .baseHP = 110, + .baseAttack = 80, + .baseDefense = 90, + .baseSpeed = 65, + .baseSpAttack = 95, + .baseSpDefense = 90, + .type1 = TYPE_ICE, + .type2 = TYPE_WATER, + .catchRate = 45, + .expYield = 192, + .evYield_HP = 3, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_THICK_FAT, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_CACNEA] = + { + .baseHP = 50, + .baseAttack = 85, + .baseDefense = 40, + .baseSpeed = 35, + .baseSpAttack = 85, + .baseSpDefense = 40, + .type1 = TYPE_GRASS, + .type2 = TYPE_GRASS, + .catchRate = 190, + .expYield = 97, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_POISON_BARB, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 35, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_GRASS, + .eggGroup2 = EGG_GROUP_HUMAN_LIKE, + .ability1 = ABILITY_SAND_VEIL, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_CACTURNE] = + { + .baseHP = 70, + .baseAttack = 115, + .baseDefense = 60, + .baseSpeed = 55, + .baseSpAttack = 115, + .baseSpDefense = 60, + .type1 = TYPE_GRASS, + .type2 = TYPE_DARK, + .catchRate = 60, + .expYield = 177, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_POISON_BARB, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 35, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_GRASS, + .eggGroup2 = EGG_GROUP_HUMAN_LIKE, + .ability1 = ABILITY_SAND_VEIL, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_SNORUNT] = + { + .baseHP = 50, + .baseAttack = 50, + .baseDefense = 50, + .baseSpeed = 50, + .baseSpAttack = 50, + .baseSpDefense = 50, + .type1 = TYPE_ICE, + .type2 = TYPE_ICE, + .catchRate = 190, + .expYield = 74, + .evYield_HP = 1, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FAIRY, + .eggGroup2 = EGG_GROUP_MINERAL, + .ability1 = ABILITY_INNER_FOCUS, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_GLALIE] = + { + .baseHP = 80, + .baseAttack = 80, + .baseDefense = 80, + .baseSpeed = 80, + .baseSpAttack = 80, + .baseSpDefense = 80, + .type1 = TYPE_ICE, + .type2 = TYPE_ICE, + .catchRate = 75, + .expYield = 187, + .evYield_HP = 2, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NEVER_MELT_ICE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FAIRY, + .eggGroup2 = EGG_GROUP_MINERAL, + .ability1 = ABILITY_INNER_FOCUS, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_LUNATONE] = + { + .baseHP = 70, + .baseAttack = 55, + .baseDefense = 65, + .baseSpeed = 70, + .baseSpAttack = 95, + .baseSpDefense = 85, + .type1 = TYPE_ROCK, + .type2 = TYPE_PSYCHIC, + .catchRate = 45, + .expYield = 150, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 2, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_MOON_STONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 25, + .friendship = 70, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_MINERAL, + .eggGroup2 = EGG_GROUP_MINERAL, + .ability1 = ABILITY_LEVITATE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_SOLROCK] = + { + .baseHP = 70, + .baseAttack = 95, + .baseDefense = 85, + .baseSpeed = 70, + .baseSpAttack = 55, + .baseSpDefense = 65, + .type1 = TYPE_ROCK, + .type2 = TYPE_PSYCHIC, + .catchRate = 45, + .expYield = 150, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_SUN_STONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 25, + .friendship = 70, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_MINERAL, + .eggGroup2 = EGG_GROUP_MINERAL, + .ability1 = ABILITY_LEVITATE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_AZURILL] = + { + .baseHP = 50, + .baseAttack = 20, + .baseDefense = 40, + .baseSpeed = 20, + .baseSpAttack = 20, + .baseSpDefense = 40, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 150, + .expYield = 33, + .evYield_HP = 1, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(75), + .eggCycles = 10, + .friendship = 70, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_THICK_FAT, + .ability2 = ABILITY_HUGE_POWER, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_SPOINK] = + { + .baseHP = 60, + .baseAttack = 25, + .baseDefense = 35, + .baseSpeed = 60, + .baseSpAttack = 70, + .baseSpDefense = 80, + .type1 = TYPE_PSYCHIC, + .type2 = TYPE_PSYCHIC, + .catchRate = 255, + .expYield = 89, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 1, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_THICK_FAT, + .ability2 = ABILITY_OWN_TEMPO, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_GRUMPIG] = + { + .baseHP = 80, + .baseAttack = 45, + .baseDefense = 65, + .baseSpeed = 80, + .baseSpAttack = 90, + .baseSpDefense = 110, + .type1 = TYPE_PSYCHIC, + .type2 = TYPE_PSYCHIC, + .catchRate = 60, + .expYield = 164, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_THICK_FAT, + .ability2 = ABILITY_OWN_TEMPO, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_PLUSLE] = + { + .baseHP = 60, + .baseAttack = 50, + .baseDefense = 40, + .baseSpeed = 95, + .baseSpAttack = 85, + .baseSpDefense = 75, + .type1 = TYPE_ELECTRIC, + .type2 = TYPE_ELECTRIC, + .catchRate = 200, + .expYield = 120, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FAIRY, + .eggGroup2 = EGG_GROUP_FAIRY, + .ability1 = ABILITY_PLUS, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_MINUN] = + { + .baseHP = 60, + .baseAttack = 40, + .baseDefense = 50, + .baseSpeed = 95, + .baseSpAttack = 75, + .baseSpDefense = 85, + .type1 = TYPE_ELECTRIC, + .type2 = TYPE_ELECTRIC, + .catchRate = 200, + .expYield = 120, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FAIRY, + .eggGroup2 = EGG_GROUP_FAIRY, + .ability1 = ABILITY_MINUS, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_MAWILE] = + { + .baseHP = 50, + .baseAttack = 85, + .baseDefense = 85, + .baseSpeed = 50, + .baseSpAttack = 55, + .baseSpDefense = 55, + .type1 = TYPE_STEEL, + .type2 = TYPE_STEEL, + .catchRate = 45, + .expYield = 98, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FAIRY, + .ability1 = ABILITY_HYPER_CUTTER, + .ability2 = ABILITY_INTIMIDATE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_MEDITITE] = + { + .baseHP = 30, + .baseAttack = 40, + .baseDefense = 55, + .baseSpeed = 60, + .baseSpAttack = 40, + .baseSpDefense = 55, + .type1 = TYPE_FIGHTING, + .type2 = TYPE_PSYCHIC, + .catchRate = 180, + .expYield = 91, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_HUMAN_LIKE, + .eggGroup2 = EGG_GROUP_HUMAN_LIKE, + .ability1 = ABILITY_PURE_POWER, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_MEDICHAM] = + { + .baseHP = 60, + .baseAttack = 60, + .baseDefense = 75, + .baseSpeed = 80, + .baseSpAttack = 60, + .baseSpDefense = 75, + .type1 = TYPE_FIGHTING, + .type2 = TYPE_PSYCHIC, + .catchRate = 90, + .expYield = 153, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 2, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_HUMAN_LIKE, + .eggGroup2 = EGG_GROUP_HUMAN_LIKE, + .ability1 = ABILITY_PURE_POWER, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_SWABLU] = + { + .baseHP = 45, + .baseAttack = 40, + .baseDefense = 60, + .baseSpeed = 50, + .baseSpAttack = 40, + .baseSpDefense = 75, + .type1 = TYPE_NORMAL, + .type2 = TYPE_FLYING, + .catchRate = 255, + .expYield = 74, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 1, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_ERRATIC, + .eggGroup1 = EGG_GROUP_FLYING, + .eggGroup2 = EGG_GROUP_DRAGON, + .ability1 = ABILITY_NATURAL_CURE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_ALTARIA] = + { + .baseHP = 75, + .baseAttack = 70, + .baseDefense = 90, + .baseSpeed = 80, + .baseSpAttack = 70, + .baseSpDefense = 105, + .type1 = TYPE_DRAGON, + .type2 = TYPE_FLYING, + .catchRate = 45, + .expYield = 188, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_ERRATIC, + .eggGroup1 = EGG_GROUP_FLYING, + .eggGroup2 = EGG_GROUP_DRAGON, + .ability1 = ABILITY_NATURAL_CURE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_WYNAUT] = + { + .baseHP = 95, + .baseAttack = 23, + .baseDefense = 48, + .baseSpeed = 23, + .baseSpAttack = 23, + .baseSpDefense = 48, + .type1 = TYPE_PSYCHIC, + .type2 = TYPE_PSYCHIC, + .catchRate = 125, + .expYield = 44, + .evYield_HP = 1, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_SHADOW_TAG, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_DUSKULL] = + { + .baseHP = 20, + .baseAttack = 40, + .baseDefense = 90, + .baseSpeed = 25, + .baseSpAttack = 30, + .baseSpDefense = 90, + .type1 = TYPE_GHOST, + .type2 = TYPE_GHOST, + .catchRate = 190, + .expYield = 97, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 1, + .item1 = ITEM_NONE, + .item2 = ITEM_SPELL_TAG, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 25, + .friendship = 35, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_AMORPHOUS, + .eggGroup2 = EGG_GROUP_AMORPHOUS, + .ability1 = ABILITY_LEVITATE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_DUSCLOPS] = + { + .baseHP = 40, + .baseAttack = 70, + .baseDefense = 130, + .baseSpeed = 25, + .baseSpAttack = 60, + .baseSpDefense = 130, + .type1 = TYPE_GHOST, + .type2 = TYPE_GHOST, + .catchRate = 90, + .expYield = 179, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_SPELL_TAG, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 25, + .friendship = 35, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_AMORPHOUS, + .eggGroup2 = EGG_GROUP_AMORPHOUS, + .ability1 = ABILITY_PRESSURE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_ROSELIA] = + { + .baseHP = 50, + .baseAttack = 60, + .baseDefense = 45, + .baseSpeed = 65, + .baseSpAttack = 100, + .baseSpDefense = 80, + .type1 = TYPE_GRASS, + .type2 = TYPE_POISON, + .catchRate = 150, + .expYield = 152, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_POISON_BARB, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_FAIRY, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_NATURAL_CURE, + .ability2 = ABILITY_POISON_POINT, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = TRUE, + }, + + [SPECIES_SLAKOTH] = + { + .baseHP = 60, + .baseAttack = 60, + .baseDefense = 60, + .baseSpeed = 30, + .baseSpAttack = 35, + .baseSpDefense = 35, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 255, + .expYield = 83, + .evYield_HP = 1, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_TRUANT, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_VIGOROTH] = + { + .baseHP = 80, + .baseAttack = 80, + .baseDefense = 80, + .baseSpeed = 90, + .baseSpAttack = 55, + .baseSpDefense = 55, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 120, + .expYield = 126, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 2, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_VITAL_SPIRIT, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_WHITE, + .noFlip = FALSE, + }, + + [SPECIES_SLAKING] = + { + .baseHP = 150, + .baseAttack = 160, + .baseDefense = 100, + .baseSpeed = 100, + .baseSpAttack = 95, + .baseSpDefense = 65, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 45, + .expYield = 210, + .evYield_HP = 3, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_TRUANT, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_GULPIN] = + { + .baseHP = 70, + .baseAttack = 43, + .baseDefense = 53, + .baseSpeed = 40, + .baseSpAttack = 43, + .baseSpDefense = 53, + .type1 = TYPE_POISON, + .type2 = TYPE_POISON, + .catchRate = 225, + .expYield = 75, + .evYield_HP = 1, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_BIG_PEARL, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_FLUCTUATING, + .eggGroup1 = EGG_GROUP_AMORPHOUS, + .eggGroup2 = EGG_GROUP_AMORPHOUS, + .ability1 = ABILITY_LIQUID_OOZE, + .ability2 = ABILITY_STICKY_HOLD, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_SWALOT] = + { + .baseHP = 100, + .baseAttack = 73, + .baseDefense = 83, + .baseSpeed = 55, + .baseSpAttack = 73, + .baseSpDefense = 83, + .type1 = TYPE_POISON, + .type2 = TYPE_POISON, + .catchRate = 75, + .expYield = 168, + .evYield_HP = 2, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_BIG_PEARL, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_FLUCTUATING, + .eggGroup1 = EGG_GROUP_AMORPHOUS, + .eggGroup2 = EGG_GROUP_AMORPHOUS, + .ability1 = ABILITY_LIQUID_OOZE, + .ability2 = ABILITY_STICKY_HOLD, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_TROPIUS] = + { + .baseHP = 99, + .baseAttack = 68, + .baseDefense = 83, + .baseSpeed = 51, + .baseSpAttack = 72, + .baseSpDefense = 87, + .type1 = TYPE_GRASS, + .type2 = TYPE_FLYING, + .catchRate = 200, + .expYield = 169, + .evYield_HP = 2, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 25, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_GRASS, + .ability1 = ABILITY_CHLOROPHYLL, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_WHISMUR] = + { + .baseHP = 64, + .baseAttack = 51, + .baseDefense = 23, + .baseSpeed = 28, + .baseSpAttack = 51, + .baseSpDefense = 23, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 190, + .expYield = 68, + .evYield_HP = 1, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_CHESTO_BERRY, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_SOUNDPROOF, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PINK, + .noFlip = FALSE, + }, + + [SPECIES_LOUDRED] = + { + .baseHP = 84, + .baseAttack = 71, + .baseDefense = 43, + .baseSpeed = 48, + .baseSpAttack = 71, + .baseSpDefense = 43, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 120, + .expYield = 126, + .evYield_HP = 2, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_CHESTO_BERRY, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_SOUNDPROOF, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_EXPLOUD] = + { + .baseHP = 104, + .baseAttack = 91, + .baseDefense = 63, + .baseSpeed = 68, + .baseSpAttack = 91, + .baseSpDefense = 63, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 45, + .expYield = 184, + .evYield_HP = 3, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_CHESTO_BERRY, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_SOUNDPROOF, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_CLAMPERL] = + { + .baseHP = 35, + .baseAttack = 64, + .baseDefense = 85, + .baseSpeed = 32, + .baseSpAttack = 74, + .baseSpDefense = 55, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 255, + .expYield = 142, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_BLUE_SHARD, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_ERRATIC, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_WATER_1, + .ability1 = ABILITY_SHELL_ARMOR, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_HUNTAIL] = + { + .baseHP = 55, + .baseAttack = 104, + .baseDefense = 105, + .baseSpeed = 52, + .baseSpAttack = 94, + .baseSpDefense = 75, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 60, + .expYield = 178, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_ERRATIC, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_WATER_1, + .ability1 = ABILITY_SWIFT_SWIM, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_GOREBYSS] = + { + .baseHP = 55, + .baseAttack = 84, + .baseDefense = 105, + .baseSpeed = 52, + .baseSpAttack = 114, + .baseSpDefense = 75, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 60, + .expYield = 178, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 2, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_ERRATIC, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_WATER_1, + .ability1 = ABILITY_SWIFT_SWIM, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PINK, + .noFlip = FALSE, + }, + + [SPECIES_ABSOL] = + { + .baseHP = 65, + .baseAttack = 130, + .baseDefense = 60, + .baseSpeed = 75, + .baseSpAttack = 75, + .baseSpDefense = 60, + .type1 = TYPE_DARK, + .type2 = TYPE_DARK, + .catchRate = 30, + .expYield = 174, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 25, + .friendship = 35, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_PRESSURE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_WHITE, + .noFlip = TRUE, + }, + + [SPECIES_SHUPPET] = + { + .baseHP = 44, + .baseAttack = 75, + .baseDefense = 35, + .baseSpeed = 45, + .baseSpAttack = 63, + .baseSpDefense = 33, + .type1 = TYPE_GHOST, + .type2 = TYPE_GHOST, + .catchRate = 225, + .expYield = 97, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_SPELL_TAG, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 25, + .friendship = 35, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_AMORPHOUS, + .eggGroup2 = EGG_GROUP_AMORPHOUS, + .ability1 = ABILITY_INSOMNIA, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_BANETTE] = + { + .baseHP = 64, + .baseAttack = 115, + .baseDefense = 65, + .baseSpeed = 65, + .baseSpAttack = 83, + .baseSpDefense = 63, + .type1 = TYPE_GHOST, + .type2 = TYPE_GHOST, + .catchRate = 45, + .expYield = 179, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_SPELL_TAG, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 25, + .friendship = 35, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_AMORPHOUS, + .eggGroup2 = EGG_GROUP_AMORPHOUS, + .ability1 = ABILITY_INSOMNIA, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = FALSE, + }, + + [SPECIES_SEVIPER] = + { + .baseHP = 73, + .baseAttack = 100, + .baseDefense = 60, + .baseSpeed = 65, + .baseSpAttack = 100, + .baseSpDefense = 60, + .type1 = TYPE_POISON, + .type2 = TYPE_POISON, + .catchRate = 90, + .expYield = 165, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_FLUCTUATING, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_DRAGON, + .ability1 = ABILITY_SHED_SKIN, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = TRUE, + }, + + [SPECIES_ZANGOOSE] = + { + .baseHP = 73, + .baseAttack = 115, + .baseDefense = 60, + .baseSpeed = 90, + .baseSpAttack = 60, + .baseSpDefense = 60, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 90, + .expYield = 165, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 70, + .growthRate = GROWTH_ERRATIC, + .eggGroup1 = EGG_GROUP_FIELD, + .eggGroup2 = EGG_GROUP_FIELD, + .ability1 = ABILITY_IMMUNITY, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_WHITE, + .noFlip = TRUE, + }, + + [SPECIES_RELICANTH] = + { + .baseHP = 100, + .baseAttack = 90, + .baseDefense = 130, + .baseSpeed = 55, + .baseSpAttack = 45, + .baseSpDefense = 65, + .type1 = TYPE_WATER, + .type2 = TYPE_ROCK, + .catchRate = 25, + .expYield = 198, + .evYield_HP = 1, + .evYield_Attack = 0, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_GREEN_SHARD, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 40, + .friendship = 70, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_WATER_1, + .eggGroup2 = EGG_GROUP_WATER_2, + .ability1 = ABILITY_SWIFT_SWIM, + .ability2 = ABILITY_ROCK_HEAD, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_ARON] = + { + .baseHP = 50, + .baseAttack = 70, + .baseDefense = 100, + .baseSpeed = 30, + .baseSpAttack = 40, + .baseSpDefense = 40, + .type1 = TYPE_STEEL, + .type2 = TYPE_ROCK, + .catchRate = 180, + .expYield = 96, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_HARD_STONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 35, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_MONSTER, + .ability1 = ABILITY_STURDY, + .ability2 = ABILITY_ROCK_HEAD, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_LAIRON] = + { + .baseHP = 60, + .baseAttack = 90, + .baseDefense = 140, + .baseSpeed = 40, + .baseSpAttack = 50, + .baseSpDefense = 50, + .type1 = TYPE_STEEL, + .type2 = TYPE_ROCK, + .catchRate = 90, + .expYield = 152, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 2, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_HARD_STONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 35, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_MONSTER, + .ability1 = ABILITY_STURDY, + .ability2 = ABILITY_ROCK_HEAD, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_AGGRON] = + { + .baseHP = 70, + .baseAttack = 110, + .baseDefense = 180, + .baseSpeed = 50, + .baseSpAttack = 60, + .baseSpDefense = 60, + .type1 = TYPE_STEEL, + .type2 = TYPE_ROCK, + .catchRate = 45, + .expYield = 205, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 3, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_HARD_STONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 35, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_MONSTER, + .eggGroup2 = EGG_GROUP_MONSTER, + .ability1 = ABILITY_STURDY, + .ability2 = ABILITY_ROCK_HEAD, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_CASTFORM] = + { + .baseHP = 70, + .baseAttack = 70, + .baseDefense = 70, + .baseSpeed = 70, + .baseSpAttack = 70, + .baseSpDefense = 70, + .type1 = TYPE_NORMAL, + .type2 = TYPE_NORMAL, + .catchRate = 45, + .expYield = 145, + .evYield_HP = 1, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_MYSTIC_WATER, + .item2 = ITEM_MYSTIC_WATER, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 25, + .friendship = 70, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroup1 = EGG_GROUP_FAIRY, + .eggGroup2 = EGG_GROUP_AMORPHOUS, + .ability1 = ABILITY_FORECAST, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_WHITE, + .noFlip = FALSE, + }, + + [SPECIES_VOLBEAT] = + { + .baseHP = 65, + .baseAttack = 73, + .baseDefense = 55, + .baseSpeed = 85, + .baseSpAttack = 47, + .baseSpDefense = 75, + .type1 = TYPE_BUG, + .type2 = TYPE_BUG, + .catchRate = 150, + .expYield = 146, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_MALE, + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_ERRATIC, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_HUMAN_LIKE, + .ability1 = ABILITY_ILLUMINATE, + .ability2 = ABILITY_SWARM, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_ILLUMISE] = + { + .baseHP = 65, + .baseAttack = 47, + .baseDefense = 55, + .baseSpeed = 85, + .baseSpAttack = 73, + .baseSpDefense = 75, + .type1 = TYPE_BUG, + .type2 = TYPE_BUG, + .catchRate = 150, + .expYield = 146, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_FEMALE, + .eggCycles = 15, + .friendship = 70, + .growthRate = GROWTH_FLUCTUATING, + .eggGroup1 = EGG_GROUP_BUG, + .eggGroup2 = EGG_GROUP_HUMAN_LIKE, + .ability1 = ABILITY_OBLIVIOUS, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_LILEEP] = + { + .baseHP = 66, + .baseAttack = 41, + .baseDefense = 77, + .baseSpeed = 23, + .baseSpAttack = 61, + .baseSpDefense = 87, + .type1 = TYPE_ROCK, + .type2 = TYPE_GRASS, + .catchRate = 45, + .expYield = 121, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 1, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 30, + .friendship = 70, + .growthRate = GROWTH_ERRATIC, + .eggGroup1 = EGG_GROUP_WATER_3, + .eggGroup2 = EGG_GROUP_WATER_3, + .ability1 = ABILITY_SUCTION_CUPS, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_PURPLE, + .noFlip = FALSE, + }, + + [SPECIES_CRADILY] = + { + .baseHP = 86, + .baseAttack = 81, + .baseDefense = 97, + .baseSpeed = 43, + .baseSpAttack = 81, + .baseSpDefense = 107, + .type1 = TYPE_ROCK, + .type2 = TYPE_GRASS, + .catchRate = 45, + .expYield = 201, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 2, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 30, + .friendship = 70, + .growthRate = GROWTH_ERRATIC, + .eggGroup1 = EGG_GROUP_WATER_3, + .eggGroup2 = EGG_GROUP_WATER_3, + .ability1 = ABILITY_SUCTION_CUPS, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_ANORITH] = + { + .baseHP = 45, + .baseAttack = 95, + .baseDefense = 50, + .baseSpeed = 75, + .baseSpAttack = 40, + .baseSpDefense = 50, + .type1 = TYPE_ROCK, + .type2 = TYPE_BUG, + .catchRate = 45, + .expYield = 119, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 30, + .friendship = 70, + .growthRate = GROWTH_ERRATIC, + .eggGroup1 = EGG_GROUP_WATER_3, + .eggGroup2 = EGG_GROUP_WATER_3, + .ability1 = ABILITY_BATTLE_ARMOR, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_ARMALDO] = + { + .baseHP = 75, + .baseAttack = 125, + .baseDefense = 100, + .baseSpeed = 45, + .baseSpAttack = 70, + .baseSpDefense = 80, + .type1 = TYPE_ROCK, + .type2 = TYPE_BUG, + .catchRate = 45, + .expYield = 200, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 30, + .friendship = 70, + .growthRate = GROWTH_ERRATIC, + .eggGroup1 = EGG_GROUP_WATER_3, + .eggGroup2 = EGG_GROUP_WATER_3, + .ability1 = ABILITY_BATTLE_ARMOR, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_RALTS] = + { + .baseHP = 28, + .baseAttack = 25, + .baseDefense = 25, + .baseSpeed = 40, + .baseSpAttack = 45, + .baseSpDefense = 35, + .type1 = TYPE_PSYCHIC, + .type2 = TYPE_PSYCHIC, + .catchRate = 235, + .expYield = 70, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_AMORPHOUS, + .eggGroup2 = EGG_GROUP_AMORPHOUS, + .ability1 = ABILITY_SYNCHRONIZE, + .ability2 = ABILITY_TRACE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_WHITE, + .noFlip = FALSE, + }, + + [SPECIES_KIRLIA] = + { + .baseHP = 38, + .baseAttack = 35, + .baseDefense = 35, + .baseSpeed = 50, + .baseSpAttack = 65, + .baseSpDefense = 55, + .type1 = TYPE_PSYCHIC, + .type2 = TYPE_PSYCHIC, + .catchRate = 120, + .expYield = 140, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 2, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_AMORPHOUS, + .eggGroup2 = EGG_GROUP_AMORPHOUS, + .ability1 = ABILITY_SYNCHRONIZE, + .ability2 = ABILITY_TRACE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_WHITE, + .noFlip = FALSE, + }, + + [SPECIES_GARDEVOIR] = + { + .baseHP = 68, + .baseAttack = 65, + .baseDefense = 65, + .baseSpeed = 80, + .baseSpAttack = 125, + .baseSpDefense = 115, + .type1 = TYPE_PSYCHIC, + .type2 = TYPE_PSYCHIC, + .catchRate = 45, + .expYield = 208, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 3, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_AMORPHOUS, + .eggGroup2 = EGG_GROUP_AMORPHOUS, + .ability1 = ABILITY_SYNCHRONIZE, + .ability2 = ABILITY_TRACE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_WHITE, + .noFlip = FALSE, + }, + + [SPECIES_BAGON] = + { + .baseHP = 45, + .baseAttack = 75, + .baseDefense = 60, + .baseSpeed = 50, + .baseSpAttack = 40, + .baseSpDefense = 30, + .type1 = TYPE_DRAGON, + .type2 = TYPE_DRAGON, + .catchRate = 45, + .expYield = 89, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_DRAGON_SCALE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 40, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_DRAGON, + .eggGroup2 = EGG_GROUP_DRAGON, + .ability1 = ABILITY_ROCK_HEAD, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_SHELGON] = + { + .baseHP = 65, + .baseAttack = 95, + .baseDefense = 100, + .baseSpeed = 50, + .baseSpAttack = 60, + .baseSpDefense = 50, + .type1 = TYPE_DRAGON, + .type2 = TYPE_DRAGON, + .catchRate = 45, + .expYield = 144, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 2, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_DRAGON_SCALE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 40, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_DRAGON, + .eggGroup2 = EGG_GROUP_DRAGON, + .ability1 = ABILITY_ROCK_HEAD, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_WHITE, + .noFlip = FALSE, + }, + + [SPECIES_SALAMENCE] = + { + .baseHP = 95, + .baseAttack = 135, + .baseDefense = 80, + .baseSpeed = 100, + .baseSpAttack = 110, + .baseSpDefense = 80, + .type1 = TYPE_DRAGON, + .type2 = TYPE_FLYING, + .catchRate = 45, + .expYield = 218, + .evYield_HP = 0, + .evYield_Attack = 3, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_DRAGON_SCALE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 40, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_DRAGON, + .eggGroup2 = EGG_GROUP_DRAGON, + .ability1 = ABILITY_INTIMIDATE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_BELDUM] = + { + .baseHP = 40, + .baseAttack = 55, + .baseDefense = 80, + .baseSpeed = 30, + .baseSpAttack = 35, + .baseSpDefense = 60, + .type1 = TYPE_STEEL, + .type2 = TYPE_PSYCHIC, + .catchRate = 3, + .expYield = 103, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 1, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_METAL_COAT, + .genderRatio = MON_GENDERLESS, + .eggCycles = 40, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_MINERAL, + .eggGroup2 = EGG_GROUP_MINERAL, + .ability1 = ABILITY_CLEAR_BODY, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_METANG] = + { + .baseHP = 60, + .baseAttack = 75, + .baseDefense = 100, + .baseSpeed = 50, + .baseSpAttack = 55, + .baseSpDefense = 80, + .type1 = TYPE_STEEL, + .type2 = TYPE_PSYCHIC, + .catchRate = 3, + .expYield = 153, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 2, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_METAL_COAT, + .genderRatio = MON_GENDERLESS, + .eggCycles = 40, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_MINERAL, + .eggGroup2 = EGG_GROUP_MINERAL, + .ability1 = ABILITY_CLEAR_BODY, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_METAGROSS] = + { + .baseHP = 80, + .baseAttack = 135, + .baseDefense = 130, + .baseSpeed = 70, + .baseSpAttack = 95, + .baseSpDefense = 90, + .type1 = TYPE_STEEL, + .type2 = TYPE_PSYCHIC, + .catchRate = 3, + .expYield = 210, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 3, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_METAL_COAT, + .genderRatio = MON_GENDERLESS, + .eggCycles = 40, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_MINERAL, + .eggGroup2 = EGG_GROUP_MINERAL, + .ability1 = ABILITY_CLEAR_BODY, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_REGIROCK] = + { + .baseHP = 80, + .baseAttack = 100, + .baseDefense = 200, + .baseSpeed = 50, + .baseSpAttack = 50, + .baseSpDefense = 100, + .type1 = TYPE_ROCK, + .type2 = TYPE_ROCK, + .catchRate = 3, + .expYield = 217, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 3, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 80, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_CLEAR_BODY, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = FALSE, + }, + + [SPECIES_REGICE] = + { + .baseHP = 80, + .baseAttack = 50, + .baseDefense = 100, + .baseSpeed = 50, + .baseSpAttack = 100, + .baseSpDefense = 200, + .type1 = TYPE_ICE, + .type2 = TYPE_ICE, + .catchRate = 3, + .expYield = 216, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 3, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 80, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_CLEAR_BODY, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_REGISTEEL] = + { + .baseHP = 80, + .baseAttack = 75, + .baseDefense = 150, + .baseSpeed = 50, + .baseSpAttack = 75, + .baseSpDefense = 150, + .type1 = TYPE_STEEL, + .type2 = TYPE_STEEL, + .catchRate = 3, + .expYield = 215, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 2, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 1, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 80, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_CLEAR_BODY, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = FALSE, + }, + + [SPECIES_KYOGRE] = + { + .baseHP = 100, + .baseAttack = 100, + .baseDefense = 90, + .baseSpeed = 90, + .baseSpAttack = 150, + .baseSpDefense = 140, + .type1 = TYPE_WATER, + .type2 = TYPE_WATER, + .catchRate = 5, + .expYield = 218, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 3, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_DRIZZLE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_GROUDON] = + { + .baseHP = 100, + .baseAttack = 150, + .baseDefense = 140, + .baseSpeed = 90, + .baseSpAttack = 100, + .baseSpDefense = 90, + .type1 = TYPE_GROUND, + .type2 = TYPE_GROUND, + .catchRate = 5, + .expYield = 218, + .evYield_HP = 0, + .evYield_Attack = 3, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_DROUGHT, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_RAYQUAZA] = + { + .baseHP = 105, + .baseAttack = 150, + .baseDefense = 90, + .baseSpeed = 95, + .baseSpAttack = 150, + .baseSpDefense = 90, + .type1 = TYPE_DRAGON, + .type2 = TYPE_FLYING, + .catchRate = 3, + .expYield = 220, + .evYield_HP = 0, + .evYield_Attack = 2, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_AIR_LOCK, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_GREEN, + .noFlip = FALSE, + }, + + [SPECIES_LATIAS] = + { + .baseHP = 80, + .baseAttack = 80, + .baseDefense = 90, + .baseSpeed = 110, + .baseSpAttack = 110, + .baseSpDefense = 130, + .type1 = TYPE_DRAGON, + .type2 = TYPE_PSYCHIC, + .catchRate = 3, + .expYield = 211, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 3, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_FEMALE, + .eggCycles = 120, + .friendship = 90, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_LEVITATE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = FALSE, + }, + + [SPECIES_LATIOS] = + { + .baseHP = 80, + .baseAttack = 90, + .baseDefense = 80, + .baseSpeed = 110, + .baseSpAttack = 130, + .baseSpDefense = 110, + .type1 = TYPE_DRAGON, + .type2 = TYPE_PSYCHIC, + .catchRate = 3, + .expYield = 211, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 3, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_MALE, + .eggCycles = 120, + .friendship = 90, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_LEVITATE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, + }, + + [SPECIES_JIRACHI] = + { + .baseHP = 100, + .baseAttack = 100, + .baseDefense = 100, + .baseSpeed = 100, + .baseSpAttack = 100, + .baseSpDefense = 100, + .type1 = TYPE_STEEL, + .type2 = TYPE_PSYCHIC, + .catchRate = 3, + .expYield = 215, + .evYield_HP = 3, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 0, + .evYield_SpDefense = 0, + .item1 = ITEM_STAR_PIECE, + .item2 = ITEM_STAR_PIECE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 100, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_SERENE_GRACE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_YELLOW, + .noFlip = FALSE, + }, + + [SPECIES_DEOXYS] = + { + .baseHP = 50, + .baseAttack = 150, + .baseDefense = 50, + .baseSpeed = 150, + .baseSpAttack = 150, + .baseSpDefense = 50, + .type1 = TYPE_PSYCHIC, + .type2 = TYPE_PSYCHIC, + .catchRate = 3, + .expYield = 215, + .evYield_HP = 0, + .evYield_Attack = 1, + .evYield_Defense = 0, + .evYield_Speed = 1, + .evYield_SpAttack = 1, + .evYield_SpDefense = 0, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_SLOW, + .eggGroup1 = EGG_GROUP_UNDISCOVERED, + .eggGroup2 = EGG_GROUP_UNDISCOVERED, + .ability1 = ABILITY_PRESSURE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_RED, + .noFlip = TRUE, + }, + + [SPECIES_CHIMECHO] = + { + .baseHP = 65, + .baseAttack = 50, + .baseDefense = 70, + .baseSpeed = 65, + .baseSpAttack = 95, + .baseSpDefense = 80, + .type1 = TYPE_PSYCHIC, + .type2 = TYPE_PSYCHIC, + .catchRate = 45, + .expYield = 147, + .evYield_HP = 0, + .evYield_Attack = 0, + .evYield_Defense = 0, + .evYield_Speed = 0, + .evYield_SpAttack = 1, + .evYield_SpDefense = 1, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 25, + .friendship = 70, + .growthRate = GROWTH_FAST, + .eggGroup1 = EGG_GROUP_AMORPHOUS, + .eggGroup2 = EGG_GROUP_AMORPHOUS, + .ability1 = ABILITY_LEVITATE, + .ability2 = ABILITY_NONE, + .safariZoneFleeRate = 0, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = FALSE, } }; -#endif //POKERUBY_BASE_STATS_H +#endif //GUARD_BASE_STATS_H diff --git a/src/data/pokemon/dex_order.h b/src/data/pokemon/dex_order.h deleted file mode 100644 index cbb7182ed..000000000 --- a/src/data/pokemon/dex_order.h +++ /dev/null @@ -1,15 +0,0 @@ -// - -// - -#ifndef POKERUBY_DEX_ORDER_H -#define POKERUBY_DEX_ORDER_H - -const u16 gSpeciesToHoennPokedexNum[] = {203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 156, 157, 112, 113, 227, 228, 229, 230, 231, 232, 233, 234, 153, 154, 138, 139, 63, 64, 88, 89, 90, 235, 236, 237, 238, 239, 240, 241, 242, 158, 159, 243, 244, 245, 246, 247, 248, 249, 39, 40, 41, 73, 74, 75, 250, 251, 252, 66, 67, 57, 58, 59, 253, 254, 255, 256, 82, 83, 257, 92, 93, 258, 259, 106, 107, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 84, 85, 270, 271, 272, 273, 274, 275, 276, 108, 109, 169, 170, 277, 278, 279, 184, 185, 50, 51, 143, 144, 280, 281, 282, 283, 284, 167, 285, 52, 53, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 65, 181, 182, 155, 324, 137, 325, 326, 162, 163, 327, 328, 329, 91, 55, 56, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 161, 164, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 168, 357, 358, 359, 103, 104, 360, 361, 180, 362, 363, 364, 365, 115, 366, 367, 186, 165, 166, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 42, 43, 44, 25, 26, 34, 35, 114, 27, 28, 32, 33, 99, 100, 61, 62, 145, 131, 132, 60, 105, 68, 127, 128, 183, 129, 130, 140, 141, 97, 98, 116, 117, 118, 48, 49, 78, 79, 101, 102, 173, 174, 175, 119, 120, 171, 172, 125, 126, 54, 110, 111, 80, 81, 69, 76, 77, 121, 122, 160, 148, 149, 94, 36, 37, 38, 95, 96, 150, 45, 46, 47, 176, 177, 178, 152, 146, 147, 124, 123, 179, 70, 71, 72, 142, 86, 87, 133, 134, 135, 136, 29, 30, 31, 187, 188, 189, 190, 191, 192, 193, 194, 195, 198, 199, 200, 196, 197, 201, 202, 151 -}; - -const u16 gSpeciesToNationalPokedexNum[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 290, 291, 292, 276, 277, 285, 286, 327, 278, 279, 283, 284, 320, 321, 300, 301, 352, 343, 344, 299, 324, 302, 339, 340, 370, 341, 342, 349, 350, 318, 319, 328, 329, 330, 296, 297, 309, 310, 322, 323, 363, 364, 365, 331, 332, 361, 362, 337, 338, 298, 325, 326, 311, 312, 303, 307, 308, 333, 334, 360, 355, 356, 315, 287, 288, 289, 316, 317, 357, 293, 294, 295, 366, 367, 368, 359, 353, 354, 336, 335, 369, 304, 305, 306, 351, 313, 314, 345, 346, 347, 348, 280, 281, 282, 371, 372, 373, 374, 375, 376, 377, 378, 379, 382, 383, 384, 380, 381, 385, 386, 358}; - -const u16 gHoennToNationalOrder[] = {252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 63, 64, 65, 290, 291, 292, 293, 294, 295, 296, 297, 118, 119, 129, 130, 298, 183, 184, 74, 75, 76, 299, 300, 301, 41, 42, 169, 72, 73, 302, 303, 304, 305, 306, 66, 67, 68, 307, 308, 309, 310, 311, 312, 81, 82, 100, 101, 313, 314, 43, 44, 45, 182, 84, 85, 315, 316, 317, 318, 319, 320, 321, 322, 323, 218, 219, 324, 88, 89, 109, 110, 325, 326, 27, 28, 327, 227, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 174, 39, 40, 349, 350, 351, 120, 121, 352, 353, 354, 355, 356, 357, 358, 359, 37, 38, 172, 25, 26, 54, 55, 360, 202, 177, 178, 203, 231, 232, 127, 214, 111, 112, 361, 362, 363, 364, 365, 366, 367, 368, 369, 222, 170, 171, 370, 116, 117, 230, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 29, 30, 31, 32, 33, 34, 35, 36, 46, 47, 48, 49, 50, 51, 52, 53, 56, 57, 58, 59, 60, 61, 62, 69, 70, 71, 77, 78, 79, 80, 83, 86, 87, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 102, 103, 104, 105, 106, 107, 108, 113, 114, 115, 122, 123, 124, 125, 126, 128, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 173, 175, 176, 179, 180, 181, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, 220, 221, 223, 224, 225, 226, 228, 229, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411}; - -#endif //POKERUBY_DEX_ORDER_H diff --git a/src/data/pokemon/evolution.h b/src/data/pokemon/evolution.h index 919416fee..b88e42cd2 100644 --- a/src/data/pokemon/evolution.h +++ b/src/data/pokemon/evolution.h @@ -1,608 +1,192 @@ -// - -// - #ifndef POKERUBY_EVOLUTION_H #define POKERUBY_EVOLUTION_H -const struct EvolutionData gEvolutionTable[] = { - {{ // ?????????? - }}, {{ // Bulbasaur - {EVO_LEVEL, 16, SPECIES_IVYSAUR}, - }}, {{ // Ivysaur - {EVO_LEVEL, 32, SPECIES_VENUSAUR}, - }}, {{ // Venusaur - }}, {{ // Charmander - {EVO_LEVEL, 16, SPECIES_CHARMELEON}, - }}, {{ // Charmeleon - {EVO_LEVEL, 36, SPECIES_CHARIZARD}, - }}, {{ // Charizard - }}, {{ // Squirtle - {EVO_LEVEL, 16, SPECIES_WARTORTLE}, - }}, {{ // Wartortle - {EVO_LEVEL, 36, SPECIES_BLASTOISE}, - }}, {{ // Blastoise - }}, {{ // Caterpie - {EVO_LEVEL, 7, SPECIES_METAPOD}, - }}, {{ // Metapod - {EVO_LEVEL, 10, SPECIES_BUTTERFREE}, - }}, {{ // Butterfree - }}, {{ // Weedle - {EVO_LEVEL, 7, SPECIES_KAKUNA}, - }}, {{ // Kakuna - {EVO_LEVEL, 10, SPECIES_BEEDRILL}, - }}, {{ // Beedrill - }}, {{ // Pidgey - {EVO_LEVEL, 18, SPECIES_PIDGEOTTO}, - }}, {{ // Pidgeotto - {EVO_LEVEL, 36, SPECIES_PIDGEOT}, - }}, {{ // Pidgeot - }}, {{ // Rattata - {EVO_LEVEL, 20, SPECIES_RATICATE}, - }}, {{ // Raticate - }}, {{ // Spearow - {EVO_LEVEL, 20, SPECIES_FEAROW}, - }}, {{ // Fearow - }}, {{ // Ekans - {EVO_LEVEL, 22, SPECIES_ARBOK}, - }}, {{ // Arbok - }}, {{ // Pikachu - {EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_RAICHU}, - }}, {{ // Raichu - }}, {{ // Sandshrew - {EVO_LEVEL, 22, SPECIES_SANDSLASH}, - }}, {{ // Sandslash - }}, {{ // Nidoran♀ - {EVO_LEVEL, 16, SPECIES_NIDORINA}, - }}, {{ // Nidorina - {EVO_ITEM, ITEM_MOON_STONE, SPECIES_NIDOQUEEN}, - }}, {{ // Nidoqueen - }}, {{ // Nidoran♂ - {EVO_LEVEL, 16, SPECIES_NIDORINO}, - }}, {{ // Nidorino - {EVO_ITEM, ITEM_MOON_STONE, SPECIES_NIDOKING}, - }}, {{ // Nidoking - }}, {{ // Clefairy - {EVO_ITEM, ITEM_MOON_STONE, SPECIES_CLEFABLE}, - }}, {{ // Clefable - }}, {{ // Vulpix - {EVO_ITEM, ITEM_FIRE_STONE, SPECIES_NINETALES}, - }}, {{ // Ninetales - }}, {{ // Jigglypuff - {EVO_ITEM, ITEM_MOON_STONE, SPECIES_WIGGLYTUFF}, - }}, {{ // Wigglytuff - }}, {{ // Zubat - {EVO_LEVEL, 22, SPECIES_GOLBAT}, - }}, {{ // Golbat - {EVO_FRIENDSHIP, 0, SPECIES_CROBAT}, - }}, {{ // Oddish - {EVO_LEVEL, 21, SPECIES_GLOOM}, - }}, {{ // Gloom - {EVO_ITEM, ITEM_LEAF_STONE, SPECIES_VILEPLUME}, - {EVO_ITEM, ITEM_SUN_STONE, SPECIES_BELLOSSOM}, - }}, {{ // Vileplume - }}, {{ // Paras - {EVO_LEVEL, 24, SPECIES_PARASECT}, - }}, {{ // Parasect - }}, {{ // Venonat - {EVO_LEVEL, 31, SPECIES_VENOMOTH}, - }}, {{ // Venomoth - }}, {{ // Diglett - {EVO_LEVEL, 26, SPECIES_DUGTRIO}, - }}, {{ // Dugtrio - }}, {{ // Meowth - {EVO_LEVEL, 28, SPECIES_PERSIAN}, - }}, {{ // Persian - }}, {{ // Psyduck - {EVO_LEVEL, 33, SPECIES_GOLDUCK}, - }}, {{ // Golduck - }}, {{ // Mankey - {EVO_LEVEL, 28, SPECIES_PRIMEAPE}, - }}, {{ // Primeape - }}, {{ // Growlithe - {EVO_ITEM, ITEM_FIRE_STONE, SPECIES_ARCANINE}, - }}, {{ // Arcanine - }}, {{ // Poliwag - {EVO_LEVEL, 25, SPECIES_POLIWHIRL}, - }}, {{ // Poliwhirl - {EVO_ITEM, ITEM_WATER_STONE, SPECIES_POLIWRATH}, - {EVO_TRADE_ITEM, ITEM_KINGS_ROCK, SPECIES_POLITOED}, - }}, {{ // Poliwrath - }}, {{ // Abra - {EVO_LEVEL, 16, SPECIES_KADABRA}, - }}, {{ // Kadabra - {EVO_TRADE, 0, SPECIES_ALAKAZAM}, - }}, {{ // Alakazam - }}, {{ // Machop - {EVO_LEVEL, 28, SPECIES_MACHOKE}, - }}, {{ // Machoke - {EVO_TRADE, 0, SPECIES_MACHAMP}, - }}, {{ // Machamp - }}, {{ // Bellsprout - {EVO_LEVEL, 21, SPECIES_WEEPINBELL}, - }}, {{ // Weepinbell - {EVO_ITEM, ITEM_LEAF_STONE, SPECIES_VICTREEBEL}, - }}, {{ // Victreebel - }}, {{ // Tentacool - {EVO_LEVEL, 30, SPECIES_TENTACRUEL}, - }}, {{ // Tentacruel - }}, {{ // Geodude - {EVO_LEVEL, 25, SPECIES_GRAVELER}, - }}, {{ // Graveler - {EVO_TRADE, 0, SPECIES_GOLEM}, - }}, {{ // Golem - }}, {{ // Ponyta - {EVO_LEVEL, 40, SPECIES_RAPIDASH}, - }}, {{ // Rapidash - }}, {{ // Slowpoke - {EVO_LEVEL, 37, SPECIES_SLOWBRO}, - {EVO_TRADE_ITEM, ITEM_KINGS_ROCK, SPECIES_SLOWKING}, - }}, {{ // Slowbro - }}, {{ // Magnemite - {EVO_LEVEL, 30, SPECIES_MAGNETON}, - }}, {{ // Magneton - }}, {{ // Farfetch'd - }}, {{ // Doduo - {EVO_LEVEL, 31, SPECIES_DODRIO}, - }}, {{ // Dodrio - }}, {{ // Seel - {EVO_LEVEL, 34, SPECIES_DEWGONG}, - }}, {{ // Dewgong - }}, {{ // Grimer - {EVO_LEVEL, 38, SPECIES_MUK}, - }}, {{ // Muk - }}, {{ // Shellder - {EVO_ITEM, ITEM_WATER_STONE, SPECIES_CLOYSTER}, - }}, {{ // Cloyster - }}, {{ // Gastly - {EVO_LEVEL, 25, SPECIES_HAUNTER}, - }}, {{ // Haunter - {EVO_TRADE, 0, SPECIES_GENGAR}, - }}, {{ // Gengar - }}, {{ // Onix - {EVO_TRADE_ITEM, ITEM_METAL_COAT, SPECIES_STEELIX}, - }}, {{ // Drowzee - {EVO_LEVEL, 26, SPECIES_HYPNO}, - }}, {{ // Hypno - }}, {{ // Krabby - {EVO_LEVEL, 28, SPECIES_KINGLER}, - }}, {{ // Kingler - }}, {{ // Voltorb - {EVO_LEVEL, 30, SPECIES_ELECTRODE}, - }}, {{ // Electrode - }}, {{ // Exeggcute - {EVO_ITEM, ITEM_LEAF_STONE, SPECIES_EXEGGUTOR}, - }}, {{ // Exeggutor - }}, {{ // Cubone - {EVO_LEVEL, 28, SPECIES_MAROWAK}, - }}, {{ // Marowak - }}, {{ // Hitmonlee - }}, {{ // Hitmonchan - }}, {{ // Lickitung - }}, {{ // Koffing - {EVO_LEVEL, 35, SPECIES_WEEZING}, - }}, {{ // Weezing - }}, {{ // Rhyhorn - {EVO_LEVEL, 42, SPECIES_RHYDON}, - }}, {{ // Rhydon - }}, {{ // Chansey - {EVO_FRIENDSHIP, 0, SPECIES_BLISSEY}, - }}, {{ // Tangela - }}, {{ // Kangaskhan - }}, {{ // Horsea - {EVO_LEVEL, 32, SPECIES_SEADRA}, - }}, {{ // Seadra - {EVO_TRADE_ITEM, ITEM_DRAGON_SCALE, SPECIES_KINGDRA}, - }}, {{ // Goldeen - {EVO_LEVEL, 33, SPECIES_SEAKING}, - }}, {{ // Seaking - }}, {{ // Staryu - {EVO_ITEM, ITEM_WATER_STONE, SPECIES_STARMIE}, - }}, {{ // Starmie - }}, {{ // Mr. mime - }}, {{ // Scyther - {EVO_TRADE_ITEM, ITEM_METAL_COAT, SPECIES_SCIZOR}, - }}, {{ // Jynx - }}, {{ // Electabuzz - }}, {{ // Magmar - }}, {{ // Pinsir - }}, {{ // Tauros - }}, {{ // Magikarp - {EVO_LEVEL, 20, SPECIES_GYARADOS}, - }}, {{ // Gyarados - }}, {{ // Lapras - }}, {{ // Ditto - }}, {{ // Eevee - {EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_JOLTEON}, - {EVO_ITEM, ITEM_WATER_STONE, SPECIES_VAPOREON}, - {EVO_ITEM, ITEM_FIRE_STONE, SPECIES_FLAREON}, - {EVO_FRIENDSHIP_DAY, 0, SPECIES_ESPEON}, - {EVO_FRIENDSHIP_NIGHT, 0, SPECIES_UMBREON}, - }}, {{ // Vaporeon - }}, {{ // Jolteon - }}, {{ // Flareon - }}, {{ // Porygon - {EVO_TRADE_ITEM, ITEM_UP_GRADE, SPECIES_PORYGON2}, - }}, {{ // Omanyte - {EVO_LEVEL, 40, SPECIES_OMASTAR}, - }}, {{ // Omastar - }}, {{ // Kabuto - {EVO_LEVEL, 40, SPECIES_KABUTOPS}, - }}, {{ // Kabutops - }}, {{ // Aerodactyl - }}, {{ // Snorlax - }}, {{ // Articuno - }}, {{ // Zapdos - }}, {{ // Moltres - }}, {{ // Dratini - {EVO_LEVEL, 30, SPECIES_DRAGONAIR}, - }}, {{ // Dragonair - {EVO_LEVEL, 55, SPECIES_DRAGONITE}, - }}, {{ // Dragonite - }}, {{ // Mewtwo - }}, {{ // Mew - }}, {{ // Chikorita - {EVO_LEVEL, 16, SPECIES_BAYLEEF}, - }}, {{ // Bayleef - {EVO_LEVEL, 32, SPECIES_MEGANIUM}, - }}, {{ // Meganium - }}, {{ // Cyndaquil - {EVO_LEVEL, 14, SPECIES_QUILAVA}, - }}, {{ // Quilava - {EVO_LEVEL, 36, SPECIES_TYPHLOSION}, - }}, {{ // Typhlosion - }}, {{ // Totodile - {EVO_LEVEL, 18, SPECIES_CROCONAW}, - }}, {{ // Croconaw - {EVO_LEVEL, 30, SPECIES_FERALIGATR}, - }}, {{ // Feraligatr - }}, {{ // Sentret - {EVO_LEVEL, 15, SPECIES_FURRET}, - }}, {{ // Furret - }}, {{ // Hoothoot - {EVO_LEVEL, 20, SPECIES_NOCTOWL}, - }}, {{ // Noctowl - }}, {{ // Ledyba - {EVO_LEVEL, 18, SPECIES_LEDIAN}, - }}, {{ // Ledian - }}, {{ // Spinarak - {EVO_LEVEL, 22, SPECIES_ARIADOS}, - }}, {{ // Ariados - }}, {{ // Crobat - }}, {{ // Chinchou - {EVO_LEVEL, 27, SPECIES_LANTURN}, - }}, {{ // Lanturn - }}, {{ // Pichu - {EVO_FRIENDSHIP, 0, SPECIES_PIKACHU}, - }}, {{ // Cleffa - {EVO_FRIENDSHIP, 0, SPECIES_CLEFAIRY}, - }}, {{ // Igglybuff - {EVO_FRIENDSHIP, 0, SPECIES_JIGGLYPUFF}, - }}, {{ // Togepi - {EVO_FRIENDSHIP, 0, SPECIES_TOGETIC}, - }}, {{ // Togetic - }}, {{ // Natu - {EVO_LEVEL, 25, SPECIES_XATU}, - }}, {{ // Xatu - }}, {{ // Mareep - {EVO_LEVEL, 15, SPECIES_FLAAFFY}, - }}, {{ // Flaaffy - {EVO_LEVEL, 30, SPECIES_AMPHAROS}, - }}, {{ // Ampharos - }}, {{ // Bellossom - }}, {{ // Marill - {EVO_LEVEL, 18, SPECIES_AZUMARILL}, - }}, {{ // Azumarill - }}, {{ // Sudowoodo - }}, {{ // Politoed - }}, {{ // Hoppip - {EVO_LEVEL, 18, SPECIES_SKIPLOOM}, - }}, {{ // Skiploom - {EVO_LEVEL, 27, SPECIES_JUMPLUFF}, - }}, {{ // Jumpluff - }}, {{ // Aipom - }}, {{ // Sunkern - {EVO_ITEM, ITEM_SUN_STONE, SPECIES_SUNFLORA}, - }}, {{ // Sunflora - }}, {{ // Yanma - }}, {{ // Wooper - {EVO_LEVEL, 20, SPECIES_QUAGSIRE}, - }}, {{ // Quagsire - }}, {{ // Espeon - }}, {{ // Umbreon - }}, {{ // Murkrow - }}, {{ // Slowking - }}, {{ // Misdreavus - }}, {{ // Unown - }}, {{ // Wobbuffet - }}, {{ // Girafarig - }}, {{ // Pineco - {EVO_LEVEL, 31, SPECIES_FORRETRESS}, - }}, {{ // Forretress - }}, {{ // Dunsparce - }}, {{ // Gligar - }}, {{ // Steelix - }}, {{ // Snubbull - {EVO_LEVEL, 23, SPECIES_GRANBULL}, - }}, {{ // Granbull - }}, {{ // Qwilfish - }}, {{ // Scizor - }}, {{ // Shuckle - }}, {{ // Heracross - }}, {{ // Sneasel - }}, {{ // Teddiursa - {EVO_LEVEL, 30, SPECIES_URSARING}, - }}, {{ // Ursaring - }}, {{ // Slugma - {EVO_LEVEL, 38, SPECIES_MAGCARGO}, - }}, {{ // Magcargo - }}, {{ // Swinub - {EVO_LEVEL, 33, SPECIES_PILOSWINE}, - }}, {{ // Piloswine - }}, {{ // Corsola - }}, {{ // Remoraid - {EVO_LEVEL, 25, SPECIES_OCTILLERY}, - }}, {{ // Octillery - }}, {{ // Delibird - }}, {{ // Mantine - }}, {{ // Skarmory - }}, {{ // Houndour - {EVO_LEVEL, 24, SPECIES_HOUNDOOM}, - }}, {{ // Houndoom - }}, {{ // Kingdra - }}, {{ // Phanpy - {EVO_LEVEL, 25, SPECIES_DONPHAN}, - }}, {{ // Donphan - }}, {{ // Porygon2 - }}, {{ // Stantler - }}, {{ // Smeargle - }}, {{ // Tyrogue - {EVO_LEVEL_ATK_LT_DEF, 20, SPECIES_HITMONCHAN}, - {EVO_LEVEL_ATK_GT_DEF, 20, SPECIES_HITMONLEE}, - {EVO_LEVEL_ATK_EQ_DEF, 20, SPECIES_HITMONTOP}, - }}, {{ // Hitmontop - }}, {{ // Smoochum - {EVO_LEVEL, 30, SPECIES_JYNX}, - }}, {{ // Elekid - {EVO_LEVEL, 30, SPECIES_ELECTABUZZ}, - }}, {{ // Magby - {EVO_LEVEL, 30, SPECIES_MAGMAR}, - }}, {{ // Miltank - }}, {{ // Blissey - }}, {{ // Raikou - }}, {{ // Entei - }}, {{ // Suicune - }}, {{ // Larvitar - {EVO_LEVEL, 30, SPECIES_PUPITAR}, - }}, {{ // Pupitar - {EVO_LEVEL, 55, SPECIES_TYRANITAR}, - }}, {{ // Tyranitar - }}, {{ // Lugia - }}, {{ // Ho-Oh - }}, {{ // Celebi - }}, {{ // ? - }}, {{ // ? - }}, {{ // ? - }}, {{ // ? - }}, {{ // ? - }}, {{ // ? - }}, {{ // ? - }}, {{ // ? - }}, {{ // ? - }}, {{ // ? - }}, {{ // ? - }}, {{ // ? - }}, {{ // ? - }}, {{ // ? - }}, {{ // ? - }}, {{ // ? - }}, {{ // ? - }}, {{ // ? - }}, {{ // ? - }}, {{ // ? - }}, {{ // ? - }}, {{ // ? - }}, {{ // ? - }}, {{ // ? - }}, {{ // ? - }}, {{ // Treecko - {EVO_LEVEL, 16, SPECIES_GROVYLE}, - }}, {{ // Grovyle - {EVO_LEVEL, 36, SPECIES_SCEPTILE}, - }}, {{ // Sceptile - }}, {{ // Torchic - {EVO_LEVEL, 16, SPECIES_COMBUSKEN}, - }}, {{ // Combusken - {EVO_LEVEL, 36, SPECIES_BLAZIKEN}, - }}, {{ // Blaziken - }}, {{ // Mudkip - {EVO_LEVEL, 16, SPECIES_MARSHTOMP}, - }}, {{ // Marshtomp - {EVO_LEVEL, 36, SPECIES_SWAMPERT}, - }}, {{ // Swampert - }}, {{ // Poochyena - {EVO_LEVEL, 18, SPECIES_MIGHTYENA}, - }}, {{ // Mightyena - }}, {{ // Zigzagoon - {EVO_LEVEL, 20, SPECIES_LINOONE}, - }}, {{ // Linoone - }}, {{ // Wurmple - {EVO_LEVEL_SILCOON, 7, SPECIES_SILCOON}, - {EVO_LEVEL_CASCOON, 7, SPECIES_CASCOON}, - }}, {{ // Silcoon - {EVO_LEVEL, 10, SPECIES_BEAUTIFLY}, - }}, {{ // Beautifly - }}, {{ // Cascoon - {EVO_LEVEL, 10, SPECIES_DUSTOX}, - }}, {{ // Dustox - }}, {{ // Lotad - {EVO_LEVEL, 14, SPECIES_LOMBRE}, - }}, {{ // Lombre - {EVO_ITEM, ITEM_WATER_STONE, SPECIES_LUDICOLO}, - }}, {{ // Ludicolo - }}, {{ // Seedot - {EVO_LEVEL, 14, SPECIES_NUZLEAF}, - }}, {{ // Nuzleaf - {EVO_ITEM, ITEM_LEAF_STONE, SPECIES_SHIFTRY}, - }}, {{ // Shiftry - }}, {{ // Nincada - {EVO_LEVEL_NINJASK, 20, SPECIES_NINJASK}, - {EVO_LEVEL_SHEDINJA, 20, SPECIES_SHEDINJA}, - }}, {{ // Ninjask - }}, {{ // Shedinja - }}, {{ // Taillow - {EVO_LEVEL, 22, SPECIES_SWELLOW}, - }}, {{ // Swellow - }}, {{ // Shroomish - {EVO_LEVEL, 23, SPECIES_BRELOOM}, - }}, {{ // Breloom - }}, {{ // Spinda - }}, {{ // Wingull - {EVO_LEVEL, 25, SPECIES_PELIPPER}, - }}, {{ // Pelipper - }}, {{ // Surskit - {EVO_LEVEL, 22, SPECIES_MASQUERAIN}, - }}, {{ // Masquerain - }}, {{ // Wailmer - {EVO_LEVEL, 40, SPECIES_WAILORD}, - }}, {{ // Wailord - }}, {{ // Skitty - {EVO_ITEM, ITEM_MOON_STONE, SPECIES_DELCATTY}, - }}, {{ // Delcatty - }}, {{ // Kecleon - }}, {{ // Baltoy - {EVO_LEVEL, 36, SPECIES_CLAYDOL}, - }}, {{ // Claydol - }}, {{ // Nosepass - }}, {{ // Torkoal - }}, {{ // Sableye - }}, {{ // Barboach - {EVO_LEVEL, 30, SPECIES_WHISCASH}, - }}, {{ // Whiscash - }}, {{ // Luvdisc - }}, {{ // Corphish - {EVO_LEVEL, 30, SPECIES_CRAWDAUNT}, - }}, {{ // Crawdaunt - }}, {{ // Feebas - {EVO_BEAUTY, 170, SPECIES_MILOTIC}, - }}, {{ // Milotic - }}, {{ // Carvanha - {EVO_LEVEL, 30, SPECIES_SHARPEDO}, - }}, {{ // Sharpedo - }}, {{ // Trapinch - {EVO_LEVEL, 35, SPECIES_VIBRAVA}, - }}, {{ // Vibrava - {EVO_LEVEL, 45, SPECIES_FLYGON}, - }}, {{ // Flygon - }}, {{ // Makuhita - {EVO_LEVEL, 24, SPECIES_HARIYAMA}, - }}, {{ // Hariyama - }}, {{ // Electrike - {EVO_LEVEL, 26, SPECIES_MANECTRIC}, - }}, {{ // Manectric - }}, {{ // Numel - {EVO_LEVEL, 33, SPECIES_CAMERUPT}, - }}, {{ // Camerupt - }}, {{ // Spheal - {EVO_LEVEL, 32, SPECIES_SEALEO}, - }}, {{ // Sealeo - {EVO_LEVEL, 44, SPECIES_WALREIN}, - }}, {{ // Walrein - }}, {{ // Cacnea - {EVO_LEVEL, 32, SPECIES_CACTURNE}, - }}, {{ // Cacturne - }}, {{ // Snorunt - {EVO_LEVEL, 42, SPECIES_GLALIE}, - }}, {{ // Glalie - }}, {{ // Lunatone - }}, {{ // Solrock - }}, {{ // Azurill - {EVO_FRIENDSHIP, 0, SPECIES_MARILL}, - }}, {{ // Spoink - {EVO_LEVEL, 32, SPECIES_GRUMPIG}, - }}, {{ // Grumpig - }}, {{ // Plusle - }}, {{ // Minun - }}, {{ // Mawile - }}, {{ // Meditite - {EVO_LEVEL, 37, SPECIES_MEDICHAM}, - }}, {{ // Medicham - }}, {{ // Swablu - {EVO_LEVEL, 35, SPECIES_ALTARIA}, - }}, {{ // Altaria - }}, {{ // Wynaut - {EVO_LEVEL, 15, SPECIES_WOBBUFFET}, - }}, {{ // Duskull - {EVO_LEVEL, 37, SPECIES_DUSCLOPS}, - }}, {{ // Dusclops - }}, {{ // Roselia - }}, {{ // Slakoth - {EVO_LEVEL, 18, SPECIES_VIGOROTH}, - }}, {{ // Vigoroth - {EVO_LEVEL, 36, SPECIES_SLAKING}, - }}, {{ // Slaking - }}, {{ // Gulpin - {EVO_LEVEL, 26, SPECIES_SWALOT}, - }}, {{ // Swalot - }}, {{ // Tropius - }}, {{ // Whismur - {EVO_LEVEL, 20, SPECIES_LOUDRED}, - }}, {{ // Loudred - {EVO_LEVEL, 40, SPECIES_EXPLOUD}, - }}, {{ // Exploud - }}, {{ // Clamperl - {EVO_TRADE_ITEM, ITEM_DEEP_SEA_TOOTH, SPECIES_HUNTAIL}, - {EVO_TRADE_ITEM, ITEM_DEEP_SEA_SCALE, SPECIES_GOREBYSS}, - }}, {{ // Huntail - }}, {{ // Gorebyss - }}, {{ // Absol - }}, {{ // Shuppet - {EVO_LEVEL, 37, SPECIES_BANETTE}, - }}, {{ // Banette - }}, {{ // Seviper - }}, {{ // Zangoose - }}, {{ // Relicanth - }}, {{ // Aron - {EVO_LEVEL, 32, SPECIES_LAIRON}, - }}, {{ // Lairon - {EVO_LEVEL, 42, SPECIES_AGGRON}, - }}, {{ // Aggron - }}, {{ // Castform - }}, {{ // Volbeat - }}, {{ // Illumise - }}, {{ // Lileep - {EVO_LEVEL, 40, SPECIES_CRADILY}, - }}, {{ // Cradily - }}, {{ // Anorith - {EVO_LEVEL, 40, SPECIES_ARMALDO}, - }}, {{ // Armaldo - }}, {{ // Ralts - {EVO_LEVEL, 20, SPECIES_KIRLIA}, - }}, {{ // Kirlia - {EVO_LEVEL, 30, SPECIES_GARDEVOIR}, - }}, {{ // Gardevoir - }}, {{ // Bagon - {EVO_LEVEL, 30, SPECIES_SHELGON}, - }}, {{ // Shelgon - {EVO_LEVEL, 50, SPECIES_SALAMENCE}, - }}, {{ // Salamence - }}, {{ // Beldum - {EVO_LEVEL, 20, SPECIES_METANG}, - }}, {{ // Metang - {EVO_LEVEL, 45, SPECIES_METAGROSS}, - }}, {{ // Metagross - }}, {{ // Regirock - }}, {{ // Regice - }}, {{ // Registeel - }}, {{ // Kyogre - }}, {{ // Groudon - }}, {{ // Rayquaza - }}, {{ // Latias - }}, {{ // Latios - }}, {{ // Jirachi - }}, {{ // Deoxys - }}, {{ // Chimecho - }} +struct Evolution gEvolutionTable[NUM_SPECIES][5] = +{ + [SPECIES_BULBASAUR] = {{EVO_LEVEL, 16, SPECIES_IVYSAUR}}, + [SPECIES_IVYSAUR] = {{EVO_LEVEL, 32, SPECIES_VENUSAUR}}, + [SPECIES_CHARMANDER] = {{EVO_LEVEL, 16, SPECIES_CHARMELEON}}, + [SPECIES_CHARMELEON] = {{EVO_LEVEL, 36, SPECIES_CHARIZARD}}, + [SPECIES_SQUIRTLE] = {{EVO_LEVEL, 16, SPECIES_WARTORTLE}}, + [SPECIES_WARTORTLE] = {{EVO_LEVEL, 36, SPECIES_BLASTOISE}}, + [SPECIES_CATERPIE] = {{EVO_LEVEL, 7, SPECIES_METAPOD}}, + [SPECIES_METAPOD] = {{EVO_LEVEL, 10, SPECIES_BUTTERFREE}}, + [SPECIES_WEEDLE] = {{EVO_LEVEL, 7, SPECIES_KAKUNA}}, + [SPECIES_KAKUNA] = {{EVO_LEVEL, 10, SPECIES_BEEDRILL}}, + [SPECIES_PIDGEY] = {{EVO_LEVEL, 18, SPECIES_PIDGEOTTO}}, + [SPECIES_PIDGEOTTO] = {{EVO_LEVEL, 36, SPECIES_PIDGEOT}}, + [SPECIES_RATTATA] = {{EVO_LEVEL, 20, SPECIES_RATICATE}}, + [SPECIES_SPEAROW] = {{EVO_LEVEL, 20, SPECIES_FEAROW}}, + [SPECIES_EKANS] = {{EVO_LEVEL, 22, SPECIES_ARBOK}}, + [SPECIES_PIKACHU] = {{EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_RAICHU}}, + [SPECIES_SANDSHREW] = {{EVO_LEVEL, 22, SPECIES_SANDSLASH}}, + [SPECIES_NIDORAN_F] = {{EVO_LEVEL, 16, SPECIES_NIDORINA}}, + [SPECIES_NIDORINA] = {{EVO_ITEM, ITEM_MOON_STONE, SPECIES_NIDOQUEEN}}, + [SPECIES_NIDORAN_M] = {{EVO_LEVEL, 16, SPECIES_NIDORINO}}, + [SPECIES_NIDORINO] = {{EVO_ITEM, ITEM_MOON_STONE, SPECIES_NIDOKING}}, + [SPECIES_CLEFAIRY] = {{EVO_ITEM, ITEM_MOON_STONE, SPECIES_CLEFABLE}}, + [SPECIES_VULPIX] = {{EVO_ITEM, ITEM_FIRE_STONE, SPECIES_NINETALES}}, + [SPECIES_JIGGLYPUFF] = {{EVO_ITEM, ITEM_MOON_STONE, SPECIES_WIGGLYTUFF}}, + [SPECIES_ZUBAT] = {{EVO_LEVEL, 22, SPECIES_GOLBAT}}, + [SPECIES_GOLBAT] = {{EVO_FRIENDSHIP, 0, SPECIES_CROBAT}}, + [SPECIES_ODDISH] = {{EVO_LEVEL, 21, SPECIES_GLOOM}}, + [SPECIES_GLOOM] = {{EVO_ITEM, ITEM_LEAF_STONE, SPECIES_VILEPLUME}, + {EVO_ITEM, ITEM_SUN_STONE, SPECIES_BELLOSSOM}}, + [SPECIES_PARAS] = {{EVO_LEVEL, 24, SPECIES_PARASECT}}, + [SPECIES_VENONAT] = {{EVO_LEVEL, 31, SPECIES_VENOMOTH}}, + [SPECIES_DIGLETT] = {{EVO_LEVEL, 26, SPECIES_DUGTRIO}}, + [SPECIES_MEOWTH] = {{EVO_LEVEL, 28, SPECIES_PERSIAN}}, + [SPECIES_PSYDUCK] = {{EVO_LEVEL, 33, SPECIES_GOLDUCK}}, + [SPECIES_MANKEY] = {{EVO_LEVEL, 28, SPECIES_PRIMEAPE}}, + [SPECIES_GROWLITHE] = {{EVO_ITEM, ITEM_FIRE_STONE, SPECIES_ARCANINE}}, + [SPECIES_POLIWAG] = {{EVO_LEVEL, 25, SPECIES_POLIWHIRL}}, + [SPECIES_POLIWHIRL] = {{EVO_ITEM, ITEM_WATER_STONE, SPECIES_POLIWRATH}, + {EVO_TRADE_ITEM, ITEM_KINGS_ROCK, SPECIES_POLITOED}}, + [SPECIES_ABRA] = {{EVO_LEVEL, 16, SPECIES_KADABRA}}, + [SPECIES_KADABRA] = {{EVO_TRADE, 0, SPECIES_ALAKAZAM}}, + [SPECIES_MACHOP] = {{EVO_LEVEL, 28, SPECIES_MACHOKE}}, + [SPECIES_MACHOKE] = {{EVO_TRADE, 0, SPECIES_MACHAMP}}, + [SPECIES_BELLSPROUT] = {{EVO_LEVEL, 21, SPECIES_WEEPINBELL}}, + [SPECIES_WEEPINBELL] = {{EVO_ITEM, ITEM_LEAF_STONE, SPECIES_VICTREEBEL}}, + [SPECIES_TENTACOOL] = {{EVO_LEVEL, 30, SPECIES_TENTACRUEL}}, + [SPECIES_GEODUDE] = {{EVO_LEVEL, 25, SPECIES_GRAVELER}}, + [SPECIES_GRAVELER] = {{EVO_TRADE, 0, SPECIES_GOLEM}}, + [SPECIES_PONYTA] = {{EVO_LEVEL, 40, SPECIES_RAPIDASH}}, + [SPECIES_SLOWPOKE] = {{EVO_LEVEL, 37, SPECIES_SLOWBRO}, + {EVO_TRADE_ITEM, ITEM_KINGS_ROCK, SPECIES_SLOWKING}}, + [SPECIES_MAGNEMITE] = {{EVO_LEVEL, 30, SPECIES_MAGNETON}}, + [SPECIES_DODUO] = {{EVO_LEVEL, 31, SPECIES_DODRIO}}, + [SPECIES_SEEL] = {{EVO_LEVEL, 34, SPECIES_DEWGONG}}, + [SPECIES_GRIMER] = {{EVO_LEVEL, 38, SPECIES_MUK}}, + [SPECIES_SHELLDER] = {{EVO_ITEM, ITEM_WATER_STONE, SPECIES_CLOYSTER}}, + [SPECIES_GASTLY] = {{EVO_LEVEL, 25, SPECIES_HAUNTER}}, + [SPECIES_HAUNTER] = {{EVO_TRADE, 0, SPECIES_GENGAR}}, + [SPECIES_ONIX] = {{EVO_TRADE_ITEM, ITEM_METAL_COAT, SPECIES_STEELIX}}, + [SPECIES_DROWZEE] = {{EVO_LEVEL, 26, SPECIES_HYPNO}}, + [SPECIES_KRABBY] = {{EVO_LEVEL, 28, SPECIES_KINGLER}}, + [SPECIES_VOLTORB] = {{EVO_LEVEL, 30, SPECIES_ELECTRODE}}, + [SPECIES_EXEGGCUTE] = {{EVO_ITEM, ITEM_LEAF_STONE, SPECIES_EXEGGUTOR}}, + [SPECIES_CUBONE] = {{EVO_LEVEL, 28, SPECIES_MAROWAK}}, + [SPECIES_KOFFING] = {{EVO_LEVEL, 35, SPECIES_WEEZING}}, + [SPECIES_RHYHORN] = {{EVO_LEVEL, 42, SPECIES_RHYDON}}, + [SPECIES_CHANSEY] = {{EVO_FRIENDSHIP, 0, SPECIES_BLISSEY}}, + [SPECIES_HORSEA] = {{EVO_LEVEL, 32, SPECIES_SEADRA}}, + [SPECIES_SEADRA] = {{EVO_TRADE_ITEM, ITEM_DRAGON_SCALE, SPECIES_KINGDRA}}, + [SPECIES_GOLDEEN] = {{EVO_LEVEL, 33, SPECIES_SEAKING}}, + [SPECIES_STARYU] = {{EVO_ITEM, ITEM_WATER_STONE, SPECIES_STARMIE}}, + [SPECIES_SCYTHER] = {{EVO_TRADE_ITEM, ITEM_METAL_COAT, SPECIES_SCIZOR}}, + [SPECIES_MAGIKARP] = {{EVO_LEVEL, 20, SPECIES_GYARADOS}}, + [SPECIES_EEVEE] = {{EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_JOLTEON}, + {EVO_ITEM, ITEM_WATER_STONE, SPECIES_VAPOREON}, + {EVO_ITEM, ITEM_FIRE_STONE, SPECIES_FLAREON}, + {EVO_FRIENDSHIP_DAY, 0, SPECIES_ESPEON}, + {EVO_FRIENDSHIP_NIGHT, 0, SPECIES_UMBREON}}, + [SPECIES_PORYGON] = {{EVO_TRADE_ITEM, ITEM_UP_GRADE, SPECIES_PORYGON2}}, + [SPECIES_OMANYTE] = {{EVO_LEVEL, 40, SPECIES_OMASTAR}}, + [SPECIES_KABUTO] = {{EVO_LEVEL, 40, SPECIES_KABUTOPS}}, + [SPECIES_DRATINI] = {{EVO_LEVEL, 30, SPECIES_DRAGONAIR}}, + [SPECIES_DRAGONAIR] = {{EVO_LEVEL, 55, SPECIES_DRAGONITE}}, + [SPECIES_CHIKORITA] = {{EVO_LEVEL, 16, SPECIES_BAYLEEF}}, + [SPECIES_BAYLEEF] = {{EVO_LEVEL, 32, SPECIES_MEGANIUM}}, + [SPECIES_CYNDAQUIL] = {{EVO_LEVEL, 14, SPECIES_QUILAVA}}, + [SPECIES_QUILAVA] = {{EVO_LEVEL, 36, SPECIES_TYPHLOSION}}, + [SPECIES_TOTODILE] = {{EVO_LEVEL, 18, SPECIES_CROCONAW}}, + [SPECIES_CROCONAW] = {{EVO_LEVEL, 30, SPECIES_FERALIGATR}}, + [SPECIES_SENTRET] = {{EVO_LEVEL, 15, SPECIES_FURRET}}, + [SPECIES_HOOTHOOT] = {{EVO_LEVEL, 20, SPECIES_NOCTOWL}}, + [SPECIES_LEDYBA] = {{EVO_LEVEL, 18, SPECIES_LEDIAN}}, + [SPECIES_SPINARAK] = {{EVO_LEVEL, 22, SPECIES_ARIADOS}}, + [SPECIES_CHINCHOU] = {{EVO_LEVEL, 27, SPECIES_LANTURN}}, + [SPECIES_PICHU] = {{EVO_FRIENDSHIP, 0, SPECIES_PIKACHU}}, + [SPECIES_CLEFFA] = {{EVO_FRIENDSHIP, 0, SPECIES_CLEFAIRY}}, + [SPECIES_IGGLYBUFF] = {{EVO_FRIENDSHIP, 0, SPECIES_JIGGLYPUFF}}, + [SPECIES_TOGEPI] = {{EVO_FRIENDSHIP, 0, SPECIES_TOGETIC}}, + [SPECIES_NATU] = {{EVO_LEVEL, 25, SPECIES_XATU}}, + [SPECIES_MAREEP] = {{EVO_LEVEL, 15, SPECIES_FLAAFFY}}, + [SPECIES_FLAAFFY] = {{EVO_LEVEL, 30, SPECIES_AMPHAROS}}, + [SPECIES_MARILL] = {{EVO_LEVEL, 18, SPECIES_AZUMARILL}}, + [SPECIES_HOPPIP] = {{EVO_LEVEL, 18, SPECIES_SKIPLOOM}}, + [SPECIES_SKIPLOOM] = {{EVO_LEVEL, 27, SPECIES_JUMPLUFF}}, + [SPECIES_SUNKERN] = {{EVO_ITEM, ITEM_SUN_STONE, SPECIES_SUNFLORA}}, + [SPECIES_WOOPER] = {{EVO_LEVEL, 20, SPECIES_QUAGSIRE}}, + [SPECIES_PINECO] = {{EVO_LEVEL, 31, SPECIES_FORRETRESS}}, + [SPECIES_SNUBBULL] = {{EVO_LEVEL, 23, SPECIES_GRANBULL}}, + [SPECIES_TEDDIURSA] = {{EVO_LEVEL, 30, SPECIES_URSARING}}, + [SPECIES_SLUGMA] = {{EVO_LEVEL, 38, SPECIES_MAGCARGO}}, + [SPECIES_SWINUB] = {{EVO_LEVEL, 33, SPECIES_PILOSWINE}}, + [SPECIES_REMORAID] = {{EVO_LEVEL, 25, SPECIES_OCTILLERY}}, + [SPECIES_HOUNDOUR] = {{EVO_LEVEL, 24, SPECIES_HOUNDOOM}}, + [SPECIES_PHANPY] = {{EVO_LEVEL, 25, SPECIES_DONPHAN}}, + [SPECIES_TYROGUE] = {{EVO_LEVEL_ATK_LT_DEF, 20, SPECIES_HITMONCHAN}, + {EVO_LEVEL_ATK_GT_DEF, 20, SPECIES_HITMONLEE}, + {EVO_LEVEL_ATK_EQ_DEF, 20, SPECIES_HITMONTOP}}, + [SPECIES_SMOOCHUM] = {{EVO_LEVEL, 30, SPECIES_JYNX}}, + [SPECIES_ELEKID] = {{EVO_LEVEL, 30, SPECIES_ELECTABUZZ}}, + [SPECIES_MAGBY] = {{EVO_LEVEL, 30, SPECIES_MAGMAR}}, + [SPECIES_LARVITAR] = {{EVO_LEVEL, 30, SPECIES_PUPITAR}}, + [SPECIES_PUPITAR] = {{EVO_LEVEL, 55, SPECIES_TYRANITAR}}, + [SPECIES_TREECKO] = {{EVO_LEVEL, 16, SPECIES_GROVYLE}}, + [SPECIES_GROVYLE] = {{EVO_LEVEL, 36, SPECIES_SCEPTILE}}, + [SPECIES_TORCHIC] = {{EVO_LEVEL, 16, SPECIES_COMBUSKEN}}, + [SPECIES_COMBUSKEN] = {{EVO_LEVEL, 36, SPECIES_BLAZIKEN}}, + [SPECIES_MUDKIP] = {{EVO_LEVEL, 16, SPECIES_MARSHTOMP}}, + [SPECIES_MARSHTOMP] = {{EVO_LEVEL, 36, SPECIES_SWAMPERT}}, + [SPECIES_POOCHYENA] = {{EVO_LEVEL, 18, SPECIES_MIGHTYENA}}, + [SPECIES_ZIGZAGOON] = {{EVO_LEVEL, 20, SPECIES_LINOONE}}, + [SPECIES_WURMPLE] = {{EVO_LEVEL_SILCOON, 7, SPECIES_SILCOON}, + {EVO_LEVEL_CASCOON, 7, SPECIES_CASCOON}}, + [SPECIES_SILCOON] = {{EVO_LEVEL, 10, SPECIES_BEAUTIFLY}}, + [SPECIES_CASCOON] = {{EVO_LEVEL, 10, SPECIES_DUSTOX}}, + [SPECIES_LOTAD] = {{EVO_LEVEL, 14, SPECIES_LOMBRE}}, + [SPECIES_LOMBRE] = {{EVO_ITEM, ITEM_WATER_STONE, SPECIES_LUDICOLO}}, + [SPECIES_SEEDOT] = {{EVO_LEVEL, 14, SPECIES_NUZLEAF}}, + [SPECIES_NUZLEAF] = {{EVO_ITEM, ITEM_LEAF_STONE, SPECIES_SHIFTRY}}, + [SPECIES_NINCADA] = {{EVO_LEVEL_NINJASK, 20, SPECIES_NINJASK}, + {EVO_LEVEL_SHEDINJA, 20, SPECIES_SHEDINJA}}, + [SPECIES_TAILLOW] = {{EVO_LEVEL, 22, SPECIES_SWELLOW}}, + [SPECIES_SHROOMISH] = {{EVO_LEVEL, 23, SPECIES_BRELOOM}}, + [SPECIES_WINGULL] = {{EVO_LEVEL, 25, SPECIES_PELIPPER}}, + [SPECIES_SURSKIT] = {{EVO_LEVEL, 22, SPECIES_MASQUERAIN}}, + [SPECIES_WAILMER] = {{EVO_LEVEL, 40, SPECIES_WAILORD}}, + [SPECIES_SKITTY] = {{EVO_ITEM, ITEM_MOON_STONE, SPECIES_DELCATTY}}, + [SPECIES_BALTOY] = {{EVO_LEVEL, 36, SPECIES_CLAYDOL}}, + [SPECIES_BARBOACH] = {{EVO_LEVEL, 30, SPECIES_WHISCASH}}, + [SPECIES_CORPHISH] = {{EVO_LEVEL, 30, SPECIES_CRAWDAUNT}}, + [SPECIES_FEEBAS] = {{EVO_BEAUTY, 170, SPECIES_MILOTIC}}, + [SPECIES_CARVANHA] = {{EVO_LEVEL, 30, SPECIES_SHARPEDO}}, + [SPECIES_TRAPINCH] = {{EVO_LEVEL, 35, SPECIES_VIBRAVA}}, + [SPECIES_VIBRAVA] = {{EVO_LEVEL, 45, SPECIES_FLYGON}}, + [SPECIES_MAKUHITA] = {{EVO_LEVEL, 24, SPECIES_HARIYAMA}}, + [SPECIES_ELECTRIKE] = {{EVO_LEVEL, 26, SPECIES_MANECTRIC}}, + [SPECIES_NUMEL] = {{EVO_LEVEL, 33, SPECIES_CAMERUPT}}, + [SPECIES_SPHEAL] = {{EVO_LEVEL, 32, SPECIES_SEALEO}}, + [SPECIES_SEALEO] = {{EVO_LEVEL, 44, SPECIES_WALREIN}}, + [SPECIES_CACNEA] = {{EVO_LEVEL, 32, SPECIES_CACTURNE}}, + [SPECIES_SNORUNT] = {{EVO_LEVEL, 42, SPECIES_GLALIE}}, + [SPECIES_AZURILL] = {{EVO_FRIENDSHIP, 0, SPECIES_MARILL}}, + [SPECIES_SPOINK] = {{EVO_LEVEL, 32, SPECIES_GRUMPIG}}, + [SPECIES_MEDITITE] = {{EVO_LEVEL, 37, SPECIES_MEDICHAM}}, + [SPECIES_SWABLU] = {{EVO_LEVEL, 35, SPECIES_ALTARIA}}, + [SPECIES_WYNAUT] = {{EVO_LEVEL, 15, SPECIES_WOBBUFFET}}, + [SPECIES_DUSKULL] = {{EVO_LEVEL, 37, SPECIES_DUSCLOPS}}, + [SPECIES_SLAKOTH] = {{EVO_LEVEL, 18, SPECIES_VIGOROTH}}, + [SPECIES_VIGOROTH] = {{EVO_LEVEL, 36, SPECIES_SLAKING}}, + [SPECIES_GULPIN] = {{EVO_LEVEL, 26, SPECIES_SWALOT}}, + [SPECIES_WHISMUR] = {{EVO_LEVEL, 20, SPECIES_LOUDRED}}, + [SPECIES_LOUDRED] = {{EVO_LEVEL, 40, SPECIES_EXPLOUD}}, + [SPECIES_CLAMPERL] = {{EVO_TRADE_ITEM, ITEM_DEEP_SEA_TOOTH, SPECIES_HUNTAIL}, + {EVO_TRADE_ITEM, ITEM_DEEP_SEA_SCALE, SPECIES_GOREBYSS}}, + [SPECIES_SHUPPET] = {{EVO_LEVEL, 37, SPECIES_BANETTE}}, + [SPECIES_ARON] = {{EVO_LEVEL, 32, SPECIES_LAIRON}}, + [SPECIES_LAIRON] = {{EVO_LEVEL, 42, SPECIES_AGGRON}}, + [SPECIES_LILEEP] = {{EVO_LEVEL, 40, SPECIES_CRADILY}}, + [SPECIES_ANORITH] = {{EVO_LEVEL, 40, SPECIES_ARMALDO}}, + [SPECIES_RALTS] = {{EVO_LEVEL, 20, SPECIES_KIRLIA}}, + [SPECIES_KIRLIA] = {{EVO_LEVEL, 30, SPECIES_GARDEVOIR}}, + [SPECIES_BAGON] = {{EVO_LEVEL, 30, SPECIES_SHELGON}}, + [SPECIES_SHELGON] = {{EVO_LEVEL, 50, SPECIES_SALAMENCE}}, + [SPECIES_BELDUM] = {{EVO_LEVEL, 20, SPECIES_METANG}}, + [SPECIES_METANG] = {{EVO_LEVEL, 45, SPECIES_METAGROSS}}, }; #endif //POKERUBY_EVOLUTION_H diff --git a/src/data/pokemon/item_effects.h b/src/data/pokemon/item_effects.h index cd06228dd..c7409f3b2 100644 --- a/src/data/pokemon/item_effects.h +++ b/src/data/pokemon/item_effects.h @@ -1,661 +1,72 @@ -// - -// - -#ifndef POKERUBY_ITEM_EFFECTS_H -#define POKERUBY_ITEM_EFFECTS_H - -const u8 gItemEffect_Potion[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x04, - 0x00, - 20 -}; - -const u8 gItemEffect_Antidote[] = { - 0x00, - 0x00, - 0x00, - 0x10, - 0x00, - 0x00 -}; - -const u8 gItemEffect_BurnHeal[] = { - 0x00, - 0x00, - 0x00, - 0x08, - 0x00, - 0x00 -}; - -const u8 gItemEffect_IceHeal[] = { - 0x00, - 0x00, - 0x00, - 0x04, - 0x00, - 0x00 -}; - -const u8 gItemEffect_Awakening[] = { - 0x00, - 0x00, - 0x00, - 0x20, - 0x00, - 0x00 -}; - -const u8 gItemEffect_ParalyzeHeal[] = { - 0x00, - 0x00, - 0x00, - 0x02, - 0x00, - 0x00 -}; - -const u8 gItemEffect_FullRestore[] = { - 0x00, - 0x00, - 0x00, - 0x3f, - 0x04, - 0x00, - 0xff -}; - -const u8 gItemEffect_MaxPotion[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x04, - 0x00, - 0xff -}; - -const u8 gItemEffect_HyperPotion[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x04, - 0x00, - 200 -}; - -const u8 gItemEffect_SuperPotion[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x04, - 0x00, - 50 -}; - -const u8 gItemEffect_FullHeal[] = { - 0x00, - 0x00, - 0x00, - 0x3f, - 0x00, - 0x00 -}; - -const u8 gItemEffect_Revive[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x44, - 0x00, - 0xfe -}; - -const u8 gItemEffect_MaxRevive[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x44, - 0x00, - 0xff -}; - -const u8 gItemEffect_FreshWater[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x04, - 0x00, - 50 -}; - -const u8 gItemEffect_SodaPop[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x04, - 0x00, - 60 -}; - -const u8 gItemEffect_Lemonade[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x04, - 0x00, - 80 -}; - -const u8 gItemEffect_MoomooMilk[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x04, - 0x00, - 100 -}; - -const u8 gItemEffect_EnergyPowder[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x04, - 0xe0, - 50, - 0xfb, - 0xfb, - 0xf6 -}; - -const u8 gItemEffect_EnergyRoot[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x04, - 0xe0, - 200, - 0xf6, - 0xf6, - 0xf1 -}; - -const u8 gItemEffect_HealPowder[] = { - 0x00, - 0x00, - 0x00, - 0x3f, - 0x00, - 0xe0, - 0xfb, - 0xfb, - 0xf6 -}; - -const u8 gItemEffect_RevivalHerb[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x44, - 0xe0, - 0xfe, - 0xf1, - 0xf1, - 0xec -}; - -const u8 gItemEffect_Ether[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x18, - 0x00, - 0x0a -}; - -const u8 gItemEffect_MaxEther[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x18, - 0x00, - 0x7f -}; - -const u8 gItemEffect_Elixir[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x08, - 0x00, - 0x0a -}; - -const u8 gItemEffect_MaxElixir[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x08, - 0x00, - 0x7f -}; - -const u8 gItemEffect_LavaCookie[] = { - 0x00, - 0x00, - 0x00, - 0x3f, - 0x00, - 0x00 -}; - -const u8 gItemEffect_BlueFlute[] = { - 0x00, - 0x00, - 0x00, - 0x20, - 0x00, - 0x00 -}; - -const u8 gItemEffect_YellowFlute[] = { - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00 -}; - -const u8 gItemEffect_RedFlute[] = { - 0x80, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00 -}; - -const u8 gItemEffect_BerryJuice[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x04, - 0x00, - 20 -}; - -const u8 gItemEffect_SacredAsh[] = { - 0x40, - 0x00, - 0x00, - 0x00, - 0x44, - 0x00, - 0xff -}; - -const u8 gItemEffect_HPUp[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x01, - 0xe0, - 0x0a, - 0x05, - 0x03, - 0x02 -}; - -const u8 gItemEffect_Protein[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x02, - 0xe0, - 0x0a, - 0x05, - 0x03, - 0x02 -}; - -const u8 gItemEffect_Iron[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0xe1, - 0x0a, - 0x05, - 0x03, - 0x02 -}; - -const u8 gItemEffect_Carbos[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0xe2, - 0x0a, - 0x05, - 0x03, - 0x02 -}; - -const u8 gItemEffect_Calcium[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0xe8, - 0x0a, - 0x05, - 0x03, - 0x02 -}; - -const u8 gItemEffect_RareCandy[] = { - 0x00, - 0x00, - 0x00, - 0x40, - 0x44, - 0xe0, - 253, - 0x05, - 0x03, - 0x02 -}; - -const u8 gItemEffect_PPUp[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x20, - 0xe0, - 0x05, - 0x03, - 0x02 -}; - -const u8 gItemEffect_Zinc[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0xe4, - 0x0a, - 0x05, - 0x03, - 0x02 -}; - -const u8 gItemEffect_PPMax[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0xf0, - 0x05, - 0x03, - 0x02 -}; - -const u8 gItemEffect_GuardSpec[] = { - 0x00, - 0x00, - 0x00, - 0x80, - 0x00, - 0x60, - 0x01, - 0x01 -}; - -const u8 gItemEffect_DireHit[] = { - 0x20, - 0x00, - 0x00, - 0x00, - 0x00, - 0x60, - 0x01, - 0x01 -}; - -const u8 gItemEffect_XAttack[] = { - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x60, - 0x01, - 0x01 -}; - -const u8 gItemEffect_XDefend[] = { - 0x00, - 0x10, - 0x00, - 0x00, - 0x00, - 0x60, - 0x01, - 0x01 -}; - -const u8 gItemEffect_XSpeed[] = { - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x60, - 0x01, - 0x01 -}; - -const u8 gItemEffect_XAccuracy[] = { - 0x00, - 0x00, - 0x10, - 0x00, - 0x00, - 0x60, - 0x01, - 0x01 -}; - -const u8 gItemEffect_XSpecial[] = { - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x60, - 0x01, - 0x01 -}; - -const u8 gItemEffect_SunStone[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x80, - 0x00 -}; - -const u8 gItemEffect_MoonStone[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x80, - 0x00 -}; - -const u8 gItemEffect_FireStone[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x80, - 0x00 -}; - -const u8 gItemEffect_ThunderStone[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x80, - 0x00 -}; - -const u8 gItemEffect_WaterStone[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x80, - 0x00 -}; - -const u8 gItemEffect_LeafStone[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x80, - 0x00 -}; - -const u8 gItemEffect_CheriBerry[] = { - 0x00, - 0x00, - 0x00, - 0x02, - 0x00, - 0x00 -}; - -const u8 gItemEffect_ChestoBerry[] = { - 0x00, - 0x00, - 0x00, - 0x20, - 0x00, - 0x00 -}; - -const u8 gItemEffect_PechaBerry[] = { - 0x00, - 0x00, - 0x00, - 0x10, - 0x00, - 0x00 -}; - -const u8 gItemEffect_RawstBerry[] = { - 0x00, - 0x00, - 0x00, - 0x08, - 0x00, - 0x00 -}; - -const u8 gItemEffect_AspearBerry[] = { - 0x00, - 0x00, - 0x00, - 0x04, - 0x00, - 0x00 -}; - -const u8 gItemEffect_LeppaBerry[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x18, - 0x00, - 0x0a -}; - -const u8 gItemEffect_OranBerry[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x04, - 0x00, - 10 -}; - -const u8 gItemEffect_PersimBerry[] = { - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00 -}; - -const u8 gItemEffect_LumBerry[] = { - 0x00, - 0x00, - 0x00, - 0x3f, - 0x00, - 0x00 -}; - -const u8 gItemEffect_SitrusBerry[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x04, - 0x00, - 30 -}; - -const u8 *const gItemEffectTable[] = { +#ifndef GUARD_ITEM_EFFECTS_H +#define GUARD_ITEM_EFFECTS_H + +const u8 gItemEffect_Potion[] = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 20}; +const u8 gItemEffect_Antidote[] = {0x00, 0x00, 0x00, 0x10, 0x00, 0x00}; +const u8 gItemEffect_BurnHeal[] = {0x00, 0x00, 0x00, 0x08, 0x00, 0x00}; +const u8 gItemEffect_IceHeal[] = {0x00, 0x00, 0x00, 0x04, 0x00, 0x00}; +const u8 gItemEffect_Awakening[] = {0x00, 0x00, 0x00, 0x20, 0x00, 0x00}; +const u8 gItemEffect_ParalyzeHeal[] = {0x00, 0x00, 0x00, 0x02, 0x00, 0x00}; +const u8 gItemEffect_FullRestore[] = {0x00, 0x00, 0x00, 0x3f, 0x04, 0x00, 0xff}; +const u8 gItemEffect_MaxPotion[] = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff}; +const u8 gItemEffect_HyperPotion[] = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 200}; +const u8 gItemEffect_SuperPotion[] = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 50}; +const u8 gItemEffect_FullHeal[] = {0x00, 0x00, 0x00, 0x3f, 0x00, 0x00}; +const u8 gItemEffect_Revive[] = {0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0xfe}; +const u8 gItemEffect_MaxRevive[] = {0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0xff}; +const u8 gItemEffect_FreshWater[] = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 50}; +const u8 gItemEffect_SodaPop[] = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 60}; +const u8 gItemEffect_Lemonade[] = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 80}; +const u8 gItemEffect_MoomooMilk[] = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 100}; +const u8 gItemEffect_EnergyPowder[] = {0x00, 0x00, 0x00, 0x00, 0x04, 0xe0, 50, 0xfb, 0xfb, 0xf6}; +const u8 gItemEffect_EnergyRoot[] = {0x00, 0x00, 0x00, 0x00, 0x04, 0xe0, 200, 0xf6, 0xf6, 0xf1}; +const u8 gItemEffect_HealPowder[] = {0x00, 0x00, 0x00, 0x3f, 0x00, 0xe0, 0xfb, 0xfb, 0xf6}; +const u8 gItemEffect_RevivalHerb[] = {0x00, 0x00, 0x00, 0x00, 0x44, 0xe0, 0xfe, 0xf1, 0xf1, 0xec}; +const u8 gItemEffect_Ether[] = {0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x0a}; +const u8 gItemEffect_MaxEther[] = {0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x7f}; +const u8 gItemEffect_Elixir[] = {0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0a}; +const u8 gItemEffect_MaxElixir[] = {0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7f}; +const u8 gItemEffect_LavaCookie[] = {0x00, 0x00, 0x00, 0x3f, 0x00, 0x00}; +const u8 gItemEffect_BlueFlute[] = {0x00, 0x00, 0x00, 0x20, 0x00, 0x00}; +const u8 gItemEffect_YellowFlute[] = {0x00, 0x00, 0x00, 0x01, 0x00, 0x00}; +const u8 gItemEffect_RedFlute[] = {0x80, 0x00, 0x00, 0x00, 0x00, 0x00}; +const u8 gItemEffect_BerryJuice[] = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 20}; +const u8 gItemEffect_SacredAsh[] = {0x40, 0x00, 0x00, 0x00, 0x44, 0x00, 0xff}; +const u8 gItemEffect_HPUp[] = {0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x0a, 0x05, 0x03, 0x02}; +const u8 gItemEffect_Protein[] = {0x00, 0x00, 0x00, 0x00, 0x02, 0xe0, 0x0a, 0x05, 0x03, 0x02}; +const u8 gItemEffect_Iron[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0xe1, 0x0a, 0x05, 0x03, 0x02}; +const u8 gItemEffect_Carbos[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x0a, 0x05, 0x03, 0x02}; +const u8 gItemEffect_Calcium[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x0a, 0x05, 0x03, 0x02}; +const u8 gItemEffect_RareCandy[] = {0x00, 0x00, 0x00, 0x40, 0x44, 0xe0, 253, 0x05, 0x03, 0x02}; +const u8 gItemEffect_PPUp[] = {0x00, 0x00, 0x00, 0x00, 0x20, 0xe0, 0x05, 0x03, 0x02}; +const u8 gItemEffect_Zinc[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x0a, 0x05, 0x03, 0x02}; +const u8 gItemEffect_PPMax[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x05, 0x03, 0x02}; +const u8 gItemEffect_GuardSpec[] = {0x00, 0x00, 0x00, 0x80, 0x00, 0x60, 0x01, 0x01}; +const u8 gItemEffect_DireHit[] = {0x20, 0x00, 0x00, 0x00, 0x00, 0x60, 0x01, 0x01}; +const u8 gItemEffect_XAttack[] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x60, 0x01, 0x01}; +const u8 gItemEffect_XDefend[] = {0x00, 0x10, 0x00, 0x00, 0x00, 0x60, 0x01, 0x01}; +const u8 gItemEffect_XSpeed[] = {0x00, 0x01, 0x00, 0x00, 0x00, 0x60, 0x01, 0x01}; +const u8 gItemEffect_XAccuracy[] = {0x00, 0x00, 0x10, 0x00, 0x00, 0x60, 0x01, 0x01}; +const u8 gItemEffect_XSpecial[] = {0x00, 0x00, 0x01, 0x00, 0x00, 0x60, 0x01, 0x01}; +const u8 gItemEffect_SunStone[] = {0x00, 0x00, 0x00, 0x00, 0x80, 0x00}; +const u8 gItemEffect_MoonStone[] = {0x00, 0x00, 0x00, 0x00, 0x80, 0x00}; +const u8 gItemEffect_FireStone[] = {0x00, 0x00, 0x00, 0x00, 0x80, 0x00}; +const u8 gItemEffect_ThunderStone[] = {0x00, 0x00, 0x00, 0x00, 0x80, 0x00}; +const u8 gItemEffect_WaterStone[] = {0x00, 0x00, 0x00, 0x00, 0x80, 0x00}; +const u8 gItemEffect_LeafStone[] = {0x00, 0x00, 0x00, 0x00, 0x80, 0x00}; +const u8 gItemEffect_CheriBerry[] = {0x00, 0x00, 0x00, 0x02, 0x00, 0x00}; +const u8 gItemEffect_ChestoBerry[] = {0x00, 0x00, 0x00, 0x20, 0x00, 0x00}; +const u8 gItemEffect_PechaBerry[] = {0x00, 0x00, 0x00, 0x10, 0x00, 0x00}; +const u8 gItemEffect_RawstBerry[] = {0x00, 0x00, 0x00, 0x08, 0x00, 0x00}; +const u8 gItemEffect_AspearBerry[] = {0x00, 0x00, 0x00, 0x04, 0x00, 0x00}; +const u8 gItemEffect_LeppaBerry[] = {0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x0a}; +const u8 gItemEffect_OranBerry[] = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 10}; +const u8 gItemEffect_PersimBerry[] = {0x00, 0x00, 0x00, 0x01, 0x00, 0x00}; +const u8 gItemEffect_LumBerry[] = {0x00, 0x00, 0x00, 0x3f, 0x00, 0x00}; +const u8 gItemEffect_SitrusBerry[] = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 30}; + +const u8 *const gItemEffectTable[] = +{ gItemEffect_Potion, gItemEffect_Antidote, gItemEffect_BurnHeal, @@ -821,4 +232,4 @@ const u8 *const gItemEffectTable[] = { NULL }; -#endif //POKERUBY_ITEM_EFFECTS_H +#endif //GUARD_ITEM_EFFECTS_H diff --git a/src/data/pokemon/level_up_learnset_pointers.h b/src/data/pokemon/level_up_learnset_pointers.h index 19761c996..894a2b58e 100644 --- a/src/data/pokemon/level_up_learnset_pointers.h +++ b/src/data/pokemon/level_up_learnset_pointers.h @@ -5,7 +5,7 @@ #ifndef POKERUBY_LEVEL_UP_LEARNSET_POINTERS_H #define POKERUBY_LEVEL_UP_LEARNSET_POINTERS_H -const u16 *const gLevelUpLearnsets[] = { +const u16 *gLevelUpLearnsets[] = { gBulbasaurLevelUpLearnset, gBulbasaurLevelUpLearnset, gIvysaurLevelUpLearnset, diff --git a/src/data/pokemon/nature_stats.h b/src/data/pokemon/nature_stats.h deleted file mode 100644 index fcef2a0ac..000000000 --- a/src/data/pokemon/nature_stats.h +++ /dev/null @@ -1,37 +0,0 @@ -// - -// - -#ifndef POKERUBY_NATURE_STATS_H -#define POKERUBY_NATURE_STATS_H - -const s8 gNatureStatTable[][5] = { - // Atk Def Spd Sp.Atk Sp.Def - { 0, 0, 0, 0, 0}, // Hardy - { 1, -1, 0, 0, 0}, // Lonely - { 1, 0, -1, 0, 0}, // Brave - { 1, 0, 0, -1, 0}, // Adamant - { 1, 0, 0, 0, -1}, // Naughty - { -1, 1, 0, 0, 0}, // Bold - { 0, 0, 0, 0, 0}, // Docile - { 0, 1, -1, 0, 0}, // Relaxed - { 0, 1, 0, -1, 0}, // Impish - { 0, 1, 0, 0, -1}, // Lax - { -1, 0, 1, 0, 0}, // Timid - { 0, -1, 1, 0, 0}, // Hasty - { 0, 0, 0, 0, 0}, // Serious - { 0, 0, 1, -1, 0}, // Jolly - { 0, 0, 1, 0, -1}, // Naive - { -1, 0, 0, 1, 0}, // Modest - { 0, -1, 0, 1, 0}, // Mild - { 0, 0, -1, 1, 0}, // Quiet - { 0, 0, 0, 0, 0}, // Bashful - { 0, 0, 0, 1, -1}, // Rash - { -1, 0, 0, 0, 1}, // Calm - { 0, -1, 0, 0, 1}, // Gentle - { 0, 0, -1, 0, 1}, // Sassy - { 0, 0, 0, -1, 1}, // Careful - { 0, 0, 0, 0, 0} // Quirky -}; - -#endif //POKERUBY_NATURE_STATS_H diff --git a/src/data/pokemon/spinda_spots.h b/src/data/pokemon/spinda_spots.h deleted file mode 100644 index d045e0734..000000000 --- a/src/data/pokemon/spinda_spots.h +++ /dev/null @@ -1,15 +0,0 @@ -// - -// - -#ifndef POKERUBY_SPINDA_SPOTS_H -#define POKERUBY_SPINDA_SPOTS_H - -const struct SpindaSpot gSpindaSpotGraphics[] = { - {16, 14, INCBIN_U16("graphics/spinda_spots/spot_0.bin")}, - {40, 15, INCBIN_U16("graphics/spinda_spots/spot_1.bin")}, - {22, 32, INCBIN_U16("graphics/spinda_spots/spot_2.bin")}, - {34, 33, INCBIN_U16("graphics/spinda_spots/spot_3.bin")} -}; - -#endif //POKERUBY_SPINDA_SPOTS_H diff --git a/src/data/pokemon/tmhm_learnsets.h b/src/data/pokemon/tmhm_learnsets.h index 02cd22d56..f14478863 100644 --- a/src/data/pokemon/tmhm_learnsets.h +++ b/src/data/pokemon/tmhm_learnsets.h @@ -1,431 +1,9393 @@ -// - -// - -#ifndef POKERUBY_TMHM_LEARNSETS_H -#define POKERUBY_TMHM_LEARNSETS_H - -// TO-DO: Rewrite this declaration to allow assignment of TM/HM learns by name. -// These are 58-bit numbers aligned to 64 bits. The least significant bit represents TM01, -// while the most significant bit represents HM08. - -asm( - ".align 2\n" - ".global gTMHMLearnsets\n" - "gTMHMLearnsets:\n" - - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ?????????? - ".8byte 0b0011100100000111100000100010000100001101010000011100100000\n" // Bulbasaur - ".8byte 0b0011100100000111100000100010000100001101010000011100100000\n" // Ivysaur - ".8byte 0b0011100100000111100000100010000110001101010100011100110000\n" // Venusaur - ".8byte 0b0010100110000111101010010011001100010100010000011000100011\n" // Charmander - ".8byte 0b0010100110000111101010010011001100010100010000011000100011\n" // Charmeleon - ".8byte 0b0010101110010111101010010011001110010100010100011000110011\n" // Charizard - ".8byte 0b1110110000000111100000000011001100010100110011001001100101\n" // Squirtle - ".8byte 0b1110110000000111100000000011001100010100110011001001100101\n" // Wartortle - ".8byte 0b1110110000000111100000000011001110010100110111001001110101\n" // Blastoise - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // Caterpie - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // Metapod - ".8byte 0b0001000000101111101000000010110100001111110100011000100000\n" // Butterfree - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // Weedle - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // Kakuna - ".8byte 0b0010000100001111101000100011000100001101010100011000100000\n" // Beedrill - ".8byte 0b0000001000011111101000000010000100000100110000011000100000\n" // Pidgey - ".8byte 0b0000001000011111101000000010000100000100110000011000100000\n" // Pidgeotto - ".8byte 0b0000001000011111101000000010000100000100110100011000100000\n" // Pidgeot - ".8byte 0b0010000100001111100000001010101101110100110011111000100000\n" // Rattata - ".8byte 0b0010100100001111100000001010101101110100110111111000110000\n" // Raticate - ".8byte 0b0000001000011111101000000010000100000100110000011000100000\n" // Spearow - ".8byte 0b0000001000011111101000000010000100000100110100011000100000\n" // Fearow - ".8byte 0b0000100001001111110000100010001110010101110000011000100000\n" // Ekans - ".8byte 0b0000100001001111110000100010001110010101110100011000100000\n" // Arbok - ".8byte 0b0011100000000111100000001011001101110100111000001000100001\n" // Pikachu - ".8byte 0b0011100000001111100000001011001101110100111100001000100001\n" // Raichu - ".8byte 0b0010100100001111101101000011001110010100010000011000100001\n" // Sandshrew - ".8byte 0b0010100100001111101101000011001110010100010100011000100001\n" // Sandslash - ".8byte 0b0010100100001111101000101010001101110100110011011000100100\n" // Nidoran♀ - ".8byte 0b0010100100001111101000101010001101110100110011011000100100\n" // Nidorina - ".8byte 0b0010110100001111111111111011101111110100110111111000110101\n" // Nidoqueen - ".8byte 0b0010100100001111100000101010001101110100110011011000100100\n" // Nidoran♂ - ".8byte 0b0010100100001111100000101010001101110100110011011000100100\n" // Nidorino - ".8byte 0b0010110100001111110111111011101111110100110111111000110101\n" // Nidoking - ".8byte 0b0001100001000111100010011111111101111110111011011000101101\n" // Clefairy - ".8byte 0b0001100001000111100010011111111101111110111111011000101101\n" // Clefable - ".8byte 0b0000000010000111100010010010001100010110010000011000110000\n" // Vulpix - ".8byte 0b0000000010000111100010010010001100010110010100011000110000\n" // Ninetales - ".8byte 0b0001100001000111100010011111111101101110111011011000100101\n" // Jigglypuff - ".8byte 0b0001100001000111100010011111111101101110111111011000100101\n" // Wigglytuff - ".8byte 0b0000000001011111111000100010100100000101110000111000100000\n" // Zubat - ".8byte 0b0000000001011111111000100010100100000101110100111000100000\n" // Golbat - ".8byte 0b0001000100000111100000100010000100001101010000011100100000\n" // Oddish - ".8byte 0b0001000100000111100000100010000100001101010000011100100000\n" // Gloom - ".8byte 0b0001000100000111100000100010000100001101010100011100100000\n" // Vileplume - ".8byte 0b0011000100001111101000100010001100001101010000011100100000\n" // Paras - ".8byte 0b0011000100001111101000100010001100001101010100011100100000\n" // Parasect - ".8byte 0b0001000000101111100000100010010100001101010000011000100000\n" // Venonat - ".8byte 0b0001000000101111101000100010010100001101010100011000100000\n" // Venomoth - ".8byte 0b0010000100001111101100100010001110000100010000011000100000\n" // Diglett - ".8byte 0b0010000100001111101100100010001110000100010100011000100000\n" // Dugtrio - ".8byte 0b0001000101001111111000001010101101110100110000111000100100\n" // Meowth - ".8byte 0b0001000101001111111000001010101101110100110100111000110100\n" // Persian - ".8byte 0b1111110000000111101000000011001100010100110011001001101101\n" // Psyduck - ".8byte 0b1111110000000111101000000011001100010100110111001001101101\n" // Golduck - ".8byte 0b0010100010001111101100000011001111110100110000111010100001\n" // Mankey - ".8byte 0b0010100010001111101100000011001111110100110100111010100001\n" // Primeape - ".8byte 0b0010100010001111101010010010001100010100010000011000110000\n" // Growlithe - ".8byte 0b0010100010001111101010010010001100010100010100011000110000\n" // Arcanine - ".8byte 0b1100010000001111100000000010011100000100110011001001100100\n" // Poliwag - ".8byte 0b1110110000001111100000000011011110000100110011001001100101\n" // Poliwhirl - ".8byte 0b1110110000001111100100000011011110000100110111001011100101\n" // Poliwrath - ".8byte 0b0001000001101111110000001110110100010110111000111000101001\n" // Abra - ".8byte 0b0001000001101111110000001110110100010110111000111000101001\n" // Kadabra - ".8byte 0b0001000001101111110000001110110100010110111100111000101001\n" // Alakazam - ".8byte 0b0010100000001111100110010011001110000100110000011010100001\n" // Machop - ".8byte 0b0010100000001111100110010011001110000100110000011010100001\n" // Machoke - ".8byte 0b0010100000001111100110010011001110000100110100011010100001\n" // Machamp - ".8byte 0b0001000100001111100000100010000100001101010000011100100000\n" // Bellsprout - ".8byte 0b0001000100001111100000100010000100001101010000011100100000\n" // Weepinbell - ".8byte 0b0001000100001111100000100010000100001101010100011100100000\n" // Victreebel - ".8byte 0b1100010100001111100000100010000100000101110011001001100100\n" // Tentacool - ".8byte 0b1100010100001111100000100010000100000101110111001001100100\n" // Tentacruel - ".8byte 0b0010100000000111100111010011001110000100010000011000100001\n" // Geodude - ".8byte 0b0010100000000111100111010011001110000100010000011000100001\n" // Graveler - ".8byte 0b0010100000000111100111010011001110000100010100011000110001\n" // Golem - ".8byte 0b0000100010000111100010010010000100011100010000011000100000\n" // Ponyta - ".8byte 0b0000100010000111100010010010000100011100010100011000100000\n" // Rapidash - ".8byte 0b1001110000100111100010010010111110010110110011011001101100\n" // Slowpoke - ".8byte 0b1011110000100111100010010011111110010110110111011001101101\n" // Slowbro - ".8byte 0b0001000000000011100000001110000101100100110000011000100000\n" // Magnemite - ".8byte 0b0001000000000011100000001110000101100100110100011000100000\n" // Magneton - ".8byte 0b0000001100011111101000000010000100010100010000011000100000\n" // Farfetch'd - ".8byte 0b0000001000011111101000000010000100000100010000011000100000\n" // Doduo - ".8byte 0b0000001000011111111000000010000100000100010100111000100000\n" // Dodrio - ".8byte 0b1100010000001111100000000010000100000110110011001001100100\n" // Seel - ".8byte 0b1100010000001111100000000010000100000110110111001001100100\n" // Dewgong - ".8byte 0b0000000000001111110110111010001101100101110000111000100000\n" // Grimer - ".8byte 0b0010100000001111110110111011001101100101110100111000100001\n" // Muk - ".8byte 0b1000010000000111100000000010000100000100110011001001100100\n" // Shellder - ".8byte 0b1000010000000111110000000010000100000100110111001001100100\n" // Cloyster - ".8byte 0b0000000001101111110000100010110100100101110000111000100000\n" // Gastly - ".8byte 0b0000000001101111110000100010110100100101110000111000100000\n" // Haunter - ".8byte 0b0010100001101111110000100011110101100101110100111000100001\n" // Gengar - ".8byte 0b0010100000000111110101000010001110010100010000111000110000\n" // Onix - ".8byte 0b0001000001101111110000000111110100000110111000111000101001\n" // Drowzee - ".8byte 0b0001000001101111110000000111110100000110111100111000101001\n" // Hypno - ".8byte 0b1010110100001111100100000010001100000100110011001001100100\n" // Krabby - ".8byte 0b1010110100001111100100000010001100000100110111001001100100\n" // Kingler - ".8byte 0b0001000000001011110000001010000101100100111000101000100000\n" // Voltorb - ".8byte 0b0001000000001011110000001010000101100100111100101000100000\n" // Electrode - ".8byte 0b0001100000101111100000100110010100001101011000011100100000\n" // Exeggcute - ".8byte 0b0001100000101111100000100110010100001101011100011100100000\n" // Exeggutor - ".8byte 0b0010100000001111101111010011001110010100010011011000100001\n" // Cubone - ".8byte 0b0010100000001111101111010011001110010100010111011000100001\n" // Marowak - ".8byte 0b0010100000001111100100000011000110000100110000011010100001\n" // Hitmonlee - ".8byte 0b0010100000001111100100000011000110000100110000011010100001\n" // Hitmonchan - ".8byte 0b0010110100001111100111011011101111111100110111011000100101\n" // Lickitung - ".8byte 0b0001000000001111110010111010100101100100110000111000100000\n" // Koffing - ".8byte 0b0001000000001111110010111010100101100100110100111000100000\n" // Weezing - ".8byte 0b0010100000001111100111011010001111110100110011011000110000\n" // Rhyhorn - ".8byte 0b0010110100001111100111011011001111110100110111011000110001\n" // Rhydon - ".8byte 0b0011100001100111100111011011110111111110111111011001101101\n" // Chansey - ".8byte 0b0011000100001111100000100010000100001101010100011100100000\n" // Tangela - ".8byte 0b0010110100001111101111011011101111111100110111011001110101\n" // Kangaskhan - ".8byte 0b1100010000000111100000000010000100000100110011001001100100\n" // Horsea - ".8byte 0b1100010000000111100000000010000100000100110111001001100100\n" // Seadra - ".8byte 0b1100010000000111100000000010000100000100110011001001100100\n" // Goldeen - ".8byte 0b1100010000000111100000000010000100000100110111001001100100\n" // Seaking - ".8byte 0b1101010000000011100000000110010101100100111011001001100100\n" // Staryu - ".8byte 0b1101010000100011100000000110010101100100111111001001100100\n" // Starmie - ".8byte 0b0001000001101111110000001111110101101110111100111000101001\n" // Mr. mime - ".8byte 0b0010000100011111101000000010000100000100110100011000100000\n" // Scyther - ".8byte 0b0001000000101111110000000111110100000100111111101001101101\n" // Jynx - ".8byte 0b0011100000001111100000001011010101110100111100001000100001\n" // Electabuzz - ".8byte 0b0010100000001111100010010011010100010100010100011000100001\n" // Magmar - ".8byte 0b0010100100001111100100000011001110000100110100011010100001\n" // Pinsir - ".8byte 0b0010110000000111100111011010000111111100110111011000100100\n" // Tauros - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // Magikarp - ".8byte 0b1110110000000111110011010010000111100100110111101001110100\n" // Gyarados - ".8byte 0b1110110000000111100000001010010101110110110111001001110100\n" // Lapras - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // Ditto - ".8byte 0b0000000000000111100000000010101100010100110000011000100000\n" // Eevee - ".8byte 0b1100010000000111100000000010101100010100110111011001110100\n" // Vaporeon - ".8byte 0b0001000000000111100000001010101101110100110100011000110000\n" // Jolteon - ".8byte 0b0000000010000111100010010010101100010100110100011000110000\n" // Flareon - ".8byte 0b0001000000001011101000001010110101111100110111011000100000\n" // Porygon - ".8byte 0b1110010000001111100101000010000100000100110011001001100100\n" // Omanyte - ".8byte 0b1110010000001111100101000010000100000100110111001001100100\n" // Omastar - ".8byte 0b0110010000001111101101000010001100000101110011001001100100\n" // Kabuto - ".8byte 0b1110010100001111101101000011001100000101110111001001100100\n" // Kabutops - ".8byte 0b0010101000011111111111010010000110010100110100111000110010\n" // Aerodactyl - ".8byte 0b0000110000000111100111011011110111101100110111011000100101\n" // Snorlax - ".8byte 0b0010001000010011101001000110000100000100110111011001110100\n" // Articuno - ".8byte 0b0011001000010011101001001010000101100100111100011000110000\n" // Zapdos - ".8byte 0b0010001010010011101011010010000100000110110100011000110000\n" // Moltres - ".8byte 0b0100010000000111100010011010000101110110110111011001100100\n" // Dratini - ".8byte 0b0100010000000111100010011010000101110110110111011001100100\n" // Dragonair - ".8byte 0b1110111100010111101111011011000111110110110111011001110111\n" // Dragonite - ".8byte 0b0011100001100011111111011111110111111110111111111011101101\n" // Mewtwo - ".8byte 0b1111111111111111111111111111111111111111111111111111111111\n" // Mew - ".8byte 0b0001000100000111100000000110000100011111011000011100100000\n" // Chikorita - ".8byte 0b0011100100000111100000000110000100011111011000011100100000\n" // Bayleef - ".8byte 0b0011100100000111100000000110000110011111011100011100100000\n" // Meganium - ".8byte 0b0000000110000111101010010010001100000100010000011000100000\n" // Cyndaquil - ".8byte 0b0010100110000111101010010011001100000100010000011000110001\n" // Quilava - ".8byte 0b0010100110000111101010010011001110000100010100011000110001\n" // Typhlosion - ".8byte 0b1100010100000111101000000011001100010100110011001001100101\n" // Totodile - ".8byte 0b1110110100000111101000000011001100010100110011001001110101\n" // Croconaw - ".8byte 0b1110110100000111101000000011001110010100110111001001110111\n" // Feraligatr - ".8byte 0b0000010100001111100000011011101100111100110001011000100101\n" // Sentret - ".8byte 0b0010110100001111100000011011101101111100110111011000100101\n" // Furret - ".8byte 0b0001001000011111101000000110110100000100110000011000100000\n" // Hoothoot - ".8byte 0b0001001000011111101000000110110100000100110100011000100000\n" // Noctowl - ".8byte 0b0001000000001111101000000111001100001111011000011000100001\n" // Ledyba - ".8byte 0b0001000000001111101000000111001100001111011100011000100001\n" // Ledian - ".8byte 0b0001000000001111100000100010011100001101010000011000100000\n" // Spinarak - ".8byte 0b0001000000001111100000100010011100001101010100011000100000\n" // Ariados - ".8byte 0b0000001001011111111000100010100100000101110100111000100000\n" // Crobat - ".8byte 0b1101010000000111100000001010000101100100110011001001100100\n" // Chinchou - ".8byte 0b1101010000000111100000001010000101100100110111001001100100\n" // Lanturn - ".8byte 0b0001000000000111100000001010000101110100111000001000100000\n" // Pichu - ".8byte 0b0001000000000111100010011110111100011110111000011000100100\n" // Cleffa - ".8byte 0b0001000000000111100010011110111100001110111000011000100100\n" // Igglybuff - ".8byte 0b0011000000000111100010011110110100001110111000011000100100\n" // Togepi - ".8byte 0b0011001000010111101010011111110100001110111100011000100101\n" // Togetic - ".8byte 0b0001000000111111101000000110110100001101111000011000101000\n" // Natu - ".8byte 0b0001001000111111101000000110110100001101111100011000101000\n" // Xatu - ".8byte 0b0001000000000111100000001010000101110100111000001000100000\n" // Mareep - ".8byte 0b0011100000000111100000001011000101110100111000001000100001\n" // Flaaffy - ".8byte 0b0011100000000111100000001011000101110100111100001000100001\n" // Ampharos - ".8byte 0b0001000100000111100000100010000100001111010100011100100000\n" // Bellossom - ".8byte 0b1110110000000111100000000011001100010100110011001001100101\n" // Marill - ".8byte 0b1110110000000111100000000011001100010100110111001001100101\n" // Azumarill - ".8byte 0b0010100000001111100101000011001110000100010000111000101001\n" // Sudowoodo - ".8byte 0b1110110000001111100000000011011110000100110111001001100101\n" // Politoed - ".8byte 0b0001000000000111101000000010000100001101010000011100100000\n" // Hoppip - ".8byte 0b0001000000000111101000000010000100001101010000011100100000\n" // Skiploom - ".8byte 0b0001000000000111101000000010000100001101010100011100100000\n" // Jumpluff - ".8byte 0b0010100101001111101000001011101101111100110000111000100101\n" // Aipom - ".8byte 0b0001000100000111100000100010000100001111011000011100100000\n" // Sunkern - ".8byte 0b0001000100000111100000100010000100001111011100011100100000\n" // Sunflora - ".8byte 0b0001000000011111101000000010110100001101010000011000100000\n" // Yanma - ".8byte 0b1111010000000111100001100010001110010100110011001001100100\n" // Wooper - ".8byte 0b1111110000000111100101100011001110010100110111001001100101\n" // Quagsire - ".8byte 0b0001000100100111100000000110111100010100111100011000101000\n" // Espeon - ".8byte 0b0001000101000111110000000010111100010100110100111000100000\n" // Umbreon - ".8byte 0b0000001001011111111000000010100100000100110000111000101000\n" // Murkrow - ".8byte 0b1011110000100111100010010011111110010110110111011001101101\n" // Slowking - ".8byte 0b0001000001101111111000001010110101100100110000111000101000\n" // Misdreavus - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // Unown - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // Wobbuffet - ".8byte 0b0011100000101111100000001110110111110100111000011000101000\n" // Girafarig - ".8byte 0b0010100000000111100001000110001110001101011000011000100000\n" // Pineco - ".8byte 0b0010100000000111100001000110001110001101011100011000100000\n" // Forretress - ".8byte 0b0010100000001111100110011010101111111100110011011000101100\n" // Dunsparce - ".8byte 0b0010100100011111101101100010001110010100110000011000100000\n" // Gligar - ".8byte 0b0010100100000111110101000010001110010100010100111000110000\n" // Steelix - ".8byte 0b0010100010001111110010111011101111101100110000111010110101\n" // Snubbull - ".8byte 0b0010100010001111110110111011101111111100110100111010110101\n" // Granbull - ".8byte 0b1100010000000111100000101010100100000100110011001001100100\n" // Qwilfish - ".8byte 0b0010100100011111101001000010000100000100110100011000100000\n" // Scizor - ".8byte 0b0011100000000111100101100010001110000110010000011000100000\n" // Shuckle - ".8byte 0b0010100100001111100100000011001110000100110100011010100001\n" // Heracross - ".8byte 0b0010110101001111111000000011101100010100110011111001101001\n" // Sneasel - ".8byte 0b0010100100001111111000000011001110000100110000111010110001\n" // Teddiursa - ".8byte 0b0010100100001111111100000011001110000100110100111010110001\n" // Ursaring - ".8byte 0b0010000010000111100010010110000100000100011000011000100000\n" // Slugma - ".8byte 0b0010100010000111100111010110000110000100011100011000100000\n" // Magcargo - ".8byte 0b0010100000000111100101000110001110000100111011001001110000\n" // Swinub - ".8byte 0b0010100000000111100101000110001110000100111111001001110000\n" // Piloswine - ".8byte 0b0010110000000111100101000110111110000110111011011001101100\n" // Corsola - ".8byte 0b1100010000001111100010010010010100000100110111011000100100\n" // Remoraid - ".8byte 0b1100010000001111100010110010010100000100110111011100100100\n" // Octillery - ".8byte 0b0000001000001111101000000010000100000100110011001001100101\n" // Delibird - ".8byte 0b1100010000000111101000000010000110000100110011001001100100\n" // Mantine - ".8byte 0b0010001100011111111001000010000100000100010000111000110000\n" // Skarmory - ".8byte 0b0010000011001111110010110010100100011100010000111000110000\n" // Houndour - ".8byte 0b0010100011001111110010110010100100011100010100111000110000\n" // Houndoom - ".8byte 0b1100010000000111100000000010000100000100110111001001100100\n" // Kingdra - ".8byte 0b0010100000000111100101000010000110010100010000011000110000\n" // Phanpy - ".8byte 0b0010100000000111100101000010000110010100010100011000110000\n" // Donphan - ".8byte 0b0001000000001011101000001010110101111100110111011000100000\n" // Porygon2 - ".8byte 0b0001000000101111100000001110110111111100111000011000111000\n" // Stantler - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // Smeargle - ".8byte 0b0010100000001111100000000011000110000100110000011010100000\n" // Tyrogue - ".8byte 0b0010100000001111100001000011001110000100110000011010100000\n" // Hitmontop - ".8byte 0b0001000000101111100000000110110100000100111011001001101100\n" // Smoochum - ".8byte 0b0011000000001111100000001011010101100100111000001000100001\n" // Elekid - ".8byte 0b0010000000001111100010010011010100010100010000011000100001\n" // Magby - ".8byte 0b0010110000000111100101001011100111111100110111011000100101\n" // Miltank - ".8byte 0b0011100001100111100111011011110111111110111111011001101101\n" // Blissey - ".8byte 0b0011100100000011100001001110001101110100110100011000111000\n" // Raikou - ".8byte 0b0011100100000011100011010110001100011100110100011000111000\n" // Entei - ".8byte 0b1110010100000011100001000110001100010100110111011001111100\n" // Suicune - ".8byte 0b0010000000000111110001000011001110000100110100111000100000\n" // Larvitar - ".8byte 0b0010000000000111110001000011001110000100110100111000100000\n" // Pupitar - ".8byte 0b0010110100000111111111011011001111110100110111111000110111\n" // Tyranitar - ".8byte 0b1110111000110011101001001110110111110111111111011001111100\n" // Lugia - ".8byte 0b0011101010010011101011011110110111101111111100011000111000\n" // Ho-Oh - ".8byte 0b0001000100100011101001001110110100001111111100011000101100\n" // Celebi - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? - ".8byte 0b0011100100000111101100000011001100011111010000011100100001\n" // Treecko - ".8byte 0b0011100100000111101100000011001100011111010000011100100001\n" // Grovyle - ".8byte 0b0011100100000111101100000011001110011111010100011100110011\n" // Sceptile - ".8byte 0b0010100110000111101110010010001100000100010000011000100000\n" // Torchic - ".8byte 0b0010100110000111101110010011001100000100010000011010100001\n" // Combusken - ".8byte 0b0010100110000111101110010011001110000100010100011010110001\n" // Blaziken - ".8byte 0b1110110000000111100100000010001100010100110011001001100100\n" // Mudkip - ".8byte 0b1110110000000111100100000010001110010100110011001001100100\n" // Marshtomp - ".8byte 0b1110110000000111100100000011001110010100110111001001110101\n" // Swampert - ".8byte 0b0010000001001111110000000010101100010100110000111000110000\n" // Poochyena - ".8byte 0b0010100001001111110000000010101100010100110100111000110000\n" // Mightyena - ".8byte 0b0010010100001111100000001010101101110100110011011000100100\n" // Zigzagoon - ".8byte 0b0010110100001111100000001010101101110100110111011000110100\n" // Linoone - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // Wurmple - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // Silcoon - ".8byte 0b0001000000001111101000000010110100001111010100011000100000\n" // Beautifly - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // Cascoon - ".8byte 0b0001000000001111101000100010110100001101011100011000100000\n" // Dustox - ".8byte 0b0001010000001111100000000010000100001101110011011101100100\n" // Lotad - ".8byte 0b1111110000001111100000000011000100001101110011011101100100\n" // Lombre - ".8byte 0b1111110000001111100000000011000100001101110111011101100101\n" // Ludicolo - ".8byte 0b0011000000000111100000000010101100001101010000011100100000\n" // Seedot - ".8byte 0b0011100100001111110100000011101100001101010100011100100000\n" // Nuzleaf - ".8byte 0b0011100100001111111100000011101100001101010100011100100000\n" // Shiftry - ".8byte 0b0001000100000011101001000010101100001101010000011000100000\n" // Nincada - ".8byte 0b0001000100001111101001000010101100001101010100011000100000\n" // Ninjask - ".8byte 0b0001000100001011101001000010101100001101010100011000100000\n" // Shedinja - ".8byte 0b0000001000011111101000000010000100000100110000011000100000\n" // Taillow - ".8byte 0b0000001000011111101000000010000100000100110100011000100000\n" // Swellow - ".8byte 0b0001000001000111100000100010000100001111010000011100100000\n" // Shroomish - ".8byte 0b0011100101000111100000100011000100011111010100011110100001\n" // Breloom - ".8byte 0b0011100001101111100100001011111100000110110000011000101101\n" // Spinda - ".8byte 0b0000001000011111101000001010000100000100110011001001100100\n" // Wingull - ".8byte 0b0000011000011111101000001010000100000100110111001001100100\n" // Pelipper - ".8byte 0b0001000000001111100000000010100100001101110011011000100100\n" // Surskit - ".8byte 0b0001000000001111101000000010100100001101110111011000100100\n" // Masquerain - ".8byte 0b1110110000000111100100000010000110000100110011001001110100\n" // Wailmer - ".8byte 0b1110110000000111100100000010000110000100110111001001110100\n" // Wailord - ".8byte 0b0001000000000111100000001010101101111110110011011000101100\n" // Skitty - ".8byte 0b0011100000000111100000001010101101111110110111011000101100\n" // Delcatty - ".8byte 0b0011100101101111101110011011101101111100110011011000100101\n" // Kecleon - ".8byte 0b0001000000100011100101000110111110001100111001011000100000\n" // Baltoy - ".8byte 0b0011100000100011100101000110111110001100111101011000100000\n" // Claydol - ".8byte 0b0010100000000111110101001010000111100100010000111000100000\n" // Nosepass - ".8byte 0b0010100010000111100010110010000100010100010000011000100000\n" // Torkoal - ".8byte 0b0011000101001111111100001011111100000100110000111000101101\n" // Sableye - ".8byte 0b1100010000000111100101000010000110000100110011001001100100\n" // Barboach - ".8byte 0b1110110000000111100101000010000110000100110111001001100100\n" // Whiscash - ".8byte 0b1100010000000111100000000010000100000110110011001001100100\n" // Luvdisc - ".8byte 0b0110110100000111101100100011001100000100110011101001100100\n" // Corphish - ".8byte 0b1110110100000111101100100011001100000100110111101001100100\n" // Crawdaunt - ".8byte 0b1100010000000111100000000010000100000100110011001001100100\n" // Feebas - ".8byte 0b1100010000000111100000000010000100010110110111001001100100\n" // Milotic - ".8byte 0b1100010000001111110000000010000100000100110011101001100100\n" // Carvanha - ".8byte 0b1110110000001111110100000010000110000100110111101001110100\n" // Sharpedo - ".8byte 0b0010100000000111100101000010001110001101010100011000100000\n" // Trapinch - ".8byte 0b0010101000010111100101000010001110001101010100011000100000\n" // Vibrava - ".8byte 0b0010101000010111100111010010001110011101010100011000100010\n" // Flygon - ".8byte 0b0010110000000111100100000011001110000100110000011010100001\n" // Makuhita - ".8byte 0b0010110000000111100100000011001110000100110100011010100001\n" // Hariyama - ".8byte 0b0001100000001111100000001010000101110100110000001000110000\n" // Electrike - ".8byte 0b0001100000001111100000001010000101110100110100001000110000\n" // Manectric - ".8byte 0b0010100010000111100111010010001110000100010000011000100000\n" // Numel - ".8byte 0b0010100010000111100111010010001110000100010100011000110000\n" // Camerupt - ".8byte 0b1110110000000111100100000010000110010100110011001001100100\n" // Spheal - ".8byte 0b1110110000000111100100000010000110010100110011001001110100\n" // Sealeo - ".8byte 0b1110110000000111100100000010000110010100110111001001110100\n" // Walrein - ".8byte 0b0001000100000111100001000010000100001101010000011100100001\n" // Cacnea - ".8byte 0b0001100100000111100001000010000100001101010100011100100001\n" // Cacturne - ".8byte 0b0001000000000111100000000010100100000110111011001001100100\n" // Snorunt - ".8byte 0b0001000000000111110000000010100110000110111111101001100100\n" // Glalie - ".8byte 0b0001000000100011100101000110110110000110111101001000101000\n" // Lunatone - ".8byte 0b0001000010100011100111010110110110001110011100011000101000\n" // Solrock - ".8byte 0b0100010000000111100000000010000100010100110011001001100100\n" // Azurill - ".8byte 0b0001000001101111110000001110110100010100111000111000101000\n" // Spoink - ".8byte 0b0001000001101111110000001110110100010100111100111000101001\n" // Grumpig - ".8byte 0b0001000000000111100000001010000101110100111000001000100000\n" // Plusle - ".8byte 0b0001000000000111100000001010000101110100111000001000100000\n" // Minun - ".8byte 0b0010100000000111110111110011000100001100110101111000100001\n" // Mawile - ".8byte 0b0011100000000111100100000111110100000100111000011010101001\n" // Meditite - ".8byte 0b0011100000000111100100000111110100000100111100011010101001\n" // Medicham - ".8byte 0b0000001000011111101000000010000100001110110001011000100000\n" // Swablu - ".8byte 0b0010001000011111101010010010000110011110110101011000110010\n" // Altaria - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // Wynaut - ".8byte 0b0001000001101111110000000010110100000100110011111000101000\n" // Duskull - ".8byte 0b0011100001101111110100000010110110000100110111111000101001\n" // Dusclops - ".8byte 0b0001000100000111100000100010100100001101010000011100100000\n" // Roselia - ".8byte 0b0010100100000111101010011011100101101100110011011010100101\n" // Slakoth - ".8byte 0b0010100100000111101010011011100111101100110011111010110101\n" // Vigoroth - ".8byte 0b0010100100000111101010011011100111101100110111111010110101\n" // Slaking - ".8byte 0b0010100001000111100000101010100100001101110001011100100100\n" // Gulpin - ".8byte 0b0010100001000111100000101010100100001101110101011100100100\n" // Swalot - ".8byte 0b0011101100010111101000000010000110001111010100011100110000\n" // Tropius - ".8byte 0b0000000000000111100010011010100100001100110011011000110100\n" // Whismur - ".8byte 0b0010100010000111110010011011100110001100110011111000110100\n" // Loudred - ".8byte 0b0010100010000111110010011011100110001100110111111000110100\n" // Exploud - ".8byte 0b1100010000000111100000000010000100000100110011001001100100\n" // Clamperl - ".8byte 0b1100010001000111100100000010000100000100110111001001100100\n" // Huntail - ".8byte 0b1100010000000111100000000010110100000110110111001001100100\n" // Gorebyss - ".8byte 0b0011100101001111111011011010100101110100110111111001101100\n" // Absol - ".8byte 0b0001000001101111110000001010110101100100110000111000101000\n" // Shuppet - ".8byte 0b0001000001101111110000001010110101100100110100111000101000\n" // Banette - ".8byte 0b0010100001001111100000110010001110010101110000111000100000\n" // Seviper - ".8byte 0b0010100000001111101010011011101101111101110011111000110101\n" // Zangoose - ".8byte 0b1110010000000111100101000010000110000110110111001001101100\n" // Relicanth - ".8byte 0b0010100100000111101101001010001110010100110000011000110100\n" // Aron - ".8byte 0b0010100100000111101101001010001110010100110000011000110100\n" // Lairon - ".8byte 0b0010110100000111101111011011001111111100110111111000110111\n" // Aggron - ".8byte 0b0001000000001111100011011010100101101100110011011001100100\n" // Castform - ".8byte 0b0001000000001111101000001011100101101101111000011000100101\n" // Volbeat - ".8byte 0b0001000000001111101000001011100101101101111000011000100101\n" // Illumise - ".8byte 0b0000000000000111100001100010000100001101010000011100100000\n" // Lileep - ".8byte 0b0010100000000111100101100010000110001101010100011100100000\n" // Cradily - ".8byte 0b0010000100000111101101000011001100000100010000011000100100\n" // Anorith - ".8byte 0b0010100100000111101101000011001110010100010100011000100100\n" // Armaldo - ".8byte 0b0001000001101111110000001110110100100110111000111000101000\n" // Ralts - ".8byte 0b0001000001101111110000001110110100100110111000111000101000\n" // Kirlia - ".8byte 0b0001000001101111110000001110110100100110111100111000101000\n" // Gardevoir - ".8byte 0b0010100100000111101110010011000100000100110000011000110010\n" // Bagon - ".8byte 0b0010100100000111101110010011000100000100110000011000110010\n" // Shelgon - ".8byte 0b0010101100010111101110010011000110010100110100011000110010\n" // Salamence - ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // Beldum - ".8byte 0b0011100100000011101101100111110110000100111100011000100000\n" // Metang - ".8byte 0b0011100100000011101101100111110110000100111100011000100000\n" // Metagross - ".8byte 0b0010100000000011100101001011001111100110010100011000100001\n" // Regirock - ".8byte 0b0010100000000011100000001011000111100110110111001001100001\n" // Regice - ".8byte 0b0010100000000011101101001011000111100110110100011000100001\n" // Registeel - ".8byte 0b1110110000000011100100001011000111100110110111001001111100\n" // Kyogre - ".8byte 0b0010100110000011101111011011001111111110010100011010110010\n" // Groudon - ".8byte 0b1110111010000011101011011011000111111100110111011010110110\n" // Rayquaza - ".8byte 0b1101011100010111101001001110110111101110111101011000111110\n" // Latias - ".8byte 0b1101011100010111101001001110110111101110111101011000111110\n" // Latios - ".8byte 0b0001000000100011101001001110110101100110111100011000101100\n" // Jirachi - ".8byte 0b0011100101100011111100001111110101101110111101111000101101\n" // Deoxys - ".8byte 0b0001000001100111110000001110110100000110111000111000101000\n" // Chimecho -); - -#endif //POKERUBY_TMHM_LEARNSETS_H +#ifndef GUARD_TMHM_LEARNSETS_H +#define GUARD_TMHM_LEARNSETS_H + +#define TMHM_LEARNSET(moves) {(u32)(moves), ((u64)(moves) >> 32)} +#define TMHM(tmhm) ((u64)1 << (ITEM_##tmhm - ITEM_TM01_FOCUS_PUNCH)) + +// This table determines which TMs and HMs a species is capable of learning. +// Each entry is a 64-bit bit array spread across two 32-bit values, with +// each bit corresponding to a . +const u32 gTMHMLearnsets[][2] = +{ + [SPECIES_NONE] = TMHM_LEARNSET(0), + + [SPECIES_BULBASAUR] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_IVYSAUR] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_VENUSAUR] = TMHM_LEARNSET(TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_CHARMANDER] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM02_DRAGON_CLAW) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM50_OVERHEAT) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_CHARMELEON] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM02_DRAGON_CLAW) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM50_OVERHEAT) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_CHARIZARD] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM02_DRAGON_CLAW) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM47_STEEL_WING) + | TMHM(TM50_OVERHEAT) + | TMHM(HM01_CUT) + | TMHM(HM02_FLY) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_SQUIRTLE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_WARTORTLE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_BLASTOISE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_CATERPIE] = TMHM_LEARNSET(0), + + [SPECIES_METAPOD] = TMHM_LEARNSET(0), + + [SPECIES_BUTTERFREE] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM48_SKILL_SWAP) + | TMHM(HM05_FLASH)), + + [SPECIES_WEEDLE] = TMHM_LEARNSET(0), + + [SPECIES_KAKUNA] = TMHM_LEARNSET(0), + + [SPECIES_BEEDRILL] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_PIDGEY] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM47_STEEL_WING) + | TMHM(HM02_FLY)), + + [SPECIES_PIDGEOTTO] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM47_STEEL_WING) + | TMHM(HM02_FLY)), + + [SPECIES_PIDGEOT] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM47_STEEL_WING) + | TMHM(HM02_FLY)), + + [SPECIES_RATTATA] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_RATICATE] = TMHM_LEARNSET(TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_SPEAROW] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM47_STEEL_WING) + | TMHM(HM02_FLY)), + + [SPECIES_FEAROW] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM47_STEEL_WING) + | TMHM(HM02_FLY)), + + [SPECIES_EKANS] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM49_SNATCH) + | TMHM(HM04_STRENGTH)), + + [SPECIES_ARBOK] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM49_SNATCH) + | TMHM(HM04_STRENGTH)), + + [SPECIES_PIKACHU] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_RAICHU] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_SANDSHREW] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_SANDSLASH] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_NIDORAN_F] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_NIDORINA] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_NIDOQUEEN] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_NIDORAN_M] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_NIDORINO] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_NIDOKING] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_CLEFAIRY] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM49_SNATCH) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH)), + + [SPECIES_CLEFABLE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM49_SNATCH) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH)), + + [SPECIES_VULPIX] = TMHM_LEARNSET(TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM50_OVERHEAT)), + + [SPECIES_NINETALES] = TMHM_LEARNSET(TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM50_OVERHEAT)), + + [SPECIES_JIGGLYPUFF] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM49_SNATCH) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH)), + + [SPECIES_WIGGLYTUFF] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM49_SNATCH) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH)), + + [SPECIES_ZUBAT] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM47_STEEL_WING) + | TMHM(TM49_SNATCH)), + + [SPECIES_GOLBAT] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM47_STEEL_WING) + | TMHM(TM49_SNATCH)), + + [SPECIES_ODDISH] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM05_FLASH)), + + [SPECIES_GLOOM] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM05_FLASH)), + + [SPECIES_VILEPLUME] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM05_FLASH)), + + [SPECIES_PARAS] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_PARASECT] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_VENONAT] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM48_SKILL_SWAP) + | TMHM(HM05_FLASH)), + + [SPECIES_VENOMOTH] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM48_SKILL_SWAP) + | TMHM(HM05_FLASH)), + + [SPECIES_DIGLETT] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_DUGTRIO] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_MEOWTH] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM49_SNATCH) + | TMHM(HM01_CUT) + | TMHM(HM05_FLASH)), + + [SPECIES_PERSIAN] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM49_SNATCH) + | TMHM(HM01_CUT) + | TMHM(HM05_FLASH)), + + [SPECIES_PSYDUCK] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_GOLDUCK] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_MANKEY] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM08_BULK_UP) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM50_OVERHEAT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_PRIMEAPE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM08_BULK_UP) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM50_OVERHEAT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_GROWLITHE] = TMHM_LEARNSET(TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM50_OVERHEAT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_ARCANINE] = TMHM_LEARNSET(TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM50_OVERHEAT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_POLIWAG] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM29_PSYCHIC) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM03_SURF) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_POLIWHIRL] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM29_PSYCHIC) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_POLIWRATH] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM08_BULK_UP) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM29_PSYCHIC) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_ABRA] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM48_SKILL_SWAP) + | TMHM(TM49_SNATCH) + | TMHM(HM05_FLASH)), + + [SPECIES_KADABRA] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM48_SKILL_SWAP) + | TMHM(TM49_SNATCH) + | TMHM(HM05_FLASH)), + + [SPECIES_ALAKAZAM] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM48_SKILL_SWAP) + | TMHM(TM49_SNATCH) + | TMHM(HM05_FLASH)), + + [SPECIES_MACHOP] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM08_BULK_UP) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_MACHOKE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM08_BULK_UP) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_MACHAMP] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM08_BULK_UP) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_BELLSPROUT] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM05_FLASH)), + + [SPECIES_WEEPINBELL] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM05_FLASH)), + + [SPECIES_VICTREEBEL] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM05_FLASH)), + + [SPECIES_TENTACOOL] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM03_SURF) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_TENTACRUEL] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM03_SURF) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_GEODUDE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_GRAVELER] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_GOLEM] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_PONYTA] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM50_OVERHEAT) + | TMHM(HM04_STRENGTH)), + + [SPECIES_RAPIDASH] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM50_OVERHEAT) + | TMHM(HM04_STRENGTH)), + + [SPECIES_SLOWPOKE] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM48_SKILL_SWAP) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM08_DIVE)), + + [SPECIES_SLOWBRO] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM48_SKILL_SWAP) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM08_DIVE)), + + [SPECIES_MAGNEMITE] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(HM05_FLASH)), + + [SPECIES_MAGNETON] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(HM05_FLASH)), + + [SPECIES_FARFETCHD] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM47_STEEL_WING) + | TMHM(HM01_CUT) + | TMHM(HM02_FLY)), + + [SPECIES_DODUO] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM47_STEEL_WING) + | TMHM(HM02_FLY)), + + [SPECIES_DODRIO] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM47_STEEL_WING) + | TMHM(HM02_FLY)), + + [SPECIES_SEEL] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM03_SURF) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_DEWGONG] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM03_SURF) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_GRIMER] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF)), + + [SPECIES_MUK] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_SHELLDER] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM08_DIVE)), + + [SPECIES_CLOYSTER] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM08_DIVE)), + + [SPECIES_GASTLY] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM48_SKILL_SWAP) + | TMHM(TM49_SNATCH)), + + [SPECIES_HAUNTER] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM48_SKILL_SWAP) + | TMHM(TM49_SNATCH)), + + [SPECIES_GENGAR] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM48_SKILL_SWAP) + | TMHM(TM49_SNATCH) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_ONIX] = TMHM_LEARNSET(TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_DROWZEE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM48_SKILL_SWAP) + | TMHM(TM49_SNATCH) + | TMHM(HM05_FLASH)), + + [SPECIES_HYPNO] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM48_SKILL_SWAP) + | TMHM(TM49_SNATCH) + | TMHM(HM05_FLASH)), + + [SPECIES_KRABBY] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM08_DIVE)), + + [SPECIES_KINGLER] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM08_DIVE)), + + [SPECIES_VOLTORB] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM12_TAUNT) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM46_THIEF) + | TMHM(HM05_FLASH)), + + [SPECIES_ELECTRODE] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM12_TAUNT) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM46_THIEF) + | TMHM(HM05_FLASH)), + + [SPECIES_EXEGGCUTE] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM48_SKILL_SWAP) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH)), + + [SPECIES_EXEGGUTOR] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM48_SKILL_SWAP) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH)), + + [SPECIES_CUBONE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_MAROWAK] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_HITMONLEE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM08_BULK_UP) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_HITMONCHAN] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM08_BULK_UP) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_LICKITUNG] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_KOFFING] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM05_FLASH)), + + [SPECIES_WEEZING] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM05_FLASH)), + + [SPECIES_RHYHORN] = TMHM_LEARNSET(TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_RHYDON] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_CHANSEY] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM48_SKILL_SWAP) + | TMHM(TM49_SNATCH) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_TANGELA] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_KANGASKHAN] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_HORSEA] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_SEADRA] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_GOLDEEN] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_SEAKING] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_STARYU] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(HM03_SURF) + | TMHM(HM05_FLASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_STARMIE] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM48_SKILL_SWAP) + | TMHM(HM03_SURF) + | TMHM(HM05_FLASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_MR_MIME] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM48_SKILL_SWAP) + | TMHM(TM49_SNATCH) + | TMHM(HM05_FLASH)), + + [SPECIES_SCYTHER] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM47_STEEL_WING) + | TMHM(HM01_CUT) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_JYNX] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM12_TAUNT) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM48_SKILL_SWAP) + | TMHM(HM05_FLASH)), + + [SPECIES_ELECTABUZZ] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_MAGMAR] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_PINSIR] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM08_BULK_UP) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_TAUROS] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_MAGIKARP] = TMHM_LEARNSET(0), + + [SPECIES_GYARADOS] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM12_TAUNT) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_LAPRAS] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_DITTO] = TMHM_LEARNSET(0), + + [SPECIES_EEVEE] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT)), + + [SPECIES_VAPOREON] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_JOLTEON] = TMHM_LEARNSET(TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM05_FLASH)), + + [SPECIES_FLAREON] = TMHM_LEARNSET(TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM50_OVERHEAT)), + + [SPECIES_PORYGON] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM46_THIEF) + | TMHM(HM05_FLASH)), + + [SPECIES_OMANYTE] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM03_SURF) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_OMASTAR] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM03_SURF) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_KABUTO] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM03_SURF) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL)), + + [SPECIES_KABUTOPS] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM03_SURF) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_AERODACTYL] = TMHM_LEARNSET(TMHM(TM02_DRAGON_CLAW) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM47_STEEL_WING) + | TMHM(HM02_FLY) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_SNORLAX] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH)), + + [SPECIES_ARTICUNO] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM37_SANDSTORM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM47_STEEL_WING) + | TMHM(HM02_FLY) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_ZAPDOS] = TMHM_LEARNSET(TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM37_SANDSTORM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM47_STEEL_WING) + | TMHM(HM02_FLY) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_MOLTRES] = TMHM_LEARNSET(TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM47_STEEL_WING) + | TMHM(TM50_OVERHEAT) + | TMHM(HM02_FLY) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_DRATINI] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM07_WATERFALL)), + + [SPECIES_DRAGONAIR] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM07_WATERFALL)), + + [SPECIES_DRAGONITE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM02_DRAGON_CLAW) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM47_STEEL_WING) + | TMHM(HM01_CUT) + | TMHM(HM02_FLY) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_MEWTWO] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM08_BULK_UP) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM48_SKILL_SWAP) + | TMHM(TM49_SNATCH) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_MEW] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM02_DRAGON_CLAW) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM04_CALM_MIND) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM08_BULK_UP) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM47_STEEL_WING) + | TMHM(TM48_SKILL_SWAP) + | TMHM(TM49_SNATCH) + | TMHM(TM50_OVERHEAT) + | TMHM(HM01_CUT) + | TMHM(HM02_FLY) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_CHIKORITA] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM05_FLASH)), + + [SPECIES_BAYLEEF] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_MEGANIUM] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_CYNDAQUIL] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM50_OVERHEAT) + | TMHM(HM01_CUT)), + + [SPECIES_QUILAVA] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM50_OVERHEAT) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_TYPHLOSION] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM50_OVERHEAT) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_TOTODILE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM03_SURF) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_CROCONAW] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_FERALIGATR] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM02_DRAGON_CLAW) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_SENTRET] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM03_SURF)), + + [SPECIES_FURRET] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_HOOTHOOT] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM47_STEEL_WING) + | TMHM(HM02_FLY) + | TMHM(HM05_FLASH)), + + [SPECIES_NOCTOWL] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM47_STEEL_WING) + | TMHM(HM02_FLY) + | TMHM(HM05_FLASH)), + + [SPECIES_LEDYBA] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM05_FLASH)), + + [SPECIES_LEDIAN] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM05_FLASH)), + + [SPECIES_SPINARAK] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM29_PSYCHIC) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM05_FLASH)), + + [SPECIES_ARIADOS] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM29_PSYCHIC) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM05_FLASH)), + + [SPECIES_CROBAT] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM47_STEEL_WING) + | TMHM(TM49_SNATCH) + | TMHM(HM02_FLY)), + + [SPECIES_CHINCHOU] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM05_FLASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_LANTURN] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM05_FLASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_PICHU] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM05_FLASH)), + + [SPECIES_CLEFFA] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM05_FLASH)), + + [SPECIES_IGGLYBUFF] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM05_FLASH)), + + [SPECIES_TOGEPI] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_TOGETIC] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM47_STEEL_WING) + | TMHM(HM02_FLY) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_NATU] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM47_STEEL_WING) + | TMHM(TM48_SKILL_SWAP) + | TMHM(HM05_FLASH)), + + [SPECIES_XATU] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM47_STEEL_WING) + | TMHM(TM48_SKILL_SWAP) + | TMHM(HM02_FLY) + | TMHM(HM05_FLASH)), + + [SPECIES_MAREEP] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM05_FLASH)), + + [SPECIES_FLAAFFY] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_AMPHAROS] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_BELLOSSOM] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM05_FLASH)), + + [SPECIES_MARILL] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_AZUMARILL] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_SUDOWOODO] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_POLITOED] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM29_PSYCHIC) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_HOPPIP] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM05_FLASH)), + + [SPECIES_SKIPLOOM] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM05_FLASH)), + + [SPECIES_JUMPLUFF] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM05_FLASH)), + + [SPECIES_AIPOM] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM49_SNATCH) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_SUNKERN] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM05_FLASH)), + + [SPECIES_SUNFLORA] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM05_FLASH)), + + [SPECIES_YANMA] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM47_STEEL_WING) + | TMHM(HM05_FLASH)), + + [SPECIES_WOOPER] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM37_SANDSTORM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_QUAGSIRE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_ESPEON] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM48_SKILL_SWAP) + | TMHM(HM01_CUT) + | TMHM(HM05_FLASH)), + + [SPECIES_UMBREON] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM49_SNATCH) + | TMHM(HM01_CUT) + | TMHM(HM05_FLASH)), + + [SPECIES_MURKROW] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM47_STEEL_WING) + | TMHM(TM49_SNATCH) + | TMHM(HM02_FLY)), + + [SPECIES_SLOWKING] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM48_SKILL_SWAP) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM08_DIVE)), + + [SPECIES_MISDREAVUS] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM48_SKILL_SWAP) + | TMHM(TM49_SNATCH) + | TMHM(HM05_FLASH)), + + [SPECIES_UNOWN] = TMHM_LEARNSET(0), + + [SPECIES_WOBBUFFET] = TMHM_LEARNSET(0), + + [SPECIES_GIRAFARIG] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM48_SKILL_SWAP) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_PINECO] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM37_SANDSTORM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_FORRETRESS] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM37_SANDSTORM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_DUNSPARCE] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_GLIGAR] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM47_STEEL_WING) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_STEELIX] = TMHM_LEARNSET(TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_SNUBBULL] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM08_BULK_UP) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM50_OVERHEAT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_GRANBULL] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM08_BULK_UP) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM50_OVERHEAT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_QWILFISH] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_SCIZOR] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM37_SANDSTORM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM47_STEEL_WING) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_SHUCKLE] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_HERACROSS] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM08_BULK_UP) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_SNEASEL] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM49_SNATCH) + | TMHM(HM01_CUT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_TEDDIURSA] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM08_BULK_UP) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_URSARING] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM08_BULK_UP) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_SLUGMA] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM50_OVERHEAT) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_MAGCARGO] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM50_OVERHEAT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_SWINUB] = TMHM_LEARNSET(TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_PILOSWINE] = TMHM_LEARNSET(TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_CORSOLA] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_REMORAID] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM03_SURF) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_OCTILLERY] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM03_SURF) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_DELIBIRD] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM02_FLY)), + + [SPECIES_MANTINE] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_SKARMORY] = TMHM_LEARNSET(TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM37_SANDSTORM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM47_STEEL_WING) + | TMHM(HM01_CUT) + | TMHM(HM02_FLY) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_HOUNDOUR] = TMHM_LEARNSET(TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM49_SNATCH) + | TMHM(TM50_OVERHEAT) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_HOUNDOOM] = TMHM_LEARNSET(TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM49_SNATCH) + | TMHM(TM50_OVERHEAT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_KINGDRA] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_PHANPY] = TMHM_LEARNSET(TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_DONPHAN] = TMHM_LEARNSET(TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_PORYGON2] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM46_THIEF) + | TMHM(HM05_FLASH)), + + [SPECIES_STANTLER] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM48_SKILL_SWAP) + | TMHM(HM05_FLASH)), + + [SPECIES_SMEARGLE] = TMHM_LEARNSET(0), + + [SPECIES_TYROGUE] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM08_BULK_UP) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_HITMONTOP] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM08_BULK_UP) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM37_SANDSTORM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_SMOOCHUM] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM48_SKILL_SWAP) + | TMHM(HM05_FLASH)), + + [SPECIES_ELEKID] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_MAGBY] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_MILTANK] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_BLISSEY] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM48_SKILL_SWAP) + | TMHM(TM49_SNATCH) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_RAIKOU] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM37_SANDSTORM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_ENTEI] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_SUICUNE] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM04_CALM_MIND) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM37_SANDSTORM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(HM01_CUT) + | TMHM(HM03_SURF) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_LARVITAR] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM37_SANDSTORM) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_PUPITAR] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM37_SANDSTORM) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_TYRANITAR] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM02_DRAGON_CLAW) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_LUGIA] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM04_CALM_MIND) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM37_SANDSTORM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM47_STEEL_WING) + | TMHM(TM48_SKILL_SWAP) + | TMHM(HM02_FLY) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_HO_OH] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM47_STEEL_WING) + | TMHM(TM50_OVERHEAT) + | TMHM(HM02_FLY) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_CELEBI] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM37_SANDSTORM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM48_SKILL_SWAP) + | TMHM(HM01_CUT) + | TMHM(HM05_FLASH)), + + [SPECIES_OLD_UNOWN_B] = TMHM_LEARNSET(0), + + [SPECIES_OLD_UNOWN_C] = TMHM_LEARNSET(0), + + [SPECIES_OLD_UNOWN_D] = TMHM_LEARNSET(0), + + [SPECIES_OLD_UNOWN_E] = TMHM_LEARNSET(0), + + [SPECIES_OLD_UNOWN_F] = TMHM_LEARNSET(0), + + [SPECIES_OLD_UNOWN_G] = TMHM_LEARNSET(0), + + [SPECIES_OLD_UNOWN_H] = TMHM_LEARNSET(0), + + [SPECIES_OLD_UNOWN_I] = TMHM_LEARNSET(0), + + [SPECIES_OLD_UNOWN_J] = TMHM_LEARNSET(0), + + [SPECIES_OLD_UNOWN_K] = TMHM_LEARNSET(0), + + [SPECIES_OLD_UNOWN_L] = TMHM_LEARNSET(0), + + [SPECIES_OLD_UNOWN_M] = TMHM_LEARNSET(0), + + [SPECIES_OLD_UNOWN_N] = TMHM_LEARNSET(0), + + [SPECIES_OLD_UNOWN_O] = TMHM_LEARNSET(0), + + [SPECIES_OLD_UNOWN_P] = TMHM_LEARNSET(0), + + [SPECIES_OLD_UNOWN_Q] = TMHM_LEARNSET(0), + + [SPECIES_OLD_UNOWN_R] = TMHM_LEARNSET(0), + + [SPECIES_OLD_UNOWN_S] = TMHM_LEARNSET(0), + + [SPECIES_OLD_UNOWN_T] = TMHM_LEARNSET(0), + + [SPECIES_OLD_UNOWN_U] = TMHM_LEARNSET(0), + + [SPECIES_OLD_UNOWN_V] = TMHM_LEARNSET(0), + + [SPECIES_OLD_UNOWN_W] = TMHM_LEARNSET(0), + + [SPECIES_OLD_UNOWN_X] = TMHM_LEARNSET(0), + + [SPECIES_OLD_UNOWN_Y] = TMHM_LEARNSET(0), + + [SPECIES_OLD_UNOWN_Z] = TMHM_LEARNSET(0), + + [SPECIES_TREECKO] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_GROVYLE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_SCEPTILE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM02_DRAGON_CLAW) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_TORCHIC] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM50_OVERHEAT) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_COMBUSKEN] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM08_BULK_UP) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM50_OVERHEAT) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_BLAZIKEN] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM08_BULK_UP) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM50_OVERHEAT) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_MUDKIP] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_MARSHTOMP] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_SWAMPERT] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_POOCHYENA] = TMHM_LEARNSET(TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM49_SNATCH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_MIGHTYENA] = TMHM_LEARNSET(TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM49_SNATCH) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_ZIGZAGOON] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM03_SURF) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_LINOONE] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_WURMPLE] = TMHM_LEARNSET(0), + + [SPECIES_SILCOON] = TMHM_LEARNSET(0), + + [SPECIES_BEAUTIFLY] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM05_FLASH)), + + [SPECIES_CASCOON] = TMHM_LEARNSET(0), + + [SPECIES_DUSTOX] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM05_FLASH)), + + [SPECIES_LOTAD] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM03_SURF) + | TMHM(HM05_FLASH)), + + [SPECIES_LOMBRE] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_LUDICOLO] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_SEEDOT] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_NUZLEAF] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_SHIFTRY] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_NINCADA] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM37_SANDSTORM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(HM01_CUT) + | TMHM(HM05_FLASH)), + + [SPECIES_NINJASK] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM37_SANDSTORM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM05_FLASH)), + + [SPECIES_SHEDINJA] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM37_SANDSTORM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM46_THIEF) + | TMHM(HM01_CUT) + | TMHM(HM05_FLASH)), + + [SPECIES_TAILLOW] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM47_STEEL_WING) + | TMHM(HM02_FLY)), + + [SPECIES_SWELLOW] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM47_STEEL_WING) + | TMHM(HM02_FLY)), + + [SPECIES_SHROOMISH] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM49_SNATCH) + | TMHM(HM05_FLASH)), + + [SPECIES_BRELOOM] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM08_BULK_UP) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM49_SNATCH) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_SPINDA] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM48_SKILL_SWAP) + | TMHM(TM49_SNATCH) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_WINGULL] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM47_STEEL_WING) + | TMHM(HM02_FLY)), + + [SPECIES_PELIPPER] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM47_STEEL_WING) + | TMHM(HM02_FLY) + | TMHM(HM03_SURF)), + + [SPECIES_SURSKIT] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM05_FLASH)), + + [SPECIES_MASQUERAIN] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM05_FLASH)), + + [SPECIES_WAILMER] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_WAILORD] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_SKITTY] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM05_FLASH)), + + [SPECIES_DELCATTY] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_KECLEON] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM48_SKILL_SWAP) + | TMHM(TM49_SNATCH) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_BALTOY] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM48_SKILL_SWAP) + | TMHM(HM05_FLASH)), + + [SPECIES_CLAYDOL] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM48_SKILL_SWAP) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_NOSEPASS] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_TORKOAL] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM50_OVERHEAT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_SABLEYE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM49_SNATCH) + | TMHM(HM01_CUT) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_BARBOACH] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_WHISCASH] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_LUVDISC] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_CORPHISH] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM12_TAUNT) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL)), + + [SPECIES_CRAWDAUNT] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM12_TAUNT) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_FEEBAS] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_MILOTIC] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_CARVANHA] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM12_TAUNT) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM03_SURF) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_SHARPEDO] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM12_TAUNT) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_TRAPINCH] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_VIBRAVA] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM47_STEEL_WING) + | TMHM(HM02_FLY) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_FLYGON] = TMHM_LEARNSET(TMHM(TM02_DRAGON_CLAW) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM47_STEEL_WING) + | TMHM(HM02_FLY) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_MAKUHITA] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM08_BULK_UP) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_HARIYAMA] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM08_BULK_UP) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_ELECTRIKE] = TMHM_LEARNSET(TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH)), + + [SPECIES_MANECTRIC] = TMHM_LEARNSET(TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH)), + + [SPECIES_NUMEL] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM50_OVERHEAT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_CAMERUPT] = TMHM_LEARNSET(TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM50_OVERHEAT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_SPHEAL] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_SEALEO] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_WALREIN] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_CACNEA] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM37_SANDSTORM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM05_FLASH)), + + [SPECIES_CACTURNE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM37_SANDSTORM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH)), + + [SPECIES_SNORUNT] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM05_FLASH)), + + [SPECIES_GLALIE] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM12_TAUNT) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM05_FLASH)), + + [SPECIES_LUNATONE] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM48_SKILL_SWAP) + | TMHM(HM05_FLASH)), + + [SPECIES_SOLROCK] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM48_SKILL_SWAP) + | TMHM(TM50_OVERHEAT) + | TMHM(HM05_FLASH)), + + [SPECIES_AZURILL] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM07_WATERFALL)), + + [SPECIES_SPOINK] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM48_SKILL_SWAP) + | TMHM(TM49_SNATCH) + | TMHM(HM05_FLASH)), + + [SPECIES_GRUMPIG] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM48_SKILL_SWAP) + | TMHM(TM49_SNATCH) + | TMHM(HM05_FLASH)), + + [SPECIES_PLUSLE] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM05_FLASH)), + + [SPECIES_MINUN] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM05_FLASH)), + + [SPECIES_MAWILE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_MEDITITE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM08_BULK_UP) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_MEDICHAM] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM08_BULK_UP) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_SWABLU] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM47_STEEL_WING) + | TMHM(HM02_FLY)), + + [SPECIES_ALTARIA] = TMHM_LEARNSET(TMHM(TM02_DRAGON_CLAW) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM47_STEEL_WING) + | TMHM(HM02_FLY) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_WYNAUT] = TMHM_LEARNSET(0), + + [SPECIES_DUSKULL] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM48_SKILL_SWAP) + | TMHM(TM49_SNATCH) + | TMHM(HM05_FLASH)), + + [SPECIES_DUSCLOPS] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM48_SKILL_SWAP) + | TMHM(TM49_SNATCH) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_ROSELIA] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM05_FLASH)), + + [SPECIES_SLAKOTH] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM08_BULK_UP) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_VIGOROTH] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM08_BULK_UP) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_SLAKING] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM08_BULK_UP) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_GULPIN] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM49_SNATCH) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_SWALOT] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM49_SNATCH) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_TROPIUS] = TMHM_LEARNSET(TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM47_STEEL_WING) + | TMHM(HM01_CUT) + | TMHM(HM02_FLY) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_WHISMUR] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT)), + + [SPECIES_LOUDRED] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM50_OVERHEAT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_EXPLOUD] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM50_OVERHEAT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_CLAMPERL] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_HUNTAIL] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM49_SNATCH) + | TMHM(HM03_SURF) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_GOREBYSS] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_ABSOL] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM49_SNATCH) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_SHUPPET] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM48_SKILL_SWAP) + | TMHM(TM49_SNATCH) + | TMHM(HM05_FLASH)), + + [SPECIES_BANETTE] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM48_SKILL_SWAP) + | TMHM(TM49_SNATCH) + | TMHM(HM05_FLASH)), + + [SPECIES_SEVIPER] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM49_SNATCH) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_ZANGOOSE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_RELICANTH] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM03_SURF) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_ARON] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_LAIRON] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_AGGRON] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM02_DRAGON_CLAW) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_CASTFORM] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM05_FLASH)), + + [SPECIES_VOLBEAT] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM05_FLASH)), + + [SPECIES_ILLUMISE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(HM05_FLASH)), + + [SPECIES_LILEEP] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM37_SANDSTORM) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT)), + + [SPECIES_CRADILY] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM09_BULLET_SEED) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM19_GIGA_DRAIN) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_ANORITH] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_ARMALDO] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_RALTS] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM48_SKILL_SWAP) + | TMHM(TM49_SNATCH) + | TMHM(HM05_FLASH)), + + [SPECIES_KIRLIA] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM48_SKILL_SWAP) + | TMHM(TM49_SNATCH) + | TMHM(HM05_FLASH)), + + [SPECIES_GARDEVOIR] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM46_THIEF) + | TMHM(TM48_SKILL_SWAP) + | TMHM(TM49_SNATCH) + | TMHM(HM05_FLASH)), + + [SPECIES_BAGON] = TMHM_LEARNSET(TMHM(TM02_DRAGON_CLAW) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_SHELGON] = TMHM_LEARNSET(TMHM(TM02_DRAGON_CLAW) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_SALAMENCE] = TMHM_LEARNSET(TMHM(TM02_DRAGON_CLAW) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM47_STEEL_WING) + | TMHM(HM01_CUT) + | TMHM(HM02_FLY) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_BELDUM] = TMHM_LEARNSET(0), + + [SPECIES_METANG] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_METAGROSS] = TMHM_LEARNSET(TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM36_SLUDGE_BOMB) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_REGIROCK] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_REGICE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_REGISTEEL] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM37_SANDSTORM) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_KYOGRE] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM04_CALM_MIND) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM07_HAIL) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_GROUDON] = TMHM_LEARNSET(TMHM(TM02_DRAGON_CLAW) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM08_BULK_UP) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM28_DIG) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM50_OVERHEAT) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_RAYQUAZA] = TMHM_LEARNSET(TMHM(TM02_DRAGON_CLAW) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM08_BULK_UP) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM14_BLIZZARD) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM23_IRON_TAIL) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM35_FLAMETHROWER) + | TMHM(TM37_SANDSTORM) + | TMHM(TM38_FIRE_BLAST) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM50_OVERHEAT) + | TMHM(HM02_FLY) + | TMHM(HM03_SURF) + | TMHM(HM04_STRENGTH) + | TMHM(HM06_ROCK_SMASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_LATIAS] = TMHM_LEARNSET(TMHM(TM02_DRAGON_CLAW) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM04_CALM_MIND) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM37_SANDSTORM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM47_STEEL_WING) + | TMHM(HM01_CUT) + | TMHM(HM02_FLY) + | TMHM(HM03_SURF) + | TMHM(HM05_FLASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_LATIOS] = TMHM_LEARNSET(TMHM(TM02_DRAGON_CLAW) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM04_CALM_MIND) + | TMHM(TM05_ROAR) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM26_EARTHQUAKE) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM37_SANDSTORM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM47_STEEL_WING) + | TMHM(HM01_CUT) + | TMHM(HM02_FLY) + | TMHM(HM03_SURF) + | TMHM(HM05_FLASH) + | TMHM(HM07_WATERFALL) + | TMHM(HM08_DIVE)), + + [SPECIES_JIRACHI] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM37_SANDSTORM) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM48_SKILL_SWAP) + | TMHM(HM05_FLASH)), + + [SPECIES_DEOXYS] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) + | TMHM(TM03_WATER_PULSE) + | TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM13_ICE_BEAM) + | TMHM(TM15_HYPER_BEAM) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM22_SOLARBEAM) + | TMHM(TM24_THUNDERBOLT) + | TMHM(TM25_THUNDER) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM31_BRICK_BREAK) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM39_ROCK_TOMB) + | TMHM(TM40_AERIAL_ACE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM48_SKILL_SWAP) + | TMHM(TM49_SNATCH) + | TMHM(HM01_CUT) + | TMHM(HM04_STRENGTH) + | TMHM(HM05_FLASH) + | TMHM(HM06_ROCK_SMASH)), + + [SPECIES_CHIMECHO] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) + | TMHM(TM06_TOXIC) + | TMHM(TM10_HIDDEN_POWER) + | TMHM(TM11_SUNNY_DAY) + | TMHM(TM12_TAUNT) + | TMHM(TM16_LIGHT_SCREEN) + | TMHM(TM17_PROTECT) + | TMHM(TM18_RAIN_DANCE) + | TMHM(TM20_SAFEGUARD) + | TMHM(TM21_FRUSTRATION) + | TMHM(TM27_RETURN) + | TMHM(TM29_PSYCHIC) + | TMHM(TM30_SHADOW_BALL) + | TMHM(TM32_DOUBLE_TEAM) + | TMHM(TM33_REFLECT) + | TMHM(TM34_SHOCK_WAVE) + | TMHM(TM41_TORMENT) + | TMHM(TM42_FACADE) + | TMHM(TM43_SECRET_POWER) + | TMHM(TM44_REST) + | TMHM(TM45_ATTRACT) + | TMHM(TM48_SKILL_SWAP) + | TMHM(TM49_SNATCH) + | TMHM(HM05_FLASH)), + +}; + +#endif // GUARD_TMHM_LEARNSETS_H diff --git a/src/data/pokemon/trainer_class_lookups.h b/src/data/pokemon/trainer_class_lookups.h index c86e795c4..9cffca632 100644 --- a/src/data/pokemon/trainer_class_lookups.h +++ b/src/data/pokemon/trainer_class_lookups.h @@ -1,7 +1,3 @@ -// - -// - #ifndef POKERUBY_TRAINER_CLASS_LOOKUPS_H #define POKERUBY_TRAINER_CLASS_LOOKUPS_H @@ -86,83 +82,83 @@ const u8 gTrainerClassToPicIndex[] = { }; const u8 gTrainerClassToNameIndex[] = { - TRAINER_CLASS_NAME_AQUA_LEADER, // AQUA_LEADER - TRAINER_CLASS_NAME_TEAM_AQUA, // TEAM_AQUA_M - TRAINER_CLASS_NAME_TEAM_AQUA, // TEAM_AQUA_F - TRAINER_CLASS_NAME_AROMA_LADY, // AROMA_LADY - TRAINER_CLASS_NAME_RUIN_MANIAC, // RUIN_MANIAC - TRAINER_CLASS_NAME_INTERVIEWER, // INTERVIEWER - TRAINER_CLASS_NAME_TUBER_F, // TUBER_F - TRAINER_CLASS_NAME_TUBER_M, // TUBER_M - TRAINER_CLASS_NAME_COOL_TRAINER, // COOL_TRAINER_M - TRAINER_CLASS_NAME_COOL_TRAINER, // COOL_TRAINER_F - TRAINER_CLASS_NAME_HEX_MANIAC, // HEX_MANIAC - TRAINER_CLASS_NAME_LADY, // LADY - TRAINER_CLASS_NAME_BEAUTY, // BEAUTY - TRAINER_CLASS_NAME_RICH_BOY, // RICH_BOY - TRAINER_CLASS_NAME_POKEMANIAC, // POKEMANIAC - TRAINER_CLASS_NAME_SWIMMER_M, // SWIMMER_M - TRAINER_CLASS_NAME_BLACK_BELT, // BLACK_BELT - TRAINER_CLASS_NAME_GUITARIST, // GUITARIST - TRAINER_CLASS_NAME_KINDLER, // KINDLER - TRAINER_CLASS_NAME_CAMPER, // CAMPER - TRAINER_CLASS_NAME_BUG_MANIAC, // BUG_MANIAC - TRAINER_CLASS_NAME_PSYCHIC, // PSYCHIC_M - TRAINER_CLASS_NAME_PSYCHIC, // PSYCHIC_F - TRAINER_CLASS_NAME_GENTLEMAN, // GENTLEMAN - TRAINER_CLASS_NAME_ELITE_FOUR, // ELITE_FOUR_M - TRAINER_CLASS_NAME_ELITE_FOUR, // ELITE_FOUR_F - TRAINER_CLASS_NAME_LEADER, // LEADER_F - TRAINER_CLASS_NAME_LEADER, // LEADER_M - TRAINER_CLASS_NAME_LEADER, // LEADER_MF - TRAINER_CLASS_NAME_SCHOOL_KID, // SCHOOL_KID_M - TRAINER_CLASS_NAME_SCHOOL_KID, // SCHOOL_KID_F - TRAINER_CLASS_NAME_SR_AND_JR, // SR_AND_JR - TRAINER_CLASS_NAME_POKEFAN, // POKEFAN_M - TRAINER_CLASS_NAME_POKEFAN, // POKEFAN_F - TRAINER_CLASS_NAME_EXPERT, // EXPERT_M - TRAINER_CLASS_NAME_EXPERT, // EXPERT_F - TRAINER_CLASS_NAME_YOUNGSTER, // YOUNGSTER - TRAINER_CLASS_NAME_CHAMPION, // CHAMPION - TRAINER_CLASS_NAME_FISHERMAN, // FISHERMAN - TRAINER_CLASS_NAME_TRIATHLETE, // CYCLING_TRIATHLETE_M - TRAINER_CLASS_NAME_TRIATHLETE, // CYCLING_TRIATHLETE_F - TRAINER_CLASS_NAME_TRIATHLETE, // RUNNING_TRIATHLETE_M - TRAINER_CLASS_NAME_TRIATHLETE, // RUNNING_TRIATHLETE_F - TRAINER_CLASS_NAME_TRIATHLETE, // SWIMMING_TRIATHLETE_M - TRAINER_CLASS_NAME_TRIATHLETE, // SWIMMING_TRIATHLETE_F - TRAINER_CLASS_NAME_DRAGON_TAMER, // DRAGON_TAMER - TRAINER_CLASS_NAME_BIRD_KEEPER, // BIRD_KEEPER - TRAINER_CLASS_NAME_NINJA_BOY, // NINJA_BOY - TRAINER_CLASS_NAME_BATTLE_GIRL, // BATTLE_GIRL - TRAINER_CLASS_NAME_PARASOL_LADY, // PARASOL_LADY - TRAINER_CLASS_NAME_SWIMMER_F, // SWIMMER_F - TRAINER_CLASS_NAME_PICNICKER, // PICNICKER - TRAINER_CLASS_NAME_TWINS, // TWINS - TRAINER_CLASS_NAME_SAILOR, // SAILOR - TRAINER_CLASS_NAME_BOARDER, // BOARDER_1 - TRAINER_CLASS_NAME_BOARDER, // BOARDER_2 - TRAINER_CLASS_NAME_COLLECTOR, // COLLECTOR - TRAINER_CLASS_NAME_POKEMON_TRAINER_3, // WALLY - TRAINER_CLASS_NAME_POKEMON_TRAINER_3, // BRENDAN_1 - TRAINER_CLASS_NAME_POKEMON_TRAINER_3, // BRENDAN_2 - TRAINER_CLASS_NAME_POKEMON_TRAINER_3, // BRENDAN_3 - TRAINER_CLASS_NAME_POKEMON_TRAINER_3, // MAY_1 - TRAINER_CLASS_NAME_POKEMON_TRAINER_3, // MAY_2 - TRAINER_CLASS_NAME_POKEMON_TRAINER_3, // MAY_3 - TRAINER_CLASS_NAME_POKEMON_BREEDER, // POKEMON_BREEDER_M - TRAINER_CLASS_NAME_POKEMON_BREEDER, // POKEMON_BREEDER_F - TRAINER_CLASS_NAME_POKEMON_RANGER, // POKEMON_RANGER_M - TRAINER_CLASS_NAME_POKEMON_RANGER, // POKEMON_RANGER_F - TRAINER_CLASS_NAME_MAGMA_LEADER, // MAGMA_LEADER - TRAINER_CLASS_NAME_TEAM_MAGMA, // TEAM_MAGMA_M - TRAINER_CLASS_NAME_TEAM_MAGMA, // TEAM_MAGMA_F - TRAINER_CLASS_NAME_LASS, // LASS - TRAINER_CLASS_NAME_BUG_CATCHER, // BUG_CATCHER - TRAINER_CLASS_NAME_HIKER, // HIKER - TRAINER_CLASS_NAME_YOUNG_COUPLE, // YOUNG_COUPLE - TRAINER_CLASS_NAME_OLD_COUPLE, // OLD_COUPLE - TRAINER_CLASS_NAME_SIS_AND_BRO // SIS_AND_BRO + TRAINER_CLASS_AQUA_LEADER, // AQUA_LEADER + TRAINER_CLASS_TEAM_AQUA, // TEAM_AQUA_M + TRAINER_CLASS_TEAM_AQUA, // TEAM_AQUA_F + TRAINER_CLASS_AROMA_LADY, // AROMA_LADY + TRAINER_CLASS_RUIN_MANIAC, // RUIN_MANIAC + TRAINER_CLASS_INTERVIEWER, // INTERVIEWER + TRAINER_CLASS_TUBER_F, // TUBER_F + TRAINER_CLASS_TUBER_M, // TUBER_M + TRAINER_CLASS_COOL_TRAINER, // COOL_TRAINER_M + TRAINER_CLASS_COOL_TRAINER, // COOL_TRAINER_F + TRAINER_CLASS_HEX_MANIAC, // HEX_MANIAC + TRAINER_CLASS_LADY, // LADY + TRAINER_CLASS_BEAUTY, // BEAUTY + TRAINER_CLASS_RICH_BOY, // RICH_BOY + TRAINER_CLASS_POKEMANIAC, // POKEMANIAC + TRAINER_CLASS_SWIMMER_M, // SWIMMER_M + TRAINER_CLASS_BLACK_BELT, // BLACK_BELT + TRAINER_CLASS_GUITARIST, // GUITARIST + TRAINER_CLASS_KINDLER, // KINDLER + TRAINER_CLASS_CAMPER, // CAMPER + TRAINER_CLASS_BUG_MANIAC, // BUG_MANIAC + TRAINER_CLASS_PSYCHIC, // PSYCHIC_M + TRAINER_CLASS_PSYCHIC, // PSYCHIC_F + TRAINER_CLASS_GENTLEMAN, // GENTLEMAN + TRAINER_CLASS_ELITE_FOUR, // ELITE_FOUR_M + TRAINER_CLASS_ELITE_FOUR, // ELITE_FOUR_F + TRAINER_CLASS_LEADER, // LEADER_F + TRAINER_CLASS_LEADER, // LEADER_M + TRAINER_CLASS_LEADER, // LEADER_MF + TRAINER_CLASS_SCHOOL_KID, // SCHOOL_KID_M + TRAINER_CLASS_SCHOOL_KID, // SCHOOL_KID_F + TRAINER_CLASS_SR_AND_JR, // SR_AND_JR + TRAINER_CLASS_POKEFAN, // POKEFAN_M + TRAINER_CLASS_POKEFAN, // POKEFAN_F + TRAINER_CLASS_EXPERT, // EXPERT_M + TRAINER_CLASS_EXPERT, // EXPERT_F + TRAINER_CLASS_YOUNGSTER, // YOUNGSTER + TRAINER_CLASS_CHAMPION, // CHAMPION + TRAINER_CLASS_FISHERMAN, // FISHERMAN + TRAINER_CLASS_TRIATHLETE, // CYCLING_TRIATHLETE_M + TRAINER_CLASS_TRIATHLETE, // CYCLING_TRIATHLETE_F + TRAINER_CLASS_TRIATHLETE, // RUNNING_TRIATHLETE_M + TRAINER_CLASS_TRIATHLETE, // RUNNING_TRIATHLETE_F + TRAINER_CLASS_TRIATHLETE, // SWIMMING_TRIATHLETE_M + TRAINER_CLASS_TRIATHLETE, // SWIMMING_TRIATHLETE_F + TRAINER_CLASS_DRAGON_TAMER, // DRAGON_TAMER + TRAINER_CLASS_BIRD_KEEPER, // BIRD_KEEPER + TRAINER_CLASS_NINJA_BOY, // NINJA_BOY + TRAINER_CLASS_BATTLE_GIRL, // BATTLE_GIRL + TRAINER_CLASS_PARASOL_LADY, // PARASOL_LADY + TRAINER_CLASS_SWIMMER_F, // SWIMMER_F + TRAINER_CLASS_PICNICKER, // PICNICKER + TRAINER_CLASS_TWINS, // TWINS + TRAINER_CLASS_SAILOR, // SAILOR + TRAINER_CLASS_BOARDER, // BOARDER_1 + TRAINER_CLASS_BOARDER, // BOARDER_2 + TRAINER_CLASS_COLLECTOR, // COLLECTOR + TRAINER_CLASS_POKEMON_TRAINER_3, // WALLY + TRAINER_CLASS_POKEMON_TRAINER_3, // BRENDAN_1 + TRAINER_CLASS_POKEMON_TRAINER_3, // BRENDAN_2 + TRAINER_CLASS_POKEMON_TRAINER_3, // BRENDAN_3 + TRAINER_CLASS_POKEMON_TRAINER_3, // MAY_1 + TRAINER_CLASS_POKEMON_TRAINER_3, // MAY_2 + TRAINER_CLASS_POKEMON_TRAINER_3, // MAY_3 + TRAINER_CLASS_POKEMON_BREEDER, // POKEMON_BREEDER_M + TRAINER_CLASS_POKEMON_BREEDER, // POKEMON_BREEDER_F + TRAINER_CLASS_POKEMON_RANGER, // POKEMON_RANGER_M + TRAINER_CLASS_POKEMON_RANGER, // POKEMON_RANGER_F + TRAINER_CLASS_MAGMA_LEADER, // MAGMA_LEADER + TRAINER_CLASS_TEAM_MAGMA, // TEAM_MAGMA_M + TRAINER_CLASS_TEAM_MAGMA, // TEAM_MAGMA_F + TRAINER_CLASS_LASS, // LASS + TRAINER_CLASS_BUG_CATCHER, // BUG_CATCHER + TRAINER_CLASS_HIKER, // HIKER + TRAINER_CLASS_YOUNG_COUPLE, // YOUNG_COUPLE + TRAINER_CLASS_OLD_COUPLE, // OLD_COUPLE + TRAINER_CLASS_SIS_AND_BRO // SIS_AND_BRO }; #endif //POKERUBY_TRAINER_CLASS_LOOKUPS_H diff --git a/src/de_rom_8040FE0.c b/src/de_rom_8040FE0.c index 53ad4a806..c93ef74cd 100644 --- a/src/de_rom_8040FE0.c +++ b/src/de_rom_8040FE0.c @@ -2,55 +2,34 @@ #include "battle.h" #include "battle_tower.h" #include "ewram.h" +#include "trainer.h" #if GERMAN -enum { - TRAINER_CLASS_NAME_LEADER = 25, - TRAINER_CLASS_NAME_SCHOOL_KID = 26, - TRAINER_CLASS_NAME_EXPERT = 30, - TRAINER_CLASS_NAME_POKEMON_TRAINER_3 = 46, -}; - -enum { - TRAINER_CLASS_LEADER_F = 26, - TRAINER_CLASS_ELITE_FOUR_F = 25, - TRAINER_CLASS_SCHOOL_KID_F = 30, - TRAINER_CLASS_BIRD_KEEPER = 46, - TRAINER_CLASS_MAY_1 = 61, - TRAINER_CLASS_MAY_2 = 62, - TRAINER_CLASS_MAY_3 = 63, -}; - extern u8 gTrainerClassNames[][13]; extern struct Trainer gTrainers[]; -u8 *de_sub_8040FE0(u8 gender) { +u8 *de_sub_8040FE0(u8 gender) +{ if (gender) - { gender++; - - } - - gender = TRAINER_CLASS_NAME_SCHOOL_KID; + gender = TRAINER_CLASS_SCHOOL_KID; return gTrainerClassNames[gender]; } -u8 *de_sub_8040FF4(u8 gender) { - if (gender) { +u8 *de_sub_8040FF4(u8 gender) +{ + if (gender) gender++; - } - - gender = TRAINER_CLASS_NAME_POKEMON_TRAINER_3; + gender = TRAINER_CLASS_POKEMON_TRAINER_3; return gTrainerClassNames[gender]; } -u8 *de_sub_804100C(u8 gender) { - if (gender) { +u8 *de_sub_804100C(u8 gender) +{ + if (gender) gender++; - } - - gender = TRAINER_CLASS_NAME_LEADER; + gender = TRAINER_CLASS_LEADER; return gTrainerClassNames[gender]; } @@ -60,7 +39,8 @@ u8 de_sub_81364AC(void); u8 get_trainer_class_name_index(void); u8 de_sub_81364F8(void); -u8 *de_sub_8041024(s32 arg0, u32 arg1) { +u8 *de_sub_8041024(s32 arg0, u32 arg1) +{ u8 nameIndex, trainerClass, gender; struct Trainer *trainer; u8 local2; @@ -70,69 +50,40 @@ u8 *de_sub_8041024(s32 arg0, u32 arg1) { case 0x400: nameIndex = GetSecretBaseTrainerNameIndex(); gender = eSecretBaseRecord.gender; - if (nameIndex == TRAINER_CLASS_NAME_SCHOOL_KID) - { + if (nameIndex == TRAINER_CLASS_SCHOOL_KID) return de_sub_8040FE0(gender); - } - return gTrainerClassNames[nameIndex]; - case 0x100: trainerClass = de_sub_81364AC(); nameIndex = get_trainer_class_name_index(); - if (trainerClass == TRAINER_CLASS_SCHOOL_KID_F) - { + if (trainerClass == FACILITY_CLASS_SCHOOL_KID_F) return de_sub_8040FE0(FEMALE); - } - if (trainerClass == TRAINER_CLASS_MAY_1 || trainerClass == TRAINER_CLASS_MAY_2 || trainerClass == TRAINER_CLASS_MAY_3) - { + if (trainerClass == FACILITY_CLASS_MAY_1 || trainerClass == FACILITY_CLASS_MAY_2 || trainerClass == FACILITY_CLASS_MAY_3) return de_sub_8040FF4(FEMALE); - } - return gTrainerClassNames[nameIndex]; - case 0x800: trainerClass = de_sub_81364F8(); nameIndex = GetEReaderTrainerClassNameIndex(); - if (trainerClass == TRAINER_CLASS_SCHOOL_KID_F) - { + if (trainerClass == FACILITY_CLASS_SCHOOL_KID_F) return de_sub_8040FE0(FEMALE); - } - if (trainerClass == TRAINER_CLASS_MAY_1 || trainerClass == TRAINER_CLASS_MAY_2 || trainerClass == TRAINER_CLASS_MAY_3) - { + if (trainerClass == FACILITY_CLASS_MAY_1 || trainerClass == FACILITY_CLASS_MAY_2 || trainerClass == FACILITY_CLASS_MAY_3) return de_sub_8040FF4(FEMALE); - } - return gTrainerClassNames[nameIndex]; - default: trainer = &gTrainers[arg1]; trainerClass = trainer->trainerClass; local2 = sub_803FC58(arg1); - - if (trainerClass == TRAINER_CLASS_LEADER_F) - { + if (trainerClass == FACILITY_CLASS_LEADER_F) return de_sub_8040FE0(local2); - } - - if (trainerClass == TRAINER_CLASS_BIRD_KEEPER && local2 == FEMALE) - { + if (trainerClass == FACILITY_CLASS_BIRD_KEEPER && local2 == FEMALE) return de_sub_8040FF4(FEMALE); - } - - if (trainerClass == TRAINER_CLASS_ELITE_FOUR_F) + if (trainerClass == FACILITY_CLASS_ELITE_FOUR_F) { if (gTrainers[arg1].doubleBattle == TRUE) - { return de_sub_804100C(FEMALE); - } else - { return de_sub_804100C(MALE); - } } - - return gTrainerClassNames[trainerClass]; } } @@ -264,7 +215,8 @@ _08041108: .4byte gTrainerClassNames\n\ } #endif -u32 de_sub_804110C(u32 arg0, u32 arg1) { +u32 de_sub_804110C(u32 arg0, u32 arg1) +{ return arg1; } diff --git a/src/debug/crash.c b/src/debug/crash.c new file mode 100644 index 000000000..85058d285 --- /dev/null +++ b/src/debug/crash.c @@ -0,0 +1,55 @@ +#include "global.h" +#include "main.h" +#include "task.h" +#include "text.h" +#include "palette.h" + +extern struct Window gUnknown_03004210; + +static void CB2_CrashIdle(void); + +// unused exception handler. Takes a string input describing the exception +// and halts on a black screen. Used in German Debug Ruby. +void Crash(u8 *text) +{ + u16 savedIme; + + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WIN1H = 0; + REG_WIN1V = 0; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = savedIme; + REG_DISPSTAT = 8; + ResetTasks(); + ResetSpriteData(); + SetMainCallback2(CB2_CrashIdle); + DmaFill32Large(3, 0, (void *)VRAM, 0x18000, 0x1000); + Text_LoadWindowTemplate(&gWindowTemplate_81E6FD8); + Text_InitWindowWithTemplate(&gUnknown_03004210, &gWindowTemplate_81E6FD8); + LoadFontDefaultPalette(&gWindowTemplate_81E6FD8); + Text_InitWindowAndPrintText(&gUnknown_03004210, text, 1, 9, 7); +} + +static void CB2_CrashIdle(void) +{ + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; +} diff --git a/src/debug/kagaya_debug_menu.c b/src/debug/kagaya_debug_menu.c new file mode 100644 index 000000000..3cb36ce0c --- /dev/null +++ b/src/debug/kagaya_debug_menu.c @@ -0,0 +1,183 @@ +#if DEBUG + +#include "global.h" +#include "field_effect.h" +#include "field_control_avatar.h" +#include "field_player_avatar.h" +#include "main.h" +#include "menu.h" +#include "overworld.h" +#include "palette.h" +#include "random.h" +#include "region_map.h" +#include "script.h" +#include "slot_machine.h" +#include "trainer_card.h" + +extern u8 (*gMenuCallback)(void); + +void InitKagayaDebugMenu_B(void); +u8 debug_sub_80B061C(void); +u8 KagayaDebugMenu_TrainerCard(void); +u8 debug_sub_80B068C(void); +u8 KagayaDebugMenu_CardToExchange(void); +u8 debug_sub_80B06E0(void); +u8 KagayaDebugMenu_SlotMachine(void); +u8 Kagaya_80B0734(void); +u8 debug_sub_80B07DC(void); + +const u8 Str_83EBB34[] = _("Trainer’s card"); +const u8 Str_83EBB43[] = _("Card to exchange"); +const u8 Str_83EBB54[] = _("Slot machine"); + +const struct MenuAction _83EBB64[] = +{ + { Str_83EBB34, KagayaDebugMenu_TrainerCard }, + { Str_83EBB43, KagayaDebugMenu_CardToExchange }, + { Str_83EBB54, KagayaDebugMenu_SlotMachine }, +}; + +u8 InitKagayaDebugMenu_A(void) +{ + InitKagayaDebugMenu_B(); + return 0; +} + +void InitKagayaDebugMenu_B(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 14, 7); + Menu_PrintItems(2, 1, 3, _83EBB64); + InitMenu(0, 1, 1, 3, 0, 13); + gMenuCallback = debug_sub_80B061C; +} + +u8 debug_sub_80B061C(void) +{ + s8 input = Menu_ProcessInput(); + + if (input == -2) + { + return 0; + } + else if (input == -1) + { + CloseMenu(); + return 1; + } + else + { + gMenuCallback = _83EBB64[input].func; + return 0; + } +} + +u8 KagayaDebugMenu_TrainerCard(void) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gMenuCallback = debug_sub_80B068C; + return 0; +} + +u8 debug_sub_80B068C(void) +{ + if (!UpdatePaletteFade()) + { + debug_sub_80A0710(sub_805469C); + CloseMenu(); + ScriptContext2_Enable(); + return 1; + } + return 0; +} + +u8 KagayaDebugMenu_CardToExchange(void) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gMenuCallback = debug_sub_80B06E0; + return 0; +} + +u8 debug_sub_80B06E0(void) +{ + if (!UpdatePaletteFade()) + { + debug_sub_80A073C(sub_805469C); + CloseMenu(); + ScriptContext2_Enable(); + return 1; + } + return 0; +} + +u8 KagayaDebugMenu_SlotMachine(void) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gMenuCallback = Kagaya_80B0734; + return 0; +} + +u8 Kagaya_80B0734(void) +{ + if (!UpdatePaletteFade()) + { + debug_sub_811609C(Random() % 6, sub_805469C); + CloseMenu(); + ScriptContext2_Enable(); + return 1; + } + return 0; +} + +u8 debug_sub_80B0770(void) +{ + if (!(gPlayerAvatar.flags & 8)) + { + CloseMenu(); + if (IsPlayerFacingSurfableFishableWater()) + { + gFieldEffectArguments[0] = 0; + FieldEffectStart(9); + } + } + else + { + CloseMenu(); + } + return 1; +} + +u8 debug_sub_80B07B0(void) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gMenuCallback = debug_sub_80B07DC; + return 0; +} + +u8 debug_sub_80B07DC(void) +{ + if (!UpdatePaletteFade()) + { + CloseMenu(); + SetMainCallback2(CB2_InitFlyRegionMap); + return 1; + } + return 0; +} + +u8 debug_sub_80B0800(void) +{ + u8 r2; + + CloseMenu(); + r2 = sub_8068F18(); + if (r2 != 0) + { + gFieldEffectArguments[0] = 0; + gFieldEffectArguments[1] = r2 - 1; + FieldEffectStart(0x2C); + } + return 1; +} + +#endif // DEBUG diff --git a/src/debug/matsuda_debug_menu.c b/src/debug/matsuda_debug_menu.c index bb80de6fe..efd952ef7 100644 --- a/src/debug/matsuda_debug_menu.c +++ b/src/debug/matsuda_debug_menu.c @@ -14,33 +14,24 @@ #include "string_util.h" #include "task.h" #include "text.h" -#include "unknown_task.h" +#include "scanline_effect.h" #include "ewram.h" extern u8 gUnknown_0203856C; -extern s16 gUnknown_02038670[]; -extern s16 gUnknown_02038678[]; -extern s16 gUnknown_02038680[]; -extern u8 gContestFinalStandings[]; extern u8 gUnknown_02038694; -extern u8 gIsLinkContest; -extern u8 gUnknown_0203869B; -extern u8 gContestPlayerMonIndex; extern u16 gSpecialVar_ContestCategory; extern u16 gSpecialVar_ContestRank; -extern u16 gUnknown_030042A4; -extern u16 gUnknown_030042A0; +extern u16 gBattle_BG0_X; +extern u16 gBattle_BG0_Y; extern u16 gBattle_BG1_X; extern u16 gBattle_BG1_Y; extern u16 gBattle_BG2_X; extern u16 gBattle_BG2_Y; -extern u16 gUnknown_030041B0; -extern u16 gUnknown_030041B8; -extern struct Window gUnknown_03004210; -extern u8 (*gCallback_03004AE8)(void); +extern u16 gBattle_BG3_X; +extern u16 gBattle_BG3_Y; -extern bool8 gReceivedRemoteLinkPlayers; +extern u8 (*gMenuCallback)(void); static bool8 sub_80A9B78(void); static void sub_80A9BE4(u8 taskId); @@ -247,24 +238,24 @@ static const struct OamData gUnknown_083C9400 = u8 unref_sub_80A9B28(void) { - MenuZeroFillScreen(); - MenuDrawTextWindow(0, 0, 17, 18); - PrintMenuItems(1, 1, 7, gMatsudaDebugMenuActions); + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 17, 18); + Menu_PrintItems(1, 1, 7, gMatsudaDebugMenuActions); InitMenu(0, 1, 1, 7, 0, 16); - gCallback_03004AE8 = sub_80A9B78; + gMenuCallback = sub_80A9B78; return 0; } static bool8 sub_80A9B78(void) { - s8 choice = ProcessMenuInput(); + s8 choice = Menu_ProcessInput(); switch (choice) { case -2: return FALSE; default: - gCallback_03004AE8 = gMatsudaDebugMenuActions[choice].func; + gMenuCallback = gMatsudaDebugMenuActions[choice].func; return FALSE; case -1: CloseMenu(); @@ -449,48 +440,32 @@ static void sub_80A9F50(void) { REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP; REG_DISPCNT |= DISPCNT_OBJ_ON | DISPCNT_BG0_ON; - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitWindowFromConfig(&gMenuWindow, &gWindowConfig_81E6C3C); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + Text_InitWindowWithTemplate(&gMenuWindow, &gWindowTemplate_81E6C3C); REG_MOSAIC = 0; REG_BLDCNT = 0; REG_BLDALPHA = 0; REG_BLDY = 0; REG_BG0HOFS = 0; REG_BG0VOFS = 0; - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; gBattle_BG1_X = 0; gBattle_BG1_Y = 0; gBattle_BG2_X = 0; gBattle_BG2_Y = 0; - gUnknown_030041B0 = 0; - gUnknown_030041B8 = 0; + gBattle_BG3_X = 0; + gBattle_BG3_Y = 0; } static void sub_80A9FE4(void) { - u8 *addr; - u32 i; u8 ptr[5]; memcpy(ptr, gMatsudaDebugMenu_UnknownByteArray, 5); - - addr = (void *)VRAM; - i = VRAM_SIZE; - - while (1) - { - DmaFill32(3, 0, addr, 0x1000); - addr += 0x1000; - i -= 0x1000; - if (i <= 0x1000) - { - DmaFill32(3, 0, addr, i); - break; - } - } + DmaFill32Large(3, 0, (void *)VRAM, VRAM_SIZE, 0x1000); sub_80034D4((void *)VRAM, ptr); - LoadFontDefaultPalette(&gWindowConfig_81E6C3C); + LoadFontDefaultPalette(&gWindowTemplate_81E6C3C); } static void sub_80AA064(void) @@ -505,18 +480,18 @@ static void sub_80AA064(void) static void sub_80AA090(void) { - REG_BG0HOFS = gUnknown_030042A4; - REG_BG0VOFS = gUnknown_030042A0; + REG_BG0HOFS = gBattle_BG0_X; + REG_BG0VOFS = gBattle_BG0_Y; REG_BG1HOFS = gBattle_BG1_X; REG_BG1VOFS = gBattle_BG1_Y; REG_BG2HOFS = gBattle_BG2_X; REG_BG2VOFS = gBattle_BG2_Y; - REG_BG3HOFS = gUnknown_030041B0; - REG_BG3VOFS = gUnknown_030041B8; + REG_BG3HOFS = gBattle_BG3_X; + REG_BG3VOFS = gBattle_BG3_Y; LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); - sub_8089668(); + ScanlineEffect_InitHBlankDmaTransfer(); } static void sub_80AA10C(void) @@ -528,7 +503,7 @@ static void sub_80AA10C(void) gPaletteFade.bufferTransferDisabled = 1; SetVBlankCallback(0); sub_80A9F50(); - dp12_8087EA4(); + ScanlineEffect_Clear(); ResetPaletteFade(); ResetSpriteData(); ResetTasks(); @@ -546,7 +521,7 @@ static void sub_80AA10C(void) for (i = 0; i < 6; i++) { - sub_8003460(&gMenuWindow, gMatsudaDebugMenuTextList1[i], + Text_InitWindowAndPrintText(&gMenuWindow, gMatsudaDebugMenuTextList1[i], (0xA * i + 0x2A), gMatsudaDebugMenuContestTopLeft[i][0], gMatsudaDebugMenuContestTopLeft[i][1]); } @@ -555,8 +530,8 @@ static void sub_80AA10C(void) zero = 0; // it's possible this was some assignment that matsuda used to quickly edit and test things without changing whats passed to the later functions. sub_80AA5BC(zero); sub_80AA5E8(gSpecialVar_ContestRank); - sub_8003460(&gMenuWindow, gMatsudaDebugMenu_GoBackText, 0xD6, 0x12, 0x12); - sub_8003460(&gMenuWindow, gMatsudaDebugMenu_BattlePointsText, 0xDC, zero, 0xC); + Text_InitWindowAndPrintText(&gMenuWindow, gMatsudaDebugMenu_GoBackText, 0xD6, 0x12, 0x12); + Text_InitWindowAndPrintText(&gMenuWindow, gMatsudaDebugMenu_BattlePointsText, 0xDC, zero, 0xC); LoadSpriteSheet(gUnknown_083C92B4); LoadSpritePalette(gUnknown_083C92BC); sub_80AA280(3); @@ -573,71 +548,71 @@ void sub_80AA280(u8 var) // no? { u8 i; - FillWindowRect_DefaultPalette(&gMenuWindow, 0, 0, 0, 0x1E, 3); + Text_FillWindowRectDefPalette(&gMenuWindow, 0, 0, 0, 0x1E, 3); StringCopy(gSharedMem, gMatsudaDebugMenu_StartText); StringAppend(gSharedMem, gContestMons[var].trainerName); for (i = 0; i < 4; i++) { if (var == i) - sub_8003460(&gMenuWindow, gSharedMem, 10 * i + 2, gUnknown_083C926E[i][0], gUnknown_083C926E[i][1]); + Text_InitWindowAndPrintText(&gMenuWindow, gSharedMem, 10 * i + 2, gUnknown_083C926E[i][0], gUnknown_083C926E[i][1]); else - sub_8003460(&gMenuWindow, gContestMons[i].trainerName, 10 * i + 2, gUnknown_083C926E[i][0], gUnknown_083C926E[i][1]); + Text_InitWindowAndPrintText(&gMenuWindow, gContestMons[i].trainerName, 10 * i + 2, gUnknown_083C926E[i][0], gUnknown_083C926E[i][1]); } } static void sub_80AA340(u8 var) { ConvertIntToDecimalStringN(gSharedMem, gContestMons[var].cool, STR_CONV_MODE_RIGHT_ALIGN, 3); - sub_8003460(&gMenuWindow, gSharedMem, 0x66, gUnknown_083C9282[0], gUnknown_083C9282[1]); + Text_InitWindowAndPrintText(&gMenuWindow, gSharedMem, 0x66, gUnknown_083C9282[0], gUnknown_083C9282[1]); } static void sub_80AA388(u8 var) { ConvertIntToDecimalStringN(gSharedMem, gContestMons[var].cute, STR_CONV_MODE_RIGHT_ALIGN, 3); - sub_8003460(&gMenuWindow, gSharedMem, 0x6C, gUnknown_083C9282[2], gUnknown_083C9282[3]); + Text_InitWindowAndPrintText(&gMenuWindow, gSharedMem, 0x6C, gUnknown_083C9282[2], gUnknown_083C9282[3]); } static void sub_80AA3D0(u8 var) { ConvertIntToDecimalStringN(gSharedMem, gContestMons[var].beauty, STR_CONV_MODE_RIGHT_ALIGN, 3); - sub_8003460(&gMenuWindow, gSharedMem, 0x72, gUnknown_083C9282[4], gUnknown_083C9282[5]); + Text_InitWindowAndPrintText(&gMenuWindow, gSharedMem, 0x72, gUnknown_083C9282[4], gUnknown_083C9282[5]); } static void sub_80AA418(u8 var) { ConvertIntToDecimalStringN(gSharedMem, gContestMons[var].smart, STR_CONV_MODE_RIGHT_ALIGN, 3); - sub_8003460(&gMenuWindow, gSharedMem, 0x78, gUnknown_083C9282[6], gUnknown_083C9282[7]); + Text_InitWindowAndPrintText(&gMenuWindow, gSharedMem, 0x78, gUnknown_083C9282[6], gUnknown_083C9282[7]); } static void sub_80AA460(u8 var) { ConvertIntToDecimalStringN(gSharedMem, gContestMons[var].tough, STR_CONV_MODE_RIGHT_ALIGN, 3); - sub_8003460(&gMenuWindow, gSharedMem, 0x7E, gUnknown_083C9282[8], gUnknown_083C9282[9]); + Text_InitWindowAndPrintText(&gMenuWindow, gSharedMem, 0x7E, gUnknown_083C9282[8], gUnknown_083C9282[9]); } static void sub_80AA4A8(u8 var) { ConvertIntToDecimalStringN(gSharedMem, gContestMons[var].sheen, STR_CONV_MODE_RIGHT_ALIGN, 3); - sub_8003460(&gMenuWindow, gSharedMem, 0x84, gUnknown_083C9282[10], gUnknown_083C9282[11]); + Text_InitWindowAndPrintText(&gMenuWindow, gSharedMem, 0x84, gUnknown_083C9282[10], gUnknown_083C9282[11]); } static void sub_80AA4F0(u8 var1, u8 var2) { - FillWindowRect_DefaultPalette(&gMenuWindow, 0, gUnknown_083C928E[var2][0], gUnknown_083C928E[var2][1], gUnknown_083C928E[var2][0] + 7, gUnknown_083C928E[var2][1] + 1); - sub_8003460(&gMenuWindow, gMoveNames[gContestMons[var1].moves[var2]], 0x8A + var2 * 14, gUnknown_083C928E[var2][0], gUnknown_083C928E[var2][1]); + Text_FillWindowRectDefPalette(&gMenuWindow, 0, gUnknown_083C928E[var2][0], gUnknown_083C928E[var2][1], gUnknown_083C928E[var2][0] + 7, gUnknown_083C928E[var2][1] + 1); + Text_InitWindowAndPrintText(&gMenuWindow, gMoveNames[gContestMons[var1].moves[var2]], 0x8A + var2 * 14, gUnknown_083C928E[var2][0], gUnknown_083C928E[var2][1]); ConvertIntToDecimalStringN(gStringVar1, gContestMons[var1].moves[var2], STR_CONV_MODE_LEADING_ZEROS, 3); - sub_8003460(&gMenuWindow, gStringVar1, 0xFA + var2 * 6, gUnknown_083C928E[var2][0] + 7, gUnknown_083C928E[var2][1]); + Text_InitWindowAndPrintText(&gMenuWindow, gStringVar1, 0xFA + var2 * 6, gUnknown_083C928E[var2][0] + 7, gUnknown_083C928E[var2][1]); } static void sub_80AA5BC(u8 var) { - sub_8003460(&gMenuWindow, gMatsudaDebugMenuTextList2[var], 0xC2, 3, 0x12); + Text_InitWindowAndPrintText(&gMenuWindow, gMatsudaDebugMenuTextList2[var], 0xC2, 3, 0x12); } void sub_80AA5E8(u8 var) { - sub_8003460(&gMenuWindow, gMatsudaDebugMenuTextList3[var], 0xE8, 3, 4); + Text_InitWindowAndPrintText(&gMenuWindow, gMatsudaDebugMenuTextList3[var], 0xE8, 3, 4); } static void sub_80AA614(u8 var1, u8 var2) @@ -645,7 +620,7 @@ static void sub_80AA614(u8 var1, u8 var2) u16 var = sub_80AE770(var1, var2); ConvertIntToDecimalStringN(gSharedMem, var, STR_CONV_MODE_RIGHT_ALIGN, 3); - sub_8003460(&gMenuWindow, gSharedMem, 0xE2, 3, 0xC); + Text_InitWindowAndPrintText(&gMenuWindow, gSharedMem, 0xE2, 3, 0xC); } void sub_80AA658(u8 var) @@ -1032,63 +1007,3 @@ u8 MatsudaDebugMenu_SetArtMuseumItems(void) CloseMenu(); return 1; } - -void unref_sub_80AB084(u8 *text) -{ - u16 savedIme; - u8 *addr; - size_t size; - - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - REG_WIN0H = 0; - REG_WIN0V = 0; - REG_WIN1H = 0; - REG_WIN1V = 0; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; - - savedIme = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = savedIme; - REG_DISPSTAT = 8; - ResetTasks(); - ResetSpriteData(); - SetMainCallback2(sub_80AB184); - - addr = (void *)VRAM; - size = 0x18000; - while (1) - { - DmaFill32(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill32(3, 0, addr, size); - break; - } - } - SetUpWindowConfig(&gWindowConfig_81E6FD8); - InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6FD8); - LoadFontDefaultPalette(&gWindowConfig_81E6FD8); - sub_8003460(&gUnknown_03004210, text, 1, 9, 7); -} - -void sub_80AB184(void) -{ - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; -} diff --git a/src/debug/mori_debug_menu.c b/src/debug/mori_debug_menu.c index 83dba8b73..767f4cda0 100644 --- a/src/debug/mori_debug_menu.c +++ b/src/debug/mori_debug_menu.c @@ -12,7 +12,7 @@ #define SIO_MULTI_CNT ((struct SioMultiCnt *)REG_ADDR_SIOCNT) -extern u8 (*gCallback_03004AE8)(void); +extern u8 (*gMenuCallback)(void); u8 gUnknown_03004DA0[0x20]; @@ -95,10 +95,10 @@ u8 MoriDebugMenu_SearchChild(u8 a1, u8 a2, u8 *ptr) StringAppend(localPtr, gUnknown_0839B24D); StringAppend(localPtr, gSpeciesNames[eggSpecies]); StringAppend(localPtr, gUnknown_0839B255); - MenuZeroFillScreen(); - MenuDrawTextWindow(0, 14, 30, 19); - MenuPrint(localPtr, 1, 15); - gCallback_03004AE8 = sub_8083D4C; + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 14, 30, 19); + Menu_PrintText(localPtr, 1, 15); + gMenuCallback = sub_8083D4C; return 0; } @@ -179,12 +179,12 @@ u8 MoriDebugMenu_PokeblockCase(void) bool8 MoriDebugMenuProcessInput(void) { - s8 choice = ProcessMenuInput(); + s8 choice = Menu_ProcessInput(); switch (choice) { default: - gCallback_03004AE8 = gMoriDebugMenuActions[choice].func; + gMenuCallback = gMoriDebugMenuActions[choice].func; return FALSE; case -2: return FALSE; @@ -196,10 +196,10 @@ bool8 MoriDebugMenuProcessInput(void) s8 InitMoriDebugMenu(void) { - MenuZeroFillScreen(); - MenuDrawTextWindow(0, 0, 10, 19); - PrintMenuItems(1, 1, 9, gMoriDebugMenuActions); + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 10, 19); + Menu_PrintItems(1, 1, 9, gMoriDebugMenuActions); InitMenu(0, 1, 1, 9, 0, 9); - gCallback_03004AE8 = MoriDebugMenuProcessInput; + gMenuCallback = MoriDebugMenuProcessInput; return 0; } diff --git a/src/debug/nakamura_debug_menu.c b/src/debug/nakamura_debug_menu.c new file mode 100644 index 000000000..550ac7bbd --- /dev/null +++ b/src/debug/nakamura_debug_menu.c @@ -0,0 +1,189 @@ +#if DEBUG +#include "global.h" +#include "menu.h" + +EWRAM_DATA u8 _nakamuraData0 = 0; +EWRAM_DATA u8 _nakamuraData1 = 0; +EWRAM_DATA u8 _nakamuraData2 = 0; +EWRAM_DATA u8 _nakamuraData3 = 0; +EWRAM_DATA u8 _nakamuraData4 = 0; +EWRAM_DATA u8 _nakamuraData5 = 0; +EWRAM_DATA u16 _nakamuraData6 = 0; +EWRAM_DATA u16 _nakamuraData8 = 0; +EWRAM_DATA u16 _nakamuraDataA = 0; +EWRAM_DATA u16 _nakamuraDataC = 0; + +__attribute__((unused)) static u8 _nakamuraStatic0[0x18]; +__attribute__((unused)) static u8 _nakamuraStatic18; +__attribute__((unused)) static u8 gDebugFiller3000814[4]; + +asm(".global _nakamuraStatic0"); +asm(".global _nakamuraStatic18"); + +u8 debug_sub_815FC54(); +u8 debug_sub_815F2B4(); +u8 debug_sub_815FC94(); +u8 debug_sub_815FB1C(); +u8 debug_sub_815F2F4(); +u8 debug_sub_815F62C(); +u8 debug_sub_815FBE8(); +u8 debug_sub_815FE1C(); +u8 debug_sub_8160D98(); + +const u8 Str_843E36C[] = _("Berries"); +const u8 Str_843E374[] = _("Goods"); +const u8 Str_843E37A[] = _("{PKMN} list"); +const u8 Str_843E382[] = _("トラップ"); +const u8 Str_843E387[] = _("Move your base"); +const u8 Str_843E396[] = _("Moving {PKMN}"); +const u8 Str_843E3A0[] = _("Fishing points"); +const u8 Str_843E3AF[] = _("Set {POKEBLOCK}"); +const u8 Str_843E3B9[] = _("Make bases(to max)"); +const u8 Str_843E3CC[] = _("Base location"); + +const struct MenuAction _843E3DC[] = { + { Str_843E36C, debug_sub_815FC54 }, + { Str_843E37A, debug_sub_815F2B4 }, + { Str_843E374, debug_sub_815FC94 }, + { Str_843E387, debug_sub_815FB1C }, + { Str_843E3B9, debug_sub_815F2F4 }, + { Str_843E3CC, debug_sub_815F62C }, + { Str_843E396, debug_sub_815FBE8 }, + { Str_843E3A0, debug_sub_815FE1C }, + { Str_843E3AF, debug_sub_8160D98 }, +}; + +const u8 _843E424[][4] = { + { 1, 118, 47, 14 }, + { 2, 125, 53, 10 }, + { 3, 113, 49, 8 }, + { 0xB, 118, 67, 6 }, + { 0xC, 121, 40, 11 }, + { 0xD, 111, 35, 1 }, + { 0x15, 115, 20, 53 }, + { 0x16, 121, 18, 13 }, + { 0x17, 119, 26, 81 }, + { 0x1F, 127, 59, 67 }, + { 0x20, 125, 55, 11 }, + { 0x21, 111, 27, 27 }, + { 0x29, 114, 9, 47 }, + { 0x2A, 115, 32, 39 }, + { 0x2B, 115, 23, 8 }, + { 0x33, 114, 30, 51 }, + { 0x34, 115, 26, 15 }, + { 0x35, 115, 32, 46 }, + { 0x3D, 114, 11, 62 }, + { 0x3E, 115, 21, 18 }, + { 0x3F, 115, 25, 24 }, + { 0x47, 114, 19, 70 }, + { 0x48, 115, 32, 6 }, + { 0x49, 114, 32, 57 }, + { 0x51, 116, 71, 4 }, + { 0x52, 123, 47, 3 }, + { 0x53, 123, 57, 5 }, + { 0x5B, 116, 79, 11 }, + { 0x5C, 123, 49, 3 }, + { 0x5D, 120, 18, 12 }, + { 0x65, 120, 28, 62 }, + { 0x66, 116, 56, 6 }, + { 0x67, 119, 16, 81 }, + { 0x6F, 120, 30, 62 }, + { 0x70, 116, 55, 15 }, + { 0x71, 119, 16, 28 }, + { 0x79, 111, 33, 34 }, + { 0x7A, 118, 29, 5 }, + { 0x7B, 127, 45, 24 }, + { 0x83, 111, 24, 36 }, + { 0x84, 125, 7, 25 }, + { 0x85, 115, 8, 30 }, + { 0x8D, 111, 34, 50 }, + { 0x8E, 127, 59, 72 }, + { 0x8F, 127, 61, 21 }, + { 0x97, 127, 67, 63 }, + { 0x98, 125, 24, 32 }, + { 0x99, 111, 35, 31 }, + { 0xA1, 111, 13, 19 }, + { 0xA2, 121, 43, 7 }, + { 0xA3, 118, 47, 5 }, + { 0xA4, 111, 14, 19 }, + { 0xAB, 118, 46, 5 }, + { 0xAC, 121, 42, 7 }, + { 0xAD, 119, 19, 76 }, + { 0xAE, 115, 7, 20 }, + { 0xB5, 110, 16, 25 }, + { 0xB6, 114, 11, 27 }, + { 0xB7, 115, 8, 20 }, + { 0xBF, 110, 17, 25 }, + { 0xC0, 114, 12, 27 }, + { 0xC1, 119, 18, 76 }, + { 0xC9, 119, 5, 2 }, + { 0xCA, 119, 4, 89 }, + { 0xCB, 120, 38, 54 }, + { 0xCC, 120, 5, 76 }, + { 0xD3, 119, 5, 15 }, + { 0xD4, 119, 7, 101 }, + { 0xD5, 120, 31, 23 }, + { 0xDD, 119, 34, 24 }, + { 0xDE, 120, 26, 10 }, + { 0xDF, 119, 4, 15 }, + { 0xE7, 119, 31, 73 }, + { 0xE8, 120, 29, 85 }, + { 0xE9, 119, 6, 2 }, +}; + +const u8 Str_843E550[] = _("R"); +const u8 Str_843E552[] = _("X"); +const u8 Str_843E554[] = _("Y"); +const u8 Str_843E556[] = _( + "♂1\n" + "♂2\n" + "♂3\n" + "♂4\n" + "♂5\n" + "♀1\n" + "♀2\n" + "♀3\n" + "♀4\n" + "♀5"); +const u8 Str_843E574[] = _("ー"); +const u8 Str_843E576[] = _("あ"); +const u8 Str_843E578[] = _("ア"); +const u8 Str_843E57A[] = _("A"); +const u8 Str_843E57C[] = _("a"); +const u8 Str_843E57E[] = _("0"); +const u8 Str_843E580[] = _( + "ADD\n" + "DEL\n" + "EXIT"); +const u8 Str_843E58D[] = _( + "Fishing location R119\n" + " Y1\n" + " Y2\n" + " Y3\n" + "Encounter location\n" + "\n" + "\n" + "front of you"); +const u8 _843E5D1[] = {0x0F, 0x16, 0x19}; +const u8 Str_843E5D4[] = _( + "Aボタン {ESCAPE}\p" + " Bボタン ー\n" + "START けってい"); +const u8 Str_843E5F0[] = _("?"); +const u8 Str_843E5F2[] = _("HP どりょくち"); +const u8 Str_843E5FB[] = _("こうげき どりょくち"); +const u8 Str_843E606[] = _("ぼうぎょ どりょくち"); +const u8 Str_843E611[] = _("すばやさ どりょくち"); +const u8 Str_843E61C[] = _("とくこう どりょくち"); +const u8 Str_843E627[] = _("とくぼう どりょくち"); +const u8 Str_843E632[] = _("なつきど"); +const u8 Str_843E637[] = _("どりょくち ごうけい"); +const u8 Str_843E642[] = _("ここから"); +const u8 Str_843E647[] = _("ここまで"); +const u8 Str_843E64C[] = _("かいすう"); +const u8 Str_843E651[] = _("けっか"); +const u8 Str_843E655[] = _("かい"); +const u8 Str_843E658[] = _("0"); +const u8 Str_843E65A[] = _("はんい"); + +#endif // DEBUG diff --git a/src/debug/nohara_debug_menu.c b/src/debug/nohara_debug_menu.c new file mode 100644 index 000000000..b3885ff76 --- /dev/null +++ b/src/debug/nohara_debug_menu.c @@ -0,0 +1,12 @@ +#if DEBUG +#include "global.h" + +__attribute__((unused)) static u8 gDebug_03000724; +__attribute__((unused)) static u8 gDebug_03000725; +__attribute__((unused)) static u8 gDebug_03000726; + +asm(".global gDebug_03000724"); +asm(".global gDebug_03000725"); +asm(".global gDebug_03000726"); + +#endif diff --git a/src/debug/sound_check_menu.c b/src/debug/sound_check_menu.c index 968b047d9..05cbfc8f7 100644 --- a/src/debug/sound_check_menu.c +++ b/src/debug/sound_check_menu.c @@ -132,8 +132,8 @@ void CB2_StartSoundCheckMenu(void) ResetPaletteFade(); ResetTasks(); ResetSpriteData(); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow(&gWindowTemplate_81E6CE4); BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); REG_WIN0H = WIN_RANGE(0, 0); REG_WIN0V = WIN_RANGE(0, 0); @@ -171,16 +171,16 @@ void Task_InitSoundCheckMenu(u8 taskId) if (!gPaletteFade.active) { - MenuDrawTextWindow(2, 0, 27, 3); - MenuDrawTextWindow(2, 5, 27, 10); - MenuDrawTextWindow(2, 12, 27, 17); - MenuPrint(soundcheckStr, 4, 1); - MenuPrint(abDescStr, 14, 1); - MenuPrint(bgmStr, 4, 6); - MenuPrint(upDownStr, 14, 6); - MenuPrint(seStr, 4, 13); - MenuPrint(upDownStr, 14, 13); - MenuPrint(driverStr, 14, 18); + Menu_DrawStdWindowFrame(2, 0, 27, 3); + Menu_DrawStdWindowFrame(2, 5, 27, 10); + Menu_DrawStdWindowFrame(2, 12, 27, 17); + Menu_PrintText(soundcheckStr, 4, 1); + Menu_PrintText(abDescStr, 14, 1); + Menu_PrintText(bgmStr, 4, 6); + Menu_PrintText(upDownStr, 14, 6); + Menu_PrintText(seStr, 4, 13); + Menu_PrintText(upDownStr, 14, 13); + Menu_PrintText(driverStr, 14, 18); gTasks[taskId].func = sub_80BA384; REG_WIN0H = WIN_RANGE(17, 223); REG_WIN0V = WIN_RANGE(1, 31); @@ -384,7 +384,7 @@ void PrintSoundNumber(u16 soundIndex, u16 x, u16 y) // PrintSoundNumber ? str[1] = divisorValue + CHAR_0; str[2] = ((soundIndex % 100) % 10) + CHAR_0; - MenuPrint(str, x, y); + Menu_PrintText(str, x, y); } void sub_80BA79C(const u8 *const string, u16 x, u16 y) @@ -400,7 +400,7 @@ void sub_80BA79C(const u8 *const string, u16 x, u16 y) for (i = 0; string[i] != EOS && i < 10; i++) str[i] = string[i]; - MenuPrint(str, x, y); + Menu_PrintText(str, x, y); } void Task_DrawDriverTestMenu(u8 taskId) // Task_DrawDriverTestMenu @@ -421,21 +421,21 @@ void Task_DrawDriverTestMenu(u8 taskId) // Task_DrawDriverTestMenu u8 stereoStr[] = _("すてれお‥‥‥‥"); // stereo REG_DISPCNT = 0x3140; - MenuDrawTextWindow(0, 0, 29, 19); - MenuPrint(bbackStr, 19, 4); - MenuPrint(aplayStr, 19, 2); - MenuPrint(voiceStr, 2, 1); - MenuPrint(volumeStr, 2, 3); - MenuPrint(panpotStr, 2, 5); - MenuPrint(pitchStr, 2, 7); - MenuPrint(lengthStr, 2, 9); - MenuPrint(releaseStr, 2, 11); - MenuPrint(progressStr, 2, 13); - MenuPrint(chorusStr, 2, 15); - MenuPrint(priorityStr, 2, 17); - MenuPrint(playingStr, 19, 16); - MenuPrint(reverseStr, 19, 14); - MenuPrint(stereoStr, 19, 12); + Menu_DrawStdWindowFrame(0, 0, 29, 19); + Menu_PrintText(bbackStr, 19, 4); + Menu_PrintText(aplayStr, 19, 2); + Menu_PrintText(voiceStr, 2, 1); + Menu_PrintText(volumeStr, 2, 3); + Menu_PrintText(panpotStr, 2, 5); + Menu_PrintText(pitchStr, 2, 7); + Menu_PrintText(lengthStr, 2, 9); + Menu_PrintText(releaseStr, 2, 11); + Menu_PrintText(progressStr, 2, 13); + Menu_PrintText(chorusStr, 2, 15); + Menu_PrintText(priorityStr, 2, 17); + Menu_PrintText(playingStr, 19, 16); + Menu_PrintText(reverseStr, 19, 14); + Menu_PrintText(stereoStr, 19, 12); REG_WIN0H = WIN_RANGE(0, DISPLAY_WIDTH); REG_WIN0V = WIN_RANGE(0, DISPLAY_HEIGHT); sDriverTestSelection = 0; @@ -465,7 +465,7 @@ void Task_ProcessDriverTestInput(u8 taskId) REG_DISPCNT = 0x7140; REG_WIN0H = WIN_RANGE(17, 223); REG_WIN0V = WIN_RANGE(1, 31); - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_EraseWindowRect(0, 0, 29, 19); gTasks[taskId].func = Task_InitSoundCheckMenu; return; } @@ -627,8 +627,8 @@ void sub_80BAE10(u8 var1, u8 var2) u8 str1[] = _("▶"); u8 str2[] = _(" "); - MenuPrint(str2, gUnknown_083D0300[MULTI_DIM_ARR(var1, B_16, 0)], gUnknown_083D0300[MULTI_DIM_ARR(var1, B_16, 1)]); - MenuPrint(str1, gUnknown_083D0300[MULTI_DIM_ARR(var2, B_16, 0)], gUnknown_083D0300[MULTI_DIM_ARR(var2, B_16, 1)]); + Menu_PrintText(str2, gUnknown_083D0300[MULTI_DIM_ARR(var1, B_16, 0)], gUnknown_083D0300[MULTI_DIM_ARR(var1, B_16, 1)]); + Menu_PrintText(str1, gUnknown_083D0300[MULTI_DIM_ARR(var2, B_16, 0)], gUnknown_083D0300[MULTI_DIM_ARR(var2, B_16, 1)]); } void PrintSignedNumber(int n, u16 x, u16 y, u8 digits) @@ -677,7 +677,7 @@ void PrintSignedNumber(int n, u16 x, u16 y, u8 digits) n %= powersOfTen[i]; } - MenuPrint(str, x, y); + Menu_PrintText(str, x, y); } static const s8 gUnknown_083D03F8[5] = { 0x3F, 0x00, 0xC0, 0x7F, 0x80 }; @@ -689,10 +689,10 @@ void sub_80BAF84(u8 taskId) u8 playingStr[] = _("さいせいちゆう‥"); REG_DISPCNT = 0x3140; - MenuDrawTextWindow(0, 0, 29, 19); - MenuPrint(seStr, 3, 2); - MenuPrint(panStr, 3, 4); - MenuPrint(playingStr, 3, 8); + Menu_DrawStdWindowFrame(0, 0, 29, 19); + Menu_PrintText(seStr, 3, 2); + Menu_PrintText(panStr, 3, 4); + Menu_PrintText(playingStr, 3, 8); REG_WIN0H = WIN_RANGE(0, DISPLAY_WIDTH); REG_WIN0V = WIN_RANGE(0, DISPLAY_HEIGHT); sSoundTestParams[CRY_TEST_VOICE] = 1; @@ -739,7 +739,7 @@ void sub_80BB038(u8 taskId) REG_DISPCNT = 0x7140; REG_WIN0H = WIN_RANGE(17, 223); REG_WIN0V = WIN_RANGE(1, 31); - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_EraseWindowRect(0, 0, 29, 19); gTasks[taskId].func = Task_InitSoundCheckMenu; return; } @@ -806,10 +806,10 @@ void sub_80BB1D4(void) switch (gUnknown_083D03F8[sSoundTestParams[CRY_TEST_PANPOT]]) { case 127: - MenuPrint(lrStr, 7, 4); + Menu_PrintText(lrStr, 7, 4); break; case -128: - MenuPrint(rlStr, 7, 4); + Menu_PrintText(rlStr, 7, 4); break; default: PrintSignedNumber(gUnknown_083D03F8[sSoundTestParams[CRY_TEST_PANPOT]], 7, 4, 3); @@ -1217,8 +1217,8 @@ void Task_InitCryTest(u8 taskId) struct CryRelatedStruct cryStruct, cryStruct2; u8 zero; - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow(&gWindowTemplate_81E6CE4); gSoundTestCryNum = 1; ResetSpriteData(); FreeAllSpritePalettes(); @@ -1247,7 +1247,7 @@ void Task_InitCryTest(u8 taskId) while (ShowPokedexCryScreen(&cryStruct2, 2) == FALSE) ; - MenuDrawTextWindow(0, 16, 5, 19); + Menu_DrawStdWindowFrame(0, 16, 5, 19); PrintCryNumber(); BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); REG_BG2HOFS = 0; @@ -1288,7 +1288,7 @@ void Task_ProcessCryTestInput(u8 taskId) REG_DISPCNT = 0x7140; REG_WIN0H = WIN_RANGE(17, 223); REG_WIN0V = WIN_RANGE(1, 31); - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_EraseWindowRect(0, 0, 29, 19); gTasks[taskId].func = Task_InitSoundCheckMenu; DestroyCryMeterNeedleSprite(); } diff --git a/src/debug/start_menu_debug.c b/src/debug/start_menu_debug.c new file mode 100644 index 000000000..4690368d8 --- /dev/null +++ b/src/debug/start_menu_debug.c @@ -0,0 +1,6051 @@ +#if DEBUG + +#include "global.h" +#include "constants/songs.h" +#include "battle.h" +#include "debug.h" +#include "link.h" +#include "main.h" +#include "menu.h" +#include "mystery_event_menu.h" +#include "overworld.h" +#include "reset_rtc_screen.h" +#include "rtc.h" +#include "save.h" +#include "sound.h" +#include "task.h" +#include "text.h" +#include "trade.h" + +// berry_blender.c +extern void unref_sub_80524BC(void); + +void debug_sub_8076BB4(u8); +void debug_sub_8077CF4(); + +u8 DebugMenu_Exit(void); +u8 DebugMenu_OpenWatanabe(void); +u8 DebugMenu_OpenSogabe(void); +u8 DebugMenu_OpenTamada(void); +u8 DebugMenu_OpenKagaya(void); +u8 DebugMenu_OpenMatsuda(void); +u8 DebugMenu_OpenNohara(void); +u8 DebugMenu_OpenNakamura(void); +u8 DebugMenu_Teleport(void); +u8 DebugMenu_EditPKMN(void); +u8 DebugMenu_SwitchBG(void); +u8 DebugMenu_OpenMori(void); +u8 DebugMenu_OpenTomomichi(void); +u8 DebugMenu_OpenAoki(void); +u8 DebugMenu_OpenTaya(void); +u8 DebugMenu_ToggleClearFlag(void); +u8 DebugMenu_ControlEncounter(void); +u8 DebugMenu_PTime(void); +u8 DebugMenu_MakeItems(void); +u8 debug_sub_8091300(void); +u8 DebugMenu_ViewPortraits(void); +u8 DebugMenu_TimeRecords(void); +u8 DebugMenu_SetTime(void); +u8 DebugMenu_NationalDex(void); +u8 DebugMenu_CreatePKMN(void); +u8 DebugMenu_ViewPokemonGraphics(void); +u8 DebugMenu_BattleForDebug(void); +u8 DebugMenu_AllBadges(void); +u8 DebugMenu_HoennNationalDex(void); +u8 DebugMenu_SetRamBerry(void); +u8 DebugMenu_UseHM(void); +u8 DebugMenu_OpenIwasawa(void); +u8 DebugMenu_ToggleBGM(void); +u8 DebugMenu_OpenSizeComparison(void); +u8 DebugMenu_Safari(void); +u8 DebugMenu_RematchTrainers(void); +u8 DebugMenu_MiragaIslandRND(void); +u8 DebugMenu_HallOfFame(void); +u8 DebugMenu_OpenMysteryEvent(void); +u8 DebugMenu_OpenLegendsRecord(void); +u8 DebugMenu_OpenWeatherEvents(void); +u8 DebugMenu_CellInfo(void); +u8 DebugMenu_CheckPKBLCK(void); +u8 DebugMenu_EffortValues(void); +u8 DebugMenu_HoennDex(void); +u8 DebugMenu_OpenSeeTrainers(void); +u8 DebugMenu_OpenBerryInfo(void); +u8 DebugMenu_BattleTowerStages(void); +u8 DebugMenu_EndSequenceDemo(void); +u8 DebugMenu_RandomNumberTest(void); +u8 DebugMenu_MeTooBackupMan(void); +u8 DebugMenu_OpenMurakawa(void); +u8 DebugMenu_OpenKiwa(void); +u8 DebugMenu_8076CBC(void); +u8 DebugMenu_8076CC0(void); +u8 DebugMenu_8076CD4(void); +u8 DebugMenu_8076C6C(void); +u8 DebugMenu_8076CD8(void); +u8 DebugMenu_8076D28(void); +u8 DebugMenu_8076D3C(void); +u8 DebugMenu_8076C80(void); +u8 DebugMenu_8076C90(void); +u8 DebugMenu_8076D50(void); +u8 DebugMenu_8076CEC(void); +u8 DebugMenu_8076D14(void); +u8 DebugMenu_8076D00(void); +u8 DebugMenu_8076D5C(void); +u8 DebugMenu_8076E18(void); +u8 DebugMenu_8076EDC(void); +void DebugMenu_8076FEC(void); + +const u8 Str_839B740[] = _("·WATANABE"); +const u8 Str_839B74A[] = _("SOGABE"); +const u8 Str_839B751[] = _("·TAMADA"); +const u8 Str_839B759[] = _("KAGAYA"); +const u8 Str_839B760[] = _("MATUDA"); +const u8 Str_839B767[] = _("NOHARA"); +const u8 Str_839B76E[] = _("NAKAMURA"); +const u8 Str_839B777[] = _("EXIT"); +const u8 Str_839B77C[] = _("Teleport"); +const u8 Str_839B785[] = _("Switch BG"); +const u8 Str_839B78F[] = _("Edit your {PKMN}"); +const u8 Str_839B79C[] = _("MORI"); +const u8 Str_839B7A1[] = _("TOMOMITI"); +const u8 Str_839B7AA[] = _("·AOKI"); +const u8 Str_839B7B0[] = _("TAYA"); +const u8 Str_839B7B5[] = _("Control Encounter"); +const u8 Str_839B7C7[] = _("PTIME"); +const u8 Str_839B7CD[] = _("Make items"); +const u8 Str_839B7D8[] = _("Transport"); +const u8 Str_839B7E2[] = _("See portraits"); +const u8 Str_839B7F0[] = _("Time records"); +const u8 Str_839B7FD[] = _("Set time"); +const u8 Str_839B806[] = _("National オカDex"); +const u8 Str_839B815[] = _("Hoenn オカDex"); +const u8 Str_839B821[] = _("Create {PKMN}"); +const u8 Str_839B82B[] = _("See {PKMN} graphics"); +const u8 Str_839B83B[] = _("See trainers"); +const u8 Str_839B848[] = _("Battle for debug"); +const u8 Str_839B859[] = _("Full set of badges"); +const u8 Str_839B86C[] = _("Hoenn National Dex"); +const u8 Str_839B87F[] = _("Set Ram berry"); +const u8 Str_839B88D[] = _("Use HM"); +const u8 Str_839B894[] = _("IWASAWA"); +const u8 Str_839B89C[] = _("BGM ON/OFF"); +const u8 Str_839B8A7[] = _("Size comparison"); +const u8 Str_839B8B7[] = _("Clear flag ON/OFF"); +const u8 Str_839B8C9[] = _("Safari"); +const u8 Str_839B8D0[] = _("Rematch trainers"); +const u8 Str_839B8E1[] = _("Mirage island RND"); +const u8 Str_839B8F3[] = _("Hall of fame"); +const u8 Str_839B900[] = _("Mystery event"); +const u8 Str_839B90E[] = _("Legends records"); +const u8 Str_839B91E[] = _("Weather events"); +const u8 Str_839B92D[] = _("Cell info."); +const u8 Str_839B938[] = _("Check {POKEBLOCK}"); +const u8 Str_839B944[] = _("Effort values"); +const u8 Str_839B952[] = _("Berrie Info"); +const u8 Str_839B95E[] = _("Battle Tower stages"); +const u8 Str_839B972[] = _("End sequence demo"); +const u8 Str_839B984[] = _("Random number test"); +const u8 Str_839B997[] = _("Me-too BackupMan"); +const u8 Str_839B9A8[] = _("MURAKAWA"); +const u8 Str_839B9B1[] = _("KINA(FONT)"); + +const struct MenuAction gDebug0x839B9BC[] = +{ + { Str_839B777, DebugMenu_Exit }, + { Str_839B740, DebugMenu_OpenWatanabe }, + { Str_839B74A, DebugMenu_OpenSogabe }, + { Str_839B751, DebugMenu_OpenTamada }, + { Str_839B759, DebugMenu_OpenKagaya }, + { Str_839B760, DebugMenu_OpenMatsuda }, + { Str_839B767, DebugMenu_OpenNohara }, + { Str_839B76E, DebugMenu_OpenNakamura }, + { Str_839B77C, DebugMenu_Teleport }, + { Str_839B78F, DebugMenu_EditPKMN }, + { Str_839B785, DebugMenu_SwitchBG }, + { Str_839B79C, DebugMenu_OpenMori }, + { Str_839B7A1, DebugMenu_OpenTomomichi }, + { Str_839B7AA, DebugMenu_OpenAoki }, + { Str_839B7B0, DebugMenu_OpenTaya }, + { Str_839B8B7, DebugMenu_ToggleClearFlag }, + { Str_839B7B5, DebugMenu_ControlEncounter }, + { Str_839B7C7, DebugMenu_PTime }, + { Str_839B7CD, DebugMenu_MakeItems }, + { Str_839B7D8, debug_sub_8091300 }, + { Str_839B7E2, DebugMenu_ViewPortraits }, + { Str_839B7F0, DebugMenu_TimeRecords }, + { Str_839B7FD, DebugMenu_SetTime }, + { Str_839B806, DebugMenu_NationalDex }, + { Str_839B821, DebugMenu_CreatePKMN }, + { Str_839B82B, DebugMenu_ViewPokemonGraphics }, + { Str_839B848, DebugMenu_BattleForDebug }, + { Str_839B859, DebugMenu_AllBadges }, + { Str_839B86C, DebugMenu_HoennNationalDex }, + { Str_839B87F, DebugMenu_SetRamBerry }, + { Str_839B88D, DebugMenu_UseHM }, + { Str_839B894, DebugMenu_OpenIwasawa }, + { Str_839B89C, DebugMenu_ToggleBGM }, + { Str_839B8A7, DebugMenu_OpenSizeComparison }, + { Str_839B8C9, DebugMenu_Safari }, + { Str_839B8D0, DebugMenu_RematchTrainers }, + { Str_839B8E1, DebugMenu_MiragaIslandRND }, + { Str_839B8F3, DebugMenu_HallOfFame }, + { Str_839B900, DebugMenu_OpenMysteryEvent }, + { Str_839B90E, DebugMenu_OpenLegendsRecord }, + { Str_839B91E, DebugMenu_OpenWeatherEvents }, + { Str_839B92D, DebugMenu_CellInfo }, + { Str_839B938, DebugMenu_CheckPKBLCK }, + { Str_839B944, DebugMenu_EffortValues }, + { Str_839B815, DebugMenu_HoennDex }, + { Str_839B83B, DebugMenu_OpenSeeTrainers }, + { Str_839B952, DebugMenu_OpenBerryInfo }, + { Str_839B95E, DebugMenu_BattleTowerStages }, + { Str_839B972, DebugMenu_EndSequenceDemo }, + { Str_839B984, DebugMenu_RandomNumberTest }, + { Str_839B997, DebugMenu_MeTooBackupMan }, + { Str_839B9A8, DebugMenu_OpenMurakawa }, + { Str_839B9B1, DebugMenu_OpenKiwa }, +}; + +const u8 gUnknown_Debug_839BB64[] = +{ + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x0e, 0x1f, 0x12, 0x13, 0x00, 0x08, 0x09, 0x0a, 0x1e, 0x10, 0x24, 0x0f, 0x00, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, + 0x1c, 0x1d, 0x14, 0x20, 0x21, 0x22, 0x23, 0x00, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x00, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x00, 0x11, 0x33, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const u8 gUnknown_Debug_0839BBA4[] = _("Debugging Version"); +const u8 gUnknown_Debug_0839BBB6[] = _("{VERSION} Version"); +const u8 gUnknown_Debug_0839BBC1[] = _("Normal RTC compatible"); +const u8 Str_839BBD7[] = _("か の じっけん"); +const u8 Str_839BBE0[] = _("じっけん2"); +const u8 Str_839BBE6[] = _("BGじっけん"); +const u8 Str_839BBED[] = _("Battle"); +const u8 Str_839BBF4[] = _("つうしん じっけん"); +const u8 Str_839BBFE[] = _("LINK Test2"); +const u8 Str_839BC09[] = _("フィールド はじめる"); +const u8 Str_839BC14[] = _("フィールド つづき"); +const u8 Str_839BC1E[] = _("Sound test"); +const u8 Str_839BC29[] = _("{POKEBLOCK} test"); +const u8 Str_839BC34[] = _("Crash backup data"); +const u8 Str_839BC46[] = _("e-Card test"); +const u8 Str_839BC52[] = _("こうかんデモ "); +const u8 Str_839BC5C[] = _("Time in game"); +const u8 Str_839BC69[] = _("フェスタ モード"); +const u8 Str_839BC72[] = _("Mimic e-Card"); +const u8 Str_839BC7F[] = _("RTC reset"); +const u8 Str_839BC89[] = _("Converter"); + +const struct MenuAction gUnknown_Debug_839BC94[] = +{ + { Str_839BBD7, DebugMenu_8076CBC }, + { Str_839BBE0, DebugMenu_8076CC0 }, + { Str_839BBE6, DebugMenu_8076CD4 }, + { Str_839BBED, DebugMenu_8076C6C }, + { Str_839BC29, DebugMenu_8076CD8 }, + { Str_839BBFE, DebugMenu_8076D28 }, + { Str_839BC1E, DebugMenu_8076D3C }, + { Str_839BC09, DebugMenu_8076C80 }, + { Str_839BC14, DebugMenu_8076C90 }, + { Str_839BC34, DebugMenu_8076D50 }, + { Str_839BC46, DebugMenu_8076CEC }, + { Str_839BC52, DebugMenu_8076D14 }, + { Str_839BC72, DebugMenu_8076D00 }, + { Str_839BC5C, DebugMenu_8076D5C }, + { Str_839BC7F, DebugMenu_8076E18 }, + { Str_839BC89, DebugMenu_8076EDC }, +}; + +// NOTE: When decompiling this file, I found out that having an extraneous extern +// in a C file can affect the generated asm. If this extern is commented out, +// debug_sub_8076BB4 will access the array differently and no longer match. +//extern const struct MenuAction gUnknown_Debug_839BC94[]; + +const u8 gMenuOrders_839BD14[][10] = +{ + { 3, 6, 4, 0xFF }, + { 5, 9, 10, 12, 13, 14, 15, 0xFF }, +}; + +const u8 Str_839BD26[] = {2, 0, 0, 0}; // doesn't appear to be referenced + +const u8 Str_839BD2C[] = _("RTCを リセット します\n" // Reset RTC + "Aで じっこう Bでキャンセル"); + +const u8 Str_839BD4C[] = _("RTCを リセット した!"); + +const u8 Str_839BD5A[] = _("セーブデータを コンバートします\n" + "Aで けってい Bで キャンセル"); + +const u8 Str_839BD7D[] = _("へんかんが しゅうりょう しました!"); + + +extern const u8 Str_839BD2C[]; +extern const u8 Str_839BD4C[]; + +__attribute__((unused)) static u8 gUnknown_030006B8[4]; +__attribute__((unused)) static u8 gUnknown_030006BC[4]; +__attribute__((unused)) static u8 gUnknown_030006C0; +__attribute__((unused)) static u8 gUnknown_030006C1; +static const u8 *gUnknown_030006C4; +__attribute__((unused)) static u8 gUnknown_030006C8; + +void debug_sub_8076AC8(u8 a) +{ + s32 r4; + + gUnknown_030006C4 = gMenuOrders_839BD14[a]; + for (r4 = 0; gUnknown_030006C4[r4] != 0xFF; r4++) + ; + Menu_EraseWindowRect(16, 0, 29, 19); + Menu_DrawStdWindowFrame(16, 0, 29, r4 * 2 + 1); + Menu_PrintItemsReordered(17, 1, r4, (struct MenuAction2 *)gUnknown_Debug_839BC94, gUnknown_030006C4); + InitMenu(0, 17, 1, r4, 0, 12); +} + +void debug_sub_8076B4C(void) +{ + u8 taskId = FindTaskIdByFunc(debug_sub_8076BB4); + + if (taskId != 0xFF) + DestroyTask(taskId); +} + +// Initializes test menu +void debug_sub_8076B68(void) +{ + Menu_PrintText(gUnknown_Debug_0839BBB6, 1, 1); + Menu_PrintText(gUnknown_Debug_0839BBC1, 1, 3); + Menu_PrintText(gUnknown_Debug_0839BBA4, 1, 9); + debug_sub_8077CF4(4, 11); + debug_sub_8076AC8(0); + CreateTask(debug_sub_8076BB4, 1); +} + +// Handles input for the test menu +void debug_sub_8076BB4(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + s8 input = Menu_ProcessInput(); + s8 cursorPos = Menu_GetCursorPos(); + + switch (input) + { + default: + gUnknown_Debug_839BC94[gUnknown_030006C4[cursorPos]].func(); + break; + case -2: + if (gMain.newKeys & 0x20) + { + if (data[0] == 0) + data[0] = 1; + else + data[0]--; + debug_sub_8076AC8(data[0]); + PlaySE(SE_SELECT); + } + else if (gMain.newKeys & 0x10) + { + if (data[0] == 1) + data[0] = 0; + else + data[0]++; + debug_sub_8076AC8(data[0]); + PlaySE(SE_SELECT); + } + break; + case -1: + DoSoftReset(); + break; + } +} + +u8 DebugMenu_8076C6C(void) +{ + SetMainCallback2(debug_sub_8010800); + return 0; +} + +u8 DebugMenu_8076C80(void) +{ + debug_sub_8076B4C(); + DebugMenu_8076FEC(); + return 0; +} + +u8 DebugMenu_8076C90(void) +{ + if (gSaveFileStatus == SAVE_STATUS_ERROR) + { + PlaySE(0x16); + } + else + { + debug_sub_8076B4C(); + SetMainCallback2(CB2_ContinueSavedGame); + } + return 0; +} + +u8 DebugMenu_8076CBC(void) +{ + return 0; +} + +u8 DebugMenu_8076CC0(void) +{ + SetMainCallback2(debug_nullsub_66); + return 0; +} + +u8 DebugMenu_8076CD4(void) +{ + return 0; +} + +u8 DebugMenu_8076CD8(void) +{ + SetMainCallback2(unref_sub_80524BC); + return 0; +} + +u8 DebugMenu_8076CEC(void) +{ + SetMainCallback2(CB2_InitMysteryEventMenu); + return 0; +} + +u8 DebugMenu_8076D00(void) +{ + SetMainCallback2(debug_sub_815D15C); + return 0; +} + +u8 DebugMenu_8076D14(void) +{ + SetMainCallback2(sub_804B790); + return 0; +} + +u8 DebugMenu_8076D28(void) +{ + SetMainCallback2(LinkTestScreen); + return 0; +} + +u8 DebugMenu_8076D3C(void) +{ + SetMainCallback2(CB2_StartSoundCheckMenu); + return 0; +} + +u8 DebugMenu_8076D50(void) +{ + Save_EraseAllData(); + return 0; +} + +u8 DebugMenu_8076D5C(void) +{ + debug_sub_8076B4C(); + debug_sub_806F8F8(); + return 0; +} + +void DebugMenu_8076D6C(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (data[0]) + { + case 0: + Menu_DisplayDialogueFrame(); + Menu_PrintText(Str_839BD2C, 2, 15); + data[0]++; + break; + case 1: + if (gMain.newKeys & A_BUTTON) + { + Menu_DisplayDialogueFrame(); + Menu_PrintText(Str_839BD4C, 2, 15); + PlaySE(0x49); + RtcReset(); + data[0]++; + } + else if (gMain.newKeys & B_BUTTON) + { + DestroyTask(taskId); + DoSoftReset(); + } + break; + case 2: + if (gMain.newKeys & A_BUTTON) + { + DestroyTask(taskId); + DoSoftReset(); + } + break; + } +} + +__attribute__((naked)) +u8 DebugMenu_8076E18() +{ + asm( + " push {lr}\n" + " bl debug_sub_8076B4C\n" + " ldr r0, ._67 @ DebugMenu_8076D6C\n" + " mov r1, #0xa\n" + " bl CreateTask\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._68:\n" + " .align 2, 0\n" + "._67:\n" + " .word DebugMenu_8076D6C+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8076E30() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r3, r0, #0x18\n" + " lsl r0, r3, #0x2\n" + " add r0, r0, r3\n" + " lsl r0, r0, #0x3\n" + " ldr r1, ._73 @ gTasks\n" + " add r4, r0, r1\n" + " mov r0, #0x0\n" + " ldsh r1, [r4, r0]\n" + " cmp r1, #0x1\n" + " beq ._69 @cond_branch\n" + " cmp r1, #0x1\n" + " bgt ._70 @cond_branch\n" + " cmp r1, #0\n" + " beq ._71 @cond_branch\n" + " b ._86\n" + "._74:\n" + " .align 2, 0\n" + "._73:\n" + " .word gTasks+0x8\n" + "._70:\n" + " cmp r1, #0x2\n" + " beq ._75 @cond_branch\n" + " b ._86\n" + "._71:\n" + " bl Menu_DisplayDialogueFrame\n" + " ldr r0, ._78 @ Str_839BD5A\n" + " mov r1, #0x2\n" + " mov r2, #0xf\n" + " bl Menu_PrintText\n" + " b ._77\n" + "._79:\n" + " .align 2, 0\n" + "._78:\n" + " .word Str_839BD5A\n" + "._69:\n" + " ldr r0, ._82 @ gMain\n" + " ldrh r2, [r0, #0x2e]\n" + " and r1, r1, r2\n" + " cmp r1, #0\n" + " beq ._80 @cond_branch\n" + " bl Menu_DisplayDialogueFrame\n" + " bl sub_813B79C\n" + " ldr r0, ._82 + 4 @ Str_839BD7D\n" + " mov r1, #0x2\n" + " mov r2, #0xf\n" + " bl Menu_PrintText\n" + " mov r0, #0x49\n" + " bl PlaySE\n" + "._77:\n" + " ldrh r0, [r4]\n" + " add r0, r0, #0x1\n" + " strh r0, [r4]\n" + " b ._86\n" + "._83:\n" + " .align 2, 0\n" + "._82:\n" + " .word gMain\n" + " .word Str_839BD7D\n" + "._80:\n" + " mov r0, #0x2\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._86 @cond_branch\n" + " add r0, r3, #0\n" + " bl DestroyTask\n" + " bl DoSoftReset\n" + " b ._86\n" + "._75:\n" + " ldr r0, ._87 @ gMain\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._86 @cond_branch\n" + " add r0, r3, #0\n" + " bl DestroyTask\n" + " bl DoSoftReset\n" + "._86:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._88:\n" + " .align 2, 0\n" + "._87:\n" + " .word gMain\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_8076EDC() +{ + asm( + " push {lr}\n" + " bl debug_sub_8076B4C\n" + " ldr r0, ._89 @ DebugMenu_8076E30\n" + " mov r1, #0xa\n" + " bl CreateTask\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._90:\n" + " .align 2, 0\n" + "._89:\n" + " .word DebugMenu_8076E30+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8076EF4() +{ + asm( + " push {r4, r5, lr}\n" + " add sp, sp, #0xfffffff8\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0xb\n" + " mov r3, #0x11\n" + " bl Menu_DrawStdWindowFrame\n" + " ldr r4, ._93 @ gUnknown_Debug_839BDC4\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x8\n" + " add r3, r4, #0\n" + " bl Menu_PrintItems\n" + " mov r5, #0x0\n" + " add r4, r4, #0x4\n" + "._92:\n" + " lsl r0, r5, #0x3\n" + " add r0, r0, r4\n" + " ldr r1, [r0]\n" + " mov r0, #0x1\n" + " and r1, r1, r0\n" + " mov r0, #0xb6\n" + " cmp r1, #0\n" + " bne ._91 @cond_branch\n" + " mov r0, #0xb5\n" + "._91:\n" + " lsl r2, r5, #0x1\n" + " add r2, r2, #0x1\n" + " lsl r2, r2, #0x18\n" + " lsr r2, r2, #0x18\n" + " mov r1, #0xa\n" + " bl sub_8071F60\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, #0x7\n" + " bls ._92 @cond_branch\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x9\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x8\n" + " bl InitMenu\n" + " add sp, sp, #0x8\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._94:\n" + " .align 2, 0\n" + "._93:\n" + " .word gUnknown_Debug_839BDC4\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8076F60() +{ + asm( + " push {r4, r5, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " bl Menu_ProcessInput\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " bl Menu_GetCursorPos\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " lsl r4, r4, #0x18\n" + " asr r4, r4, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._97 @cond_branch\n" + " add r0, r0, #0x1\n" + " cmp r4, r0\n" + " bne ._96 @cond_branch\n" + " bl Menu_EraseScreen\n" + " bl debug_sub_8076B68\n" + " add r0, r5, #0\n" + " bl DestroyTask\n" + " b ._97\n" + "._96:\n" + " ldr r3, ._100 @ gUnknown_Debug_839BDC4\n" + " lsl r2, r2, #0x18\n" + " asr r2, r2, #0x15\n" + " add r0, r3, #4\n" + " add r0, r2, r0\n" + " ldrb r4, [r0]\n" + " ldr r0, ._100 + 4 @ gSaveBlock2\n" + " mov r1, #0x1\n" + " and r1, r1, r4\n" + " strb r1, [r0, #0x8]\n" + " add r2, r2, r3\n" + " ldr r1, [r2]\n" + " bl StringCopy\n" + " mov r0, #0x80\n" + " and r4, r4, r0\n" + " cmp r4, #0\n" + " bne ._98 @cond_branch\n" + " mov r0, #0x0\n" + " bl debug_sub_8057508\n" + " b ._99\n" + "._101:\n" + " .align 2, 0\n" + "._100:\n" + " .word gUnknown_Debug_839BDC4\n" + " .word gSaveBlock2\n" + "._98:\n" + " mov r0, #0x1\n" + " bl debug_sub_8057508\n" + "._99:\n" + " add r0, r5, #0\n" + " bl DestroyTask\n" + " ldr r0, ._102 @ debug_sub_8058C00\n" + " bl SetMainCallback2\n" + "._97:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._103:\n" + " .align 2, 0\n" + "._102:\n" + " .word debug_sub_8058C00+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8076FEC() +{ + asm( + " push {lr}\n" + " bl DebugMenu_8076EF4\n" + " ldr r0, ._104 @ DebugMenu_8076F60\n" + " mov r1, #0xa\n" + " bl CreateTask\n" + " pop {r0}\n" + " bx r0\n" + "._105:\n" + " .align 2, 0\n" + "._104:\n" + " .word DebugMenu_8076F60+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077004() +{ + asm( + " ldr r2, ._106 @ gUnknown_030006C4\n" + " ldr r0, ._106 + 4 @ gUnknown_030006C1\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x3\n" + " ldr r1, ._106 + 8 @ gUnknown_Debug_839BB64\n" + " add r0, r0, r1\n" + " str r0, [r2]\n" + " bx lr\n" + "._107:\n" + " .align 2, 0\n" + "._106:\n" + " .word gUnknown_030006C4 \n" + " .word gUnknown_030006C1 \n" + " .word gUnknown_Debug_839BB64\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077020() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " ldr r0, ._109 @ gMenuCallback\n" + " ldr r0, [r0]\n" + " bl _call_via_r0\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " bne ._108 @cond_branch\n" + " add r0, r4, #0\n" + " bl DestroyTask\n" + "._108:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._110:\n" + " .align 2, 0\n" + "._109:\n" + " .word gMenuCallback\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077048() +{ + asm( + " push {lr}\n" + " ldr r0, ._111 @ gMenuCallback\n" + " ldr r1, ._111 + 4 @ DebugMenu_807706C\n" + " str r1, [r0]\n" + " bl ScriptContext2_Enable\n" + " ldr r0, ._111 + 8 @ DebugMenu_8077020\n" + " mov r1, #0x50\n" + " bl CreateTask\n" + " pop {r0}\n" + " bx r0\n" + "._112:\n" + " .align 2, 0\n" + "._111:\n" + " .word gMenuCallback\n" + " .word DebugMenu_807706C+1\n" + " .word DebugMenu_8077020+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_807706C() +{ + asm( + " push {lr}\n" + " ldr r0, ._113 @ gWindowTemplate_81E6CE4\n" + " bl InitMenuWindow\n" + " bl DebugMenu_8077004\n" + " bl DebugMenu_807719C\n" + " bl DebugMenu_80771EC\n" + " bl DebugMenu_8077238\n" + " ldr r1, ._113 + 4 @ gMenuCallback\n" + " ldr r0, ._113 + 8 @ DebugMenu_807709C\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._114:\n" + " .align 2, 0\n" + "._113:\n" + " .word gWindowTemplate_81E6CE4\n" + " .word gMenuCallback\n" + " .word DebugMenu_807709C+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_807709C() +{ + asm( + " push {r4, lr}\n" + " ldr r4, ._120 @ gMain\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._115 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " bl Menu_MoveCursor\n" + " ldr r1, ._120 + 4 @ gUnknown_030006C0\n" + " strb r0, [r1]\n" + "._115:\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._116 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r0, #0x1\n" + " bl Menu_MoveCursor\n" + " ldr r1, ._120 + 4 @ gUnknown_030006C0\n" + " strb r0, [r1]\n" + "._116:\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._117 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r1, ._120 + 8 @ gUnknown_030006C1\n" + " ldrb r0, [r1]\n" + " cmp r0, #0\n" + " bne ._118 @cond_branch\n" + " mov r0, #0x7\n" + " b ._119\n" + "._121:\n" + " .align 2, 0\n" + "._120:\n" + " .word gMain\n" + " .word gUnknown_030006C0 \n" + " .word gUnknown_030006C1 \n" + "._118:\n" + " sub r0, r0, #0x1\n" + "._119:\n" + " strb r0, [r1]\n" + " bl DebugMenu_8077004\n" + " bl DebugMenu_807719C\n" + "._117:\n" + " ldr r0, ._125 @ gMain\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._122 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r1, ._125 + 4 @ gUnknown_030006C1\n" + " ldrb r0, [r1]\n" + " cmp r0, #0x7\n" + " bne ._123 @cond_branch\n" + " mov r0, #0x0\n" + " b ._124\n" + "._126:\n" + " .align 2, 0\n" + "._125:\n" + " .word gMain\n" + " .word gUnknown_030006C1 \n" + "._123:\n" + " add r0, r0, #0x1\n" + "._124:\n" + " strb r0, [r1]\n" + " bl DebugMenu_8077004\n" + " bl DebugMenu_807719C\n" + "._122:\n" + " ldr r0, ._129 @ gMain\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._127 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r1, ._129 + 4 @ gDebug0x839B9BC\n" + " ldr r0, ._129 + 8 @ gUnknown_030006C0\n" + " ldrb r2, [r0]\n" + " ldr r0, ._129 + 12 @ gUnknown_030006C4\n" + " ldr r0, [r0]\n" + " add r0, r0, r2\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x3\n" + " add r1, r1, #0x4\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " bl _call_via_r0\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " b ._132\n" + "._130:\n" + " .align 2, 0\n" + "._129:\n" + " .word gMain\n" + " .word gDebug0x839B9BC\n" + " .word gUnknown_030006C0 \n" + " .word gUnknown_030006C4 \n" + "._127:\n" + " mov r0, #0xa\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._131 @cond_branch\n" + " mov r0, #0x0\n" + " b ._132\n" + "._131:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._132:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_807719C() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffff8\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0xe\n" + " mov r3, #0x11\n" + " bl Menu_DrawStdWindowFrame\n" + " ldr r3, ._133 @ gDebug0x839B9BC\n" + " ldr r0, ._133 + 4 @ gUnknown_030006C4\n" + " ldr r0, [r0]\n" + " str r0, [sp]\n" + " mov r0, #0x1\n" + " mov r1, #0x1\n" + " mov r2, #0x8\n" + " bl Menu_PrintItemsReordered\n" + " ldr r4, ._133 + 8 @ gUnknown_030006C0\n" + " ldrb r0, [r4]\n" + " str r0, [sp]\n" + " mov r0, #0xd\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x8\n" + " bl InitMenu\n" + " strb r0, [r4]\n" + " add sp, sp, #0x8\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._134:\n" + " .align 2, 0\n" + "._133:\n" + " .word gDebug0x839B9BC\n" + " .word gUnknown_030006C4 \n" + " .word gUnknown_030006C0 \n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_80771EC() +{ + asm( + " push {r4, lr}\n" + " ldr r0, ._135 @ gStringVar4\n" + " ldr r1, ._135 + 4 @ Str_839BE04\n" + " bl StringCopy\n" + " ldr r4, ._135 + 8 @ gSaveBlock1\n" + " mov r1, #0x4\n" + " ldsb r1, [r4, r1]\n" + " mov r2, #0x1\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " mov r1, #0x5\n" + " ldsb r1, [r4, r1]\n" + " mov r2, #0x1\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, #0x13\n" + " mov r1, #0xc\n" + " mov r2, #0x1d\n" + " mov r3, #0xf\n" + " bl Menu_DrawStdWindowFrame\n" + " ldr r0, ._135 @ gStringVar4\n" + " mov r1, #0x14\n" + " mov r2, #0xd\n" + " bl Menu_PrintText\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._136:\n" + " .align 2, 0\n" + "._135:\n" + " .word gStringVar4\n" + " .word Str_839BE04\n" + " .word gSaveBlock1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077238() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " add sp, sp, #0xffffffe8\n" + " ldr r1, ._139 @ Str_839BE07\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " bl memcpy\n" + " add r0, sp, #0x4\n" + " mov r9, r0\n" + " ldr r1, ._139 + 4 @ Str_839BE09\n" + " mov r2, #0x3\n" + " bl memcpy\n" + " add r1, sp, #0x8\n" + " mov sl, r1\n" + " ldr r1, ._139 + 8 @ Str_839BE0C\n" + " mov r0, sl\n" + " mov r2, #0x3\n" + " bl memcpy\n" + " mov r2, #0x0\n" + " str r2, [sp, #0x14]\n" + " add r4, sp, #0x10\n" + " mov r6, sp\n" + " add r6, r6, #0x12\n" + " add r0, r4, #0\n" + " add r1, r6, #0\n" + " bl PlayerGetDestCoords\n" + " mov r1, #0x0\n" + " ldsh r0, [r4, r1]\n" + " mov r2, #0x0\n" + " ldsh r1, [r6, r2]\n" + " bl MapGridGetZCoordAt\n" + " mov r8, r0\n" + " mov r0, r8\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r8, r0\n" + " ldrh r0, [r4]\n" + " sub r0, r0, #0x7\n" + " strh r0, [r4]\n" + " ldrh r0, [r6]\n" + " sub r0, r0, #0x7\n" + " strh r0, [r6]\n" + " ldr r7, ._139 + 12 @ gStringVar4\n" + " add r0, r7, #0\n" + " mov r1, sp\n" + " bl StringCopy\n" + " add r5, sp, #0xc\n" + " mov r2, #0x0\n" + " ldsh r1, [r4, r2]\n" + " add r0, r5, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r7, #0\n" + " add r1, r5, #0\n" + " bl StringAppend\n" + " add r0, r7, #0\n" + " mov r1, r9\n" + " bl StringAppend\n" + " mov r0, #0x0\n" + " ldsh r1, [r6, r0]\n" + " add r0, r5, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r7, #0\n" + " add r1, r5, #0\n" + " bl StringAppend\n" + " add r0, r7, #0\n" + " mov r1, sl\n" + " bl StringAppend\n" + " add r0, r5, #0\n" + " mov r1, r8\n" + " mov r2, #0x0\n" + " mov r3, #0x2\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r7, #0\n" + " add r1, r5, #0\n" + " bl StringAppend\n" + " ldrb r0, [r7]\n" + " cmp r0, #0xff\n" + " beq ._137 @cond_branch\n" + " add r1, r7, #0\n" + "._138:\n" + " ldr r0, [sp, #0x14]\n" + " add r0, r0, #0x1\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " str r0, [sp, #0x14]\n" + " add r0, r0, r1\n" + " ldrb r0, [r0]\n" + " cmp r0, #0xff\n" + " bne ._138 @cond_branch\n" + "._137:\n" + " mov r0, #0x1c\n" + " ldr r1, [sp, #0x14]\n" + " sub r0, r0, r1\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r1, #0x10\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl Menu_DrawStdWindowFrame\n" + " ldr r0, ._139 + 12 @ gStringVar4\n" + " mov r1, #0x1d\n" + " ldr r2, [sp, #0x14]\n" + " sub r1, r1, r2\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " mov r2, #0x11\n" + " bl Menu_PrintText\n" + " add sp, sp, #0x18\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._140:\n" + " .align 2, 0\n" + "._139:\n" + " .word Str_839BE07\n" + " .word Str_839BE09\n" + " .word Str_839BE0C\n" + " .word gStringVar4\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_Exit() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_OpenSogabe() +{ + asm( + " push {lr}\n" + " bl unref_sub_814A414\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_OpenTamada() +{ + asm( + " push {lr}\n" + " bl debug_sub_8075C30\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_OpenKagaya() +{ + asm( + " push {lr}\n" + " bl InitKagayaDebugMenu_A\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_OpenMatsuda() +{ + asm( + " push {lr}\n" + " bl unref_sub_80A9B28\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_OpenNohara() +{ + asm( + " push {lr}\n" + " bl InitNoharaDebugMenu\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_OpenWatanabe() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " ldr r0, ._141 @ InitWatanabeDebugMenu\n" + " bl SetMainCallback2\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._142:\n" + " .align 2, 0\n" + "._141:\n" + " .word InitWatanabeDebugMenu+1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_EndSequenceDemo() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " ldr r0, ._143 @ sub_81439D0\n" + " bl SetMainCallback2\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._144:\n" + " .align 2, 0\n" + "._143:\n" + " .word sub_81439D0+1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_HallOfFame() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " bl GameClear\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_OpenSizeComparison() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " bl InitSizeComparison\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_HoennNationalDex() +{ + asm( + " push {lr}\n" + " bl IsNationalPokedexEnabled\n" + " cmp r0, #0\n" + " beq ._145 @cond_branch\n" + " bl DisableNationalPokedex\n" + " b ._146\n" + "._145:\n" + " bl EnableNationalPokedex\n" + "._146:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_8077434() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl Menu_GetCursorPos\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x4\n" + " bhi ._165 @cond_branch\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._149 @ \n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " mov pc, r0\n" + "._150:\n" + " .align 2, 0\n" + "._149:\n" + " .word ._148\n" + "._148:\n" + " .word ._151\n" + " .word ._152\n" + " .word ._153\n" + " .word ._154\n" + " .word ._155\n" + "._151:\n" + " ldr r0, ._157 @ Str_839BE0F\n" + " mov r1, #0x1\n" + " mov r2, #0x4\n" + " bl GetEnigmaBerryChecksum\n" + " mov r0, #0xff\n" + " str r0, [sp]\n" + " str r0, [sp, #0x4]\n" + " mov r1, #0xff\n" + " mov r2, #0xff\n" + " mov r3, #0x0\n" + " bl debug_sub_80C2D24\n" + " b ._165\n" + "._158:\n" + " .align 2, 0\n" + "._157:\n" + " .word Str_839BE0F\n" + "._152:\n" + " ldr r0, ._160 @ Str_839BE12\n" + " mov r1, #0x2\n" + " mov r2, #0x0\n" + " bl GetEnigmaBerryChecksum\n" + " mov r0, #0xff\n" + " str r0, [sp]\n" + " str r0, [sp, #0x4]\n" + " mov r1, #0xff\n" + " mov r2, #0x0\n" + " b ._159\n" + "._161:\n" + " .align 2, 0\n" + "._160:\n" + " .word Str_839BE12\n" + "._153:\n" + " ldr r0, ._163 @ Str_839BE16\n" + " mov r1, #0x3\n" + " mov r2, #0x0\n" + " bl GetEnigmaBerryChecksum\n" + " mov r0, #0xff\n" + " str r0, [sp]\n" + " str r0, [sp, #0x4]\n" + " mov r1, #0x0\n" + " b ._162\n" + "._164:\n" + " .align 2, 0\n" + "._163:\n" + " .word Str_839BE16\n" + "._154:\n" + " ldr r0, ._166 @ Str_839BE1A\n" + " mov r1, #0x4\n" + " mov r2, #0x0\n" + " bl GetEnigmaBerryChecksum\n" + " mov r0, #0xff\n" + " str r0, [sp]\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0xff\n" + "._162:\n" + " mov r2, #0xff\n" + "._159:\n" + " mov r3, #0xff\n" + " bl debug_sub_80C2D24\n" + " b ._165\n" + "._167:\n" + " .align 2, 0\n" + "._166:\n" + " .word Str_839BE1A\n" + "._155:\n" + " ldr r0, ._168 @ Str_839BE1E\n" + " mov r1, #0x4\n" + " mov r2, #0x0\n" + " bl GetEnigmaBerryChecksum\n" + " mov r0, #0xff\n" + " str r0, [sp]\n" + " str r0, [sp, #0x4]\n" + " mov r1, #0xff\n" + " mov r2, #0xff\n" + " mov r3, #0xff\n" + " bl debug_sub_80C2D24\n" + "._165:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._169:\n" + " .align 2, 0\n" + "._168:\n" + " .word Str_839BE1E\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_807750C() +{ + asm( + " push {lr}\n" + " ldr r0, ._170 @ gUnknown_Debug_839BE24\n" + " bl DebugMenu_8077D78\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "._171:\n" + " .align 2, 0\n" + "._170:\n" + " .word gUnknown_Debug_839BE24\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_SetRamBerry() +{ + asm( + " push {lr}\n" + " ldr r0, ._172 @ gUnknown_Debug_839BE24\n" + " mov r1, #0xc\n" + " mov r2, #0x5\n" + " bl DebugMenu_8077D24\n" + " ldr r1, ._172 + 4 @ gMenuCallback\n" + " ldr r0, ._172 + 8 @ DebugMenu_807750C\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._173:\n" + " .align 2, 0\n" + "._172:\n" + " .word gUnknown_Debug_839BE24\n" + " .word gMenuCallback\n" + " .word DebugMenu_807750C+1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_ToggleBGM() +{ + asm( + " push {lr}\n" + " ldr r2, ._175 @ gDisableMusic\n" + " mov r1, #0x0\n" + " ldrb r0, [r2]\n" + " cmp r0, #0\n" + " bne ._174 @cond_branch\n" + " mov r1, #0x1\n" + "._174:\n" + " strb r1, [r2]\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._176:\n" + " .align 2, 0\n" + "._175:\n" + " .word gDisableMusic\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_BattleForDebug() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " bl InitBattleForDebug\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_NationalDex() +{ + asm( + " push {r4, r5, lr}\n" + " mov r4, #0x0\n" + " ldr r5, ._178 @ 0x181\n" + "._177:\n" + " add r4, r4, #0x1\n" + " lsl r4, r4, #0x10\n" + " lsr r4, r4, #0x10\n" + " add r0, r4, #0\n" + " mov r1, #0x2\n" + " bl GetSetPokedexFlag\n" + " add r0, r4, #0\n" + " mov r1, #0x3\n" + " bl GetSetPokedexFlag\n" + " cmp r4, r5\n" + " bls ._177 @cond_branch\n" + " ldr r1, ._178 + 4 @ gUnknown_03005CE8\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r4, r5}\n" + " pop {r1}\n" + " bx r1\n" + "._179:\n" + " .align 2, 0\n" + "._178:\n" + " .word 0x181\n" + " .word gUnknown_03005CE8\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_HoennDex() +{ + asm( + " push {r4, r5, lr}\n" + " mov r5, #0x0\n" + "._180:\n" + " add r5, r5, #0x1\n" + " lsl r5, r5, #0x10\n" + " lsr r5, r5, #0x10\n" + " add r0, r5, #0\n" + " bl HoennToNationalOrder\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x10\n" + " lsr r4, r4, #0x10\n" + " add r0, r4, #0\n" + " mov r1, #0x2\n" + " bl GetSetPokedexFlag\n" + " add r0, r4, #0\n" + " mov r1, #0x3\n" + " bl GetSetPokedexFlag\n" + " cmp r5, #0xc9\n" + " bls ._180 @cond_branch\n" + " ldr r1, ._181 @ gUnknown_03005CE8\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r4, r5}\n" + " pop {r1}\n" + " bx r1\n" + "._182:\n" + " .align 2, 0\n" + "._181:\n" + " .word gUnknown_03005CE8\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_CreatePKMN() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " bl InitCreatePokemon\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_ViewPokemonGraphics() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " bl InitSeePokemonGraphics\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_OpenSeeTrainers() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " bl InitSeeTrainers\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_OpenMori() +{ + asm( + " push {lr}\n" + " bl InitMoriDebugMenu\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_OpenTomomichi() +{ + asm( + " push {lr}\n" + " bl InitTomomichiDebugWindow\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_OpenAoki() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_OpenTaya() +{ + asm( + " push {lr}\n" + " bl InitTayaDebugWindow\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_OpenNakamura() +{ + asm( + " push {lr}\n" + " bl InitNakamuraDebugMenu\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_OpenIwasawa() +{ + asm( + " push {lr}\n" + " bl debug_sub_8138CC4\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_Teleport() +{ + asm( + " push {lr}\n" + " bl Overworld_SetWarpDestToLastHealLoc\n" + " bl sub_8080E88\n" + " bl ScriptContext2_Enable\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_EditPKMN() +{ + asm( + " push {lr}\n" + " bl Menu_EraseScreen\n" + " bl debug_sub_815FFDC\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_80776B4() +{ + asm( + " push {r4, r5, lr}\n" + " add sp, sp, #0xfffffff8\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " ldr r1, ._183 @ Str_839BE4C\n" + " mov r0, sp\n" + " mov r2, #0x7\n" + " bl memcpy\n" + " lsl r3, r4, #0x1\n" + " lsl r5, r4, #0x19\n" + " lsr r5, r5, #0x18\n" + " add r3, r3, #0x1\n" + " lsl r3, r3, #0x18\n" + " lsr r3, r3, #0x18\n" + " mov r0, #0x19\n" + " add r1, r5, #0\n" + " mov r2, #0x1d\n" + " bl Menu_BlankWindowRect\n" + " ldr r0, ._183 + 4 @ gUnknown_030006C8\n" + " ldrb r0, [r0]\n" + " ASR r0, r4\n" + " mov r1, #0x1\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, sp\n" + " mov r1, #0x19\n" + " add r2, r5, #0\n" + " bl Menu_PrintText\n" + " add sp, sp, #0x8\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._184:\n" + " .align 2, 0\n" + "._183:\n" + " .word Str_839BE4C\n" + " .word gUnknown_030006C8 \n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077704() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xffffffec\n" + " ldr r1, ._185 @ Str_839BE53\n" + " mov r0, sp\n" + " mov r2, #0x11\n" + " bl memcpy\n" + " mov r0, #0x13\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x8\n" + " bl Menu_BlankWindowRect\n" + " mov r0, sp\n" + " mov r1, #0x15\n" + " mov r2, #0x0\n" + " bl Menu_PrintText\n" + " ldr r2, ._185 + 4 @ gUnknown_030006C8\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x13\n" + " ldrh r0, [r0]\n" + " lsr r0, r0, #0x8\n" + " mov r1, #0xf\n" + " and r0, r0, r1\n" + " strb r0, [r2]\n" + " mov r0, #0x0\n" + " bl DebugMenu_80776B4\n" + " mov r0, #0x1\n" + " bl DebugMenu_80776B4\n" + " mov r0, #0x2\n" + " bl DebugMenu_80776B4\n" + " mov r0, #0x3\n" + " bl DebugMenu_80776B4\n" + " add sp, sp, #0x14\n" + " pop {r0}\n" + " bx r0\n" + "._186:\n" + " .align 2, 0\n" + "._185:\n" + " .word Str_839BE53\n" + " .word gUnknown_030006C8 \n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_8077760() +{ + asm( + " push {r4, r5, lr}\n" + " ldr r2, ._190 @ gMain\n" + " ldrh r1, [r2, #0x2e]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " add r5, r2, #0\n" + " cmp r0, #0\n" + " beq ._187 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " bl Menu_MoveCursor\n" + " ldr r1, ._190 + 4 @ gUnknown_030006B8\n" + " ldrb r0, [r1]\n" + " cmp r0, #0\n" + " beq ._188 @cond_branch\n" + " sub r0, r0, #0x1\n" + " b ._189\n" + "._191:\n" + " .align 2, 0\n" + "._190:\n" + " .word gMain\n" + " .word gUnknown_030006B8 \n" + "._188:\n" + " mov r0, #0x3\n" + "._189:\n" + " strb r0, [r1]\n" + "._187:\n" + " ldrh r1, [r5, #0x2e]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._192 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r0, #0x1\n" + " bl Menu_MoveCursor\n" + " ldr r1, ._195 @ gUnknown_030006B8\n" + " ldrb r0, [r1]\n" + " cmp r0, #0x3\n" + " beq ._193 @cond_branch\n" + " add r0, r0, #0x1\n" + " b ._194\n" + "._196:\n" + " .align 2, 0\n" + "._195:\n" + " .word gUnknown_030006B8 \n" + "._193:\n" + " mov r0, #0x0\n" + "._194:\n" + " strb r0, [r1]\n" + "._192:\n" + " ldrh r1, [r5, #0x2e]\n" + " mov r0, #0x30\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._197 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r4, ._201 @ gUnknown_030006C8\n" + " bl Menu_GetCursorPos\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r1, #0x1\n" + " LSL r1, r0\n" + " ldrb r0, [r4]\n" + " eor r1, r1, r0\n" + " strb r1, [r4]\n" + " bl Menu_GetCursorPos\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl DebugMenu_80776B4\n" + "._197:\n" + " ldrh r2, [r5, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " bne ._198 @cond_branch\n" + " mov r0, #0x2\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._199 @cond_branch\n" + "._198:\n" + " mov r2, #0x80\n" + " lsl r2, r2, #0x13\n" + " ldrh r0, [r2]\n" + " ldr r1, ._201 + 4 @ 0xf0ff\n" + " and r1, r1, r0\n" + " ldr r0, ._201 @ gUnknown_030006C8\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x8\n" + " add r1, r1, r0\n" + " strh r1, [r2]\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " b ._200\n" + "._202:\n" + " .align 2, 0\n" + "._201:\n" + " .word gUnknown_030006C8 \n" + " .word 0xf0ff\n" + "._199:\n" + " mov r0, #0x0\n" + "._200:\n" + " pop {r4, r5}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_SwitchBG() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl Menu_EraseScreen\n" + " bl DebugMenu_8077704\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x6\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x14\n" + " mov r2, #0x0\n" + " mov r3, #0x4\n" + " bl InitMenu\n" + " ldr r1, ._203 @ gMenuCallback\n" + " ldr r0, ._203 + 4 @ DebugMenu_8077760\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._204:\n" + " .align 2, 0\n" + "._203:\n" + " .word gMenuCallback\n" + " .word DebugMenu_8077760+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_807786C() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffff8\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " ldr r1, ._205 @ Str_839BE64\n" + " mov r0, sp\n" + " mov r2, #0x7\n" + " bl memcpy\n" + " mov r0, #0x19\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x3\n" + " bl Menu_DrawStdWindowFrame\n" + " lsl r0, r4, #0x1\n" + " add r0, r0, r4\n" + " add r0, r0, sp\n" + " mov r1, #0x1a\n" + " mov r2, #0x1\n" + " bl Menu_PrintText\n" + " add sp, sp, #0x8\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._206:\n" + " .align 2, 0\n" + "._205:\n" + " .word Str_839BE64\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_80778A8() +{ + asm( + " push {r4, lr}\n" + " ldr r4, ._211 @ gMain\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x30\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._207 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r2, ._211 + 4 @ sWildEncountersDisabled\n" + " ldrb r0, [r2]\n" + " mov r1, #0x1\n" + " eor r0, r0, r1\n" + " strb r0, [r2]\n" + " ldrb r0, [r2]\n" + " bl DebugMenu_807786C\n" + "._207:\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._208 @cond_branch\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._209 @cond_branch\n" + "._208:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " b ._210\n" + "._212:\n" + " .align 2, 0\n" + "._211:\n" + " .word gMain\n" + " .word sWildEncountersDisabled\n" + "._209:\n" + " mov r0, #0x0\n" + "._210:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_ControlEncounter() +{ + asm( + " push {lr}\n" + " bl Menu_EraseScreen\n" + " ldr r0, ._213 @ sWildEncountersDisabled\n" + " ldrb r0, [r0]\n" + " bl DebugMenu_807786C\n" + " ldr r1, ._213 + 4 @ gMenuCallback\n" + " ldr r0, ._213 + 8 @ DebugMenu_80778A8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._214:\n" + " .align 2, 0\n" + "._213:\n" + " .word sWildEncountersDisabled\n" + " .word gMenuCallback\n" + " .word DebugMenu_80778A8+1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_UseHM() +{ + asm( + " ldr r1, ._215 @ gMenuCallback\n" + " ldr r0, ._215 + 4 @ DebugMenu_8077C14\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " bx lr\n" + "._216:\n" + " .align 2, 0\n" + "._215:\n" + " .word gMenuCallback\n" + " .word DebugMenu_8077C14+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077934() +{ + asm( + " push {lr}\n" + " mov r1, #0x0\n" + " ldr r3, ._218 @ gSaveBlock1\n" + " mov r2, #0x1\n" + "._217:\n" + " add r0, r1, r3\n" + " strb r2, [r0]\n" + " add r1, r1, #0x1\n" + " cmp r1, #0x63\n" + " bls ._217 @cond_branch\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._219:\n" + " .align 2, 0\n" + "._218:\n" + " .word gSaveBlock1+0x97a\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077954() +{ + asm( + " push {lr}\n" + " mov r1, #0x0\n" + " ldr r3, ._222 @ gSaveBlock1\n" + " mov r2, #0x0\n" + "._221:\n" + " add r0, r1, r3\n" + " strb r2, [r0]\n" + " add r1, r1, #0x1\n" + " cmp r1, #0x63\n" + " bls ._221 @cond_branch\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._223:\n" + " .align 2, 0\n" + "._222:\n" + " .word gSaveBlock1+0x97a\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077974() +{ + asm( + " push {lr}\n" + " bl Menu_EraseScreen\n" + " ldr r1, ._226 @ gSaveBlock1\n" + " mov r0, #0x4\n" + " ldsb r0, [r1, r0]\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " ldrb r1, [r1, #0x5]\n" + " lsl r1, r1, #0x18\n" + " asr r1, r1, #0x18\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " bl IsRematchTrainerIn\n" + " cmp r0, #0\n" + " beq ._224 @cond_branch\n" + " ldr r0, ._226 + 4 @ gStringVar1\n" + " ldr r1, ._226 + 8 @ Str_839BE8D\n" + " bl StringCopy\n" + " b ._225\n" + "._227:\n" + " .align 2, 0\n" + "._226:\n" + " .word gSaveBlock1\n" + " .word gStringVar1\n" + " .word Str_839BE8D\n" + "._224:\n" + " ldr r0, ._230 @ gStringVar1\n" + " ldr r1, ._230 + 4 @ Str_839BE90\n" + " bl StringCopy\n" + "._225:\n" + " ldr r1, ._230 + 8 @ gSaveBlock1\n" + " mov r0, #0x4\n" + " ldsb r0, [r1, r0]\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " ldrb r1, [r1, #0x5]\n" + " lsl r1, r1, #0x18\n" + " asr r1, r1, #0x18\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " bl DoesSomeoneWantRematchIn\n" + " cmp r0, #0\n" + " beq ._228 @cond_branch\n" + " ldr r0, ._230 + 12 @ gStringVar2\n" + " ldr r1, ._230 + 16 @ Str_839BE8D\n" + " bl StringCopy\n" + " b ._229\n" + "._231:\n" + " .align 2, 0\n" + "._230:\n" + " .word gStringVar1\n" + " .word Str_839BE90\n" + " .word gSaveBlock1\n" + " .word gStringVar2\n" + " .word Str_839BE8D\n" + "._228:\n" + " ldr r0, ._232 @ gStringVar2\n" + " ldr r1, ._232 + 4 @ Str_839BE90\n" + " bl StringCopy\n" + "._229:\n" + " ldr r0, ._232 + 8 @ Str_839BE6B\n" + " bl sub_8071F40\n" + " ldr r1, ._232 + 12 @ gMenuCallback\n" + " ldr r0, ._232 + 16 @ DebugMenu_8077DB4\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._233:\n" + " .align 2, 0\n" + "._232:\n" + " .word gStringVar2\n" + " .word Str_839BE90\n" + " .word Str_839BE6B\n" + " .word gMenuCallback\n" + " .word DebugMenu_8077DB4+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077A20() +{ + asm( + " push {lr}\n" + " ldr r0, ._234 @ gSaveBlock1\n" + " ldr r1, ._234 + 4 @ 0x978\n" + " add r0, r0, r1\n" + " mov r1, #0xff\n" + " strh r1, [r0]\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._235:\n" + " .align 2, 0\n" + "._234:\n" + " .word gSaveBlock1\n" + " .word 0x978\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077A40() +{ + asm( + " push {lr}\n" + " ldr r0, ._236 @ gSaveBlock1\n" + " ldr r1, ._236 + 4 @ 0x978\n" + " add r0, r0, r1\n" + " mov r1, #0x0\n" + " strh r1, [r0]\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._237:\n" + " .align 2, 0\n" + "._236:\n" + " .word gSaveBlock1\n" + " .word 0x978\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077A60() +{ + asm( + " push {lr}\n" + " ldr r0, ._238 @ gUnknown_Debug_839BEE4\n" + " bl DebugMenu_8077D78\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "._239:\n" + " .align 2, 0\n" + "._238:\n" + " .word gUnknown_Debug_839BEE4\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_RematchTrainers() +{ + asm( + " push {lr}\n" + " bl Menu_EraseScreen\n" + " ldr r0, ._240 @ gUnknown_Debug_839BEE4\n" + " mov r1, #0xd\n" + " mov r2, #0x5\n" + " bl DebugMenu_8077D24\n" + " ldr r1, ._240 + 4 @ gMenuCallback\n" + " ldr r0, ._240 + 8 @ DebugMenu_8077A60\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._241:\n" + " .align 2, 0\n" + "._240:\n" + " .word gUnknown_Debug_839BEE4\n" + " .word gMenuCallback\n" + " .word DebugMenu_8077A60+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077A9C() +{ + asm( + " push {lr}\n" + " ldr r1, ._242 @ gNumSafariBalls\n" + " mov r0, #0x1e\n" + " strb r0, [r1]\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._243:\n" + " .align 2, 0\n" + "._242:\n" + " .word gNumSafariBalls\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077AB4() +{ + asm( + " push {lr}\n" + " ldr r1, ._244 @ gNumSafariBalls\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._245:\n" + " .align 2, 0\n" + "._244:\n" + " .word gNumSafariBalls\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077ACC() +{ + asm( + " push {lr}\n" + " ldr r1, ._246 @ gSafariZoneStepCounter\n" + " mov r2, #0xfa\n" + " lsl r2, r2, #0x1\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._247:\n" + " .align 2, 0\n" + "._246:\n" + " .word gSafariZoneStepCounter\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077AE8() +{ + asm( + " push {lr}\n" + " ldr r1, ._248 @ gSafariZoneStepCounter\n" + " mov r0, #0x1\n" + " strh r0, [r1]\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._249:\n" + " .align 2, 0\n" + "._248:\n" + " .word gSafariZoneStepCounter\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077B00() +{ + asm( + " push {lr}\n" + " bl Menu_EraseScreen\n" + " bl unref_sub_80C853C\n" + " cmp r0, #0\n" + " beq ._250 @cond_branch\n" + " ldr r0, ._252 @ Str_839BF14\n" + " bl sub_8071F40\n" + " b ._251\n" + "._253:\n" + " .align 2, 0\n" + "._252:\n" + " .word Str_839BF14\n" + "._250:\n" + " ldr r0, ._254 @ Str_839BF1F\n" + " bl sub_8071F40\n" + "._251:\n" + " ldr r1, ._254 + 4 @ gMenuCallback\n" + " ldr r0, ._254 + 8 @ DebugMenu_8077DB4\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._255:\n" + " .align 2, 0\n" + "._254:\n" + " .word Str_839BF1F\n" + " .word gMenuCallback\n" + " .word DebugMenu_8077DB4+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077B3C() +{ + asm( + " push {lr}\n" + " ldr r0, ._256 @ gUnknown_Debug_839BF6C\n" + " bl DebugMenu_8077D78\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "._257:\n" + " .align 2, 0\n" + "._256:\n" + " .word gUnknown_Debug_839BF6C\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_Safari() +{ + asm( + " push {lr}\n" + " bl GetSafariZoneFlag\n" + " cmp r0, #0\n" + " beq ._258 @cond_branch\n" + " bl Menu_EraseScreen\n" + " ldr r0, ._260 @ gUnknown_Debug_839BF6C\n" + " mov r1, #0xe\n" + " mov r2, #0x5\n" + " bl DebugMenu_8077D24\n" + " ldr r0, ._260 + 4 @ gStringVar1\n" + " ldr r1, ._260 + 8 @ gSafariZoneStepCounter\n" + " ldrh r1, [r1]\n" + " mov r2, #0x1\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " ldr r0, ._260 + 12 @ Str_839BF0C\n" + " bl sub_8071F40\n" + " ldr r1, ._260 + 16 @ gMenuCallback\n" + " ldr r0, ._260 + 20 @ DebugMenu_8077B3C\n" + " str r0, [r1]\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x0\n" + " b ._259\n" + "._261:\n" + " .align 2, 0\n" + "._260:\n" + " .word gUnknown_Debug_839BF6C\n" + " .word gStringVar1\n" + " .word gSafariZoneStepCounter\n" + " .word Str_839BF0C\n" + " .word gMenuCallback\n" + " .word DebugMenu_8077B3C+1\n" + "._258:\n" + " bl CloseMenu\n" + " mov r0, #0x16\n" + " bl PlaySE\n" + " mov r0, #0x1\n" + "._259:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077BB4() +{ + asm( + " push {lr}\n" + " bl debug_sub_80AFEE4\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077BC0() +{ + asm( + " push {lr}\n" + " bl debug_sub_8122080\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077BCC() +{ + asm( + " push {lr}\n" + " bl debug_sub_8120968\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077BD8() +{ + asm( + " push {lr}\n" + " bl debug_sub_8130318\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077BE4() +{ + asm( + " push {lr}\n" + " bl debug_sub_80986AC\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077BF4() +{ + asm( + " push {lr}\n" + " bl debug_sub_80D93F4\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077C00() +{ + asm( + " push {lr}\n" + " ldr r0, ._262 @ gUnknown_Debug_839BF94\n" + " bl DebugMenu_8077D78\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "._263:\n" + " .align 2, 0\n" + "._262:\n" + " .word gUnknown_Debug_839BF94\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077C14() +{ + asm( + " push {lr}\n" + " bl Menu_EraseScreen\n" + " ldr r0, ._264 @ gUnknown_Debug_839BF94\n" + " mov r1, #0xa\n" + " mov r2, #0x9\n" + " bl DebugMenu_8077D24\n" + " ldr r1, ._264 + 4 @ gMenuCallback\n" + " ldr r0, ._264 + 8 @ DebugMenu_8077C00\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._265:\n" + " .align 2, 0\n" + "._264:\n" + " .word gUnknown_Debug_839BF94\n" + " .word gMenuCallback\n" + " .word DebugMenu_8077C00+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077C3C() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " add sp, sp, #0xfffffffc\n" + " mov sl, r0\n" + " add r7, r1, #0\n" + " ldr r0, ._271 @ gUnknown_030006BC\n" + " ldr r1, ._271 + 4 @ gUnknown_Debug_839BFE8\n" + " str r1, [r0]\n" + " mov r1, #0x0\n" + " strb r1, [r7]\n" + " add r7, r7, #0x1\n" + " strb r1, [r7]\n" + " add r7, r7, #0x1\n" + " mov r3, #0x0\n" + " mov r8, r0\n" + "._269:\n" + " mov r5, #0x0\n" + " ldr r1, ._271 @ gUnknown_030006BC\n" + " ldr r0, [r1]\n" + " ldr r2, [r0, #0x4]\n" + " mov r4, #0x0\n" + " ldr r1, [r0, #0x8]\n" + " add r3, r3, #0x1\n" + " mov r9, r3\n" + " cmp r5, r1\n" + " bge ._266 @cond_branch\n" + " add r3, r0, #0\n" + " add r6, r1, #0\n" + "._267:\n" + " ldr r0, [r3, #0xc]\n" + " add r0, r0, r4\n" + " add r0, r0, sl\n" + " ldrb r0, [r0]\n" + " sub r0, r0, #0x30\n" + " mul r0, r0, r2\n" + " add r5, r5, r0\n" + " add r4, r4, #0x1\n" + " add r0, r2, #0\n" + " mov r1, #0xa\n" + " str r3, [sp]\n" + " bl __divsi3\n" + " add r2, r0, #0\n" + " ldr r3, [sp]\n" + " cmp r4, r6\n" + " blt ._267 @cond_branch\n" + "._266:\n" + " mov r0, r8\n" + " ldr r1, [r0]\n" + " ldr r0, [r1]\n" + " cmp r0, r5\n" + " bcs ._268 @cond_branch\n" + " add r5, r0, #0\n" + "._268:\n" + " ldrb r3, [r1, #0x8]\n" + " add r0, r7, #0\n" + " add r1, r5, #0\n" + " mov r2, #0x2\n" + " bl ConvertIntToDecimalStringN\n" + " add r7, r0, #0\n" + " mov r3, r9\n" + " mov r1, r8\n" + " ldr r0, [r1]\n" + " add r0, r0, #0x10\n" + " str r0, [r1]\n" + " cmp r3, #0x1\n" + " ble ._269 @cond_branch\n" + " mov r1, sl\n" + " ldrb r0, [r1, #0x1d]\n" + " add r0, r0, #0x7a\n" + " strb r0, [r7]\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0xf6\n" + " bls ._270 @cond_branch\n" + " mov r0, #0xf6\n" + " strb r0, [r7]\n" + "._270:\n" + " mov r0, #0xff\n" + " strb r0, [r7, #0x1]\n" + " add sp, sp, #0x4\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._272:\n" + " .align 2, 0\n" + "._271:\n" + " .word gUnknown_030006BC \n" + " .word gUnknown_Debug_839BFE8\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8077CF4() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add r4, r0, #0\n" + " add r5, r1, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " lsl r5, r5, #0x18\n" + " lsr r5, r5, #0x18\n" + " ldr r0, ._273 @ BuildDateTime\n" + " ldr r6, ._273 + 4 @ gStringVar4\n" + " add r1, r6, #0\n" + " bl DebugMenu_8077C3C\n" + " add r0, r6, #0\n" + " add r1, r4, #0\n" + " add r2, r5, #0\n" + " bl Menu_PrintText\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._274:\n" + " .align 2, 0\n" + "._273:\n" + " .word BuildDateTime\n" + " .word gStringVar4\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077D24() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add sp, sp, #0xfffffff8\n" + " add r6, r0, #0\n" + " add r4, r1, #0\n" + " add r5, r2, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " lsl r5, r5, #0x18\n" + " lsr r5, r5, #0x18\n" + " bl Menu_EraseScreen\n" + " lsl r3, r5, #0x1\n" + " add r3, r3, #0x1\n" + " lsl r3, r3, #0x18\n" + " lsr r3, r3, #0x18\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " add r2, r4, #0\n" + " bl Menu_DrawStdWindowFrame\n" + " mov r0, #0x1\n" + " mov r1, #0x1\n" + " add r2, r5, #0\n" + " add r3, r6, #0\n" + " bl Menu_PrintItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " sub r4, r4, #0x1\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " str r4, [sp, #0x4]\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " add r3, r5, #0\n" + " bl InitMenu\n" + " add sp, sp, #0x8\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077D78() +{ + asm( + " push {r4, r5, lr}\n" + " add r5, r0, #0\n" + " bl Menu_ProcessInput\n" + " lsl r0, r0, #0x18\n" + " asr r4, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._275 @cond_branch\n" + " add r0, r0, #0x1\n" + " cmp r4, r0\n" + " beq ._276 @cond_branch\n" + " bl Menu_EraseScreen\n" + " ldr r0, ._278 @ gMenuCallback\n" + " lsl r1, r4, #0x3\n" + " add r1, r1, r5\n" + " ldr r1, [r1, #0x4]\n" + " str r1, [r0]\n" + "._275:\n" + " mov r0, #0x0\n" + " b ._277\n" + "._279:\n" + " .align 2, 0\n" + "._278:\n" + " .word gMenuCallback\n" + "._276:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._277:\n" + " pop {r4, r5}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077DB4() +{ + asm( + " push {lr}\n" + " ldr r0, ._282 @ gMain\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._280 @cond_branch\n" + " mov r0, #0x0\n" + " b ._281\n" + "._283:\n" + " .align 2, 0\n" + "._282:\n" + " .word gMain\n" + "._280:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._281:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077DD8() +{ + asm( + " push {r4, r5, lr}\n" + " add r4, r0, #0\n" + " add r5, r1, #0\n" + " lsl r3, r3, #0x10\n" + " lsr r3, r3, #0x10\n" + " add r1, r3, #0\n" + " mov r0, #0x80\n" + " and r0, r0, r3\n" + " cmp r0, #0\n" + " beq ._284 @cond_branch\n" + " ldrh r0, [r4]\n" + " sub r0, r0, #0x1\n" + " b ._285\n" + "._284:\n" + " mov r0, #0x40\n" + " and r0, r0, r3\n" + " cmp r0, #0\n" + " beq ._286 @cond_branch\n" + " ldrh r0, [r4]\n" + " add r0, r0, #0x1\n" + " b ._287\n" + "._286:\n" + " mov r0, #0x20\n" + " and r0, r0, r3\n" + " cmp r0, #0\n" + " beq ._288 @cond_branch\n" + " ldrh r0, [r4]\n" + " sub r0, r0, #0xa\n" + "._285:\n" + " strh r0, [r4]\n" + " mov r1, #0x0\n" + " ldsh r0, [r4, r1]\n" + " cmp r0, r5\n" + " bge ._293 @cond_branch\n" + " strh r2, [r4]\n" + " b ._293\n" + "._288:\n" + " mov r0, #0x10\n" + " and r1, r1, r0\n" + " cmp r1, #0\n" + " bne ._291 @cond_branch\n" + " mov r0, #0x0\n" + " b ._292\n" + "._291:\n" + " ldrh r0, [r4]\n" + " add r0, r0, #0xa\n" + "._287:\n" + " strh r0, [r4]\n" + " mov r1, #0x0\n" + " ldsh r0, [r4, r1]\n" + " cmp r0, r2\n" + " ble ._293 @cond_branch\n" + " strh r5, [r4]\n" + "._293:\n" + " mov r0, #0x1\n" + "._292:\n" + " pop {r4, r5}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077E40() +{ + asm( + " push {r4, lr}\n" + " add r4, r0, #0\n" + " ldr r0, ._297 @ gMain\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._294 @cond_branch\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._295 @cond_branch\n" + "._294:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " b ._302\n" + "._298:\n" + " .align 2, 0\n" + "._297:\n" + " .word gMain\n" + "._295:\n" + " mov r0, #0x30\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._299 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " cmp r4, #0\n" + " beq ._300 @cond_branch\n" + " mov r0, #0x1\n" + " bl DebugMenu_807786C\n" + " mov r0, #0x0\n" + " b ._302\n" + "._300:\n" + " mov r0, #0x0\n" + " bl DebugMenu_807786C\n" + " mov r0, #0x1\n" + " b ._302\n" + "._299:\n" + " add r0, r4, #0\n" + "._302:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_MakeItems() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " bl DebugMenu_8077EAC\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077EAC() +{ + asm( + " push {r4, lr}\n" + " ldr r0, ._303 @ DebugMenu_8077F40\n" + " mov r1, #0x50\n" + " bl CreateTask\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " bl Menu_EraseScreen\n" + " ldr r1, ._303 + 4 @ gTasks\n" + " lsl r0, r4, #0x2\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " mov r1, #0x1\n" + " strh r1, [r0, #0xa]\n" + " strh r1, [r0, #0xc]\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._304:\n" + " .align 2, 0\n" + "._303:\n" + " .word DebugMenu_8077F40+1\n" + " .word gTasks\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077EE0() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add r4, r0, #0\n" + " add r6, r1, #0\n" + " lsl r4, r4, #0x10\n" + " lsr r4, r4, #0x10\n" + " lsl r6, r6, #0x10\n" + " lsr r6, r6, #0x10\n" + " mov r0, #0x4\n" + " mov r1, #0x11\n" + " mov r2, #0x16\n" + " mov r3, #0x12\n" + " bl Menu_BlankWindowRect\n" + " ldr r5, ._305 @ gStringVar1\n" + " add r0, r5, #0\n" + " add r1, r4, #0\n" + " mov r2, #0x1\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r5, #0\n" + " mov r1, #0x4\n" + " mov r2, #0x11\n" + " bl Menu_PrintText\n" + " add r0, r4, #0\n" + " bl ItemId_GetItem\n" + " mov r1, #0x8\n" + " mov r2, #0x11\n" + " bl Menu_PrintText\n" + " add r0, r5, #0\n" + " add r1, r6, #0\n" + " mov r2, #0x1\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r5, #0\n" + " mov r1, #0x12\n" + " mov r2, #0x11\n" + " bl Menu_PrintText\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._306:\n" + " .align 2, 0\n" + "._305:\n" + " .word gStringVar1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077F40() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " lsl r4, r0, #0x2\n" + " add r4, r4, r0\n" + " lsl r4, r4, #0x3\n" + " ldr r0, ._307 @ gTasks\n" + " add r4, r4, r0\n" + " bl Menu_DisplayDialogueFrame\n" + " ldr r0, ._307 + 4 @ gDebug0x839C008\n" + " mov r1, #0x2\n" + " mov r2, #0xf\n" + " bl Menu_PrintText\n" + " ldrh r0, [r4, #0xa]\n" + " ldrh r1, [r4, #0xc]\n" + " bl DebugMenu_8077EE0\n" + " ldr r0, ._307 + 8 @ DebugMenu_8077F7C\n" + " str r0, [r4]\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._308:\n" + " .align 2, 0\n" + "._307:\n" + " .word gTasks\n" + " .word gDebug0x839C008\n" + " .word DebugMenu_8077F7C+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077F7C() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x3\n" + " ldr r0, ._311 @ gTasks\n" + " add r4, r1, r0\n" + " ldr r3, ._311 + 4 @ gMain\n" + " ldrh r1, [r3, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._309 @cond_branch\n" + " bl Menu_DisplayDialogueFrame\n" + " ldr r0, ._311 + 8 @ Str_839C014\n" + " mov r1, #0x2\n" + " mov r2, #0xf\n" + " bl Menu_PrintText\n" + " ldrh r0, [r4, #0xa]\n" + " ldrh r1, [r4, #0xc]\n" + " bl DebugMenu_8077EE0\n" + " ldr r0, ._311 + 12 @ DebugMenu_8077FFC\n" + " str r0, [r4]\n" + " b ._317\n" + "._312:\n" + " .align 2, 0\n" + "._311:\n" + " .word gTasks\n" + " .word gMain\n" + " .word Str_839C014\n" + " .word DebugMenu_8077FFC+1\n" + "._309:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._313 @cond_branch\n" + " ldr r0, ._315 @ DebugMenu_807806C\n" + " str r0, [r4]\n" + " b ._317\n" + "._316:\n" + " .align 2, 0\n" + "._315:\n" + " .word DebugMenu_807806C+1\n" + "._313:\n" + " add r0, r4, #0\n" + " add r0, r0, #0xa\n" + " mov r2, #0xae\n" + " lsl r2, r2, #0x1\n" + " ldrh r3, [r3, #0x30]\n" + " mov r1, #0x1\n" + " bl DebugMenu_8077DD8\n" + " cmp r0, #0x1\n" + " bne ._317 @cond_branch\n" + " ldrh r0, [r4, #0xa]\n" + " ldrh r1, [r4, #0xc]\n" + " bl DebugMenu_8077EE0\n" + "._317:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077FFC() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x3\n" + " ldr r0, ._321 @ gTasks\n" + " add r4, r1, r0\n" + " ldr r2, ._321 + 4 @ gMain\n" + " ldrh r1, [r2, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._318 @cond_branch\n" + " ldrh r0, [r4, #0xa]\n" + " ldrh r1, [r4, #0xc]\n" + " bl AddBagItem\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " bne ._320 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " b ._320\n" + "._322:\n" + " .align 2, 0\n" + "._321:\n" + " .word gTasks\n" + " .word gMain\n" + "._318:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._323 @cond_branch\n" + "._320:\n" + " ldr r0, ._325 @ DebugMenu_8077F40\n" + " str r0, [r4]\n" + " b ._327\n" + "._326:\n" + " .align 2, 0\n" + "._325:\n" + " .word DebugMenu_8077F40+1\n" + "._323:\n" + " add r0, r4, #0\n" + " add r0, r0, #0xc\n" + " ldrh r3, [r2, #0x30]\n" + " mov r1, #0x1\n" + " mov r2, #0x63\n" + " bl DebugMenu_8077DD8\n" + " cmp r0, #0x1\n" + " bne ._327 @cond_branch\n" + " ldrh r0, [r4, #0xa]\n" + " ldrh r1, [r4, #0xc]\n" + " bl DebugMenu_8077EE0\n" + "._327:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_807806C() +{ + asm( + " push {r4, lr}\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " bl Menu_EraseScreen\n" + " bl ScriptContext2_Disable\n" + " add r0, r4, #0\n" + " bl DestroyTask\n" + " bl DebugMenu_8077048\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_807808C() +{ + asm( + " push {r4, r5, lr}\n" + " add sp, sp, #0xfffffff4\n" + " add r4, r0, #0\n" + " sub r0, r4, #1\n" + " cmp r0, #0xc\n" + " bls ._328 @cond_branch\n" + " mov r4, #0x1\n" + "._328:\n" + " lsl r1, r4, #0x5\n" + " ldr r0, ._331 @ gSaveBlock1\n" + " add r5, r1, r0\n" + " bl Menu_EraseScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x13\n" + " mov r3, #0x11\n" + " bl Menu_DrawStdWindowFrame\n" + " ldr r0, ._331 + 4 @ Str_839C01E\n" + " mov r1, #0x2\n" + " mov r2, #0x2\n" + " bl Menu_PrintText\n" + " mov r0, sp\n" + " add r1, r4, #0\n" + " mov r2, #0x1\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0xb\n" + " mov r2, #0x2\n" + " bl Menu_PrintText\n" + " ldrh r1, [r5, #0x8]\n" + " mov r0, sp\n" + " mov r2, #0x1\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0xb\n" + " mov r2, #0x4\n" + " bl Menu_PrintText\n" + " add r4, r5, #0\n" + " add r4, r4, #0xb\n" + " add r0, r4, #0\n" + " bl StringLength\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " cmp r0, #0xb\n" + " bhi ._329 @cond_branch\n" + " add r0, r4, #0\n" + " mov r1, #0xb\n" + " mov r2, #0x6\n" + " bl Menu_PrintText\n" + " b ._330\n" + "._332:\n" + " .align 2, 0\n" + "._331:\n" + " .word gSaveBlock1+0x2ddc\n" + " .word Str_839C01E\n" + "._329:\n" + " ldr r0, ._335 @ Str_839C04D\n" + " mov r1, #0xb\n" + " mov r2, #0x6\n" + " bl Menu_PrintText\n" + "._330:\n" + " add r4, r5, #0\n" + " add r4, r4, #0x16\n" + " add r0, r4, #0\n" + " bl StringLength\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " cmp r0, #0xb\n" + " bhi ._333 @cond_branch\n" + " add r0, r4, #0\n" + " mov r1, #0xb\n" + " mov r2, #0x8\n" + " bl Menu_PrintText\n" + " b ._334\n" + "._336:\n" + " .align 2, 0\n" + "._335:\n" + " .word Str_839C04D\n" + "._333:\n" + " ldr r0, ._337 @ Str_839C04D\n" + " mov r1, #0xb\n" + " mov r2, #0x8\n" + " bl Menu_PrintText\n" + "._334:\n" + " ldrb r1, [r5, #0xa]\n" + " mov r0, sp\n" + " mov r2, #0x1\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0xb\n" + " mov r2, #0xa\n" + " bl Menu_PrintText\n" + " ldr r1, [r5]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x8\n" + " bl ConvertIntToHexStringN\n" + " mov r0, sp\n" + " mov r1, #0xb\n" + " mov r2, #0xc\n" + " bl Menu_PrintText\n" + " add sp, sp, #0xc\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._338:\n" + " .align 2, 0\n" + "._337:\n" + " .word Str_839C04D\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_807817C() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " ldr r0, ._340 @ gMain\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._339 @cond_branch\n" + " bl Menu_EraseScreen\n" + " add r0, r4, #0\n" + " bl DestroyTask\n" + " bl ScriptContext2_Disable\n" + "._339:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._341:\n" + " .align 2, 0\n" + "._340:\n" + " .word gMain\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_80781A8() +{ + asm( + " push {r4, r5, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x3\n" + " ldr r0, ._344 @ gTasks\n" + " add r5, r1, r0\n" + " ldrh r1, [r5, #0x8]\n" + " mov r2, #0x8\n" + " ldsh r0, [r5, r2]\n" + " cmp r0, #0\n" + " bne ._342 @cond_branch\n" + " add r0, r1, #1\n" + " strh r0, [r5, #0x8]\n" + " b ._343\n" + "._345:\n" + " .align 2, 0\n" + "._344:\n" + " .word gTasks\n" + "._342:\n" + " ldr r2, ._348 @ gMain\n" + " ldrh r1, [r2, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._346 @cond_branch\n" + " mov r1, #0x8\n" + " ldsh r0, [r5, r1]\n" + " bl DebugMenu_807808C\n" + " ldr r0, ._348 + 4 @ DebugMenu_807817C\n" + " str r0, [r5]\n" + " b ._350\n" + "._349:\n" + " .align 2, 0\n" + "._348:\n" + " .word gMain\n" + " .word DebugMenu_807817C+1\n" + "._346:\n" + " add r0, r5, #0\n" + " add r0, r0, #0x8\n" + " ldrh r1, [r2, #0x30]\n" + " mov r3, #0xc0\n" + " and r3, r3, r1\n" + " mov r1, #0x1\n" + " mov r2, #0xd\n" + " bl DebugMenu_8077DD8\n" + " cmp r0, #0\n" + " beq ._350 @cond_branch\n" + "._343:\n" + " mov r0, #0x4\n" + " mov r1, #0x11\n" + " mov r2, #0x16\n" + " mov r3, #0x12\n" + " bl Menu_BlankWindowRect\n" + " ldr r4, ._351 @ gStringVar1\n" + " mov r2, #0x8\n" + " ldsh r1, [r5, r2]\n" + " add r0, r4, #0\n" + " mov r2, #0x1\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r4, #0\n" + " mov r1, #0x4\n" + " mov r2, #0x11\n" + " bl Menu_PrintText\n" + "._350:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._352:\n" + " .align 2, 0\n" + "._351:\n" + " .word gStringVar1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_ViewPortraits() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " ldr r0, ._353 @ DebugMenu_80781A8\n" + " mov r1, #0x50\n" + " bl CreateTask\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._354:\n" + " .align 2, 0\n" + "._353:\n" + " .word DebugMenu_80781A8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078254() +{ + asm( + " push {lr}\n" + " bl DebugMenu_807808C\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_AllBadges() +{ + asm( + " push {lr}\n" + " ldr r0, ._355 @ 0x807\n" + " bl FlagSet\n" + " ldr r0, ._355 + 4 @ 0x808\n" + " bl FlagSet\n" + " ldr r0, ._355 + 8 @ 0x809\n" + " bl FlagSet\n" + " ldr r0, ._355 + 12 @ 0x80a\n" + " bl FlagSet\n" + " ldr r0, ._355 + 16 @ 0x80b\n" + " bl FlagSet\n" + " ldr r0, ._355 + 20 @ 0x80c\n" + " bl FlagSet\n" + " ldr r0, ._355 + 24 @ 0x80d\n" + " bl FlagSet\n" + " ldr r0, ._355 + 28 @ 0x80e\n" + " bl FlagSet\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._356:\n" + " .align 2, 0\n" + "._355:\n" + " .word 0x807\n" + " .word 0x808\n" + " .word 0x809\n" + " .word 0x80a\n" + " .word 0x80b\n" + " .word 0x80c\n" + " .word 0x80d\n" + " .word 0x80e\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_TimeRecords() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " ldr r0, ._357 @ debug_sub_806F9E4\n" + " mov r1, #0x50\n" + " bl CreateTask\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._358:\n" + " .align 2, 0\n" + "._357:\n" + " .word debug_sub_806F9E4+1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_SetTime() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " bl debug_sub_806F99C\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_80782EC() +{ + asm( + " push {lr}\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " ldr r0, ._359 @ gStringVar1\n" + " mov r2, #0x0\n" + " mov r3, #0x4\n" + " bl ConvertIntToHexStringN\n" + " ldr r0, ._359 + 4 @ Str_839C053\n" + " bl sub_8071F40\n" + " pop {r0}\n" + " bx r0\n" + "._360:\n" + " .align 2, 0\n" + "._359:\n" + " .word gStringVar1\n" + " .word Str_839C053\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078310() +{ + asm( + " push {r4, r5, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " ldr r1, ._364 @ gTasks\n" + " add r4, r0, r1\n" + " mov r1, #0x0\n" + " ldsh r0, [r4, r1]\n" + " cmp r0, #0\n" + " beq ._361 @cond_branch\n" + " cmp r0, #0x1\n" + " beq ._362 @cond_branch\n" + " b ._375\n" + "._365:\n" + " .align 2, 0\n" + "._364:\n" + " .word gTasks+0x8\n" + "._361:\n" + " ldr r0, ._367 @ 0x4024\n" + " bl VarGet\n" + " strh r0, [r4, #0x2]\n" + " ldrh r0, [r4, #0x2]\n" + " bl DebugMenu_80782EC\n" + " ldrh r0, [r4]\n" + " add r0, r0, #0x1\n" + " strh r0, [r4]\n" + " b ._375\n" + "._368:\n" + " .align 2, 0\n" + "._367:\n" + " .word 0x4024\n" + "._362:\n" + " ldr r3, ._371 @ gMain\n" + " ldrh r1, [r3, #0x2e]\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._369 @cond_branch\n" + " mov r0, #0x49\n" + " bl PlaySE\n" + " ldr r0, ._371 + 4 @ 0x4024\n" + " bl GetVarPointer\n" + " ldrh r1, [r4, #0x2]\n" + " strh r1, [r0]\n" + " b ._370\n" + "._372:\n" + " .align 2, 0\n" + "._371:\n" + " .word gMain\n" + " .word 0x4024\n" + "._369:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._373 @cond_branch\n" + "._370:\n" + " bl Menu_EraseScreen\n" + " add r0, r5, #0\n" + " bl DestroyTask\n" + " bl ScriptContext2_Disable\n" + " b ._375\n" + "._373:\n" + " add r0, r4, #2\n" + " ldr r2, ._376 @ 0xffff\n" + " ldrh r3, [r3, #0x30]\n" + " mov r1, #0x0\n" + " bl DebugMenu_8077DD8\n" + " cmp r0, #0x1\n" + " bne ._375 @cond_branch\n" + " ldrh r0, [r4, #0x2]\n" + " bl DebugMenu_80782EC\n" + "._375:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._377:\n" + " .align 2, 0\n" + "._376:\n" + " .word 0xffff\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_MiragaIslandRND() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " ldr r0, ._378 @ DebugMenu_8078310\n" + " mov r1, #0x50\n" + " bl CreateTask\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._379:\n" + " .align 2, 0\n" + "._378:\n" + " .word DebugMenu_8078310+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_80783C8() +{ + asm( + " push {r4, lr}\n" + " ldr r0, ._383 @ gMain\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x30\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._382 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r4, ._383 + 4 @ 0x804\n" + " add r0, r4, #0\n" + " bl FlagGet\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._381 @cond_branch\n" + " add r0, r4, #0\n" + " bl FlagSet\n" + " mov r0, #0x0\n" + " bl DebugMenu_807786C\n" + " b ._382\n" + "._384:\n" + " .align 2, 0\n" + "._383:\n" + " .word gMain\n" + " .word 0x804\n" + "._381:\n" + " add r0, r4, #0\n" + " bl FlagClear\n" + " mov r0, #0x1\n" + " bl DebugMenu_807786C\n" + "._382:\n" + " ldr r0, ._388 @ gMain\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._385 @cond_branch\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._386 @cond_branch\n" + "._385:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " b ._387\n" + "._389:\n" + " .align 2, 0\n" + "._388:\n" + " .word gMain\n" + "._386:\n" + " mov r0, #0x0\n" + "._387:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_ToggleClearFlag() +{ + asm( + " push {lr}\n" + " bl Menu_EraseScreen\n" + " ldr r0, ._390 @ 0x804\n" + " bl FlagGet\n" + " mov r1, #0x1\n" + " eor r0, r0, r1\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl DebugMenu_807786C\n" + " ldr r1, ._390 + 4 @ gMenuCallback\n" + " ldr r0, ._390 + 8 @ DebugMenu_80783C8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._391:\n" + " .align 2, 0\n" + "._390:\n" + " .word 0x804\n" + " .word gMenuCallback\n" + " .word DebugMenu_80783C8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078464() +{ + asm( + " push {r4, lr}\n" + " ldr r4, ._396 @ 0x82a\n" + " add r0, r4, #0\n" + " bl FlagGet\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl DebugMenu_8077E40\n" + " add r1, r0, #0\n" + " cmp r1, #0\n" + " beq ._392 @cond_branch\n" + " cmp r1, #0\n" + " bgt ._393 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._394 @cond_branch\n" + " b ._401\n" + "._397:\n" + " .align 2, 0\n" + "._396:\n" + " .word 0x82a\n" + "._393:\n" + " cmp r1, #0x1\n" + " beq ._398 @cond_branch\n" + " b ._401\n" + "._392:\n" + " add r0, r4, #0\n" + " bl FlagClear\n" + " b ._401\n" + "._398:\n" + " add r0, r4, #0\n" + " bl FlagSet\n" + " b ._401\n" + "._394:\n" + " mov r0, #0x1\n" + " b ._402\n" + "._401:\n" + " mov r0, #0x0\n" + "._402:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_OpenWeatherEvents() +{ + asm( + " push {lr}\n" + " bl Menu_EraseScreen\n" + " ldr r0, ._404 @ 0x82a\n" + " bl FlagGet\n" + " mov r1, #0x0\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._403 @cond_branch\n" + " mov r1, #0x1\n" + "._403:\n" + " add r0, r1, #0\n" + " bl DebugMenu_807786C\n" + " ldr r1, ._404 + 4 @ gMenuCallback\n" + " ldr r0, ._404 + 8 @ DebugMenu_8078464\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._405:\n" + " .align 2, 0\n" + "._404:\n" + " .word 0x82a\n" + " .word gMenuCallback\n" + " .word DebugMenu_8078464+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_80784E8() +{ + asm( + " push {lr}\n" + " bl IsMysteryGiftEnabled\n" + " bl DebugMenu_8077E40\n" + " add r1, r0, #0\n" + " cmp r1, #0\n" + " beq ._406 @cond_branch\n" + " cmp r1, #0\n" + " bgt ._407 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._408 @cond_branch\n" + " b ._413\n" + "._407:\n" + " cmp r1, #0x1\n" + " beq ._410 @cond_branch\n" + " b ._413\n" + "._406:\n" + " bl DisableMysteryGift\n" + " b ._413\n" + "._410:\n" + " bl EnableMysteryGift\n" + " b ._413\n" + "._408:\n" + " mov r0, #0x1\n" + " b ._414\n" + "._413:\n" + " mov r0, #0x0\n" + "._414:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_OpenMysteryEvent() +{ + asm( + " push {lr}\n" + " bl Menu_EraseScreen\n" + " bl IsMysteryGiftEnabled\n" + " mov r1, #0x0\n" + " cmp r0, #0\n" + " bne ._415 @cond_branch\n" + " mov r1, #0x1\n" + "._415:\n" + " add r0, r1, #0\n" + " bl DebugMenu_807786C\n" + " ldr r1, ._416 @ gMenuCallback\n" + " ldr r0, ._416 + 4 @ DebugMenu_80784E8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._417:\n" + " .align 2, 0\n" + "._416:\n" + " .word gMenuCallback\n" + " .word DebugMenu_80784E8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078550() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " lsl r0, r0, #0x10\n" + " lsr r6, r0, #0x10\n" + " lsl r0, r6, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl GetGameStat\n" + " add r7, r0, #0\n" + " ldr r0, ._420 @ gStringVar1\n" + " add r1, r6, #0\n" + " mov r2, #0x2\n" + " mov r3, #0x2\n" + " bl ConvertIntToDecimalStringN\n" + " ldr r0, ._420 + 4 @ gStringVar2\n" + " ldr r5, ._420 + 8 @ gUnknown_Debug_839C26C\n" + " lsl r4, r6, #0x3\n" + " add r1, r5, #4\n" + " add r1, r4, r1\n" + " ldr r1, [r1]\n" + " bl StringCopy\n" + " add r4, r4, r5\n" + " ldr r0, [r4]\n" + " cmp r0, #0\n" + " bne ._418 @cond_branch\n" + " ldr r0, ._420 + 12 @ gStringVar3\n" + " ldr r1, ._420 + 16 @ Str_839C085\n" + " bl StringCopy\n" + " b ._423\n" + "._421:\n" + " .align 2, 0\n" + "._420:\n" + " .word gStringVar1\n" + " .word gStringVar2\n" + " .word gUnknown_Debug_839C26C\n" + " .word gStringVar3\n" + " .word Str_839C085\n" + "._418:\n" + " cmp r6, #0x1\n" + " beq ._422 @cond_branch\n" + " ldr r0, ._424 @ gStringVar3\n" + " add r1, r7, #0\n" + " mov r2, #0x1\n" + " mov r3, #0xa\n" + " bl ConvertIntToDecimalStringN\n" + " b ._423\n" + "._425:\n" + " .align 2, 0\n" + "._424:\n" + " .word gStringVar3\n" + "._422:\n" + " ldr r4, ._426 @ gStringVar3\n" + " lsr r1, r7, #0x10\n" + " add r0, r4, #0\n" + " mov r2, #0x1\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " mov r6, #0xf0\n" + " strb r6, [r4, #0x3]\n" + " add r0, r4, #4\n" + " lsr r1, r7, #0x8\n" + " mov r5, #0xff\n" + " and r1, r1, r5\n" + " mov r2, #0x2\n" + " mov r3, #0x2\n" + " bl ConvertIntToDecimalStringN\n" + " strb r6, [r4, #0x6]\n" + " add r4, r4, #0x7\n" + " and r7, r7, r5\n" + " add r0, r4, #0\n" + " add r1, r7, #0\n" + " mov r2, #0x2\n" + " mov r3, #0x2\n" + " bl ConvertIntToDecimalStringN\n" + "._423:\n" + " bl Menu_DisplayDialogueFrame\n" + " ldr r0, ._426 + 4 @ Str_839C07C\n" + " mov r1, #0x2\n" + " mov r2, #0xf\n" + " bl Menu_PrintText\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._427:\n" + " .align 2, 0\n" + "._426:\n" + " .word gStringVar3\n" + " .word Str_839C07C\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_807860C() +{ + asm( + " push {r4, r5, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " ldr r1, ._432 @ gTasks\n" + " add r4, r0, r1\n" + " mov r1, #0x0\n" + " ldsh r0, [r4, r1]\n" + " cmp r0, #0x1\n" + " beq ._428 @cond_branch\n" + " cmp r0, #0x1\n" + " bgt ._429 @cond_branch\n" + " cmp r0, #0\n" + " beq ._430 @cond_branch\n" + " b ._447\n" + "._433:\n" + " .align 2, 0\n" + "._432:\n" + " .word gTasks+0x8\n" + "._429:\n" + " cmp r0, #0x2\n" + " beq ._434 @cond_branch\n" + " b ._447\n" + "._430:\n" + " ldrh r0, [r4, #0x2]\n" + " bl DebugMenu_8078550\n" + "._441:\n" + " ldrh r0, [r4]\n" + " add r0, r0, #0x1\n" + " strh r0, [r4]\n" + " b ._447\n" + "._428:\n" + " ldr r3, ._439 @ gMain\n" + " ldrh r1, [r3, #0x2e]\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._437 @cond_branch\n" + " ldrh r0, [r4]\n" + " sub r0, r0, #0x1\n" + " strh r0, [r4]\n" + " mov r0, #0x1\n" + " b ._438\n" + "._440:\n" + " .align 2, 0\n" + "._439:\n" + " .word gMain\n" + "._437:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x10\n" + " lsr r2, r0, #0x10\n" + " cmp r2, #0\n" + " bne ._441 @cond_branch\n" + " ldrh r1, [r3, #0x30]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._442 @cond_branch\n" + " ldrh r0, [r4, #0x2]\n" + " add r0, r0, #0x1\n" + " strh r0, [r4, #0x2]\n" + " lsl r0, r0, #0x10\n" + " asr r0, r0, #0x10\n" + " cmp r0, #0x32\n" + " bne ._446 @cond_branch\n" + " strh r2, [r4, #0x2]\n" + " b ._446\n" + "._442:\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._447 @cond_branch\n" + " ldrh r0, [r4, #0x2]\n" + " sub r0, r0, #0x1\n" + " strh r0, [r4, #0x2]\n" + " lsl r0, r0, #0x10\n" + " cmp r0, #0\n" + " bge ._446 @cond_branch\n" + " mov r0, #0x31\n" + " strh r0, [r4, #0x2]\n" + "._446:\n" + " ldrh r0, [r4, #0x2]\n" + " bl DebugMenu_8078550\n" + " b ._447\n" + "._434:\n" + " bl Menu_EraseScreen\n" + " bl ScriptContext2_Disable\n" + " add r0, r5, #0\n" + " bl DestroyTask\n" + "._447:\n" + " mov r0, #0x0\n" + "._438:\n" + " pop {r4, r5}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_80786C0() +{ + asm( + " push {lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl DebugMenu_807860C\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_80786D0() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " add r0, r4, #0\n" + " bl DebugMenu_807860C\n" + " cmp r0, #0\n" + " beq ._449 @cond_branch\n" + " ldr r1, ._450 @ gTasks\n" + " lsl r0, r4, #0x2\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldrb r2, [r0, #0xa]\n" + " ldr r1, ._450 + 4 @ gUnknown_Debug_839C26C\n" + " lsl r0, r2, #0x3\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " cmp r0, #0\n" + " beq ._449 @cond_branch\n" + " sub r1, r0, #1\n" + " add r0, r2, #0\n" + " bl SetGameStat\n" + " mov r0, #0x15\n" + " bl PlaySE\n" + "._449:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._451:\n" + " .align 2, 0\n" + "._450:\n" + " .word gTasks\n" + " .word gUnknown_Debug_839C26C\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078714() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " add r0, r4, #0\n" + " bl DebugMenu_807860C\n" + " cmp r0, #0\n" + " beq ._453 @cond_branch\n" + " ldr r1, ._454 @ gTasks\n" + " lsl r0, r4, #0x2\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldrb r2, [r0, #0xa]\n" + " ldr r1, ._454 + 4 @ gUnknown_Debug_839C26C\n" + " lsl r0, r2, #0x3\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " cmp r0, #0\n" + " beq ._453 @cond_branch\n" + " add r0, r2, #0\n" + " mov r1, #0x0\n" + " bl SetGameStat\n" + " mov r0, #0x15\n" + " bl PlaySE\n" + "._453:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._455:\n" + " .align 2, 0\n" + "._454:\n" + " .word gTasks\n" + " .word gUnknown_Debug_839C26C\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078758() +{ + asm( + " push {r4, lr}\n" + " add r4, r0, #0\n" + " bl CloseMenu\n" + " bl ScriptContext2_Enable\n" + " add r0, r4, #0\n" + " mov r1, #0x50\n" + " bl CreateTask\n" + " mov r0, #0x1\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078774() +{ + asm( + " push {lr}\n" + " ldr r0, ._456 @ DebugMenu_80786C0\n" + " bl DebugMenu_8078758\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "._457:\n" + " .align 2, 0\n" + "._456:\n" + " .word DebugMenu_80786C0+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078788() +{ + asm( + " push {lr}\n" + " ldr r0, ._458 @ DebugMenu_80786D0\n" + " bl DebugMenu_8078758\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "._459:\n" + " .align 2, 0\n" + "._458:\n" + " .word DebugMenu_80786D0+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_807879C() +{ + asm( + " push {lr}\n" + " ldr r0, ._460 @ DebugMenu_8078714\n" + " bl DebugMenu_8078758\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "._461:\n" + " .align 2, 0\n" + "._460:\n" + " .word DebugMenu_8078714+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_80787B0() +{ + asm( + " push {lr}\n" + " ldr r0, ._462 @ gUnknown_Debug_839C3FC\n" + " bl DebugMenu_8077D78\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "._463:\n" + " .align 2, 0\n" + "._462:\n" + " .word gUnknown_Debug_839C3FC\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_OpenLegendsRecord() +{ + asm( + " push {lr}\n" + " bl Menu_EraseScreen\n" + " ldr r0, ._464 @ gUnknown_Debug_839C3FC\n" + " mov r1, #0xc\n" + " mov r2, #0x3\n" + " bl DebugMenu_8077D24\n" + " ldr r1, ._464 + 4 @ gMenuCallback\n" + " ldr r0, ._464 + 8 @ DebugMenu_80787B0\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._465:\n" + " .align 2, 0\n" + "._464:\n" + " .word gUnknown_Debug_839C3FC\n" + " .word gMenuCallback\n" + " .word DebugMenu_80787B0+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_80787EC() +{ + asm( + " push {r4, r5, lr}\n" + " add sp, sp, #0xfffffffc\n" + " mov r5, sp\n" + " add r5, r5, #0x2\n" + " mov r0, sp\n" + " add r1, r5, #0\n" + " bl GetXYCoordsOneStepInFrontOfPlayer\n" + " ldr r4, ._466 @ gSpecialVar_Result\n" + " mov r0, sp\n" + " mov r1, #0x0\n" + " ldsh r0, [r0, r1]\n" + " mov r2, #0x0\n" + " ldsh r1, [r5, r2]\n" + " bl MapGridGetMetatileBehaviorAt\n" + " strh r0, [r4]\n" + " ldr r0, ._466 + 4 @ gStringVar1\n" + " ldrh r1, [r4]\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToHexStringN\n" + " mov r0, sp\n" + " mov r1, #0x0\n" + " ldsh r0, [r0, r1]\n" + " mov r2, #0x0\n" + " ldsh r1, [r5, r2]\n" + " bl MapGridGetMetatileIdAt\n" + " strh r0, [r4]\n" + " ldr r0, ._466 + 8 @ gStringVar2\n" + " ldrh r1, [r4]\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToHexStringN\n" + " mov r0, sp\n" + " mov r1, #0x0\n" + " ldsh r0, [r0, r1]\n" + " mov r2, #0x0\n" + " ldsh r1, [r5, r2]\n" + " bl MapGridGetZCoordAt\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " strh r0, [r4]\n" + " ldr r0, ._466 + 12 @ gStringVar3\n" + " ldrh r1, [r4]\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToHexStringN\n" + " ldr r0, ._466 + 16 @ gStringVar4\n" + " ldr r1, ._466 + 20 @ Str_839C414\n" + " bl StringExpandPlaceholders\n" + " add sp, sp, #0x4\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._467:\n" + " .align 2, 0\n" + "._466:\n" + " .word gSpecialVar_Result\n" + " .word gStringVar1\n" + " .word gStringVar2\n" + " .word gStringVar3\n" + " .word gStringVar4\n" + " .word Str_839C414\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078880() +{ + asm( + " push {r4, r5, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " ldr r1, ._472 @ gTasks\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " add r4, r0, r1\n" + " mov r1, #0x8\n" + " ldsh r0, [r4, r1]\n" + " cmp r0, #0x1\n" + " beq ._468 @cond_branch\n" + " cmp r0, #0x1\n" + " bgt ._469 @cond_branch\n" + " cmp r0, #0\n" + " beq ._470 @cond_branch\n" + " b ._480\n" + "._473:\n" + " .align 2, 0\n" + "._472:\n" + " .word gTasks\n" + "._469:\n" + " cmp r0, #0x2\n" + " beq ._474 @cond_branch\n" + " b ._480\n" + "._470:\n" + " bl Menu_DisplayDialogueFrame\n" + " b ._476\n" + "._468:\n" + " ldr r0, ._478 @ gStringVar4\n" + " mov r1, #0x2\n" + " mov r2, #0xf\n" + " bl Menu_PrintText\n" + "._476:\n" + " ldrh r0, [r4, #0x8]\n" + " add r0, r0, #0x1\n" + " strh r0, [r4, #0x8]\n" + " b ._480\n" + "._479:\n" + " .align 2, 0\n" + "._478:\n" + " .word gStringVar4\n" + "._474:\n" + " ldr r0, ._481 @ gMain\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._480 @cond_branch\n" + " bl Menu_EraseScreen\n" + " bl ScriptContext2_Disable\n" + " add r0, r5, #0\n" + " bl DestroyTask\n" + "._480:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._482:\n" + " .align 2, 0\n" + "._481:\n" + " .word gMain\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_CellInfo() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " ldr r0, ._483 @ DebugMenu_8078880\n" + " mov r1, #0x50\n" + " bl CreateTask\n" + " bl DebugMenu_80787EC\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._484:\n" + " .align 2, 0\n" + "._483:\n" + " .word DebugMenu_8078880+1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_OpenBerryInfo() +{ + asm( + " push {r4, lr}\n" + " bl DebugOpenBerryInfo\n" + " add r4, r0, #0\n" + " cmp r4, #0\n" + " bne ._485 @cond_branch\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " b ._486\n" + "._485:\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x13\n" + " mov r3, #0x13\n" + " bl Menu_DrawStdWindowFrame\n" + " add r0, r4, #0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl Menu_PrintText\n" + " ldr r1, ._487 @ gMenuCallback\n" + " ldr r0, ._487 + 4 @ DebugMenu_8077DB4\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + "._486:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "._488:\n" + " .align 2, 0\n" + "._487:\n" + " .word gMenuCallback\n" + " .word DebugMenu_8077DB4+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078950() +{ + asm( + " push {lr}\n" + " bl Menu_DisplayDialogueFrame\n" + " ldr r0, ._489 @ Str_839C42E\n" + " mov r1, #0x4\n" + " mov r2, #0xf\n" + " bl Menu_PrintText\n" + " pop {r0}\n" + " bx r0\n" + "._490:\n" + " .align 2, 0\n" + "._489:\n" + " .word Str_839C42E\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078968() +{ + asm( + " push {lr}\n" + " lsl r0, r0, #0x10\n" + " cmp r0, #0\n" + " bne ._491 @cond_branch\n" + " ldr r0, ._493 @ gStringVar1\n" + " mov r1, #0x32\n" + " mov r2, #0x2\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " b ._492\n" + "._494:\n" + " .align 2, 0\n" + "._493:\n" + " .word gStringVar1\n" + "._491:\n" + " ldr r0, ._495 @ gStringVar1\n" + " mov r1, #0x64\n" + " mov r2, #0x2\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + "._492:\n" + " ldr r0, ._495 @ gStringVar1\n" + " mov r1, #0x4\n" + " mov r2, #0x11\n" + " bl Menu_PrintText\n" + " pop {r0}\n" + " bx r0\n" + "._496:\n" + " .align 2, 0\n" + "._495:\n" + " .word gStringVar1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_80789A4() +{ + asm( + " push {r4, lr}\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " ldr r4, ._497 @ gStringVar1\n" + " add r0, r4, #0\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r4, #0\n" + " mov r1, #0x9\n" + " mov r2, #0x11\n" + " bl Menu_PrintText\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._498:\n" + " .align 2, 0\n" + "._497:\n" + " .word gStringVar1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_80789CC() +{ + asm( + " push {r4, r5, r6, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " lsl r4, r0, #0x2\n" + " add r4, r4, r0\n" + " lsl r4, r4, #0x3\n" + " ldr r6, ._499 @ gTasks\n" + " add r5, r4, r6\n" + " mov r0, #0x0\n" + " strh r0, [r5]\n" + " ldr r0, ._499 + 4 @ gSaveBlock2\n" + " ldr r1, ._499 + 8 @ 0x55c\n" + " add r0, r0, r1\n" + " ldrh r0, [r0]\n" + " strh r0, [r5, #0x2]\n" + " bl DebugMenu_8078950\n" + " ldrh r0, [r5]\n" + " bl DebugMenu_8078968\n" + " sub r6, r6, #0x8\n" + " add r4, r4, r6\n" + " ldr r0, ._499 + 12 @ DebugMenu_8078A14\n" + " str r0, [r4]\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._500:\n" + " .align 2, 0\n" + "._499:\n" + " .word gTasks+0x8\n" + " .word gSaveBlock2\n" + " .word 0x55c\n" + " .word DebugMenu_8078A14+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078A14() +{ + asm( + " push {r4, r5, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r4, r1, #0x3\n" + " ldr r5, ._504 @ gTasks\n" + " add r2, r4, r5\n" + " ldr r0, ._504 + 4 @ gMain\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0xc0\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._501 @cond_branch\n" + " mov r1, #0x0\n" + " mov r3, #0x0\n" + " ldsh r0, [r2, r3]\n" + " cmp r0, #0\n" + " bne ._502 @cond_branch\n" + " mov r1, #0x1\n" + "._502:\n" + " strh r1, [r2]\n" + " ldrh r0, [r2]\n" + " bl DebugMenu_8078968\n" + " b ._510\n" + "._505:\n" + " .align 2, 0\n" + "._504:\n" + " .word gTasks+0x8\n" + " .word gMain\n" + "._501:\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._506 @cond_branch\n" + " ldr r1, ._508 @ gSaveBlock2\n" + " mov r3, #0x0\n" + " ldsh r0, [r2, r3]\n" + " lsl r0, r0, #0x1\n" + " ldr r3, ._508 + 4 @ 0x55c\n" + " add r1, r1, r3\n" + " add r0, r0, r1\n" + " ldrh r0, [r0]\n" + " strh r0, [r2, #0x2]\n" + " ldrh r0, [r2, #0x2]\n" + " bl DebugMenu_80789A4\n" + " add r0, r5, #0\n" + " sub r0, r0, #0x8\n" + " add r0, r4, r0\n" + " ldr r1, ._508 + 8 @ DebugMenu_8078AA4\n" + " b ._507\n" + "._509:\n" + " .align 2, 0\n" + "._508:\n" + " .word gSaveBlock2\n" + " .word 0x55c\n" + " .word DebugMenu_8078AA4+1\n" + "._506:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._510 @cond_branch\n" + " add r0, r5, #0\n" + " sub r0, r0, #0x8\n" + " add r0, r4, r0\n" + " ldr r1, ._511 @ DebugMenu_8078B38\n" + "._507:\n" + " str r1, [r0]\n" + "._510:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._512:\n" + " .align 2, 0\n" + "._511:\n" + " .word DebugMenu_8078B38+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078AA4() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r5, r1, #0x3\n" + " ldr r7, ._515 @ gTasks\n" + " add r4, r5, r7\n" + " add r0, r4, #2\n" + " mov r2, #0xfa\n" + " lsl r2, r2, #0x3\n" + " ldr r6, ._515 + 4 @ gMain\n" + " ldrh r3, [r6, #0x30]\n" + " mov r1, #0x0\n" + " bl DebugMenu_8077DD8\n" + " cmp r0, #0x1\n" + " bne ._513 @cond_branch\n" + " ldrh r0, [r4, #0x2]\n" + " bl DebugMenu_80789A4\n" + " b ._521\n" + "._516:\n" + " .align 2, 0\n" + "._515:\n" + " .word gTasks+0x8\n" + " .word gMain\n" + "._513:\n" + " ldrh r1, [r6, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._517 @cond_branch\n" + " ldr r1, ._519 @ gSaveBlock2\n" + " mov r2, #0x0\n" + " ldsh r0, [r4, r2]\n" + " lsl r0, r0, #0x1\n" + " ldr r2, ._519 + 4 @ 0x55c\n" + " add r1, r1, r2\n" + " add r0, r0, r1\n" + " ldrh r1, [r4, #0x2]\n" + " strh r1, [r0]\n" + " mov r0, #0x49\n" + " bl PlaySE\n" + " add r0, r7, #0\n" + " sub r0, r0, #0x8\n" + " add r0, r5, r0\n" + " ldr r1, ._519 + 8 @ DebugMenu_8078B38\n" + " b ._518\n" + "._520:\n" + " .align 2, 0\n" + "._519:\n" + " .word gSaveBlock2\n" + " .word 0x55c\n" + " .word DebugMenu_8078B38+1\n" + "._517:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._521 @cond_branch\n" + " bl DebugMenu_8078950\n" + " ldrh r0, [r4]\n" + " bl DebugMenu_8078968\n" + " add r0, r7, #0\n" + " sub r0, r0, #0x8\n" + " add r0, r5, r0\n" + " ldr r1, ._522 @ DebugMenu_8078A14\n" + "._518:\n" + " str r1, [r0]\n" + "._521:\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._523:\n" + " .align 2, 0\n" + "._522:\n" + " .word DebugMenu_8078A14+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078B38() +{ + asm( + " push {r4, lr}\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " bl Menu_EraseScreen\n" + " bl ScriptContext2_Disable\n" + " add r0, r4, #0\n" + " bl DestroyTask\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_BattleTowerStages() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " bl ScriptContext2_Enable\n" + " ldr r0, ._524 @ DebugMenu_80789CC\n" + " mov r1, #0x50\n" + " bl CreateTask\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._525:\n" + " .align 2, 0\n" + "._524:\n" + " .word DebugMenu_80789CC+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078B70() +{ + asm( + " push {lr}\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " ldr r0, ._526 @ gStringVar1\n" + " mov r2, #0x0\n" + " mov r3, #0x1\n" + " bl ConvertIntToHexStringN\n" + " ldr r0, ._526 + 4 @ Str_839C438\n" + " bl sub_8071F40\n" + " pop {r0}\n" + " bx r0\n" + "._527:\n" + " .align 2, 0\n" + "._526:\n" + " .word gStringVar1\n" + " .word Str_839C438\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078B94() +{ + asm( + " push {r4, r5, lr}\n" + " mov r3, #0x0\n" + " ldr r1, ._531 @ gUnknown_Debug_839C444\n" + " ldrb r0, [r1]\n" + " cmp r0, #0\n" + " beq ._529 @cond_branch\n" + " ldr r5, ._531 + 4 @ gSaveBlock1\n" + " add r4, r1, #0\n" + "._530:\n" + " lsl r0, r3, #0x3\n" + " add r2, r0, r5\n" + " add r0, r0, r4\n" + " ldr r1, [r0, #0x4]\n" + " ldr r0, [r0]\n" + " str r0, [r2]\n" + " str r1, [r2, #0x4]\n" + " add r0, r3, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r3, r0, #0x18\n" + " cmp r3, #0x27\n" + " bhi ._529 @cond_branch\n" + " lsl r0, r3, #0x3\n" + " add r0, r0, r4\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " bne ._530 @cond_branch\n" + "._529:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._532:\n" + " .align 2, 0\n" + "._531:\n" + " .word gUnknown_Debug_839C444\n" + " .word gSaveBlock1+0x7f8\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078BD4() +{ + asm( + " push {r4, r5, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " ldr r1, ._536 @ gTasks\n" + " add r4, r0, r1\n" + " mov r1, #0x0\n" + " ldsh r0, [r4, r1]\n" + " cmp r0, #0\n" + " beq ._533 @cond_branch\n" + " cmp r0, #0x1\n" + " beq ._534 @cond_branch\n" + " b ._545\n" + "._537:\n" + " .align 2, 0\n" + "._536:\n" + " .word gTasks+0x8\n" + "._533:\n" + " ldrh r0, [r4, #0x2]\n" + " bl DebugMenu_8078B70\n" + " ldrh r0, [r4]\n" + " add r0, r0, #0x1\n" + " strh r0, [r4]\n" + " b ._545\n" + "._534:\n" + " ldr r2, ._541 @ gMain\n" + " ldrh r1, [r2, #0x2e]\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._539 @cond_branch\n" + " mov r0, #0x49\n" + " bl PlaySE\n" + " bl Menu_EraseScreen\n" + " add r0, r5, #0\n" + " bl DestroyTask\n" + " bl ScriptContext2_Disable\n" + " bl DebugMenu_8078B94\n" + " b ._545\n" + "._542:\n" + " .align 2, 0\n" + "._541:\n" + " .word gMain\n" + "._539:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._543 @cond_branch\n" + " bl Menu_EraseScreen\n" + " add r0, r5, #0\n" + " bl DestroyTask\n" + " bl ScriptContext2_Disable\n" + " b ._545\n" + "._543:\n" + " add r0, r4, #2\n" + " ldrh r3, [r2, #0x30]\n" + " mov r1, #0x0\n" + " mov r2, #0x4\n" + " bl DebugMenu_8077DD8\n" + " cmp r0, #0x1\n" + " bne ._545 @cond_branch\n" + " ldrh r0, [r4, #0x2]\n" + " bl DebugMenu_8078B70\n" + "._545:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_CheckPKBLCK() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " ldr r0, ._546 @ DebugMenu_8078BD4\n" + " mov r1, #0x50\n" + " bl CreateTask\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._547:\n" + " .align 2, 0\n" + "._546:\n" + " .word DebugMenu_8078BD4+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078C80() +{ + asm( + " push {lr}\n" + " bl Menu_DisplayDialogueFrame\n" + " ldr r0, ._548 @ Str_839C5A4\n" + " mov r1, #0x2\n" + " mov r2, #0xf\n" + " bl Menu_PrintText\n" + " ldr r1, ._548 + 4 @ gMenuCallback\n" + " ldr r0, ._548 + 8 @ DebugMenu_8078CA8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._549:\n" + " .align 2, 0\n" + "._548:\n" + " .word Str_839C5A4\n" + " .word gMenuCallback\n" + " .word DebugMenu_8078CA8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078CA8() +{ + asm( + " push {lr}\n" + " ldr r0, ._552 @ gMain\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._550 @cond_branch\n" + " ldr r1, ._552 + 4 @ gMenuCallback\n" + " ldr r0, ._552 + 8 @ DebugMenu_8078CE4\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " b ._555\n" + "._553:\n" + " .align 2, 0\n" + "._552:\n" + " .word gMain\n" + " .word gMenuCallback\n" + " .word DebugMenu_8078CE4+1\n" + "._550:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._554 @cond_branch\n" + " mov r0, #0x0\n" + " b ._555\n" + "._554:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._555:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078CE4() +{ + asm( + " push {lr}\n" + " ldr r1, ._558 @ \n" + " mov r2, #0x80\n" + " lsl r2, r2, #0xa\n" + " mov r0, #0x0\n" + " bl DebugMenu_8078E40\n" + " cmp r0, #0x1\n" + " bne ._556 @cond_branch\n" + " ldr r0, ._558 + 4 @ \n" + " ldr r1, ._558 + 8 @ \n" + " bl StringCopy\n" + " b ._557\n" + "._559:\n" + " .align 2, 0\n" + "._558:\n" + " .word +0x2000000\n" + " .word gStringVar4\n" + " .word Str_839C5CC\n" + "._556:\n" + " ldr r0, ._560 @ gStringVar4\n" + " ldr r1, ._560 + 4 @ Str_839C5DF\n" + " bl StringCopy\n" + "._557:\n" + " ldr r1, ._560 + 8 @ gMenuCallback\n" + " ldr r0, ._560 + 12 @ DebugMenu_8078D7C\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._561:\n" + " .align 2, 0\n" + "._560:\n" + " .word gStringVar4\n" + " .word Str_839C5DF\n" + " .word gMenuCallback\n" + " .word DebugMenu_8078D7C+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078D30() +{ + asm( + " push {r4, r5, r6, lr}\n" + " ldr r5, ._563 @ \n" + " mov r4, #0x0\n" + " mov r6, #0x80\n" + " lsl r6, r6, #0x5\n" + "._562:\n" + " add r0, r4, #0\n" + " add r1, r5, #0\n" + " add r2, r6, #0\n" + " bl DebugMenu_8078E68\n" + " add r5, r5, r6\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " cmp r4, #0x1f\n" + " bls ._562 @cond_branch\n" + " ldr r0, ._563 + 4 @ \n" + " ldr r1, ._563 + 8 @ \n" + " bl StringCopy\n" + " ldr r1, ._563 + 12 @ \n" + " ldr r0, ._563 + 16 @ \n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r4, r5, r6}\n" + " pop {r1}\n" + " bx r1\n" + "._564:\n" + " .align 2, 0\n" + "._563:\n" + " .word +0x2000000\n" + " .word gStringVar4\n" + " .word Str_839C5D6\n" + " .word gMenuCallback\n" + " .word DebugMenu_8078D7C+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078D7C() +{ + asm( + " push {lr}\n" + " bl Menu_DisplayDialogueFrame\n" + " ldr r0, ._565 @ gStringVar4\n" + " mov r1, #0x2\n" + " mov r2, #0xf\n" + " bl Menu_PrintText\n" + " ldr r1, ._565 + 4 @ gMenuCallback\n" + " ldr r0, ._565 + 8 @ DebugMenu_8078DA4\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._566:\n" + " .align 2, 0\n" + "._565:\n" + " .word gStringVar4\n" + " .word gMenuCallback\n" + " .word DebugMenu_8078DA4+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078DA4() +{ + asm( + " push {lr}\n" + " ldr r0, ._569 @ gMain\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._567 @cond_branch\n" + " mov r0, #0x0\n" + " b ._568\n" + "._570:\n" + " .align 2, 0\n" + "._569:\n" + " .word gMain\n" + "._567:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._568:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_MeTooBackupMan() +{ + asm( + " push {lr}\n" + " bl Menu_EraseScreen\n" + " ldr r0, ._571 @ gUnknown_Debug_839C594\n" + " mov r1, #0xc\n" + " mov r2, #0x2\n" + " bl DebugMenu_8077D24\n" + " ldr r1, ._571 + 4 @ gMenuCallback\n" + " ldr r0, ._571 + 8 @ DebugMenu_8078DF0\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._572:\n" + " .align 2, 0\n" + "._571:\n" + " .word gUnknown_Debug_839C594\n" + " .word gMenuCallback\n" + " .word DebugMenu_8078DF0+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078DF0() +{ + asm( + " push {lr}\n" + " ldr r0, ._573 @ gUnknown_Debug_839C594\n" + " bl DebugMenu_8077D78\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "._574:\n" + " .align 2, 0\n" + "._573:\n" + " .word gUnknown_Debug_839C594\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078E04() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add r6, r1, #0\n" + " add r5, r2, #0\n" + " b ._575\n" + "._577:\n" + " ldr r0, ._579 @ 0xfffff000\n" + " add r5, r5, r0\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x5\n" + " add r6, r6, r0\n" + " add r0, r4, #1\n" + "._575:\n" + " lsl r0, r0, #0x10\n" + " lsr r4, r0, #0x10\n" + " add r0, r4, #0\n" + " add r1, r6, #0\n" + " bl ProgramFlashSectorAndVerify\n" + " cmp r0, #0\n" + " bne ._576 @cond_branch\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x5\n" + " cmp r5, r0\n" + " bhi ._577 @cond_branch\n" + " mov r0, #0x1\n" + " b ._578\n" + "._580:\n" + " .align 2, 0\n" + "._579:\n" + " .word 0xfffff000\n" + "._576:\n" + " mov r0, #0x0\n" + "._578:\n" + " pop {r4, r5, r6}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078E40() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add r4, r0, #0\n" + " add r5, r1, #0\n" + " add r6, r2, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " bl m4aSoundVSyncOff\n" + " add r0, r4, #0\n" + " add r1, r5, #0\n" + " add r2, r6, #0\n" + " bl DebugMenu_8078E04\n" + " add r4, r0, #0\n" + " bl m4aSoundVSyncOn\n" + " add r0, r4, #0\n" + " pop {r4, r5, r6}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078E68() +{ + asm( + " push {r4, lr}\n" + " add r4, r1, #0\n" + " add r3, r2, #0\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r1, #0x0\n" + " add r2, r4, #0\n" + " bl ReadFlash\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078E80() +{ + asm( + " push {r4, lr}\n" + " add r4, r0, #0\n" + " mov r0, #0x2\n" + " mov r1, #0xf\n" + " mov r2, #0x16\n" + " mov r3, #0x10\n" + " bl Menu_BlankWindowRect\n" + " ldr r1, ._581 @ gUnknown_Debug_839C5F4\n" + " mov r2, #0x0\n" + " ldsh r0, [r4, r2]\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldrb r1, [r0, #0x4]\n" + " mov r0, #0xd0\n" + " mov r2, #0xf\n" + " bl sub_8071F60\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._582:\n" + " .align 2, 0\n" + "._581:\n" + " .word gUnknown_Debug_839C5F4\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078EB0() +{ + asm( + " push {r4, r5, lr}\n" + " add r5, r0, #0\n" + " ldr r4, ._583 @ gStringVar1\n" + " mov r0, #0x2\n" + " ldsh r1, [r5, r0]\n" + " add r0, r4, #0\n" + " mov r2, #0x1\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r4, #0\n" + " mov r1, #0x2\n" + " mov r2, #0x11\n" + " bl Menu_PrintText\n" + " mov r0, #0xf0\n" + " mov r1, #0x5\n" + " mov r2, #0x11\n" + " bl sub_8071F60\n" + " mov r0, #0x4\n" + " ldsh r1, [r5, r0]\n" + " add r0, r4, #0\n" + " mov r2, #0x2\n" + " mov r3, #0x2\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r4, #0\n" + " mov r1, #0x6\n" + " mov r2, #0x11\n" + " bl Menu_PrintText\n" + " mov r0, #0xf0\n" + " mov r1, #0x8\n" + " mov r2, #0x11\n" + " bl sub_8071F60\n" + " mov r0, #0x6\n" + " ldsh r1, [r5, r0]\n" + " add r0, r4, #0\n" + " mov r2, #0x2\n" + " mov r3, #0x2\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r4, #0\n" + " mov r1, #0x9\n" + " mov r2, #0x11\n" + " bl Menu_PrintText\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._584:\n" + " .align 2, 0\n" + "._583:\n" + " .word gStringVar1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078F1C() +{ + asm( + " push {r4, r5, r6, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " lsl r4, r0, #0x2\n" + " add r4, r4, r0\n" + " lsl r4, r4, #0x3\n" + " ldr r6, ._585 @ gTasks\n" + " add r5, r4, r6\n" + " mov r0, #0x0\n" + " strh r0, [r5]\n" + " ldr r1, ._585 + 4 @ gSaveBlock2\n" + " ldrh r0, [r1, #0xe]\n" + " strh r0, [r5, #0x2]\n" + " ldrb r0, [r1, #0x10]\n" + " strh r0, [r5, #0x4]\n" + " ldrb r0, [r1, #0x11]\n" + " strh r0, [r5, #0x6]\n" + " bl Menu_DisplayDialogueFrame\n" + " add r0, r5, #0\n" + " bl DebugMenu_8078EB0\n" + " add r0, r5, #0\n" + " bl DebugMenu_8078E80\n" + " sub r6, r6, #0x8\n" + " add r4, r4, r6\n" + " ldr r0, ._585 + 8 @ DebugMenu_8078F68\n" + " str r0, [r4]\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._586:\n" + " .align 2, 0\n" + "._585:\n" + " .word gTasks+0x8\n" + " .word gSaveBlock2\n" + " .word DebugMenu_8078F68+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078F68() +{ + asm( + " push {r4, r5, r6, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r5, r1, #0x3\n" + " ldr r6, ._589 @ gTasks\n" + " add r4, r5, r6\n" + " ldr r3, ._589 + 4 @ gMain\n" + " ldrh r1, [r3, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._587 @cond_branch\n" + " ldr r1, ._589 + 8 @ gSaveBlock2\n" + " ldrh r0, [r4, #0x2]\n" + " strh r0, [r1, #0xe]\n" + " ldrh r0, [r4, #0x4]\n" + " strb r0, [r1, #0x10]\n" + " ldrh r0, [r4, #0x6]\n" + " strb r0, [r1, #0x11]\n" + " mov r0, #0x49\n" + " bl PlaySE\n" + " b ._588\n" + "._590:\n" + " .align 2, 0\n" + "._589:\n" + " .word gTasks+0x8\n" + " .word gMain\n" + " .word gSaveBlock2\n" + "._587:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._591 @cond_branch\n" + "._588:\n" + " add r0, r6, #0\n" + " sub r0, r0, #0x8\n" + " add r0, r5, r0\n" + " ldr r1, ._593 @ DebugMenu_8079020\n" + " str r1, [r0]\n" + " b ._601\n" + "._594:\n" + " .align 2, 0\n" + "._593:\n" + " .word DebugMenu_8079020+1\n" + "._591:\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._595 @cond_branch\n" + " ldrh r1, [r4]\n" + " mov r2, #0x0\n" + " ldsh r0, [r4, r2]\n" + " cmp r0, #0\n" + " beq ._601 @cond_branch\n" + " sub r0, r1, #1\n" + " b ._597\n" + "._595:\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._598 @cond_branch\n" + " ldrh r0, [r4]\n" + " cmp r0, #0x1\n" + " bhi ._601 @cond_branch\n" + " add r0, r0, #0x1\n" + "._597:\n" + " strh r0, [r4]\n" + " add r0, r4, #0\n" + " bl DebugMenu_8078E80\n" + " b ._601\n" + "._598:\n" + " mov r0, #0x0\n" + " ldsh r2, [r4, r0]\n" + " lsl r2, r2, #0x3\n" + " ldr r0, ._602 @ gUnknown_Debug_839C5F4\n" + " add r2, r2, r0\n" + " ldrb r0, [r2, #0x5]\n" + " lsl r0, r0, #0x1\n" + " add r0, r4, r0\n" + " ldrh r1, [r2]\n" + " ldrh r2, [r2, #0x2]\n" + " ldrh r3, [r3, #0x30]\n" + " bl DebugMenu_8077DD8\n" + " cmp r0, #0x1\n" + " bne ._601 @cond_branch\n" + " add r0, r4, #0\n" + " bl DebugMenu_8078EB0\n" + "._601:\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._603:\n" + " .align 2, 0\n" + "._602:\n" + " .word gUnknown_Debug_839C5F4\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8079020() +{ + asm( + " push {r4, lr}\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " bl Menu_EraseScreen\n" + " bl ScriptContext2_Disable\n" + " add r0, r4, #0\n" + " bl DestroyTask\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_PTime() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " ldr r0, ._604 @ DebugMenu_8078F1C\n" + " mov r1, #0x50\n" + " bl CreateTask\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._605:\n" + " .align 2, 0\n" + "._604:\n" + " .word DebugMenu_8078F1C+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8079058() +{ + asm( + " push {r4, r5, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " ldr r1, ._610 @ gTasks\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " add r4, r0, r1\n" + " mov r0, #0x8\n" + " ldsh r1, [r4, r0]\n" + " cmp r1, #0x1\n" + " beq ._606 @cond_branch\n" + " cmp r1, #0x1\n" + " bgt ._607 @cond_branch\n" + " cmp r1, #0\n" + " beq ._608 @cond_branch\n" + " b ._620\n" + "._611:\n" + " .align 2, 0\n" + "._610:\n" + " .word gTasks\n" + "._607:\n" + " cmp r1, #0x2\n" + " beq ._612 @cond_branch\n" + " b ._620\n" + "._608:\n" + " ldr r0, ._615 @ gUnknown_Debug_03004BD0\n" + " str r1, [r0]\n" + " bl Menu_DisplayDialogueFrame\n" + " b ._614\n" + "._616:\n" + " .align 2, 0\n" + "._615:\n" + " .word gUnknown_Debug_03004BD0\n" + "._606:\n" + " ldr r0, ._618 @ gDebug0x839C60C\n" + " mov r1, #0x4\n" + " mov r2, #0xf\n" + " bl Menu_PrintText\n" + " mov r0, #0x14\n" + " mov r1, #0x8\n" + " mov r2, #0x1\n" + " bl DisplayYesNoMenu\n" + "._614:\n" + " ldrh r0, [r4, #0x8]\n" + " add r0, r0, #0x1\n" + " strh r0, [r4, #0x8]\n" + " b ._620\n" + "._619:\n" + " .align 2, 0\n" + "._618:\n" + " .word gDebug0x839C60C\n" + "._612:\n" + " bl Menu_ProcessInputNoWrap_\n" + " lsl r0, r0, #0x18\n" + " asr r1, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._620 @cond_branch\n" + " cmp r1, #0\n" + " bne ._621 @cond_branch\n" + " ldr r1, ._623 @ gUnknown_Debug_03004BD0\n" + " mov r0, #0x1\n" + " b ._622\n" + "._624:\n" + " .align 2, 0\n" + "._623:\n" + " .word gUnknown_Debug_03004BD0\n" + "._621:\n" + " ldr r1, ._625 @ gUnknown_Debug_03004BD0\n" + " mov r0, #0x0\n" + "._622:\n" + " str r0, [r1]\n" + " bl Menu_EraseScreen\n" + " bl ScriptContext2_Disable\n" + " add r0, r5, #0\n" + " bl DestroyTask\n" + "._620:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._626:\n" + " .align 2, 0\n" + "._625:\n" + " .word gUnknown_Debug_03004BD0\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_OpenMurakawa() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " ldr r0, ._627 @ DebugMenu_8079058\n" + " mov r1, #0x50\n" + " bl CreateTask\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._628:\n" + " .align 2, 0\n" + "._627:\n" + " .word DebugMenu_8079058+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8079110() +{ + asm( + " push {r4, r5, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " ldr r1, ._633 @ gTasks\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " add r4, r0, r1\n" + " mov r1, #0x8\n" + " ldsh r0, [r4, r1]\n" + " cmp r0, #0x1\n" + " beq ._629 @cond_branch\n" + " cmp r0, #0x1\n" + " bgt ._630 @cond_branch\n" + " cmp r0, #0\n" + " beq ._631 @cond_branch\n" + " b ._642\n" + "._634:\n" + " .align 2, 0\n" + "._633:\n" + " .word gTasks\n" + "._630:\n" + " cmp r0, #0x2\n" + " beq ._635 @cond_branch\n" + " b ._642\n" + "._631:\n" + " bl Menu_DisplayDialogueFrame\n" + " b ._637\n" + "._629:\n" + " ldr r0, ._639 @ Str_839C61A\n" + " mov r1, #0x2\n" + " mov r2, #0xf\n" + " bl MenuPrintMessage\n" + "._637:\n" + " ldrh r0, [r4, #0x8]\n" + " add r0, r0, #0x1\n" + " strh r0, [r4, #0x8]\n" + " b ._642\n" + "._640:\n" + " .align 2, 0\n" + "._639:\n" + " .word Str_839C61A\n" + "._635:\n" + " bl Menu_UpdateWindowText\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " beq ._642 @cond_branch\n" + " ldr r0, ._643 @ gMain\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._642 @cond_branch\n" + " bl Menu_EraseScreen\n" + " bl ScriptContext2_Disable\n" + " add r0, r5, #0\n" + " bl DestroyTask\n" + "._642:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._644:\n" + " .align 2, 0\n" + "._643:\n" + " .word gMain\n" + "\n" + ); +} + +__attribute__((naked)) +u8 DebugMenu_OpenKiwa() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " ldr r0, ._645 @ DebugMenu_8079110\n" + " mov r1, #0x50\n" + " bl CreateTask\n" + " bl ScriptContext2_Enable\n" + " pop {r1}\n" + " bx r1\n" + "._646:\n" + " .align 2, 0\n" + "._645:\n" + " .word DebugMenu_8079110+1\n" + "\n" + ); +} + +#endif diff --git a/src/debug/taya_debug_window.c b/src/debug/taya_debug_window.c new file mode 100644 index 000000000..f7e0e3770 --- /dev/null +++ b/src/debug/taya_debug_window.c @@ -0,0 +1,6 @@ +#if DEBUG +#include "global.h" + +EWRAM_DATA u8 unk_2030224[4] = { 0 }; + +#endif diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c new file mode 100644 index 000000000..c3616797e --- /dev/null +++ b/src/debug/tomomichi_debug_menu.c @@ -0,0 +1,20 @@ +#if DEBUG +#include "global.h" + +// These should be static, uninitialized once it gets decompiled. +#define BSS_DATA __attribute__((section(".bss"))) +BSS_DATA u8 gDebug_03000700[4] = {0}; +BSS_DATA u8 gDebug_03000704[4] = {0}; +BSS_DATA u8 gDebug_03000708[4] = {0}; +BSS_DATA u8 gDebug_0300070C = 0; +BSS_DATA u8 gDebug_0300070D = 0; +BSS_DATA u8 gDebug_0300070E = 0; +BSS_DATA u8 gDebug_0300070F = 0; +BSS_DATA u8 gDebug_03000710[13] = {0}; +BSS_DATA u8 gDebug_0300071D = 0; +BSS_DATA u8 gDebug_0300071E = 0; +BSS_DATA u8 gDebug_0300071F = 0; +BSS_DATA u8 gDebug_03000720 = 0; +BSS_DATA u8 gDebug_03000721 = 0; + +#endif diff --git a/src/debug/unknown_debug_menu.c b/src/debug/unknown_debug_menu.c index a8c3ad16b..ef3e0e66c 100644 --- a/src/debug/unknown_debug_menu.c +++ b/src/debug/unknown_debug_menu.c @@ -4,7 +4,7 @@ extern u8 gBattleCommunication[]; -extern u8 (*gCallback_03004AE8)(void); +extern u8 (*gMenuCallback)(void); static u8 sub_814A4B8(void); static u8 sub_814A464(void); @@ -32,17 +32,17 @@ const struct MenuAction gUnknown_0842C29C[] = { int unref_sub_814A414(void) { - MenuZeroFillScreen(); - MenuDrawTextWindow(0, 0, 16, 18); - PrintMenuItems(2, 1, 8, gUnknown_0842C29C); + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 16, 18); + Menu_PrintItems(2, 1, 8, gUnknown_0842C29C); InitMenu(0, 1, 1, 8, 0, 15); - gCallback_03004AE8 = sub_814A464; + gMenuCallback = sub_814A464; return 0; } static u8 sub_814A464(void) { - s8 result = ProcessMenuInput(); + s8 result = Menu_ProcessInput(); if (result == -2) { return 0; @@ -55,7 +55,7 @@ static u8 sub_814A464(void) else { gBattleCommunication[0] = result; - gCallback_03004AE8 = gUnknown_0842C29C[result].func; + gMenuCallback = gUnknown_0842C29C[result].func; return 0; } } diff --git a/src/debug/watanabe_debug_menu.c b/src/debug/watanabe_debug_menu.c new file mode 100644 index 000000000..6c94b0466 --- /dev/null +++ b/src/debug/watanabe_debug_menu.c @@ -0,0 +1,11 @@ +#if DEBUG +#include "global.h" + +EWRAM_DATA u8 gUnknown_Debug_20389EC[0x20] = { 0 }; +EWRAM_DATA u8 gUnknown_Debug_2038A0C[0x10] = { 0 }; +EWRAM_DATA u8 gUnknown_Debug_2038A1C[4] = { 0 }; +EWRAM_DATA u8 gUnknown_Debug_2038A20[4] = { 0 }; + +u8 byte_3005E30[0x20]; + +#endif diff --git a/src/easy_chat_1.c b/src/easy_chat_1.c new file mode 100644 index 000000000..4b64846f9 --- /dev/null +++ b/src/easy_chat_1.c @@ -0,0 +1,1742 @@ +#include "global.h" +#include "constants/easy_chat.h" +#include "constants/songs.h" +#include "constants/species.h" +#include "dewford_trend.h" +#include "easy_chat.h" +#include "event_data.h" +#include "ewram.h" +#include "graphics.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "strings.h" +#include "scanline_effect.h" + +extern const struct WindowTemplate gWindowTemplate_81E6D54; +extern const struct WindowTemplate gWindowTemplate_81E6DA8; + +extern void sub_80546B8(void); + +const u16 gMysteryEventPhrase[] = {EC_WORD_MYSTERY, EC_WORD_EVENT, EC_WORD_IS, EC_WORD_EXCITING}; + +const u16 gBerryMasterWifePhrases[][2] = +{ +#if ENGLISH + {EC_WORD_GREAT, EC_WORD_BATTLE}, + {EC_WORD_CHALLENGE, EC_WORD_CONTEST}, + {EC_WORD_OVERWHELMING, EC_POKEMON(LATIAS)}, + {EC_WORD_COOL, EC_POKEMON(LATIOS)}, + {EC_WORD_SUPER, EC_WORD_HUSTLE}, +#else + {EC_WORD_GREAT, EC_WORD_FIGHT}, + {EC_WORD_CONTEST, EC_WORD_CHALLENGE}, + {EC_POKEMON(LATIAS), EC_WORD_OVERWHELMING}, + {EC_POKEMON(LATIOS), EC_WORD_COOL}, + {EC_WORD_SUPER, 0xFFFF}, +#endif +}; + +// const pointer to gEasyChatStruct-> easy_chat might be two separate files. +struct Shared1000 *const gEasyChatStruct = (struct Shared1000 *)(gSharedMem + 0x1000); + +const struct ScanlineEffectParams gUnknown_083DB698 = +{ + ®_BG3VOFS, + ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1, + 1 +}; + +const u8 gUnknown_083DB6A4[] = {4, 0, 0, 0, 1, 5, 0, 2, 2, 3, 2, 2, 2, 3}; + +// choose by alphabet keyboard +const u8 gUnknown_083DB6B2[][16] = +{ + _("ABCDEF "), + _("GHIJKL"), + _("MNOPQRS"), + _("TUVWXYZ"), +}; + +struct EasyChatPrompt +{ + const u8 *text1; + const u8 *text2; + bool8 unk8; +}; + +const struct EasyChatPrompt gUnknown_083DB6F4[] = +{ + {OtherText_MakeProfilePage1, OtherText_MakeProfilePage2, TRUE}, + {OtherText_MakeMessagePage1, OtherText_MakeMessagePage2, TRUE}, + {OtherText_CombineNinePhrasesPage1, OtherText_CombineNinePhrasesPage2, TRUE}, + {OtherText_DescribeFeelingsPage1, OtherText_DescribeFeelingsPage2, TRUE}, + {OtherText_ImproveBardSongPage1, OtherText_ImproveBardSongPage2, TRUE}, + {OtherText_CombineTwoPhrasesPage1, OtherText_CombineTwoPhrasesPage2, TRUE}, + {OtherText_YourProfile, OtherText_ConfirmTrendyPage2, FALSE}, + {OtherText_YourFeelingBattle, OtherText_ConfirmTrendyPage2, TRUE}, + {OtherText_SetWinMessage, OtherText_ConfirmTrendyPage2, TRUE}, + {OtherText_SetLossMessage, OtherText_ConfirmTrendyPage2, TRUE}, + {OtherText_MailMessage, OtherText_ConfirmTrendyPage2, TRUE}, + {OtherText_MailSalutation, OtherText_ConfirmTrendyPage2, TRUE}, + {OtherText_NewSong, OtherText_ConfirmTrendyPage2, FALSE}, + {OtherText_TheAnswer, OtherText_ConfirmTrendyPage2, FALSE}, + {OtherText_ConfirmTrendyPage1, OtherText_ConfirmTrendyPage2, TRUE}, + {OtherText_HipsterPage1, OtherText_HipsterPage2, TRUE}, + {OtherText_WithFourPhrases, OtherText_CombineNinePhrasesPage2, TRUE}, +}; + +const u8 gUnknown_083DB7C0[][2] = +{ + { 0, 6}, + { 1, 7}, + { 1, 8}, + { 1, 9}, + { 2, 10}, + {16, 13}, + { 4, 12}, + { 3, 13}, + { 3, 13}, + { 5, 14}, + { 3, 13}, + { 3, 13}, + { 3, 13}, + {15, 13}, +}; + +void sub_80E62F8(void); +void sub_80E6424(void); +void sub_80E6554(void); +void sub_80E6630(void); +void sub_80E6690(void); +void sub_80E682C(void (*)(void)); +void sub_80E69F8(void); +void sub_80E6A6C(void); +void sub_80E6A88(void); +void sub_80E6AA8(void); +void sub_80E6AC4(void); +void sub_80E6AE4(void); +void sub_80E6BC0(void); +void sub_80E6C84(void); +void sub_80E6D7C(void); +void sub_80E6F68(void); +void sub_80E6FC8(void); +void sub_80E7114(void); +void sub_80E718C(void); +void sub_80E7218(void); +void sub_80E7294(void); +void sub_80E7324(void); +void sub_80E73D0(void); +void sub_80E7458(void); +void sub_80E752C(void); +void sub_80E7574(void); +bool8 sub_80E75D8(void); +bool8 sub_80E77C8(void); +void sub_80E7A98(void); +void sub_80E7AD4(void); +bool8 sub_80E7B40(void); +void sub_80E7D30(void); +void sub_80E7D6C(void); +void sub_80E7D9C(void); +bool8 sub_80E7DD0(void); +void sub_80E7E50(void); +void sub_80E7F00(u16, u16); +u8 sub_80E7FA8(void); +bool8 sub_80E8054(void); +u8 sub_80E8094(void); +u8 sub_80E810C(void); +void sub_80E81C0(void); +void sub_80E81FC(void); +void sub_80E8218(void); + +void sub_80E8398(); +void sub_80E8420(void); +void sub_80E8504(void); +void sub_80E87CC(); + +void sub_80E88F0(void); +void sub_80E8958(); + +void sub_80E8BF4(); +void sub_80E8CEC(void); +void sub_80E8D54(void); +void sub_80E8D8C(); +void sub_80E8DD8(void); +void sub_80E91D4(); +void sub_80E9368(); +void sub_80E95A4(void); +void sub_80E9744(void); +void sub_80E98C4(void); +void sub_80E9974(void); +void sub_80E9A14(void); +void sub_80E9A4C(void); +void sub_80E9AD4(void); +void sub_80E9C94(void); +void sub_80E9D00(void); +void sub_80E9D7C(void); +void sub_80E9E08(); +bool8 sub_80E9E54(void); +void sub_80E9E98(void); +u8 sub_80E9EA8(void); +u8 sub_80E9F50(void); +u8 sub_80E9FD4(void); +u8 sub_80EA014(void); +u8 sub_80EA050(void); +u8 sub_80EA0E4(void); +u8 sub_80EA184(void); +void sub_80EAC5C(void); +void sub_80EAD08(void); +u8 sub_80EAD7C(u8); +void sub_80EAECC(void); +void LoadEasyChatStrings(void); +void sub_80EB0B0(void); +u8 *sub_80EB218(u8 *, u16, u16); +u16 sub_80EB2D4(); +bool8 sub_80EB680(u16 *, u16, u16, u16); + +void sub_80E60D8(void) +{ + u8 r4 = 3; + u16 *r1; + + switch (gSpecialVar_0x8004) + { + case 0: + r1 = gSaveBlock1.easyChats.unk2B1C; + break; + case 1: + r1 = gSaveBlock1.easyChats.unk2B28; + break; + case 2: + r1 = gSaveBlock1.easyChats.unk2B34; + break; + case 3: + r1 = gSaveBlock1.easyChats.unk2B40; + break; + case 4: + r1 = gSaveBlock1.mail[gSpecialVar_0x8005].words; + break; + case 6: + { + struct MauvilleManBard *bard = &gSaveBlock1.mauvilleMan.bard; + u16 i; + for (i = 0; i < 6; i++) + bard->temporaryLyrics[i] = bard->songLyrics[i]; + r1 = bard->temporaryLyrics; + } + break; + case 5: + // TODO: Is this the right TV show? + r1 = gSaveBlock1.tvShows[gSpecialVar_0x8005].fanclubLetter.pad04; + r4 = gSpecialVar_0x8006; + break; + case 7: + // TODO: Is this the right TV show? + r1 = &gSaveBlock1.tvShows[gSpecialVar_0x8005].fanclubOpinions.var1C[gSpecialVar_0x8006]; + r4 = 1; + break; + case 8: + // TODO: Is this the right TV show? + r1 = &gSaveBlock1.tvShows[gSpecialVar_0x8005].fanclubOpinions.var02; + r4 = 0; + break; + case 9: + r1 = NULL; + break; + case 10: + r1 = &gSaveBlock1.gabbyAndTyData.quote; + *r1 = 0xFFFF; + r4 = 1; + break; + case 11: + // TODO: Is this the right TV show? + r1 = &gSaveBlock1.tvShows[gSpecialVar_0x8005].bravoTrainer.var04[gSpecialVar_0x8006]; + r4 = 0; + break; + case 12: + // TODO: Is this the right TV show? + r1 = gSaveBlock1.tvShows[gSpecialVar_0x8005].bravoTrainerTower.var18; + r4 = 1; + break; + case 13: + gEasyChatStruct->unk9C7C = 0xFFFF; + gEasyChatStruct->unk9C7E = -1; + r1 = &gEasyChatStruct->unk9C7C; + break; + default: + return; + } + sub_80E62A0(gSpecialVar_0x8004, r1, sub_80546B8, r4); +} + +void sub_80E62A0(u8 a, u16 *b, void (*c)(void), u8 d) +{ + gEasyChatStruct->unk0 = c; + gEasyChatStruct->unk4 = b; + gEasyChatStruct->unk8 = a; + gEasyChatStruct->unkB = d; + if (a == 9) + { + gEasyChatStruct->unk4 = &gEasyChatStruct->unk9C7C; + gEasyChatStruct->unk9C7C = gSaveBlock1.easyChatPairs[0].words[0]; + gEasyChatStruct->unk9C7E = gSaveBlock1.easyChatPairs[0].words[1]; + } + SetMainCallback2(sub_80E62F8); +} + +void sub_80E62F8(void) +{ + switch (gMain.state) + { + case 0: + default: + REG_DISPCNT = 0; + SetVBlankCallback(0); + ResetPaletteFade(); + ResetSpriteData(); + ScanlineEffect_Clear(); + ScanlineEffect_Stop(); + sub_80EAD08(); + ScanlineEffect_SetParams(gUnknown_083DB698); + FreeSpriteTileRanges(); + FreeAllSpritePalettes(); + break; + case 1: + Text_LoadWindowTemplate(&gWindowTemplate_81E6DA8); + break; + case 2: + InitMenuWindow(&gWindowTemplate_81E6D54); + InitMenuWindow(&gWindowTemplate_81E6DA8); + Menu_EraseScreen(); + break; + case 3: + sub_80E6424(); + break; + case 4: + sub_80E8DD8(); + break; + case 5: + sub_80E8218(); + sub_80E8CEC(); + break; + case 6: + sub_80E69F8(); + sub_80E682C(sub_80E6AA8); + SetVBlankCallback(sub_80E6A6C); + break; + case 7: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + break; + case 8: + REG_DISPCNT = 0x1F40; + SetMainCallback2(sub_80E6A88); + FlagSet(FLAG_SYS_CHAT_USED); + break; + } + gMain.state++; +} + +void sub_80E6424(void) +{ + gEasyChatStruct->unk9 = gUnknown_083DB6A4[gEasyChatStruct->unk8]; + switch (gEasyChatStruct->unk9) + { + case 4: + gEasyChatStruct->unkA = 4; + gEasyChatStruct->unk83 = 2; + gEasyChatStruct->unk84 = 2; + gEasyChatStruct->unk88 = 5; + gEasyChatStruct->unk8A = 4; + break; + case 5: + gEasyChatStruct->unkA = 4; + gEasyChatStruct->unk83 = 1; + gEasyChatStruct->unk84 = 4; + gEasyChatStruct->unk88 = 16; + gEasyChatStruct->unk8A = 2; + break; + case 0: + gEasyChatStruct->unkA = 6; + gEasyChatStruct->unk83 = 2; + gEasyChatStruct->unk84 = 3; + gEasyChatStruct->unk88 = 4; + gEasyChatStruct->unk8A = 3; + break; + case 1: + gEasyChatStruct->unkA = 9; + gEasyChatStruct->unk83 = 2; + gEasyChatStruct->unk84 = 5; + gEasyChatStruct->unk88 = 4; + gEasyChatStruct->unk8A = 0; + break; + case 2: + gEasyChatStruct->unkA = 1; + gEasyChatStruct->unk83 = 1; + gEasyChatStruct->unk84 = 1; + gEasyChatStruct->unk88 = 16; + gEasyChatStruct->unk8A = 4; + break; + case 3: + gEasyChatStruct->unkA = 2; + gEasyChatStruct->unk83 = 2; + gEasyChatStruct->unk84 = 1; + gEasyChatStruct->unk88 = 5; + gEasyChatStruct->unk8A = 3; + break; + } + gEasyChatStruct->unk86 = 0; + gEasyChatStruct->unk85 = 0; + gEasyChatStruct->unk87 = 0; + gEasyChatStruct->unk26 = 0; + gEasyChatStruct->unk1BA = 0; + gEasyChatStruct->unk1BE = 2; + sub_80E6554(); + sub_80EAECC(); + LoadEasyChatStrings(); + sub_80E7E50(); + sub_80E6630(); + sub_80E6690(); +} + +void sub_80E6554(void) +{ + u16 r4 = 0; + u16 r7; + u16 r5; + + for (r7 = 0; ; r7++) + { + for (r5 = 0; r5 < 2; r5++) + { + gEasyChatStruct->unk2A[r7][r5] = r4++; + if (r4 == 17) + break; + } + if (r4 == 17) + break; + } + gEasyChatStruct->unk28 = 17; + while (r4 < 22) + { + if (sub_80EAD7C(r4) != 0) + { + r5++; + if (r5 > 1) + { + r7++; + r5 = 0; + } + gEasyChatStruct->unk2A[r7][r5] = r4; + gEasyChatStruct->unk78[r4 - 17] = 1; // hmm... + gEasyChatStruct->unk28++; + } + else + { + gEasyChatStruct->unk78[r4 - 17] = 0; + } + r4++; + } + gEasyChatStruct->unk1B6 = (gEasyChatStruct->unk28 + 1) / 2; +} + +void sub_80E6630(void) +{ + u8 i; + u8 r3; + + for (i = 0; i < 4; i++) + { + const u8 *row = gUnknown_083DB6B2[i]; + + for (r3 = 0; row[r3] != EOS; r3++) + { + if (row[r3] != CHAR_SPACE) + gEasyChatStruct->unk40[i][r3] = row[r3] + 0x46; + else + gEasyChatStruct->unk40[i][r3] = CHAR_SPACE; + } + } +} + +void sub_80E6690(void) +{ + u8 *pointers[] = + { + gEasyChatStruct->unk9C80, gEasyChatStruct->unk9CC9, + gEasyChatStruct->unk9D12, gEasyChatStruct->unk9D5B, + }; + u8 *r3; + u16 i; + + for (i = 0; i < 2; i++) + { + const struct EasyChatPrompt *prompt = &gUnknown_083DB6F4[gUnknown_083DB7C0[gEasyChatStruct->unk8][i]]; + + r3 = StringCopy(pointers[i * 2 + 0], prompt->text1); + if (prompt->unk8) + { + StringCopy(pointers[i * 2 + 1], prompt->text2); + } + else + { + *r3++ = CHAR_SPACE; + StringCopy(r3, prompt->text2); + *pointers[i * 2 + 1] = EOS; + } + } + + for (i = 0; i < 0x24; i++) + gEasyChatStruct->unk9DA4[i] = 0; + gEasyChatStruct->unk9DA4[i] = 0xFF; + + r3 = gEasyChatStruct->unk9F6E; + r3[0] = EXT_CTRL_CODE_BEGIN; + r3[1] = 0x11; + r3[2] = 0xE0; + r3[3] = 0xFF; +} + +// Default profile phrase +const u16 gUnknown_083DB7EC[] = +{ +#if ENGLISH + EC_WORD_I_AM, + EC_WORD_A, + EC_WORD_POKEMON, + EC_WORD_GREAT, +#else + EC_WORD_I_AM, + EC_WORD_BIG, + EC_WORD_IN, + EC_WORD_POKEMON, +#endif +}; + +const u16 gUnknown_083DB7F4[] = +{ + EC_WORD_ARE, + EC_WORD_YOU, + EC_WORD_READY, + EC_WORD_QUES, + EC_WORD_HERE_I_COME, + EC_WORD_EXCL, +}; + +// ResetDefaultEasyChatPhrases +void InitEasyChatPhrases(void) +{ + u16 i; + u16 j; + + for (i = 0; i < 4; i++) + gSaveBlock1.easyChats.unk2B1C[i] = gUnknown_083DB7EC[i]; + + for (i = 0; i < 6; i++) + gSaveBlock1.easyChats.unk2B28[i] = gUnknown_083DB7F4[i]; + + for (i = 0; i < 6; i++) + { + gSaveBlock1.easyChats.unk2B34[i] = 0xFFFF; + gSaveBlock1.easyChats.unk2B40[i] = 0xFFFF; + } + + for (i = 0; i < 16; i++) + { + for (j = 0; j < 9; j++) + gSaveBlock1.mail[i].words[j] = 0xFFFF; + } + + for (i = 0; i < 64; i++) + gSaveBlock1.unk2D8C[i] = 0; +} + +void sub_80E682C(void (*func)(void)) +{ + gEasyChatStruct->unk20 = func; + gEasyChatStruct->unk24 = 0; +} + +void sub_80E683C(void) +{ + u16 i; + + if (gEasyChatStruct->unk26 == 0) + { + for (i = 0; i < gEasyChatStruct->unk1B6; i++) + gEasyChatStruct->unk1AA[i] = 2; + gEasyChatStruct->unk1AA[i - 1] = gEasyChatStruct->unk28 % 2; + if (gEasyChatStruct->unk1AA[i - 1] == 0) + gEasyChatStruct->unk1AA[i - 1] = 2; + } + else + { + gEasyChatStruct->unk1AA[0] = 7; + gEasyChatStruct->unk1AA[1] = 6; + gEasyChatStruct->unk1AA[2] = 7; + gEasyChatStruct->unk1AA[3] = 7; + } + gEasyChatStruct->unk1A8 = 0; + gEasyChatStruct->unk1A9 = 0; + gEasyChatStruct->unk1B5 = 0; + gEasyChatStruct->unk1B7 = 0; + sub_80E9A4C(); +} + +void sub_80E68E8(void) +{ + sub_80EB0B0(); + if (gEasyChatStruct->unk26 == 0) + { + u16 i; + u8 r6; + + r6 = gEasyChatStruct->unk1B8; + gEasyChatStruct->unk9A28 = (gEasyChatStruct->unk4178[r6] + 1) / 2; + for (i = 0; i < gEasyChatStruct->unk9A28; i++) + gEasyChatStruct->unk99A6[i] = 2; + i--; + gEasyChatStruct->unk99A6[i] = gEasyChatStruct->unk4178[r6] % 2; + if (gEasyChatStruct->unk99A6[i] == 0) + gEasyChatStruct->unk99A6[i] = 2; + } + else + { + u16 i; + u8 r6; + + r6 = gEasyChatStruct->unk1B8; + gEasyChatStruct->unk9A28 = (gEasyChatStruct->unk4142[r6] + 1) / 2; + for (i = 0; i < gEasyChatStruct->unk9A28; i++) + gEasyChatStruct->unk99A6[i] = 2; + i--; + gEasyChatStruct->unk99A6[i] = gEasyChatStruct->unk4142[r6] % 2; + if (gEasyChatStruct->unk99A6[i] == 0) + gEasyChatStruct->unk99A6[i] = 2; + } + gEasyChatStruct->unk99A4 = 0; + gEasyChatStruct->unk99A5 = 0; + gEasyChatStruct->unk9A29 = 0; + sub_80E9A4C(); +} + +void sub_80E69F8(void) +{ + switch (gEasyChatStruct->unk8) + { + case 0: + case 1: + case 2: + case 3: + case 4: + case 6: + case 9: + case 13: + default: + sub_80E9368(gEasyChatStruct->unk8); + break; + case 5: + case 7: + case 8: + case 10: + case 11: + case 12: + sub_80E9368(gEasyChatStruct->unk8); + sub_80E8BF4(gEasyChatStruct->unkB, gEasyChatStruct->unk9); + break; + } +} + +void sub_80E6A6C(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + sub_80EAC5C(); + TransferPlttBuffer(); + ScanlineEffect_InitHBlankDmaTransfer(); +} + +void sub_80E6A88(void) +{ + gEasyChatStruct->unk20(); + AnimateSprites(); + BuildOamBuffer(); + sub_80EAD08(); +} + +void sub_80E6AA8(void) +{ + if (!UpdatePaletteFade()) + sub_80E682C(sub_80E6AC4); +} + +void sub_80E6AC4(void) +{ + sub_80E88F0(); + sub_80E8398(0); + sub_80E91D4(0); + sub_80E682C(sub_80E6AE4); +} + +void sub_80E6AE4(void) +{ + gEasyChatStruct->unk87 = sub_80E75D8(); + if (gEasyChatStruct->unk87) + PlaySE(SE_SELECT); + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (gEasyChatStruct->unk86 == gEasyChatStruct->unk84) + { + switch (gEasyChatStruct->unk85) + { + case 0: + sub_80E682C(sub_80E6BC0); + return; + case 1: + sub_80E682C(sub_80E6C84); + return; + case 2: + sub_80E682C(sub_80E6D7C); + return; + } + } + else + { + gEasyChatStruct->unk27 = gEasyChatStruct->unk86 * gEasyChatStruct->unk83 + gEasyChatStruct->unk85; + sub_80E7574(); + sub_80E682C(sub_80E6F68); + return; + } + } + if (gMain.newKeys & B_BUTTON) + { + sub_80E682C(sub_80E6C84); + } +} + +void sub_80E6BC0(void) +{ + switch (gEasyChatStruct->unk24) + { + case 0: + sub_80E8398(2); + if (gEasyChatStruct->unk8 == 6) + { + sub_80E91D4(6); + gEasyChatStruct->unk24 = 100; + } + else + { + sub_80E91D4(2); + DisplayYesNoMenu(23, 8, 1); + Menu_MoveCursor(1); + gEasyChatStruct->unk24++; + } + break; + case 1: + switch (Menu_ProcessInputNoWrap_()) + { + case 0: + sub_80E7D6C(); + sub_80E98C4(); + sub_80E95A4(); + gEasyChatStruct->unk24++; + break; + case -1: + case 1: + gEasyChatStruct->unk24++; + break; + } + break; + case 2: + sub_80E81FC(); + sub_80E682C(sub_80E6AC4); + break; + case 100: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + sub_80E682C(sub_80E6AC4); + break; + } +} + +void sub_80E6C84(void) +{ + switch (gEasyChatStruct->unk24) + { + case 0: + sub_80E8398(2); + sub_80E91D4(3); + DisplayYesNoMenu(23, 8, 0); + Menu_MoveCursor(1); + if (gEasyChatStruct->unk8 == 9 + || gEasyChatStruct->unk8 == 4 + || gEasyChatStruct->unk8 == 7 + || gEasyChatStruct->unk8 == 8 + || gEasyChatStruct->unk8 == 10 + || gEasyChatStruct->unk8 == 11 + || gEasyChatStruct->unk8 == 12 + || gEasyChatStruct->unk8 == 5 + || gEasyChatStruct->unk8 == 13) + gEasyChatStruct->unk24 = 2; + else + gEasyChatStruct->unk24++; + break; + case 1: + switch (Menu_ProcessInputNoWrap_()) + { + case 0: + sub_80E91D4(4); + DisplayYesNoMenu(23, 8, 0); + Menu_MoveCursor(1); + gEasyChatStruct->unk24++; + break; + case -1: + case 1: + gEasyChatStruct->unk24 = 0xFF; + break; + } + break; + case 2: + switch (Menu_ProcessInputNoWrap_()) + { + case 0: + gSpecialVar_Result = 0; + sub_80E682C(sub_80E752C); + break; + case -1: + case 1: + gEasyChatStruct->unk24 = 0xFF; + break; + } + break; + case 0xFF: + Menu_DestroyCursor(); + sub_80E81FC(); + sub_80E682C(sub_80E6AC4); + break; + } +} + +void sub_80E6D7C(void) +{ + switch (gEasyChatStruct->unk24) + { + case 0: + sub_80E8398(2); + if (sub_80E8054()) + { + sub_80E91D4(5); + gEasyChatStruct->unk24 = 10; + break; + } + if (gEasyChatStruct->unk8 == 9) + { + if (sub_80E7FA8() == 0) + { + sub_80E91D4(8); + gEasyChatStruct->unk24 = 10; + break; + } + if (gEasyChatStruct->unkC[0] == 0xFFFF || gEasyChatStruct->unkC[1] == 0xFFFF) + { + sub_80E91D4(9); + gEasyChatStruct->unk24 = 10; + break; + } + } + if (gEasyChatStruct->unk8 == 4 && sub_80E7FA8() == 0) + { + sub_80E682C(sub_80E6C84); + } + else + { + sub_80E91D4(1); + sub_80E9744(); + DisplayYesNoMenu(23, 8, 0); + Menu_MoveCursor(0); + gEasyChatStruct->unk24++; + } + break; + case 1: + switch (Menu_ProcessInputNoWrap_()) + { + case 0: + gSpecialVar_Result = (sub_80E7FA8() != 0); + sub_80E7D9C(); + if (gEasyChatStruct->unk8 == 0) + gSpecialVar_0x8004 = sub_80E8094(); + if (gEasyChatStruct->unk8 == 9) // dewford trend? + { + sub_80E81C0(); + gSpecialVar_0x8004 = sub_80FA364(&gEasyChatStruct->unk9C7C); + } + if (gEasyChatStruct->unk8 == 13) + { + if (gEasyChatStruct->unkC[0] == 0xFFFF || gEasyChatStruct->unkC[1] == 0xFFFF) + gSpecialVar_Result = 0; + gSpecialVar_0x8004 = sub_80E810C(); + } + sub_80E682C(sub_80E752C); + break; + case -1: + case 1: + Menu_DestroyCursor(); + sub_80E81FC(); + if (gEasyChatStruct->unk8 == 6 && sub_80E7FA8() != 0) + { + gEasyChatStruct->unk24 = 100; + } + else + { + sub_80E95A4(); + sub_80E682C(sub_80E6AC4); + } + break; + } + break; + case 10: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + sub_80E682C(sub_80E6AC4); + break; + case 100: + sub_80E91D4(7); + gEasyChatStruct->unk24++; + // fall through + case 101: + if (gMain.newKeys & A_BUTTON) + gEasyChatStruct->unk24++; + break; + case 102: + sub_80E7E50(); + sub_80E95A4(); + sub_80E682C(sub_80E6AC4); + break; + } +} + +void sub_80E6F68(void) +{ + switch (gEasyChatStruct->unk24) + { + case 0: + sub_80E8398(1); + sub_80E91D4(10); + sub_80E683C(); + sub_80E9974(); + sub_80E9E98(); + gEasyChatStruct->unk24++; + break; + case 1: + if (sub_80E9EA8() != 0) + { + sub_80E8D8C(1); + sub_80E8420(); + sub_80E8958(0); + sub_80E682C(sub_80E6FC8); + } + break; + } +} + +void sub_80E6FC8(void) +{ + gEasyChatStruct->unk96 = sub_80E77C8(); + if (gEasyChatStruct->unk1C0 != 0) + { + PlaySE(SE_SELECT); + gEasyChatStruct->unk1C4 = sub_80E6FC8; + sub_80E682C(sub_80E7458); + } + else + { + if (gEasyChatStruct->unk96) + PlaySE(SE_SELECT); + if (gMain.newKeys & A_BUTTON) + { + if (gEasyChatStruct->unk1B7 != 0) + { + PlaySE(SE_SELECT); + switch (gEasyChatStruct->unk1A8) + { + case 1: + sub_80E682C(sub_80E718C); + break; + case 2: + if (gEasyChatStruct->unk8 != 6) + { + sub_80E7F00(gEasyChatStruct->unk27, 0xFFFF); + sub_80E7574(); + sub_80E95A4(); + } + break; + case 3: + sub_80E682C(sub_80E7114); + break; + } + } + else + { + if (gEasyChatStruct->unk26 == 0 + || gEasyChatStruct->unk4142[gEasyChatStruct->unk40[gEasyChatStruct->unk1A8][gEasyChatStruct->unk1A9]] != 0) + { + PlaySE(SE_SELECT); + sub_80E7AD4(); + sub_80E682C(sub_80E7218); + } + } + } + else if (gMain.newKeys & B_BUTTON) + { + sub_80E682C(sub_80E7114); + } + else if (gMain.newKeys & SELECT_BUTTON) + { + sub_80E682C(sub_80E718C); + } + } +} + +void sub_80E7114(void) +{ + switch (gEasyChatStruct->unk24) + { + case 0: + sub_80E8504(); + sub_80E9E98(); + sub_80E88F0(); + sub_80E8D8C(0); + gEasyChatStruct->unk24++; + break; + case 1: + case 2: + gEasyChatStruct->unk24++; + break; + case 3: + if (sub_80E9F50() != 0) + gEasyChatStruct->unk24++; + break; + case 4: + sub_80E682C(sub_80E6AC4); + break; + } +} + +void sub_80E718C(void) +{ + switch (gEasyChatStruct->unk24) + { + case 0: + sub_80E8504(); + sub_80E9E98(); + sub_80E88F0(); + gEasyChatStruct->unk24++; + sub_80E8D54(); + break; + case 1: + if (sub_80E9FD4() != 0) + { + gEasyChatStruct->unk26 = !gEasyChatStruct->unk26; + sub_80E683C(); + sub_80E9974(); + sub_80E9E98(); + gEasyChatStruct->unk24++; + } + break; + default: + gEasyChatStruct->unk24++; + break; + case 8: + if (sub_80EA014() != 0) + { + sub_80E8420(); + sub_80E8958(0); + sub_80E682C(sub_80E6FC8); + } + break; + } +} + +void sub_80E7218(void) +{ + switch (gEasyChatStruct->unk24) + { + default: + gEasyChatStruct->unk24++; + break; + case 8: + sub_80E8D8C(0); + sub_80E8504(); + sub_80E9AD4(); + sub_80E68E8(); + sub_80E88F0(); + sub_80E9E98(); + gEasyChatStruct->unk24++; + break; + case 9: + if (sub_80EA050() != 0) + { + sub_80E9C94(); + gEasyChatStruct->unk24++; + } + break; + case 10: + sub_80E87CC(1); + sub_80E8958(1); + sub_80E682C(sub_80E7294); + break; + case 11: + break; + } +} + +void sub_80E7294(void) +{ + gEasyChatStruct->unk1B9 = sub_80E7B40(); + if (gEasyChatStruct->unk1C0 != 0) + { + PlaySE(SE_SELECT); + gEasyChatStruct->unk1C4 = sub_80E7294; + sub_80E682C(sub_80E7458); + } + else + { + if (gEasyChatStruct->unk1B9) + PlaySE(SE_SELECT); + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + sub_80E682C(sub_80E7324); + } + else if (gMain.newKeys & B_BUTTON) + { + sub_80E682C(sub_80E73D0); + } + } +} + +void sub_80E7324(void) +{ + switch (gEasyChatStruct->unk24) + { + case 0: + if (!sub_80E7DD0()) + { + sub_80E682C(sub_80E7294); + } + else + { + sub_80E88F0(); + sub_80E87CC(0); + gEasyChatStruct->unk24++; + } + break; + case 1: + gEasyChatStruct->unk24++; + break; + case 2: + sub_80E9E98(); + gEasyChatStruct->unk24++; + break; + case 3: + if (sub_80EA184() != 0) + gEasyChatStruct->unk24++; + break; + case 4: + if (gEasyChatStruct->unk8 == 6 && sub_80E7FA8() != 0) + sub_80E682C(sub_80E6D7C); + else + sub_80E682C(sub_80E6AC4); + break; + } +} + +void sub_80E73D0(void) +{ + switch (gEasyChatStruct->unk24) + { + case 0: + sub_80E87CC(0); + sub_80E88F0(); + gEasyChatStruct->unk24++; + break; + case 1: + sub_80E9AD4(); + sub_80E9E98(); + gEasyChatStruct->unk24++; + break; + case 2: + if (sub_80EA0E4() != 0) + { + sub_80E8D8C(1); + sub_80E9A14(); + gEasyChatStruct->unk24++; + } + break; + case 3: + sub_80E8420(); + sub_80E8958(0); + gEasyChatStruct->unk24++; + break; + case 4: + sub_80E9974(); + sub_80E682C(sub_80E6FC8); + break; + } +} + +void sub_80E7458(void) +{ + switch (gEasyChatStruct->unk24) + { + case 0: + if (gEasyChatStruct->unk1C4 == sub_80E6FC8) + sub_80E9D7C(); + else + sub_80E9D00(); + sub_80E9E08(gEasyChatStruct->unk1BE); + gEasyChatStruct->unk24++; + break; + case 1: + if (sub_80E9E54()) + { + if (gEasyChatStruct->unk1C4 == sub_80E6FC8) + { + sub_80E9D7C(); + gEasyChatStruct->unk1B5 += gEasyChatStruct->unk1C0; + sub_80E7A98(); + gEasyChatStruct->unk96 = TRUE; + } + else + { + gEasyChatStruct->unk9A29 += gEasyChatStruct->unk1C0; + sub_80E7D30(); + gEasyChatStruct->unk1B9 = 1; + } + gEasyChatStruct->unk1BE = 2; + sub_80E682C(gEasyChatStruct->unk1C4); + } + break; + } +} + +void sub_80E752C(void) +{ + switch (gEasyChatStruct->unk24) + { + case 0: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gEasyChatStruct->unk24++; + break; + case 1: + if (!UpdatePaletteFade()) + SetMainCallback2(gEasyChatStruct->unk0); + break; + } +} + +void sub_80E7574(void) +{ + if (gEasyChatStruct->unk8 == 1 + && gEasyChatStruct->unk7E[gEasyChatStruct->unk86] == 2 + && sub_80EB2D4(gEasyChatStruct->unkC[gEasyChatStruct->unk27]) != 7) + gEasyChatStruct->unk7D = 1; + else + gEasyChatStruct->unk7D = 0; + gEasyChatStruct->unk7D = 0; // What the hell? +} + +bool8 sub_80E75D8(void) +{ + bool8 pressedUpDown = FALSE; + u8 r0; + + if (gMain.newKeys & START_BUTTON) + { + gEasyChatStruct->unk86 = gEasyChatStruct->unk84; + gEasyChatStruct->unk85 = 2; + return TRUE; + } + + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + gEasyChatStruct->unk86--; + if (gEasyChatStruct->unk86 < 0) + gEasyChatStruct->unk86 = gEasyChatStruct->unk84; + pressedUpDown = TRUE; + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + gEasyChatStruct->unk86++; + if (gEasyChatStruct->unk86 > gEasyChatStruct->unk84) + gEasyChatStruct->unk86 = 0; + pressedUpDown = TRUE; + } + + if (pressedUpDown) + { + if (gEasyChatStruct->unk9 == 2) + { + if (gEasyChatStruct->unk86 == gEasyChatStruct->unk84) + gEasyChatStruct->unk85 = 2; + else + gEasyChatStruct->unk85 = 0; + return TRUE; + } + else + { + if (gEasyChatStruct->unk85 >= gEasyChatStruct->unk83) + gEasyChatStruct->unk85 = gEasyChatStruct->unk83 - 1; + if (gEasyChatStruct->unk86 != gEasyChatStruct->unk84) + { + r0 = gEasyChatStruct->unk86 * gEasyChatStruct->unk83 + gEasyChatStruct->unk85; + if (r0 >= gEasyChatStruct->unkA) + gEasyChatStruct->unk85 = r0 - gEasyChatStruct->unkA; + } + return TRUE; + } + } + else + { + if (gMain.newAndRepeatedKeys & DPAD_LEFT) + { + if (--gEasyChatStruct->unk85 < 0) + { + if (gEasyChatStruct->unk86 == gEasyChatStruct->unk84) + { + gEasyChatStruct->unk85 = 2; + } + else + { + gEasyChatStruct->unk85 = gEasyChatStruct->unk83 - 1; + r0 = gEasyChatStruct->unk86 * gEasyChatStruct->unk83 + gEasyChatStruct->unk85; + if (r0 >= gEasyChatStruct->unkA) + gEasyChatStruct->unk85 = r0 - gEasyChatStruct->unkA; + } + } + return TRUE; + } + if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + { + if (gEasyChatStruct->unk86 == gEasyChatStruct->unk84) + { + if (++gEasyChatStruct->unk85 > 2) + gEasyChatStruct->unk85 = 0; + } + else + { + if (++gEasyChatStruct->unk85 >= gEasyChatStruct->unk83) + gEasyChatStruct->unk85 = 0; + r0 = gEasyChatStruct->unk86 * gEasyChatStruct->unk83 + gEasyChatStruct->unk85; + if (r0 >= gEasyChatStruct->unkA) + gEasyChatStruct->unk85 = r0 - gEasyChatStruct->unkA; + } + return TRUE; + } + } + return FALSE; +} + +bool8 sub_80E77C8(void) +{ + bool8 pressedLeftRight = FALSE; + bool8 pressedUpDown; + + if (gEasyChatStruct->unk1B7 != 0) + { + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + gEasyChatStruct->unk1A8--; + if (gEasyChatStruct->unk1A8 < 1) + gEasyChatStruct->unk1A8 = 3; + return TRUE; + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + gEasyChatStruct->unk1A8++; + if (gEasyChatStruct->unk1A8 > 3) + gEasyChatStruct->unk1A8 = 1; + return TRUE; + } + } + else + { + if (gEasyChatStruct->unk26 == 1) + { + pressedUpDown = FALSE; + + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + gEasyChatStruct->unk1A8--; + if (gEasyChatStruct->unk1A8 < 0) + gEasyChatStruct->unk1A8 = 3; + pressedUpDown = TRUE; + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + gEasyChatStruct->unk1A8++; + if (gEasyChatStruct->unk1A8 > 3) + gEasyChatStruct->unk1A8 = 0; + pressedUpDown = TRUE; + } + + if (pressedUpDown) + { + sub_80E7A98(); + return TRUE; + } + } + else + { + pressedUpDown = FALSE; + gEasyChatStruct->unk1C0 = 0; + + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + if (gEasyChatStruct->unk1A8 == 0) + return FALSE; + gEasyChatStruct->unk1A8--; + if (gEasyChatStruct->unk1A8 < gEasyChatStruct->unk1B5) + gEasyChatStruct->unk1C0 = -1; + pressedUpDown = TRUE; + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if (gEasyChatStruct->unk1A8 >= gEasyChatStruct->unk1B6 - 1) + return FALSE; + gEasyChatStruct->unk1A8++; + if (gEasyChatStruct->unk1A8 > gEasyChatStruct->unk1B5 + 3) + gEasyChatStruct->unk1C0 = 1; + pressedUpDown = TRUE; + } + + if (pressedUpDown) + { + if (gEasyChatStruct->unk1C0 == 0) + { + sub_80E7A98(); + return TRUE; + } + return FALSE; + } + } + } + + if (gMain.newAndRepeatedKeys & DPAD_LEFT) + { + if (gEasyChatStruct->unk1A9 != 0) + gEasyChatStruct->unk1A9--; + else + gEasyChatStruct->unk1A9 = gEasyChatStruct->unk1AA[gEasyChatStruct->unk1A8]; + pressedLeftRight = TRUE; + } + else if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + { + if (gEasyChatStruct->unk1B7 != 0 + || gEasyChatStruct->unk1A9 == gEasyChatStruct->unk1AA[gEasyChatStruct->unk1A8]) + gEasyChatStruct->unk1A9 = 0; + else + gEasyChatStruct->unk1A9++; + pressedLeftRight = TRUE; + } + + if (pressedLeftRight) + { + s8 r9 = gEasyChatStruct->unk1B7; + + gEasyChatStruct->unk1B7 = (gEasyChatStruct->unk1A9 == gEasyChatStruct->unk1AA[gEasyChatStruct->unk1A8]); + if (gEasyChatStruct->unk1B7 != 0) + { + gEasyChatStruct->unk1A8 -= gEasyChatStruct->unk1B5; + if (gEasyChatStruct->unk1A8 == 0) + { + gEasyChatStruct->unk1A8 = 1; + gEasyChatStruct->unk1A9 = gEasyChatStruct->unk1AA[gEasyChatStruct->unk1A8]; + } + } + else if (r9 != 0) + { + gEasyChatStruct->unk1A8 += gEasyChatStruct->unk1B5; + if (gEasyChatStruct->unk1A9 != 0) + gEasyChatStruct->unk1A9 = gEasyChatStruct->unk1AA[gEasyChatStruct->unk1A8] - 1; + } + return TRUE; + } + + return FALSE; +} + +void sub_80E7A98(void) +{ + if (gEasyChatStruct->unk1A9 >= gEasyChatStruct->unk1AA[gEasyChatStruct->unk1A8]) + gEasyChatStruct->unk1A9 = gEasyChatStruct->unk1AA[gEasyChatStruct->unk1A8] - 1; +} + +void sub_80E7AD4(void) +{ + if (gEasyChatStruct->unk26 == 0) + gEasyChatStruct->unk1B8 = gEasyChatStruct->unk2A[gEasyChatStruct->unk1A8][gEasyChatStruct->unk1A9]; + else + gEasyChatStruct->unk1B8 = gEasyChatStruct->unk40[gEasyChatStruct->unk1A8][gEasyChatStruct->unk1A9]; +} + +bool8 sub_80E7B40(void) +{ + bool8 pressedUpDown = FALSE; + + gEasyChatStruct->unk1C0 = 0; + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + if (gEasyChatStruct->unk99A4 == 0) + return FALSE; + gEasyChatStruct->unk99A4--; + if (gEasyChatStruct->unk99A4 < gEasyChatStruct->unk9A29) + { + gEasyChatStruct->unk1C0 = -1; + return FALSE; + } + pressedUpDown = TRUE; + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if (gEasyChatStruct->unk99A4 >= gEasyChatStruct->unk9A28 - 1) + return FALSE; + gEasyChatStruct->unk99A4++; + if (gEasyChatStruct->unk99A4 >= gEasyChatStruct->unk9A29 + 4) + { + gEasyChatStruct->unk1C0 = 1; + return FALSE; + } + pressedUpDown = TRUE; + } + + if (pressedUpDown) + { + sub_80E7D30(); + return TRUE; + } + + if (gMain.newAndRepeatedKeys & DPAD_LEFT) + { + gEasyChatStruct->unk99A5--; + if (gEasyChatStruct->unk99A5 < 0) + gEasyChatStruct->unk99A5 = gEasyChatStruct->unk99A6[gEasyChatStruct->unk99A4] - 1; + return TRUE; + } + else if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + { + gEasyChatStruct->unk99A5++; + if (gEasyChatStruct->unk99A5 >= gEasyChatStruct->unk99A6[gEasyChatStruct->unk99A4]) + gEasyChatStruct->unk99A5 = 0; + return TRUE; + } + + if (gMain.newKeys & START_BUTTON) + { + if (gEasyChatStruct->unk9A29 != 0) + { + gEasyChatStruct->unk1C0 = -gEasyChatStruct->unk9A29; + if (gEasyChatStruct->unk1C0 < -4) + gEasyChatStruct->unk1C0 = -4; + } + gEasyChatStruct->unk99A4 += gEasyChatStruct->unk1C0; + gEasyChatStruct->unk1BE = 4; + } + else if (gMain.newKeys & SELECT_BUTTON) + { + if (gEasyChatStruct->unk9A29 < gEasyChatStruct->unk9A28 - 4) + { + gEasyChatStruct->unk1C0 = gEasyChatStruct->unk9A28 - 4 - gEasyChatStruct->unk9A29; + if (gEasyChatStruct->unk1C0 > 4) + gEasyChatStruct->unk1C0 = 4; + } + gEasyChatStruct->unk99A4 += gEasyChatStruct->unk1C0; + gEasyChatStruct->unk1BE = 4; + } + + return FALSE; +} + +void sub_80E7D30(void) +{ + if (gEasyChatStruct->unk99A5 >= gEasyChatStruct->unk99A6[gEasyChatStruct->unk99A4]) + gEasyChatStruct->unk99A5 = gEasyChatStruct->unk99A6[gEasyChatStruct->unk99A4] - 1; +} + +void sub_80E7D6C(void) +{ + u16 i; + + for (i = 0; i < gEasyChatStruct->unkA; i++) + sub_80E7F00(i, 0xFFFF); +} + +void sub_80E7D9C(void) +{ + u16 i; + + for (i = 0; i < gEasyChatStruct->unkA; i++) + gEasyChatStruct->unk4[i] = gEasyChatStruct->unkC[i]; +} + +bool8 sub_80E7DD0(void) +{ + u16 r4 = gEasyChatStruct->unk9A2A[gEasyChatStruct->unk99A4][gEasyChatStruct->unk99A5]; + + if (gEasyChatStruct->unk7D != 0 + && gEasyChatStruct->unk7E[gEasyChatStruct->unk86] > 1 + && sub_80EB2D4(r4) == 7) + return FALSE; + + sub_80E7F00(gEasyChatStruct->unk27, r4); + sub_80E95A4(); + return TRUE; +} + +void sub_80E7E50(void) +{ + u16 r5 = 0; + u16 i; + u16 j; + + for (i = 0; i < gEasyChatStruct->unk84; i++) + { + gEasyChatStruct->unk7E[i] = 0; + for (j = 0; j < gEasyChatStruct->unk83; j++) + { + gEasyChatStruct->unkC[r5] = gEasyChatStruct->unk4[r5]; + gEasyChatStruct->unk8C[i][j] = 0; + r5++; + } + } +} + +void sub_80E7F00(u16 a, u16 b) +{ + u16 r5 = a / gEasyChatStruct->unk83; + u16 r8 = a % gEasyChatStruct->unk83; + u16 r4 = sub_80EB2D4(gEasyChatStruct->unkC[a]); + u16 r3 = sub_80EB2D4(b); + + if (r4 == 7) + { + if (r3 != 7) + gEasyChatStruct->unk7E[r5]--; + } + else + { + if (r3 == 7) + gEasyChatStruct->unk7E[r5]++; + } + r3 = 0; + gEasyChatStruct->unk8C[r5][r8] = r3; + gEasyChatStruct->unkC[a] = b; +} + +u8 sub_80E7FA8(void) +{ + u16 r8 = 0; + u16 i; + u8 *r1; + u8 *r2; + + for (i = 0; i < gEasyChatStruct->unkA; i++) + { + sub_80EB218(gEasyChatStruct->unk9E14, gEasyChatStruct->unk4[i], 0); + sub_80EB218(gEasyChatStruct->unk9E41, gEasyChatStruct->unkC[i], 0); + r1 = gEasyChatStruct->unk9E14; + r2 = gEasyChatStruct->unk9E41; + while (*r1 == *r2 && *r1 != 0xFF) + { + r1++; + r2++; + } + if (*r1 != *r2) + r8++; + } + return r8; +} + +bool8 sub_80E8054(void) +{ + u16 i; + + for (i = 0; i < gEasyChatStruct->unkA; i++) + { + if (gEasyChatStruct->unkC[i] != 0xFFFF) + return FALSE; + } + return TRUE; +} + +// CheckMysteryEventPhrase +bool8 sub_80E8094(void) +{ + u16 i; + u8 *r3; + u8 *r4; + + for (i = 0; i < 4; i++) + { + sub_80EB218(gEasyChatStruct->unk9E14, gEasyChatStruct->unkC[i], 0); + sub_80EB218(gEasyChatStruct->unk9E41, gMysteryEventPhrase[i], 0); + r3 = gEasyChatStruct->unk9E14; + r4 = gEasyChatStruct->unk9E41; + while (*r3 != 0xFF && *r4 != 0xFF) + { + if (*r3++ != *r4++) + return FALSE; + } + if (*r3 != 0xFF || *r4 != 0xFF) + return FALSE; + } + return TRUE; +} + +u8 sub_80E810C(void) +{ + u16 i; + + for (i = 0; i < 5; i++) + { + u8 *ptr; + u8 *r3; + + ptr = sub_80EB218(gEasyChatStruct->unk9E6E, gEasyChatStruct->unkC[0], 0); + *ptr++ = CHAR_SPACE; + sub_80EB218(ptr, gEasyChatStruct->unkC[1], 0); + + ptr = sub_80EB218(gEasyChatStruct->unk9EEE, gBerryMasterWifePhrases[i][0], 0); + *ptr++ = CHAR_SPACE; + sub_80EB218(ptr, gBerryMasterWifePhrases[i][1], 0); + + ptr = gEasyChatStruct->unk9E6E; + r3 = gEasyChatStruct->unk9EEE; + while (*ptr != EOS && *r3 != EOS) + { + if (*ptr++ != *r3++) + break; + } + if (*ptr == EOS && *r3 == EOS) + return i + 1; + } + return 0; +} + +void sub_80E81C0(void) +{ + u8 *ptr; + + ptr = sub_80EB218(gStringVar2, gEasyChatStruct->unk9C7C, 0); + *ptr++ = CHAR_SPACE; + sub_80EB218(ptr, gEasyChatStruct->unk9C7E, 0); +} + +void sub_80E81FC(void) +{ + PlaySE(SE_SELECT); + sub_80E95A4(); + Menu_EraseWindowRect(0, 0, 29, 13); +} diff --git a/src/easy_chat_2.c b/src/easy_chat_2.c new file mode 100644 index 000000000..c56fe7576 --- /dev/null +++ b/src/easy_chat_2.c @@ -0,0 +1,3036 @@ +#include "global.h" +#include "constants/easy_chat.h" +#include "constants/map_objects.h" +#include "data2.h" +#include "decompress.h" +#include "easy_chat.h" +#include "event_data.h" +#include "field_map_obj.h" +#include "field_message_box.h" +#include "graphics.h" +#include "menu.h" +#include "palette.h" +#include "pokedex.h" +#include "random.h" +#include "sprite.h" +#include "string_util.h" +#include "strings.h" +#include "strings2.h" +#include "trig.h" +#include "scanline_effect.h" + +extern void sub_8095C8C(); +extern void sub_809D104(void *, u16, u16, const void *, u16, u16, u16, u16); + +void sub_80E8268(void); +void sub_80E82BC(struct Sprite *); +void sub_80E8534(void); +void sub_80E85F8(struct Sprite *); +void sub_80E872C(struct Sprite *); +void sub_80E8760(struct Sprite *); +void sub_80E8818(void); +void sub_80E8860(struct Sprite *); +void sub_80E8A7C(void); +void sub_80E8B78(struct Sprite *); +void sub_80E8FA4(void); +void sub_80E9198(u8); +void sub_80E91D4(u8); +void sub_80E948C(void); +void sub_80E95A4(void); +void sub_80E9620(u16, u16); +void sub_80E97C0(u16, u16); +void sub_80E9A4C(void); +void sub_80E9A60(const u8 *, u16, u16); +void sub_80E9A7C(u8 *, u16); +void sub_80E9AD4(void); +void sub_80E9C74(u16); +u8 sub_80EA1E0(void); +void sub_80EA24C(void); +void sub_80EA348(void); +void sub_80EA4A4(void); +void sub_80EA5A0(void); +void sub_80EA704(void); +void sub_80EA764(void); +void sub_80EA7F4(void); +void sub_80EA8BC(void); +void sub_80EA948(void); +void sub_80EAA44(void); +void sub_80EAAD4(void); +void sub_80EABD4(u16 *, u16, u16, u16, u16, u16, u16, u16, u16); +void sub_80EAC0C(u16 *); +void sub_80EAC30(struct UnknownEasyChatStruct1 *, u16, u16, u16, u16, void *); +void sub_80EAC48(struct UnknownEasyChatStruct1 *); +void sub_80EACBC(void *, u16 *, struct UnknownEasyChatStruct1 *); +u8 *CopyEasyChatGroupName(u8 *, u8, int); +u8 *sub_80EB218(u8 *, u16, u16); +u16 sub_80EB2D4(u16); +bool8 sub_80EB37C(u16); +bool8 sub_80EB868(u8); +static u16 sub_80EB960(void); +u8 sub_80EB9C8(void); +static u16 sub_80EB9D8(void); + +EWRAM_DATA u8 gUnknown_020388AC = 0; + +static u8 gUnknown_03000740; + +const u16 InterviewPalette_0[] = INCBIN_U16("graphics/misc/interview_pal0.gbapal"); +const u16 InterviewPalette_1[] = INCBIN_U16("graphics/misc/interview_pal1.gbapal"); +const u8 InterviewArrowTiles[] = INCBIN_U8("graphics/misc/interview_arrow.4bpp"); +const u8 InterviewButtonTiles[] = INCBIN_U8("graphics/misc/interview_buttons.4bpp"); +const u16 gMenuInterviewFrame_Pal[] = INCBIN_U16("graphics/misc/interview_frame.gbapal"); +const u8 gMenuInterviewFrame_Gfx[] = INCBIN_U8("graphics/misc/interview_frame.4bpp.lz"); +const u8 InterviewTriangleCursorTiles[] = INCBIN_U8("graphics/misc/interview_triangle_cursor.4bpp"); + +void sub_80E8218(void) +{ + struct SpriteSheet interviewSpriteSheets[] = + { + {InterviewTriangleCursorTiles, 0x20, 0}, + {gInterviewOutlineCursorTiles, 0x700, 1}, + {InterviewArrowTiles, 0x100, 2}, + {InterviewButtonTiles, 0x100, 3}, + {NULL, 0, 0}, + }; + struct SpritePalette interviewSpritePalettes[] = + { + {InterviewPalette_0, 0}, + {InterviewPalette_1, 1}, + {NULL, 0}, + }; + + LoadSpriteSheets(interviewSpriteSheets); + LoadSpritePalettes(interviewSpritePalettes); + sub_80E8268(); + sub_80E8818(); + sub_80E8A7C(); +} + +const struct OamData gOamData_83DBBF4 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +const struct SpriteTemplate gSpriteTemplate_83DBBFC = +{ + .tileTag = 0, + .paletteTag = 0, + .oam = &gOamData_83DBBF4, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80E82BC, +}; + +void sub_80E8268(void) +{ + u8 spriteId; + + spriteId = CreateSprite(&gSpriteTemplate_83DBBFC, 0, 0, 0); + gSprites[spriteId].pos1.y = gEasyChatStruct->unk8A * 8 + 8; + gSprites[spriteId].pos1.x = gEasyChatStruct->unk88 * 8 + 4; + gSprites[spriteId].data[0] = 0; + gSprites[spriteId].data[1] = 0; + gEasyChatStruct->unk98 = &gSprites[spriteId]; +} + +void sub_80E82BC(struct Sprite *sprite) +{ + if (sprite->data[1] == 0) + { + if (gEasyChatStruct->unk87) + { + u16 r5 = gEasyChatStruct->unk86; + u16 r4 = gEasyChatStruct->unk85; + u16 r7 = 0; + u16 i; + + for (i = 0; i < r4; i++) + r7 += gEasyChatStruct->unk8C[r5][i]; + + if (r5 == gEasyChatStruct->unk84) + { + sprite->pos1.y = 96; + sprite->pos1.x = (r4 * 7 + 3) * 8 + 4; + } + else + { + sprite->pos1.y = (gEasyChatStruct->unk8A + r5 * 2) * 8 + 8; + sprite->pos1.x = (gEasyChatStruct->unk88 + r7 + r4 * 11) * 8 + 4; + } + + sprite->pos2.x = -6; + sprite->data[0] = 0; + } + else + { + if (++sprite->data[0] > 2) + { + sprite->data[0] = 0; + if (++sprite->pos2.x > 0) + sprite->pos2.x = -6; + } + } + } +} + +void sub_80E8398(u8 a) +{ + switch (a) + { + case 0: + gEasyChatStruct->unk98->data[1] = a; + gEasyChatStruct->unk98->pos2.x = a; + gEasyChatStruct->unk98->invisible = FALSE; + break; + case 1: + gEasyChatStruct->unk98->data[1] = a; + gEasyChatStruct->unk98->pos2.x = 0; + gEasyChatStruct->unk98->invisible = FALSE; + break; + case 2: + gEasyChatStruct->unk98->data[1] = 1; + gEasyChatStruct->unk98->pos2.x = 0; + gEasyChatStruct->unk98->invisible = TRUE; + break; + } +} + +const struct OamData gOamData_83DBC14 = +{ + .y = 0, + .affineMode = 0, + .objMode = 1, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +const union AnimCmd gSpriteAnim_83DBC1C[] = +{ + ANIMCMD_FRAME(0, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83DBC24[] = +{ +#if ENGLISH + ANIMCMD_FRAME(8, 5), +#else + ANIMCMD_FRAME(0, 5), +#endif + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83DBC2C[] = +{ + ANIMCMD_FRAME(0, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83DBC34[] = +{ + ANIMCMD_FRAME(24, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83DBC3C[] = +{ + ANIMCMD_FRAME(32, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83DBC44[] = +{ + ANIMCMD_FRAME(40, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83DBC4C[] = +{ + ANIMCMD_FRAME(40, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83DBC54[] = +{ + ANIMCMD_FRAME(40, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83DBC5C[] = +{ + ANIMCMD_FRAME(48, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83DBC64[] = +{ +#if ENGLISH + ANIMCMD_FRAME(40, 5), +#else + ANIMCMD_FRAME(16, 5), +#endif + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83DBC6C[] = +{ + ANIMCMD_FRAME(48, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83DBC74[] = +{ + ANIMCMD_FRAME(40, 5), + ANIMCMD_END, +}; + +const union AnimCmd *const gSpriteAnimTable_83DBC7C[] = +{ + gSpriteAnim_83DBC1C, + gSpriteAnim_83DBC24, + gSpriteAnim_83DBC2C, + gSpriteAnim_83DBC34, +}; + +const union AnimCmd *const gSpriteAnimTable_83DBC8C[] = +{ + gSpriteAnim_83DBC3C, + gSpriteAnim_83DBC44, + gSpriteAnim_83DBC4C, + gSpriteAnim_83DBC54, +}; + +const union AnimCmd *const gSpriteAnimTable_83DBC9C[] = +{ + gSpriteAnim_83DBC5C, + gSpriteAnim_83DBC64, + gSpriteAnim_83DBC6C, + gSpriteAnim_83DBC74, +}; + +void sub_80E8420(void) +{ + struct SpriteTemplate spriteTemplate_83DBCAC = + { + .tileTag = 1, + .paletteTag = 1, + .oam = &gOamData_83DBC14, + .anims = gSpriteAnimTable_83DBC7C, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80E85F8, + }; + u8 spriteId; + + spriteId = CreateSprite(&spriteTemplate_83DBCAC, 0, 0, 3); + gEasyChatStruct->unk9C = &gSprites[spriteId]; + + spriteTemplate_83DBCAC.anims = gSpriteAnimTable_83DBC8C; + spriteTemplate_83DBCAC.callback = sub_80E872C; + spriteId = CreateSprite(&spriteTemplate_83DBCAC, 0, 0, 4); + gEasyChatStruct->unkA0 = &gSprites[spriteId]; + + spriteTemplate_83DBCAC.anims = gSpriteAnimTable_83DBC9C; + spriteTemplate_83DBCAC.callback = sub_80E8760; + spriteId = CreateSprite(&spriteTemplate_83DBCAC, 0, 0, 5); + gEasyChatStruct->unkA4 = &gSprites[spriteId]; + + gEasyChatStruct->unk9C->data[0] = 0; + gEasyChatStruct->unkA0->data[0] = 0; + gEasyChatStruct->unkA4->data[0] = 0; + + gEasyChatStruct->unk9C->data[3] = 0x0101 + IndexOfSpritePaletteTag(1) * 16; + sub_80E8534(); + gEasyChatStruct->unk96 = 1; + REG_BLDCNT = 0x3F40; +} + +void sub_80E8504(void) +{ + DestroySprite(gEasyChatStruct->unk9C); + DestroySprite(gEasyChatStruct->unkA0); + DestroySprite(gEasyChatStruct->unkA4); +} + +void sub_80E8534(void) +{ + if (gEasyChatStruct->unk1B7 != 0) + gUnknown_020388AC = 1; + else if (gEasyChatStruct->unk26 == 0) + gUnknown_020388AC = 0; + else if (gEasyChatStruct->unk1A8 == 0 && gEasyChatStruct->unk1A9 == 6) + gUnknown_020388AC = 2; + else + gUnknown_020388AC = 3; + + gEasyChatStruct->unk9C->data[2] = gUnknown_020388AC; + gEasyChatStruct->unkA0->data[2] = gUnknown_020388AC; + gEasyChatStruct->unkA4->data[2] = gUnknown_020388AC; + + StartSpriteAnim(gEasyChatStruct->unk9C, gUnknown_020388AC); + StartSpriteAnim(gEasyChatStruct->unkA0, gUnknown_020388AC); + StartSpriteAnim(gEasyChatStruct->unkA4, gUnknown_020388AC); + + gEasyChatStruct->unk9C->data[5] = 8; + gEasyChatStruct->unk9C->data[6] = 8; + gEasyChatStruct->unk9C->data[1] = 0; +} + +const s8 gUnknown_083DBCC4[][7] = +{ + {1, 3, 5, 8, 10, 12, 15}, + {1, 3, 5, 8, 10, 12, 0}, + {1, 3, 5, 8, 10, 12, 14}, + {1, 3, 5, 8, 10, 12, 14}, +}; + +void sub_80E85F8(struct Sprite *sprite) +{ + sprite->data[0]++; + if (sprite->data[0] & 1) + sprite->data[5] = 8 + (gSineTable[sprite->data[1]] >> 5); + else + sprite->data[6] = 8 - (gSineTable[sprite->data[1]] >> 5); + + sprite->data[1] = (sprite->data[1] + 5) & 0xFF; + + REG_BLDALPHA = (sprite->data[6] << 8) | sprite->data[5]; + + if (gEasyChatStruct->unk96 != 0) + { + sub_80E8534(); + + gEasyChatStruct->unk9C->data[5] = 8; + gEasyChatStruct->unk9C->data[6] = 8; + gEasyChatStruct->unk9C->data[1] = 0; + + switch (sprite->data[2]) + { + case 0: + sprite->pos1.x = gEasyChatStruct->unk1A9 * 88 + 32; + sprite->pos1.y = (gEasyChatStruct->unk1A8 - gEasyChatStruct->unk1B5) * 16 + 96; + break; + case 1: +#if ENGLISH + sprite->pos1.x = 216; +#else + sprite->pos1.x = 214; +#endif + sprite->pos1.y = gEasyChatStruct->unk1A8 * 16 + 96; + break; + case 2: + sprite->pos1.x = 151; + sprite->pos1.y = 96; + break; + case 3: + sprite->pos1.x = gUnknown_083DBCC4[gEasyChatStruct->unk1A8][gEasyChatStruct->unk1A9] * 8 + 31; + sprite->pos1.y = (gEasyChatStruct->unk1A8 - gEasyChatStruct->unk1B5) * 16 + 96; + break; + } + } +} + + +void sub_80E872C(struct Sprite *sprite) +{ + if (gEasyChatStruct->unk96 != 0 && sprite->data[2] == 0) + { + sprite->pos1.x = gEasyChatStruct->unk9C->pos1.x + 32; + sprite->pos1.y = gEasyChatStruct->unk9C->pos1.y; + } +} + +void sub_80E8760(struct Sprite *sprite) +{ + if (gEasyChatStruct->unk96 != 0) + { + switch (sprite->data[2]) + { + case 0: + sprite->pos1.x = gEasyChatStruct->unk9C->pos1.x + 64; + sprite->pos1.y = gEasyChatStruct->unk9C->pos1.y; + break; +#if GERMAN + case 1: + sprite->pos1.x = gEasyChatStruct->unk9C->pos1.x + 28; + sprite->pos1.y = gEasyChatStruct->unk9C->pos1.y; + break; +#endif + case 2: + sprite->pos1.x = gEasyChatStruct->unk9C->pos1.x + 21; + sprite->pos1.y = gEasyChatStruct->unk9C->pos1.y; + break; + } + } +} + +void sub_80E87A4(u8 a) +{ + gEasyChatStruct->unkA8->data[1] = (a == 0); + gEasyChatStruct->unkA8->pos2.x = 0; +} + +void sub_80E87CC(u8 a) +{ + gEasyChatStruct->unkA8->invisible = (a == 0); + sub_80E87A4(a); + if (a != 0) + gEasyChatStruct->unk1B9 = 1; +} + +void sub_80E8818(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83DBBFC, 0, 0, 0); + + gSprites[spriteId].data[0] = 0; + gSprites[spriteId].data[1] = 0; + gEasyChatStruct->unkA8 = &gSprites[spriteId]; + gEasyChatStruct->unkA8->callback = sub_80E8860; + sub_80E87CC(0); +} + +void sub_80E8860(struct Sprite *sprite) +{ + if (sprite->data[1] == 0) + { + if (gEasyChatStruct->unk1B9 != 0) + { + sprite->pos1.x = gEasyChatStruct->unk99A5 * 88 + 44; + sprite->pos1.y = (gEasyChatStruct->unk99A4 - gEasyChatStruct->unk9A29) * 16 + 96; + sprite->pos2.x = -6; + sprite->data[0] = 0; + } + else + { + sprite->data[0]++; + if (sprite->data[0] > 2) + { + sprite->data[0] = 0; + sprite->pos2.x++; + if (sprite->pos2.x > 0) + sprite->pos2.x = -6; + } + } + } +} + +void sub_80E88F0(void) +{ + u16 i; + + for (i = 0; i < 2; i++) + { + gEasyChatStruct->unkAC[i]->invisible = TRUE; + gEasyChatStruct->unkAC[i]->data[1] = 0; + gEasyChatStruct->unkB4[i]->invisible = TRUE; + gEasyChatStruct->unkB4[i]->data[1] = 0; + } + gEasyChatStruct->unk9C70 = 0; +} + +void sub_80E8958(u8 animNum) +{ + s16 r9; + u16 i; + + if (animNum == 0) + { + r9 = 100; + gEasyChatStruct->unk9C6C = &gEasyChatStruct->unk1B5; + if (gEasyChatStruct->unk26 == 0) + gEasyChatStruct->unk9C71 = gEasyChatStruct->unk1B6 - 4; + else + gEasyChatStruct->unk9C71 = 0; + } + else + { + r9 = 120; + gEasyChatStruct->unk9C6C = &gEasyChatStruct->unk9A29; + gEasyChatStruct->unk9C71 = gEasyChatStruct->unk9A28 - 4; + for (i = 0; i < 2; i++) + { + gEasyChatStruct->unkB4[i]->invisible = FALSE; + gEasyChatStruct->unkB4[i]->data[1] = 1; + } + } + + if (gEasyChatStruct->unk9C71 < 0) + gEasyChatStruct->unk9C71 = 0; + + for (i = 0; i < 2; i++) + { + gEasyChatStruct->unkAC[i]->pos1.x = r9; + gEasyChatStruct->unkAC[i]->invisible = FALSE; + gEasyChatStruct->unkAC[i]->data[1] = 1; + StartSpriteAnim(gEasyChatStruct->unkAC[i], animNum); + } + + gEasyChatStruct->unk9C70 = 1; +} + +const struct OamData gOamData_83DBCE0 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +const union AnimCmd gSpriteAnim_83DBCE8[] = +{ + ANIMCMD_FRAME(0, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83DBCF0[] = +{ + ANIMCMD_FRAME(4, 5), + ANIMCMD_END, +}; + +const union AnimCmd *const gSpriteAnimTable_83DBCF8[] = +{ + gSpriteAnim_83DBCE8, + gSpriteAnim_83DBCF0, +}; + +const union AnimCmd gSpriteAnim_83DBD00[] = +{ + ANIMCMD_FRAME(0, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83DBD08[] = +{ + ANIMCMD_FRAME(4, 5), + ANIMCMD_END, +}; + +const union AnimCmd *const gSpriteAnimTable_83DBD10[] = +{ + gSpriteAnim_83DBD00, + gSpriteAnim_83DBD08, +}; + +void sub_80E8A7C(void) +{ + struct SpriteTemplate spriteTemplate_83DBD18 = + { + .tileTag = 2, + .paletteTag = 0, + .oam = &gOamData_83DBCE0, + .anims = gSpriteAnimTable_83DBCF8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80E8B78, + }; + u16 i; + u8 spriteId; + + for (i = 0; i < 2; i++) + { + spriteId = CreateSprite(&spriteTemplate_83DBD18, 0, 84 + i * 72 , 0); + gEasyChatStruct->unkAC[i] = &gSprites[spriteId]; + gEasyChatStruct->unkAC[i]->data[0] = i; + gEasyChatStruct->unkAC[i]->vFlip = i; + } + + spriteTemplate_83DBD18.tileTag = 3; + spriteTemplate_83DBD18.anims = gSpriteAnimTable_83DBD10; + + for (i = 0; i < 2; i++) + { + spriteId = CreateSprite(&spriteTemplate_83DBD18, 142 + i * 40, 88, 0); + gEasyChatStruct->unkB4[i] = &gSprites[spriteId]; + gEasyChatStruct->unkB4[i]->data[0] = i; + gEasyChatStruct->unkB4[i]->oam.shape = 1; + gEasyChatStruct->unkB4[i]->oam.size = 1; + StartSpriteAnim(gEasyChatStruct->unkB4[i], i); + } + + sub_80E8958(0); + sub_80E88F0(); +} + +void sub_80E8B78(struct Sprite *sprite) +{ + bool8 invisible; + + if (gEasyChatStruct->unk9C70 != 0 && sprite->data[1] != 0) + { + if (sprite->data[0] == 0) + { + invisible = FALSE; + if (*gEasyChatStruct->unk9C6C == 0) + invisible = TRUE; + sprite->invisible = invisible; + } + else + { + invisible = FALSE; + if (*gEasyChatStruct->unk9C6C == gEasyChatStruct->unk9C71) + invisible = TRUE; + sprite->invisible = invisible; + } + } +} + +// defined below +extern const struct SpriteTemplate gSpriteTemplate_83DBD48; + +void sub_80E8BF4(u8 reporter, u8 b) +{ + struct CompressedSpriteSheet gUnknown_083DBD30 = {gMenuInterviewFrame_Gfx, 2048, 0x0006}; + struct SpritePalette gUnknown_083DBD38 = {gMenuInterviewFrame_Pal, 0x0004}; + s16 x; + s16 y; + u16 gabbyTyGfxId; + u8 spriteId; + + switch (b) + { + case 2: + default: + x = 64; + y = 40; + break; + case 5: + x = 36; + y = 48; + break; + } + + switch (reporter) + { + case 0: // Gabby + default: + gabbyTyGfxId = MAP_OBJ_GFX_REPORTER_M; + break; + case 1: // Ty + gabbyTyGfxId = MAP_OBJ_GFX_REPORTER_F; + break; + } + + LoadCompressedObjectPic(&gUnknown_083DBD30); + LoadSpritePalette(&gUnknown_083DBD38); + CreateSprite(&gSpriteTemplate_83DBD48, x, y, 1); + + spriteId = AddPseudoFieldObject( + (gSaveBlock2.playerGender == MALE) ? MAP_OBJ_GFX_RIVAL_BRENDAN_NORMAL : MAP_OBJ_GFX_RIVAL_MAY_NORMAL, + SpriteCallbackDummy, x - 12, y, 0); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].oam.priority = 0; + StartSpriteAnim(&gSprites[spriteId], 3); + } + + spriteId = AddPseudoFieldObject(gabbyTyGfxId, SpriteCallbackDummy, x + 12, y, 0); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].oam.priority = 0; + StartSpriteAnim(&gSprites[spriteId], 2); + } +} + +const struct OamData gOamData_83DBD40 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +const struct SpriteTemplate gSpriteTemplate_83DBD48 = +{ + .tileTag = 6, + .paletteTag = 4, + .oam = &gOamData_83DBD40, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +const struct CompressedSpriteSheet gUnknown_083DBD60 = {gMenuWordGroupIndicator_Gfx, 4096, 0x0007}; + +const struct SpritePalette gUnknown_083DBD68 = {gMenuWordGroupIndicator_Pal, 0x0005}; + +const struct OamData gOamData_83DBD70 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +const union AnimCmd gSpriteAnim_83DBD78[] = +{ + ANIMCMD_FRAME(96, 3), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83DBD80[] = +{ + ANIMCMD_FRAME(64, 4), + ANIMCMD_FRAME(96, 4), + ANIMCMD_FRAME(64, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83DBD94[] = +{ + ANIMCMD_FRAME(64, 4), + ANIMCMD_FRAME(96, 4), + ANIMCMD_FRAME(64, 4), + ANIMCMD_FRAME(32, 4), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83DBDA8[] = +{ + ANIMCMD_FRAME(64, 2), + ANIMCMD_FRAME(32, 2), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83DBDB4[] = +{ + ANIMCMD_FRAME(64, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83DBDC0[] = +{ + ANIMCMD_FRAME(64, 2), + ANIMCMD_FRAME(96, 2), + ANIMCMD_END, +}; + +const union AnimCmd *const gSpriteAnimTable_83DBDCC[] = +{ + gSpriteAnim_83DBD78, + gSpriteAnim_83DBD80, + gSpriteAnim_83DBD94, + gSpriteAnim_83DBDA8, + gSpriteAnim_83DBDB4, + gSpriteAnim_83DBDC0, +}; + +const struct SpriteTemplate gSpriteTemplate_83DBDE4 = +{ + .tileTag = 7, + .paletteTag = 5, + .oam = &gOamData_83DBD70, + .anims = gSpriteAnimTable_83DBDCC, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +void sub_80E8CEC(void) +{ + u8 spriteId; + + LoadCompressedObjectPic(&gUnknown_083DBD60); + LoadSpritePalette(&gUnknown_083DBD68); + + spriteId = CreateSprite(&gSpriteTemplate_83DBDE4, 224, 88, 0); + if (spriteId != MAX_SPRITES) + gEasyChatStruct->unk9C74 = &gSprites[spriteId]; + else + gEasyChatStruct->unk9C74 = NULL; +} + +void sub_80E8D54(void) +{ + if (gEasyChatStruct->unk9C74 != NULL) + { + if (gEasyChatStruct->unk26 == 0) + StartSpriteAnim(gEasyChatStruct->unk9C74, 1); + else + StartSpriteAnim(gEasyChatStruct->unk9C74, 2); + } +} + +void sub_80E8D8C(u8 a) +{ + if (gEasyChatStruct->unk9C74 != NULL) + { + if (a != 0) + { + if (gEasyChatStruct->unk26 == 0) + StartSpriteAnim(gEasyChatStruct->unk9C74, 3); + else + StartSpriteAnim(gEasyChatStruct->unk9C74, 4); + } + else + { + StartSpriteAnim(gEasyChatStruct->unk9C74, 5); + } + } +} + +const u16 gUnknown_083DBDFC[] = INCBIN_U16("graphics/unknown/unknown_3DBDFC.gbapal"); + +const u16 gUnknown_083DBE1C[] = +{ + 0x300, 0x300, 0x300, 0x300, 0x300, 0x300, 0x300, 0x300, 0x300, + 0x301, 0x301, 0x301, 0x301, 0x301, 0x300, 0x300, 0x300, 0x300, +}; + +const u16 gUnknown_083DBE40[] = INCBIN_U16("graphics/unknown/unknown_3DBE40.gbapal"); + +// unused tilemap? +const u16 gUnused_083DBE60[] = +{ + 0x5036, 0x5037, 0x5038, 0x5039, 0x503A, 0x503B, + 0x5046, 0x5047, 0x5048, 0x5049, 0x504A, 0x504B, + 0x5056, 0x5057, 0x5058, 0x5059, 0x505A, 0x505B, + 0x5030, 0x5031, 0x5032, 0x5033, 0x5034, 0x5035, + 0x5040, 0x5041, 0x5042, 0x5043, 0x5044, 0x5045, + 0x5050, 0x5051, 0x5052, 0x5053, 0x5054, 0x5055, +}; + +const u8 gUnknown_083DBEA8[] = _("{CLEAR_TO 88}"); + +void sub_80E8DD8(void) +{ + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2VOFS = 0; + REG_BG2HOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + + REG_BG0CNT = 0x8B00; + REG_BG1CNT = 0x0D09; + + CpuCopy16(gUnknown_08E945D0, gEasyChatStruct->unk1C8, 0x500); + LZ77UnCompWram(gUnknown_08E953D0, gEasyChatStruct->unk6C8); + LZ77UnCompVram(gMenuWordGroupFrame_Gfx, (void *)(VRAM + 0x8000)); + CpuCopy16(gEasyChatStruct->unk1C8, (void *)(VRAM + 0x6800), 0x500); + LoadPalette(gMenuWordGroupFrame1_Pal, 64, 64); + + REG_BG2CNT = 0x0E02; + + DmaClear16(3, (void *)(VRAM + 0x7000), 0x800); + DmaCopy16Defvars(3, gUnknown_08E9AB00, (void *)(VRAM + 0x6000), 64); + LZ77UnCompVram(gUnknown_08E9AB60, (void *)(VRAM + 0x7000)); + LoadPalette(gUnknown_08E9AB40, 0, 32); + LoadPalette(gUnknown_083DBDFC, 16, 32); + + REG_BG3CNT = 0x0F0F; + + DmaClear32(3, (void *)(VRAM + 0x7800), 0x800); + LoadPalette(gUnknown_083DBE40, 32, 32); + gPlttBufferUnfaded[63] = RGB(31, 31, 31); + gPlttBufferUnfaded[49] = RGB(27, 26, 27); + gPlttBufferUnfaded[56] = RGB(28, 28, 28); + gPlttBufferFaded[63] = RGB(31, 31, 31); + gPlttBufferFaded[49] = RGB(27, 26, 27); + gPlttBufferFaded[56] = RGB(28, 28, 28); + + gEasyChatStruct->unkBC = 0; + sub_80E8FA4(); + sub_80E948C(); + sub_80E9198(10); + sub_80E91D4(0); + sub_80E95A4(); + + REG_BLDCNT = 0; +} + +// The components are ORed in the reverse order from the normal RGB macro +#define RGB_(r, g, b) ((((b) & 0x1F) << 10) | (((g) & 0x1F) << 5) | ((r) & 0x1F)) + +#define R_VAL(color) ((color) & 0x1F) +#define G_VAL(color) (((color) >> 5) & 0x1F) +#define B_VAL(color) (((color) >> 10) & 0x1F) + +void sub_80E8FA4(void) +{ + u16 i; + u16 r3; + u16 r4; + s32 sp0[3]; + s32 spC[3]; + s32 sp18[3]; + + for (i = 0; i < 3; i++) + { + sp0[0] = R_VAL(*(gMenuWordGroupFrame2_Pal + i + 1)) << 8; + spC[0] = R_VAL(*(gMenuWordGroupFrame2_Pal + i + 4)) << 8; + sp0[1] = G_VAL(*(gMenuWordGroupFrame2_Pal + i + 1)) << 8; + spC[1] = G_VAL(*(gMenuWordGroupFrame2_Pal + i + 4)) << 8; + sp0[2] = B_VAL(*(gMenuWordGroupFrame2_Pal + i + 1)) << 8; + spC[2] = B_VAL(*(gMenuWordGroupFrame2_Pal + i + 4)) << 8; + + for (r3 = 0; r3 < 3; r3++) + sp18[r3] = (spC[r3] - sp0[r3]) / 8; + + for (r4 = 0; r4 < 8; r4++) + { + gEasyChatStruct->unk9C34[i][r4] = RGB_(sp0[0] >> 8, sp0[1] >> 8, sp0[2] >> 8); + for (r3 = 0; r3 < 3; r3++) + sp0[r3] += sp18[r3]; + } + gEasyChatStruct->unk9C34[i][r4] = RGB_(spC[0] >> 8, spC[1] >> 8, spC[2] >> 8); + } + gEasyChatStruct->unk9C32 = 0; +} + +void sub_80E9108(s8 a) +{ + u16 i; + + gEasyChatStruct->unk9C32 += a; + for (i = 0; i < 3; i++) + { + gPlttBufferUnfaded[81 + i] = gEasyChatStruct->unk9C34[i][gEasyChatStruct->unk9C32]; + gPlttBufferFaded[81 + i] = gEasyChatStruct->unk9C34[i][gEasyChatStruct->unk9C32]; + } +} + +void sub_80E9178(void) +{ + gEasyChatStruct->unk9C32 = 0; + sub_80E9108(0); +} + +void sub_80E9198(u8 a) +{ + gUnknown_03000740 = a; +} + +u8 sub_80E91A4(void) +{ + return gUnknown_03000740; +} + +void sub_80E91B0(const u8 *a, u8 b, u8 c, u8 d) +{ + sub_8072AB0(a, b * 8, c * 8, 176, d * 8, 1); +} + +void sub_80E91D4(u8 a) +{ + BasicInitMenuWindow(&gWindowTemplate_81E6DA8); + + if (a == 10) + { + Menu_EraseWindowRect(3, 14, 26, 19); + sub_80E9198(10); + return; + } + + if (sub_80E91A4() == 10) + Menu_DrawStdWindowFrame(3, 14, 26, 19); + + sub_80E9198(a); + switch (a) + { + case 0: + sub_80E91B0(gEasyChatStruct->unk9C80, 4, 15, 2); + sub_80E91B0(gEasyChatStruct->unk9CC9, 4, 17, 2); + break; + case 1: + sub_80E91B0(gEasyChatStruct->unk9D12, 4, 15, 2); + sub_80E91B0(gEasyChatStruct->unk9D5B, 4, 17, 2); + break; + case 2: + sub_80E91B0(gOtherText_TextDeletedConfirmPage1, 4, 15, 2); + sub_80E91B0(gOtherText_TextDeletedConfirmPage2, 4, 17, 2); + break; + case 3: + switch (gEasyChatStruct->unk8) + { + case 9: + sub_80E91B0(gOtherText_QuitGivingInfo, 4, 15, 4); + break; + case 4: + sub_80E91B0(gOtherText_StopGivingMail, 4, 15, 4); + break; + default: + sub_80E91B0(gOtherText_QuitEditing, 4, 15, 4); + break; + } + break; + case 4: + sub_80E91B0(gOtherText_EditedTextNoSavePage1, 4, 15, 2); + sub_80E91B0(gOtherText_EditedTextNoSavePage2, 4, 17, 2); + break; + case 5: + sub_80E91B0(gOtherText_EnterAPhraseOrWord, 4, 15, 4); + break; + case 6: + sub_80E91B0(gOtherText_TextNoDelete, 4, 15, 4); + break; + case 7: + sub_80E91B0(gOtherText_OnlyOnePhrase, 4, 15, 2); + sub_80E91B0(gOtherText_OriginalSongRestored, 4, 17, 2); + break; + case 8: + sub_80E91B0(gOtherText_TrendyAlready, 4, 15, 4); + break; + case 9: + sub_80E91B0(gOtherText_CombineTwoPhrases, 4, 15, 4); + break; + } +} + +void sub_80E9368(u8 a) +{ + const u8 *r4; + + switch (a) + { + case 0: + r4 = gOtherText_Profile; + break; + case 1: + r4 = gOtherText_AtBattleStart; + break; + case 2: + r4 = gOtherText_UponWinningBattle; + break; + case 3: + r4 = gOtherText_UponLosingBattle; + break; + case 6: + r4 = gOtherText_TheBardsSong; + break; + case 9: + r4 = gOtherText_WhatsHipHappening; + break; + case 5: + case 7: + case 8: + case 10: + case 11: + case 12: + r4 = gOtherText_Interview; + break; + case 13: + r4 = gOtherText_GoodSaying; + break; + default: + r4 = NULL; + break; + } + + BasicInitMenuWindow(&gWindowTemplate_81E6D8C); + gEasyChatStruct->unk9F8E[0] = EXT_CTRL_CODE_BEGIN; + gEasyChatStruct->unk9F8E[1] = 5; + gEasyChatStruct->unk9F8E[2] = 1; + if (r4 != NULL) + { + sub_8072C74(gEasyChatStruct->unk9F8E + 3, r4, 240, 2); + Menu_PrintText(gEasyChatStruct->unk9F8E, 0, 0); + } + else + { + u8 *str = gEasyChatStruct->unk9F8E + 3; + + str[0] = EXT_CTRL_CODE_BEGIN; + str[1] = 0x11; + str[2] = 0x10; + str[3] = EOS; + + Menu_PrintText(gEasyChatStruct->unk9F8E, 0, 0); + Menu_PrintText(gEasyChatStruct->unk9F8E, 28, 0); + } + BasicInitMenuWindow(&gWindowTemplate_81E6DA8); +} + +void sub_80E948C(void) +{ + switch (gEasyChatStruct->unk9) + { + case 4: + sub_809D104((void *)(VRAM + 0x6800), 3, 3, gUnknown_08E94AD0, 0, 26, 24, 6); + break; + case 5: + sub_809D104((void *)(VRAM + 0x6800), 14, 2, gUnknown_08E94AD0, 0, 18, 13, 8); + break; + case 0: + sub_809D104((void *)(VRAM + 0x6800), 2, 2, gUnknown_08E94AD0, 0, 10, 26, 8); + break; + case 1: + sub_809D104((void *)(VRAM + 0x6800), 2, 0, gUnknown_08E94AD0, 0, 0, 26, 10); + break; + case 2: + sub_809D104((void *)(VRAM + 0x6800), 14, 3, gUnknown_08E94AD0, 13, 18, 13, 4); + break; + case 3: + sub_809D104((void *)(VRAM + 0x6800), 3, 2, gUnknown_08E94AD0, 0, 32, 24, 4); + break; + } +} + +void sub_80E95A4(void) +{ + BasicInitMenuWindow(&gWindowTemplate_81E6D8C); + switch (gEasyChatStruct->unk9) + { + case 4: + sub_80E9620(4, 6); + break; + case 5: + sub_80E9620(2, 17); + break; + case 0: + sub_80E9620(3, 5); + break; + case 1: + sub_80E9620(0, 5); + break; + case 2: + sub_80E9620(4, 17); + break; + case 3: + sub_80E9620(3, 6); + break; + } + BasicInitMenuWindow(&gWindowTemplate_81E6DA8); +} + +void sub_80E9620(u16 a, u16 b) +{ + u16 i; + u16 j; + u16 r10 = 0; + u16 r7 = a; + + for (i = 0; i < gEasyChatStruct->unk84; i++) + { + u16 r6 = b; + + for (j = 0; j < gEasyChatStruct->unk83; j++) + { + if (r10 >= gEasyChatStruct->unkA) + { + Menu_PrintText(gUnknown_083DBEA8, r6, r7); + break; + } + if (gEasyChatStruct->unkC[r10] == 0xFFFF) + { + sub_8095C8C((void *)(VRAM + 0x7000), r6, r7, gUnknown_083DBE1C, 0, 0, 9, 2, 9); + r6 += 11; + } + else + { + sub_80EB218(gEasyChatStruct->unk9E14, gEasyChatStruct->unkC[r10], 11); + Menu_PrintText(gEasyChatStruct->unk9E14, r6, r7); + r6 += gEasyChatStruct->unk8C[i][j] + 11; + } + r10++; + } + r7 += 2; + } +} + +void sub_80E9744(void) +{ + BasicInitMenuWindow(&gWindowTemplate_81E6D8C); + switch (gEasyChatStruct->unk9) + { + case 4: + sub_80E97C0(4, 6); + break; + case 5: + sub_80E97C0(2, 17); + break; + case 0: + sub_80E97C0(3, 5); + break; + case 1: + sub_80E97C0(0, 5); + break; + case 2: + sub_80E97C0(4, 17); + break; + case 3: + sub_80E97C0(3, 6); + break; + } + BasicInitMenuWindow(&gWindowTemplate_81E6DA8); +} + +void sub_80E97C0(u16 a, u16 b) +{ + u8 i; + u8 r7 = 0; + + asm("":::"r9"); + + for (i = 0; i < gEasyChatStruct->unk84; i++) + { + u8 r6; + u8 *r2 = gEasyChatStruct->unk9E6E; + u32 r1; + + for (r6 = 0; r6 < gEasyChatStruct->unk83; r6++) + { + if (r7 >= gEasyChatStruct->unkA) + break; + if (gEasyChatStruct->unkC[r7] != 0xFFFF) + { + r2 = sub_80EB218(r2, gEasyChatStruct->unkC[r7], 0); + *r2++ = CHAR_SPACE; + } + r7++; + } + + r1 = gEasyChatStruct->unk83 * 11; + r2[0] = EXT_CTRL_CODE_BEGIN; + r2[1] = 0x13; + r2[2] = r1 * 8; + r2[3] = EOS; + + Menu_PrintText(gEasyChatStruct->unk9E6E, b, a); + + a += 2; + } +} + +void sub_80E98C4(void) +{ + u8 r1; + u8 r3; + + BasicInitMenuWindow(&gWindowTemplate_81E6D8C); + switch (gEasyChatStruct->unk9) + { + case 4: + r1 = 4; + r3 = 2; + break; + case 5: + r1 = 3; + r3 = 2; + break; + case 0: + r1 = 3; + r3 = 2; + break; + case 1: + r1 = 1; + r3 = 3; + break; + case 2: + r1 = 4; + r3 = 1; + break; + case 3: + r1 = 3; + r3 = 1; + break; + default: + return; + } + Menu_BlankWindowRect(2, r1, 27, r3 * 2 + r1 - 1); + BasicInitMenuWindow(&gWindowTemplate_81E6DA8); +} + +void sub_80E9940(u8 *a, u8 b) +{ + u8 r4 = (b & 7); + + Menu_BlankWindowRect(2, r4 * 2, 31, r4 * 2 + 1); + sub_80E9A7C(a, b); + sub_80E9A60(a, 2, r4 * 2); +} + +#if ENGLISH + +const u8 gUnknown_083DBEAC[][32] = +{ + _("{UNKNOWN_14 8} A B C D E F {UNKNOWN_14 0}others"), + _("{UNKNOWN_14 8} G H I J K L "), + _("{UNKNOWN_14 8} M N O P Q R S "), + _("{UNKNOWN_14 8} T U V W X Y Z "), +}; + +#else + +const u8 unk_83E7EB0[] = _("{UNKNOWN_14 8} A B C D E F {UNKNOWN_14 0}mehr"); +const u8 unk_83E7ECA[] = _("{UNKNOWN_14 8} G H I J K L "); +const u8 unk_83E7EE1[] = _("{UNKNOWN_14 8} M N O P Q R S "); +const u8 unk_83E7EF8[] = _("{UNKNOWN_14 8} T U V W X Y Z "); +const u8 *const gUnknown_083DBEAC[] = +{ + unk_83E7EB0, + unk_83E7ECA, + unk_83E7EE1, + unk_83E7EF8, + unk_83E7EB0 + 21, // pointer to "mehr". What is this for? +}; + +#endif + +void sub_80E9974(void) +{ + BasicInitMenuWindow(&gWindowTemplate_81E6D54); + if (gEasyChatStruct->unk26 == 0) + { + u16 i; + + for (i = gEasyChatStruct->unk1B5; i < gEasyChatStruct->unk1B5 + 4; i++) + sub_80E9940(gEasyChatStruct->unk9DC9, i); + } + else + { + sub_80E9AD4(); + sub_80E9A60(gUnknown_083DBEAC[0], 2, 0); + sub_80E9A60(gUnknown_083DBEAC[1], 2, 2); + sub_80E9A60(gUnknown_083DBEAC[2], 2, 4); + sub_80E9A60(gUnknown_083DBEAC[3], 2, 6); + } +} + +void sub_80E9A14(void) +{ + sub_80E9A4C(); + if (gEasyChatStruct->unk26 == 0) + gEasyChatStruct->unk1BA += gEasyChatStruct->unk1B5 * 16; +} + +void sub_80E9A4C(void) +{ + gEasyChatStruct->unk1BA = 0; +} + +void sub_80E9A60(const u8 *a, u16 b, u16 c) +{ + c &= 0xF; + Menu_PrintText(a, b, c); +} + +void sub_80E9A7C(u8 *dest, u16 b) +{ + u16 i; + u16 r5 = b * 2; + + for (i = 0; i < 2; i++) + { + dest[0] = EXT_CTRL_CODE_BEGIN; + dest[1] = 0x12; + dest[2] = 88 * i; + dest += 3; + + dest = CopyEasyChatGroupName(dest, gEasyChatStruct->unk2A[b][i], 11); + r5++; + if (r5 >= gEasyChatStruct->unk28) + break; + } +} + +void sub_80E9AD4(void) +{ + u16 i; + + BasicInitMenuWindow(&gWindowTemplate_81E6D54); + for (i = 0; i < 16; i++) + sub_80E9C74(i); +} + +void sub_80E9AF8(u16 a) +{ + u8 *r8; + u16 i; + + sub_80E9C74(a); + + r8 = gEasyChatStruct->unk9E14; + r8[0] = EXT_CTRL_CODE_BEGIN; + r8[1] = 0x11; + r8[2] = 0x10; + r8 += 3; + + if (gEasyChatStruct->unk7D != 0) + { + for (i = 0; i < gEasyChatStruct->unk99A6[a]; i++) + { + if (sub_80EB2D4(gEasyChatStruct->unk9A2A[a][i]) == 7) + BasicInitMenuWindow(&gWindowTemplate_81E6D70); + else + BasicInitMenuWindow(&gWindowTemplate_81E6D54); + sub_80EB218(r8, gEasyChatStruct->unk9A2A[a][i], 9); + sub_80E9A60(gEasyChatStruct->unk9E14, i * 11 + 4, a * 2); + } + } + else + { + BasicInitMenuWindow(&gWindowTemplate_81E6D54); + for (i = 0; i < gEasyChatStruct->unk99A6[a]; i++) + { + sub_80EB218(r8, gEasyChatStruct->unk9A2A[a][i], 9); + sub_80E9A60(gEasyChatStruct->unk9E14, i * 11 + 4, a * 2); + } + } +} + +void sub_80E9C74(u16 a) +{ + a &= 7; + Menu_BlankWindowRect(0, a * 2, 29, a * 2 + 1); +} + +void sub_80E9C94(void) +{ + u16 r5 = min(gEasyChatStruct->unk9A28, 4); + u16 i; + + for (i = 0; i < r5; i++) + sub_80E9AF8(gEasyChatStruct->unk9A29 + i); + while (i < 4) + sub_80E9C74(i++); +} + +void sub_80E9D00(void) +{ + u16 r4; + u16 r5; + + if (gEasyChatStruct->unk1C0 > 0) + { + r4 = gEasyChatStruct->unk1C0; + r5 = gEasyChatStruct->unk9A29 + 4; + } + else + { + r4 = -gEasyChatStruct->unk1C0; + r5 = gEasyChatStruct->unk9A29 - r4; + } + while (--r4 != 0xFFFF) + sub_80E9AF8(r5++); +} + +void sub_80E9D7C(void) +{ + u16 r6; + u16 r4; + u16 i; + + BasicInitMenuWindow(&gWindowTemplate_81E6D54); + if (gEasyChatStruct->unk1C0 < 0) + { + r6 = -gEasyChatStruct->unk1C0; + r4 = gEasyChatStruct->unk1B5 - r6; + } + else + { + r6 = gEasyChatStruct->unk1C0; + r4 = gEasyChatStruct->unk1B5 + 4; + } + for (i = 0; i < r6; i++) + { + sub_80E9940(gEasyChatStruct->unk9DC9, r4); + r4++; + } +} + +void sub_80E9E08(u8 a) +{ + gEasyChatStruct->unk1BC = (gEasyChatStruct->unk1BA + gEasyChatStruct->unk1C0 * 16) & 0x7F; + gEasyChatStruct->unk1BF = (gEasyChatStruct->unk1C0 < 0) ? -a : a; +} + +bool8 sub_80E9E54(void) +{ + gEasyChatStruct->unk1BA = (gEasyChatStruct->unk1BA + gEasyChatStruct->unk1BF) & 0x7F; + return (gEasyChatStruct->unk1BA == gEasyChatStruct->unk1BC); +} + +void nullsub_23(void) +{ +} + +void sub_80E9E98(void) +{ + gEasyChatStruct->unkBE = 0; +} + +bool8 sub_80E9EA8(void) +{ + switch (gEasyChatStruct->unkBE) + { + case 0: + sub_80EA24C(); + gEasyChatStruct->unkBE++; + // fall through + case 1: + if (sub_80EA1E0() != 0) + { + sub_80EA4A4(); + gEasyChatStruct->unkBE++; + } + break; + case 2: + if (sub_80EA1E0() != 0) + { + sub_80EA704(); + gEasyChatStruct->unkBE++; + } + break; + case 3: + if (sub_80EA1E0() != 0) + gEasyChatStruct->unkBE++; + break; + case 4: + gEasyChatStruct->unkBE++; + break; + case 5: + return TRUE; + } + return FALSE; +} + +bool8 sub_80E9F50(void) +{ + switch (gEasyChatStruct->unkBE) + { + case 0: + nullsub_23(); + sub_80EA764(); + gEasyChatStruct->unkBE++; + // fall through + case 1: + if (sub_80EA1E0() != 0) + gEasyChatStruct->unkBE++; + break; + case 2: + sub_80EA5A0(); + gEasyChatStruct->unkBE++; + // fall through + case 3: + if (sub_80EA1E0() != 0) + gEasyChatStruct->unkBE++; + break; + case 4: + sub_80EA348(); + gEasyChatStruct->unkBE++; + // fall through + case 5: + if (sub_80EA1E0() != 0) + gEasyChatStruct->unkBE++; + break; + case 6: + return TRUE; + } + return FALSE; +} + +bool8 sub_80E9FD4(void) +{ + switch (gEasyChatStruct->unkBE) + { + case 0: + nullsub_23(); + sub_80EA5A0(); + gEasyChatStruct->unkBE++; + // fall through + case 1: + if (sub_80EA1E0() != 0) + return TRUE; + break; + } + return FALSE; +} + +bool8 sub_80EA014(void) +{ + switch (gEasyChatStruct->unkBE) + { + case 0: + sub_80EA4A4(); + gEasyChatStruct->unkBE++; + // fall through + case 1: + if (sub_80EA1E0() != 0) + return TRUE; + break; + } + return FALSE; +} + +bool8 sub_80EA050(void) +{ + switch (gEasyChatStruct->unkBE) + { + case 0: + nullsub_23(); + sub_80EA764(); + gEasyChatStruct->unkBE++; + break; + case 1: + if (sub_80EA1E0() != 0) + { + sub_80EA7F4(); + gEasyChatStruct->unkBE++; + } + break; + case 2: + sub_80E9108(1); + if (sub_80EA1E0() != 0) + { + sub_80EA8BC(); + gEasyChatStruct->unkBE++; + } + break; + case 3: + sub_80E9108(1); + if (sub_80EA1E0() != 0) + gEasyChatStruct->unkBE++; + break; + case 4: + return TRUE; + } + return FALSE; +} + +bool8 sub_80EA0E4(void) +{ + switch (gEasyChatStruct->unkBE) + { + case 0: + sub_80EA948(); + gEasyChatStruct->unkBE++; + // fall through + case 1: + sub_80E9108(-1); + if (sub_80EA1E0() != 0) + { + sub_80EAA44(); + gEasyChatStruct->unkBE++; + } + break; + case 2: + sub_80E9108(-1); + if (sub_80EA1E0() != 0) + { + sub_80EA704(); + gEasyChatStruct->unkBE++; + } + break; + case 3: + if (sub_80EA1E0() != 0) + gEasyChatStruct->unkBE++; + break; + case 4: + return TRUE; + } + return FALSE; +} + +bool8 sub_80EA184(void) +{ + switch (gEasyChatStruct->unkBE) + { + case 0: + sub_80EAAD4(); + gEasyChatStruct->unkBE++; + // fall through + case 1: + if (sub_80EA1E0() != 0) + gEasyChatStruct->unkBE++; + break; + case 2: + sub_80E9178(); + return TRUE; + } + return FALSE; +} + +bool8 sub_80EA1E0(void) +{ + u16 i; + + if (gEasyChatStruct->unkC4 != 0) + { + for (i = 0; i < gEasyChatStruct->unkC2; i++) + { + sub_80EAC0C(gEasyChatStruct->unkC8[i]); + sub_80EAC48(&gEasyChatStruct->unk148[i]); + } + gEasyChatStruct->unkBC = 1; + gEasyChatStruct->unkC4--; + return FALSE; + } + return TRUE; +} + +void sub_80EA24C(void) +{ + sub_80EABD4(gEasyChatStruct->unkC8[0], 13, 14, 13, 15, -2, 0, 0, 0); + sub_80EAC30(&gEasyChatStruct->unk148[0], 0, 0, 0, 0, gEasyChatStruct->unk6C8); + + sub_80EABD4(gEasyChatStruct->unkC8[1], 12, 14, 12, 15, 0, 0, 2, 0); + sub_80EAC30(&gEasyChatStruct->unk148[1], 30, 0, -2, 0, gEasyChatStruct->unk6C8); + + sub_80EABD4(gEasyChatStruct->unkC8[2], 13, 15, 13, 16, -2, 0, 0, 0); + sub_80EAC30(&gEasyChatStruct->unk148[2], 0, 9, 0, 0, gEasyChatStruct->unk6C8); + + sub_80EABD4(gEasyChatStruct->unkC8[3], 12, 15, 12, 16, 0, 0, 2, 0); + sub_80EAC30(&gEasyChatStruct->unk148[3], 30, 9, -2, 0, gEasyChatStruct->unk6C8); + + gEasyChatStruct->unkC2 = 4; + gEasyChatStruct->unkC4 = 6; +} + +void sub_80EA348(void) +{ + sub_80EABD4(gEasyChatStruct->unkC8[0], 1, 14, 13, 15, 2, 0, 0, 0); + sub_80EAC30(&gEasyChatStruct->unk148[0], 0, 0, 0, 0, gEasyChatStruct->unk6C8); + + sub_80EABD4(gEasyChatStruct->unkC8[1], 12, 14, 24, 15, 0, 0, -2, 0); + sub_80EAC30(&gEasyChatStruct->unk148[1], 18, 0, 2, 0, gEasyChatStruct->unk6C8); + + sub_80EABD4(gEasyChatStruct->unkC8[2], 1, 15, 13, 16, 2, 0, 0, 0); + sub_80EAC30(&gEasyChatStruct->unk148[2], 0, 9, 0, 0, gEasyChatStruct->unk6C8); + + sub_80EABD4(gEasyChatStruct->unkC8[3], 12, 15, 24, 16, 0, 0, -2, 0); + sub_80EAC30(&gEasyChatStruct->unk148[3], 18, 9, 2, 0, gEasyChatStruct->unk6C8); + + sub_80EABD4(gEasyChatStruct->unkC8[4], 1, 14, 1, 16, 0, 0, 2, 0); + sub_80EAC30(&gEasyChatStruct->unk148[4], 1, 14, 0, 0, gEasyChatStruct->unk1C8); + + sub_80EABD4(gEasyChatStruct->unkC8[5], 24, 14, 24, 16, -2, 0, 0, 0); + sub_80EAC30(&gEasyChatStruct->unk148[5], 24, 14, -2, 0, gEasyChatStruct->unk1C8); + + gEasyChatStruct->unkC2 = 6; + gEasyChatStruct->unkC4 = 6; +} + +void sub_80EA4A4(void) +{ + sub_80EABD4(gEasyChatStruct->unkC8[0], 1, 14, 13, 15, 0, -1, 0, 0); + sub_80EAC30(&gEasyChatStruct->unk148[0], 0, 0, 0, 0, gEasyChatStruct->unk6C8); + + sub_80EABD4(gEasyChatStruct->unkC8[1], 12, 14, 24, 15, 0, -1, 0, 0); + sub_80EAC30(&gEasyChatStruct->unk148[1], 18, 0, 0, 0, gEasyChatStruct->unk6C8); + + sub_80EABD4(gEasyChatStruct->unkC8[2], 1, 15, 13, 16, 0, 0, 0, 1); + sub_80EAC30(&gEasyChatStruct->unk148[2], 0, 9, 0, -1, gEasyChatStruct->unk6C8); + + sub_80EABD4(gEasyChatStruct->unkC8[3], 12, 15, 24, 16, 0, 0, 0, 1); + sub_80EAC30(&gEasyChatStruct->unk148[3], 18, 9, 0, -1, gEasyChatStruct->unk6C8); + + gEasyChatStruct->unkC2 = 4; + gEasyChatStruct->unkC4 = 4; +} + +void sub_80EA5A0(void) +{ + sub_80EABD4(gEasyChatStruct->unkC8[0], 1, 10, 13, 15, 0, 1, 0, 0); + sub_80EAC30(&gEasyChatStruct->unk148[0], 0, 0, 0, 0, gEasyChatStruct->unk6C8); + + sub_80EABD4(gEasyChatStruct->unkC8[1], 12, 10, 24, 15, 0, 1, 0, 0); + sub_80EAC30(&gEasyChatStruct->unk148[1], 18, 0, 0, 0, gEasyChatStruct->unk6C8); + + sub_80EABD4(gEasyChatStruct->unkC8[2], 1, 15, 13, 20, 0, 0, 0, -1); + sub_80EAC30(&gEasyChatStruct->unk148[2], 0, 5, 0, 1, gEasyChatStruct->unk6C8); + + sub_80EABD4(gEasyChatStruct->unkC8[3], 12, 15, 24, 20, 0, 0, 0, -1); + sub_80EAC30(&gEasyChatStruct->unk148[3], 18, 5, 0, 1, gEasyChatStruct->unk6C8); + + sub_80EABD4(gEasyChatStruct->unkC8[4], 1, 10, 24, 10, 0, 0, 0, 1); + sub_80EAC30(&gEasyChatStruct->unk148[4], 1, 10, 0, 0, gEasyChatStruct->unk1C8); + + sub_80EABD4(gEasyChatStruct->unkC8[5], 1, 20, 24, 20, 0, -1, 0, 0); + sub_80EAC30(&gEasyChatStruct->unk148[5], 1, 20, 0, -1, gEasyChatStruct->unk1C8); + + gEasyChatStruct->unkC2 = 6; + gEasyChatStruct->unkC4 = 4; +} + +void sub_80EA704(void) +{ + sub_80EABD4(gEasyChatStruct->unkC8[0], 24, 12, 25, 20, 0, 0, 1, 0); + sub_80EAC30(&gEasyChatStruct->unk148[0], 5, 10, -1, 0, gEasyChatStruct->unk6C8); + + gEasyChatStruct->unkC2 = 1; + gEasyChatStruct->unkC4 = 5; +} + +void sub_80EA764(void) +{ + sub_80EABD4(gEasyChatStruct->unkC8[0], 24, 12, 30, 20, 0, 0, -1, 0); + sub_80EAC30(&gEasyChatStruct->unk148[0], 0, 10, 1, 0, gEasyChatStruct->unk6C8); + + sub_80EABD4(gEasyChatStruct->unkC8[1], 30, 12, 31, 20, -1, 0, 0, 0); + sub_80EAC30(&gEasyChatStruct->unk148[1], 30, 12, -1, 0, gEasyChatStruct->unk1C8); + + gEasyChatStruct->unkC2 = 2; + gEasyChatStruct->unkC4 = 6; +} + +void sub_80EA7F4(void) +{ + sub_80EABD4(gEasyChatStruct->unkC8[0], 20, 10, 25, 20, 0, 0, 1, 0); + sub_80EAC30(&gEasyChatStruct->unk148[0], 25, 0, -1, 0, gEasyChatStruct->unk6C8); + + sub_80EABD4(gEasyChatStruct->unkC8[1], 0, 10, 1, 20, 0, 0, 1, 0); + sub_80EAC30(&gEasyChatStruct->unk148[1], 0, 10, 0, 0, gEasyChatStruct->unk1C8); + + sub_80EABD4(gEasyChatStruct->unkC8[2], 1, 10, 4, 20, 1, 0, 0, 0); + sub_80EAC30(&gEasyChatStruct->unk148[2], 0, 0, 0, 0, gEasyChatStruct->unk6C8); + + gEasyChatStruct->unkC2 = 3; + gEasyChatStruct->unkC4 = 2; +} + +void sub_80EA8BC(void) +{ + sub_80EABD4(gEasyChatStruct->unkC8[0], 3, 10, 4, 20, 0, 0, 0, 0); + sub_80EAC30(&gEasyChatStruct->unk148[0], 0, 0, 0, 0, gEasyChatStruct->unk6C8); + + sub_80EABD4(gEasyChatStruct->unkC8[1], 0, 10, 2, 20, 0, 0, 0, 0); + sub_80EAC30(&gEasyChatStruct->unk148[1], 0, 10, 0, 0, gEasyChatStruct->unk1C8); + + gEasyChatStruct->unkC2 = 2; + gEasyChatStruct->unkC4 = 1; +} + +void sub_80EA948(void) +{ + sub_80EABD4(gEasyChatStruct->unkC8[0], 0, 10, 2, 20, 0, 0, -1, 0); + sub_80EAC30(&gEasyChatStruct->unk148[0], 0, 10, 0, 0, gEasyChatStruct->unk1C8); + + sub_80EABD4(gEasyChatStruct->unkC8[1], 3, 10, 5, 20, -1, 0, 0, 0); + sub_80EAC30(&gEasyChatStruct->unk148[1], 0, 0, 0, 0, gEasyChatStruct->unk6C8); + + sub_80EABD4(gEasyChatStruct->unkC8[2], 26, 10, 30, 20, -1, 0, 0, 0); + sub_80EAC30(&gEasyChatStruct->unk148[2], 26, 10, -1, 0, gEasyChatStruct->unk1C8); + + sub_80EABD4(gEasyChatStruct->unkC8[3], 25, 10, 26, 20, -1, 0, -1, 0); + sub_80EAC30(&gEasyChatStruct->unk148[3], 29, 0, 0, 0, gEasyChatStruct->unk6C8); + + gEasyChatStruct->unkC2 = 4; + gEasyChatStruct->unkC4 = 2; +} + +void sub_80EAA44(void) +{ + sub_80EABD4(gEasyChatStruct->unkC8[0], 24, 10, 30, 20, 0, 0, 0, 0); + sub_80EAC30(&gEasyChatStruct->unk148[0], 24, 10, 0, 0, gEasyChatStruct->unk1C8); + + sub_80EABD4(gEasyChatStruct->unkC8[1], 23, 10, 24, 20, 0, 0, -1, 0); + sub_80EAC30(&gEasyChatStruct->unk148[1], 29, 0, 0, 0, gEasyChatStruct->unk6C8); + + gEasyChatStruct->unkC2 = 2; + gEasyChatStruct->unkC4 = 1; +} + +void sub_80EAAD4(void) +{ + sub_80EABD4(gEasyChatStruct->unkC8[0], 0, 10, 30, 15, 0, 1, 0, 0); + sub_80EAC30(&gEasyChatStruct->unk148[0], 0, 0, 0, 0, gEasyChatStruct->unk6C8); + + sub_80EABD4(gEasyChatStruct->unkC8[1], 0, 15, 30, 20, 0, 0, 0, -1); + sub_80EAC30(&gEasyChatStruct->unk148[1], 0, 5, 0, 1, gEasyChatStruct->unk6C8); + + sub_80EABD4(gEasyChatStruct->unkC8[2], 0, 10, 30, 10, 0, 0, 0, 1); + sub_80EAC30(&gEasyChatStruct->unk148[2], 0, 10, 0, 0, gEasyChatStruct->unk1C8); + + sub_80EABD4(gEasyChatStruct->unkC8[3], 0, 20, 30, 20, 0, -1, 0, 0); + sub_80EAC30(&gEasyChatStruct->unk148[3], 0, 20, 0, -1, gEasyChatStruct->unk1C8); + + gEasyChatStruct->unkC2 = 4; + gEasyChatStruct->unkC4 = 5; +} + +void sub_80EABD4(u16 *a, u16 b, u16 c, u16 d, u16 e, u16 f, u16 g, u16 h, u16 i) +{ + a[0] = b; + a[1] = d; + a[2] = c; + a[3] = e; + a[4] = f; + a[5] = h; + a[6] = g; + a[7] = i; +} + +void sub_80EAC0C(u16 *a) +{ + a[0] += a[4]; + a[1] += a[5]; + a[2] += a[6]; + a[3] += a[7]; +} + +void sub_80EAC30(struct UnknownEasyChatStruct1 *a, u16 b, u16 c, u16 d, u16 e, void *f) +{ + a->unk0 = b; + a->unk2 = c; + a->unk4 = d; + a->unk6 = e; + a->unk8 = f; +} + +void sub_80EAC48(struct UnknownEasyChatStruct1 *a) +{ + a->unk0 += a->unk4; + a->unk2 += a->unk6; +} + +void sub_80EAC5C(void) +{ + u16 i; + + if (gEasyChatStruct->unkBC != 0) + { + for (i = 0; i < gEasyChatStruct->unkC2; i++) + sub_80EACBC((void *)(VRAM + 0x6800), gEasyChatStruct->unkC8[i], &gEasyChatStruct->unk148[i]); + gEasyChatStruct->unkBC = 0; + } +} + +void sub_80EACBC(void *a, u16 *b, struct UnknownEasyChatStruct1 *c) +{ + s16 r6 = b[1] - b[0]; + s16 r5 = b[3] - b[2]; + + if (r6 > 0 && r5 > 0) + sub_809D104(a, b[0], b[2], c->unk8, c->unk0, c->unk2, r6, r5); +} + +// Strange... +void sub_80EAD08(void) +{ + u16 *r4; + u16 r2; + u16 i; + + r4 = gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer]; + r4 += 88; + r2 = (gEasyChatStruct->unk1BA - 88) & 0xFF; + + for (i = 0; i < 64; i++) + { + if (gEasyChatStruct->unk1BA + i == 128) + r2 = (-i - 88) & 0xFF; + *r4++ = r2; + } +} + +extern const u8 *const gEasyChatGroupNames[]; +extern const u8 gEasyChatGroupSizes[]; +extern const u16 gEasyChatWordsByLetter[]; +extern const u16 gEasyChatWordsAlphabetized[]; + +u8 *CopyEasyChatGroupName(u8 *dest, u8 group, int unused) +{ + return StringCopy(dest, gEasyChatGroupNames[group]); +} + +bool8 sub_80EAD7C(u8 group) +{ + switch (group) + { + case EC_GROUP_TRENDY_SAYING: + return FlagGet(FLAG_SYS_HIPSTER_MEET); + case EC_GROUP_EVENTS: + case EC_GROUP_MOVE_1: + case EC_GROUP_MOVE_2: + return FlagGet(FLAG_SYS_GAME_CLEAR); + case EC_GROUP_POKEMON_2: + return sub_80EB9C8(); + default: + return TRUE; + } +} + +bool8 sub_80EADC0(u8 group, u16 word) +{ + switch (group) + { + case EC_GROUP_TRENDY_SAYING: + if (gEasyChatStruct->unk40[2][11 + group] == 0) + return FALSE; + return sub_80EB868(word); + case EC_GROUP_POKEMON_1: + return GetSetPokedexFlag(SpeciesToNationalPokedexNum(word), 0); + case EC_GROUP_EVENTS: + case EC_GROUP_MOVE_1: + case EC_GROUP_MOVE_2: + if (gEasyChatStruct->unk40[2][11 + group] == 0) + return FALSE; + return TRUE; + case EC_GROUP_POKEMON_2: + return sub_80EB9C8(); + default: + return TRUE; + } +} + +u16 sub_80EAE88(u8 group) +{ + switch (group) + { + case EC_GROUP_POKEMON_1: + return GetHoennPokedexCount(0); + case EC_GROUP_TRENDY_SAYING: + return sub_80EB8C0(); + default: + if (sub_80EAD7C(group)) + return gEasyChatGroupSizes[group]; + return FALSE; + } +} + +#if GERMAN +__attribute__((naked)) +void sub_80EAECC(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x10\n\ + movs r7, 0\n\ + ldr r1, _080EAF08 @ =gEasyChatStruct\n\ + ldr r0, [r1]\n\ + ldr r3, _080EAF0C @ =0x0000446c\n\ + adds r3, r0, r3\n\ + str r3, [sp, 0x4]\n\ +_080EAEE4:\n\ + ldr r1, _080EAF10 @ =gEasyChatWordsByLetter\n\ + lsls r2, r7, 1\n\ + adds r0, r2, r1\n\ + ldrh r4, [r0]\n\ + adds r3, r7, 0x1\n\ + lsls r0, r3, 1\n\ + adds r0, r1\n\ + ldrh r0, [r0]\n\ + str r0, [sp]\n\ + ldr r0, [sp, 0x4]\n\ + adds r1, r0, r2\n\ + movs r0, 0\n\ + strh r0, [r1]\n\ + mov r9, r0\n\ + adds r6, r4, 0\n\ + mov r10, r2\n\ + str r3, [sp, 0x8]\n\ + b _080EB00C\n\ + .align 2, 0\n\ +_080EAF08: .4byte gEasyChatStruct\n\ +_080EAF0C: .4byte 0x0000446c\n\ +_080EAF10: .4byte gEasyChatWordsByLetter\n\ +_080EAF14:\n\ + ldr r2, _080EAFAC @ =gEasyChatWordsAlphabetized\n\ + adds r0, r6, 0\n\ + adds r1, r0, 0x1\n\ + lsls r1, 16\n\ + lsrs r6, r1, 16\n\ + lsls r0, 1\n\ + adds r0, r2\n\ + ldrh r1, [r0]\n\ + adds r4, r1, 0\n\ + ldr r0, _080EAFB0 @ =0x0000feff\n\ + cmp r1, r0\n\ + bls _080EAFC8\n\ + movs r0, 0xFF\n\ + ands r1, r0\n\ + movs r3, 0\n\ + subs r0, r1, 0x1\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + ldr r0, _080EAFB4 @ =0x0000ffff\n\ + cmp r5, r0\n\ + beq _080EB00C\n\ + lsls r0, r7, 4\n\ + adds r0, r7\n\ + lsls r0, 3\n\ + subs r0, r7\n\ + lsls r0, 2\n\ + mov r8, r0\n\ +_080EAF4A:\n\ + adds r1, r6, 0\n\ + adds r0, r1, 0x1\n\ + lsls r0, 16\n\ + lsrs r6, r0, 16\n\ + lsls r1, 1\n\ + ldr r0, _080EAFAC @ =gEasyChatWordsAlphabetized\n\ + adds r1, r0\n\ + ldrh r4, [r1]\n\ + lsrs r0, r4, 9\n\ + ldr r1, _080EAFB8 @ =0x000001ff\n\ + adds r2, r1, 0\n\ + adds r1, r4, 0\n\ + ands r1, r2\n\ + str r3, [sp, 0xC]\n\ + bl sub_80EADC0\n\ + lsls r0, 24\n\ + ldr r3, [sp, 0xC]\n\ + cmp r0, 0\n\ + beq _080EAF9E\n\ + cmp r3, 0\n\ + bne _080EAF9E\n\ + ldr r3, _080EAFBC @ =gEasyChatStruct\n\ + ldr r2, [r3]\n\ + mov r1, r9\n\ + adds r0, r1, 0x1\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + mov r9, r0\n\ + lsls r1, 1\n\ + add r1, r8\n\ + ldr r3, _080EAFC0 @ =0x00000b78\n\ + adds r0, r2, r3\n\ + adds r0, r1\n\ + strh r4, [r0]\n\ + ldr r0, _080EAFC4 @ =0x0000446c\n\ + adds r2, r0\n\ + add r2, r10\n\ + ldrh r0, [r2]\n\ + adds r0, 0x1\n\ + strh r0, [r2]\n\ + movs r3, 0x1\n\ +_080EAF9E:\n\ + subs r0, r5, 0x1\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + ldr r1, _080EAFB4 @ =0x0000ffff\n\ + cmp r5, r1\n\ + bne _080EAF4A\n\ + b _080EB00C\n\ + .align 2, 0\n\ +_080EAFAC: .4byte gEasyChatWordsAlphabetized\n\ +_080EAFB0: .4byte 0x0000feff\n\ +_080EAFB4: .4byte 0x0000ffff\n\ +_080EAFB8: .4byte 0x000001ff\n\ +_080EAFBC: .4byte gEasyChatStruct\n\ +_080EAFC0: .4byte 0x00000b78\n\ +_080EAFC4: .4byte 0x0000446c\n\ +_080EAFC8:\n\ + lsrs r0, r4, 9\n\ + ldr r3, _080EB030 @ =0x000001ff\n\ + adds r2, r3, 0\n\ + adds r1, r4, 0\n\ + ands r1, r2\n\ + bl sub_80EADC0\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080EB00C\n\ + ldr r0, _080EB034 @ =gEasyChatStruct\n\ + ldr r2, [r0]\n\ + mov r1, r9\n\ + adds r0, r1, 0x1\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + mov r9, r0\n\ + lsls r1, 1\n\ + lsls r0, r7, 4\n\ + adds r0, r7\n\ + lsls r0, 3\n\ + subs r0, r7\n\ + lsls r0, 2\n\ + adds r1, r0\n\ + ldr r3, _080EB038 @ =0x00000b78\n\ + adds r0, r2, r3\n\ + adds r0, r1\n\ + strh r4, [r0]\n\ + ldr r0, _080EB03C @ =0x0000446c\n\ + adds r2, r0\n\ + add r2, r10\n\ + ldrh r0, [r2]\n\ + adds r0, 0x1\n\ + strh r0, [r2]\n\ +_080EB00C:\n\ + ldr r1, [sp]\n\ + cmp r6, r1\n\ + bcs _080EB014\n\ + b _080EAF14\n\ +_080EB014:\n\ + ldr r3, [sp, 0x8]\n\ + lsls r0, r3, 16\n\ + lsrs r7, r0, 16\n\ + cmp r7, 0x1A\n\ + bhi _080EB020\n\ + b _080EAEE4\n\ +_080EB020:\n\ + add sp, 0x10\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080EB030: .4byte 0x000001ff\n\ +_080EB034: .4byte gEasyChatStruct\n\ +_080EB038: .4byte 0x00000b78\n\ +_080EB03C: .4byte 0x0000446c\n\ + .syntax divided\n"); +} +#else +void sub_80EAECC(void) +{ + u16 i; + u16 r9; + u16 r6; + u16 r5; + bool8 r7; + + for (i = 0; i < 27; i++) + { + u16 word = gEasyChatWordsByLetter[i]; + u16 sp0 = gEasyChatWordsByLetter[i + 1]; + + gEasyChatStruct->unk4142[i] = 0; + r9 = 0; + r6 = word; + while (r6 < sp0) + { + u16 word = gEasyChatWordsAlphabetized[r6++]; + + if (word > 0xFEFF) + { + r5 = word & 0xFF; + r7 = FALSE; + while (--r5 != 0xFFFF) + { + word = gEasyChatWordsAlphabetized[r6++]; + if (sub_80EADC0(EC_GROUP(word), EC_INDEX(word)) && !r7) + { + gEasyChatStruct->unkB78[i][r9++] = word; + gEasyChatStruct->unk4142[i]++; + r7 = TRUE; + } + } + } + else + { + if (sub_80EADC0(EC_GROUP(word), EC_INDEX(word))) + { + gEasyChatStruct->unkB78[i][r9++] = word; + gEasyChatStruct->unk4142[i]++; + } + } + } + } +} +#endif + +extern const u8 *const gEasyChatGroupWords[]; +extern const u16 *const gEasyChatGroupOrders[]; +extern const u8 gEasyChatGroupSizes[]; + +// loads strings of all easy chat words except for the species and move names. +void LoadEasyChatStrings(void) +{ + u16 group; + u16 index; + + for (group = 0; group <= EC_GROUP_POKEMON_2; group++) + { + if (group != EC_GROUP_POKEMON_1 + && group != EC_GROUP_POKEMON_2 + && group != EC_GROUP_MOVE_1 + && group != EC_GROUP_MOVE_2) + { + const u8 *wordText = gEasyChatGroupWords[group]; + + index = 0; + while (*wordText != EOS) + { + gEasyChatStruct->ecWordStrings[group][index] = wordText; + + // Find the end of the current word + while (*wordText != EOS) + wordText++; + // Skip over the EOS + wordText++; + + index++; + } + } + } +} + +void sub_80EB0B0(void) +{ + const u16 *sp0; + u16 r7; + u16 r9; + u16 r8; + + if (gEasyChatStruct->unk26 == 0) + { + u16 group = gEasyChatStruct->unk1B8; + + gEasyChatStruct->unk4178[group] = 0; + r7 = 0; + r9 = 0; + sp0 = gEasyChatGroupOrders[group]; + for (r8 = 0; r8 < gEasyChatGroupSizes[gEasyChatStruct->unk1B8]; r8++) + { + if (sub_80EADC0(group, sp0[r8])) + { + gEasyChatStruct->unk9A2A[r9][r7] = ((group & 0x7F) << 9) | (sp0[r8] & 0x1FF); + gEasyChatStruct->unk4178[group]++; + r7++; + if (r7 > 1) + { + r7 = 0; + r9++; + } + } + } + } + else + { + u8 r2 = gEasyChatStruct->unk1B8; + u16 r3 = 0; + u16 r6 = 0; + u16 r5; + + for (r5 = 0; r5 < gEasyChatStruct->unk4142[r2]; r5++) + { + gEasyChatStruct->unk9A2A[r6][r3] = gEasyChatStruct->unkB78[r2][r5]; + r3++; + if (r3 > 1) + { + r3 = 0; + r6++; + } + } + } +} + +u8 *sub_80EB218(u8 *dest, u16 word, u16 c) +{ + u8 *wordText; + + if (sub_80EB37C(word)) + { + wordText = StringCopy(dest, gOtherText_ThreeQuestions); + } + else if (word == 0xFFFF) + { + wordText = dest; + wordText[0] = EOS; // Why? It's going to get overwritten. + } + else + { + u16 group = EC_GROUP(word); + u16 index = EC_INDEX(word); + + switch (group) + { + case EC_GROUP_POKEMON_1: + case EC_GROUP_POKEMON_2: + wordText = StringCopy(dest, gSpeciesNames[index]); + break; + case EC_GROUP_MOVE_1: + case EC_GROUP_MOVE_2: + wordText = StringCopy(dest, gMoveNames[index]); + break; + default: + wordText = StringCopy(dest, gEasyChatStruct->ecWordStrings[group][index]); + break; + } + } + + wordText[0] = EXT_CTRL_CODE_BEGIN; + wordText[1] = 0x13; + wordText[2] = c * 8; + wordText += 3; + + *wordText = EOS; + + return wordText; +} + +u16 sub_80EB2D4(u16 word) +{ + const u8 *wordText; + u16 length; + + if (sub_80EB37C(word)) + { + return StringLength(gOtherText_ThreeQuestions); + } + else if (word == 0xFFFF) + { + return 0; + } + else + { + u16 group = EC_GROUP(word); + u16 index = EC_INDEX(word); + + switch (group) + { + case EC_GROUP_POKEMON_1: + case EC_GROUP_POKEMON_2: + wordText = gSpeciesNames[index]; + break; + case EC_GROUP_MOVE_1: + case EC_GROUP_MOVE_2: + wordText = gMoveNames[index]; + break; + default: + wordText = gEasyChatStruct->ecWordStrings[group][index]; + break; + } + } + + length = 0; + while (*wordText != EOS) + { + wordText++; + length++; + } + return length; +} + +bool8 sub_80EB37C(u16 word) +{ + const u16 *r4; + u16 i; + + if (word == 0xFFFF) + { + return FALSE; + } + else + { + u16 group = EC_GROUP(word); + u16 index = EC_INDEX(word); + + if (group <= EC_GROUP_POKEMON_2) + { + switch (group) + { + case EC_GROUP_POKEMON_1: + case EC_GROUP_POKEMON_2: + case EC_GROUP_MOVE_1: + case EC_GROUP_MOVE_2: + r4 = (u16 *)gEasyChatGroupWords[group]; + for (i = 0; i < gEasyChatGroupSizes[group]; i++) + { + if (index == r4[i]) + return FALSE; + } + break; + default: + if (index < gEasyChatGroupSizes[group]) + return FALSE; + break; + } + } + return TRUE; + } +} + +#if GERMAN +u32 de_sub_80EB748(s32 group, s32 index) +{ + s32 i; + u16 *words; + u32 r7 = 0; + + switch (group) + { + case EC_GROUP_POKEMON_1: + case EC_GROUP_POKEMON_2: + case EC_GROUP_MOVE_1: + case EC_GROUP_MOVE_2: + words = (u16 *)gEasyChatGroupWords[group]; + for (i = 0; i < gEasyChatGroupSizes[group]; i++) + { + if (index == words[i]) + { + r7 = i; + break; + } + } + break; + default: + r7 = index; + break; + } + + return r7; +} +#endif + +// returns the end of the destination buffer text +u8 *EasyChat_GetWordText(u8 *dst, u16 word) +{ + u16 group; + u16 wordIndex; + const u8 *src; + u16 i; + + if (sub_80EB37C(word)) + return StringCopy(dst, gOtherText_ThreeQuestions); + + if (word == 0xFFFF) + { + *dst = EOS; + return dst; + } + else + { + group = EC_GROUP(word); + wordIndex = EC_INDEX(word); + switch (group) + { + case EC_GROUP_POKEMON_1: // 0 + case EC_GROUP_POKEMON_2: // 21 + dst = StringCopy(dst, gSpeciesNames[wordIndex]); + break; + case EC_GROUP_MOVE_1: // 18 + case EC_GROUP_MOVE_2: // 19 + dst = StringCopy(dst, gMoveNames[wordIndex]); + break; + default: + src = gEasyChatGroupWords[group]; + for (i = wordIndex - 1; i != 0xFFFF; i--) + { + while (*src++ != EOS) + ; + } + dst = StringCopy(dst, src); + break; + } + *dst = EOS; + return dst; + } +} + +u8 *ConvertEasyChatWordsToString(u8 *dst, u16 *words, u16 arg2, u16 arg3) +{ + u16 i; + u16 n; + + const u16 i1 = arg2 - 1; + + for (i = 0; i < arg3; i++) + { + u16 word; + + for (n = 0; n < i1; n++) + { + dst = EasyChat_GetWordText(dst, words[0]); + + if (words[0] != 0xFFFF) + { + dst[0] = CHAR_SPACE; + dst++; + } + + words++; + } + + word = words[0]; + words++; + dst = EasyChat_GetWordText(dst, word); + + dst[0] = CHAR_NEWLINE; + dst++; + } + + dst--; + dst[0] = EOS; + + return dst; +} + +u8 *sub_80EB544(u8 *dst, u16 *words, u16 arg2, u16 arg3) +{ + u16 i; + u16 n; + + const u16 i1 = arg2 - 1; + + for (i = 0; i < arg3; i++) + { + u16 word; + + for (n = 0; n < i1; n++) + { + dst = EasyChat_GetWordText(dst, words[0]); + + if (words[0] != 0xFFFF) + { + dst[0] = CHAR_SPACE; + dst++; + } + + words++; + } + + word = words[0]; + words++; + dst = EasyChat_GetWordText(dst, word); + + // Only difference with ConvertEasyChatWordsToString + dst[0] = (i == 0) ? CHAR_NEWLINE : CHAR_PROMPT_SCROLL; + dst++; + } + + dst--; + dst[0] = EOS; + + return dst; +} + + +u16 unref_sub_80EB5E0(u16 arg0) +{ + const u8 *chars; + u16 i; + u16 length; + int group, word; + + + if (arg0 == 0xFFFF) + return 0; + + group = EC_GROUP(arg0); + word = EC_INDEX(arg0); + switch (group) + { + case EC_GROUP_POKEMON_1: // 0 + case EC_GROUP_POKEMON_2: // 21 + chars = gSpeciesNames[word]; + break; + case EC_GROUP_MOVE_1: // 18 + case EC_GROUP_MOVE_2: // 19 + chars = gMoveNames[word]; + break; + default: + chars = gEasyChatGroupWords[group]; + for (i = word - 1; i != 0xFFFF; i--) + { + while (*chars++ != EOS) + ; + } + break; + } + + length = 0; + while (*chars != EOS) + { + chars++; + length++; + } + + return length; +} + +bool8 sub_80EB680(u16 *arg0, u16 arg1, u16 arg2, u16 arg3) +{ + return FALSE; +} + +void unref_sub_80EB684(u8 arg0, u16 arg1) +{ + u16 *ptr; + u16 c; + + // FIXME: find actual tv shows used + switch (arg0) + { + case 5: + c = 6; + ptr = (u16*)((void *)&gSaveBlock1.tvShows[arg1] + 0x04); + break; + case 7: + c = 2; + ptr = (u16*)((void *)&gSaveBlock1.tvShows[arg1] + 0x1C); + break; + case 8: + c = 1; + ptr = (u16*)((void *)&gSaveBlock1.tvShows[arg1] + 0x02); + break; + default: + return; + } + + c -= 1; + while (c != 0xFFFF) + { + *ptr = -1; + ptr++; + c -= 1; + } +} + +void sub_80EB6FC(u16 *arg0, u16 arg1) +{ + u16 i; + + for (i = arg1 - 1; i != 0xFFFF; i--) + { + *arg0 = 0xFFFF; + arg0++; + } + +} + +u16 sub_80EB72C(u16 group) +{ + u16 local1 = Random() % gEasyChatGroupSizes[group]; + + if (group == EC_GROUP_POKEMON_1 + || group == EC_GROUP_POKEMON_2 + || group == EC_GROUP_MOVE_1 + || group == EC_GROUP_MOVE_2) + { + local1 = ((u16 *) gEasyChatGroupWords[group])[local1]; + } + + return ((group & 0x7F) << 9) | (local1 & 0x1FF); +} + +u16 sub_80EB784(u16 group) +{ + if (!sub_80EAD7C(group)) + return -1; + + if (group != EC_GROUP_POKEMON_1) + { + if (group == EC_GROUP_TRENDY_SAYING) + return sub_80EB960(); + } + else + { + return sub_80EB9D8(); + } + + return sub_80EB72C(group); +} + +void sub_80EB7C4(void) +{ + u16 *words; + u16 arg1, arg2; + + switch (gSpecialVar_0x8004) + { + case 0: + words = gSaveBlock1.easyChats.unk2B1C; + arg1 = 2; + arg2 = 2; + break; + case 1: + words = gSaveBlock1.easyChats.unk2B28; + if (sub_80EB680(gSaveBlock1.easyChats.unk2B28, 3, 2, 20)) + { + arg1 = 2; + arg2 = 3; + } + else + { + arg1 = 3; + arg2 = 2; + } + break; + case 2: + words = gSaveBlock1.easyChats.unk2B34; + arg1 = 3; + arg2 = 2; + break; + case 3: + words = gSaveBlock1.easyChats.unk2B40; + arg1 = 3; + arg2 = 2; + break; + default: + return; + } + + ConvertEasyChatWordsToString(gStringVar4, words, arg1, arg2); + ShowFieldAutoScrollMessage(gStringVar4); +} + +void BufferRandomHobbyOrLifestyleString(void) +{ + u16 group, local2; + + if (Random() & 1) + group = EC_GROUP_HOBBIES; + else + group = EC_GROUP_LIFESTYLE; + + local2 = sub_80EB784(group); + EasyChat_GetWordText(gStringVar2, local2); +} + +u8 sub_80EB868(u8 arg0) +{ + int offset; + int index; + + index = arg0 / 8; + offset = arg0 % 8; + return (gSaveBlock1.unk2D8C[index] >> offset) & 1; +} + +void sub_80EB890(u8 arg0) +{ + int offset; + int index; + + if (arg0 < 33) + { + index = arg0 / 8; + offset = arg0 % 8; + gSaveBlock1.unk2D8C[index] |= 1 << offset; + } +} + +u8 sub_80EB8C0(void) +{ + u8 i, count; + + for (i = 0, count = 0; i < 33; i++) + { + if (sub_80EB868(i)) + count++; + } + return count; +} + +u16 sub_80EB8EC(void) +{ + u16 i; + u16 local1, local2; + + local1 = sub_80EB8C0(); + if (local1 == 33) + return -1; + + local2 = Random() % (33 - local1); + for (i = 0; i < 33; i++) + { + if (sub_80EB868(i) == 0) + { + if (local2 == 0) + { + sub_80EB890(i); + return (i & 0x1FF) | 0x2800; + } + local2--; + } + } + return -1; +} + +static u16 sub_80EB960(void) +{ + u16 i; + u16 local1; + + local1 = sub_80EB8C0(); + if (local1 == 0) + return -1; + + local1 = Random() % local1; + for (i = 0; i < 33; i++) + { + if (sub_80EB868(i)) + { + if (local1 == 0) + return (i & 0x1FF) | 0x2800; + local1--; + } + } + + return -1; +} + +u8 sub_80EB9C8(void) +{ + return IsNationalPokedexEnabled(); +} + +static u16 sub_80EB9D8(void) +{ + u16 *speciesList; + u16 local1; + u16 i; + + local1 = sub_80EAE88(0); + + if (local1 == 0) + return -1; + + local1 = Random() % local1; + speciesList = (u16 *)gEasyChatGroupWords[EC_GROUP_POKEMON_1]; + for (i = 0; i < gEasyChatGroupSizes[EC_GROUP_POKEMON_1]; i++) + { + const u16 dexNum = SpeciesToNationalPokedexNum(*speciesList); + const u8 local2 = GetSetPokedexFlag(dexNum, 0); + + if (local2) + { + if (local1 == 0) + return *speciesList & 0x1FF; + local1--; + } + speciesList++; + } + return -1; +} diff --git a/src/engine/cable_car_util.c b/src/engine/cable_car_util.c new file mode 100644 index 000000000..02bfbc195 --- /dev/null +++ b/src/engine/cable_car_util.c @@ -0,0 +1,47 @@ +#include "global.h" +#include "cable_car_util.h" + +// static types + +// static declarations + +// rodata + +// text + +void CableCarUtil_FillWrapped(void *dest, u16 value, u8 left, u8 top, u8 width, u8 height) +{ + u8 i; + u8 j; + u8 x; + u8 y; + + for (i = 0, y = top; i < height; i++) + { + for (x = left, j = 0; j < width; j++) + { + *(u16 *)&((u8 *)dest)[y * 64 + x * 2] = value; + x = (x + 1) % 32; + } + y = (y + 1) % 32; + } +} + +void CableCarUtil_CopyWrapped(void *dest, const u16 *src, u8 left, u8 top, u8 width, u8 height) +{ + u8 i; + u8 j; + u8 x; + u8 y; + const u16 *_src; + + for (i = 0, _src = src, y = top; i < height; i++) + { + for (x = left, j = 0; j < width; j++) + { + *(u16 *)&((u8 *)dest)[y * 64 + x * 2] = *_src++; + x = (x + 1) % 32; + } + y = (y + 1) % 32; + } +} diff --git a/src/engine/cable_club.c b/src/engine/cable_club.c index 3187de7ed..ff73e638e 100644 --- a/src/engine/cable_club.c +++ b/src/engine/cable_club.c @@ -23,6 +23,7 @@ #include "text.h" #include "trainer_card.h" +extern u8 unk_2030220; extern u16 gSpecialVar_Result; extern struct TrainerCard gTrainerCards[4]; extern u8 gUnknown_03004860; @@ -41,7 +42,7 @@ extern struct u8 field1; } gUnknown_020297D8; -static void sub_8082F20(u8 taskId); +/*static*/ void sub_8082F20(u8 taskId); static void sub_8082F68(u8 taskId); static void sub_8082FEC(u8 taskId); static void sub_808303C(u8 taskId); @@ -95,6 +96,382 @@ const u8 *const gTrainerCardColorNames[] = TrainerCardColorName_Gold, }; +#if DEBUG + +__attribute__((naked)) +int debug_sub_808A4D0() +{ + asm("\ + push {lr}\n\ + add r1, r0, #0\n\ + ldr r0, ._3 @ sub_8082F68\n\ + cmp r1, r0\n\ + bne ._1 @cond_branch\n\ + mov r0, #0x1\n\ + b ._30\n\ +._4:\n\ + .align 2, 0\n\ +._3:\n\ + .word sub_8082F68+1\n\ +._1:\n\ + ldr r0, ._7 @ sub_8082FEC\n\ + cmp r1, r0\n\ + bne ._5 @cond_branch\n\ + mov r0, #0x11\n\ + b ._30\n\ +._8:\n\ + .align 2, 0\n\ +._7:\n\ + .word sub_8082FEC+1\n\ +._5:\n\ + ldr r0, ._11 @ sub_808303C\n\ + cmp r1, r0\n\ + bne ._9 @cond_branch\n\ + mov r0, #0x12\n\ + b ._30\n\ +._12:\n\ + .align 2, 0\n\ +._11:\n\ + .word sub_808303C+1\n\ +._9:\n\ + ldr r0, ._15 @ sub_8083188\n\ + cmp r1, r0\n\ + bne ._13 @cond_branch\n\ + mov r0, #0x13\n\ + b ._30\n\ +._16:\n\ + .align 2, 0\n\ +._15:\n\ + .word sub_8083188+1\n\ +._13:\n\ + ldr r0, ._19 @ sub_80830E4\n\ + cmp r1, r0\n\ + bne ._17 @cond_branch\n\ + mov r0, #0x14\n\ + b ._30\n\ +._20:\n\ + .align 2, 0\n\ +._19:\n\ + .word sub_80830E4+1\n\ +._17:\n\ + ldr r0, ._23 @ sub_80831F8\n\ + cmp r1, r0\n\ + bne ._21 @cond_branch\n\ + mov r0, #0x21\n\ + b ._30\n\ +._24:\n\ + .align 2, 0\n\ +._23:\n\ + .word sub_80831F8+1\n\ +._21:\n\ + ldr r0, ._27 @ sub_8083314\n\ + cmp r1, r0\n\ + bne ._25 @cond_branch\n\ + mov r0, #0x2\n\ + b ._30\n\ +._28:\n\ + .align 2, 0\n\ +._27:\n\ + .word sub_8083314+1\n\ +._25:\n\ + ldr r0, ._31 @ sub_80833C4\n\ + cmp r1, r0\n\ + beq ._29 @cond_branch\n\ + mov r0, #0x0\n\ + b ._30\n\ +._32:\n\ + .align 2, 0\n\ +._31:\n\ + .word sub_80833C4+1\n\ +._29:\n\ + mov r0, #0x3\n\ +._30:\n\ + pop {r1}\n\ + bx r1"); +} + +__attribute__((naked)) +void debug_sub_808A55C() +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + lsl r0, r0, #0x18\n\ + lsr r7, r0, #0x18\n\ + ldr r2, ._37 @ gTasks\n\ + lsl r0, r7, #0x2\n\ + add r0, r0, r7\n\ + lsl r0, r0, #0x3\n\ + add r4, r0, r2\n\ + mov r0, #0x8\n\ + ldsh r1, [r4, r0]\n\ + lsl r0, r1, #0x2\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x3\n\ + add r0, r0, r2\n\ + ldrb r0, [r0, #0x4]\n\ + cmp r0, #0\n\ + bne ._33 @cond_branch\n\ + mov r1, #0xa\n\ + ldsh r0, [r4, r1]\n\ + cmp r0, #0x5\n\ + bne ._34 @cond_branch\n\ + add r0, r7, #0\n\ + bl DestroyTask\n\ +._34:\n\ + ldrh r0, [r4, #0xa]\n\ + add r0, r0, #0x1\n\ + strh r0, [r4, #0xa]\n\ +._33:\n\ + ldr r0, ._37 + 4 @ gShouldAdvanceLinkState\n\ + ldrb r0, [r0]\n\ + mov r1, #0x2\n\ + mov r2, #0x0\n\ + mov r3, #0x2\n\ + bl PrintHex\n\ + ldr r0, ._37 + 8 @ gBlockSendBuffer\n\ + ldrb r0, [r0]\n\ + mov r1, #0x16\n\ + mov r2, #0x5\n\ + mov r3, #0x4\n\ + bl PrintHex\n\ + mov r4, #0x0\n\ + lsl r3, r7, #0x2\n\ + mov r8, r3\n\ + mov r6, #0xc0\n\ + lsl r6, r6, #0x13\n\ + mov r5, #0xa0\n\ + lsl r5, r5, #0x13\n\ +._35:\n\ + ldr r0, ._37 + 12 @ gLinkPlayerPending\n\ + add r0, r4, r0\n\ + ldrb r0, [r0]\n\ + lsr r1, r5, #0x18\n\ + mov r2, #0x0\n\ + mov r3, #0x1\n\ + bl PrintHex\n\ + ldr r1, ._37 + 16 @ gBlockRecvBuffer\n\ + lsl r0, r4, #0x8\n\ + add r0, r0, r1\n\ + ldrh r0, [r0]\n\ + lsr r2, r6, #0x18\n\ + mov r1, #0x16\n\ + mov r3, #0x4\n\ + bl PrintHex\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x11\n\ + add r6, r6, r0\n\ + mov r1, #0x80\n\ + lsl r1, r1, #0x12\n\ + add r5, r5, r1\n\ + add r4, r4, #0x1\n\ + cmp r4, #0x3\n\ + ble ._35 @cond_branch\n\ + ldr r4, ._37 + 20 @ gLinkStatus\n\ + ldr r0, [r4]\n\ + mov r1, #0xf\n\ + mov r2, #0x0\n\ + mov r3, #0x8\n\ + bl PrintHex\n\ + ldr r0, ._37 + 24 @ gLink\n\ + ldrb r0, [r0, #0x1]\n\ + mov r1, #0x2\n\ + mov r2, #0xa\n\ + mov r3, #0x2\n\ + bl PrintHex\n\ + bl GetMultiplayerId\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r1, #0x7\n\ + mov r2, #0xc\n\ + mov r3, #0x2\n\ + bl PrintHex\n\ + bl GetBlockReceivedStatus\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r1, #0x7\n\ + mov r2, #0xa\n\ + mov r3, #0x2\n\ + bl PrintHex\n\ + ldr r0, ._37 + 28 @ gReceivedRemoteLinkPlayers\n\ + ldrb r0, [r0]\n\ + mov r1, #0x2\n\ + mov r2, #0xc\n\ + mov r3, #0x1\n\ + bl PrintHex\n\ + ldr r0, ._37 + 32 @ gSpecialVar_Result\n\ + ldrh r0, [r0]\n\ + mov r1, #0xb\n\ + mov r2, #0x8\n\ + mov r3, #0x2\n\ + bl PrintHex\n\ + ldr r0, [r4]\n\ + mov r1, #0x1c\n\ + and r0, r0, r1\n\ + lsr r0, r0, #0x2\n\ + mov r1, #0xb\n\ + mov r2, #0xa\n\ + mov r3, #0x2\n\ + bl PrintHex\n\ + bl IsLinkConnectionEstablished\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r1, #0xb\n\ + mov r2, #0xc\n\ + mov r3, #0x1\n\ + bl PrintHex\n\ + bl IsLinkTaskFinished\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r1, #0xf\n\ + mov r2, #0xa\n\ + mov r3, #0x1\n\ + bl PrintHex\n\ + ldr r2, ._37 @ gTasks\n\ + mov r3, r8\n\ + add r0, r3, r7\n\ + lsl r0, r0, #0x3\n\ + add r0, r0, r2\n\ + mov r3, #0x8\n\ + ldsh r1, [r0, r3]\n\ + lsl r0, r1, #0x2\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x3\n\ + add r0, r0, r2\n\ + ldr r0, [r0]\n\ + bl debug_sub_808A4D0\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r1, #0xf\n\ + mov r2, #0xc\n\ + mov r3, #0x2\n\ + bl PrintHex\n\ + ldr r0, ._37 + 36 @ gLinkCallback\n\ + ldr r0, [r0]\n\ + mov r1, #0x2\n\ + mov r2, #0xd\n\ + mov r3, #0x8\n\ + bl PrintHex\n\ + bl HasLinkErrorOccurred\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r1, #0x2\n\ + mov r2, #0x2\n\ + mov r3, #0x1\n\ + bl PrintHex\n\ + ldr r0, ._37 + 40 @ gLinkPlayers\n\ + mov r6, #0x80\n\ + lsl r6, r6, #0x12\n\ + add r5, r0, #0\n\ + add r5, r5, #0x14\n\ + mov r4, #0x3\n\ +._36:\n\ + ldr r0, [r5]\n\ + lsr r1, r6, #0x18\n\ + mov r2, #0x3\n\ + mov r3, #0x4\n\ + bl PrintHex\n\ + mov r0, #0xc0\n\ + lsl r0, r0, #0x13\n\ + add r6, r6, r0\n\ + add r5, r5, #0x1c\n\ + sub r4, r4, #0x1\n\ + cmp r4, #0\n\ + bge ._36 @cond_branch\n\ + ldr r0, ._37 + 44 @ 0x4000128\n\ + ldrh r0, [r0]\n\ + mov r1, #0x2\n\ + mov r2, #0x6\n\ + mov r3, #0x4\n\ + bl PrintHex\n\ + bl debug_sub_808B850\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r1, #0x19\n\ + mov r2, #0x3\n\ + mov r3, #0x1\n\ + bl PrintHex\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._38:\n\ + .align 2, 0\n\ +._37:\n\ + .word gTasks\n\ + .word gShouldAdvanceLinkState\n\ + .word gBlockSendBuffer\n\ + .word gLinkPlayerPending\n\ + .word gBlockRecvBuffer\n\ + .word gLinkStatus\n\ + .word gLink\n\ + .word gReceivedRemoteLinkPlayers\n\ + .word gSpecialVar_Result\n\ + .word gLinkCallback\n\ + .word gLinkPlayers\n\ + .word 0x4000128"); +} +#endif + +#if DEBUG +__attribute__((naked)) +static void sub_8082CD4(u8 arg0, u8 arg1) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + lsl r0, r0, #0x18\n\ + lsr r7, r0, #0x18\n\ + lsl r1, r1, #0x18\n\ + lsr r6, r1, #0x18\n\ + mov r0, #0xc\n\ + mov r1, #0x0\n\ + mov r2, #0x1f\n\ + mov r3, #0x2\n\ + bl InitLinkTestBG_Unused\n\ + ldr r4, ._40 @ sub_8082F20\n\ + add r0, r4, #0\n\ + bl FindTaskIdByFunc\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0xff\n\ + bne ._39 @cond_branch\n\ + add r0, r4, #0\n\ + mov r1, #0x50\n\ + bl CreateTask\n\ + add r4, r0, #0\n\ + lsl r4, r4, #0x18\n\ + lsr r4, r4, #0x18\n\ + ldr r5, ._40 + 4 @ gTasks\n\ + lsl r0, r4, #0x2\n\ + add r0, r0, r4\n\ + lsl r0, r0, #0x3\n\ + add r0, r0, r5\n\ + strh r7, [r0, #0xa]\n\ + strh r6, [r0, #0xc]\n\ + ldr r0, ._40 + 8 @ debug_sub_808A55C\n\ + mov r1, #0x50\n\ + bl CreateTask\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + lsl r1, r0, #0x2\n\ + add r1, r1, r0\n\ + lsl r1, r1, #0x3\n\ + add r1, r1, r5\n\ + strh r4, [r1, #0x8]\n\ +._39:\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._41:\n\ + .align 2, 0\n\ +._40:\n\ + .word sub_8082F20+1\n\ + .word gTasks\n\ + .word debug_sub_808A55C+1"); +} +#else static void sub_8082CD4(u8 arg0, u8 arg1) { if (FindTaskIdByFunc(sub_8082F20) == 0xFF) @@ -105,17 +482,18 @@ static void sub_8082CD4(u8 arg0, u8 arg1) gTasks[taskId].data[2] = arg1; } } +#endif static void sub_8082D18(u32 value) { ConvertIntToDecimalStringN(gStringVar1, value, STR_CONV_MODE_LEFT_ALIGN, 1); - MenuDrawTextWindow(18, 10, 28, 13); + Menu_DrawStdWindowFrame(18, 10, 28, 13); sub_8072BD8(gOtherText_PLink, 19, 11, 72); } static void sub_8082D4C() { - MenuZeroFillWindowRect(18, 10, 28, 13); + Menu_EraseWindowRect(18, 10, 28, 13); } static void sub_8082D60(u8 taskId, u8 arg1) @@ -207,7 +585,7 @@ void unref_sub_8082EEC(u8 taskId) } } -static void sub_8082F20(u8 taskId) +/*static*/ void sub_8082F20(u8 taskId) { s16 *data = gTasks[taskId].data; @@ -360,6 +738,10 @@ void sub_80831F8(u8 taskId) || sub_8082DF4(taskId) == TRUE) return; +#if DEBUG + sub_8082D60(taskId, GetLinkPlayerCount_2()); +#endif + gSpecialVar_Result = sub_8082D9C(local1, local2); if (gSpecialVar_Result == 0) return; @@ -374,7 +756,7 @@ void sub_80831F8(u8 taskId) gFieldLinkPlayerCount = GetLinkPlayerCount_2(); gUnknown_03004860 = GetMultiplayerId(); sub_80081C8(gFieldLinkPlayerCount); - sub_8093390((struct TrainerCard *)gBlockSendBuffer); + TrainerCard_GenerateCardForPlayer((struct TrainerCard *)gBlockSendBuffer); gTasks[taskId].func = sub_8083314; } } @@ -395,7 +777,7 @@ static void sub_8083288(u8 taskId) gFieldLinkPlayerCount = GetLinkPlayerCount_2(); gUnknown_03004860 = GetMultiplayerId(); sub_80081C8(gFieldLinkPlayerCount); - sub_8093390((struct TrainerCard *)gBlockSendBuffer); + TrainerCard_GenerateCardForPlayer((struct TrainerCard *)gBlockSendBuffer); gTasks[taskId].func = sub_8083314; sub_8007E9C(2); } @@ -676,7 +1058,7 @@ static void sub_808382C(u8 taskId) switch (task->data[0]) { case 0: - fade_screen(1, 0); + FadeScreen(1, 0); gLinkType = 0x2211; ClearLinkCallback_2(); task->data[0]++; @@ -790,7 +1172,7 @@ static void sub_80839DC(u8 taskId) case 3: sub_8055588(); HideFieldMessageBox(); - MenuZeroFillScreen(); + Menu_EraseScreen(); DestroyTask(taskId); EnableBothScriptContexts(); break; @@ -812,7 +1194,7 @@ static void sub_8083AAC(u8 taskId) { case 0: ScriptContext2_Enable(); - fade_screen(1, 0); + FadeScreen(1, 0); ClearLinkCallback_2(); task->data[0]++; break; @@ -874,7 +1256,7 @@ void unref_sub_8083BB0(void) void sub_8083BDC(void) { - sub_8093130(gSpecialVar_0x8006, c2_exit_to_overworld_1_continue_scripts_restart_music); + TrainerCard_ShowLinkCard(gSpecialVar_0x8006, c2_exit_to_overworld_1_continue_scripts_restart_music); } bool32 sub_8083BF4(u8 linkPlayerIndex) @@ -908,6 +1290,74 @@ void sub_8083C50(u8 taskId) DestroyTask(taskId); } +#if DEBUG + +__attribute__((naked)) +void debug_sub_808B778() +{ + asm("\ + push {r4, lr}\n\ + ldr r4, ._390 @ debug_sub_808B7A8\n\ + add r0, r4, #0\n\ + bl FuncIsActiveTask\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._389 @cond_branch\n\ + add r0, r4, #0\n\ + mov r1, #0x50\n\ + bl CreateTask\n\ +._389:\n\ + ldr r1, ._390 + 4 @ unk_3004E98\n\ + ldr r0, [r1]\n\ + add r0, r0, #0x1\n\ + str r0, [r1]\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ +._391:\n\ + .align 2, 0\n\ +._390:\n\ + .word debug_sub_808B7A8+1\n\ + .word unk_3004E98"); +} + +__attribute__((naked)) +void debug_sub_808B7A8() +{ + asm("\ + push {lr}\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + ldr r2, ._393 @ gTasks\n\ + lsl r1, r0, #0x2\n\ + add r1, r1, r0\n\ + lsl r1, r1, #0x3\n\ + add r1, r1, r2\n\ + ldrh r0, [r1, #0x8]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1, #0x8]\n\ + lsl r0, r0, #0x10\n\ + asr r0, r0, #0x10\n\ + cmp r0, #0x1e\n\ + bne ._392 @cond_branch\n\ + mov r0, #0x0\n\ + strh r0, [r1, #0x8]\n\ + ldr r2, ._393 + 4 @ unk_3004E94\n\ + ldrh r0, [r2]\n\ + mov r1, #0x1\n\ + orr r0, r0, r1\n\ + strh r0, [r2]\n\ +._392:\n\ + pop {r0}\n\ + bx r0\n\ +._394:\n\ + .align 2, 0\n\ +._393:\n\ + .word gTasks\n\ + .word unk_3004E94"); +} +#endif + static void sub_8083CA4(u8 taskId) { if (!gReceivedRemoteLinkPlayers) @@ -921,4 +1371,23 @@ void unref_sub_8083CC8(u8 taskId) { sub_800832C(); gTasks[taskId].func = sub_8083CA4; -}
\ No newline at end of file +} + +#if DEBUG + +void debug_sub_808B82C(void) +{ + unk_2030220 = 0; +} + +void debug_sub_808B838(u8 a) +{ + unk_2030220 |= 1 << a; +} + +int debug_sub_808B850(void) +{ + return unk_2030220; +} + +#endif
\ No newline at end of file diff --git a/src/engine/clear_save_data_menu.c b/src/engine/clear_save_data_menu.c index 12cde22a7..b6053715a 100644 --- a/src/engine/clear_save_data_menu.c +++ b/src/engine/clear_save_data_menu.c @@ -41,11 +41,11 @@ static void Task_InitMenu(u8 taskId) REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; SetVBlankCallback(VBlankCB_ClearSaveDataScreen); - MenuDrawTextWindow(2, 14, 27, 19); - MenuPrint(gSystemText_ClearAllSaveDataPrompt, 3, 15); + Menu_DrawStdWindowFrame(2, 14, 27, 19); + Menu_PrintText(gSystemText_ClearAllSaveDataPrompt, 3, 15); - MenuDrawTextWindow(2, 1, 8, 6); - PrintMenuItems(3, 2, 2, gMenuYesNoItems); + Menu_DrawStdWindowFrame(2, 1, 8, 6); + Menu_PrintItems(3, 2, 2, gMenuYesNoItems); InitMenu(0, 3, 2, 2, 1, 5); gTasks[taskId].func = Task_ProcessMenuInput; @@ -53,7 +53,7 @@ static void Task_InitMenu(u8 taskId) static void Task_ProcessMenuInput(u8 taskId) { - switch (ProcessMenuInputNoWrap_()) + switch (Menu_ProcessInputNoWrap_()) { case 0: PlaySE(SE_SELECT); @@ -73,7 +73,7 @@ static void Task_ProcessMenuInput(u8 taskId) static void Task_ClearSaveData(u8 taskId) { - ClearSaveData(); + Save_EraseAllData(); DestroyTask(taskId); SetMainCallback2(CB2_SoftReset); } @@ -133,8 +133,8 @@ static u8 InitClearSaveDataScreen(void) ResetTasks(); ResetSpriteData(); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow(&gWindowTemplate_81E6CE4); BeginNormalPaletteFade(-1, 0, 0x10, 0, 0xffff); ime = REG_IME; diff --git a/src/engine/clock.c b/src/engine/clock.c index 416aaa6bb..fceccdfcb 100644 --- a/src/engine/clock.c +++ b/src/engine/clock.c @@ -13,12 +13,11 @@ #include "tv.h" #include "wallclock.h" -static void InitTimeBasedEvents(void); static void UpdatePerDay(struct Time *time); static void UpdatePerMinute(struct Time *time); static void ReturnFromStartWallClock(void); -static void InitTimeBasedEvents(void) +void InitTimeBasedEvents(void) { FlagSet(FLAG_SYS_CLOCK_SET); RtcCalcLocalTime(); diff --git a/src/engine/link.c b/src/engine/link.c index 28323207c..00c084069 100644 --- a/src/engine/link.c +++ b/src/engine/link.c @@ -1,4 +1,5 @@ #include "global.h" +#include "cable_club.h" #include "link.h" #include "battle.h" #include "berry.h" @@ -12,6 +13,7 @@ #include "constants/songs.h" #include "sound.h" #include "sprite.h" +#include "string_util.h" #include "strings2.h" #include "task.h" #include "text.h" @@ -66,7 +68,7 @@ u32 sub_8007E40(void); static void SetBlockReceivedFlag(u8); static u16 LinkTestCalcBlockChecksum(void *, u16); static void PrintHexDigit(u8, u8, u8); -static void PrintHex(u32, u8, u8, u8); +void PrintHex(u32, u8, u8, u8); static void LinkCB_RequestPlayerDataExchange(void); static void Task_PrintTestData(u8); bool8 sub_8008224(void); @@ -79,7 +81,7 @@ static void sub_80084C8(void); static void sub_80084F4(void); static void CheckErrorStatus(void); -static void CB2_PrintErrorMessage(void); +void CB2_PrintErrorMessage(void); static u8 IsSioMultiMaster(void); static void DisableSerial(void); static void EnableSerial(void); @@ -145,6 +147,9 @@ void (*gLinkCallback)(void); struct LinkPlayer gSavedLinkPlayers[MAX_LINK_PLAYERS]; u8 gShouldAdvanceLinkState; u16 gLinkTestBlockChecksums[MAX_LINK_PLAYERS]; +#if DEBUG +u8 gUnknown_Debug_30030E0; +#endif u8 gBlockRequestType; u8 gLastSendQueueCount; struct Link gLink; @@ -156,11 +161,11 @@ u8 deUnkValue1; u8 deUnkValue2; #endif -EWRAM_DATA bool8 gLinkTestDebugValuesEnabled = {0}; -EWRAM_DATA bool8 gLinkTestDummyBool = {0}; -EWRAM_DATA u32 gFiller_20238B8 = {0}; -EWRAM_DATA u32 dword_20238BC = {0}; -EWRAM_DATA bool8 gLinkOpen = {0}; +EWRAM_DATA bool8 gLinkTestDebugValuesEnabled = 0; +EWRAM_DATA bool8 gLinkTestDummyBool = 0; +EWRAM_DATA u32 gFiller_20238B8 = 0; +EWRAM_DATA u32 dword_20238BC = 0; +EWRAM_DATA bool8 gLinkOpen = 0; static const u16 sLinkTestDigitPalette[] = INCBIN_U16("graphics/interface/link_test_digits.gbapal"); static const u32 sLinkTestDigitTiles[] = INCBIN_U32("graphics/interface/link_test_digits.4bpp"); @@ -189,9 +194,19 @@ const struct BlockRequest sBlockRequestLookupTable[5] = static const u8 sTestString[] = _("テストな"); -ALIGNED(4) static const u8 sMagic[] = "GameFreak inc."; +// TODO: fix the alignment here + +ALIGNED(4) const u8 sMagic[] = "GameFreak inc."; -ALIGNED(4) static const u8 sEmptyString[] = _(""); +#if DEBUG +const u8 sEmptyString[] = _(" "); +#else +ALIGNED(4) const u8 sEmptyString[] = _(""); +#endif + +#if DEBUG +const u8 linkDebugFillerPleaseRemove[2] = {0}; +#endif void Task_DestroySelf(u8 taskId) { @@ -238,8 +253,8 @@ void LinkTestScreen(void) FreeAllSpritePalettes(); ResetTasks(); SetVBlankCallback(VBlankCB_LinkTest); - SetUpWindowConfig(&gWindowConfig_81E6CE4); - InitMenuWindow((struct WindowConfig *)&gWindowConfig_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow((struct WindowTemplate *)&gWindowTemplate_81E6CE4); ResetBlockSend(); gLinkType = 0x1111; OpenLink(); @@ -409,7 +424,7 @@ static void LinkTestProcessKeyInput(void) if (gMain.newKeys & START_BUTTON) SetSuppressLinkErrorMessage(TRUE); if (gMain.newKeys & R_BUTTON) - TrySavingData(LINK_SAVE); + Save_WriteData(SAVE_LINK); if (gMain.newKeys & SELECT_BUTTON) sub_800832C(); if (gLinkTestDebugValuesEnabled) @@ -543,6 +558,9 @@ static void ProcessRecvCmds(u8 unusedParam) else { SetBlockReceivedFlag(i); +#if DEBUG + debug_sub_808B838(i); +#endif } } break; @@ -898,14 +916,9 @@ bool8 sub_8007E9C(u8 a1) } } -bool8 sub_8007ECC(void) +bool8 IsLinkTaskFinished(void) { - u8 retVal = FALSE; - - if (!gLinkCallback) - retVal = TRUE; - - return retVal; + return gLinkCallback == NULL; } u8 GetBlockReceivedStatus(void) @@ -957,7 +970,7 @@ static void PrintHexDigit(u8 tileNum, u8 x, u8 y) tilemap[(32 * y) + x] = (gLinkTestBGInfo.paletteNum << 12) | (tileNum + 1); } -static void PrintHex(u32 num, u8 x, u8 y, u8 maxDigits) +void PrintHex(u32 num, u8 x, u8 y, u8 maxDigits) { u8 buffer[16]; s32 i; @@ -975,6 +988,143 @@ static void PrintHex(u32 num, u8 x, u8 y, u8 maxDigits) } } +#if DEBUG + +EWRAM_DATA u16 *debugCharacterBase = NULL; +EWRAM_DATA void *unk_20238C8 = NULL; +EWRAM_DATA u16 (*debugTileMap)[] = NULL; +EWRAM_DATA u32 unk_20238D0 = 0; + +void debug_sub_8008218(u16 *buffer, void *arg1, u16 (*arg2)[], u32 arg3) +{ + CpuSet(sLinkTestDigitTiles, buffer, 272); + debugCharacterBase = buffer; + unk_20238C8 = arg1; + debugTileMap = arg2; + unk_20238D0 = arg3; +} + +#ifdef NONMATCHING +void debug_sub_8008264(u32 value, int left, int top, int r3, int sp0) +{ + u32 buffer[8]; + u32 *ptr; + + u16 *dest; + + int i; + + if (unk_20238D0 != sp0) + return; + + r3 = max(r3, 8); + + ptr = &buffer[0]; + dest = &(*debugTileMap)[left + top * 32]; + + for (i = r3; i != 0; i--) + { + *(ptr++) = value & 0xF; + value = value >> 4; + } + + ptr = &buffer[8 - r3]; + for (i = r3; i != 0; i--) + { + int charOffset = (((uintptr_t) debugCharacterBase) - ((uintptr_t) unk_20238C8)) / 32; + *dest = *ptr + charOffset + 1; + ptr--; + dest++; + } +} +#else +__attribute__((naked)) +void debug_sub_8008264(u32 value, int left, int top, int r3, int sp0) +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " add sp, sp, #0xffffffe0\n" + " add r5, r0, #0\n" + " add r6, r1, #0\n" + " add r4, r3, #0\n" + " ldr r0, [sp, #0x38]\n" + " ldr r1, ._347 @ unk_20238D0\n" + " ldr r1, [r1]\n" + " cmp r1, r0\n" + " bne ._345 @cond_branch\n" + " cmp r4, #0x8\n" + " ble ._342 @cond_branch\n" + " mov r4, #0x8\n" + "._342:\n" + " mov r3, sp\n" + " ldr r0, ._347 + 4 @ debugTileMap\n" + " mov r8, r0\n" + " lsl r2, r2, #0x6\n" + " mov ip, r2\n" + " lsl r6, r6, #0x1\n" + " lsl r7, r4, #0x2\n" + " cmp r4, #0\n" + " ble ._343 @cond_branch\n" + " mov r1, #0xf\n" + " add r2, r4, #0\n" + "._344:\n" + " add r0, r5, #0\n" + " and r0, r0, r1\n" + " stmia r3!, {r0}\n" + " lsr r5, r5, #0x4\n" + " sub r2, r2, #0x1\n" + " cmp r2, #0\n" + " bne ._344 @cond_branch\n" + "._343:\n" + " mov r1, r8\n" + " ldr r0, [r1]\n" + " add r0, r0, ip\n" + " add r5, r0, r6\n" + " mov r1, sp\n" + " add r0, r1, r7\n" + " sub r3, r0, #4\n" + " cmp r4, #0\n" + " ble ._345 @cond_branch\n" + " ldr r7, ._347 + 8 @ debugCharacterBase\n" + " ldr r6, ._347 + 12 @ unk_20238C8\n" + " add r2, r4, #0\n" + "._346:\n" + " ldr r1, [r7]\n" + " ldr r0, [r6]\n" + " sub r1, r1, r0\n" + " lsr r1, r1, #0x5\n" + " ldr r0, [r3]\n" + " add r0, r0, r1\n" + " add r0, r0, #0x1\n" + " strh r0, [r5]\n" + " sub r3, r3, #0x4\n" + " add r5, r5, #0x2\n" + " sub r2, r2, #0x1\n" + " cmp r2, #0\n" + " bne ._346 @cond_branch\n" + "._345:\n" + " add sp, sp, #0x20\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._348:\n" + " .align 2, 0\n" + "._347:\n" + " .word unk_20238D0\n" + " .word debugTileMap\n" + " .word debugCharacterBase\n" + " .word unk_20238C8\n" + "\n" + ); +} +#endif + +#endif + static void LinkCB_RequestPlayerDataExchange(void) { // Only one request needs to be sent, so only the master sends it. @@ -1236,9 +1386,9 @@ void CB2_LinkError(void) FillPalette(0, 0, 2); ResetTasks(); SetVBlankCallback(VBlankCB_LinkTest); - SetUpWindowConfig(&gWindowConfig_81E7198); - InitMenuWindow((struct WindowConfig *)&gWindowConfig_81E7198); - MenuZeroFillScreen(); + Text_LoadWindowTemplate(&gWindowTemplate_81E7198); + InitMenuWindow((struct WindowTemplate *)&gWindowTemplate_81E7198); + Menu_EraseScreen(); REG_BLDALPHA = 0; REG_BG0VOFS = 0; REG_BG0HOFS = 0; @@ -1253,14 +1403,33 @@ void CB2_LinkError(void) SetMainCallback2(CB2_PrintErrorMessage); } -static void CB2_PrintErrorMessage(void) +void CB2_PrintErrorMessage(void) { - u8 array[64] __attribute__((unused)); // unused + u8 array[32] __attribute__((unused)); // unused + u8 array2[32] __attribute__((unused)); // unused switch (gMain.state) { case 0: - MenuPrint_PixelCoords(gMultiText_LinkError, 20, 56, 1); + Menu_PrintTextPixelCoords(gMultiText_LinkError, 20, 56, 1); +#if DEBUG + StringCopy(array, sColorCodes); + + ConvertIntToHexStringN(array2, sErrorLinkStatus, STR_CONV_MODE_LEADING_ZEROS, 8); + StringAppend(array, array2); + + StringAppend(array, sEmptyString); + + ConvertIntToHexStringN(array2, sErrorLastSendQueueCount, STR_CONV_MODE_LEADING_ZEROS, 2); + StringAppend(array, array2); + + StringAppend(array, sEmptyString); + + ConvertIntToHexStringN(array2, sErrorLastRecvQueueCount, STR_CONV_MODE_LEADING_ZEROS, 2); + StringAppend(array, array2); + + Menu_PrintText(array, 2, 15); +#endif break; case 30: case 60: diff --git a/src/engine/main.c b/src/engine/main.c index 82a5fffb4..54a443e80 100644 --- a/src/engine/main.c +++ b/src/engine/main.c @@ -13,7 +13,7 @@ #include "rtc.h" #include "siirtc.h" #include "sound.h" -#include "unknown_task.h" +#include "scanline_effect.h" extern struct SoundInfo gSoundInfo; extern u32 IntrMain[]; @@ -83,6 +83,10 @@ static void WaitForVBlank(void); #define B_START_SELECT (B_BUTTON | START_BUTTON | SELECT_BUTTON) +#ifndef NDEBUG + #include <stdlib.h> // don't include if not needed. +#endif + void AgbMain() { RegisterRamReset(RESET_ALL); @@ -98,6 +102,14 @@ void AgbMain() gSoftResetDisabled = FALSE; +// In Fire Red, AGBPrintInit is called at this spot. For user convenience, I +// opt to initialize the print area here. It is up to the user where they choose +// to print stuff from, as anything else declared is NOT authoritative. +#ifndef NDEBUG + AGBPrintInit(); + __mb_cur_max = 1; // fix for AGBPrintf +#endif + if (gFlashMemoryPresent != TRUE) SetMainCallback2(NULL); @@ -350,7 +362,7 @@ void DoSoftReset(void) { REG_IME = 0; m4aSoundVSyncOff(); - remove_some_task(); + ScanlineEffect_Stop(); DmaStop(1); DmaStop(2); DmaStop(3); diff --git a/src/engine/main_menu.c b/src/engine/main_menu.c index 909b5676b..5a3f55b29 100644 --- a/src/engine/main_menu.c +++ b/src/engine/main_menu.c @@ -1,4 +1,6 @@ #include "global.h" +#include "constants/songs.h" +#include "constants/species.h" #include "main_menu.h" #include "data2.h" #include "decompress.h" @@ -13,23 +15,20 @@ #include "overworld.h" #include "rtc.h" #include "save_menu_util.h" -#include "constants/songs.h" +#include "save.h" #include "sound.h" -#include "constants/species.h" #include "string_util.h" #include "strings.h" #include "task.h" #include "text.h" #include "title_screen.h" -#include "unknown_task.h" +#include "scanline_effect.h" #include "ewram.h" -#define BirchSpeechUpdateWindowText() ((u8)MenuUpdateWindowText_OverrideLineLength(24)) +#define BirchSpeechUpdateWindowText() ((u8)Menu_UpdateWindowTextOverrideLineLength(24)) extern struct PaletteFadeControl gPaletteFade; -extern u16 gSaveFileStatus; - extern const u8 gBirchSpeech_Welcome[]; extern const u8 gBirchSpeech_ThisIsPokemon[]; extern const u8 gBirchSpeech_WorldInhabitedByPokemon[]; @@ -229,12 +228,12 @@ u32 InitMainMenu(u8 a1) ResetPaletteFade(); LoadPalette(gMainMenuPalette, 0, 32); - remove_some_task(); + ScanlineEffect_Stop(); ResetTasks(); ResetSpriteData(); FreeAllSpritePalettes(); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow((struct WindowConfig *)&gWindowConfig_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow((struct WindowTemplate *)&gWindowTemplate_81E6CE4); if (a1) BeginNormalPaletteFade(-1, 0, 0x10, 0, 0x0000); // fade to black @@ -284,24 +283,23 @@ void Task_MainMenuCheckSave(u8 taskId) switch (gSaveFileStatus) { - case 1: + case SAVE_STATUS_OK: if (IsMysteryGiftEnabled() == TRUE) gTasks[taskId].tMenuLayout = HAS_MYSTERY_GIFT; else gTasks[taskId].tMenuLayout = HAS_SAVED_GAME; - gTasks[taskId].func = Task_MainMenuCheckRtc; break; case 2: - MenuDrawTextWindow(2, 14, 27, 19); + Menu_DrawStdWindowFrame(2, 14, 27, 19); MenuPrintMessage(gSaveFileDeletedMessage, 3, 15); REG_WIN0H = WIN_RANGE(17, 223); REG_WIN0V = WIN_RANGE(113, 159); gTasks[taskId].tMenuLayout = HAS_NO_SAVED_GAME; gTasks[taskId].func = Task_MainMenuWaitForSaveErrorAck; break; - case 255: - MenuDrawTextWindow(2, 14, 27, 19); + case SAVE_STATUS_ERROR: + Menu_DrawStdWindowFrame(2, 14, 27, 19); MenuPrintMessage(gSaveFileCorruptMessage, 3, 15); REG_WIN0H = WIN_RANGE(17, 223); REG_WIN0V = WIN_RANGE(113, 159); @@ -313,13 +311,13 @@ void Task_MainMenuCheckSave(u8 taskId) else gTasks[taskId].tMenuLayout = HAS_SAVED_GAME; break; - case 0: + case SAVE_STATUS_EMPTY: default: gTasks[taskId].tMenuLayout = HAS_NO_SAVED_GAME; gTasks[taskId].func = Task_MainMenuCheckRtc; break; - case 4: - MenuDrawTextWindow(2, 14, 27, 19); + case SAVE_STATUS_NO_FLASH: + Menu_DrawStdWindowFrame(2, 14, 27, 19); MenuPrintMessage(gBoardNotInstalledMessage, 3, 15); REG_WIN0H = WIN_RANGE(17, 223); REG_WIN0V = WIN_RANGE(113, 159); @@ -331,11 +329,11 @@ void Task_MainMenuCheckSave(u8 taskId) void Task_MainMenuWaitForSaveErrorAck(u8 taskId) { - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) { if (gMain.newKeys & A_BUTTON) { - MenuZeroFillWindowRect(2, 14, 27, 19); + Menu_EraseWindowRect(2, 14, 27, 19); gTasks[taskId].func = Task_MainMenuCheckRtc; } } @@ -359,7 +357,7 @@ void Task_MainMenuCheckRtc(u8 taskId) } else { - MenuDrawTextWindow(2, 14, 27, 19); + Menu_DrawStdWindowFrame(2, 14, 27, 19); MenuPrintMessage(gBatteryDryMessage, 3, 15); REG_WIN0H = WIN_RANGE(17, 223); REG_WIN0V = WIN_RANGE(113, 159); @@ -370,11 +368,11 @@ void Task_MainMenuCheckRtc(u8 taskId) void Task_MainMenuWaitForRtcErrorAck(u8 taskId) { - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) { if ( gMain.newKeys & 1 ) { - MenuZeroFillWindowRect(2, 14, 27, 19); + Menu_EraseWindowRect(2, 14, 27, 19); gTasks[taskId].func = Task_MainMenuDraw; } } @@ -412,28 +410,28 @@ void Task_MainMenuDraw(u8 taskId) { case HAS_NO_SAVED_GAME: default: - MenuDrawTextWindow(1, 0, 28, 3); + Menu_DrawStdWindowFrame(1, 0, 28, 3); PrintMainMenuItem(gMainMenuString_NewGame, 2, 1); - MenuDrawTextWindow(1, 4, 28, 7); + Menu_DrawStdWindowFrame(1, 4, 28, 7); PrintMainMenuItem(gMainMenuString_Option, 2, 5); break; case HAS_SAVED_GAME: - MenuDrawTextWindow(1, 0, 28, 7); + Menu_DrawStdWindowFrame(1, 0, 28, 7); PrintMainMenuItem(gMainMenuString_Continue, 2, 1); - MenuDrawTextWindow(1, 8, 28, 11); + Menu_DrawStdWindowFrame(1, 8, 28, 11); PrintMainMenuItem(gMainMenuString_NewGame, 2, 9); - MenuDrawTextWindow(1, 12, 28, 15); + Menu_DrawStdWindowFrame(1, 12, 28, 15); PrintMainMenuItem(gMainMenuString_Option, 2, 13); PrintSaveFileInfo(); break; case HAS_MYSTERY_GIFT: - MenuDrawTextWindow(1, 0, 28, 7); + Menu_DrawStdWindowFrame(1, 0, 28, 7); PrintMainMenuItem(gMainMenuString_Continue, 2, 1); - MenuDrawTextWindow(1, 8, 28, 11); + Menu_DrawStdWindowFrame(1, 8, 28, 11); PrintMainMenuItem(gMainMenuString_NewGame, 2, 9); - MenuDrawTextWindow(1, 12, 28, 15); + Menu_DrawStdWindowFrame(1, 12, 28, 15); PrintMainMenuItem(gMainMenuString_MysteryEvents, 2, 13); - MenuDrawTextWindow(1, 16, 28, 19); + Menu_DrawStdWindowFrame(1, 16, 28, 19); PrintMainMenuItem(gMainMenuString_Option, 2, 0x11); PrintSaveFileInfo(); break; @@ -681,7 +679,7 @@ void PrintMainMenuItem(const u8 *text, u8 left, u8 top) buffer[29] = EOS; - MenuPrint(buffer, left, top); + Menu_PrintText(buffer, left, top); } void PrintSaveFileInfo(void) @@ -694,8 +692,8 @@ void PrintSaveFileInfo(void) void PrintPlayerName(void) { - MenuPrint(gMainMenuString_Player, 2, 3); - MenuPrint(gSaveBlock2.playerName, 9, 3); + Menu_PrintText(gMainMenuString_Player, 2, 3); + Menu_PrintText(gSaveBlock2.playerName, 9, 3); } void PrintPlayTime(void) @@ -704,15 +702,15 @@ void PrintPlayTime(void) u8 alignedPlayTime[32]; #if defined(ENGLISH) - MenuPrint(gMainMenuString_Time, 16, 3); + Menu_PrintText(gMainMenuString_Time, 16, 3); FormatPlayTime(playTime, gSaveBlock2.playTimeHours, gSaveBlock2.playTimeMinutes, 1); sub_8072C74(alignedPlayTime, playTime, 48, 1); - MenuPrint(alignedPlayTime, 22, 3); + Menu_PrintText(alignedPlayTime, 22, 3); #elif defined(GERMAN) - MenuPrint_PixelCoords(gMainMenuString_Time, 124, 24, TRUE); + Menu_PrintTextPixelCoords(gMainMenuString_Time, 124, 24, TRUE); FormatPlayTime(playTime, gSaveBlock2.playTimeHours, gSaveBlock2.playTimeMinutes, 1); sub_8072C74(alignedPlayTime, playTime, 40, 1); - MenuPrint(alignedPlayTime, 23, 3); + Menu_PrintText(alignedPlayTime, 23, 3); #endif } @@ -720,9 +718,9 @@ void PrintPokedexCount(void) { u8 buffer[16]; - MenuPrint(gMainMenuString_Pokedex, 2, 5); + Menu_PrintText(gMainMenuString_Pokedex, 2, 5); sub_8072C14(buffer, GetPokedexSeenCount(), 18, 0); - MenuPrint(buffer, 9, 5); + Menu_PrintText(buffer, 9, 5); } void PrintBadgeCount(void) @@ -730,12 +728,12 @@ void PrintBadgeCount(void) u8 buffer[16]; #if defined(ENGLISH) - MenuPrint(gMainMenuString_Badges, 16, 5); + Menu_PrintText(gMainMenuString_Badges, 16, 5); #elif defined(GERMAN) - MenuPrint_PixelCoords(gMainMenuString_Badges, 124, 40, TRUE); + Menu_PrintTextPixelCoords(gMainMenuString_Badges, 124, 40, TRUE); #endif ConvertIntToDecimalString(buffer, GetBadgeCount()); - MenuPrint_PixelCoords(buffer, 205, 40, 1); + Menu_PrintTextPixelCoords(buffer, 205, 40, 1); } #define tTrainerSpriteId data[2] @@ -750,8 +748,8 @@ void PrintBadgeCount(void) static void Task_NewGameSpeech1(u8 taskId) { - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow((struct WindowConfig *)&gWindowConfig_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow((struct WindowTemplate *)&gWindowTemplate_81E6CE4); REG_WIN0H = 0; REG_WIN0V = 0; REG_WININ = 0; @@ -763,7 +761,7 @@ static void Task_NewGameSpeech1(u8 taskId) LZ77UnCompVram(gUnknown_081E7834, (void *)(BG_VRAM + 0x3800)); LoadPalette(gUnknown_081E764C, 0, 0x40); LoadPalette(gUnknown_081E796C, 1, 0x10); - remove_some_task(); + ScanlineEffect_Stop(); ResetSpriteData(); FreeAllSpritePalettes(); AddBirchSpeechObjects(taskId); @@ -812,7 +810,7 @@ static void Task_NewGameSpeech3(u8 taskId) } else { - MenuDrawTextWindow(2, 13, 27, 18); + Menu_DrawStdWindowFrame(2, 13, 27, 18); //"Hi! Sorry to keep you waiting... //...But everyone calls me the POKEMON PROFESSOR." MenuPrintMessage(gBirchSpeech_Welcome, 3, 14); @@ -857,7 +855,7 @@ static void Task_NewGameSpeech7(u8 taskId) //Go on to next sentence after frame 95 if (gTasks[taskId].tFrameCounter > 95) { - MenuSetText(gSystemText_NewPara); + Menu_SetText(gSystemText_NewPara); gTasks[taskId].func = Task_NewGameSpeech8; } } @@ -886,7 +884,7 @@ static void Task_NewGameSpeech9(u8 taskId) { if (BirchSpeechUpdateWindowText()) { - MenuDrawTextWindow(2, 13, 27, 18); + Menu_DrawStdWindowFrame(2, 13, 27, 18); //"And you are?" MenuPrintMessage(gBirchSpeech_AndYouAre, 3, 14); gTasks[taskId].func = Task_NewGameSpeech10; @@ -962,7 +960,7 @@ static void Task_NewGameSpeech13(u8 taskId) static void Task_NewGameSpeech14(u8 taskId) { - MenuDrawTextWindow(2, 13, 27, 18); + Menu_DrawStdWindowFrame(2, 13, 27, 18); //"Are you a boy? Or are you a girl?" MenuPrintMessage(gBirchSpeech_AreYouBoyOrGirl, 3, 14); gTasks[taskId].func = Task_NewGameSpeech15; @@ -985,22 +983,22 @@ static void Task_NewGameSpeech16(u8 taskId) switch (GenderMenuProcessInput()) { case MALE: - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); PlaySE(SE_SELECT); gSaveBlock2.playerGender = MALE; - MenuZeroFillWindowRect(2, 4, 8, 9); + Menu_EraseWindowRect(2, 4, 8, 9); gTasks[taskId].func = Task_NewGameSpeech19; break; case FEMALE: - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); PlaySE(SE_SELECT); gSaveBlock2.playerGender = FEMALE; - MenuZeroFillWindowRect(2, 4, 8, 9); + Menu_EraseWindowRect(2, 4, 8, 9); gTasks[taskId].func = Task_NewGameSpeech19; break; } - cursorPos = GetMenuCursorPos(); + cursorPos = Menu_GetCursorPos(); if (cursorPos != gTasks[taskId].tGenderSelection) { @@ -1062,7 +1060,7 @@ static void Task_NewGameSpeech18(u8 taskId) static void Task_NewGameSpeech19(u8 taskId) { - MenuDrawTextWindow(2, 13, 27, 18); + Menu_DrawStdWindowFrame(2, 13, 27, 18); //"All right. What's your name?" MenuPrintMessage(gBirchSpeech_WhatsYourName, 3, 14); gTasks[taskId].func = Task_NewGameSpeech20; @@ -1088,9 +1086,9 @@ static void Task_NewGameSpeech21(u8 taskId) case 2: case 3: case 4: - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); PlaySE(SE_SELECT); - MenuZeroFillWindowRect(2, 1, 22, 12); + Menu_EraseWindowRect(2, 1, 22, 12); SetPresetPlayerName(selection); gTasks[taskId].func = Task_NewGameSpeech23; break; @@ -1100,9 +1098,9 @@ static void Task_NewGameSpeech21(u8 taskId) gTasks[taskId].func = Task_NewGameSpeech22; break; case -1: //B button - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); PlaySE(SE_SELECT); - MenuZeroFillWindowRect(2, 1, 22, 12); + Menu_EraseWindowRect(2, 1, 22, 12); gTasks[taskId].func = Task_NewGameSpeech14; //Go back to gender menu break; } @@ -1120,7 +1118,7 @@ static void Task_NewGameSpeech22(u8 taskId) static void Task_NewGameSpeech23(u8 taskId) { - MenuDrawTextWindow(2, 13, 27, 18); + Menu_DrawStdWindowFrame(2, 13, 27, 18); //"So it's (PLAYER)?" StringExpandPlaceholders(gStringVar4, gBirchSpeech_SoItsPlayer); MenuPrintMessage(gStringVar4, 3, 14); @@ -1139,11 +1137,11 @@ static void Task_NewGameSpeech24(u8 taskId) //Handle yes/no menu selection static void Task_NewGameSpeech25(u8 taskId) { - switch (ProcessMenuInputNoWrap_()) + switch (Menu_ProcessInputNoWrap_()) { case 0: //YES PlaySE(SE_SELECT); - MenuZeroFillWindowRect(2, 1, 8, 7); + Menu_EraseWindowRect(2, 1, 8, 7); gSprites[gTasks[taskId].tTrainerSpriteId].oam.objMode = ST_OAM_OBJ_BLEND; StartSpriteFadeOut(taskId, 2); StartBackgroundFadeOut(taskId, 1); @@ -1152,7 +1150,7 @@ static void Task_NewGameSpeech25(u8 taskId) case -1: //B button case 1: //NO PlaySE(SE_SELECT); - MenuZeroFillWindowRect(2, 1, 8, 7); + Menu_EraseWindowRect(2, 1, 8, 7); gTasks[taskId].func = Task_NewGameSpeech14; //Go back to gender menu break; } @@ -1197,7 +1195,7 @@ static void Task_NewGameSpeech27(u8 taskId) StartSpriteFadeIn(taskId, 2); StartBackgroundFadeIn(taskId, 1); - MenuDrawTextWindow(2, 13, 27, 18); + Menu_DrawStdWindowFrame(2, 13, 27, 18); StringExpandPlaceholders(gStringVar4, gBirchSpeech_AhOkayYouArePlayer); //"Ah, okay! You're (PLAYER) who's moving... //...I get it now!" @@ -1267,7 +1265,7 @@ static void Task_NewGameSpeech29(u8 taskId) StartSpriteFadeIn(taskId, 2); StartBackgroundFadeIn(taskId, 1); - MenuDrawTextWindow(2, 13, 27, 18); + Menu_DrawStdWindowFrame(2, 13, 27, 18); MenuPrintMessage(gBirchSpeech_AreYouReady, 3, 14); gTasks[taskId].func = Task_NewGameSpeech30; } @@ -1368,13 +1366,13 @@ void CB_ContinueNewGameSpeechPart2() gTasks[taskId].tBGhofs = -60; - remove_some_task(); + ScanlineEffect_Stop(); ResetSpriteData(); FreeAllSpritePalettes(); AddBirchSpeechObjects(taskId); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow((struct WindowConfig *)&gWindowConfig_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow((struct WindowTemplate *)&gWindowTemplate_81E6CE4); if (gSaveBlock2.playerGender != MALE) { @@ -1661,33 +1659,33 @@ static void StartBackgroundFadeIn(u8 taskId, u8 interval) static void CreateGenderMenu(u8 left, u8 top) { u8 menuLeft, menuTop; - MenuDrawTextWindow(left, top, left + 6, top + 5); + Menu_DrawStdWindowFrame(left, top, left + 6, top + 5); menuLeft = left + 1; menuTop = top + 1; - PrintMenuItems(menuLeft, menuTop, 2, gUnknown_081E79B0); + Menu_PrintItems(menuLeft, menuTop, 2, gUnknown_081E79B0); InitMenu(0, menuLeft, menuTop, 2, 0, 5); } static s8 GenderMenuProcessInput(void) { - return ProcessMenuInputNoWrap(); + return Menu_ProcessInputNoWrap(); } static void CreateNameMenu(u8 left, u8 top) { - MenuDrawTextWindow(left, top, left + 10, top + 11); + Menu_DrawStdWindowFrame(left, top, left + 10, top + 11); if (gSaveBlock2.playerGender == MALE) - PrintMenuItems(left + 1, top + 1, 5, gMalePresetNames); + Menu_PrintItems(left + 1, top + 1, 5, gMalePresetNames); else - PrintMenuItems(left + 1, top + 1, 5, gFemalePresetNames); + Menu_PrintItems(left + 1, top + 1, 5, gFemalePresetNames); InitMenu(0, left + 1, top + 1, 5, 0, 9); } static s8 NameMenuProcessInput(void) { - return ProcessMenuInput(); + return Menu_ProcessInput(); } static void SetPresetPlayerName(u8 index) diff --git a/src/engine/menu.c b/src/engine/menu.c index 10988c1d7..86e20d0eb 100644 --- a/src/engine/menu.c +++ b/src/engine/menu.c @@ -24,13 +24,14 @@ struct Menu u8 columnXCoords[8]; }; -static void MultistepInitMenuWindowInternal(const struct WindowConfig *, u16); -static void InitMenuWindowInternal(const struct WindowConfig *, u16); -static bool8 sub_80723D4(void); +static void MultistepInitMenuWindowInternal(const struct WindowTemplate *, u16); +static void InitMenuWindowInternal(const struct WindowTemplate *, u16); +static bool8 IsGridCursorMovementClamped(void); static u8 sub_8072484(u8, u8, u8, u8, u8, u8, u32); static u8 sub_80724F4(u8, u8, u8, const struct MenuAction[], u8); static void sub_8072620(u8, u8, u8, const struct MenuAction[], u8); static void sub_8072D18(u8, u8); +static void RedrawMenuCursor(u8, u8); static struct Menu gMenu; @@ -52,10 +53,10 @@ const struct MenuAction gMenuYesNoItems[] = void CloseMenu(void) { PlaySE(SE_SELECT); - MenuZeroFillScreen(); + Menu_EraseScreen(); sub_8064E2C(); ScriptContext2_Disable(); - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); } void AppendToList(u8 *list, u8 *pindex, u32 value) @@ -64,22 +65,22 @@ void AppendToList(u8 *list, u8 *pindex, u32 value) (*pindex)++; } -void InitMenuWindow(const struct WindowConfig *winConfig) +void InitMenuWindow(const struct WindowTemplate *winTemplate) { - InitMenuWindowInternal(winConfig, 1); + InitMenuWindowInternal(winTemplate, 1); } -void MultistepInitMenuWindowBegin(const struct WindowConfig *winConfig) +void MultistepInitMenuWindowBegin(const struct WindowTemplate *winTemplate) { - MultistepInitMenuWindowInternal(winConfig, 1); + MultistepInitMenuWindowInternal(winTemplate, 1); } -static void MultistepInitMenuWindowInternal(const struct WindowConfig *winConfig, u16 tileOffset) +static void MultistepInitMenuWindowInternal(const struct WindowTemplate *winTemplate, u16 tileOffset) { gMenuMultistepInitState = 0; gMenuTextTileOffset = tileOffset; gMenuWindowPtr = &gMenuWindow; - InitWindowFromConfig(&gMenuWindow, winConfig); + Text_InitWindowWithTemplate(&gMenuWindow, winTemplate); } bool32 MultistepInitMenuWindowContinue(void) @@ -97,13 +98,13 @@ bool32 MultistepInitMenuWindowContinue(void) goto fail; goto next; case 3: - gMenuTextWindowContentTileOffset = SetTextWindowBaseTileNum(gMenuTextWindowTileOffset); + gMenuTextWindowContentTileOffset = TextWindow_SetBaseTileNum(gMenuTextWindowTileOffset); next: gMenuMultistepInitState++; return 0; case 4: - LoadTextWindowGraphics(gMenuWindowPtr); - gMenuMessageBoxContentTileOffset = SetMessageBoxBaseTileNum(gMenuTextWindowContentTileOffset); + TextWindow_LoadStdFrameGraphics(gMenuWindowPtr); + gMenuMessageBoxContentTileOffset = TextWindow_SetDlgFrameBaseTileNum(gMenuTextWindowContentTileOffset); return 1; default: fail: @@ -111,73 +112,74 @@ bool32 MultistepInitMenuWindowContinue(void) } } -static void InitMenuWindowInternal(const struct WindowConfig *winConfig, u16 tileOffset) +static void InitMenuWindowInternal(const struct WindowTemplate *winTemplate, u16 tileOffset) { gMenuWindowPtr = &gMenuWindow; - InitWindowFromConfig(&gMenuWindow, winConfig); + Text_InitWindowWithTemplate(&gMenuWindow, winTemplate); gMenuTextTileOffset = tileOffset; gMenuTextWindowTileOffset = InitWindowTileData(gMenuWindowPtr, gMenuTextTileOffset); - gMenuTextWindowContentTileOffset = SetTextWindowBaseTileNum(gMenuTextWindowTileOffset); - LoadTextWindowGraphics(gMenuWindowPtr); - gMenuMessageBoxContentTileOffset = SetMessageBoxBaseTileNum(gMenuTextWindowContentTileOffset); + gMenuTextWindowContentTileOffset = TextWindow_SetBaseTileNum(gMenuTextWindowTileOffset); + TextWindow_LoadStdFrameGraphics(gMenuWindowPtr); + gMenuMessageBoxContentTileOffset = TextWindow_SetDlgFrameBaseTileNum(gMenuTextWindowContentTileOffset); } -void unref_sub_8071DA4(struct WindowConfig *winConfig, u16 tileOffset) +void unref_sub_8071DA4(struct WindowTemplate *winTemplate, u16 tileOffset) { gMenuWindowPtr = &gMenuWindow; - InitWindowFromConfig(&gMenuWindow, winConfig); + Text_InitWindowWithTemplate(&gMenuWindow, winTemplate); gMenuTextWindowTileOffset = tileOffset; - gMenuTextWindowContentTileOffset = SetTextWindowBaseTileNum(gMenuTextWindowTileOffset); - LoadTextWindowGraphics(gMenuWindowPtr); - gMenuTextTileOffset = SetMessageBoxBaseTileNum(gMenuTextWindowContentTileOffset); + gMenuTextWindowContentTileOffset = TextWindow_SetBaseTileNum(gMenuTextWindowTileOffset); + TextWindow_LoadStdFrameGraphics(gMenuWindowPtr); + gMenuTextTileOffset = TextWindow_SetDlgFrameBaseTileNum(gMenuTextWindowContentTileOffset); gMenuMessageBoxContentTileOffset = InitWindowTileData(gMenuWindowPtr, gMenuTextTileOffset); } -void MenuLoadTextWindowGraphics_OverrideFrameType(u8 frameType) +void Menu_LoadStdFrameGraphicsOverrideStyle(u8 frameType) { - LoadTextWindowGraphics_OverrideFrameType(gMenuWindowPtr, frameType); + TextWindow_LoadStdFrameGraphicsOverrideStyle(gMenuWindowPtr, frameType); } -void MenuLoadTextWindowGraphics(void) +void Menu_LoadStdFrameGraphics(void) { - LoadTextWindowGraphics(gMenuWindowPtr); + TextWindow_LoadStdFrameGraphics(gMenuWindowPtr); } -void BasicInitMenuWindow(const struct WindowConfig *winConfig) +void BasicInitMenuWindow(const struct WindowTemplate *winTemplate) { - InitWindowFromConfig(gMenuWindowPtr, winConfig); + Text_InitWindowWithTemplate(gMenuWindowPtr, winTemplate); gMenuWindowPtr->tileDataStartOffset = gMenuTextTileOffset; } -void MenuPrint(const u8 *str, u8 left, u8 top) +// Prints +void Menu_PrintText(const u8 *str, u8 left, u8 top) { - sub_8003460(gMenuWindowPtr, str, gMenuTextTileOffset, left, top); + Text_InitWindowAndPrintText(gMenuWindowPtr, str, gMenuTextTileOffset, left, top); } -void MenuZeroFillWindowRect(u8 left, u8 top, u8 right, u8 bottom) +void Menu_EraseWindowRect(u8 left, u8 top, u8 right, u8 bottom) { - ZeroFillWindowRect(gMenuWindowPtr, left, top, right, bottom); + Text_EraseWindowRect(gMenuWindowPtr, left, top, right, bottom); } -void MenuFillWindowRectWithBlankTile(u8 left, u8 top, u8 right, u8 bottom) +void Menu_BlankWindowRect(u8 left, u8 top, u8 right, u8 bottom) { - FillWindowRectWithBlankTile(gMenuWindowPtr, left, top, right, bottom); + Text_BlankWindowRect(gMenuWindowPtr, left, top, right, bottom); } -void MenuZeroFillScreen(void) +void Menu_EraseScreen(void) { - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_EraseWindowRect(0, 0, 29, 19); } -void MenuDrawTextWindow(u8 left, u8 top, u8 right, u8 bottom) +void Menu_DrawStdWindowFrame(u8 left, u8 top, u8 right, u8 bottom) { - DrawTextWindow(gMenuWindowPtr, left, top, right, bottom); + TextWindow_DrawStdFrame(gMenuWindowPtr, left, top, right, bottom); } void sub_8071F40(const u8 *str) { - MenuDrawTextWindow(2, 14, 28, 19); - MenuPrint(str, 3, 15); + Menu_DrawStdWindowFrame(2, 14, 28, 19); + Menu_PrintText(str, 3, 15); } void sub_8071F60(u8 a1, u8 a2, u8 a3) @@ -187,50 +189,50 @@ void sub_8071F60(u8 a1, u8 a2, u8 a3) u16 unref_sub_8071F98(u8 x, u8 y) { - return GetWindowTilemapEntry(gMenuWindowPtr, x, y); + return Text_GetWindowTilemapEntry(gMenuWindowPtr, x, y); } void unref_sub_8071FBC(u16 a1, u8 a2, u8 a3, u8 a4, u8 a5) { - DrawWindowRect(gMenuWindowPtr, a1, a2, a3, a4, a5); + Text_FillWindowBorder(gMenuWindowPtr, a1, a2, a3, a4, a5); } -void MenuDisplayMessageBox(void) +void Menu_DisplayDialogueFrame(void) { - DisplayMessageBox(gMenuWindowPtr); + TextWindow_DisplayDialogueFrame(gMenuWindowPtr); } void MenuPrintMessage(const u8 *str, u8 left, u8 top) { - sub_8002EB0(gMenuWindowPtr, str, gMenuTextTileOffset, left, top); + Text_InitWindow8002EB0(gMenuWindowPtr, str, gMenuTextTileOffset, left, top); } void MenuPrintMessageDefaultCoords(const u8 *str) { - sub_8002EB0(gMenuWindowPtr, str, gMenuTextTileOffset, 2, 15); + Text_InitWindow8002EB0(gMenuWindowPtr, str, gMenuTextTileOffset, 2, 15); } -void MenuSetText(const u8 *str) +void Menu_SetText(const u8 *str) { - sub_8002E90(gMenuWindowPtr, str); + Text_SetWindowText(gMenuWindowPtr, str); } -u8 MenuUpdateWindowText(void) +u8 Menu_UpdateWindowText(void) { - return sub_80035AC(gMenuWindowPtr); + return Text_UpdateWindow(gMenuWindowPtr); } u8 unref_sub_8072098(void) { - return sub_8003418(gMenuWindowPtr); + return Text_PrintWindowSimple(gMenuWindowPtr); } -void sub_80720B0(void) +void Menu_ClearWindowText(void) { - ClearWindowTextLines(gMenuWindowPtr); + Text_ClearWindow(gMenuWindowPtr); } -u8 MoveMenuCursor(s8 delta) +u8 Menu_MoveCursor(s8 delta) { s32 newPos = gMenu.cursorPos + delta; @@ -245,7 +247,7 @@ u8 MoveMenuCursor(s8 delta) return gMenu.cursorPos; } -u8 MoveMenuCursorNoWrap(s8 delta) +u8 Menu_MoveCursorNoWrap(s8 delta) { s32 newPos = gMenu.cursorPos + delta; @@ -260,45 +262,45 @@ u8 MoveMenuCursorNoWrap(s8 delta) return gMenu.cursorPos; } -u8 GetMenuCursorPos(void) +u8 Menu_GetCursorPos(void) { return gMenu.cursorPos; } -s8 ProcessMenuInput(void) +s8 Menu_ProcessInput(void) { if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); if (gMenu.menu_field_7) - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); return gMenu.cursorPos; } if (gMain.newKeys & B_BUTTON) { if (gMenu.menu_field_7) - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); return -1; } if (gMain.newKeys & DPAD_UP) { PlaySE(SE_SELECT); - MoveMenuCursor(-1); + Menu_MoveCursor(-1); return -2; } else if (gMain.newKeys & DPAD_DOWN) { PlaySE(SE_SELECT); - MoveMenuCursor(1); + Menu_MoveCursor(1); return -2; } return -2; } -s8 ProcessMenuInputNoWrap(void) +s8 Menu_ProcessInputNoWrap(void) { u8 cursorPos = gMenu.cursorPos; @@ -306,31 +308,31 @@ s8 ProcessMenuInputNoWrap(void) { PlaySE(SE_SELECT); if (gMenu.menu_field_7) - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); return gMenu.cursorPos; } if (gMain.newKeys & B_BUTTON) { if (gMenu.menu_field_7) - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); return -1; } if (gMain.newKeys & DPAD_UP) { - if (cursorPos != MoveMenuCursorNoWrap(-1)) + if (cursorPos != Menu_MoveCursorNoWrap(-1)) PlaySE(SE_SELECT); return -2; } else if (gMain.newKeys & DPAD_DOWN) { - if (cursorPos != MoveMenuCursorNoWrap(1)) + if (cursorPos != Menu_MoveCursorNoWrap(1)) PlaySE(SE_SELECT); return -2; } - MoveMenuCursorNoWrap(0); + Menu_MoveCursorNoWrap(0); return -2; } @@ -353,11 +355,12 @@ u8 MoveMenuCursor3(s8 delta) return gMenu.cursorPos; } -u8 MoveMenuCursor4(s8 delta) +static u8 MoveMenuCursorGridLayout(s8 delta) { + // Don't move cursor if it is clamped if (gMenu.cursorPos + delta <= gMenu.maxCursorPos) { - if (sub_80723D4() == TRUE) + if (IsGridCursorMovementClamped() == TRUE) return gMenu.cursorPos; } else @@ -379,22 +382,35 @@ u8 MoveMenuCursor4(s8 delta) return gMenu.cursorPos; } -static bool8 sub_80723D4(void) +// Returns TRUE if the cursor is on an edge and cannot move in the pressed direction +static bool8 IsGridCursorMovementClamped(void) { - if ((gMain.newKeys & DPAD_UP) && gMenu.cursorPos < gMenu.width) - return TRUE; - - if ((gMain.newKeys & DPAD_DOWN) && gMenu.cursorPos >= (gMenu.maxCursorPos + 1) - gMenu.width) - return TRUE; - - if ((gMain.newKeys & DPAD_LEFT) - && ((gMenu.cursorPos - (gMenu.cursorPos % gMenu.width)) % gMenu.width == 1 // always false - || gMenu.cursorPos == 0 - || gMenu.cursorPos % gMenu.width == 0)) - return TRUE; - - if ((gMain.newKeys & DPAD_RIGHT) && gMenu.cursorPos % gMenu.width == gMenu.width - 1) - return TRUE; + if (gMain.newKeys & DPAD_UP) + { + // is cursor on first row? + if (gMenu.cursorPos < gMenu.width) + return TRUE; + } + if (gMain.newKeys & DPAD_DOWN) + { + // is cursor on last row? + if (gMenu.cursorPos >= gMenu.maxCursorPos + 1 - gMenu.width) + return TRUE; + } + if (gMain.newKeys & DPAD_LEFT) + { + // is cursor on first column? + if ((gMenu.cursorPos - gMenu.cursorPos % gMenu.width) % gMenu.width == 1 // always false + || gMenu.cursorPos == 0 // redundant + || gMenu.cursorPos % gMenu.width == 0) + return TRUE; + } + if (gMain.newKeys & DPAD_RIGHT) + { + // is cursor on last column? + if (gMenu.cursorPos % gMenu.width == gMenu.width - 1) + return TRUE; + } return FALSE; } @@ -465,7 +481,7 @@ static u8 sub_80724F4(u8 left, u8 top, u8 menuItemCount, const struct MenuAction totalWidth = (gMenu.columnXCoords[columnCount] + 1); right = left + totalWidth; - MenuDrawTextWindow(left, top, right, bottom); + Menu_DrawStdWindowFrame(left, top, right, bottom); } return maxWidth; @@ -501,7 +517,7 @@ static void sub_8072620(u8 left, u8 top, u8 menuItemCount, const struct MenuActi u8 row = 0; u8 j; for (j = 0; i + j < menuItemCount; j += columnCount, row++) - MenuPrint(menuItems[i + j].text, left + gMenu.columnXCoords[i % columnCount], top + 2 * row); + Menu_PrintText(menuItems[i + j].text, left + gMenu.columnXCoords[i % columnCount], top + 2 * row); } } @@ -513,93 +529,95 @@ void sub_807274C(u8 left, u8 top, u8 menuItemCount, u8 a4, const struct MenuActi sub_8072620(left + 1, top + 1, menuItemCount, menuItems, columnCount); } -s8 sub_80727CC(void) +s8 Menu_ProcessInputGridLayout(void) { if (gMain.newKeys & A_BUTTON) { if (gMenu.menu_field_7) - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); PlaySE(SE_SELECT); - return GetMenuCursorPos(); + return Menu_GetCursorPos(); } if (gMain.newKeys & B_BUTTON) { if (gMenu.menu_field_7) - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); return -1; } if (gMain.newKeys & DPAD_UP) { PlaySE(SE_SELECT); - MoveMenuCursor4(-gMenu.width); + // Move up one whole row + MoveMenuCursorGridLayout(-gMenu.width); return -2; } else if (gMain.newKeys & DPAD_DOWN) { PlaySE(SE_SELECT); - MoveMenuCursor4(gMenu.width); + // Move down one whole column + MoveMenuCursorGridLayout(gMenu.width); return -2; } else if (gMain.newKeys & DPAD_LEFT) { PlaySE(SE_SELECT); - MoveMenuCursor4(-1); + MoveMenuCursorGridLayout(-1); return -2; } else if (gMain.newKeys & DPAD_RIGHT) { PlaySE(SE_SELECT); - MoveMenuCursor4(1); + MoveMenuCursorGridLayout(1); return -2; } return -2; } -u8 sub_807288C(u8 column) +u8 Menu_GetColumnXCoord(u8 column) { return gMenu.columnXCoords[column]; } -void PrintMenuItems(u8 left, u8 top, u8 menuItemCount, const struct MenuAction menuItems[]) +void Menu_PrintItems(u8 left, u8 top, u8 menuItemCount, const struct MenuAction menuItems[]) { u8 i; for (i = 0; i < menuItemCount; i++) - MenuPrint(menuItems[i].text, left, top + 2 * i); + Menu_PrintText(menuItems[i].text, left, top + 2 * i); } -void PrintMenuItemsReordered(u8 left, u8 top, u8 menuItemCount, const struct MenuAction2 menuItems[], const u8 *order) +void Menu_PrintItemsReordered(u8 left, u8 top, u8 menuItemCount, const struct MenuAction2 menuItems[], const u8 *order) { u8 i; for (i = 0; i < menuItemCount; i++) - MenuPrint(menuItems[order[i]].text, left, top + 2 * i); + Menu_PrintText(menuItems[order[i]].text, left, top + 2 * i); } void InitYesNoMenu(u8 left, u8 top, u8 a3) { - PrintMenuItems(left + 1, top + 1, 2, gMenuYesNoItems); + Menu_PrintItems(left + 1, top + 1, 2, gMenuYesNoItems); InitMenu(0, left + 1, top + 1, 2, 0, a3); } void DisplayYesNoMenu(u8 left, u8 top, u32 a3) { - MenuDrawTextWindow(left, top, left + 6, top + 5); + Menu_DrawStdWindowFrame(left, top, left + 6, top + 5); InitYesNoMenu(left, top, 5); gMenu.menu_field_7 = a3 ? -1 : 0; } -s8 ProcessMenuInputNoWrap_(void) +s8 Menu_ProcessInputNoWrap_(void) { - return ProcessMenuInputNoWrap(); + return Menu_ProcessInputNoWrap(); } -u8 MenuPrint_PixelCoords(const u8 *text, u8 left, u16 top, u8 a4) +u8 Menu_PrintTextPixelCoords(const u8 *text, u8 left, u16 top, u8 a4) { - return sub_8004D04(gMenuWindowPtr, text, gMenuTextTileOffset, left, top, a4); + return Text_InitWindow8004D04(gMenuWindowPtr, text, gMenuTextTileOffset, left, top, a4); } u8 sub_8072A18(const u8 *text, u8 left, u16 top, u8 width, u32 a5) @@ -623,7 +641,7 @@ int sub_8072AB0(const u8 *str, u8 left, u16 top, u8 width, u8 height, u32 a6) height = (height + 7) / 8; if (newlineCount < height) - MenuFillWindowRectWithBlankTile(left, top + 2 * newlineCount, left + width - 1, height + top - 1); + Menu_BlankWindowRect(left, top + 2 * newlineCount, left + width - 1, height + top - 1); } #elif GERMAN __attribute__((naked)) @@ -700,7 +718,7 @@ _08072B0C:\n\ lsls r3, 24\n\ lsrs r3, 24\n\ adds r0, r5, 0\n\ - bl MenuFillWindowRectWithBlankTile\n\ + bl Menu_BlankWindowRect\n\ _08072B3E:\n\ add sp, 0x10\n\ pop {r4-r7}\n\ @@ -712,7 +730,7 @@ _08072B3E:\n\ void MenuPrint_RightAligned(const u8 *str, u8 left, u8 top) { - sub_8004D38(gMenuWindowPtr, str, gMenuTextTileOffset, left, top); + Text_InitWindow8004D38(gMenuWindowPtr, str, gMenuTextTileOffset, left, top); } void sub_8072B80(const u8 *a1, u8 a2, u8 a3, const u8 *a4) @@ -720,12 +738,12 @@ void sub_8072B80(const u8 *a1, u8 a2, u8 a3, const u8 *a4) u8 buffer[64]; u8 width = GetStringWidth(gMenuWindowPtr, a4); AlignString(gMenuWindowPtr, buffer, a1, width, 1); - sub_8003460(gMenuWindowPtr, buffer, gMenuTextTileOffset, a2, a3); + Text_InitWindowAndPrintText(gMenuWindowPtr, buffer, gMenuTextTileOffset, a2, a3); } void sub_8072BD8(const u8 *a1, u8 a2, u8 a3, u16 a4) { - sub_8004DB0(gMenuWindowPtr, a1, gMenuTextTileOffset, a2, a3, a4); + Text_InitWindow8004DB0(gMenuWindowPtr, a1, gMenuTextTileOffset, a2, a3, a4); } u8 *sub_8072C14(u8 *a1, s32 a2, u8 a3, u8 a4) @@ -748,19 +766,19 @@ u8 sub_8072CA4(const u8 *str) return GetStringWidth(gMenuWindowPtr, str); } -u8 sub_8072CBC() +u8 Menu_GetTextWindowPaletteNum(void) { - return sub_8004E24(gMenuWindowPtr); + return Text_GetWindowPaletteNum(gMenuWindowPtr); } -void sub_8072CD4(u8 *a1, u8 *a2, u8 *a3) +void Menu_GetTextColors(u8 *a1, u8 *a2, u8 *a3) { - sub_8004E28(gMenuWindowPtr, a1, a2, a3); + Text_GetTextColors(gMenuWindowPtr, a1, a2, a3); } -u32 MenuUpdateWindowText_OverrideLineLength(u8 lineLength) +u32 Menu_UpdateWindowTextOverrideLineLength(u8 lineLength) { - return sub_80037C8(gMenuWindowPtr, lineLength); + return Text_UpdateWindowOverrideLineLength(gMenuWindowPtr, lineLength); } struct Window *unref_sub_8072D0C(void) @@ -770,7 +788,7 @@ struct Window *unref_sub_8072D0C(void) static void sub_8072D18(u8 a1, u8 a2) { - sub_814A5C0(a1, 0xFFFF, 12, 11679, 8 * a2); + MenuCursor_Create814A5C0(a1, 0xFFFF, 12, 11679, 8 * a2); } u8 InitMenu(u8 cursorSubpriority, u8 left, u8 top, u8 numChoices, u8 cursorPos, u8 cursorWidth) @@ -792,14 +810,14 @@ u8 InitMenu(u8 cursorSubpriority, u8 left, u8 top, u8 numChoices, u8 cursorPos, pos = 0; gMenu.cursorPos = pos; - MoveMenuCursor(0); + Menu_MoveCursor(0); return pos; } -void RedrawMenuCursor(u8 a1, u8 a2) +static void RedrawMenuCursor(u8 x, u8 y) { - sub_814A880((a1 + 1) * 8, 8 * a2); + MenuCursor_SetPos814A880((x + 1) * 8, 8 * y); } void unref_sub_8072DC0() @@ -817,7 +835,7 @@ void sub_8072DDC(u8 a1) sub_8072DCC(8 * a1); } -void HandleDestroyMenuCursors(void) +void Menu_DestroyCursor(void) { DestroyMenuCursor(); } diff --git a/src/engine/menu_cursor.c b/src/engine/menu_cursor.c index 960d3cc87..35116d40b 100644 --- a/src/engine/menu_cursor.c +++ b/src/engine/menu_cursor.c @@ -3,13 +3,13 @@ #include "palette.h" #include "sprite.h" -EWRAM_DATA u16 gUnknown_0203A360[0x10] = {}; -EWRAM_DATA struct Subsprite gMenuCursorSubsprites[10] = {0}; -EWRAM_DATA u8 gUnknown_0203A3D0 = 0; -EWRAM_DATA u8 gUnknown_0203A3D1 = 0; -EWRAM_DATA u8 gUnknown_0203A3D2 = 0; -EWRAM_DATA u8 gUnknown_0203A3D3 = 0; -EWRAM_DATA u8 gUnknown_0203A3D4 = 0; +EWRAM_DATA static u16 gUnknown_0203A360[0x10] = {}; +EWRAM_DATA static struct Subsprite gMenuCursorSubsprites[10] = {0}; +EWRAM_DATA static u8 gUnknown_0203A3D0 = 0; +EWRAM_DATA static u8 gUnknown_0203A3D1 = 0; +EWRAM_DATA static u8 gUnknown_0203A3D2 = 0; +EWRAM_DATA static u8 gUnknown_0203A3D3 = 0; +EWRAM_DATA static u8 gUnknown_0203A3D4 = 0; #if ENGLISH #include "../src/data/menu_cursor_en.h" @@ -26,7 +26,7 @@ void sub_814A590(void) gUnknown_0203A3D4 = 0; } -u8 sub_814A5C0(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5) +u8 MenuCursor_Create814A5C0(u8 subpriority, u16 paletteTag, u8 a3, u16 a4, u8 a5) { int v9; struct Sprite *v10; @@ -35,34 +35,34 @@ u8 sub_814A5C0(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5) DestroyMenuCursor(); v9 = 1; - if (a2 == 0xFFFF) + if (paletteTag == 0xFFFF) { gUnknown_0203A360[a3 & 0xF] = a4; if (LoadSpritePalette(&gUnknown_0842F240) != 0xFF) { - a2 = 0xFFF0; + paletteTag = 0xFFF0; v9 = 0; } } LoadSpriteSheetDeferred(&gUnknown_0842F140[a3 & 0xF]); - gUnknown_0203A3D0 = CreateSprite(&gSpriteTemplate_842F250[v9], 0, 0xA0, a1); - gUnknown_0203A3D1 = CreateSprite(&gSpriteTemplate_842F250[2], 0, 0xA0, a1); + gUnknown_0203A3D0 = CreateSprite(&gSpriteTemplate_842F250[v9], 0, 160, subpriority); + gUnknown_0203A3D1 = CreateSprite(&gSpriteTemplate_842F250[2], 0, 160, subpriority); if (gUnknown_0203A3D0 != 0x40) { v10 = &gSprites[gUnknown_0203A3D0]; - if (a2 == 0xFFFF) + if (paletteTag == 0xFFFF) v10->oam.paletteNum = 0; else - v10->oam.paletteNum = IndexOfSpritePaletteTag(a2); + v10->oam.paletteNum = IndexOfSpritePaletteTag(paletteTag); } if (gUnknown_0203A3D1 != 0x40) { v10 = &gSprites[gUnknown_0203A3D1]; - if (a2 == 0xFFFF) + if (paletteTag == 0xFFFF) v10->oam.paletteNum = 0; else - v10->oam.paletteNum = IndexOfSpritePaletteTag(a2); + v10->oam.paletteNum = IndexOfSpritePaletteTag(paletteTag); if (!(REG_DISPCNT & (DISPCNT_WIN0_ON | DISPCNT_WIN1_ON))) *(u8 *)(REG_ADDR_WINOUT) |= 0x1F; @@ -75,12 +75,13 @@ u8 sub_814A5C0(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5) return gUnknown_0203A3D0; } -u8 sub_814A758(u8 a1, u8 a2, u8 a3, u8 a4) +// unused +u8 sub_814A758(u8 subpriority, u8 a2, u8 a3, u8 a4) { u8 result; struct Sprite *spr; - result = sub_814A5C0(a1, 0, a3, 0, a4); + result = MenuCursor_Create814A5C0(subpriority, 0, a3, 0, a4); if (result != 0x40) { spr = &gSprites[gUnknown_0203A3D0]; @@ -128,7 +129,7 @@ void DestroyMenuCursor(void) return; } -void sub_814A880(u8 a1, u8 a2) +void MenuCursor_SetPos814A880(u8 a1, u8 a2) { struct Sprite *spr; @@ -685,49 +686,48 @@ void unref_sub_814ABE4(int a1) return; } -u8 CreateBlendedOutlineCursor(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5) +u8 CreateBlendedOutlineCursor(u8 subpriority, u16 paletteTag, u8 a3, u16 a4, u8 a5) { int v8; struct Sprite *spr; - u8 var1 = gUnknown_0203A3D2; - if (var1 != 0x40) - sub_814AD44(); + if (gUnknown_0203A3D2 != 0x40) + MenuCursor_Destroy814AD44(); v8 = 1; - if (a2 == 0xFFFF) + if (paletteTag == 0xFFFF) { gUnknown_0203A360[a3 & 0xF] = a4; if (LoadSpritePalette(&gUnknown_0842F248) != 0xFF ) { - a2 = 0xFFF1; + paletteTag = 0xFFF1; v8 = 0; } } LoadSpriteSheetDeferred(&gUnknown_0842F1C0[a3 & 0xF]); #if ENGLISH - gUnknown_0203A3D2 = CreateSprite(&gSpriteTemplate_842F298[v8], 0, 160, a1); + gUnknown_0203A3D2 = CreateSprite(&gSpriteTemplate_842F298[v8], 0, 160, subpriority); #elif GERMAN - gUnknown_0203A3D2 = CreateSprite(&gSpriteTemplate_842F298[v8], 0, 161, a1); + gUnknown_0203A3D2 = CreateSprite(&gSpriteTemplate_842F298[v8], 0, 161, subpriority); #endif if (gUnknown_0203A3D2 != 0x40) { spr = &gSprites[gUnknown_0203A3D2]; - if (a2 == 0xFFFF) + if (paletteTag == 0xFFFF) spr->oam.paletteNum = 0; else - spr->oam.paletteNum = IndexOfSpritePaletteTag(a2); + spr->oam.paletteNum = IndexOfSpritePaletteTag(paletteTag); } sub_814ADF4(a5); return gUnknown_0203A3D2; } -void sub_814AD44(void) +void MenuCursor_Destroy814AD44(void) { if (gUnknown_0203A3D2 != 0x40) { @@ -738,7 +738,7 @@ void sub_814AD44(void) return; } -void sub_814AD7C(u8 a1, u8 a2) +void MenuCursor_SetPos814AD7C(u8 a1, u8 a2) { struct Sprite *spr; if (gUnknown_0203A3D2 != 0x40) diff --git a/src/engine/mystery_event_menu.c b/src/engine/mystery_event_menu.c index b9c3d5ad8..bc14c760d 100644 --- a/src/engine/mystery_event_menu.c +++ b/src/engine/mystery_event_menu.c @@ -45,9 +45,9 @@ void CB2_InitMysteryEventMenu(void) FreeAllSpritePalettes(); ResetTasks(); SetVBlankCallback(VBlankCB); - SetUpWindowConfig(&gWindowConfig_81E6CE4); - InitMenuWindow(&gWindowConfig_81E6CE4); - MenuZeroFillScreen(); + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); + Menu_EraseScreen(); REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON; REG_BLDCNT = 0; CreateTask(Task_DestroySelf, 0); @@ -86,7 +86,7 @@ static void CB2_MysteryEventMenu(void) switch (gMain.state) { case 0: - MenuDrawTextWindow(0, 14, 29, 19); + Menu_DrawStdWindowFrame(0, 14, 29, 19); BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); gMain.state++; break; @@ -97,7 +97,7 @@ static void CB2_MysteryEventMenu(void) gMain.state++; break; case 2: - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) { gMain.state++; gLinkType = 21761; @@ -119,7 +119,7 @@ static void CB2_MysteryEventMenu(void) } break; case 4: - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) gMain.state++; break; #ifdef NONMATCHING @@ -135,8 +135,8 @@ static void CB2_MysteryEventMenu(void) { PlaySE(SE_SELECT); sub_8007F4C(); - MenuDrawTextWindow(6, 5, 23, 8); - MenuPrint(gSystemText_LoadingEvent, 7, 6); + Menu_DrawStdWindowFrame(6, 5, 23, 8); + Menu_PrintText(gSystemText_LoadingEvent, 7, 6); gMain.state++; } else if (gMain.newKeys & B_BUTTON) @@ -155,7 +155,7 @@ static void CB2_MysteryEventMenu(void) if (GetLinkPlayerDataExchangeStatusTimed() == 3) { sub_800832C(); - MenuZeroFillWindowRect(6, 5, 23, 8); + Menu_EraseWindowRect(6, 5, 23, 8); GetEventLoadMessage(gStringVar4, 1); MenuPrintMessageDefaultCoords(gStringVar4); gMain.state = 13; @@ -170,7 +170,7 @@ static void CB2_MysteryEventMenu(void) else { CloseLink(); - MenuZeroFillWindowRect(6, 5, 23, 8); + Menu_EraseWindowRect(6, 5, 23, 8); GetEventLoadMessage(gStringVar4, 1); MenuPrintMessageDefaultCoords(gStringVar4); gMain.state = 13; @@ -195,8 +195,8 @@ static void CB2_MysteryEventMenu(void) { PlaySE(SE_SELECT); sub_8007F4C(); - MenuDrawTextWindow(6, 5, 23, 8); - MenuPrint(gSystemText_LoadingEvent, 7, 6); + Menu_DrawStdWindowFrame(6, 5, 23, 8); + Menu_PrintText(gSystemText_LoadingEvent, 7, 6); gMain.state++; } else if (gMain.newKeys & B_BUTTON) @@ -219,7 +219,7 @@ static void CB2_MysteryEventMenu(void) if (GetLinkPlayerDataExchangeStatusTimed() == 3) { sub_800832C(); - MenuZeroFillWindowRect(6, 5, 23, 8); + Menu_EraseWindowRect(6, 5, 23, 8); GetEventLoadMessage(gStringVar4, 1); MenuPrintMessageDefaultCoords(gStringVar4); ptr = (u8 *)&gMain; @@ -245,7 +245,7 @@ static void CB2_MysteryEventMenu(void) else { CloseLink(); - MenuZeroFillWindowRect(6, 5, 23, 8); + Menu_EraseWindowRect(6, 5, 23, 8); label: GetEventLoadMessage(gStringVar4, 1); MenuPrintMessageDefaultCoords(gStringVar4); @@ -266,7 +266,7 @@ static void CB2_MysteryEventMenu(void) break; #endif case 7: - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) gMain.state++; break; case 8: @@ -289,7 +289,7 @@ static void CB2_MysteryEventMenu(void) unkVal = RunMysteryEventScript(gSharedMem); CpuFill32(0, gSharedMem, 0x7D4); if (!GetEventLoadMessage(gStringVar4, unkVal)) - TrySavingData(NORMAL_SAVE); + Save_WriteData(SAVE_NORMAL); gMain.state++; break; case 12: @@ -297,8 +297,8 @@ static void CB2_MysteryEventMenu(void) gMain.state++; break; case 13: - MenuZeroFillWindowRect(6, 5, 23, 8); - if (MenuUpdateWindowText()) + Menu_EraseWindowRect(6, 5, 23, 8); + if (Menu_UpdateWindowText()) { gMain.state++; gUnknown_02039338 = 0; @@ -326,7 +326,7 @@ static void CB2_MysteryEventMenu(void) if (!IsLinkMaster()) { CloseLink(); - MenuZeroFillWindowRect(6, 5, 23, 8); + Menu_EraseWindowRect(6, 5, 23, 8); GetEventLoadMessage(gStringVar4, 1); MenuPrintMessageDefaultCoords(gStringVar4); gMain.state = 13; @@ -338,3 +338,463 @@ static void CB2_MysteryEventMenu(void) BuildOamBuffer(); UpdatePaletteFade(); } + +#if DEBUG + +void debug_sub_815D1D8(); + +__attribute__((naked)) +void debug_sub_815D04C() +{ + asm( + " push {r4, r5, r6, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " ldr r1, ._125 @ gTasks\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " add r4, r0, r1\n" + " mov r1, #0x8\n" + " ldsh r0, [r4, r1]\n" + " cmp r0, #0\n" + " bne ._121 @cond_branch\n" + " mov r0, #0x4\n" + " mov r1, #0x4\n" + " mov r2, #0xd\n" + " mov r3, #0x7\n" + " bl Menu_DrawStdWindowFrame\n" + " ldr r1, ._125 + 4 @ gUnknown_Debug_842E2D0\n" + " mov r2, #0xa\n" + " ldsh r0, [r4, r2]\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " mov r1, #0x5\n" + " mov r2, #0x5\n" + " bl Menu_PrintText\n" + " ldrh r0, [r4, #0x8]\n" + " add r0, r0, #0x1\n" + " strh r0, [r4, #0x8]\n" + "._121:\n" + " ldr r2, ._125 + 8 @ gMain\n" + " ldrh r1, [r2, #0x2e]\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " add r6, r2, #0\n" + " cmp r0, #0\n" + " beq ._122 @cond_branch\n" + " ldrh r1, [r4, #0xa]\n" + " mov r2, #0xa\n" + " ldsh r0, [r4, r2]\n" + " cmp r0, #0\n" + " bne ._123 @cond_branch\n" + " ldr r0, ._125 + 12 @ gUnknown_Debug_842E350\n" + " ldrb r0, [r0]\n" + " sub r0, r0, #0x1\n" + " b ._124\n" + "._126:\n" + " .align 2, 0\n" + "._125:\n" + " .word gTasks\n" + " .word gUnknown_Debug_842E2D0\n" + " .word gMain\n" + " .word gUnknown_Debug_842E350\n" + "._123:\n" + " sub r0, r1, #1\n" + "._124:\n" + " strh r0, [r4, #0xa]\n" + " ldr r0, ._130 @ gTasks\n" + " lsl r1, r5, #0x2\n" + " add r1, r1, r5\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r0\n" + " mov r0, #0x0\n" + " strh r0, [r1, #0x8]\n" + "._122:\n" + " ldrh r1, [r6, #0x2e]\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._127 @cond_branch\n" + " ldr r1, ._130 @ gTasks\n" + " lsl r2, r5, #0x2\n" + " add r0, r2, r5\n" + " lsl r0, r0, #0x3\n" + " add r4, r0, r1\n" + " mov r0, #0xa\n" + " ldsh r3, [r4, r0]\n" + " ldr r0, ._130 + 4 @ gUnknown_Debug_842E350\n" + " ldrb r0, [r0]\n" + " sub r0, r0, #0x1\n" + " cmp r3, r0\n" + " bne ._128 @cond_branch\n" + " mov r0, #0x0\n" + " b ._129\n" + "._131:\n" + " .align 2, 0\n" + "._130:\n" + " .word gTasks\n" + " .word gUnknown_Debug_842E350\n" + "._128:\n" + " ldrh r0, [r4, #0xa]\n" + " add r0, r0, #0x1\n" + "._129:\n" + " strh r0, [r4, #0xa]\n" + " add r0, r2, r5\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " mov r1, #0x0\n" + " strh r1, [r0, #0x8]\n" + "._127:\n" + " ldrh r1, [r6, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._132 @cond_branch\n" + " ldr r1, ._133 @ gTasks\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " mov r2, #0xa\n" + " ldsh r1, [r0, r2]\n" + " lsl r1, r1, #0x3\n" + " ldr r0, ._133 + 4 @ gUnknown_Debug_842E2D0\n" + " add r0, r0, #0x4\n" + " add r1, r1, r0\n" + " ldr r0, ._133 + 8 @ \n" + " ldr r1, [r1]\n" + " bl _call_via_r1\n" + " ldr r0, ._133 + 12 @ \n" + " add r1, r6, r0\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + " add r0, r5, #0\n" + " bl DestroyTask\n" + "._132:\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._134:\n" + " .align 2, 0\n" + "._133:\n" + " .word gTasks\n" + " .word gUnknown_Debug_842E2D0\n" + " .word +0x2004000\n" + " .word 0x43c\n" + "\n" + ); +} + +void debug_sub_815D15C(void) +{ + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetTasks(); + SetVBlankCallback(VBlankCB); + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); + Menu_EraseScreen(); + REG_DISPCNT = DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP | DISPCNT_MODE_0; + REG_BLDCNT = 0; + + CreateTask(Task_DestroySelf, 0); + StopMapMusic(); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); + FillPalette(0, 0, 2); + SetMainCallback2(debug_sub_815D1D8); +} + +__attribute__((naked)) +void debug_sub_815D1D8() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffffc\n" + " ldr r1, ._139 @ gMain\n" + " ldr r2, ._139 + 4 @ 0x43c\n" + " add r0, r1, r2\n" + " ldrb r0, [r0]\n" + " add r4, r1, #0\n" + " cmp r0, #0xb\n" + " bls ._137 @cond_branch\n" + " b ._196\n" + "._137:\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._139 + 8 @ \n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " mov pc, r0\n" + "._140:\n" + " .align 2, 0\n" + "._139:\n" + " .word gMain\n" + " .word 0x43c\n" + " .word ._141\n" + "._141:\n" + " .word ._142\n" + " .word ._143\n" + " .word ._144\n" + " .word ._145\n" + " .word ._146\n" + " .word ._196\n" + " .word ._148\n" + " .word ._149\n" + " .word ._150\n" + " .word ._151\n" + " .word ._152\n" + " .word ._153\n" + "._142:\n" + " mov r0, #0x3\n" + " mov r1, #0xe\n" + " mov r2, #0x1b\n" + " mov r3, #0x13\n" + " bl Menu_DrawStdWindowFrame\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " mov r1, #0x0\n" + " str r1, [sp]\n" + " mov r2, #0x10\n" + " mov r3, #0x0\n" + " bl BeginNormalPaletteFade\n" + " ldr r1, ._155 @ gMain\n" + " ldr r0, ._155 + 4 @ 0x43c\n" + " add r1, r1, r0\n" + " b ._189\n" + "._156:\n" + " .align 2, 0\n" + "._155:\n" + " .word gMain\n" + " .word 0x43c\n" + "._143:\n" + " ldr r0, ._161 @ gPaletteFade\n" + " ldrb r1, [r0, #0x7]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._157 @cond_branch\n" + " b ._196\n" + "._157:\n" + " ldrh r1, [r4, #0x2c]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._159 @cond_branch\n" + " ldr r1, ._161 + 4 @ gUnknown_Debug_30030E0\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + "._159:\n" + " ldr r0, ._161 + 8 @ Str_843DA70\n" + " mov r1, #0x4\n" + " mov r2, #0xf\n" + " bl MenuPrintMessage\n" + " ldr r2, ._161 + 12 @ 0x43c\n" + " add r1, r4, r2\n" + " b ._189\n" + "._162:\n" + " .align 2, 0\n" + "._161:\n" + " .word gPaletteFade\n" + " .word gUnknown_Debug_30030E0\n" + " .word Str_843DA70\n" + " .word 0x43c\n" + "._144:\n" + " bl Menu_UpdateWindowText\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._163 @cond_branch\n" + " b ._196\n" + "._163:\n" + " ldr r1, ._166 @ gMain\n" + " ldr r0, ._166 + 4 @ 0x43c\n" + " add r1, r1, r0\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + " ldr r1, ._166 + 8 @ gLinkType\n" + " ldr r2, ._166 + 12 @ 0x5501\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " bl OpenLink\n" + " b ._196\n" + "._167:\n" + " .align 2, 0\n" + "._166:\n" + " .word gMain\n" + " .word 0x43c\n" + " .word gLinkType\n" + " .word 0x5501\n" + "._145:\n" + " ldr r0, ._171 @ gReceivedRemoteLinkPlayers\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " bne ._168 @cond_branch\n" + " b ._196\n" + "._168:\n" + " ldr r1, ._171 + 4 @ 0x43c\n" + " add r0, r4, r1\n" + " ldrb r1, [r0]\n" + " add r1, r1, #0x1\n" + " strb r1, [r0]\n" + " ldr r0, ._171 + 8 @ Str_843DA84\n" + " mov r1, #0x4\n" + " mov r2, #0xf\n" + " bl MenuPrintMessage\n" + " b ._196\n" + "._172:\n" + " .align 2, 0\n" + "._171:\n" + " .word gReceivedRemoteLinkPlayers\n" + " .word 0x43c\n" + " .word Str_843DA84\n" + "._146:\n" + " bl Menu_UpdateWindowText\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._173 @cond_branch\n" + " b ._196\n" + "._173:\n" + " ldr r0, ._176 @ debug_sub_815D04C\n" + " mov r1, #0xa\n" + " bl CreateTask\n" + " ldr r1, ._176 + 4 @ gMain\n" + " ldr r2, ._176 + 8 @ 0x43c\n" + " add r1, r1, r2\n" + " b ._189\n" + "._177:\n" + " .align 2, 0\n" + "._176:\n" + " .word debug_sub_815D04C+1\n" + " .word gMain\n" + " .word 0x43c\n" + "._148:\n" + " ldr r0, ._179 @ Str_843DA98\n" + " mov r1, #0x4\n" + " mov r2, #0xf\n" + " bl MenuPrintMessage\n" + " ldr r1, ._179 + 4 @ 0x2004000\n" + " ldr r2, ._179 + 8 @ 0x2004\n" + " mov r0, #0x0\n" + " bl SendBlock\n" + " ldr r1, ._179 + 12 @ gMain\n" + " ldr r0, ._179 + 16 @ 0x43c\n" + " add r1, r1, r0\n" + " b ._189\n" + "._180:\n" + " .align 2, 0\n" + "._179:\n" + " .word Str_843DA98\n" + " .word 0x2004000\n" + " .word 0x2004\n" + " .word gMain\n" + " .word 0x43c\n" + "._149:\n" + " bl Menu_UpdateWindowText\n" + " bl IsLinkTaskFinished\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " beq ._196 @cond_branch\n" + " ldr r1, ._183 @ gMain\n" + " ldr r2, ._183 + 4 @ 0x43c\n" + " add r1, r1, r2\n" + " b ._189\n" + "._184:\n" + " .align 2, 0\n" + "._183:\n" + " .word gMain\n" + " .word 0x43c\n" + "._150:\n" + " bl sub_800832C\n" + " ldr r1, ._186 @ gMain\n" + " ldr r0, ._186 + 4 @ 0x43c\n" + " add r1, r1, r0\n" + " b ._189\n" + "._187:\n" + " .align 2, 0\n" + "._186:\n" + " .word gMain\n" + " .word 0x43c\n" + "._151:\n" + " ldr r0, ._190 @ gReceivedRemoteLinkPlayers\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " bne ._196 @cond_branch\n" + " mov r0, #0x4\n" + " mov r1, #0xf\n" + " mov r2, #0x1a\n" + " mov r3, #0x12\n" + " bl Menu_BlankWindowRect\n" + " ldr r0, ._190 + 4 @ Str_843DAA3\n" + " mov r1, #0x4\n" + " mov r2, #0xf\n" + " bl Menu_PrintText\n" + " ldr r1, ._190 + 8 @ gMain\n" + " ldr r2, ._190 + 12 @ 0x43c\n" + " add r1, r1, r2\n" + " b ._189\n" + "._191:\n" + " .align 2, 0\n" + "._190:\n" + " .word gReceivedRemoteLinkPlayers\n" + " .word Str_843DAA3\n" + " .word gMain\n" + " .word 0x43c\n" + "._152:\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._196 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " mov r1, #0x0\n" + " str r1, [sp]\n" + " mov r2, #0x0\n" + " mov r3, #0x10\n" + " bl BeginNormalPaletteFade\n" + " ldr r0, ._194 @ 0x43c\n" + " add r1, r4, r0\n" + "._189:\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + " b ._196\n" + "._195:\n" + " .align 2, 0\n" + "._194:\n" + " .word 0x43c\n" + "._153:\n" + " ldr r0, ._197 @ gPaletteFade\n" + " ldrb r1, [r0, #0x7]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._196 @cond_branch\n" + " ldr r0, ._197 + 4 @ CB2_InitTitleScreen\n" + " bl SetMainCallback2\n" + "._196:\n" + " bl RunTasks\n" + " bl AnimateSprites\n" + " bl BuildOamBuffer\n" + " bl UpdatePaletteFade\n" + " add sp, sp, #0x4\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._198:\n" + " .align 2, 0\n" + "._197:\n" + " .word gPaletteFade\n" + " .word CB2_InitTitleScreen+1\n" + "\n" + ); +} + +#endif diff --git a/src/engine/name_string_util.c b/src/engine/name_string_util.c index f1a935453..32e9358e1 100644 --- a/src/engine/name_string_util.c +++ b/src/engine/name_string_util.c @@ -7,7 +7,7 @@ void PadNameString(u8 *a1, u8 a2) { u8 i; - StripExtCtrlCodes(a1); + Text_StripExtCtrlCodes(a1); i = StringLength(a1); if (a2 == 0xFC) @@ -36,5 +36,5 @@ void SanitizeNameString(u8 *a1) if (StringLength(a1) < 6) ConvertInternationalString(a1, 1); else - StripExtCtrlCodes(a1); + Text_StripExtCtrlCodes(a1); } diff --git a/src/engine/naming_screen.c b/src/engine/naming_screen.c index 440504d5a..ca77c5483 100644 --- a/src/engine/naming_screen.c +++ b/src/engine/naming_screen.c @@ -26,8 +26,6 @@ #define COLUMN_COUNT 10 #endif -extern u16 gKeyRepeatStartDelay; - extern u8 CreateMonIcon(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, u32 personality); const u8 gSpriteImage_83CE094[] = INCBIN_U8("graphics/naming_screen/pc_icon/0.4bpp"); @@ -258,20 +256,7 @@ static void NamingScreen_InitDisplayMode(void) static void NamingScreen_ClearVram(void) { - u8 *addr = (void *)VRAM; - u32 size = 0x10000; - - while (1) - { - DmaFill16(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill16(3, 0, addr, size); - break; - } - } + DmaFill16Large(3, 0, (void *)VRAM, 0x10000, 0x1000); } static void NamingScreen_ClearOam(void) @@ -325,8 +310,8 @@ static void NamingScreen_Init(void) static void NamingScreen_SetUpWindow(void) { - SetUpWindowConfig(&gWindowConfig_81E6E88); - InitMenuWindow(&gWindowConfig_81E6E88); + Text_LoadWindowTemplate(&gWindowTemplate_81E6E88); + InitMenuWindow(&gWindowTemplate_81E6E88); } static void NamingScreen_ResetObjects(void) @@ -503,7 +488,7 @@ static bool8 MainState_6(struct Task *task) static bool8 MainState_UpdateSentToPCMessage(struct Task *task) { - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) namingScreenDataPtr->state++; return FALSE; } @@ -1610,8 +1595,8 @@ static void DisplaySentToPCMessage(void) { StringCopy(gStringVar1, namingScreenDataPtr->destBuffer); StringExpandPlaceholders(gStringVar4, gOtherText_SentToPC); - BasicInitMenuWindow(&gWindowConfig_81E6E88); - MenuDisplayMessageBox(); + BasicInitMenuWindow(&gWindowTemplate_81E6E88); + Menu_DisplayDialogueFrame(); MenuPrintMessageDefaultCoords(gStringVar4); } @@ -1629,16 +1614,8 @@ static void sub_80B7558(void) static void sub_80B7568(void) { - const void *src; - void *dst; - - src = gNamingScreenMenu_Gfx; - dst = (void *)(VRAM + gMenuMessageBoxContentTileOffset * 32); - DmaCopy16(3, src, dst, 0x800); - - src = gNamingScreenMenu_Gfx; - dst = (void *)(VRAM + 0x8000 + gMenuMessageBoxContentTileOffset * 32); - DmaCopy16(3, src, dst, 0x800); + DmaCopy16Defvars(3, gNamingScreenMenu_Gfx, (void *)(VRAM + gMenuMessageBoxContentTileOffset * 32), 0x800); + DmaCopy16Defvars(3, gNamingScreenMenu_Gfx, (void *)(VRAM + 0x8000 + gMenuMessageBoxContentTileOffset * 32), 0x800); } static void sub_80B75B0(void) @@ -1757,19 +1734,19 @@ static void (*const gUnknown_083CE310[][2])(void) = sub_80B7844, }; -static const struct WindowConfig *const gUnknown_083CE328[][2][2] = +static const struct WindowTemplate *const gUnknown_083CE328[][2][2] = { { - {&gWindowConfig_81E6EDC, &gWindowConfig_81E6EF8}, - {&gWindowConfig_81E6EA4, &gWindowConfig_81E6EC0}, + {&gWindowTemplate_81E6EDC, &gWindowTemplate_81E6EF8}, + {&gWindowTemplate_81E6EA4, &gWindowTemplate_81E6EC0}, }, { - {&gWindowConfig_81E6EA4, &gWindowConfig_81E6EC0}, - {&gWindowConfig_81E6F14, &gWindowConfig_81E6F30}, + {&gWindowTemplate_81E6EA4, &gWindowTemplate_81E6EC0}, + {&gWindowTemplate_81E6F14, &gWindowTemplate_81E6F30}, }, { - {&gWindowConfig_81E6F14, &gWindowConfig_81E6F30}, - {&gWindowConfig_81E6EDC, &gWindowConfig_81E6EF8}, + {&gWindowTemplate_81E6F14, &gWindowTemplate_81E6F30}, + {&gWindowTemplate_81E6EDC, &gWindowTemplate_81E6EF8}, }, }; @@ -1838,15 +1815,15 @@ static void PrintKeyboardCharacters(u8 page) //print letters on page s16 r5; for (i = 0, r5 = 9; i < 4; i++, r5 += 2) - MenuPrint(sKeyboardCharacters[page][i], 3, r5); + Menu_PrintText(sKeyboardCharacters[page][i], 3, r5); } static void sub_80B78A8(void) { - BasicInitMenuWindow(&gWindowConfig_81E6F4C); + BasicInitMenuWindow(&gWindowTemplate_81E6F4C); gUnknown_083CE358[namingScreenDataPtr->templateNum](); gUnknown_083CE368[namingScreenDataPtr->template->unk3](); - MenuPrint(namingScreenDataPtr->template->title, 9, 2); + Menu_PrintText(namingScreenDataPtr->template->title, 9, 2); } static void nullsub_61(void) @@ -1870,7 +1847,7 @@ static void sub_80B7924(void) { if ((s16)namingScreenDataPtr->unk40 == MON_FEMALE) genderSymbol[0] = 0xB6; //female symbol - MenuPrint(genderSymbol, 0x14, 4); + Menu_PrintText(genderSymbol, 0x14, 4); } } @@ -1886,8 +1863,8 @@ static void sub_80B7960(void) string[5] = 1; string += 6; StringCopy(string, namingScreenDataPtr->textBuffer); - BasicInitMenuWindow(&gWindowConfig_81E6F4C); - MenuPrint(gStringVar1, namingScreenDataPtr->unk2, 4); + BasicInitMenuWindow(&gWindowTemplate_81E6F4C); + Menu_PrintText(gStringVar1, namingScreenDataPtr->unk2, 4); } //-------------------------------------------------- diff --git a/src/engine/option_menu.c b/src/engine/option_menu.c index dfc49b035..a2d32ffb6 100644 --- a/src/engine/option_menu.c +++ b/src/engine/option_menu.c @@ -3,26 +3,16 @@ #include "main.h" #include "menu.h" #include "palette.h" +#include "scanline_effect.h" #include "sprite.h" #include "strings2.h" #include "task.h" extern void SetPokemonCryStereo(u32 val); -extern void remove_some_task(void); - -//Task data -enum { - TD_MENUSELECTION, - TD_TEXTSPEED, - TD_BATTLESCENE, - TD_BATTLESTYLE, - TD_SOUND, - TD_BUTTONMODE, - TD_FRAMETYPE, -}; -//Menu items -enum { +// Menu items +enum +{ MENUITEM_TEXTSPEED, MENUITEM_BATTLESCENE, MENUITEM_BATTLESTYLE, @@ -32,6 +22,15 @@ enum { MENUITEM_CANCEL, }; +// Task data +#define tMenuSelection data[0] +#define tOptTextSpeed data[1] +#define tOptBattleScene data[2] +#define tOptBattleStyle data[3] +#define tOptSound data[4] +#define tOptButtonMode data[5] +#define tOptFrameType data[6] + const u16 gUnknown_0839F5FC[] = INCBIN_U16("graphics/misc/option_menu_text.gbapal"); // note: this is only used in the Japanese release const u8 gUnknown_0839F63C[] = INCBIN_U8("graphics/misc/option_menu_equals_sign.4bpp"); @@ -75,10 +74,6 @@ void CB2_InitOptionMenu(void) { default: case 0: - { - u8 *addr; - u32 size; - SetVBlankCallback(NULL); REG_DISPCNT = 0; REG_BG2CNT = 0; @@ -90,37 +85,24 @@ void CB2_InitOptionMenu(void) REG_BG1VOFS = 0; REG_BG0HOFS = 0; REG_BG0VOFS = 0; - addr = (u8 *)VRAM; - size = 0x18000; - while (1) - { - DmaFill16(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill16(3, 0, addr, size); - break; - } - } + DmaFill16Large(3, 0, (u8 *)VRAM, 0x18000, 0x1000); DmaClear32(3, OAM, OAM_SIZE); DmaClear16(3, PLTT, PLTT_SIZE); gMain.state++; break; - } case 1: ResetPaletteFade(); - remove_some_task(); + ScanlineEffect_Stop(); ResetTasks(); ResetSpriteData(); gMain.state++; break; case 2: - SetUpWindowConfig(&gWindowConfig_81E71B4); + Text_LoadWindowTemplate(&gWindowTemplate_81E71B4); gMain.state++; break; case 3: - MultistepInitMenuWindowBegin(&gWindowConfig_81E71B4); + MultistepInitMenuWindowBegin(&gWindowTemplate_81E71B4); gMain.state++; break; case 4: @@ -165,37 +147,38 @@ void CB2_InitOptionMenu(void) { u8 taskId = CreateTask(Task_OptionMenuFadeIn, 0); - gTasks[taskId].data[TD_MENUSELECTION] = 0; - gTasks[taskId].data[TD_TEXTSPEED] = gSaveBlock2.optionsTextSpeed; - gTasks[taskId].data[TD_BATTLESCENE] = gSaveBlock2.optionsBattleSceneOff; - gTasks[taskId].data[TD_BATTLESTYLE] = gSaveBlock2.optionsBattleStyle; - gTasks[taskId].data[TD_SOUND] = gSaveBlock2.optionsSound; - gTasks[taskId].data[TD_BUTTONMODE] = gSaveBlock2.optionsButtonMode; - gTasks[taskId].data[TD_FRAMETYPE] = gSaveBlock2.optionsWindowFrameType; - - MenuDrawTextWindow(2, 0, 27, 3); - MenuDrawTextWindow(2, 4, 27, 19); - - MenuPrint(gSystemText_OptionMenu, 4, 1); - MenuPrint(gSystemText_TextSpeed, 4, 5); - MenuPrint(gSystemText_BattleScene, 4, 7); - MenuPrint(gSystemText_BattleStyle, 4, 9); - MenuPrint(gSystemText_Sound, 4, 11); - MenuPrint(gSystemText_ButtonMode, 4, 13); - MenuPrint(gSystemText_Frame, 4, 15); - MenuPrint(gSystemText_Cancel, 4, 17); - - TextSpeed_DrawChoices(gTasks[taskId].data[TD_TEXTSPEED]); - BattleScene_DrawChoices(gTasks[taskId].data[TD_BATTLESCENE]); - BattleStyle_DrawChoices(gTasks[taskId].data[TD_BATTLESTYLE]); - Sound_DrawChoices(gTasks[taskId].data[TD_SOUND]); - ButtonMode_DrawChoices(gTasks[taskId].data[TD_BUTTONMODE]); - FrameType_DrawChoices(gTasks[taskId].data[TD_FRAMETYPE]); + gTasks[taskId].tMenuSelection = 0; + gTasks[taskId].tOptTextSpeed = gSaveBlock2.optionsTextSpeed; + gTasks[taskId].tOptBattleScene = gSaveBlock2.optionsBattleSceneOff; + gTasks[taskId].tOptBattleStyle = gSaveBlock2.optionsBattleStyle; + gTasks[taskId].tOptSound = gSaveBlock2.optionsSound; + gTasks[taskId].tOptButtonMode = gSaveBlock2.optionsButtonMode; + gTasks[taskId].tOptFrameType = gSaveBlock2.optionsWindowFrameType; + + Menu_DrawStdWindowFrame(2, 0, 27, 3); // title box + Menu_DrawStdWindowFrame(2, 4, 27, 19); // options list box + + Menu_PrintText(gSystemText_OptionMenu, 4, 1); + + Menu_PrintText(gSystemText_TextSpeed, 4, 5); + Menu_PrintText(gSystemText_BattleScene, 4, 7); + Menu_PrintText(gSystemText_BattleStyle, 4, 9); + Menu_PrintText(gSystemText_Sound, 4, 11); + Menu_PrintText(gSystemText_ButtonMode, 4, 13); + Menu_PrintText(gSystemText_Frame, 4, 15); + Menu_PrintText(gSystemText_Cancel, 4, 17); + + TextSpeed_DrawChoices(gTasks[taskId].tOptTextSpeed); + BattleScene_DrawChoices(gTasks[taskId].tOptBattleScene); + BattleStyle_DrawChoices(gTasks[taskId].tOptBattleStyle); + Sound_DrawChoices(gTasks[taskId].tOptSound); + ButtonMode_DrawChoices(gTasks[taskId].tOptButtonMode); + FrameType_DrawChoices(gTasks[taskId].tOptFrameType); REG_WIN0H = WIN_RANGE(17, 223); REG_WIN0V = WIN_RANGE(1, 31); - HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]); + HighlightOptionMenuItem(gTasks[taskId].tMenuSelection); gMain.state++; break; } @@ -208,16 +191,14 @@ void CB2_InitOptionMenu(void) static void Task_OptionMenuFadeIn(u8 taskId) { if (!gPaletteFade.active) - { gTasks[taskId].func = Task_OptionMenuProcessInput; - } } static void Task_OptionMenuProcessInput(u8 taskId) { if (gMain.newKeys & A_BUTTON) { - if (gTasks[taskId].data[TD_MENUSELECTION] == MENUITEM_CANCEL) + if (gTasks[taskId].tMenuSelection == MENUITEM_CANCEL) gTasks[taskId].func = Task_OptionMenuSave; } else if (gMain.newKeys & B_BUTTON) @@ -226,47 +207,47 @@ static void Task_OptionMenuProcessInput(u8 taskId) } else if (gMain.newKeys & DPAD_UP) { - if (gTasks[taskId].data[TD_MENUSELECTION] > 0) - gTasks[taskId].data[TD_MENUSELECTION]--; + if (gTasks[taskId].tMenuSelection > 0) + gTasks[taskId].tMenuSelection--; else - gTasks[taskId].data[TD_MENUSELECTION] = 6; - HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]); + gTasks[taskId].tMenuSelection = 6; + HighlightOptionMenuItem(gTasks[taskId].tMenuSelection); } else if (gMain.newKeys & DPAD_DOWN) { - if (gTasks[taskId].data[TD_MENUSELECTION] <= 5) - gTasks[taskId].data[TD_MENUSELECTION]++; + if (gTasks[taskId].tMenuSelection < 6) + gTasks[taskId].tMenuSelection++; else - gTasks[taskId].data[TD_MENUSELECTION] = 0; - HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]); + gTasks[taskId].tMenuSelection = 0; + HighlightOptionMenuItem(gTasks[taskId].tMenuSelection); } else { - switch (gTasks[taskId].data[TD_MENUSELECTION]) + switch (gTasks[taskId].tMenuSelection) { case MENUITEM_TEXTSPEED: - gTasks[taskId].data[TD_TEXTSPEED] = TextSpeed_ProcessInput(gTasks[taskId].data[TD_TEXTSPEED]); - TextSpeed_DrawChoices(gTasks[taskId].data[TD_TEXTSPEED]); + gTasks[taskId].tOptTextSpeed = TextSpeed_ProcessInput(gTasks[taskId].tOptTextSpeed); + TextSpeed_DrawChoices(gTasks[taskId].tOptTextSpeed); break; case MENUITEM_BATTLESCENE: - gTasks[taskId].data[TD_BATTLESCENE] = BattleScene_ProcessInput(gTasks[taskId].data[TD_BATTLESCENE]); - BattleScene_DrawChoices(gTasks[taskId].data[TD_BATTLESCENE]); + gTasks[taskId].tOptBattleScene = BattleScene_ProcessInput(gTasks[taskId].tOptBattleScene); + BattleScene_DrawChoices(gTasks[taskId].tOptBattleScene); break; case MENUITEM_BATTLESTYLE: - gTasks[taskId].data[TD_BATTLESTYLE] = BattleStyle_ProcessInput(gTasks[taskId].data[TD_BATTLESTYLE]); - BattleStyle_DrawChoices(gTasks[taskId].data[TD_BATTLESTYLE]); + gTasks[taskId].tOptBattleStyle = BattleStyle_ProcessInput(gTasks[taskId].tOptBattleStyle); + BattleStyle_DrawChoices(gTasks[taskId].tOptBattleStyle); break; case MENUITEM_SOUND: - gTasks[taskId].data[TD_SOUND] = Sound_ProcessInput(gTasks[taskId].data[TD_SOUND]); - Sound_DrawChoices(gTasks[taskId].data[TD_SOUND]); + gTasks[taskId].tOptSound = Sound_ProcessInput(gTasks[taskId].tOptSound); + Sound_DrawChoices(gTasks[taskId].tOptSound); break; case MENUITEM_BUTTONMODE: - gTasks[taskId].data[TD_BUTTONMODE] = ButtonMode_ProcessInput(gTasks[taskId].data[TD_BUTTONMODE]); - ButtonMode_DrawChoices(gTasks[taskId].data[TD_BUTTONMODE]); + gTasks[taskId].tOptButtonMode = ButtonMode_ProcessInput(gTasks[taskId].tOptButtonMode); + ButtonMode_DrawChoices(gTasks[taskId].tOptButtonMode); break; case MENUITEM_FRAMETYPE: - gTasks[taskId].data[TD_FRAMETYPE] = FrameType_ProcessInput(gTasks[taskId].data[TD_FRAMETYPE]); - FrameType_DrawChoices(gTasks[taskId].data[TD_FRAMETYPE]); + gTasks[taskId].tOptFrameType = FrameType_ProcessInput(gTasks[taskId].tOptFrameType); + FrameType_DrawChoices(gTasks[taskId].tOptFrameType); break; } } @@ -274,12 +255,12 @@ static void Task_OptionMenuProcessInput(u8 taskId) static void Task_OptionMenuSave(u8 taskId) { - gSaveBlock2.optionsTextSpeed = gTasks[taskId].data[TD_TEXTSPEED]; - gSaveBlock2.optionsBattleSceneOff = gTasks[taskId].data[TD_BATTLESCENE]; - gSaveBlock2.optionsBattleStyle = gTasks[taskId].data[TD_BATTLESTYLE]; - gSaveBlock2.optionsSound = gTasks[taskId].data[TD_SOUND]; - gSaveBlock2.optionsButtonMode = gTasks[taskId].data[TD_BUTTONMODE]; - gSaveBlock2.optionsWindowFrameType = gTasks[taskId].data[TD_FRAMETYPE]; + gSaveBlock2.optionsTextSpeed = gTasks[taskId].tOptTextSpeed; + gSaveBlock2.optionsBattleSceneOff = gTasks[taskId].tOptBattleScene; + gSaveBlock2.optionsBattleStyle = gTasks[taskId].tOptBattleStyle; + gSaveBlock2.optionsSound = gTasks[taskId].tOptSound; + gSaveBlock2.optionsButtonMode = gTasks[taskId].tOptButtonMode; + gSaveBlock2.optionsWindowFrameType = gTasks[taskId].tOptFrameType; BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); gTasks[taskId].func = Task_OptionMenuFadeOut; @@ -305,29 +286,29 @@ static void HighlightOptionMenuItem(u8 index) static void DrawOptionMenuChoice(const u8 *text, u8 x, u8 y, u8 style) { - u8 dst[16]; + u8 dst[15]; u16 i; - for (i = 0; *text != EOS && i <= 14; i++) + for (i = 0; *text != EOS && i < 15; i++) dst[i] = *(text++); dst[2] = style; dst[i] = EOS; - MenuPrint_PixelCoords(dst, x, y, 1); + Menu_PrintTextPixelCoords(dst, x, y, 1); } static u8 TextSpeed_ProcessInput(u8 selection) { if (gMain.newKeys & DPAD_RIGHT) { - if (selection <= 1) + if (selection < 2) selection++; else selection = 0; } if (gMain.newKeys & DPAD_LEFT) { - if (selection != 0) + if (selection > 0) selection--; else selection = 2; @@ -356,7 +337,7 @@ static void TextSpeed_DrawChoices(u8 selection) styles[selection] = 0x8; DrawOptionMenuChoice(gSystemText_Slow, TEXTSPEED_SLOW_LEFT, 40, styles[0]); - DrawOptionMenuChoice(gSystemText_Mid, TEXTSPEED_MIX_LEFT, 40, styles[1]); + DrawOptionMenuChoice(gSystemText_Mid, TEXTSPEED_MIX_LEFT, 40, styles[1]); DrawOptionMenuChoice(gSystemText_Fast, TEXTSPEED_FAST_LEFT, 40, styles[2]); } @@ -375,7 +356,7 @@ static void BattleScene_DrawChoices(u8 selection) styles[1] = 0xF; styles[selection] = 0x8; - DrawOptionMenuChoice(gSystemText_On, 120, 56, styles[0]); + DrawOptionMenuChoice(gSystemText_On, 120, 56, styles[0]); DrawOptionMenuChoice(gSystemText_Off, 190, 56, styles[1]); } @@ -403,7 +384,7 @@ static void BattleStyle_DrawChoices(u8 selection) styles[selection] = 0x8; DrawOptionMenuChoice(gSystemText_Shift, BATTLESTYLE_SHIFT, 72, styles[0]); - DrawOptionMenuChoice(gSystemText_Set, BATTLESTYLE_SET, 72, styles[1]); + DrawOptionMenuChoice(gSystemText_Set, BATTLESTYLE_SET, 72, styles[1]); } static u8 Sound_ProcessInput(u8 selection) @@ -424,7 +405,7 @@ static void Sound_DrawChoices(u8 selection) styles[1] = 0xF; styles[selection] = 0x8; - DrawOptionMenuChoice(gSystemText_Mono, 120, 88, styles[0]); + DrawOptionMenuChoice(gSystemText_Mono, 120, 88, styles[0]); DrawOptionMenuChoice(gSystemText_Stereo, 172, 88, styles[1]); } @@ -432,19 +413,19 @@ static u8 FrameType_ProcessInput(u8 selection) { if (gMain.newKeys & DPAD_RIGHT) { - if (selection <= 18) + if (selection < 19) selection++; else selection = 0; - MenuLoadTextWindowGraphics_OverrideFrameType(selection); + Menu_LoadStdFrameGraphicsOverrideStyle(selection); } if (gMain.newKeys & DPAD_LEFT) { - if (selection != 0) + if (selection > 0) selection--; else selection = 19; - MenuLoadTextWindowGraphics_OverrideFrameType(selection); + Menu_LoadStdFrameGraphicsOverrideStyle(selection); } return selection; } @@ -454,11 +435,11 @@ static u8 FrameType_ProcessInput(u8 selection) #if ENGLISH static void FrameType_DrawChoices(u8 selection) { - u8 text[8]; + u8 text[6]; u8 n = selection + 1; u16 i; - for (i = 0; gSystemText_Terminator[i] != EOS && i <= 5; i++) + for (i = 0; gSystemText_Terminator[i] != EOS && i < 6; i++) text[i] = gSystemText_Terminator[i]; //Convert number to decimal string @@ -478,8 +459,8 @@ static void FrameType_DrawChoices(u8 selection) } text[i] = EOS; - MenuPrint(gSystemText_Type, 15, 15); - MenuPrint(text, 18, 15); + Menu_PrintText(gSystemText_Type, 15, 15); + Menu_PrintText(text, 18, 15); } #elif GERMAN __attribute__((naked)) @@ -536,7 +517,7 @@ _0808C380:\n\ mov r0, sp\n\ movs r1, 0xF\n\ movs r2, 0xF\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ add sp, 0x10\n\ pop {r4-r6}\n\ pop {r0}\n\ @@ -549,14 +530,14 @@ static u8 ButtonMode_ProcessInput(u8 selection) { if (gMain.newKeys & DPAD_RIGHT) { - if (selection <= 1) + if (selection < 2) selection++; else selection = 0; } if (gMain.newKeys & DPAD_LEFT) { - if (selection != 0) + if (selection > 0) selection--; else selection = 2; @@ -574,6 +555,6 @@ static void ButtonMode_DrawChoices(u8 selection) styles[selection] = 0x8; DrawOptionMenuChoice(gSystemText_Normal, 120, 104, styles[0]); - DrawOptionMenuChoice(gSystemText_LR, 166, 104, styles[1]); - DrawOptionMenuChoice(gSystemText_LA, 188, 104, styles[2]); + DrawOptionMenuChoice(gSystemText_LR, 166, 104, styles[1]); + DrawOptionMenuChoice(gSystemText_LA, 188, 104, styles[2]); } diff --git a/src/engine/palette.c b/src/engine/palette.c index 17e9ca178..2a6602503 100644 --- a/src/engine/palette.c +++ b/src/engine/palette.c @@ -827,8 +827,6 @@ void BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color) void BlendPalettesUnfaded(u32 selectedPalettes, u8 coeff, u16 color) { - void *src = gPlttBufferUnfaded; - void *dest = gPlttBufferFaded; - DmaCopy32(3, src, dest, PLTT_SIZE); + DmaCopy32Defvars(3, gPlttBufferUnfaded, gPlttBufferFaded, PLTT_SIZE); BlendPalettes(selectedPalettes, coeff, color); } diff --git a/src/engine/record_mixing.c b/src/engine/record_mixing.c index c8e2e34d5..a2660bf82 100644 --- a/src/engine/record_mixing.c +++ b/src/engine/record_mixing.c @@ -26,7 +26,7 @@ #include "tv.h" #include "ewram.h" -extern struct RecordMixingDayCareMail gUnknown_02038738; +EWRAM_DATA struct RecordMixingDayCareMail gUnknown_02038738 = {0}; extern u16 gSpecialVar_0x8005; u32 gUnknown_03005D2C; @@ -146,8 +146,8 @@ void Task_RecordMixing_Main(u8 taskId) { tState = 4; data[10] = sub_8083664(); - sub_80720B0(); - MenuPrint(gOtherText_MixingComplete, 2, 15); + Menu_ClearWindowText(); + Menu_PrintText(gOtherText_MixingComplete, 2, 15); data[8] = 0; } break; @@ -160,7 +160,7 @@ void Task_RecordMixing_Main(u8 taskId) if (!gTasks[data[10]].isActive) { sub_8055588(); - MenuZeroFillScreen(); + Menu_EraseScreen(); DestroyTask(taskId); EnableBothScriptContexts(); } @@ -176,8 +176,8 @@ void sub_80B95F0(u8 taskId) { case 0: sub_80B9A78(); - MenuDisplayMessageBox(); - MenuPrint(gOtherText_MixingRecordsWithFriend, 2, 15); + Menu_DisplayDialogueFrame(); + Menu_PrintText(gOtherText_MixingRecordsWithFriend, 2, 15); task->data[8] = 0x708; task->tState = 400; ClearLinkCallback_2(); diff --git a/src/engine/reset_rtc_screen.c b/src/engine/reset_rtc_screen.c index 67e146899..8b67f39a5 100644 --- a/src/engine/reset_rtc_screen.c +++ b/src/engine/reset_rtc_screen.c @@ -13,7 +13,7 @@ #include "strings2.h" #include "task.h" #include "text.h" -#include "unknown_task.h" +#include "scanline_effect.h" struct ResetRtcStruct { @@ -147,6 +147,13 @@ const struct SpriteTemplate gSpriteTemplate_83764E8 = const u8 gUnknown_08376500[] = _(" : "); +#if DEBUG +const u8 gUnknown_Debug_0839AE94[] = _("にっすう"); +const u8 gUnknown_Debug_0839AE99[] = _("じかん"); +const u8 gUnknown_Debug_0839AE9D[] = _("ゲームない じかん"); +const u8 gUnknown_Debug_0839AEA7[] = _("RTC じかん"); +#endif + void SpriteCB_ResetRtcCusor0(struct Sprite *sprite) { int state = gTasks[sprite->data[0]].data[2]; @@ -267,7 +274,7 @@ void ResetRtcScreen_FreeCursorPalette(void) void ResetRtcScreen_HideChooseTimeWindow(void) { - MenuZeroFillWindowRect(3, 8, 25, 11); + Menu_EraseWindowRect(3, 8, 25, 11); } void ResetRtcScreen_PrintTime(u8 x, u8 y, u16 days, u8 hours, u8 minutes, u8 seconds) @@ -286,13 +293,13 @@ void ResetRtcScreen_PrintTime(u8 x, u8 y, u16 days, u8 hours, u8 minutes, u8 sec dest = ConvertIntToDecimalStringN(dest, minutes, STR_CONV_MODE_LEADING_ZEROS, 2); dest = StringCopy(dest, gUnknown_08376500); ConvertIntToDecimalStringN(dest, seconds, STR_CONV_MODE_LEADING_ZEROS, 2); - MenuPrint(gStringVar4, x, y); + Menu_PrintText(gStringVar4, x, y); } void ResetRtcScreen_ShowChooseTimeWindow(u16 days, u8 hours, u8 minutes, u8 seconds) { - MenuDrawTextWindow(3, 8, 25, 11); - MenuPrint(gOtherText_OK, 20, 9); + Menu_DrawStdWindowFrame(3, 8, 25, 11); + Menu_PrintText(gOtherText_OK, 20, 9); ResetRtcScreen_PrintTime(4, 9, days, hours, minutes, seconds); } @@ -414,37 +421,19 @@ void Task_ResetRtc_0(u8 taskId) void CB2_InitResetRtcScreen(void) { - u8 *addr; - u32 size; - REG_DISPCNT = 0; SetVBlankCallback(NULL); - DmaClear16(3, PLTT, PLTT_SIZE); - - addr = (u8 *)VRAM; - size = 0x18000; - while (1) - { - DmaFill16(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill16(3, 0, addr, size); - break; - } - } - + DmaFill16Large(3, 0, (u8 *)VRAM, 0x18000, 0x1000); ResetOamRange(0, 128); LoadOam(); - remove_some_task(); - dp12_8087EA4(); + ScanlineEffect_Stop(); + ScanlineEffect_Clear(); ResetSpriteData(); ResetTasks(); ResetPaletteFade(); - SetUpWindowConfig(&gWindowConfig_81E6CE4); - InitMenuWindow(&gWindowConfig_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); REG_DISPCNT = 4352; SetVBlankCallback(VBlankCB_ResetRtcScreen); SetMainCallback2(CB2_ResetRtcScreen); @@ -468,8 +457,8 @@ void VBlankCB_ResetRtcScreen(void) void ResetRtcScreen_ShowMessage(const u8 *str) { - MenuDisplayMessageBox(); - MenuPrint(str, 2, 15); + Menu_DisplayDialogueFrame(); + Menu_PrintText(str, 2, 15); } void Task_ShowResetRtcPrompt(u8 taskId) @@ -479,9 +468,9 @@ void Task_ShowResetRtcPrompt(u8 taskId) switch (data[0]) { case 0: - MenuZeroFillScreen(); - MenuDrawTextWindow(0, 0, 20, 10); - MenuPrint(gSystemText_PresentTime, 1, 1); + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 20, 10); + Menu_PrintText(gSystemText_PresentTime, 1, 1); ResetRtcScreen_PrintTime( 1, 3, @@ -489,7 +478,7 @@ void Task_ShowResetRtcPrompt(u8 taskId) gLocalTime.hours, gLocalTime.minutes, gLocalTime.seconds); - MenuPrint(gSystemText_PreviousTime, 1, 5); + Menu_PrintText(gSystemText_PreviousTime, 1, 5); ResetRtcScreen_PrintTime( 1, 7, @@ -543,7 +532,7 @@ void Task_ResetRtcScreen(u8 taskId) case 2: if (gTasks[data[1]].isActive != TRUE) { - MenuZeroFillScreen(); + Menu_EraseScreen(); ResetRtcScreen_ShowMessage(gSystemText_PleaseResetTime); gLocalTime = gSaveBlock2.lastBerryTreeUpdate; data[1] = CreateTask(Task_ResetRtc_0, 80); @@ -576,7 +565,7 @@ void Task_ResetRtcScreen(u8 taskId) } break; case 4: - if (TrySavingData(0) == TRUE) + if (Save_WriteData(0) == SAVE_STATUS_OK) { ResetRtcScreen_ShowMessage(gSystemText_SaveCompleted); PlaySE(SE_PINPON); @@ -605,3 +594,319 @@ void Task_ResetRtcScreen(u8 taskId) } } } + +#if DEBUG + +__attribute__((naked)) +void debug_sub_806F8F8(void) +{ + asm("\ + push {lr}\n\ + ldr r0, ._131 @ CB2_InitResetRtcScreen\n\ + bl SetMainCallback2\n\ + pop {r0}\n\ + bx r0\n\ +._132:\n\ + .align 2, 0\n\ +._131:\n\ + .word CB2_InitResetRtcScreen+1"); +} + +__attribute__((naked)) +void debug_sub_806F908(u8 a) +{ + asm("\ + push {r4, r5, lr}\n\ + lsl r0, r0, #0x18\n\ + lsr r5, r0, #0x18\n\ + lsl r0, r5, #0x2\n\ + add r0, r0, r5\n\ + lsl r0, r0, #0x3\n\ + ldr r2, ._136 @ gTasks\n\ + add r4, r0, r2\n\ + mov r1, #0x0\n\ + ldsh r0, [r4, r1]\n\ + cmp r0, #0\n\ + beq ._133 @cond_branch\n\ + cmp r0, #0x1\n\ + beq ._134 @cond_branch\n\ + b ._141\n\ +._137:\n\ + .align 2, 0\n\ +._136:\n\ + .word gTasks+0x8\n\ +._133:\n\ + ldr r0, ._139 @ Task_ResetRtc_0\n\ + mov r1, #0x50\n\ + bl CreateTask\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + strh r0, [r4, #0x2]\n\ + ldrh r0, [r4]\n\ + add r0, r0, #0x1\n\ + strh r0, [r4]\n\ + b ._141\n\ +._140:\n\ + .align 2, 0\n\ +._139:\n\ + .word Task_ResetRtc_0+1\n\ +._134:\n\ + sub r2, r2, #0x8\n\ + mov r0, #0x2\n\ + ldsh r1, [r4, r0]\n\ + lsl r0, r1, #0x2\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x3\n\ + add r2, r0, r2\n\ + mov r1, #0x8\n\ + ldsh r0, [r2, r1]\n\ + cmp r0, #0\n\ + beq ._141 @cond_branch\n\ + mov r1, #0xa\n\ + ldsh r0, [r2, r1]\n\ + cmp r0, #0x1\n\ + bne ._142 @cond_branch\n\ + ldr r3, ._143 @ gLocalTime\n\ + mov r1, #0x0\n\ + ldsh r0, [r3, r1]\n\ + mov r1, #0x2\n\ + ldsb r1, [r3, r1]\n\ + mov r2, #0x3\n\ + ldsb r2, [r3, r2]\n\ + ldrb r3, [r3, #0x4]\n\ + lsl r3, r3, #0x18\n\ + asr r3, r3, #0x18\n\ + bl RtcCalcLocalTimeOffset\n\ +._142:\n\ + ldrb r0, [r4, #0x2]\n\ + bl DestroyTask\n\ + bl Menu_EraseScreen\n\ + bl ScriptContext2_Disable\n\ + add r0, r5, #0\n\ + bl DestroyTask\n\ +._141:\n\ + pop {r4, r5}\n\ + pop {r0}\n\ + bx r0\n\ +._144:\n\ + .align 2, 0\n\ +._143:\n\ + .word gLocalTime"); +} + +__attribute__((naked)) +void debug_sub_806F99C() +{ + asm("\ + push {lr}\n\ + bl RtcCalcLocalTime\n\ + ldr r0, ._145 @ debug_sub_806F908\n\ + mov r1, #0x50\n\ + bl CreateTask\n\ + bl ScriptContext2_Enable\n\ + pop {r0}\n\ + bx r0\n\ +._146:\n\ + .align 2, 0\n\ +._145:\n\ + .word debug_sub_806F908+1"); +} + +__attribute__((naked)) +void debug_sub_806F9B8() +{ + asm("\ + push {lr}\n\ + ldr r2, ._147 @ gLocalTime\n\ + ldr r0, ._147 + 4 @ gSaveBlock2\n\ + add r0, r0, #0xa0\n\ + ldr r1, [r0, #0x4]\n\ + ldr r0, [r0]\n\ + str r0, [r2]\n\ + str r1, [r2, #0x4]\n\ + ldr r0, ._147 + 8 @ debug_sub_806F908\n\ + mov r1, #0x50\n\ + bl CreateTask\n\ + bl ScriptContext2_Enable\n\ + pop {r0}\n\ + bx r0\n\ +._148:\n\ + .align 2, 0\n\ +._147:\n\ + .word gLocalTime\n\ + .word gSaveBlock2\n\ + .word debug_sub_806F908+1"); +} + +__attribute__((naked)) +void debug_sub_806F9E4() +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + mov r7, sl\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5, r6, r7}\n\ + lsl r0, r0, #0x18\n\ + lsr r7, r0, #0x18\n\ + lsl r0, r7, #0x2\n\ + add r0, r0, r7\n\ + lsl r0, r0, #0x3\n\ + ldr r1, ._153 @ gTasks\n\ + add r5, r0, r1\n\ + ldr r6, ._153 + 4 @ gStringVar4\n\ + mov r1, #0x0\n\ + ldsh r0, [r5, r1]\n\ + cmp r0, #0x1\n\ + beq ._149 @cond_branch\n\ + cmp r0, #0x1\n\ + bgt ._150 @cond_branch\n\ + cmp r0, #0\n\ + beq ._151 @cond_branch\n\ + b ._165\n\ +._154:\n\ + .align 2, 0\n\ +._153:\n\ + .word gTasks+0x8\n\ + .word gStringVar4\n\ +._150:\n\ + cmp r0, #0x2\n\ + beq ._155 @cond_branch\n\ + b ._165\n\ +._149:\n\ + mov r0, #0x0\n\ + mov r1, #0x9\n\ + mov r2, #0x1d\n\ + mov r3, #0x13\n\ + bl Menu_DrawStdWindowFrame\n\ + add r4, r6, #0\n\ + add r4, r4, #0x50\n\ + bl RtcGetErrorStatus\n\ + add r1, r0, #0\n\ + lsl r1, r1, #0x10\n\ + lsr r1, r1, #0x10\n\ + add r0, r4, #0\n\ + mov r2, #0x2\n\ + mov r3, #0x4\n\ + bl ConvertIntToHexStringN\n\ + add r0, r4, #0\n\ + mov r1, #0x2\n\ + mov r2, #0xa\n\ + bl Menu_PrintText\n\ + ldr r0, ._158 @ gUnknown_Debug_0839AE94\n\ + mov r1, #0xc\n\ + mov r2, #0xc\n\ + bl Menu_PrintText\n\ + ldr r0, ._158 + 4 @ gUnknown_Debug_0839AE99\n\ + mov r1, #0x14\n\ + mov r2, #0xc\n\ + bl Menu_PrintText\n\ + ldr r0, ._158 + 8 @ gUnknown_Debug_0839AEA7\n\ + mov r1, #0x1\n\ + mov r2, #0xe\n\ + bl Menu_PrintText\n\ + ldr r0, ._158 + 12 @ gUnknown_Debug_0839AE9D\n\ + mov r1, #0x1\n\ + mov r2, #0x10\n\ + bl Menu_PrintText\n\ +._151:\n\ + ldrh r0, [r5]\n\ + add r0, r0, #0x1\n\ + strh r0, [r5]\n\ + b ._165\n\ +._159:\n\ + .align 2, 0\n\ +._158:\n\ + .word gUnknown_Debug_0839AE94\n\ + .word gUnknown_Debug_0839AE99\n\ + .word gUnknown_Debug_0839AEA7\n\ + .word gUnknown_Debug_0839AE9D\n\ +._155:\n\ + bl RtcCalcLocalTime\n\ + add r0, r6, #0\n\ + bl FormatHexRtcTime\n\ + mov r2, #0x14\n\ + add r2, r2, r6\n\ + mov r9, r2\n\ + mov r0, r9\n\ + bl debug_sub_8009894\n\ + mov r0, #0x28\n\ + add r0, r0, r6\n\ + mov sl, r0\n\ + ldr r4, ._163 @ gLocalTime\n\ + mov r1, #0x2\n\ + ldsb r1, [r4, r1]\n\ + mov r2, #0x3\n\ + ldsb r2, [r4, r2]\n\ + mov r3, #0x4\n\ + ldsb r3, [r4, r3]\n\ + bl FormatDecimalTime\n\ + mov r1, #0x3c\n\ + add r1, r1, r6\n\ + mov r8, r1\n\ + mov r2, #0x0\n\ + ldsh r1, [r4, r2]\n\ + mov r0, r8\n\ + mov r2, #0x1\n\ + mov r3, #0x4\n\ + bl ConvertIntToDecimalStringN\n\ + ldr r0, ._163 + 4 @ gSaveBlock2\n\ + ldrb r0, [r0, #0x12]\n\ + cmp r0, #0\n\ + bne ._160 @cond_branch\n\ + add r0, r6, #0\n\ + mov r1, #0x14\n\ + mov r2, #0xe\n\ + bl Menu_PrintText\n\ + mov r0, r9\n\ + mov r1, #0xc\n\ + mov r2, #0xe\n\ + bl Menu_PrintText\n\ + mov r0, sl\n\ + mov r1, #0x14\n\ + mov r2, #0x10\n\ + bl Menu_PrintText\n\ + mov r0, r8\n\ + mov r1, #0xc\n\ + mov r2, #0x10\n\ + bl Menu_PrintText\n\ +._160:\n\ + ldrh r1, [r5, #0x2]\n\ + mov r2, #0x2\n\ + ldsh r0, [r5, r2]\n\ + cmp r0, #0x13\n\ + ble ._161 @cond_branch\n\ + add r0, r1, #1\n\ + strh r0, [r5, #0x2]\n\ + b ._165\n\ +._164:\n\ + .align 2, 0\n\ +._163:\n\ + .word gLocalTime\n\ + .word gSaveBlock2\n\ +._161:\n\ + ldr r0, ._166 @ gMain\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._165 @cond_branch\n\ + bl Menu_EraseScreen\n\ + add r0, r7, #0\n\ + bl DestroyTask\n\ + bl ScriptContext2_Disable\n\ +._165:\n\ + pop {r3, r4, r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov sl, r5\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._167:\n\ + .align 2, 0\n\ +._166:\n\ + .word gMain"); +} + +#endif
\ No newline at end of file diff --git a/src/engine/rtc.c b/src/engine/rtc.c index d73f943d2..5462298ed 100644 --- a/src/engine/rtc.c +++ b/src/engine/rtc.c @@ -268,6 +268,28 @@ void FormatHexDate(u8 *dest, s32 year, s32 month, s32 day) *dest = EOS; } +#if DEBUG + +void debug_sub_800987C(u8 *dest) +{ + FormatHexDate(dest, sRtc.year, sRtc.month, sRtc.day); +} + +void debug_sub_8009894(u8 *dest) +{ + u16 dayCount; + + dayCount = RtcGetDayCount(&sRtc); + ConvertIntToDecimalStringN(dest, dayCount, STR_CONV_MODE_RIGHT_ALIGN, 4); +} + +void debug_sub_80098B8(u8 *dest) +{ + ConvertIntToHexStringN(dest, sRtc.status, STR_CONV_MODE_LEADING_ZEROS, 2); +} + +#endif + void RtcCalcTimeDifference(struct SiiRtcInfo *rtc, struct Time *result, struct Time *t) { u16 days = RtcGetDayCount(rtc); @@ -347,3 +369,10 @@ u32 RtcGetMinuteCount() RtcGetInfo(&sRtc); return (24 * 60) * RtcGetDayCount(&sRtc) + 60 * sRtc.hour + sRtc.minute; } + +#if DEBUG +void debug_sub_8009A60() +{ + RtcGetRawInfo(&sRtc); +} +#endif diff --git a/src/engine/save.c b/src/engine/save.c index d5de2e408..0b7a3dd79 100644 --- a/src/engine/save.c +++ b/src/engine/save.c @@ -4,55 +4,132 @@ #include "save.h" #include "load_save.h" #include "overworld.h" +#include "pokemon.h" #include "save_failed_screen.h" #include "ewram.h" -#define GETVALIDSTATUSBITFIELD ((1 << ARRAY_COUNT(gSaveSectionLocations)) - 1) -#define GETCHUNKSIZE(chunk, n) ((sizeof(chunk) - (0xF80 * (n - 1))) >= 0xF80 ? 0xF80 : (sizeof(chunk) - (0xF80 * (n - 1)))) -#define GETBLOCKOFFSET(n) (0xF80 * (n - 1)) -#define TOTALNUMSECTORS ((ARRAY_COUNT(gSaveSectionLocations) * 2) + (ARRAY_COUNT(gHallOfFameSaveSectionLocations) * 2)) // there are 2 slots, so double each array count and get the sum. +#define FILE_SIGNATURE 0x08012025 // signature value to determine if a sector is in use -u16 gLastWrittenSector; -u32 gLastSaveCounter; +//#define TOTAL_FLASH_SECTORS ((ARRAY_COUNT(sSaveBlockChunks) * 2) + (ARRAY_COUNT(sHallOfFameChunks) * 2)) // there are 2 slots, so double each array count and get the sum. +#define TOTAL_FLASH_SECTORS 32 + +struct SaveBlockChunk +{ + u8 *data; + u16 size; +}; + +struct SaveSector +{ + u8 data[0xFF4]; + u16 id; + u16 checksum; + u32 signature; + u32 counter; +}; // size is 0x1000 + +// headless save section? +struct UnkSaveSection +{ + u8 data[0xFF4]; + u32 signature; +}; // size is 0xFF8 + +static u8 WriteSingleChunk(u16, const struct SaveBlockChunk *); +static u8 HandleWriteSectorNBytes(u8 sector, u8 *data, u16 size); +static u8 TryWriteSector(u8, u8 *); +static u32 RestoreSaveBackupVarsAndIncrement(const struct SaveBlockChunk *location); +static u32 RestoreSaveBackupVars(const struct SaveBlockChunk *location); +static u8 sub_812550C(u16 a1, const struct SaveBlockChunk *location); +static u8 sub_812556C(u16 a1, const struct SaveBlockChunk *location); +static u8 sub_81255B8(u16, const struct SaveBlockChunk *location); +static u8 WriteSomeFlashByteToPrevSector(u16 a1, const struct SaveBlockChunk *location); +static u8 WriteSomeFlashByte0x25ToPrevSector(u16 a1, const struct SaveBlockChunk *location); +static u8 sub_812587C(u16 a1, const struct SaveBlockChunk *location); +static u8 sub_81258BC(u16, const struct SaveBlockChunk *location); +static u8 GetSaveValidStatus(const struct SaveBlockChunk *location); +static u8 ReadSomeUnknownSectorAndVerify(u8 a1, u8 *data, u16 size); +static u8 DoReadFlashWholeSection(u8, struct SaveSector *); +static u16 CalculateChecksum(void *, u16); +bool8 unref_sub_8125F4C(struct UnkSaveSection *a1); +u8 unref_sub_8125FA0(void); +u8 unref_sub_8125FF0(u8 *data, u16 size); +u8 unref_sub_8126068(u8 sector, u8 *data, u32 size); +u8 unref_sub_8126080(u8 sector, u8 *data); + +// Sector num to begin writing save data. Sectors are rotated each time the game is saved. (possibly to avoid wear on flash memory?) +u16 gFirstSaveSector; +u32 gPrevSaveCounter; u16 gLastKnownGoodSector; u32 gDamagedSaveSectors; u32 gSaveCounter; -struct SaveSection *gFastSaveSection; // the pointer is in fast IWRAM but may sometimes point to the slower EWRAM. +struct SaveSector *gFastSaveSection; // the pointer is in fast IWRAM but may sometimes point to the slower EWRAM. u16 gUnknown_03005EB4; u16 gSaveFileStatus; u32 gGameContinueCallback; -extern struct PokemonStorage gPokemonStorage; - static EWRAM_DATA u32 gLastSaveSectorStatus = 0; // used but in an unferenced function, so unused -const struct SaveSectionLocation gSaveSectionLocations[] = -{ - {((u8 *) &gSaveBlock2) + GETBLOCKOFFSET(1), GETCHUNKSIZE(gSaveBlock2, 1)}, - {((u8 *) &gSaveBlock1) + GETBLOCKOFFSET(1), GETCHUNKSIZE(gSaveBlock1, 1)}, - {((u8 *) &gSaveBlock1) + GETBLOCKOFFSET(2), GETCHUNKSIZE(gSaveBlock1, 2)}, - {((u8 *) &gSaveBlock1) + GETBLOCKOFFSET(3), GETCHUNKSIZE(gSaveBlock1, 3)}, - {((u8 *) &gSaveBlock1) + GETBLOCKOFFSET(4), GETCHUNKSIZE(gSaveBlock1, 4)}, - {((u8 *) &gPokemonStorage) + GETBLOCKOFFSET(1), GETCHUNKSIZE(gPokemonStorage, 1)}, - {((u8 *) &gPokemonStorage) + GETBLOCKOFFSET(2), GETCHUNKSIZE(gPokemonStorage, 2)}, - {((u8 *) &gPokemonStorage) + GETBLOCKOFFSET(3), GETCHUNKSIZE(gPokemonStorage, 3)}, - {((u8 *) &gPokemonStorage) + GETBLOCKOFFSET(4), GETCHUNKSIZE(gPokemonStorage, 4)}, - {((u8 *) &gPokemonStorage) + GETBLOCKOFFSET(5), GETCHUNKSIZE(gPokemonStorage, 5)}, - {((u8 *) &gPokemonStorage) + GETBLOCKOFFSET(6), GETCHUNKSIZE(gPokemonStorage, 6)}, - {((u8 *) &gPokemonStorage) + GETBLOCKOFFSET(7), GETCHUNKSIZE(gPokemonStorage, 7)}, - {((u8 *) &gPokemonStorage) + GETBLOCKOFFSET(8), GETCHUNKSIZE(gPokemonStorage, 8)}, - {((u8 *) &gPokemonStorage) + GETBLOCKOFFSET(9), GETCHUNKSIZE(gPokemonStorage, 9)} +// Each 4 KiB flash sector contains 3968 bytes of actual data followed by a 128 byte footer +#define SECTOR_DATA_SIZE 3968 +#define SECTOR_FOOTER_SIZE 128 + +/* + * Sector Layout: + * + * Sectors 0 - 13: Save Slot 1 + * Sectors 14 - 27: Save Slot 2 + * Sectors 28 - 29: Hall of Fame + * Sectors 30 - 31: e-Reader battle tower data, maybe? + * + * There are two save slots for saving the player's game data. We alternate between + * them each time the game is saved, so that if the current save slot is corrupt, + * we can load the previous one. We also rotate the sectors in each save slot + * so that the same data is not always being written to the same sector. This + * might be done to reduce wear on the flash memory, but I'm not sure, since all + * 14 sectors get written anyway. + */ + +#define HALL_OF_FAME_SECTOR 28 + +#define NUM_SECTORS_PER_SAVE_SLOT 14 // Number of sectors occupied by a save slot +#define NUM_HALL_OF_FAME_SECTORS 2 + +// Divide save blocks into individual chunks to be written to flash sectors + +#define SAVEBLOCK_CHUNK(structure, chunkNum) \ +{ \ + (u8 *)&structure + chunkNum * SECTOR_DATA_SIZE, \ + min(sizeof(structure) - chunkNum * SECTOR_DATA_SIZE, SECTOR_DATA_SIZE) \ +} \ + +static const struct SaveBlockChunk sSaveBlockChunks[] = +{ + SAVEBLOCK_CHUNK(gSaveBlock2, 0), + + SAVEBLOCK_CHUNK(gSaveBlock1, 0), + SAVEBLOCK_CHUNK(gSaveBlock1, 1), + SAVEBLOCK_CHUNK(gSaveBlock1, 2), + SAVEBLOCK_CHUNK(gSaveBlock1, 3), + + SAVEBLOCK_CHUNK(gPokemonStorage, 0), + SAVEBLOCK_CHUNK(gPokemonStorage, 1), + SAVEBLOCK_CHUNK(gPokemonStorage, 2), + SAVEBLOCK_CHUNK(gPokemonStorage, 3), + SAVEBLOCK_CHUNK(gPokemonStorage, 4), + SAVEBLOCK_CHUNK(gPokemonStorage, 5), + SAVEBLOCK_CHUNK(gPokemonStorage, 6), + SAVEBLOCK_CHUNK(gPokemonStorage, 7), + SAVEBLOCK_CHUNK(gPokemonStorage, 8), }; -const struct SaveSectionLocation gHallOfFameSaveSectionLocations[] = +static const struct SaveBlockChunk sHallOfFameChunks[] = { - {((u8 *) eHallOfFame) + GETBLOCKOFFSET(1), GETCHUNKSIZE(struct HallOfFame, 1)}, // eHallOfFame is not a proper sym, so the struct must be used. - {((u8 *) eHallOfFame) + GETBLOCKOFFSET(2), GETCHUNKSIZE(struct HallOfFame, 2)} + SAVEBLOCK_CHUNK(*eHallOfFame, 0), + SAVEBLOCK_CHUNK(*eHallOfFame, 1), }; -const u8 gFlashSectors[] = { 0x1E, 0x1F }; - -void ClearSaveData(void) +void Save_EraseAllData(void) { u16 i; @@ -60,27 +137,34 @@ void ClearSaveData(void) EraseFlashSector(i); } -void ResetSaveCounters(void) +void Save_ResetSaveCounters(void) { gSaveCounter = 0; - gLastWrittenSector = 0; + gFirstSaveSector = 0; gDamagedSaveSectors = 0; } -bool32 SetDamagedSectorBits(u8 op, u8 bit) +enum +{ + SECTOR_DAMAGED, + SECTOR_OK, + SECTOR_CHECK, // unused +}; + +static bool32 SetSectorDamagedStatus(u8 op, u8 sectorNum) { bool32 retVal = FALSE; switch (op) { - case ENABLE: - gDamagedSaveSectors |= (1 << bit); + case SECTOR_DAMAGED: + gDamagedSaveSectors |= (1 << sectorNum); break; - case DISABLE: - gDamagedSaveSectors &= ~(1 << bit); + case SECTOR_OK: + gDamagedSaveSectors &= ~(1 << sectorNum); break; - case CHECK: // unused - if (gDamagedSaveSectors & (1 << bit)) + case SECTOR_CHECK: // unused + if (gDamagedSaveSectors & (1 << sectorNum)) retVal = TRUE; break; } @@ -88,163 +172,166 @@ bool32 SetDamagedSectorBits(u8 op, u8 bit) return retVal; } -u8 save_write_to_flash(u16 a1, const struct SaveSectionLocation *location) +// If chunkId is 0xFFFF, this function will write all of the chunks pointed to by 'chunks'. +// Otherwise, it will write a single chunk with the given 'chunkId'. +static u8 WriteSaveBlockChunks(u16 chunkId, const struct SaveBlockChunk *chunks) { u32 retVal; u16 i; gFastSaveSection = eSaveSection; - if (a1 != 0xFFFF) // for link + if (chunkId != 0xFFFF) // write single chunk { - retVal = HandleWriteSector(a1, location); + retVal = WriteSingleChunk(chunkId, chunks); } - else + else // write all chunks { - gLastKnownGoodSector = gLastWrittenSector; // backup the current written sector before attempting to write. - gLastSaveCounter = gSaveCounter; - gLastWrittenSector++; - gLastWrittenSector = gLastWrittenSector % ARRAY_COUNT(gSaveSectionLocations); + gLastKnownGoodSector = gFirstSaveSector; + gPrevSaveCounter = gSaveCounter; + gFirstSaveSector++; + gFirstSaveSector %= NUM_SECTORS_PER_SAVE_SLOT; gSaveCounter++; - retVal = 1; + retVal = SAVE_STATUS_OK; - for (i = 0; i < ARRAY_COUNT(gSaveSectionLocations); i++) - HandleWriteSector(i, location); + for (i = 0; i < NUM_SECTORS_PER_SAVE_SLOT; i++) + WriteSingleChunk(i, chunks); + // Check for any bad sectors if (gDamagedSaveSectors != 0) // skip the damaged sector. { - retVal = 0xFF; - gLastWrittenSector = gLastKnownGoodSector; - gSaveCounter = gLastSaveCounter; + retVal = SAVE_STATUS_ERROR; + gFirstSaveSector = gLastKnownGoodSector; + gSaveCounter = gPrevSaveCounter; } } return retVal; } -u8 HandleWriteSector(u16 a1, const struct SaveSectionLocation *location) +static u8 WriteSingleChunk(u16 chunkId, const struct SaveBlockChunk *chunks) { u16 i; - u16 sector; - u8 *data; - u16 size; + u16 sectorNum; + u8 *chunkData; + u16 chunkSize; - sector = a1 + gLastWrittenSector; - sector %= ARRAY_COUNT(gSaveSectionLocations); - sector += ARRAY_COUNT(gSaveSectionLocations) * (gSaveCounter % 2); + // select sector number + sectorNum = chunkId + gFirstSaveSector; + sectorNum %= NUM_SECTORS_PER_SAVE_SLOT; + // select save slot + sectorNum += NUM_SECTORS_PER_SAVE_SLOT * (gSaveCounter % 2); - data = location[a1].data; - size = location[a1].size; + chunkData = chunks[chunkId].data; + chunkSize = chunks[chunkId].size; // clear save section. - for (i = 0; i < sizeof(struct SaveSection); i++) - ((char *)gFastSaveSection)[i] = 0; + for (i = 0; i < sizeof(struct SaveSector); i++) + ((u8 *)gFastSaveSection)[i] = 0; - gFastSaveSection->id = a1; - gFastSaveSection->security = UNKNOWN_CHECK_VALUE; + gFastSaveSection->id = chunkId; + gFastSaveSection->signature = FILE_SIGNATURE; gFastSaveSection->counter = gSaveCounter; + for (i = 0; i < chunkSize; i++) + gFastSaveSection->data[i] = chunkData[i]; + gFastSaveSection->checksum = CalculateChecksum(chunkData, chunkSize); - for (i = 0; i < size; i++) - gFastSaveSection->data[i] = data[i]; - - gFastSaveSection->checksum = CalculateChecksum(data, size); - return TryWriteSector(sector, gFastSaveSection->data); + return TryWriteSector(sectorNum, gFastSaveSection->data); } -u8 HandleWriteSectorNBytes(u8 sector, u8 *data, u16 size) +static u8 HandleWriteSectorNBytes(u8 sectorNum, u8 *data, u16 size) { u16 i; - struct SaveSection *section = eSaveSection; + struct SaveSector *section = eSaveSection; - for (i = 0; i < sizeof(struct SaveSection); i++) + for (i = 0; i < sizeof(struct SaveSector); i++) ((char *)section)[i] = 0; - section->security = UNKNOWN_CHECK_VALUE; - + section->signature = FILE_SIGNATURE; for (i = 0; i < size; i++) section->data[i] = data[i]; - section->id = CalculateChecksum(data, size); // though this appears to be incorrect, it might be some sector checksum instead of a whole save checksum and only appears to be relevent to HOF data, if used. - return TryWriteSector(sector, section->data); + + return TryWriteSector(sectorNum, section->data); } -u8 TryWriteSector(u8 sector, u8 *data) +static u8 TryWriteSector(u8 sectorNum, u8 *data) { - if (ProgramFlashSectorAndVerify(sector, data) != 0) // is damaged? + if (ProgramFlashSectorAndVerify(sectorNum, data) != 0) // is damaged? { - SetDamagedSectorBits(ENABLE, sector); // set damaged sector bits. - return 0xFF; + SetSectorDamagedStatus(SECTOR_DAMAGED, sectorNum); // set damaged sector bits. + return SAVE_STATUS_ERROR; } else { - SetDamagedSectorBits(DISABLE, sector); // unset damaged sector bits. it's safe now. - return 1; + SetSectorDamagedStatus(SECTOR_OK, sectorNum); // unset damaged sector bits. it's safe now. + return SAVE_STATUS_OK; } } -u32 RestoreSaveBackupVarsAndIncrement(const struct SaveSectionLocation *location) // location is unused +static u32 RestoreSaveBackupVarsAndIncrement(const struct SaveBlockChunk *chunk) // chunk is unused { gFastSaveSection = eSaveSection; - gLastKnownGoodSector = gLastWrittenSector; - gLastSaveCounter = gSaveCounter; - gLastWrittenSector++; - gLastWrittenSector = gLastWrittenSector % ARRAY_COUNT(gSaveSectionLocations); + gLastKnownGoodSector = gFirstSaveSector; + gPrevSaveCounter = gSaveCounter; + gFirstSaveSector++; + gFirstSaveSector %= NUM_SECTORS_PER_SAVE_SLOT; gSaveCounter++; gUnknown_03005EB4 = 0; gDamagedSaveSectors = 0; return 0; } -u32 RestoreSaveBackupVars(const struct SaveSectionLocation *location) // only ever called once, and gSaveBlock2 is passed to this function. location is unused +static u32 RestoreSaveBackupVars(const struct SaveBlockChunk *chunk) // chunk is unused { gFastSaveSection = eSaveSection; - gLastKnownGoodSector = gLastWrittenSector; - gLastSaveCounter = gSaveCounter; + gLastKnownGoodSector = gFirstSaveSector; + gPrevSaveCounter = gSaveCounter; gUnknown_03005EB4 = 0; gDamagedSaveSectors = 0; return 0; } -u8 sub_812550C(u16 a1, const struct SaveSectionLocation *location) +static u8 sub_812550C(u16 a1, const struct SaveBlockChunk *chunk) { u8 retVal; if (gUnknown_03005EB4 < a1 - 1) { - retVal = 1; - HandleWriteSector(gUnknown_03005EB4, location); + retVal = SAVE_STATUS_OK; + WriteSingleChunk(gUnknown_03005EB4, chunk); gUnknown_03005EB4++; if (gDamagedSaveSectors) { - retVal = 0xFF; - gLastWrittenSector = gLastKnownGoodSector; - gSaveCounter = gLastSaveCounter; + retVal = SAVE_STATUS_ERROR; + gFirstSaveSector = gLastKnownGoodSector; + gSaveCounter = gPrevSaveCounter; } } else { - retVal = 0xFF; + retVal = SAVE_STATUS_ERROR; } return retVal; } -u8 sub_812556C(u16 a1, const struct SaveSectionLocation *location) +static u8 sub_812556C(u16 a1, const struct SaveBlockChunk *chunk) { - u8 retVal = 1; + u8 retVal = SAVE_STATUS_OK; - sub_81255B8(a1 - 1, location); + sub_81255B8(a1 - 1, chunk); if (gDamagedSaveSectors) { - retVal = 0xFF; - gLastWrittenSector = gLastKnownGoodSector; - gSaveCounter = gLastSaveCounter; + retVal = SAVE_STATUS_ERROR; + gFirstSaveSector = gLastKnownGoodSector; + gSaveCounter = gPrevSaveCounter; } return retVal; } -u8 sub_81255B8(u16 a1, const struct SaveSectionLocation *location) +static u8 sub_81255B8(u16 chunkId, const struct SaveBlockChunk *chunks) { u16 i; u16 sector; @@ -252,19 +339,21 @@ u8 sub_81255B8(u16 a1, const struct SaveSectionLocation *location) u16 size; u8 status; - sector = a1 + gLastWrittenSector; - sector %= ARRAY_COUNT(gSaveSectionLocations); - sector += ARRAY_COUNT(gSaveSectionLocations) * (gSaveCounter % 2); + // select sector number + sector = chunkId + gFirstSaveSector; + sector %= NUM_SECTORS_PER_SAVE_SLOT; + // select save slot + sector += NUM_SECTORS_PER_SAVE_SLOT * (gSaveCounter % 2); - data = location[a1].data; - size = location[a1].size; + data = chunks[chunkId].data; + size = chunks[chunkId].size; // clear temp save section. - for (i = 0; i < sizeof(struct SaveSection); i++) + for (i = 0; i < sizeof(struct SaveSector); i++) ((char *)gFastSaveSection)[i] = 0; - gFastSaveSection->id = a1; - gFastSaveSection->security = UNKNOWN_CHECK_VALUE; + gFastSaveSection->id = chunkId; + gFastSaveSection->signature = FILE_SIGNATURE; gFastSaveSection->counter = gSaveCounter; // set temp section's data. @@ -276,275 +365,275 @@ u8 sub_81255B8(u16 a1, const struct SaveSectionLocation *location) EraseFlashSector(sector); - status = 1; + status = SAVE_STATUS_OK; for (i = 0; i < sizeof(struct UnkSaveSection); i++) { if (ProgramFlashByte(sector, i, gFastSaveSection->data[i])) { - status = 0xFF; + status = SAVE_STATUS_ERROR; break; } } - if (status == 0xFF) + if (status == SAVE_STATUS_ERROR) { - SetDamagedSectorBits(ENABLE, sector); - return 0xFF; + SetSectorDamagedStatus(SECTOR_DAMAGED, sector); + return SAVE_STATUS_ERROR; } else { - status = 1; + status = SAVE_STATUS_OK; for (i = 0; i < 7; i++) { if (ProgramFlashByte(sector, 0xFF9 + i, ((u8 *)gFastSaveSection)[0xFF9 + i])) { - status = 0xFF; + status = SAVE_STATUS_ERROR; break; } } - if (status == 0xFF) + if (status == SAVE_STATUS_ERROR) { - SetDamagedSectorBits(ENABLE, sector); - return 0xFF; + SetSectorDamagedStatus(SECTOR_DAMAGED, sector); + return SAVE_STATUS_ERROR; } else { - SetDamagedSectorBits(DISABLE, sector); - return 1; + SetSectorDamagedStatus(SECTOR_OK, sector); + return SAVE_STATUS_OK; } } } -u8 sub_8125758(u16 a1, const struct SaveSectionLocation *location) +static u8 WriteSomeFlashByteToPrevSector(u16 a1, const struct SaveBlockChunk *chunk) { u16 sector; - sector = a1 + gLastWrittenSector - 1; - sector %= ARRAY_COUNT(gSaveSectionLocations); - sector += ARRAY_COUNT(gSaveSectionLocations) * (gSaveCounter % 2); + // select sector number + sector = a1 + gFirstSaveSector - 1; + sector %= NUM_SECTORS_PER_SAVE_SLOT; + // select save slot + sector += NUM_SECTORS_PER_SAVE_SLOT * (gSaveCounter % 2); if (ProgramFlashByte(sector, sizeof(struct UnkSaveSection), ((u8 *)gFastSaveSection)[sizeof(struct UnkSaveSection)])) { // sector is damaged, so enable the bit in gDamagedSaveSectors and restore the last written sector and save counter. - SetDamagedSectorBits(ENABLE, sector); - gLastWrittenSector = gLastKnownGoodSector; - gSaveCounter = gLastSaveCounter; - return 0xFF; + SetSectorDamagedStatus(SECTOR_DAMAGED, sector); + gFirstSaveSector = gLastKnownGoodSector; + gSaveCounter = gPrevSaveCounter; + return SAVE_STATUS_ERROR; } else { - SetDamagedSectorBits(DISABLE, sector); - return 1; + SetSectorDamagedStatus(SECTOR_OK, sector); + return SAVE_STATUS_OK; } } -u8 sub_81257F0(u16 a1, const struct SaveSectionLocation *location) +static u8 WriteSomeFlashByte0x25ToPrevSector(u16 a1, const struct SaveBlockChunk *chunk) { u16 sector; - sector = a1 + gLastWrittenSector - 1; - sector %= ARRAY_COUNT(gSaveSectionLocations); - sector += ARRAY_COUNT(gSaveSectionLocations) * (gSaveCounter % 2); + sector = a1 + gFirstSaveSector - 1; + sector %= NUM_SECTORS_PER_SAVE_SLOT; + sector += NUM_SECTORS_PER_SAVE_SLOT * (gSaveCounter % 2); if (ProgramFlashByte(sector, sizeof(struct UnkSaveSection), 0x25)) { // sector is damaged, so enable the bit in gDamagedSaveSectors and restore the last written sector and save counter. - SetDamagedSectorBits(ENABLE, sector); - gLastWrittenSector = gLastKnownGoodSector; - gSaveCounter = gLastSaveCounter; - return 0xFF; + SetSectorDamagedStatus(SECTOR_DAMAGED, sector); + gFirstSaveSector = gLastKnownGoodSector; + gSaveCounter = gPrevSaveCounter; + return SAVE_STATUS_ERROR; } else { - SetDamagedSectorBits(DISABLE, sector); - return 1; + SetSectorDamagedStatus(SECTOR_OK, sector); + return SAVE_STATUS_OK; } } -u8 sub_812587C(u16 a1, const struct SaveSectionLocation *location) +static u8 sub_812587C(u16 a1, const struct SaveBlockChunk *chunk) { u8 retVal; gFastSaveSection = eSaveSection; if (a1 != 0xFFFF) { - retVal = 0xFF; + retVal = SAVE_STATUS_ERROR; } else { - retVal = GetSaveValidStatus(location); - sub_81258BC(0xFFFF, location); + retVal = GetSaveValidStatus(chunk); + sub_81258BC(0xFFFF, chunk); } return retVal; } -u8 sub_81258BC(u16 a1, const struct SaveSectionLocation *location) +static u8 sub_81258BC(u16 a1, const struct SaveBlockChunk *chunks) { u16 i; u16 checksum; - u16 v3 = ARRAY_COUNT(gSaveSectionLocations) * (gSaveCounter % 2); + u16 sector = NUM_SECTORS_PER_SAVE_SLOT * (gSaveCounter % 2); u16 id; - for (i = 0; i < ARRAY_COUNT(gSaveSectionLocations); i++) + for (i = 0; i < NUM_SECTORS_PER_SAVE_SLOT; i++) { - DoReadFlashWholeSection(i + v3, gFastSaveSection); + DoReadFlashWholeSection(i + sector, gFastSaveSection); id = gFastSaveSection->id; if (id == 0) - gLastWrittenSector = i; - checksum = CalculateChecksum(gFastSaveSection->data, location[id].size); - if (gFastSaveSection->security == UNKNOWN_CHECK_VALUE + gFirstSaveSector = i; + checksum = CalculateChecksum(gFastSaveSection->data, chunks[id].size); + if (gFastSaveSection->signature == FILE_SIGNATURE && gFastSaveSection->checksum == checksum) { u16 j; - for (j = 0; j < location[id].size; j++) - location[id].data[j] = gFastSaveSection->data[j]; + for (j = 0; j < chunks[id].size; j++) + chunks[id].data[j] = gFastSaveSection->data[j]; } } return 1; } -u8 GetSaveValidStatus(const struct SaveSectionLocation *location) +static u8 GetSaveValidStatus(const struct SaveBlockChunk *chunks) { - u16 i; + u16 sector; + bool8 signatureValid; u16 checksum; - u32 saveSlot1Counter = 0; - u32 saveSlot2Counter = 0; - u32 slotCheckField = 0; - bool8 securityPassed = FALSE; - u8 saveSlot1Status; - u8 saveSlot2Status; + u32 slot1saveCounter = 0; + u32 slot2saveCounter = 0; + u8 slot1Status; + u8 slot2Status; + u32 validSectors; + const u32 ALL_SECTORS = (1 << NUM_SECTORS_PER_SAVE_SLOT) - 1; // bitmask of all saveblock sectors // check save slot 1. - for (i = 0; i < ARRAY_COUNT(gSaveSectionLocations); i++) + validSectors = 0; + signatureValid = FALSE; + for (sector = 0; sector < NUM_SECTORS_PER_SAVE_SLOT; sector++) { - DoReadFlashWholeSection(i, gFastSaveSection); - if (gFastSaveSection->security == UNKNOWN_CHECK_VALUE) + DoReadFlashWholeSection(sector, gFastSaveSection); + if (gFastSaveSection->signature == FILE_SIGNATURE) { - securityPassed = TRUE; - checksum = CalculateChecksum(gFastSaveSection->data, location[gFastSaveSection->id].size); + signatureValid = TRUE; + checksum = CalculateChecksum(gFastSaveSection->data, chunks[gFastSaveSection->id].size); if (gFastSaveSection->checksum == checksum) { - saveSlot1Counter = gFastSaveSection->counter; - slotCheckField |= 1 << gFastSaveSection->id; + slot1saveCounter = gFastSaveSection->counter; + validSectors |= 1 << gFastSaveSection->id; } } } - if (securityPassed) + if (signatureValid) { - if (slotCheckField == GETVALIDSTATUSBITFIELD) - saveSlot1Status = 1; + if (validSectors == ALL_SECTORS) + slot1Status = SAVE_STATUS_OK; else - saveSlot1Status = 255; + slot1Status = SAVE_STATUS_ERROR; } else { - saveSlot1Status = 0; + slot1Status = SAVE_STATUS_EMPTY; } - slotCheckField = 0; - securityPassed = FALSE; - // check save slot 2. - for (i = 0; i < ARRAY_COUNT(gSaveSectionLocations); i++) + validSectors = 0; + signatureValid = FALSE; + for (sector = 0; sector < NUM_SECTORS_PER_SAVE_SLOT; sector++) { - DoReadFlashWholeSection(i + ARRAY_COUNT(gSaveSectionLocations), gFastSaveSection); - if (gFastSaveSection->security == UNKNOWN_CHECK_VALUE) + DoReadFlashWholeSection(NUM_SECTORS_PER_SAVE_SLOT + sector, gFastSaveSection); + if (gFastSaveSection->signature == FILE_SIGNATURE) { - securityPassed = TRUE; - checksum = CalculateChecksum(gFastSaveSection->data, location[gFastSaveSection->id].size); + signatureValid = TRUE; + checksum = CalculateChecksum(gFastSaveSection->data, chunks[gFastSaveSection->id].size); if (gFastSaveSection->checksum == checksum) { - saveSlot2Counter = gFastSaveSection->counter; - slotCheckField |= 1 << gFastSaveSection->id; + slot2saveCounter = gFastSaveSection->counter; + validSectors |= 1 << gFastSaveSection->id; } } } - if (securityPassed) + if (signatureValid) { - if (slotCheckField == GETVALIDSTATUSBITFIELD) - saveSlot2Status = 1; + if (validSectors == ALL_SECTORS) + slot2Status = SAVE_STATUS_OK; else - saveSlot2Status = 255; + slot2Status = SAVE_STATUS_ERROR; } else { - saveSlot2Status = 0; + slot2Status = SAVE_STATUS_EMPTY; } - if (saveSlot1Status == 1 && saveSlot2Status == 1) + if (slot1Status == SAVE_STATUS_OK && slot2Status == SAVE_STATUS_OK) { - if ((saveSlot1Counter == -1 && saveSlot2Counter == 0) || (saveSlot1Counter == 0 && saveSlot2Counter == -1)) + // Choose counter of the most recent save file + if ((slot1saveCounter == -1 && slot2saveCounter == 0) || (slot1saveCounter == 0 && slot2saveCounter == -1)) { - if ((unsigned)(saveSlot1Counter + 1) < (unsigned)(saveSlot2Counter + 1)) - { - gSaveCounter = saveSlot2Counter; - } + if ((unsigned)(slot1saveCounter + 1) < (unsigned)(slot2saveCounter + 1)) + gSaveCounter = slot2saveCounter; else - { - gSaveCounter = saveSlot1Counter; - } + gSaveCounter = slot1saveCounter; } else { - if (saveSlot1Counter < saveSlot2Counter) - { - gSaveCounter = saveSlot2Counter; - } + if (slot1saveCounter < slot2saveCounter) + gSaveCounter = slot2saveCounter; else - { - gSaveCounter = saveSlot1Counter; - } + gSaveCounter = slot1saveCounter; } - return 1; + return SAVE_STATUS_OK; } - if (saveSlot1Status == 1) + if (slot1Status == SAVE_STATUS_OK) { - gSaveCounter = saveSlot1Counter; - if (saveSlot2Status == 255) - return 255; - return 1; + gSaveCounter = slot1saveCounter; + if (slot2Status == SAVE_STATUS_ERROR) + return SAVE_STATUS_ERROR; + else + return SAVE_STATUS_OK; } - if (saveSlot2Status == 1) + if (slot2Status == SAVE_STATUS_OK) { - gSaveCounter = saveSlot2Counter; - if (saveSlot1Status == 255) - return 255; - return 1; + gSaveCounter = slot2saveCounter; + if (slot1Status == SAVE_STATUS_ERROR) + return SAVE_STATUS_ERROR; + else + return SAVE_STATUS_OK; } - if (saveSlot1Status == 0 && saveSlot2Status == 0) + if (slot1Status == SAVE_STATUS_EMPTY && slot2Status == SAVE_STATUS_EMPTY) { gSaveCounter = 0; - gLastWrittenSector = 0; - return 0; + gFirstSaveSector = 0; + return SAVE_STATUS_EMPTY; } gSaveCounter = 0; - gLastWrittenSector = 0; + gFirstSaveSector = 0; return 2; } -u8 sub_8125B88(u8 a1, u8 *data, u16 size) +static u8 ReadSomeUnknownSectorAndVerify(u8 sector, u8 *data, u16 size) { u16 i; - struct SaveSection *section = eSaveSection; - DoReadFlashWholeSection(a1, section); - if (section->security == UNKNOWN_CHECK_VALUE) + struct SaveSector *section = eSaveSection; + + DoReadFlashWholeSection(sector, section); + if (section->signature == FILE_SIGNATURE) { u16 checksum = CalculateChecksum(section->data, size); if (section->id == checksum) { for (i = 0; i < size; i++) data[i] = section->data[i]; - return 1; + return SAVE_STATUS_OK; } else { @@ -553,17 +642,17 @@ u8 sub_8125B88(u8 a1, u8 *data, u16 size) } else { - return 0; + return SAVE_STATUS_EMPTY; } } -u8 DoReadFlashWholeSection(u8 sector, struct SaveSection *section) +static u8 DoReadFlashWholeSection(u8 sector, struct SaveSector *section) { - ReadFlash(sector, 0, section->data, sizeof(struct SaveSection)); + ReadFlash(sector, 0, section->data, sizeof(struct SaveSector)); return 1; } -u16 CalculateChecksum(void *data, u16 size) +static u16 CalculateChecksum(void *data, u16 size) { u16 i; u32 checksum = 0; @@ -574,55 +663,97 @@ u16 CalculateChecksum(void *data, u16 size) return ((checksum >> 16) + checksum); } -u8 HandleSavingData(u8 saveType) +#if DEBUG +void sub_813B79C(void) +{ + struct SaveSector *sbSector; + struct SaveSector *hofSector; + const struct SaveBlockChunk *sbChunks; + const struct SaveBlockChunk *hofChunks; + u16 i; + + sbSector = eSaveSection; + sbChunks = sSaveBlockChunks; + for (i = 0; i < NUM_SECTORS_PER_SAVE_SLOT * 2; i++) + { + DoReadFlashWholeSection(i, sbSector); + sbSector->checksum = CalculateChecksum(sbSector, sbChunks[sbSector->id].size); + ProgramFlashSectorAndVerify(i, sbSector->data); + } + + hofSector = eSaveSection; + hofChunks = sHallOfFameChunks; + for (i = 0; i < NUM_HALL_OF_FAME_SECTORS; i++) + { + DoReadFlashWholeSection(HALL_OF_FAME_SECTOR + i, hofSector); + hofSector->id = CalculateChecksum(hofSector, hofChunks[i].size); // why id? + ProgramFlashSectorAndVerify(HALL_OF_FAME_SECTOR + i, hofSector->data); + } +} +#endif + +u8 Save_WriteDataInternal(u8 saveType) { u8 i; + switch (saveType) { - case HOF_DELETE_SAVE: // deletes HOF before overwriting HOF completely. unused - for (i = (ARRAY_COUNT(gSaveSectionLocations) * 2 + 0); i < TOTALNUMSECTORS; i++) + case SAVE_HALL_OF_FAME_ERASE_BEFORE: // wipes all hall of fame data, then saves hall of fame. unused + for (i = HALL_OF_FAME_SECTOR; i < TOTAL_FLASH_SECTORS; i++) EraseFlashSector(i); - case HOF_SAVE: // hall of fame. - if (GetGameStat(10) < 999) - IncrementGameStat(10); - for (i = 0; i < ARRAY_COUNT(gHallOfFameSaveSectionLocations); i++) - HandleWriteSectorNBytes((ARRAY_COUNT(gSaveSectionLocations) * 2 + 0) + i, gHallOfFameSaveSectionLocations[i].data, gHallOfFameSaveSectionLocations[i].size); + // fall through + case SAVE_HALL_OF_FAME: // hall of fame. + if (GetGameStat(GAME_STAT_ENTERED_HOF) < 999) + IncrementGameStat(GAME_STAT_ENTERED_HOF); + for (i = 0; i < NUM_HALL_OF_FAME_SECTORS; i++) + HandleWriteSectorNBytes(HALL_OF_FAME_SECTOR + i, sHallOfFameChunks[i].data, sHallOfFameChunks[i].size); SaveSerializedGame(); - save_write_to_flash(0xFFFF, gSaveSectionLocations); + WriteSaveBlockChunks(0xFFFF, sSaveBlockChunks); break; - case NORMAL_SAVE: // normal save. also called by overwriting your own save. + case SAVE_NORMAL: // normal save. also called by overwriting your own save. default: SaveSerializedGame(); - save_write_to_flash(0xFFFF, gSaveSectionLocations); + WriteSaveBlockChunks(0xFFFF, sSaveBlockChunks); break; - case LINK_SAVE: // link save. updates only gSaveBlock1 and gSaveBlock2. + case SAVE_LINK: // link save. updates only gSaveBlock1 and gSaveBlock2. SaveSerializedGame(); for (i = 0; i < 5; i++) - save_write_to_flash(i, gSaveSectionLocations); + WriteSaveBlockChunks(i, sSaveBlockChunks); break; - case EREADER_SAVE: // used in mossdeep "game corner" before/after battling old man e-reader trainer + case SAVE_EREADER: // used in mossdeep "game corner" before/after battling old man e-reader trainer SaveSerializedGame(); - save_write_to_flash(0, gSaveSectionLocations); + WriteSaveBlockChunks(0, sSaveBlockChunks); break; - case DIFFERENT_FILE_SAVE: // there is a different file, so erase the file and overwrite it completely. - for (i = (ARRAY_COUNT(gSaveSectionLocations) * 2 + 0); i < TOTALNUMSECTORS; i++) - EraseFlashSector(i); // erase HOF. + case SAVE_OVERWRITE_DIFFERENT_FILE: // there is a different file, so overwrite it completely. + // Erase Hall of Fame. + for (i = HALL_OF_FAME_SECTOR; i < TOTAL_FLASH_SECTORS; i++) + EraseFlashSector(i); SaveSerializedGame(); - save_write_to_flash(0xFFFF, gSaveSectionLocations); + WriteSaveBlockChunks(0xFFFF, sSaveBlockChunks); break; } return 0; } -u8 TrySavingData(u8 saveType) // TrySave +#if DEBUG +extern u32 gUnknown_Debug_03004BD0; +#endif + +u8 Save_WriteData(u8 saveType) // TrySave { if (gFlashMemoryPresent != TRUE) - return 0xFF; - HandleSavingData(saveType); - if (!gDamagedSaveSectors) - return 1; + return SAVE_STATUS_ERROR; + + Save_WriteDataInternal(saveType); + if (!gDamagedSaveSectors +#if DEBUG + && gUnknown_Debug_03004BD0 == 0 +#endif + ) + return SAVE_STATUS_OK; + DoSaveFailedScreen(saveType); - return 0xFF; + return SAVE_STATUS_ERROR; } u8 sub_8125D80(void) // trade.s save @@ -630,16 +761,16 @@ u8 sub_8125D80(void) // trade.s save if (gFlashMemoryPresent != TRUE) return 1; SaveSerializedGame(); - RestoreSaveBackupVarsAndIncrement(gSaveSectionLocations); + RestoreSaveBackupVarsAndIncrement(sSaveBlockChunks); return 0; } bool8 sub_8125DA8(void) // trade.s save { - u8 retVal = sub_812550C(ARRAY_COUNT(gSaveSectionLocations), gSaveSectionLocations); + u8 retVal = sub_812550C(ARRAY_COUNT(sSaveBlockChunks), sSaveBlockChunks); if (gDamagedSaveSectors) DoSaveFailedScreen(0); - if (retVal == 0xFF) + if (retVal == SAVE_STATUS_ERROR) return 1; else return 0; @@ -647,7 +778,7 @@ bool8 sub_8125DA8(void) // trade.s save u8 sub_8125DDC(void) // trade.s save { - sub_812556C(ARRAY_COUNT(gSaveSectionLocations), gSaveSectionLocations); + sub_812556C(ARRAY_COUNT(sSaveBlockChunks), sSaveBlockChunks); if (gDamagedSaveSectors) DoSaveFailedScreen(0); return 0; @@ -655,7 +786,7 @@ u8 sub_8125DDC(void) // trade.s save u8 sub_8125E04(void) // trade.s save { - sub_8125758(ARRAY_COUNT(gSaveSectionLocations), gSaveSectionLocations); + WriteSomeFlashByteToPrevSector(ARRAY_COUNT(sSaveBlockChunks), sSaveBlockChunks); if (gDamagedSaveSectors) DoSaveFailedScreen(0); return 0; @@ -667,23 +798,24 @@ u8 sub_8125E2C(void) return 1; SaveSerializedGame(); - RestoreSaveBackupVars(gSaveSectionLocations); - sub_812556C(gUnknown_03005EB4 + 1, gSaveSectionLocations); + RestoreSaveBackupVars(sSaveBlockChunks); + sub_812556C(gUnknown_03005EB4 + 1, sSaveBlockChunks); return 0; } +// something to do with multiplayer. Possibly record mizing? bool8 sub_8125E6C(void) { u8 retVal = FALSE; u16 val = ++gUnknown_03005EB4; if (val <= 4) { - sub_812556C(gUnknown_03005EB4 + 1, gSaveSectionLocations); - sub_81257F0(val, gSaveSectionLocations); + sub_812556C(gUnknown_03005EB4 + 1, sSaveBlockChunks); + WriteSomeFlashByte0x25ToPrevSector(val, sSaveBlockChunks); } else { - sub_81257F0(val, gSaveSectionLocations); + WriteSomeFlashByte0x25ToPrevSector(val, sSaveBlockChunks); retVal = TRUE; } if (gDamagedSaveSectors) @@ -691,46 +823,48 @@ bool8 sub_8125E6C(void) return retVal; } -u8 sub_8125EC8(u8 a1) +u8 Save_LoadGameData(u8 saveType) { u8 result; if (gFlashMemoryPresent != TRUE) { - gSaveFileStatus = 4; - return 0xFF; + gSaveFileStatus = SAVE_STATUS_NO_FLASH; + return SAVE_STATUS_ERROR; } - switch (a1) + switch (saveType) { - case 0: + case SAVE_NORMAL: default: - result = sub_812587C(0xFFFF, gSaveSectionLocations); + result = sub_812587C(0xFFFF, sSaveBlockChunks); LoadSerializedGame(); gSaveFileStatus = result; gGameContinueCallback = 0; break; - case 3: - result = sub_8125B88((ARRAY_COUNT(gSaveSectionLocations) * 2 + 0), gHallOfFameSaveSectionLocations[0].data, gHallOfFameSaveSectionLocations[0].size); - if (result == 1) - result = sub_8125B88((ARRAY_COUNT(gSaveSectionLocations) * 2 + 1), gHallOfFameSaveSectionLocations[1].data, gHallOfFameSaveSectionLocations[1].size); + case SAVE_HALL_OF_FAME: + result = ReadSomeUnknownSectorAndVerify(HALL_OF_FAME_SECTOR, sHallOfFameChunks[0].data, sHallOfFameChunks[0].size); + if (result == SAVE_STATUS_OK) + result = ReadSomeUnknownSectorAndVerify(HALL_OF_FAME_SECTOR + 1, sHallOfFameChunks[1].data, sHallOfFameChunks[1].size); break; } return result; } +const u8 sUnusedFlashSectors[] = { 30, 31 }; + bool8 unref_sub_8125F4C(struct UnkSaveSection *a1) { u16 i; char *raw = (char *)a1; - for (i = 0; i < sizeof(struct SaveSection); i++) + for (i = 0; i < sizeof(struct SaveSector); i++) raw[i] = 0; - ReadFlash(gFlashSectors[0], 0, a1->data, 4096); + ReadFlash(sUnusedFlashSectors[0], 0, a1->data, 4096); - if (a1->security != UNKNOWN_CHECK_VALUE) + if (a1->signature != FILE_SIGNATURE) return FALSE; return TRUE; @@ -739,22 +873,22 @@ bool8 unref_sub_8125F4C(struct UnkSaveSection *a1) u8 unref_sub_8125FA0(void) { u16 i; - u8 v0 = TrySavingData(0); + u8 status = Save_WriteData(SAVE_NORMAL); for (i = 0; i < 2; i++) - EraseFlashSector(gFlashSectors[i]); + EraseFlashSector(sUnusedFlashSectors[i]); - if (v0 == 255) + if (status == SAVE_STATUS_ERROR) { return 3; } - else if (v0 == 3) + else if (status == 3) { return 2; } else { - sub_8125EC8(0); + Save_LoadGameData(SAVE_NORMAL); return 1; } } @@ -764,32 +898,32 @@ u8 unref_sub_8125FF0(u8 *data, u16 size) u16 i; struct UnkSaveSection *section = (struct UnkSaveSection *)eSaveSection; - for (i = 0; i < sizeof(struct SaveSection); i++) + for (i = 0; i < sizeof(struct SaveSector); i++) ((char *)section)[i] = 0; - section->security = UNKNOWN_CHECK_VALUE; + section->signature = FILE_SIGNATURE; for (i = 0; i < size; i++) section->data[i] = data[i]; - gLastSaveSectorStatus = ProgramFlashSectorAndVerifyNBytes(gFlashSectors[0], section, sizeof(struct SaveSection)); + gLastSaveSectorStatus = ProgramFlashSectorAndVerifyNBytes(sUnusedFlashSectors[0], section, sizeof(struct SaveSector)); if (gLastSaveSectorStatus) - return 0xFF; + return SAVE_STATUS_ERROR; else - return 1; + return SAVE_STATUS_OK; } u8 unref_sub_8126068(u8 sector, u8 *data, u32 size) { if (ProgramFlashSectorAndVerify(sector, data)) - return 255; + return SAVE_STATUS_ERROR; else - return 1; + return SAVE_STATUS_OK; } u8 unref_sub_8126080(u8 sector, u8 *data) { - ReadFlash(sector, 0, data, sizeof(struct SaveSection)); + ReadFlash(sector, 0, data, sizeof(struct SaveSector)); return 1; } diff --git a/src/engine/save_failed_screen.c b/src/engine/save_failed_screen.c index ba2d46546..49cf166d4 100644 --- a/src/engine/save_failed_screen.c +++ b/src/engine/save_failed_screen.c @@ -61,16 +61,18 @@ static const u8 sClockFrames[8][3] = static const u8 gSaveFailedClockPal[] = INCBIN_U8("graphics/misc/clock_small.gbapal"); static const u8 gSaveFailedClockGfx[] = INCBIN_U8("graphics/misc/clock_small.4bpp.lz"); +#define static + static void VBlankCB(void); static void CB2_SaveFailedScreen(void); static void CB2_WipeSave(void); -static void CB2_GameplayCannotBeContinued(void); +/*static*/ void CB2_GameplayCannotBeContinued(void); static void CB2_FadeAndReturnToTitleScreen(void); static void CB2_ReturnToTitleScreen(void); static void VBlankCB_UpdateClockGraphics(void); static bool8 VerifySectorWipe(u16 sector); static bool8 WipeSector(u16 sector); -static bool8 WipeSectors(u32 sectorBits); +/*static*/ bool8 WipeSectors(u32 sectorBits); void DoSaveFailedScreen(u8 saveType) { @@ -120,11 +122,11 @@ static void CB2_SaveFailedScreen(void) ResetPaletteFade(); LoadPalette(&gBirchBagGrassPal, 0, sizeof(gBirchBagGrassPal)); LoadPalette(&gSaveFailedClockPal, 0x100, sizeof(gSaveFailedClockPal)); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); - MenuDrawTextWindow(13, CLOCK_WIN_TOP, 16, CLOCK_WIN_TOP + 3); // clock window - MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19); // message window - MenuPrint(gSystemText_SaveFailedBackupCheck, 2, MSG_WIN_TOP + 1); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow(&gWindowTemplate_81E6CE4); + Menu_DrawStdWindowFrame(13, CLOCK_WIN_TOP, 16, CLOCK_WIN_TOP + 3); // clock window + Menu_DrawStdWindowFrame(1, MSG_WIN_TOP, 28, 19); // message window + Menu_PrintText(gSystemText_SaveFailedBackupCheck, 2, MSG_WIN_TOP + 1); BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); ime = REG_IME; REG_IME = 0; @@ -148,6 +150,151 @@ static void CB2_SaveFailedScreen(void) } } +#if DEBUG +__attribute__((naked)) +void CB2_WipeSave() +{ + asm( + " push {r4, r5, lr}\n" + " mov r4, #0x0\n" + " ldr r0, ._20 @ gSaveFailedClockInfo\n" + " mov r2, #0x1\n" + " strh r2, [r0]\n" + " ldr r0, ._20 + 4 @ gUnknown_Debug_03004BD0\n" + " ldr r0, [r0]\n" + " ldr r1, ._20 + 8 @ gDamagedSaveSectors\n" + " cmp r0, #0\n" + " beq ._12 @cond_branch\n" + " str r2, [r1]\n" + "._12:\n" + " ldr r0, [r1]\n" + " cmp r0, #0\n" + " beq ._16 @cond_branch\n" + " add r5, r1, #0\n" + "._17:\n" + " ldr r0, [r5]\n" + " bl WipeSectors\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._14 @cond_branch\n" + " mov r0, #0x1\n" + " mov r1, #0xa\n" + " mov r2, #0x1c\n" + " mov r3, #0x13\n" + " bl Menu_DrawStdWindowFrame\n" + " ldr r0, ._20 + 12 @ gSystemText_CheckCompleteSaveAttempt\n" + " mov r1, #0x2\n" + " mov r2, #0xb\n" + " bl Menu_PrintText\n" + " ldr r0, ._20 + 16 @ gSaveFailedType\n" + " ldrb r0, [r0]\n" + " bl Save_WriteDataInternal\n" + " ldr r0, [r5]\n" + " cmp r0, #0\n" + " beq ._15 @cond_branch\n" + " mov r0, #0x1\n" + " mov r1, #0xa\n" + " mov r2, #0x1c\n" + " mov r3, #0x13\n" + " bl Menu_DrawStdWindowFrame\n" + " ldr r0, ._20 + 20 @ gSystemText_SaveFailedBackupCheck\n" + " mov r1, #0x2\n" + " mov r2, #0xb\n" + " bl Menu_PrintText\n" + "._15:\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " ldr r0, [r5]\n" + " cmp r0, #0\n" + " beq ._16 @cond_branch\n" + " cmp r4, #0x2\n" + " bls ._17 @cond_branch\n" + "._16:\n" + " cmp r4, #0x3\n" + " bne ._18 @cond_branch\n" + " mov r0, #0x1\n" + " mov r1, #0xa\n" + " mov r2, #0x1c\n" + " mov r3, #0x13\n" + " bl Menu_DrawStdWindowFrame\n" + " ldr r0, ._20 + 24 @ gSystemText_BackupDamagedGameContinue\n" + " mov r1, #0x2\n" + " mov r2, #0xb\n" + " bl Menu_PrintText\n" + " ldr r0, ._20 + 28 @ CB2_FadeAndReturnToTitleScreen\n" + " bl SetMainCallback2\n" + " b ._23\n" + "._21:\n" + " .align 2, 0\n" + "._20:\n" + " .word gSaveFailedClockInfo\n" + " .word gUnknown_Debug_03004BD0\n" + " .word gDamagedSaveSectors\n" + " .word gSystemText_CheckCompleteSaveAttempt\n" + " .word gSaveFailedType\n" + " .word gSystemText_SaveFailedBackupCheck\n" + " .word gSystemText_BackupDamagedGameContinue\n" + " .word CB2_FadeAndReturnToTitleScreen+1\n" + "._18:\n" + " mov r0, #0x1\n" + " mov r1, #0xa\n" + " mov r2, #0x1c\n" + " mov r3, #0x13\n" + " bl Menu_DrawStdWindowFrame\n" + " ldr r0, ._24 @ gGameContinueCallback\n" + " ldr r0, [r0]\n" + " cmp r0, #0\n" + " bne ._22 @cond_branch\n" + " ldr r0, ._24 + 4 @ gSystemText_SaveCompletedGameEnd\n" + " mov r1, #0x2\n" + " mov r2, #0xb\n" + " bl Menu_PrintText\n" + " b ._23\n" + "._25:\n" + " .align 2, 0\n" + "._24:\n" + " .word gGameContinueCallback\n" + " .word gSystemText_SaveCompletedGameEnd\n" + "._14:\n" + " mov r0, #0x1\n" + " mov r1, #0xa\n" + " mov r2, #0x1c\n" + " mov r3, #0x13\n" + " bl Menu_DrawStdWindowFrame\n" + " ldr r0, ._27 @ gSystemText_BackupDamagedGameContinue\n" + " mov r1, #0x2\n" + " mov r2, #0xb\n" + " bl Menu_PrintText\n" + " ldr r0, ._27 + 4 @ CB2_GameplayCannotBeContinued\n" + " bl SetMainCallback2\n" + " b ._26\n" + "._28:\n" + " .align 2, 0\n" + "._27:\n" + " .word gSystemText_BackupDamagedGameContinue\n" + " .word CB2_GameplayCannotBeContinued+1\n" + "._22:\n" + " ldr r0, ._29 @ gSystemText_SaveCompletedPressA\n" + " mov r1, #0x2\n" + " mov r2, #0xb\n" + " bl Menu_PrintText\n" + "._23:\n" + " ldr r0, ._29 + 4 @ CB2_FadeAndReturnToTitleScreen\n" + " bl SetMainCallback2\n" + "._26:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._30:\n" + " .align 2, 0\n" + "._29:\n" + " .word gSystemText_SaveCompletedPressA\n" + " .word CB2_FadeAndReturnToTitleScreen+1\n" + "\n" + ); +} +#else static void CB2_WipeSave(void) { u8 wipeTries = 0; @@ -158,22 +305,22 @@ static void CB2_WipeSave(void) { if (WipeSectors(gDamagedSaveSectors) != FALSE) { - MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19); - MenuPrint(gSystemText_BackupDamagedGameContinue, 2, MSG_WIN_TOP + 1); + Menu_DrawStdWindowFrame(1, MSG_WIN_TOP, 28, 19); + Menu_PrintText(gSystemText_BackupDamagedGameContinue, 2, MSG_WIN_TOP + 1); SetMainCallback2(CB2_GameplayCannotBeContinued); return; } - MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19); - MenuPrint(gSystemText_CheckCompleteSaveAttempt, 2, MSG_WIN_TOP + 1); - HandleSavingData(gSaveFailedType); + Menu_DrawStdWindowFrame(1, MSG_WIN_TOP, 28, 19); + Menu_PrintText(gSystemText_CheckCompleteSaveAttempt, 2, MSG_WIN_TOP + 1); + Save_WriteDataInternal(gSaveFailedType); if (gDamagedSaveSectors != 0) { #ifdef BUGFIX_SAVEFAILEDSCREEN2 - MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19); + Menu_DrawStdWindowFrame(1, MSG_WIN_TOP, 28, 19); #endif - MenuPrint(gSystemText_SaveFailedBackupCheck, 2, MSG_WIN_TOP + 1); + Menu_PrintText(gSystemText_SaveFailedBackupCheck, 2, MSG_WIN_TOP + 1); } wipeTries++; @@ -181,32 +328,33 @@ static void CB2_WipeSave(void) if (wipeTries == 3) { - MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19); - MenuPrint(gSystemText_BackupDamagedGameContinue, 2, MSG_WIN_TOP + 1); + Menu_DrawStdWindowFrame(1, MSG_WIN_TOP, 28, 19); + Menu_PrintText(gSystemText_BackupDamagedGameContinue, 2, MSG_WIN_TOP + 1); SetMainCallback2(CB2_FadeAndReturnToTitleScreen); // called again below } else { - MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19); + Menu_DrawStdWindowFrame(1, MSG_WIN_TOP, 28, 19); // no callback exists, so the game cannot continue. if (gGameContinueCallback == 0) - MenuPrint(gSystemText_SaveCompletedGameEnd, 2, MSG_WIN_TOP + 1); + Menu_PrintText(gSystemText_SaveCompletedGameEnd, 2, MSG_WIN_TOP + 1); else // callback exists, so continue - MenuPrint(gSystemText_SaveCompletedPressA, 2, MSG_WIN_TOP + 1); + Menu_PrintText(gSystemText_SaveCompletedPressA, 2, MSG_WIN_TOP + 1); } SetMainCallback2(CB2_FadeAndReturnToTitleScreen); } +#endif -static void CB2_GameplayCannotBeContinued(void) +/*static*/ void CB2_GameplayCannotBeContinued(void) { gSaveFailedClockInfo[0] = FALSE; if (gMain.newKeys & A_BUTTON) { - MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19); - MenuPrint(gSystemText_GameplayEnded, 2, MSG_WIN_TOP + 1); + Menu_DrawStdWindowFrame(1, MSG_WIN_TOP, 28, 19); + Menu_PrintText(gSystemText_GameplayEnded, 2, MSG_WIN_TOP + 1); SetVBlankCallback(VBlankCB); SetMainCallback2(CB2_FadeAndReturnToTitleScreen); } @@ -264,6 +412,41 @@ static void VBlankCB_UpdateClockGraphics(void) gSaveFailedClockInfo[1]--; } +#if DEBUG +__attribute__((naked)) +bool8 VerifySectorWipe(u16 sector) +{ + asm( + " push {lr}\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " ldr r2, ._50 @ \n" + " mov r3, #0x80\n" + " lsl r3, r3, #0x5\n" + " mov r1, #0x0\n" + " bl ReadFlash\n" + " mov r0, #0x0\n" + " ldr r1, ._50 + 4 @ \n" + "._49:\n" + " add r0, r0, #0x1\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " cmp r0, r1\n" + " bls ._49 @cond_branch\n" + " ldr r0, ._50 + 8 @ \n" + " ldrb r0, [r0]\n" + " pop {r1}\n" + " bx r1\n" + "._51:\n" + " .align 2, 0\n" + "._50:\n" + " .word +0x2000000\n" + " .word 0x3ff\n" + " .word gUnknown_Debug_03004BD0\n" + "\n" + ); +} +#else static bool8 VerifySectorWipe(u16 sector) { u32 *ptr = (u32 *)&gSharedMem; @@ -277,6 +460,7 @@ static bool8 VerifySectorWipe(u16 sector) return FALSE; } +#endif static bool8 WipeSector(u16 sector) { @@ -294,7 +478,7 @@ static bool8 WipeSector(u16 sector) return failed; } -static bool8 WipeSectors(u32 sectorBits) +/*static*/ bool8 WipeSectors(u32 sectorBits) { u16 i; diff --git a/src/engine/save_menu_util.c b/src/engine/save_menu_util.c index 771cb72c7..ccf4d9f6f 100644 --- a/src/engine/save_menu_util.c +++ b/src/engine/save_menu_util.c @@ -18,7 +18,7 @@ void HandleDrawSaveWindowInfo(s16 left, s16 top) if (FlagGet(FLAG_SYS_POKEDEX_GET)) { // print info + dex information. - MenuDrawTextWindow(left, top, left + width, top + 11); + Menu_DrawStdWindowFrame(left, top, left + width, top + 11); PrintSaveMapName(++left, ++top); // MAP NAME PrintSavePlayerName(left, top + 2); // PLAYER PrintSaveBadges(left, top + 4); // BADGES @@ -28,7 +28,7 @@ void HandleDrawSaveWindowInfo(s16 left, s16 top) else { // print everything besides dex. - MenuDrawTextWindow(left, top, left + width, top + 9); + Menu_DrawStdWindowFrame(left, top, left + width, top + 9); PrintSaveMapName(++left, ++top); // MAP NAME PrintSavePlayerName(left, top + 2); // PLAYER PrintSaveBadges(left, top + 4); // BADGES @@ -45,9 +45,9 @@ void HandleCloseSaveWindow(u16 left, u16 top) width = 13; if (FlagGet(FLAG_SYS_POKEDEX_GET)) - MenuZeroFillWindowRect(left, top, left + width, top + 11); + Menu_EraseWindowRect(left, top, left + width, top + 11); else - MenuZeroFillWindowRect(left, top, left + width, top + 9); + Menu_EraseWindowRect(left, top, left + width, top + 9); } /* @@ -62,7 +62,7 @@ u8 IsResizeSaveWindowEnabled(void) // i don't know what else to name it.. void PrintSavePlayerName(s16 x, s16 y) { - MenuPrint(gOtherText_Player, x, y); + Menu_PrintText(gOtherText_Player, x, y); MenuPrint_RightAligned(gSaveBlock2.playerName, x + 12, y); } @@ -71,14 +71,14 @@ void PrintSaveMapName(s16 x, s16 y) char name[32]; CopyMapName(name, gMapHeader.regionMapSectionId); - MenuPrint(name, x, y); + Menu_PrintText(name, x, y); } void PrintSaveBadges(s16 x, s16 y) { char badges[16]; - MenuPrint(gOtherText_Badges, x, y); + Menu_PrintText(gOtherText_Badges, x, y); ConvertIntToDecimalString(badges, GetBadgeCount()); MenuPrint_RightAligned(badges, x + 12, y); } @@ -87,7 +87,7 @@ void PrintSavePokedexCount(s16 x, s16 y) { char pokedex[16]; - MenuPrint(gOtherText_Pokedex, x, y); + Menu_PrintText(gOtherText_Pokedex, x, y); ConvertIntToDecimalStringN(pokedex, GetPokedexSeenCount(), 1, 3); MenuPrint_RightAligned(pokedex, x + 12, y); } @@ -96,7 +96,7 @@ void PrintSavePlayTime(s16 x, s16 y) { char playtime[16]; - MenuPrint(gOtherText_PlayTime, x, y); + Menu_PrintText(gOtherText_PlayTime, x, y); FormatPlayTime(playtime, gSaveBlock2.playTimeHours, gSaveBlock2.playTimeMinutes, 1); MenuPrint_RightAligned(playtime, x + 12, y); } @@ -125,9 +125,9 @@ u16 GetPokedexSeenCount() return pokedexSeenCount; } -void FormatPlayTime(char *playtime, u16 hours, u16 minutes, u16 unk) +void FormatPlayTime(char *playtime, u16 hours, u16 minutes, u16 colon) { - s16 colon = unk; + s16 _colon = colon; playtime = ConvertIntToDecimalString(playtime, hours); // playtime[0] is hours. @@ -136,7 +136,7 @@ void FormatPlayTime(char *playtime, u16 hours, u16 minutes, u16 unk) playtime[0] = 0; - if (colon) + if (_colon) playtime[1] = 0xF0; // set middle character to ":" else playtime[1] = 0; diff --git a/src/engine/sprite.c b/src/engine/sprite.c index cf35e12a3..a9d84e01a 100644 --- a/src/engine/sprite.c +++ b/src/engine/sprite.c @@ -1,8 +1,10 @@ #include "global.h" +#include "debug.h" #include "sprite.h" #include "main.h" #include "menu_cursor.h" #include "palette.h" +#include "sprite.h" #define MAX_SPRITE_COPY_REQUESTS 64 @@ -822,6 +824,12 @@ static void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct Spr gSpriteCopyRequests[gSpriteCopyRequestCount].size = images[index].size; gSpriteCopyRequestCount++; } +#if DEBUG + else + { + Crash(sDmaOverErrorMsg); + } +#endif } void RequestSpriteCopy(const void *src, u8 *dest, u16 size) @@ -833,6 +841,12 @@ void RequestSpriteCopy(const void *src, u8 *dest, u16 size) gSpriteCopyRequests[gSpriteCopyRequestCount].size = size; gSpriteCopyRequestCount++; } +#if DEBUG + else + { + Crash(sDmaOverErrorMsg); + } +#endif } // these two functions are unused. diff --git a/src/engine/task.c b/src/engine/task.c index 7bd2b5937..3e8a5588c 100644 --- a/src/engine/task.c +++ b/src/engine/task.c @@ -1,4 +1,5 @@ #include "global.h" +#include "debug.h" #include "task.h" #define ACTIVE_SENTINEL 0x10 @@ -11,8 +12,9 @@ struct Task gTasks[ACTIVE_SENTINEL]; static void InsertTask(u8 newTaskId); static u8 FindFirstActiveTask(); -// Unused string -const u8 sTaskOverString[] = _("TASK OVER\nタスクがオーバーしました"); +const u8 gError_NoTasksLeft[] = _( + "TASK OVER\n" + "タスクがオーバーしました"); void ResetTasks() { @@ -49,6 +51,10 @@ u8 CreateTask(TaskFunc func, u8 priority) } } +#if DEBUG + Crash(gError_NoTasksLeft); +#endif + return 0; } diff --git a/src/engine/text.c b/src/engine/text.c index 1b158d979..fe18a6d79 100644 --- a/src/engine/text.c +++ b/src/engine/text.c @@ -12,16 +12,31 @@ enum WIN_STATE_END, WIN_STATE_BEGIN, WIN_STATE_NORMAL, - WIN_STATE_INTERRUPTIBLE_PAUSE, + WIN_STATE_CHAR_DELAY, WIN_STATE_PAUSE, WIN_STATE_WAIT_BUTTON, WIN_STATE_NEWLINE, WIN_STATE_PLACEHOLDER, - WIN_STATE_PARAGRAPH, - WIN_STATE_NEWLINE_WAIT, + WIN_STATE_WAIT_CLEAR, + WIN_STATE_WAIT_SCROLL, WIN_STATE_WAIT_SOUND, }; +enum +{ + TEXT_MODE_UNKNOWN0, + TEXT_MODE_MONOSPACE, + TEXT_MODE_UNKNOWN2, // variable width? +}; + +enum +{ + WAIT_TYPE_NORMAL, // allows the player to interrupt the text delay with A or B + WAIT_TYPE_BATTLE, // disables interrupting the text delay if in a link battle + WAIT_TYPE_AUTOSCROLL, // disables interrupting the text delay + WAIT_TYPE_CONTEST, // disables interrupting the text delay if in a link contest +}; + struct Font { u32 type; @@ -66,7 +81,7 @@ static u16 LoadFixedWidthFont_Font4Latin(struct Window *, u16); static u16 LoadFixedWidthFont_Braille(struct Window *, u16); static void MultistepLoadFont_LoadGlyph(struct Window *, u16, u8); static u8 sub_8002FA0(struct Window *, const u8 *); -static u8 InterpretText(struct Window *); +static u8 PrintNextChar(struct Window *); static u8 HandleExtCtrlCode(struct Window *); static u8 UpdateWindowText(struct Window *); static u8 DrawGlyph_TextMode0(struct Window *, u32); @@ -82,27 +97,27 @@ static void AddToCursorX(struct Window *, u8); static void AddToCursorY(struct Window *, u8); static void ClipLeft(struct Window *); static void ClipRight(struct Window *); -static void InitColors(struct Window *); -static void SetBackgroundColor(struct Window *, u8); -static void SetShadowColor(struct Window *, u8); -static void SetForegroundColor(struct Window *, u8); +static void SetWindowDefaultColors(struct Window *); +static void SetWindowBackgroundColor(struct Window *, u8); +static void SetWindowShadowColor(struct Window *, u8); +static void SetWindowForegroundColor(struct Window *, u8); static u8 GetTextDelay(struct Window *); -static bool8 PlayerCanInterruptWait(struct Window *); +static bool8 PlayerCanInterruptDelay(struct Window *); static void ScrollWindowTextLines(struct Window *); static void ScrollWindowTextLines_TextMode0(struct Window *); static void DoScroll_TextMode0(struct Window *, u16); -static void ScrollWindowTextLines_TextMode1(struct Window *); -static void DoScroll_TextMode1(struct Window *, u16); +static void ScrollWindowTextLines_TextModeMonospace(struct Window *); +static void DoScroll_TextModeMonospace(struct Window *, u16); static void ScrollWindowTextLines_TextMode2(struct Window *); static void DoScroll_TextMode2(struct Window *, u8); -void ClearWindowTextLines(struct Window *); +void Text_ClearWindow(struct Window *); static void ClearWindowTextLines_TextMode0_TextMode1(struct Window *, u8); static void ClearWindowTextLines_TextMode2(struct Window *, u8); static void TryEraseDownArrow(struct Window *); static u16 GetBlankTileNum(struct Window *); static u8 WaitWithDownArrow(struct Window *); static void DrawInitialDownArrow(struct Window *); -static void DrawMovingDownArrow(struct Window *); +static void UpdateDownArrowAnimation(struct Window *); static u16 GetCursorTileNum(struct Window *, u32, u32); static s32 DrawGlyphTiles(struct Window *, u32, u32); static void UpdateTilemap(struct Window *, u32); @@ -477,7 +492,7 @@ static const ShiftGlyphTileShadowedFunc sShiftGlyphTileShadowedFuncs[] = ShiftGlyphTile_ShadowedFont_Width8, }; -const struct WindowConfig gWindowConfig_81E6C3C = +const struct WindowTemplate gWindowTemplate_81E6C3C = { 0, // BG number 2, // BG character base block @@ -498,7 +513,7 @@ const struct WindowConfig gWindowConfig_81E6C3C = BG_SCREEN_ADDR(31), // tilemap }; -const struct WindowConfig gWindowConfig_81E6C58 = +const struct WindowTemplate gWindowTemplate_81E6C58 = { 0, // BG number 0, // BG character base block @@ -519,7 +534,7 @@ const struct WindowConfig gWindowConfig_81E6C58 = BG_SCREEN_ADDR(24), // tilemap }; -const struct WindowConfig gWindowConfig_81E6C74 = +const struct WindowTemplate gWindowTemplate_81E6C74 = { 0, // BG number 0, // BG character base block @@ -540,7 +555,7 @@ const struct WindowConfig gWindowConfig_81E6C74 = NULL, // tilemap }; -const struct WindowConfig gWindowConfig_81E6C90 = +const struct WindowTemplate gWindowTemplate_81E6C90 = { 0, // BG number 1, // BG character base block @@ -561,7 +576,7 @@ const struct WindowConfig gWindowConfig_81E6C90 = BG_SCREEN_ADDR(30), // tilemap }; -const struct WindowConfig gWindowConfig_81E6CAC = +const struct WindowTemplate gWindowTemplate_81E6CAC = { 0, // BG number 0, // BG character base block @@ -582,7 +597,7 @@ const struct WindowConfig gWindowConfig_81E6CAC = NULL, // tilemap }; -const struct WindowConfig gWindowConfig_81E6CC8 = +const struct WindowTemplate gWindowTemplate_81E6CC8 = { 2, // BG number 2, // BG character base block @@ -603,7 +618,7 @@ const struct WindowConfig gWindowConfig_81E6CC8 = BG_SCREEN_ADDR(15), // tilemap }; -const struct WindowConfig gWindowConfig_81E6CE4 = +const struct WindowTemplate gWindowTemplate_81E6CE4 = { 0, // BG number 2, // BG character base block @@ -624,7 +639,7 @@ const struct WindowConfig gWindowConfig_81E6CE4 = BG_SCREEN_ADDR(31), // tilemap }; -const struct WindowConfig gWindowConfig_81E6D00 = +const struct WindowTemplate gWindowTemplate_81E6D00 = { 0, // BG number 0, // BG character base block @@ -645,7 +660,7 @@ const struct WindowConfig gWindowConfig_81E6D00 = BG_SCREEN_ADDR(31), // tilemap }; -const struct WindowConfig gWindowConfig_81E6D1C = +const struct WindowTemplate gWindowTemplate_81E6D1C = { 1, // BG number 0, // BG character base block @@ -666,7 +681,7 @@ const struct WindowConfig gWindowConfig_81E6D1C = BG_SCREEN_ADDR(31), // tilemap }; -const struct WindowConfig gWindowConfig_81E6D38 = +const struct WindowTemplate gWindowTemplate_81E6D38 = { 0, // BG number 0, // BG character base block @@ -687,7 +702,7 @@ const struct WindowConfig gWindowConfig_81E6D38 = NULL, // tilemap }; -const struct WindowConfig gWindowConfig_81E6D54 = +const struct WindowTemplate gWindowTemplate_81E6D54 = { 3, // BG number 3, // BG character base block @@ -708,7 +723,7 @@ const struct WindowConfig gWindowConfig_81E6D54 = BG_SCREEN_ADDR(15), // tilemap }; -const struct WindowConfig gWindowConfig_81E6D70 = +const struct WindowTemplate gWindowTemplate_81E6D70 = { 3, // BG number 3, // BG character base block @@ -729,7 +744,7 @@ const struct WindowConfig gWindowConfig_81E6D70 = BG_SCREEN_ADDR(15), // tilemap }; -const struct WindowConfig gWindowConfig_81E6D8C = +const struct WindowTemplate gWindowTemplate_81E6D8C = { 1, // BG number 0, // BG character base block @@ -750,7 +765,7 @@ const struct WindowConfig gWindowConfig_81E6D8C = BG_SCREEN_ADDR(14), // tilemap }; -const struct WindowConfig gWindowConfig_81E6DA8 = +const struct WindowTemplate gWindowTemplate_81E6DA8 = { 0, // BG number 0, // BG character base block @@ -771,7 +786,7 @@ const struct WindowConfig gWindowConfig_81E6DA8 = BG_SCREEN_ADDR(11), // tilemap }; -const struct WindowConfig WindowConfig_TrainerCard_Back_Values = +const struct WindowTemplate gWindowTemplate_TrainerCard_Back_Values = { 0, // BG number 2, // BG character base block @@ -792,7 +807,7 @@ const struct WindowConfig WindowConfig_TrainerCard_Back_Values = BG_SCREEN_ADDR(30), // tilemap }; -const struct WindowConfig WindowConfig_TrainerCard_Back_Labels = +const struct WindowTemplate gWindowTemplate_TrainerCard_Back_Labels = { 0, // BG number 2, // BG character base block @@ -813,7 +828,7 @@ const struct WindowConfig WindowConfig_TrainerCard_Back_Labels = BG_SCREEN_ADDR(30), // tilemap }; -const struct WindowConfig gWindowConfig_81E6DFC = +const struct WindowTemplate gWindowTemplate_81E6DFC = { 0, // BG number 2, // BG character base block @@ -834,7 +849,7 @@ const struct WindowConfig gWindowConfig_81E6DFC = BG_SCREEN_ADDR(31), // tilemap }; -const struct WindowConfig gWindowConfig_81E6E18 = +const struct WindowTemplate gWindowTemplate_81E6E18 = { 0, // BG number 2, // BG character base block @@ -855,7 +870,7 @@ const struct WindowConfig gWindowConfig_81E6E18 = BG_SCREEN_ADDR(31), // tilemap }; -const struct WindowConfig gWindowConfig_81E6E34 = +const struct WindowTemplate gWindowTemplate_81E6E34 = { 1, // BG number 0, // BG character base block @@ -876,7 +891,7 @@ const struct WindowConfig gWindowConfig_81E6E34 = BG_SCREEN_ADDR(31), // tilemap }; -const struct WindowConfig gWindowConfig_81E6E50 = +const struct WindowTemplate gWindowTemplate_81E6E50 = { 0, // BG number 2, // BG character base block @@ -897,7 +912,7 @@ const struct WindowConfig gWindowConfig_81E6E50 = BG_SCREEN_ADDR(28), // tilemap }; -const struct WindowConfig gWindowConfig_81E6E6C = +const struct WindowTemplate gWindowTemplate_81E6E6C = { 0, // BG number 2, // BG character base block @@ -918,7 +933,7 @@ const struct WindowConfig gWindowConfig_81E6E6C = BG_SCREEN_ADDR(30), // tilemap }; -const struct WindowConfig gWindowConfig_81E6E88 = +const struct WindowTemplate gWindowTemplate_81E6E88 = { 0, // BG number 0, // BG character base block @@ -939,7 +954,7 @@ const struct WindowConfig gWindowConfig_81E6E88 = BG_SCREEN_ADDR(31), // tilemap }; -const struct WindowConfig gWindowConfig_81E6EA4 = +const struct WindowTemplate gWindowTemplate_81E6EA4 = { 1, // BG number 0, // BG character base block @@ -960,7 +975,7 @@ const struct WindowConfig gWindowConfig_81E6EA4 = BG_SCREEN_ADDR(28), // tilemap }; -const struct WindowConfig gWindowConfig_81E6EC0 = +const struct WindowTemplate gWindowTemplate_81E6EC0 = { 2, // BG number 2, // BG character base block @@ -981,7 +996,7 @@ const struct WindowConfig gWindowConfig_81E6EC0 = BG_SCREEN_ADDR(29), // tilemap }; -const struct WindowConfig gWindowConfig_81E6EDC = +const struct WindowTemplate gWindowTemplate_81E6EDC = { 1, // BG number 0, // BG character base block @@ -1002,7 +1017,7 @@ const struct WindowConfig gWindowConfig_81E6EDC = BG_SCREEN_ADDR(28), // tilemap }; -const struct WindowConfig gWindowConfig_81E6EF8 = +const struct WindowTemplate gWindowTemplate_81E6EF8 = { 2, // BG number 2, // BG character base block @@ -1023,7 +1038,7 @@ const struct WindowConfig gWindowConfig_81E6EF8 = BG_SCREEN_ADDR(29), // tilemap }; -const struct WindowConfig gWindowConfig_81E6F14 = +const struct WindowTemplate gWindowTemplate_81E6F14 = { 1, // BG number 0, // BG character base block @@ -1044,7 +1059,7 @@ const struct WindowConfig gWindowConfig_81E6F14 = BG_SCREEN_ADDR(28), // tilemap }; -const struct WindowConfig gWindowConfig_81E6F30 = +const struct WindowTemplate gWindowTemplate_81E6F30 = { 2, // BG number 2, // BG character base block @@ -1065,7 +1080,7 @@ const struct WindowConfig gWindowConfig_81E6F30 = BG_SCREEN_ADDR(29), // tilemap }; -const struct WindowConfig gWindowConfig_81E6F4C = +const struct WindowTemplate gWindowTemplate_81E6F4C = { 3, // BG number 0, // BG character base block @@ -1086,7 +1101,7 @@ const struct WindowConfig gWindowConfig_81E6F4C = BG_SCREEN_ADDR(30), // tilemap }; -const struct WindowConfig gWindowConfig_81E6F68 = +const struct WindowTemplate gWindowTemplate_81E6F68 = { 0, // BG number 2, // BG character base block @@ -1107,7 +1122,7 @@ const struct WindowConfig gWindowConfig_81E6F68 = BG_SCREEN_ADDR(13), // tilemap }; -const struct WindowConfig gWindowConfig_81E6F84 = +const struct WindowTemplate gWindowTemplate_81E6F84 = { 0, // BG number 2, // BG character base block @@ -1128,7 +1143,7 @@ const struct WindowConfig gWindowConfig_81E6F84 = BG_SCREEN_ADDR(31), // tilemap }; -const struct WindowConfig gWindowConfig_81E6FA0 = +const struct WindowTemplate gWindowTemplate_81E6FA0 = { 1, // BG number 0, // BG character base block @@ -1149,7 +1164,7 @@ const struct WindowConfig gWindowConfig_81E6FA0 = BG_SCREEN_ADDR(24), // tilemap }; -const struct WindowConfig gWindowConfig_81E6FBC = +const struct WindowTemplate gWindowTemplate_81E6FBC = { 0, // BG number 0, // BG character base block @@ -1170,7 +1185,7 @@ const struct WindowConfig gWindowConfig_81E6FBC = BG_SCREEN_ADDR(30), // tilemap }; -const struct WindowConfig gWindowConfig_81E6FD8 = +const struct WindowTemplate gWindowTemplate_81E6FD8 = { 0, // BG number 0, // BG character base block @@ -1191,7 +1206,7 @@ const struct WindowConfig gWindowConfig_81E6FD8 = BG_SCREEN_ADDR(24), // tilemap }; -const struct WindowConfig gWindowConfig_81E6FF4 = +const struct WindowTemplate gWindowTemplate_81E6FF4 = { 0, // BG number 0, // BG character base block @@ -1212,7 +1227,7 @@ const struct WindowConfig gWindowConfig_81E6FF4 = BG_SCREEN_ADDR(24), // tilemap }; -const struct WindowConfig gWindowConfig_81E7010 = +const struct WindowTemplate gWindowTemplate_81E7010 = { 0, // BG number 0, // BG character base block @@ -1233,7 +1248,7 @@ const struct WindowConfig gWindowConfig_81E7010 = BG_SCREEN_ADDR(30), // tilemap }; -const struct WindowConfig gWindowConfig_81E702C = +const struct WindowTemplate gWindowTemplate_81E702C = { 3, // BG number 2, // BG character base block @@ -1254,7 +1269,7 @@ const struct WindowConfig gWindowConfig_81E702C = BG_SCREEN_ADDR(15), // tilemap }; -const struct WindowConfig gWindowConfig_81E7048 = +const struct WindowTemplate gWindowTemplate_81E7048 = { 2, // BG number 2, // BG character base block @@ -1275,7 +1290,7 @@ const struct WindowConfig gWindowConfig_81E7048 = BG_SCREEN_ADDR(14), // tilemap }; -const struct WindowConfig gWindowConfig_81E7064 = +const struct WindowTemplate gWindowTemplate_81E7064 = { 2, // BG number 2, // BG character base block @@ -1296,7 +1311,7 @@ const struct WindowConfig gWindowConfig_81E7064 = BG_SCREEN_ADDR(14), // tilemap }; -const struct WindowConfig gWindowConfig_81E7080 = +const struct WindowTemplate gWindowTemplate_81E7080 = { 3, // BG number 0, // BG character base block @@ -1317,7 +1332,7 @@ const struct WindowConfig gWindowConfig_81E7080 = BG_SCREEN_ADDR(30), // tilemap }; -const struct WindowConfig gWindowConfig_81E709C = +const struct WindowTemplate gWindowTemplate_81E709C = { 0, // BG number 0, // BG character base block @@ -1338,7 +1353,7 @@ const struct WindowConfig gWindowConfig_81E709C = BG_SCREEN_ADDR(31), // tilemap }; -const struct WindowConfig gWindowConfig_81E70B8 = +const struct WindowTemplate gWindowTemplate_81E70B8 = { 2, // BG number 0, // BG character base block @@ -1359,7 +1374,7 @@ const struct WindowConfig gWindowConfig_81E70B8 = BG_SCREEN_ADDR(30), // tilemap }; -const struct WindowConfig gWindowConfig_81E70D4 = +const struct WindowTemplate gWindowTemplate_81E70D4 = { 3, // BG number 0, // BG character base block @@ -1380,7 +1395,7 @@ const struct WindowConfig gWindowConfig_81E70D4 = BG_SCREEN_ADDR(30), // tilemap }; -const struct WindowConfig gWindowConfig_81E70F0 = +const struct WindowTemplate gWindowTemplate_81E70F0 = { 0, // BG number 0, // BG character base block @@ -1401,7 +1416,7 @@ const struct WindowConfig gWindowConfig_81E70F0 = NULL, // tilemap }; -const struct WindowConfig gWindowConfig_81E710C = +const struct WindowTemplate gWindowTemplate_81E710C = { 0, // BG number 0, // BG character base block @@ -1422,7 +1437,7 @@ const struct WindowConfig gWindowConfig_81E710C = BG_SCREEN_ADDR(31), // tilemap }; -const struct WindowConfig gWindowConfig_81E7128 = +const struct WindowTemplate gWindowTemplate_81E7128 = { 0, // BG number 2, // BG character base block @@ -1443,7 +1458,7 @@ const struct WindowConfig gWindowConfig_81E7128 = BG_SCREEN_ADDR(31), // tilemap }; -const struct WindowConfig gWindowConfig_81E7144 = +const struct WindowTemplate gWindowTemplate_81E7144 = { 0, // BG number 2, // BG character base block @@ -1464,7 +1479,7 @@ const struct WindowConfig gWindowConfig_81E7144 = BG_SCREEN_ADDR(31), // tilemap }; -const struct WindowConfig gWindowConfig_81E7160 = +const struct WindowTemplate gWindowTemplate_81E7160 = { 1, // BG number 1, // BG character base block @@ -1485,7 +1500,7 @@ const struct WindowConfig gWindowConfig_81E7160 = BG_SCREEN_ADDR(10), // tilemap }; -const struct WindowConfig gWindowConfig_81E717C = +const struct WindowTemplate gWindowTemplate_81E717C = { 0, // BG number 3, // BG character base block @@ -1506,7 +1521,7 @@ const struct WindowConfig gWindowConfig_81E717C = BG_SCREEN_ADDR(31), // tilemap }; -const struct WindowConfig gWindowConfig_81E7198 = +const struct WindowTemplate gWindowTemplate_81E7198 = { 0, // BG number 2, // BG character base block @@ -1527,7 +1542,7 @@ const struct WindowConfig gWindowConfig_81E7198 = BG_SCREEN_ADDR(15), // tilemap }; -const struct WindowConfig gWindowConfig_81E71B4 = +const struct WindowTemplate gWindowTemplate_81E71B4 = { 0, // BG number 2, // BG character base block @@ -1548,7 +1563,7 @@ const struct WindowConfig gWindowConfig_81E71B4 = BG_SCREEN_ADDR(15), // tilemap }; -const struct WindowConfig gWindowConfig_81E71D0 = +const struct WindowTemplate gWindowTemplate_81E71D0 = { 1, // BG number 1, // BG character base block @@ -1569,7 +1584,7 @@ const struct WindowConfig gWindowConfig_81E71D0 = BG_SCREEN_ADDR(28), // tilemap }; -const struct WindowConfig gWindowConfig_81E71EC = +const struct WindowTemplate gWindowTemplate_81E71EC = { 2, // BG number 1, // BG character base block @@ -1590,7 +1605,7 @@ const struct WindowConfig gWindowConfig_81E71EC = BG_SCREEN_ADDR(30), // tilemap }; -const struct WindowConfig gWindowConfig_81E7208 = +const struct WindowTemplate gWindowTemplate_81E7208 = { 0, // BG number 2, // BG character base block @@ -1611,7 +1626,7 @@ const struct WindowConfig gWindowConfig_81E7208 = BG_SCREEN_ADDR(28), // tilemap }; -const struct WindowConfig gWindowConfig_81E7224 = +const struct WindowTemplate gWindowTemplate_81E7224 = { 0, // BG number 0, // BG character base block @@ -1632,7 +1647,7 @@ const struct WindowConfig gWindowConfig_81E7224 = BG_SCREEN_ADDR(31), // tilemap }; -const struct WindowConfig gWindowConfig_81E7240 = +const struct WindowTemplate gWindowTemplate_81E7240 = { 1, // BG number 2, // BG character base block @@ -1653,7 +1668,7 @@ const struct WindowConfig gWindowConfig_81E7240 = BG_SCREEN_ADDR(30), // tilemap }; -const struct WindowConfig gWindowConfig_81E725C = +const struct WindowTemplate gWindowTemplate_81E725C = { 0, // BG number 0, // BG character base block @@ -1674,7 +1689,7 @@ const struct WindowConfig gWindowConfig_81E725C = NULL, // tilemap }; -const struct WindowConfig gWindowConfig_81E7278 = +const struct WindowTemplate gWindowTemplate_81E7278 = { 0, // BG number 0, // BG character base block @@ -1695,7 +1710,7 @@ const struct WindowConfig gWindowConfig_81E7278 = NULL, // tilemap }; -const struct WindowConfig gWindowConfig_81E7294 = +const struct WindowTemplate gWindowTemplate_81E7294 = { 0, // BG number 0, // BG character base block @@ -1716,32 +1731,32 @@ const struct WindowConfig gWindowConfig_81E7294 = NULL, // tilemap }; -static void UpdateBGRegs(const struct WindowConfig *winConfig) +static void UpdateBGRegs(const struct WindowTemplate *winTemplate) { - u8 bgNum = winConfig->bgNum; + u8 bgNum = winTemplate->bgNum; *gBGHOffsetRegs[bgNum] = 0; *gBGVOffsetRegs[bgNum] = 0; - *gBGControlRegs[bgNum] = winConfig->priority | (winConfig->screenBaseBlock << 8) | (winConfig->charBaseBlock << 2); + *gBGControlRegs[bgNum] = winTemplate->priority | (winTemplate->screenBaseBlock << 8) | (winTemplate->charBaseBlock << 2); } -static void ClearBGMem(const struct WindowConfig *winConfig) +static void ClearBGMem(const struct WindowTemplate *winTemplate) { - CpuFastFill(0, winConfig->tileData, 32); + CpuFastFill(0, winTemplate->tileData, 32); - if (winConfig->tilemap) - CpuFastFill(0, winConfig->tilemap, 0x800); + if (winTemplate->tilemap) + CpuFastFill(0, winTemplate->tilemap, 0x800); } -void LoadFontDefaultPalette(const struct WindowConfig *winConfig) +void LoadFontDefaultPalette(const struct WindowTemplate *winTemplate) { - LoadPalette(gFontDefaultPalette, 16 * winConfig->paletteNum, 32); + LoadPalette(gFontDefaultPalette, 16 * winTemplate->paletteNum, 32); } -void SetUpWindowConfig(const struct WindowConfig *winConfig) +void Text_LoadWindowTemplate(const struct WindowTemplate *winTemplate) { - UpdateBGRegs(winConfig); - ClearBGMem(winConfig); - LoadFontDefaultPalette(winConfig); + UpdateBGRegs(winTemplate); + ClearBGMem(winTemplate); + LoadFontDefaultPalette(winTemplate); } u16 InitWindowTileData(struct Window *win, u16 startOffset) @@ -1751,13 +1766,13 @@ u16 InitWindowTileData(struct Window *win, u16 startOffset) win->tileDataStartOffset = startOffset; retVal = 0; - switch (win->config->textMode) + switch (win->template->textMode) { - case 2: + case TEXT_MODE_UNKNOWN2: retVal = InitVariableWidthFontTileData(win, startOffset); break; - case 1: - switch (win->config->fontNum) + case TEXT_MODE_MONOSPACE: + switch (win->template->fontNum) { case 0: case 3: @@ -1789,7 +1804,7 @@ static u16 InitVariableWidthFontTileData(struct Window *win, u16 startOffset) win->tileDataOffset = 2; buffer = win->tileData + 32 * win->tileDataStartOffset; CpuFastFill(0, buffer, 32); - ApplyColors_UnshadowedFont(sBlankTile, (u32 *)(buffer + 32), win->config->foregroundColor, win->config->backgroundColor); + ApplyColors_UnshadowedFont(sBlankTile, (u32 *)(buffer + 32), win->template->foregroundColor, win->template->backgroundColor); return win->tileDataStartOffset + win->tileDataOffset + win->width * win->height; } @@ -1850,15 +1865,15 @@ u32 MultistepInitWindowTileData(struct Window *win, u16 startOffset) win->tileDataStartOffset = startOffset; retVal = 0; - switch (win->config->textMode) + switch (win->template->textMode) { - case 2: + case TEXT_MODE_UNKNOWN2: retVal = InitVariableWidthFontTileData(win, startOffset); break; - case 1: + case TEXT_MODE_MONOSPACE: retVal = 256; - if (win->config->fontNum == 0 - || win->config->fontNum == 3) + if (win->template->fontNum == 0 + || win->template->fontNum == 3) retVal *= 2; break; } @@ -1870,7 +1885,7 @@ bool32 MultistepLoadFont(void) { bool32 retVal = TRUE; - if (sMultistepLoadFont_Window->config->textMode == 1) + if (sMultistepLoadFont_Window->template->textMode == TEXT_MODE_MONOSPACE) { s32 i; @@ -1890,7 +1905,7 @@ static void MultistepLoadFont_LoadGlyph(struct Window *win, u16 startOffset, u8 { u8 *buffer; - switch (win->config->fontNum) + switch (win->template->fontNum) { case 0: case 3: @@ -1923,42 +1938,42 @@ void EmptyFunc(void) { } -void InitWindowFromConfig(struct Window *win, const struct WindowConfig *winConfig) +void Text_InitWindowWithTemplate(struct Window *win, const struct WindowTemplate *winTemplate) { *win = sDefaultWindow; - win->config = (struct WindowConfig *)winConfig; - win->textMode = winConfig->textMode; - win->spacing = winConfig->spacing; - win->fontNum = winConfig->fontNum; - win->paletteNum = winConfig->paletteNum; - win->tilemapLeft = winConfig->tilemapLeft; - win->tilemapTop = winConfig->tilemapTop; - win->width = winConfig->width; - win->height = winConfig->height; - win->tileData = winConfig->tileData; - win->tilemap = winConfig->tilemap; - InitColors(win); - SetBackgroundColor(win, winConfig->backgroundColor); - SetShadowColor(win, winConfig->shadowColor); - SetForegroundColor(win, winConfig->foregroundColor); -} - -void InitWindow(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top) -{ - const struct WindowConfig *winConfig = win->config; - win->textMode = winConfig->textMode; - win->fontNum = winConfig->fontNum; + win->template = (struct WindowTemplate *)winTemplate; + win->textMode = winTemplate->textMode; + win->spacing = winTemplate->spacing; + win->fontNum = winTemplate->fontNum; + win->paletteNum = winTemplate->paletteNum; + win->tilemapLeft = winTemplate->tilemapLeft; + win->tilemapTop = winTemplate->tilemapTop; + win->width = winTemplate->width; + win->height = winTemplate->height; + win->tileData = winTemplate->tileData; + win->tilemap = winTemplate->tilemap; + SetWindowDefaultColors(win); + SetWindowBackgroundColor(win, winTemplate->backgroundColor); + SetWindowShadowColor(win, winTemplate->shadowColor); + SetWindowForegroundColor(win, winTemplate->foregroundColor); +} + +void Text_InitWindow(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top) +{ + const struct WindowTemplate *winTemplate = win->template; + win->textMode = winTemplate->textMode; + win->fontNum = winTemplate->fontNum; win->language = GAME_LANGUAGE; - win->paletteNum = winConfig->paletteNum; + win->paletteNum = winTemplate->paletteNum; win->win_field_B = 0; win->win_field_C = 0; win->delayCounter = 0; - win->spacing = winConfig->spacing; + win->spacing = winTemplate->spacing; win->win_field_F = 0; - win->tilemapLeft = winConfig->tilemapLeft; - win->tilemapTop = winConfig->tilemapTop; - win->width = winConfig->width; - win->height = winConfig->height; + win->tilemapLeft = winTemplate->tilemapLeft; + win->tilemapTop = winTemplate->tilemapTop; + win->width = winTemplate->width; + win->height = winTemplate->height; win->text = text; win->textIndex = 0; win->tileDataStartOffset = tileDataStartOffset; @@ -1969,19 +1984,19 @@ void InitWindow(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 win->cursorY = 0; win->state = WIN_STATE_BEGIN; win->downArrowCounter = 0; - win->tileData = winConfig->tileData; - win->tilemap = winConfig->tilemap; - InitColors(win); - SetBackgroundColor(win, winConfig->backgroundColor); - SetShadowColor(win, winConfig->shadowColor); - SetForegroundColor(win, winConfig->foregroundColor); + win->tileData = winTemplate->tileData; + win->tilemap = winTemplate->tilemap; + SetWindowDefaultColors(win); + SetWindowBackgroundColor(win, winTemplate->backgroundColor); + SetWindowShadowColor(win, winTemplate->shadowColor); + SetWindowForegroundColor(win, winTemplate->foregroundColor); } -void sub_8002E4C(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u16 top, u32 a6) +void Text_InitWindow8002E4C(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u16 top, u32 a6) { u8 val; - InitWindow(win, text, tileDataStartOffset, 0, 0); + Text_InitWindow(win, text, tileDataStartOffset, 0, 0); win->left = left; win->top = top; val = 0; @@ -1992,7 +2007,7 @@ void sub_8002E4C(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 ClipLeft(win); } -void sub_8002E90(struct Window *win, const u8 *text) +void Text_SetWindowText(struct Window *win, const u8 *text) { win->state = WIN_STATE_NORMAL; win->text = text; @@ -2003,15 +2018,15 @@ void sub_8002E90(struct Window *win, const u8 *text) win->delayCounter = 0; } -void sub_8002EB0(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top) +void Text_InitWindow8002EB0(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top) { gMain.watchedKeysMask = A_BUTTON | B_BUTTON; gMain.watchedKeysPressed = 0; - sWaitType = 0; + sWaitType = WAIT_TYPE_NORMAL; sLineLength = 26; - InitWindow(win, text, tileDataStartOffset, left, top); + Text_InitWindow(win, text, tileDataStartOffset, left, top); win->win_field_B = -1; - if (win->textMode == 0) + if (win->textMode == TEXT_MODE_UNKNOWN0) { u16 val = GetCursorTileNum(win, 0, 0); u8 *buffer = win->tileData + 32 * val; @@ -2021,9 +2036,9 @@ void sub_8002EB0(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 } } -u8 sub_8002F44(struct Window *win) +u8 Text_PrintWindow8002F44(struct Window *win) { - while (win->state) + while (win->state != WIN_STATE_END) { if (win->state == WIN_STATE_NEWLINE) { @@ -2038,7 +2053,7 @@ u8 sub_8002F44(struct Window *win) sub_8002FA0(win, GetExpandedPlaceholder(win->text[win->textIndex++])); } - InterpretText(win); + PrintNextChar(win); } return 1; } @@ -2048,11 +2063,12 @@ static u8 sub_8002FA0(struct Window *win, const u8 *text) u8 retVal; u8 savedLanguage = win->language; const u8 *savedText = win->text; + u16 savedTextIndex = win->textIndex; win->text = text; win->textIndex = 0; win->state = WIN_STATE_NORMAL; - retVal = sub_8002F44(win); + retVal = Text_PrintWindow8002F44(win); win->text = savedText; win->textIndex = savedTextIndex; win->state = WIN_STATE_NORMAL; @@ -2060,32 +2076,33 @@ static u8 sub_8002FA0(struct Window *win, const u8 *text) return retVal; } -static u8 InterpretText(struct Window *win) +static u8 PrintNextChar(struct Window *win) { u8 c = win->text[win->textIndex++]; + // Handle special control characters switch (c) { - case 0xFF: + case EOS: ClipRight(win); win->state = WIN_STATE_END; return 0; - case 0xFD: + case PLACEHOLDER_BEGIN: win->state = WIN_STATE_PLACEHOLDER; return 2; - case 0xFE: + case CHAR_NEWLINE: ClipRight(win); win->state = WIN_STATE_NEWLINE; return 2; - case 0xFB: + case CHAR_PROMPT_CLEAR: DrawInitialDownArrow(win); - win->state = WIN_STATE_PARAGRAPH; + win->state = WIN_STATE_WAIT_CLEAR; return 2; - case 0xFA: + case CHAR_PROMPT_SCROLL: DrawInitialDownArrow(win); - win->state = WIN_STATE_NEWLINE_WAIT; + win->state = WIN_STATE_WAIT_SCROLL; return 2; - case 0xFC: + case EXT_CTRL_CODE_BEGIN: return HandleExtCtrlCode(win); } @@ -2093,6 +2110,8 @@ static u8 InterpretText(struct Window *win) return 1; } +// Extended 0xFC control functions + static u8 HandleExtCtrlCode(struct Window *win) { return sExtCtrlCodeFuncs[win->text[win->textIndex++]](win); @@ -2105,27 +2124,27 @@ static u8 ExtCtrlCode_Nop(struct Window *win) static u8 ExtCtrlCode_ForegroundColor(struct Window *win) { - SetForegroundColor(win, win->text[win->textIndex++]); + SetWindowForegroundColor(win, win->text[win->textIndex++]); return 2; } static u8 ExtCtrlCode_BackgroundColor(struct Window *win) { - SetBackgroundColor(win, win->text[win->textIndex++]); + SetWindowBackgroundColor(win, win->text[win->textIndex++]); return 2; } static u8 ExtCtrlCode_ShadowColor(struct Window *win) { - SetShadowColor(win, win->text[win->textIndex++]); + SetWindowShadowColor(win, win->text[win->textIndex++]); return 2; } static u8 ExtCtrlCode_AllColors(struct Window *win) { - SetForegroundColor(win, win->text[win->textIndex++]); - SetBackgroundColor(win, win->text[win->textIndex++]); - SetShadowColor(win, win->text[win->textIndex++]); + SetWindowForegroundColor(win, win->text[win->textIndex++]); + SetWindowBackgroundColor(win, win->text[win->textIndex++]); + SetWindowShadowColor(win, win->text[win->textIndex++]); return 2; } @@ -2143,7 +2162,7 @@ static u8 ExtCtrlCode_Font(struct Window *win) static u8 ExtCtrlCode_DefaultFont(struct Window *win) { - win->fontNum = win->config->fontNum; + win->fontNum = win->template->fontNum; return 2; } @@ -2197,7 +2216,7 @@ static u8 ExtCtrlCode_SetCursorY(struct Window *win) static u8 ExtCtrlCode_ClearWindowTextLines(struct Window *win) { - ClearWindowTextLines(win); + Text_ClearWindow(win); return 2; } @@ -2211,7 +2230,7 @@ static u8 ExtCtrlCode_PlaySE(struct Window *win) static void DrawSpace(struct Window *win) { - if (win->textMode == 1 || (win->left + win->cursorX) & 7 || win->spacing <= 7) + if (win->textMode == TEXT_MODE_MONOSPACE || (win->left + win->cursorX) & 7 || win->spacing <= 7) { sPrintGlyphFuncs[win->textMode](win, 0); } @@ -2302,10 +2321,11 @@ static u8 ExtCtrlCode_Latin(struct Window *win) return 2; } -u8 sub_8003418(struct Window *win) +// Prints the window text without expanding any placeholders +u8 Text_PrintWindowSimple(struct Window *win) { u8 retVal = 1; - while (win->state) + while (win->state != WIN_STATE_END) { if (win->state == WIN_STATE_NEWLINE) { @@ -2315,7 +2335,7 @@ u8 sub_8003418(struct Window *win) ClipLeft(win); win->state = WIN_STATE_NORMAL; } - if (InterpretText(win) == 1) + if (PrintNextChar(win) == 1) { retVal = 0; break; @@ -2324,10 +2344,10 @@ u8 sub_8003418(struct Window *win) return retVal; } -u8 sub_8003460(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top) +u8 Text_InitWindowAndPrintText(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top) { - InitWindow(win, text, tileDataStartOffset, left, top); - return sub_8002F44(win); + Text_InitWindow(win, text, tileDataStartOffset, left, top); + return Text_PrintWindow8002F44(win); } u8 sub_8003490(struct Window *win, u8 c, u16 tileDataStartOffset, u8 left, u8 top) @@ -2336,48 +2356,51 @@ u8 sub_8003490(struct Window *win, u8 c, u16 tileDataStartOffset, u8 left, u8 to u8 text[2]; text[0] = c; text[1] = EOS; - InitWindow(win, text, tileDataStartOffset, left, top); - retVal = InterpretText(win); + Text_InitWindow(win, text, tileDataStartOffset, left, top); + retVal = PrintNextChar(win); ClipRight(win); return retVal; } void sub_80034D4(u8 *tileData, const u8 *text) { - sub_8004E3C(&gWindowConfig_81E6C74, tileData, text); + Text_InitWindow8004E3C(&gWindowTemplate_81E6C74, tileData, text); } u8 sub_80034EC(u8 *str) { - return GetStringWidthGivenWindowConfig((struct WindowConfig *)&gWindowConfig_81E6C74, str); + return Text_GetStringWidthFromWindowTemplate((struct WindowTemplate *)&gWindowTemplate_81E6C74, str); } u8 *sub_8003504(u8 *dest, s32 value, u8 alignAmount, u8 alignType) { - sTempWindow.config = (struct WindowConfig *)&gWindowConfig_81E6C74; - InitWindow(&sTempWindow, 0, 0, 0, 0); + sTempWindow.template = (struct WindowTemplate *)&gWindowTemplate_81E6C74; + Text_InitWindow(&sTempWindow, 0, 0, 0, 0); return AlignInt2(&sTempWindow, dest, value, alignAmount, alignType); } u8 *sub_8003558(u8 *dest, const u8 *src, u8 alignAmount, u8 alignType) { - sTempWindow.config = (struct WindowConfig *)&gWindowConfig_81E6C74; - InitWindow(&sTempWindow, src, 0, 0, 0); + sTempWindow.template = (struct WindowTemplate *)&gWindowTemplate_81E6C74; + Text_InitWindow(&sTempWindow, src, 0, 0, 0); return AlignString(&sTempWindow, dest, src, alignAmount, alignType); } -u8 sub_80035AC(struct Window *win) +// Updates the window text +// The text delay can be accelerated by holding the A button +u8 Text_UpdateWindow(struct Window *win) { - sWaitType = 0; + sWaitType = WAIT_TYPE_NORMAL; return UpdateWindowText(win); } +// Returns TRUE when all of the text has been printed. static u8 UpdateWindowText(struct Window *win) { switch (win->state) { case WIN_STATE_WAIT_BUTTON: - if (PlayerCanInterruptWait(win)) + if (PlayerCanInterruptDelay(win)) { if (gMain.newKeys & (A_BUTTON | B_BUTTON)) { @@ -2385,48 +2408,56 @@ static u8 UpdateWindowText(struct Window *win) } else { - return 0; + return FALSE; } } else { win->delayCounter--; if (win->delayCounter) - return 0; + return FALSE; } win->state = WIN_STATE_NORMAL; - return 0; - case WIN_STATE_INTERRUPTIBLE_PAUSE: - if (PlayerCanInterruptWait(win) && (gMain.heldKeys & (A_BUTTON | B_BUTTON)) && gMain.watchedKeysPressed == TRUE) + return FALSE; + case WIN_STATE_CHAR_DELAY: + // Allow the player to speed up text by holding a button + if (PlayerCanInterruptDelay(win) + && (gMain.heldKeys & (A_BUTTON | B_BUTTON)) + && gMain.watchedKeysPressed == TRUE) { win->delayCounter = 0; win->state = WIN_STATE_NORMAL; break; } + // fall through case WIN_STATE_PAUSE: + // Wait for timer to expire, then continue printing if (win->delayCounter) { win->delayCounter--; if (win->delayCounter) - return 0; + return FALSE; } - win->state = WIN_STATE_NORMAL; break; - case WIN_STATE_PARAGRAPH: - if (!WaitWithDownArrow(win)) - return 0; - ClearWindowTextLines(win); - win->state = WIN_STATE_NORMAL; - BLOCK_CROSS_JUMP - return 0; - case WIN_STATE_NEWLINE_WAIT: - if (!WaitWithDownArrow(win)) - return 0; - ScrollWindowTextLines(win); - win->state = WIN_STATE_NORMAL; - BLOCK_CROSS_JUMP - return 0; + case WIN_STATE_WAIT_CLEAR: + // Erase the text once a button is pressed + if (WaitWithDownArrow(win)) + { + Text_ClearWindow(win); + win->state = WIN_STATE_NORMAL; + asm(""); + } + return FALSE; + case WIN_STATE_WAIT_SCROLL: + // Scroll the text once a button is pressed + if (WaitWithDownArrow(win)) + { + ScrollWindowTextLines(win); + win->state = WIN_STATE_NORMAL; + asm(""); + } + return FALSE; case WIN_STATE_PLACEHOLDER: win->textIndex++; win->state = WIN_STATE_NORMAL; @@ -2434,35 +2465,35 @@ static u8 UpdateWindowText(struct Window *win) case WIN_STATE_NEWLINE: ScrollWindowTextLines(win); win->state = WIN_STATE_NORMAL; - BLOCK_CROSS_JUMP - return 0; + asm(""); + return FALSE; case WIN_STATE_BEGIN: - ClearWindowTextLines(win); + Text_ClearWindow(win); break; case WIN_STATE_WAIT_SOUND: if (IsSEPlaying()) - return 0; + return FALSE; win->state = WIN_STATE_NORMAL; break; case WIN_STATE_END: - return 1; + return TRUE; // done printing text case WIN_STATE_NORMAL: break; default: win->state = WIN_STATE_END; - return 1; + return TRUE; } - InterpretText(win); + PrintNextChar(win); switch (win->state) { case WIN_STATE_END: - return 1; + return TRUE; // done printing text case WIN_STATE_WAIT_BUTTON: - case WIN_STATE_PARAGRAPH: - case WIN_STATE_NEWLINE_WAIT: - if (PlayerCanInterruptWait(win)) + case WIN_STATE_WAIT_CLEAR: + case WIN_STATE_WAIT_SCROLL: + if (PlayerCanInterruptDelay(win)) return 0; win->delayCounter = 60; break; @@ -2471,8 +2502,9 @@ static u8 UpdateWindowText(struct Window *win) case WIN_STATE_WAIT_SOUND: break; default: - win->state = WIN_STATE_INTERRUPTIBLE_PAUSE; + win->state = WIN_STATE_CHAR_DELAY; win->delayCounter = GetTextDelay(win); + break; } return 0; @@ -2484,45 +2516,45 @@ static u8 UpdateWindowText(struct Window *win) #define SUB_800374C_LINE_LENGTH 27 #endif -u8 sub_800374C(struct Window *win) +u8 Text_UpdateWindowInBattle(struct Window *win) { u8 retVal; - sWaitType = 1; + sWaitType = WAIT_TYPE_BATTLE; sLineLength = SUB_800374C_LINE_LENGTH; retVal = UpdateWindowText(win); sLineLength = 26; - sWaitType = 0; + sWaitType = WAIT_TYPE_NORMAL; return retVal; } -u8 sub_8003778(struct Window *win) +u8 Text_UpdateWindowAutoscroll(struct Window *win) { u8 retVal; - sWaitType = 2; + sWaitType = WAIT_TYPE_AUTOSCROLL; sLineLength = 26; retVal = UpdateWindowText(win); - sWaitType = 0; + sWaitType = WAIT_TYPE_NORMAL; return retVal; } -u8 sub_80037A0(struct Window *win) +u8 Text_UpdateWindowInContest(struct Window *win) { u8 retVal; - sWaitType = 3; + sWaitType = WAIT_TYPE_CONTEST; sLineLength = 17; retVal = UpdateWindowText(win); sLineLength = 26; return retVal; } -u32 sub_80037C8(struct Window *win, u8 lineLength) +u32 Text_UpdateWindowOverrideLineLength(struct Window *win, u8 lineLength) { u8 retVal; - sWaitType = 0; + sWaitType = WAIT_TYPE_NORMAL; sLineLength = lineLength; retVal = UpdateWindowText(win); sLineLength = 26; @@ -2757,14 +2789,14 @@ static void ApplyColors_ShadowedFont(const void *src, void *dest, u8 foreground, static void SetCursorX(struct Window *win, u8 x) { - if (win->textMode == 0 && ((win->left + win->cursorX) & 7)) + if (win->textMode == TEXT_MODE_UNKNOWN0 && ((win->left + win->cursorX) & 7)) win->tileDataOffset += 2; win->cursorX = x; } static void AddToCursorX(struct Window *win, u8 deltaX) { - if (win->textMode == 0) + if (win->textMode == TEXT_MODE_UNKNOWN0) { u8 x = win->cursorX; win->cursorX += deltaX; @@ -2779,7 +2811,7 @@ static void AddToCursorX(struct Window *win, u8 deltaX) static void AddToCursorY(struct Window *win, u8 deltaY) { - if (win->textMode == 0 && ((win->left + win->cursorX) & 7)) + if (win->textMode == TEXT_MODE_UNKNOWN0 && ((win->left + win->cursorX) & 7)) win->tileDataOffset += 2; win->cursorY += deltaY; } @@ -2788,11 +2820,11 @@ static void EraseAtCursor(struct Window *win) { switch (win->textMode) { - case 0: - case 2: + case TEXT_MODE_UNKNOWN0: + case TEXT_MODE_UNKNOWN2: DrawGlyphTiles(win, 0, 8); break; - case 1: + case TEXT_MODE_MONOSPACE: sWriteGlyphTilemapFuncs[win->fontNum](win, 0); break; } @@ -2801,7 +2833,8 @@ static void EraseAtCursor(struct Window *win) static void ClipLeft(struct Window *win) { u32 pixel = win->left & 7; - if (win->textMode != 1 && pixel) + + if (win->textMode != TEXT_MODE_MONOSPACE && pixel) { const u32 *masks = sGlyphMasks[8][pixel]; u32 outsideMask = masks[0]; @@ -2834,37 +2867,45 @@ static void ClipRight(struct Window *win) { register u8 cursorX asm("r0") = win->cursorX; u8 left = win->left; - u32 pixel = (cursorX + left) & 7; - if (win->textMode != 1 && pixel) + u32 pixelX = (cursorX + left) & 7; + + if (win->textMode != TEXT_MODE_MONOSPACE && pixelX != 0) { - const u32 *masks = sGlyphMasks[8 - pixel][pixel]; + const u32 *masks = sGlyphMasks[8 - pixelX][pixelX]; u32 insideMask = masks[0]; u32 outside = (sGlyphBuffer.background & ~insideMask); - u16 tileNum = GetCursorTileNum(win, 0, 0); - u32 *buffer = (u32 *)(win->tileData + 32 * tileNum); - buffer[0] = (buffer[0] & insideMask) | outside; - buffer[1] = (buffer[1] & insideMask) | outside; - buffer[2] = (buffer[2] & insideMask) | outside; - buffer[3] = (buffer[3] & insideMask) | outside; - buffer[4] = (buffer[4] & insideMask) | outside; - buffer[5] = (buffer[5] & insideMask) | outside; - buffer[6] = (buffer[6] & insideMask) | outside; - buffer[7] = (buffer[7] & insideMask) | outside; + u16 tileNum; + u32 *tileData; + + tileNum = GetCursorTileNum(win, 0, 0); + tileData = (u32 *)(win->tileData + 32 * tileNum); + + tileData[0] = (tileData[0] & insideMask) | outside; + tileData[1] = (tileData[1] & insideMask) | outside; + tileData[2] = (tileData[2] & insideMask) | outside; + tileData[3] = (tileData[3] & insideMask) | outside; + tileData[4] = (tileData[4] & insideMask) | outside; + tileData[5] = (tileData[5] & insideMask) | outside; + tileData[6] = (tileData[6] & insideMask) | outside; + tileData[7] = (tileData[7] & insideMask) | outside; + tileNum = GetCursorTileNum(win, 0, 1); - buffer = (u32 *)(win->tileData + 32 * tileNum); - buffer[0] = (buffer[0] & insideMask) | outside; - buffer[1] = (buffer[1] & insideMask) | outside; - buffer[2] = (buffer[2] & insideMask) | outside; - buffer[3] = (buffer[3] & insideMask) | outside; - buffer[4] = (buffer[4] & insideMask) | outside; - buffer[5] = (buffer[5] & insideMask) | outside; - buffer[6] = (buffer[6] & insideMask) | outside; - buffer[7] = (buffer[7] & insideMask) | outside; + tileData = (u32 *)(win->tileData + 32 * tileNum); + + tileData[0] = (tileData[0] & insideMask) | outside; + tileData[1] = (tileData[1] & insideMask) | outside; + tileData[2] = (tileData[2] & insideMask) | outside; + tileData[3] = (tileData[3] & insideMask) | outside; + tileData[4] = (tileData[4] & insideMask) | outside; + tileData[5] = (tileData[5] & insideMask) | outside; + tileData[6] = (tileData[6] & insideMask) | outside; + tileData[7] = (tileData[7] & insideMask) | outside; + UpdateTilemap(win, 1); } } -static void InitColors(struct Window *win) +static void SetWindowDefaultColors(struct Window *win) { u32 i; @@ -2876,7 +2917,7 @@ static void InitColors(struct Window *win) sGlyphBuffer.colors[i] = i; } -static void SetBackgroundColor(struct Window *win, u8 color) +static void SetWindowBackgroundColor(struct Window *win, u8 color) { u32 val1; u32 val2; @@ -2889,13 +2930,13 @@ static void SetBackgroundColor(struct Window *win, u8 color) sGlyphBuffer.background = val3; } -static void SetShadowColor(struct Window *win, u8 color) +static void SetWindowShadowColor(struct Window *win, u8 color) { win->shadowColor = color; sGlyphBuffer.colors[14] = color; } -static void SetForegroundColor(struct Window *win, u8 color) +static void SetWindowForegroundColor(struct Window *win, u8 color) { win->foregroundColor = color; sGlyphBuffer.colors[15] = color; @@ -2903,25 +2944,25 @@ static void SetForegroundColor(struct Window *win, u8 color) static u8 GetTextDelay(struct Window *win) { - if (!PlayerCanInterruptWait(win)) + if (!PlayerCanInterruptDelay(win)) return 3; return sTextSpeedDelays[gSaveBlock2.optionsTextSpeed]; } -static bool8 PlayerCanInterruptWait(struct Window *win) +static bool8 PlayerCanInterruptDelay(struct Window *win) { bool8 retVal = TRUE; switch (sWaitType) { - case 2: + case WAIT_TYPE_AUTOSCROLL: retVal = FALSE; break; - case 3: + case WAIT_TYPE_CONTEST: retVal = gIsLinkContest ? FALSE : TRUE; break; - case 1: + case WAIT_TYPE_BATTLE: retVal = (gBattleTypeFlags & BATTLE_TYPE_LINK) ? FALSE : TRUE; break; } @@ -2933,13 +2974,13 @@ static void ScrollWindowTextLines(struct Window *win) { switch (win->textMode) { - case 0: + case TEXT_MODE_UNKNOWN0: ScrollWindowTextLines_TextMode0(win); break; - case 1: - ScrollWindowTextLines_TextMode1(win); + case TEXT_MODE_MONOSPACE: + ScrollWindowTextLines_TextModeMonospace(win); break; - case 2: + case TEXT_MODE_UNKNOWN2: ScrollWindowTextLines_TextMode2(win); break; } @@ -2949,6 +2990,7 @@ static void ScrollWindowTextLines_TextMode0(struct Window *win) { if (win->cursorY == 0) { + // Advance to the next line win->tileDataOffset = 2 * sLineLength + 2; win->cursorX = 0; win->cursorY += 16; @@ -2959,7 +3001,7 @@ static void ScrollWindowTextLines_TextMode0(struct Window *win) win->tileDataOffset = 2 * sLineLength + 2; else win->tileDataOffset = 2; - win->win_field_C = win->win_field_C ^ 2; + win->win_field_C ^= 2; win->cursorX = 0; DoScroll_TextMode0(win, sLineLength); } @@ -2973,16 +3015,21 @@ static void DoScroll_TextMode0(struct Window *win, u16 lineLength) u16 fill; buffer += val1 + val2; fill = (win->paletteNum << 12) | GetBlankTileNum(win); + + // Move the bottom line up CpuCopy16(buffer + 64, buffer, lineLength * 2); CpuCopy16(buffer + 96, buffer + 32, lineLength * 2); + + // Clear the bottom line CpuFill16(fill, buffer + 64, lineLength * 2); CpuFill16(fill, buffer + 96, lineLength * 2); } -static void ScrollWindowTextLines_TextMode1(struct Window *win) +static void ScrollWindowTextLines_TextModeMonospace(struct Window *win) { if (win->cursorY == 0) { + // Advance to the next line win->cursorX = 0; win->cursorY += 16; } @@ -2990,17 +3037,21 @@ static void ScrollWindowTextLines_TextMode1(struct Window *win) { win->win_field_C ^= 2; win->cursorX = 0; - DoScroll_TextMode1(win, sLineLength); + DoScroll_TextModeMonospace(win, sLineLength); } } -static void DoScroll_TextMode1(struct Window *win, u16 lineLength) +static void DoScroll_TextModeMonospace(struct Window *win, u16 lineLength) { u16 *buffer = GetCursorTilemapPointer(win); u16 *dest = buffer - 32; u16 fill = (win->paletteNum << 12) | GetBlankTileNum(win); + + // Move the bottom line up CpuCopy16(buffer + 32, dest, lineLength * 2); CpuCopy16(buffer + 64, buffer, lineLength * 2); + + // Clear the bottom line CpuFill16(fill, buffer + 32, lineLength * 2); CpuFill16(fill, buffer + 64, lineLength * 2); } @@ -3009,6 +3060,7 @@ static void ScrollWindowTextLines_TextMode2(struct Window *win) { if (win->cursorY == 0) { + // Advance to the next line win->cursorX = 0; win->cursorY += 16; } @@ -3055,18 +3107,18 @@ static void DoScroll_TextMode2(struct Window *win, u8 lineLength) } } -void ClearWindowTextLines(struct Window *win) +void Text_ClearWindow(struct Window *win) { switch (win->textMode) { - case 0: + case TEXT_MODE_UNKNOWN0: ClearWindowTextLines_TextMode0_TextMode1(win, sLineLength); win->tileDataOffset = 2; break; - case 1: + case TEXT_MODE_MONOSPACE: ClearWindowTextLines_TextMode0_TextMode1(win, sLineLength); break; - case 2: + case TEXT_MODE_UNKNOWN2: ClearWindowTextLines_TextMode2(win, sLineLength); break; } @@ -3074,7 +3126,7 @@ void ClearWindowTextLines(struct Window *win) static void ClearWindowTextLines_TextMode0_TextMode1(struct Window *win, u8 lineLength) { - u8 i; + u8 x, y; u16 *buffer; u16 fill; @@ -3085,11 +3137,10 @@ static void ClearWindowTextLines_TextMode0_TextMode1(struct Window *win, u8 line buffer = GetCursorTilemapPointer(win); fill = GetBlankTileNum(win) | (win->paletteNum << 12); - for (i = 0; i < 4; i++) + for (y = 0; y < 4; y++) { - u8 j; - for (j = 0; j < lineLength; j++) - buffer[j] = fill; + for (x = 0; x < lineLength; x++) + buffer[x] = fill; buffer += 32; } } @@ -3114,13 +3165,13 @@ static void ClearWindowTextLines_TextMode2(struct Window *win, u8 lineLength) static void DrawDownArrow(struct Window *win) { - if (PlayerCanInterruptWait(win)) + if (PlayerCanInterruptDelay(win)) { const u32 *downArrowTiles = &sDownArrowTiles[((win->downArrowCounter & 0x0F00) >> 8) * 16]; switch (win->textMode) { - case 1: + case TEXT_MODE_MONOSPACE: { u8 *buffer; u16 tileNum = win->tileDataStartOffset + 254; @@ -3132,8 +3183,8 @@ static void DrawDownArrow(struct Window *win) WriteGlyphTilemap(win, tileNum, tileNum + 1); break; } - case 0: - case 2: + case TEXT_MODE_UNKNOWN0: + case TEXT_MODE_UNKNOWN2: { struct GlyphTileInfo glyphTileInfo; glyphTileInfo.textMode = win->textMode; @@ -3172,9 +3223,9 @@ static void DrawDownArrow(struct Window *win) static u8 WaitWithDownArrow(struct Window *win) { - u8 retVal = 1; + u8 retVal = TRUE; - if (!PlayerCanInterruptWait(win)) + if (!PlayerCanInterruptDelay(win)) { win->delayCounter--; if (!win->delayCounter) @@ -3183,8 +3234,8 @@ static u8 WaitWithDownArrow(struct Window *win) } else { - DrawMovingDownArrow(win); - retVal = 0; + UpdateDownArrowAnimation(win); + retVal = FALSE; } } else @@ -3196,8 +3247,8 @@ static u8 WaitWithDownArrow(struct Window *win) } else { - DrawMovingDownArrow(win); - retVal = 0; + UpdateDownArrowAnimation(win); + retVal = FALSE; } } @@ -3210,7 +3261,7 @@ static void DrawInitialDownArrow(struct Window *win) DrawDownArrow(win); } -static void DrawMovingDownArrow(struct Window *win) +static void UpdateDownArrowAnimation(struct Window *win) { u16 downArrowPos = (win->downArrowCounter & 0x0F00) >> 8; u16 wait = win->downArrowCounter & 0x000F; @@ -3237,31 +3288,37 @@ static void DrawMovingDownArrow(struct Window *win) static void TryEraseDownArrow(struct Window *win) { win->downArrowCounter = 0; - if (PlayerCanInterruptWait(win) == TRUE) + if (PlayerCanInterruptDelay(win) == TRUE) EraseAtCursor(win); } -u16 GetWindowTilemapEntry(struct Window *win, u8 x, u8 y) +// unused +u16 Text_GetWindowTilemapEntry(struct Window *win, u8 x, u8 y) { u16 *tilemap = win->tilemap; return tilemap[32 * y + x]; } -void DrawWindowRect(struct Window *win, u16 tilemapEntry, u8 left, u8 top, u8 right, u8 bottom) +// unused +void Text_FillWindowBorder(struct Window *win, u16 tilemapEntry, u8 left, u8 top, u8 right, u8 bottom) { u8 i; u16 *buffer = &win->tilemap[top * 32]; + // Fill top border for (i = left; i <= right; i++) buffer[i] = tilemapEntry; for (i = top + 1; i < bottom - 1; i++) { buffer += 32; + // left border buffer[left] = tilemapEntry; + // right border buffer[right] = tilemapEntry; } + // Fill bottom border if (top != bottom) { buffer += 32; @@ -3270,37 +3327,39 @@ void DrawWindowRect(struct Window *win, u16 tilemapEntry, u8 left, u8 top, u8 ri } } +// unused void DrawWindowRect_DefaultPalette(struct Window *win, u16 tileNum, u8 left, u8 top, u8 right, u8 bottom) { - DrawWindowRect(win, (win->paletteNum << 12) | tileNum, left, top, right, bottom); + Text_FillWindowBorder(win, (win->paletteNum << 12) | tileNum, left, top, right, bottom); } -void FillWindowRect(struct Window *win, u16 tilemapEntry, u8 left, u8 top, u8 right, u8 bottom) +// Fills the whole window area with tilemapEntry +void Text_FillWindowRect(struct Window *win, u16 tilemapEntry, u8 left, u8 top, u8 right, u8 bottom) { u16 *buffer = &win->tilemap[top * 32]; while (top++ <= bottom) { - u8 j; - for (j = left; j <= right; j++) - buffer[j] = tilemapEntry; + u8 x; + for (x = left; x <= right; x++) + buffer[x] = tilemapEntry; buffer += 32; } } -void FillWindowRect_DefaultPalette(struct Window *win, u16 tileNum, u8 left, u8 top, u8 right, u8 bottom) +void Text_FillWindowRectDefPalette(struct Window *win, u16 tileNum, u8 left, u8 top, u8 right, u8 bottom) { - FillWindowRect(win, (win->paletteNum << 12) | tileNum, left, top, right, bottom); + Text_FillWindowRect(win, (win->paletteNum << 12) | tileNum, left, top, right, bottom); } -void ZeroFillWindowRect(struct Window *win, u8 left, u8 top, u8 right, u8 bottom) +void Text_EraseWindowRect(struct Window *win, u8 left, u8 top, u8 right, u8 bottom) { - FillWindowRect_DefaultPalette(win, 0, left, top, right, bottom); + Text_FillWindowRectDefPalette(win, 0, left, top, right, bottom); } -void FillWindowRectWithBlankTile(struct Window *win, u8 left, u8 top, u8 right, u8 bottom) +void Text_BlankWindowRect(struct Window *win, u8 left, u8 top, u8 right, u8 bottom) { u16 tileNum = GetBlankTileNum(win); - FillWindowRect_DefaultPalette(win, tileNum, left, top, right, bottom); + Text_FillWindowRectDefPalette(win, tileNum, left, top, right, bottom); } static u16 GetBlankTileNum(struct Window *win) @@ -3309,12 +3368,12 @@ static u16 GetBlankTileNum(struct Window *win) switch (win->textMode) { - case 0: + case TEXT_MODE_UNKNOWN0: break; - case 2: + case TEXT_MODE_UNKNOWN2: retVal++; break; - case 1: + case TEXT_MODE_MONOSPACE: switch (win->fontNum) { case 1: @@ -3451,7 +3510,7 @@ u8 *AlignInt2(struct Window *win, u8 *dest, s32 value, u8 alignAmount, u8 alignT ConvertIntToDecimalString(temp, value); width = GetStringWidth(win, temp); dest = StringCopy(dest, temp); - dest[0] = 0xFC; + dest[0] = EXT_CTRL_CODE_BEGIN; dest[1] = 17; dest[2] = alignAmount - width; dest += 3; @@ -3462,7 +3521,7 @@ u8 *AlignInt2(struct Window *win, u8 *dest, s32 value, u8 alignAmount, u8 alignT width = GetStringWidth(win, temp); if (alignAmount > width) { - dest[0] = 0xFC; + dest[0] = EXT_CTRL_CODE_BEGIN; dest[1] = 17; dest[2] = alignAmount - width; dest += 3; @@ -3474,7 +3533,7 @@ u8 *AlignInt2(struct Window *win, u8 *dest, s32 value, u8 alignAmount, u8 alignT width = GetStringWidth(win, temp); if (alignAmount > width) { - dest[0] = 0xFC; + dest[0] = EXT_CTRL_CODE_BEGIN; dest[1] = 17; dest[2] = (alignAmount - width) / 2; dest += 3; @@ -3482,7 +3541,7 @@ u8 *AlignInt2(struct Window *win, u8 *dest, s32 value, u8 alignAmount, u8 alignT dest = StringCopy(dest, temp); if (alignAmount > width) { - dest[0] = 0xFC; + dest[0] = EXT_CTRL_CODE_BEGIN; dest[1] = 17; dest[2] = (alignAmount - width) / 2; dest += 3; @@ -3500,7 +3559,7 @@ u8 *AlignString(struct Window *win, u8 *dest, const u8 *src, u8 alignAmount, u8 { case 0: dest = StringCopy(dest, src); - dest[0] = 0xFC; + dest[0] = EXT_CTRL_CODE_BEGIN; dest[1] = 19; dest[2] = alignAmount; dest += 3; @@ -3510,7 +3569,7 @@ u8 *AlignString(struct Window *win, u8 *dest, const u8 *src, u8 alignAmount, u8 width = GetStringWidth(win, src); if (alignAmount > width) { - dest[0] = 0xFC; + dest[0] = EXT_CTRL_CODE_BEGIN; dest[1] = 19; dest[2] = alignAmount - width; dest += 3; @@ -3521,7 +3580,7 @@ u8 *AlignString(struct Window *win, u8 *dest, const u8 *src, u8 alignAmount, u8 width = GetStringWidth(win, src); if (alignAmount > width) { - dest[0] = 0xFC; + dest[0] = EXT_CTRL_CODE_BEGIN; dest[1] = 19; dest[2] = (alignAmount - width) / 2; dest += 3; @@ -3529,7 +3588,7 @@ u8 *AlignString(struct Window *win, u8 *dest, const u8 *src, u8 alignAmount, u8 dest = StringCopy(dest, src); if (alignAmount > width) { - dest[0] = 0xFC; + dest[0] = EXT_CTRL_CODE_BEGIN; dest[1] = 19; dest[2] = alignAmount; dest += 3; @@ -3544,16 +3603,16 @@ u8 GetStringWidth(struct Window *win, const u8 *s) { u8 width = 0; u8 savedFontNum = win->fontNum; - u8 savedCharset = win->language; + u8 savedLanguage = win->language; u8 savedSpacing = win->spacing; s32 i = 0; - while (s[i] != 0xFF) + while (s[i] != EOS) { u8 c = s[i]; switch (c) { - case 0xFD: + case PLACEHOLDER_BEGIN: { u8 temp; i++; @@ -3563,7 +3622,7 @@ u8 GetStringWidth(struct Window *win, const u8 *s) i++; break; } - case 0xFC: + case EXT_CTRL_CODE_BEGIN: i++; switch (s[i]) { @@ -3571,7 +3630,7 @@ u8 GetStringWidth(struct Window *win, const u8 *s) win->fontNum = s[i + 1]; break; case 7: - win->fontNum = win->config->fontNum; + win->fontNum = win->template->fontNum; break; case 0x11: width += s[i + 1]; @@ -3601,64 +3660,64 @@ u8 GetStringWidth(struct Window *win, const u8 *s) } win->spacing = savedSpacing; - win->language = savedCharset; + win->language = savedLanguage; win->fontNum = savedFontNum; return width; } -u8 sub_8004D04(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u16 top, u32 a6) +u8 Text_InitWindow8004D04(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u16 top, u32 a6) { - sub_8002E4C(win, text, tileDataStartOffset, left, top, a6); - return sub_8002F44(win); + Text_InitWindow8002E4C(win, text, tileDataStartOffset, left, top, a6); + return Text_PrintWindow8002F44(win); } -u8 sub_8004D38(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top) +u8 Text_InitWindow8004D38(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top) { u8 width = GetStringWidth(win, text); - InitWindow(win, text, tileDataStartOffset, left - ((u32)(width + 7) >> 3), top); + Text_InitWindow(win, text, tileDataStartOffset, left - ((u32)(width + 7) >> 3), top); EraseAtCursor(win); width &= 7; if (width) width = 8 - width; sub_80048D8(win, width, 0); - return sub_8002F44(win); + return Text_PrintWindow8002F44(win); } -u8 sub_8004DB0(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top, u16 a6) +u8 Text_InitWindow8004DB0(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top, u16 a6) { register u32 val asm("r5") = (u8)((a6 >> 1) - (GetStringWidth(win, text) >> 1)); left += (val >> 3); - InitWindow(win, text, tileDataStartOffset, left, top); + Text_InitWindow(win, text, tileDataStartOffset, left, top); EraseAtCursor(win); sub_80048D8(win, val & 7, 0); - return sub_8002F44(win); + return Text_PrintWindow8002F44(win); } -u8 sub_8004E24(struct Window *win) +u8 Text_GetWindowPaletteNum(struct Window *win) { return win->paletteNum; } -void sub_8004E28(struct Window *win, u8 *foreground, u8 *background, u8 *shadow) +void Text_GetTextColors(struct Window *win, u8 *foreground, u8 *background, u8 *shadow) { *foreground = win->foregroundColor; *background = win->backgroundColor; *shadow = win->shadowColor; } -void sub_8004E3C(const struct WindowConfig *winConfig, u8 *tileData, const u8 *text) +void Text_InitWindow8004E3C(const struct WindowTemplate *winTemplate, u8 *tileData, const u8 *text) { - sTempWindow.config = winConfig; - InitWindow(&sTempWindow, text, 0, 0, 0); + sTempWindow.template = winTemplate; + Text_InitWindow(&sTempWindow, text, 0, 0, 0); sTempWindow.tileData = tileData; - sub_8002F44(&sTempWindow); + Text_PrintWindow8002F44(&sTempWindow); } -u8 GetStringWidthGivenWindowConfig(const struct WindowConfig *winConfig, const u8 *s) +u8 Text_GetStringWidthFromWindowTemplate(const struct WindowTemplate *winTemplate, const u8 *s) { - sTempWindow.config = winConfig; - InitWindow(&sTempWindow, s, 0, 0, 0); + sTempWindow.template = winTemplate; + Text_InitWindow(&sTempWindow, s, 0, 0, 0); return GetStringWidth(&sTempWindow, s); } @@ -3668,11 +3727,11 @@ void ConvertInternationalString(u8 *s, u8 language) { u8 i; - StripExtCtrlCodes(s); + Text_StripExtCtrlCodes(s); i = StringLength(s); - s[i++] = 0xFC; + s[i++] = EXT_CTRL_CODE_BEGIN; s[i++] = 22; - s[i++] = 0xFF; + s[i++] = EOS; i--; @@ -3682,18 +3741,18 @@ void ConvertInternationalString(u8 *s, u8 language) i--; } - s[0] = 0xFC; + s[0] = EXT_CTRL_CODE_BEGIN; s[1] = 21; } } -void StripExtCtrlCodes(u8 *str) +void Text_StripExtCtrlCodes(u8 *str) { u16 srcIndex = 0; u16 destIndex = 0; - while (str[srcIndex] != 0xFF) + while (str[srcIndex] != EOS) { - if (str[srcIndex] == 0xFC) + if (str[srcIndex] == EXT_CTRL_CODE_BEGIN) { srcIndex++; srcIndex += GetExtCtrlCodeLength(str[srcIndex]); @@ -3703,12 +3762,12 @@ void StripExtCtrlCodes(u8 *str) str[destIndex++] = str[srcIndex++]; } } - str[destIndex] = 0xFF; + str[destIndex] = EOS; } static const u8 *SkipExtCtrlCode(const u8 *s) { - while (*s == 0xFC) + while (*s == EXT_CTRL_CODE_BEGIN) { s++; s += GetExtCtrlCodeLength(*s); @@ -3801,8 +3860,8 @@ u8 sub_8004FD0(struct Window *win, u8 *dest, const u8 *src, u16 tileDataStartOff if (endsWithoutNewline) newlineCount++; - sub_8002E4C(win, start, tileDataStartOffset, left, top, a8); - sub_8002F44(win); + Text_InitWindow8002E4C(win, start, tileDataStartOffset, left, top, a8); + Text_PrintWindow8002F44(win); return newlineCount; } @@ -3827,7 +3886,7 @@ static s32 DrawGlyphTile_UnshadowedFont(struct GlyphTileInfo *glyphTileInfo) if (glyphTileInfo->startPixel + glyphTileInfo->width > 8) { u32 mask2 = masks[1]; - if (glyphTileInfo->textMode == 2) + if (glyphTileInfo->textMode == TEXT_MODE_UNKNOWN2) { glyphBuffer->pixelRows[8] = buffer[8] & mask2; glyphBuffer->pixelRows[9] = buffer[9] & mask2; @@ -3867,7 +3926,7 @@ static s32 DrawGlyphTile_UnshadowedFont(struct GlyphTileInfo *glyphTileInfo) if (glyphTileInfo->startPixel + glyphTileInfo->width > 8) { - if (glyphTileInfo->textMode != 2) + if (glyphTileInfo->textMode != TEXT_MODE_UNKNOWN2) buffer += 8; buffer[8] = glyphBuffer->pixelRows[8]; buffer[9] = glyphBuffer->pixelRows[9]; @@ -4039,7 +4098,7 @@ static s32 DrawGlyphTile_ShadowedFont(struct GlyphTileInfo *glyphTileInfo) if (glyphTileInfo->startPixel + glyphTileInfo->width > 8) { u32 mask2 = masks[1]; - if (glyphTileInfo->textMode == 2) + if (glyphTileInfo->textMode == TEXT_MODE_UNKNOWN2) { glyphBuffer->pixelRows[8] = buffer[8] & mask2; glyphBuffer->pixelRows[9] = buffer[9] & mask2; @@ -4076,7 +4135,7 @@ static s32 DrawGlyphTile_ShadowedFont(struct GlyphTileInfo *glyphTileInfo) if (glyphTileInfo->startPixel + glyphTileInfo->width > 8) { - if (glyphTileInfo->textMode != 2) + if (glyphTileInfo->textMode != TEXT_MODE_UNKNOWN2) buffer += 8; buffer[8] = glyphBuffer->pixelRows[8]; buffer[9] = glyphBuffer->pixelRows[9]; @@ -4314,7 +4373,7 @@ static u16 GetCursorTileNum(struct Window *win, u32 xOffset, u32 yOffset) { u16 index; - if (win->textMode == 2) + if (win->textMode == TEXT_MODE_UNKNOWN2) index = win->tileDataStartOffset + win->tileDataOffset + (((win->top + win->cursorY) >> 3) + yOffset) * win->width diff --git a/src/engine/text_window.c b/src/engine/text_window.c index c001ddefc..ade349f4e 100644 --- a/src/engine/text_window.c +++ b/src/engine/text_window.c @@ -4,19 +4,22 @@ #include "palette.h" #include "text.h" -#define STD_MSG_BOX_LEFT 0 -#define STD_MSG_BOX_TOP 14 -#define STD_MSG_BOX_WIDTH 26 -#define STD_MSG_BOX_HEIGHT 4 +#define STD_WINDOW_PALETTE_NUM 14 + +// Dimensions (in tiles) of a field dialogue frame +#define STD_DLG_FRAME_LEFT 0 +#define STD_DLG_FRAME_TOP 14 +#define STD_DLG_FRAME_WIDTH 26 +#define STD_DLG_FRAME_HEIGHT 4 static void LoadTextWindowTiles(u8, void *); static void LoadTextWindowPalette(u8, u8); -static void DrawTextWindowInternal(u16 *dest, u16 baseTileNum, u8 left, u8 top, u8 right, u8 bottom); -static u16 GetMessageBoxTilemapEntry(u16 tilemapEntry, u8 x, u8 y, u8 width, u8 height); -static void DrawMessageBox(struct Window *win, u8 left, u8 top, u8 width, u8 height); +static void DrawStandardFrame(u16 *dest, u16 baseTileNum, u8 left, u8 top, u8 right, u8 bottom); +static u16 GetDialogueFrameTilemapEntry(u16 tilemapEntry, u8 x, u8 y, u8 width, u8 height); +static void DrawDialogueFrame(struct Window *win, u8 left, u8 top, u8 width, u8 height); static u16 sTextWindowBaseTileNum; -static u16 sMessageBoxBaseTileNum; +static u16 sDialogueFrameBaseTileNum; extern const u8 gTextWindowFrame1_Gfx[]; extern const u8 gTextWindowFrame2_Gfx[]; @@ -60,9 +63,9 @@ extern const u16 gTextWindowFrame18_Pal[]; extern const u16 gTextWindowFrame19_Pal[]; extern const u16 gTextWindowFrame20_Pal[]; -extern const u8 gMessageBox_Gfx[]; +extern const u8 gDialogueFrame_Gfx[]; -static const struct FrameGraphics gUnknown_083761F0[20] = +static const struct FrameGraphics sTextWindowFrameGraphics[20] = { {gTextWindowFrame1_Gfx, gTextWindowFrame1_Pal}, {gTextWindowFrame2_Gfx, gTextWindowFrame2_Pal}, @@ -86,7 +89,7 @@ static const struct FrameGraphics gUnknown_083761F0[20] = {gTextWindowFrame20_Gfx, gTextWindowFrame20_Pal}, }; -static const u16 gMessageBoxTilemap[5][7] = +static const u16 sDialogueFrameTilemap[5][7] = { {1, 3, 4, 4, 5, 6, 9}, {11, 9, 9, 9, 9, 0x040B, 9}, @@ -95,113 +98,124 @@ static const u16 gMessageBoxTilemap[5][7] = {0x0801, 0x0803, 0x0804, 0x0804, 0x0805, 0x0806, 9}, }; -u16 SetTextWindowBaseTileNum(u16 baseTileNum) +u16 TextWindow_SetBaseTileNum(u16 baseTileNum) { sTextWindowBaseTileNum = baseTileNum; return baseTileNum + 9; } -void LoadTextWindowGraphics(struct Window *win) +// Loads the tiles and palette of the window frame into VRAM using the selected frame type +void TextWindow_LoadStdFrameGraphics(struct Window *win) { - u8 *tileData = win->config->tileData + TILE_SIZE_4BPP * sTextWindowBaseTileNum; + u8 *tileData = win->template->tileData + TILE_SIZE_4BPP * sTextWindowBaseTileNum; LoadTextWindowTiles(gSaveBlock2.optionsWindowFrameType, tileData); - LoadTextWindowPalette(gSaveBlock2.optionsWindowFrameType, 0xE); + LoadTextWindowPalette(gSaveBlock2.optionsWindowFrameType, STD_WINDOW_PALETTE_NUM); } -void LoadTextWindowGraphics_OverridePalSlot(struct Window *win, u8 palSlot) +// Loads the tiles and palette of the window frame into VRAM with an alternate palette +void TextWindow_LoadStdFrameGraphicsOverridePal(struct Window *win, u8 palSlot) { - u8 *tileData = win->config->tileData + TILE_SIZE_4BPP * sTextWindowBaseTileNum; + u8 *tileData = win->template->tileData + TILE_SIZE_4BPP * sTextWindowBaseTileNum; LoadTextWindowTiles(gSaveBlock2.optionsWindowFrameType, tileData); LoadTextWindowPalette(gSaveBlock2.optionsWindowFrameType, palSlot); } -void LoadTextWindowGraphics_OverrideFrameType(struct Window *win, u8 frameType) +// Loads the tiles and palette of the window frame into VRAM with an alternate frame type +void TextWindow_LoadStdFrameGraphicsOverrideStyle(struct Window *win, u8 frameType) { - u8 *tileData = win->config->tileData + TILE_SIZE_4BPP * sTextWindowBaseTileNum; + u8 *tileData = win->template->tileData + TILE_SIZE_4BPP * sTextWindowBaseTileNum; LoadTextWindowTiles(frameType, tileData); - LoadTextWindowPalette(frameType, 0xE); + LoadTextWindowPalette(frameType, STD_WINDOW_PALETTE_NUM); } -void DrawTextWindow(struct Window *win, u8 left, u8 top, u8 right, u8 bottom) +void TextWindow_DrawStdFrame(struct Window *win, u8 left, u8 top, u8 right, u8 bottom) { - DrawTextWindowInternal(win->config->tilemap, sTextWindowBaseTileNum, left, top, right, bottom); + DrawStandardFrame(win->template->tilemap, sTextWindowBaseTileNum, left, top, right, bottom); } -const struct FrameGraphics *GetTextWindowFrameGraphics(u8 frameType) +// Returns the tile data and palette for the specified frame type +const struct FrameGraphics *TextWindow_GetFrameGraphics(u8 frameType) { if (frameType > 19) - return &gUnknown_083761F0[0]; + return &sTextWindowFrameGraphics[0]; else - return &gUnknown_083761F0[frameType]; + return &sTextWindowFrameGraphics[frameType]; } static void LoadTextWindowTiles(u8 frameType, void *dest) { - const struct FrameGraphics *frameGraphics = GetTextWindowFrameGraphics(frameType); + const struct FrameGraphics *frameGraphics = TextWindow_GetFrameGraphics(frameType); CpuFastCopy(frameGraphics->tiles, dest, 9 * TILE_SIZE_4BPP); } static void LoadTextWindowPalette(u8 frameType, u8 palSlot) { - const struct FrameGraphics *frameGraphics = GetTextWindowFrameGraphics(frameType); + const struct FrameGraphics *frameGraphics = TextWindow_GetFrameGraphics(frameType); LoadPalette(frameGraphics->palette, 16 * palSlot, 0x20); } -static void DrawTextWindowInternal(u16 *dest, u16 baseTileNum, u8 left, u8 top, u8 right, u8 bottom) +// Draws a standard window frame +static void DrawStandardFrame(u16 *tilemap, u16 baseTileNum, u8 left, u8 top, u8 right, u8 bottom) { + u8 startX = min(left, right); + u8 endX = max(left, right); + u8 startY = min(top, bottom); + u8 endY = max(top, bottom); u8 x, y; - u8 startX, endX; - u8 startY, endY; - - startX = (left < right) ? left : right; - endX = (right > left) ? right : left; - - startY = (top < bottom) ? top : bottom; - endY = (bottom > top) ? bottom : top; - dest[32 * startY + startX] = baseTileNum | 0xE000; + // top left corner + tilemap[32 * startY + startX] = baseTileNum | (STD_WINDOW_PALETTE_NUM << 12); + // top border for (x = startX + 1; x < endX; x++) - dest[32 * startY + x] = (baseTileNum + 1) | 0xE000; + tilemap[32 * startY + x] = (baseTileNum + 1) | (STD_WINDOW_PALETTE_NUM << 12); - dest[32 * startY + endX] = (baseTileNum + 2) | 0xE000; + // top right corner + tilemap[32 * startY + endX] = (baseTileNum + 2) | (STD_WINDOW_PALETTE_NUM << 12); for (y = startY + 1; y < endY; y++) { - dest[32 * y + startX] = (baseTileNum + 3) | 0xE000; + // left border + tilemap[32 * y + startX] = (baseTileNum + 3) | (STD_WINDOW_PALETTE_NUM << 12); + // middle for (x = startX + 1; x < endX; x++) - dest[32 * y + x] = (baseTileNum + 4) | 0xE000; + tilemap[32 * y + x] = (baseTileNum + 4) | (STD_WINDOW_PALETTE_NUM << 12); - dest[32 * y + endX] = (baseTileNum + 5) | 0xE000; + // right border + tilemap[32 * y + endX] = (baseTileNum + 5) | (STD_WINDOW_PALETTE_NUM << 12); } - dest[32 * endY + startX] = (baseTileNum + 6) | 0xE000; + // bottom left corner + tilemap[32 * endY + startX] = (baseTileNum + 6) | (STD_WINDOW_PALETTE_NUM << 12); + // bottom border for (x = startX + 1; x < endX; x++) - dest[32 * endY + x] = (baseTileNum + 7) | 0xE000; + tilemap[32 * endY + x] = (baseTileNum + 7) | (STD_WINDOW_PALETTE_NUM << 12); - dest[32 * endY + endX] = (baseTileNum + 8) | 0xE000; + // bottom right corner + tilemap[32 * endY + endX] = (baseTileNum + 8) | (STD_WINDOW_PALETTE_NUM << 12); } -u16 SetMessageBoxBaseTileNum(u16 baseTileNum) +u16 TextWindow_SetDlgFrameBaseTileNum(u16 baseTileNum) { - sMessageBoxBaseTileNum = baseTileNum; + sDialogueFrameBaseTileNum = baseTileNum; return baseTileNum + 14; } void unref_sub_80651DC(struct Window *win, u8 *text) { - sub_8002EB0(win, text, sMessageBoxBaseTileNum + 14, 2, 15); + Text_InitWindow8002EB0(win, text, sDialogueFrameBaseTileNum + 14, 2, 15); } -void DisplayMessageBox(struct Window *win) +// Loads and draws a dialogue window frame +void TextWindow_DisplayDialogueFrame(struct Window *win) { - LoadMessageBoxTiles(win); - DrawStandardMessageBox(win); + TextWindow_LoadDialogueFrameTiles(win); + TextWindow_DrawDialogueFrame(win); } -static u16 GetMessageBoxTilemapEntry(u16 baseTilemapEntry, u8 x, u8 y, u8 width, u8 height) +static u16 GetDialogueFrameTilemapEntry(u16 baseTilemapEntry, u8 x, u8 y, u8 width, u8 height) { u16 tilemapEntry = 9; @@ -215,42 +229,47 @@ static u16 GetMessageBoxTilemapEntry(u16 baseTilemapEntry, u8 x, u8 y, u8 width, else if (x > 2) x = 3; - if (x <= 6 && y <= 4) - tilemapEntry = gMessageBoxTilemap[y][x]; + if (x < 7 && y < 5) + tilemapEntry = sDialogueFrameTilemap[y][x]; tilemapEntry += baseTilemapEntry; return tilemapEntry; } -static void DrawMessageBox(struct Window *win, u8 left, u8 top, u8 width, u8 height) +static void DrawDialogueFrame(struct Window *win, u8 left, u8 top, u8 width, u8 height) { - u8 i, j; - u16 tilemapEntry = (win->paletteNum << 12) | sMessageBoxBaseTileNum; - u16 *tilemap = win->config->tilemap; + u8 x, y; + u16 baseTilemapEntry = (win->paletteNum << 12) | sDialogueFrameBaseTileNum; + u16 *tilemap = win->template->tilemap; - for (i = 0; i < height + 2; i++) - for (j = 0; j < width + 6; j++) - tilemap[(left + j) + 32 * (top + i)] = (win->paletteNum << 12) | GetMessageBoxTilemapEntry(tilemapEntry, j, i, width, height); + for (y = 0; y < height + 2; y++) + { + for (x = 0; x < width + 6; x++) + tilemap[(left + x) + 32 * (top + y)] = (win->paletteNum << 12) | GetDialogueFrameTilemapEntry(baseTilemapEntry, x, y, width, height); + } } -void DrawStandardMessageBox(struct Window *win) +// Draws an alternate styled frame used for dialogue windows that appear on the overworld +void TextWindow_DrawDialogueFrame(struct Window *win) { - DrawMessageBox(win, STD_MSG_BOX_LEFT, STD_MSG_BOX_TOP, STD_MSG_BOX_WIDTH, STD_MSG_BOX_HEIGHT); + DrawDialogueFrame(win, STD_DLG_FRAME_LEFT, STD_DLG_FRAME_TOP, STD_DLG_FRAME_WIDTH, STD_DLG_FRAME_HEIGHT); } -void LoadMessageBoxTiles(struct Window *win) +// Loads the dialogue window frame tiles into VRAM +void TextWindow_LoadDialogueFrameTiles(struct Window *win) { - u8 *tileData = win->config->tileData; - CpuFastCopy(gMessageBox_Gfx, tileData + 32 * sMessageBoxBaseTileNum, 14 * TILE_SIZE_4BPP); + u8 *tileData = win->template->tileData; + CpuFastCopy(gDialogueFrame_Gfx, tileData + 32 * sDialogueFrameBaseTileNum, 14 * TILE_SIZE_4BPP); } -void ClearStandardMessageBox(struct Window *win) +// Erases a dialogue window frame +void TextWindow_EraseDialogueFrame(struct Window *win) { u8 i; - u16 *tilemap = win->config->tilemap + (STD_MSG_BOX_TOP * 32); + u16 *tilemap = win->template->tilemap + (STD_DLG_FRAME_TOP * 32); u16 tilemapEntry = win->paletteNum << 12; - for (i = 0; i < ((STD_MSG_BOX_HEIGHT + 2) * 32); i++) + for (i = 0; i < ((STD_DLG_FRAME_HEIGHT + 2) * 32); i++) tilemap[i] = tilemapEntry; } diff --git a/src/engine/time_events.c b/src/engine/time_events.c index 3e3054aa3..4bd732788 100644 --- a/src/engine/time_events.c +++ b/src/engine/time_events.c @@ -93,7 +93,7 @@ void UpdateShoalTideFlag(void) static void Task_WaitWeather(u8 taskId) { - if (sub_807DDFC()) + if (IsWeatherChangeComplete()) { EnableBothScriptContexts(); DestroyTask(taskId); diff --git a/src/engine/trade.c b/src/engine/trade.c index 0bc589ff4..36e6fc757 100644 --- a/src/engine/trade.c +++ b/src/engine/trade.c @@ -141,7 +141,7 @@ struct TradeEwramStruct { }; static void sub_8047EC0(void); -static void sub_804AFB8(const struct WindowConfig *, u8 *, const u8 *, u8); +static void sub_804AFB8(const struct WindowTemplate *, u8 *, const u8 *, u8); static void sub_804ACD8(const u8 *, u8 *, u8); static void nullsub_5(u8, u8); static void sub_804AA88(void); @@ -213,12 +213,14 @@ static #endif void sub_804DB84(void); -extern u8 gUnknown_020297D8[2]; -extern u8 *gUnknown_020296CC[13]; +EWRAM_DATA u8 *gUnknown_020296CC[13] = {0}; +EWRAM_DATA struct MailStruct gUnknown_02029700[6] = {0}; +EWRAM_DATA u8 gUnknown_020297D8[2] = {0}; + extern struct TradeEwramSubstruct *gUnknown_03004824; -extern struct MailStruct gUnknown_02029700[16]; -const u32 unref_data_820ABD4[] = { +const u32 unref_data_820ABD4[] = +{ 0x00000890, 0x00003AC0, 0x0000001C, @@ -1016,10 +1018,10 @@ void sub_8047CD8(void) static void sub_8047CE8(void) { u8 mpId; - sub_804AFB8(&gWindowConfig_81E725C, gUnknown_020296CC[0], gSaveBlock2.playerName, 0xC); + sub_804AFB8(&gWindowTemplate_81E725C, gUnknown_020296CC[0], gSaveBlock2.playerName, 0xC); mpId = GetMultiplayerId(); - sub_804AFB8(&gWindowConfig_81E725C, gUnknown_020296CC[3], gLinkPlayers[mpId ^ 1].name, 0xC); - sub_804AFB8(&gWindowConfig_81E725C, gUnknown_020296CC[6], gUnknown_0820C14C[0], 0x8); + sub_804AFB8(&gWindowTemplate_81E725C, gUnknown_020296CC[3], gLinkPlayers[mpId ^ 1].name, 0xC); + sub_804AFB8(&gWindowTemplate_81E725C, gUnknown_020296CC[6], gUnknown_0820C14C[0], 0x8); sub_804ACD8(gUnknown_0820C14C[1], gUnknown_020296CC[8], 0x14); nullsub_5(3, 0); } @@ -1087,12 +1089,12 @@ static void sub_8047EC0(void) ResetTasks(); sub_804A964(&gUnknown_03004824->unk_00c8, BG_SCREEN_ADDR(5)); SetVBlankCallback(sub_80489F4); - InitMenuWindow(&gWindowConfig_81E6CE4); - SetUpWindowConfig(&gWindowConfig_81E6F84); - InitWindowFromConfig(&gUnknown_03004824->window, &gWindowConfig_81E6F84); - gUnknown_03004824->unk_007a = SetTextWindowBaseTileNum(20); - LoadTextWindowGraphics(&gUnknown_03004824->window); - MenuZeroFillScreen(); + InitMenuWindow(&gWindowTemplate_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6F84); + Text_InitWindowWithTemplate(&gUnknown_03004824->window, &gWindowTemplate_81E6F84); + gUnknown_03004824->unk_007a = TextWindow_SetBaseTileNum(20); + TextWindow_LoadStdFrameGraphics(&gUnknown_03004824->window); + Menu_EraseScreen(); sub_809D51C(); gUnknown_03004824->unk_0075 = 0; gUnknown_03004824->unk_007b = 0; @@ -1157,7 +1159,7 @@ static void sub_8047EC0(void) break; case 6: CalculateEnemyPartyCount(); - FillWindowRect_DefaultPalette(&gUnknown_03004824->window, 0, 0, 0, 29, 19); + Text_FillWindowRectDefPalette(&gUnknown_03004824->window, 0, 0, 0, 29, 19); REG_DISPCNT = 0; gUnknown_03004824->partyCounts[0] = gPlayerPartyCount; gUnknown_03004824->partyCounts[1] = gEnemyPartyCount; @@ -1267,12 +1269,12 @@ static void sub_80484F4(void) ResetTasks(); sub_804A964(&gUnknown_03004824->unk_00c8, BG_SCREEN_ADDR(5)); SetVBlankCallback(sub_80489F4); - InitMenuWindow(&gWindowConfig_81E6CE4); - SetUpWindowConfig(&gWindowConfig_81E6F84); - InitWindowFromConfig(&gUnknown_03004824->window, &gWindowConfig_81E6F84); - gUnknown_03004824->unk_007a = SetTextWindowBaseTileNum(20); - LoadTextWindowGraphics(&gUnknown_03004824->window); - MenuZeroFillScreen(); + InitMenuWindow(&gWindowTemplate_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6F84); + Text_InitWindowWithTemplate(&gUnknown_03004824->window, &gWindowTemplate_81E6F84); + gUnknown_03004824->unk_007a = TextWindow_SetBaseTileNum(20); + TextWindow_LoadStdFrameGraphics(&gUnknown_03004824->window); + Menu_EraseScreen(); sub_809D51C(); gUnknown_03004824->unk_0075 = 0; gUnknown_03004824->unk_007b = 0; @@ -1453,9 +1455,7 @@ static void sub_8048AB4(void) static void sub_8048B0C(u8 a0) { int i; - u16 *dest; - const u16 *src; - u32 size; + switch (a0) { case 0: @@ -1464,30 +1464,13 @@ static void sub_8048B0C(u8 a0) gPlttBufferUnfaded[i] = *(gUnknown_08EA02C8 + i); gPlttBufferFaded[i] = *(gUnknown_08EA02C8 + i); } - src = gUnknown_08EA0348; - dest = (u16 *)BG_VRAM; - size = 0x1280; - while (1) - { - DmaCopy16(3, src, dest, BLOCKSIZE * sizeof(u16)); - src += BLOCKSIZE; - dest += BLOCKSIZE; - size -= BLOCKSIZE * sizeof(u16); - if (size <= BLOCKSIZE * sizeof(u16)) - { - DmaCopy16(3, src, dest, size); - break; - } - } + DmaCopyLarge16(3, gUnknown_08EA0348, (void *)BG_VRAM, 0x1280, 0x1000); for (i = 0; i < 0x400; i ++) gUnknown_03004824->unk_00c8.unk_12[i] = gUnknown_08EA15C8[i]; - dest = BG_SCREEN_ADDR(6); - DmaCopy16(3, gTradeStripesBG2Tilemap, dest, 0x800); + DmaCopy16Defvars(3, gTradeStripesBG2Tilemap, BG_SCREEN_ADDR(6), 0x800); break; case 1: - src = gTradeStripesBG3Tilemap; - dest = BG_SCREEN_ADDR(7); - DmaCopy16(3, src, dest, 0x800); + DmaCopy16Defvars(3, gTradeStripesBG3Tilemap, BG_SCREEN_ADDR(7), 0x800); sub_804A6DC(0); sub_804A6DC(1); sub_804A938(&gUnknown_03004824->unk_00c8); @@ -1728,7 +1711,7 @@ static bool8 sub_8048D44(void) gUnknown_03004824->unk_0075 ++; break; case 1: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { if (GetBlockReceivedStatus() == 0) { @@ -2096,8 +2079,8 @@ static void sub_8049680(void) PlaySE(SE_SELECT); if (gUnknown_03004824->tradeMenuCursorPosition < PARTY_SIZE) { - DrawTextWindow(&gUnknown_03004824->window, 18, 14, 28, 19); - PrintMenuItems(19, 15, 2, (const struct MenuAction *)gUnknown_0820C320); + TextWindow_DrawStdFrame(&gUnknown_03004824->window, 18, 14, 28, 19); + Menu_PrintItems(19, 15, 2, (const struct MenuAction *)gUnknown_0820C320); InitMenu(0, 19, 15, 2, 0, 9); gUnknown_03004824->unk_007b = 1; } @@ -2108,7 +2091,7 @@ static void sub_8049680(void) } else if (gUnknown_03004824->tradeMenuCursorPosition == 2 * PARTY_SIZE) { - DrawTextWindow(&gUnknown_03004824->window, 24, 14, 29, 19); + TextWindow_DrawStdFrame(&gUnknown_03004824->window, 24, 14, 29, 19); InitYesNoMenu(24, 14, 4); gUnknown_03004824->unk_007b = 4; sub_804ACD8(gUnknown_0820C14C[4], BG_CHAR_ADDR(4) + 32 * gUnknown_03004824->unk_007e, 20); @@ -2126,7 +2109,7 @@ static void sub_8049680(void) static void sub_8049804(void) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); sub_804A80C(); gUnknown_03004824->unk_007b = 0; gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx].invisible = FALSE; @@ -2138,17 +2121,17 @@ static void sub_8049860(void) if (gMain.newAndRepeatedKeys & DPAD_UP) { PlaySE(SE_SELECT); - gUnknown_03004824->unk_007c = MoveMenuCursor(-1); + gUnknown_03004824->unk_007c = Menu_MoveCursor(-1); } else if (gMain.newAndRepeatedKeys & DPAD_DOWN) { PlaySE(SE_SELECT); - gUnknown_03004824->unk_007c = MoveMenuCursor(+1); + gUnknown_03004824->unk_007c = Menu_MoveCursor(+1); } if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); - if (GetMenuCursorPos() == 0) + if (Menu_GetCursorPos() == 0) { BeginNormalPaletteFade(-1, 0, 0, 16, 0); gUnknown_03004824->unk_007b = 2; @@ -2227,7 +2210,7 @@ static void sub_8049A20(void) { sub_804AADC(3, 1); gUnknown_03004824->linkData[0] = 0xbbbb; - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { Trade_SendData(gUnknown_03004824); } @@ -2239,24 +2222,24 @@ static void sub_8049AC0(void) if (gMain.newAndRepeatedKeys & DPAD_UP) { PlaySE(SE_SELECT); - gUnknown_03004824->unk_007c = MoveMenuCursor(-1); + gUnknown_03004824->unk_007c = Menu_MoveCursor(-1); } else if (gMain.newAndRepeatedKeys & DPAD_DOWN) { PlaySE(SE_SELECT); - gUnknown_03004824->unk_007c = MoveMenuCursor(+1); + gUnknown_03004824->unk_007c = Menu_MoveCursor(+1); } if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); - if (GetMenuCursorPos() == 0) + if (Menu_GetCursorPos() == 0) { sub_8049A20(); } else { sub_804AADC(3, 1); - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { gUnknown_03004824->linkData[0] = 0xbbcc; Trade_SendData(gUnknown_03004824); @@ -2267,9 +2250,9 @@ static void sub_8049AC0(void) else if (gMain.newKeys & B_BUTTON) { sub_804AADC(3, 1); - if (GetMenuCursorPos() == 0) + if (Menu_GetCursorPos() == 0) { - gUnknown_03004824->unk_007c = MoveMenuCursor(+1); + gUnknown_03004824->unk_007c = Menu_MoveCursor(+1); } gUnknown_03004824->linkData[0] = 0xbbcc; Trade_SendData(gUnknown_03004824); @@ -2282,17 +2265,17 @@ static void sub_8049BC0(void) if (gMain.newAndRepeatedKeys & DPAD_UP) { PlaySE(SE_SELECT); - gUnknown_03004824->unk_007c = MoveMenuCursor(-1); + gUnknown_03004824->unk_007c = Menu_MoveCursor(-1); } else if (gMain.newAndRepeatedKeys & DPAD_DOWN) { PlaySE(SE_SELECT); - gUnknown_03004824->unk_007c = MoveMenuCursor(+1); + gUnknown_03004824->unk_007c = Menu_MoveCursor(+1); } if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); - if (GetMenuCursorPos() == 0) + if (Menu_GetCursorPos() == 0) { sub_804AA0C(4); gUnknown_03004824->linkData[0] = 0xeeaa; @@ -2337,7 +2320,7 @@ static void DisplayMessageAndContinueTask(void) gUnknown_03004824->unk_00b4++; if (gUnknown_03004824->unk_00b4 > 120) { - DrawTextWindow(&gUnknown_03004824->window, 24, 14, 29, 19); + TextWindow_DrawStdFrame(&gUnknown_03004824->window, 24, 14, 29, 19); InitYesNoMenu(24, 14, 4); gUnknown_03004824->unk_00b4 = 0; gUnknown_03004824->unk_007b = 3; @@ -2464,8 +2447,8 @@ static void sub_8049ED4(u8 a0) StoreSpriteCallbackInData(&gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]], sub_809D62C); gUnknown_03004824->unk_0080[a0] ++; sub_8078A34(&gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]]); - HandleDestroyMenuCursors(); - FillWindowRect_DefaultPalette(&gUnknown_03004824->window, 0, gUnknown_0820C330[whichParty][0], 0, gUnknown_0820C330[whichParty][1], 19); + Menu_DestroyCursor(); + Text_FillWindowRectDefPalette(&gUnknown_03004824->window, 0, gUnknown_0820C330[whichParty][0], 0, gUnknown_0820C330[whichParty][1], 19); sub_804A96C_alt(&gUnknown_03004824->unk_00c8, 15 * a0, 0, gTradePartyBoxTilemap, 15, 17, 0); if (whichParty == 0) { @@ -2491,10 +2474,10 @@ static void sub_8049ED4(u8 a0) string1[3] = 0xFC; string1[4] = 0x11; string1[5] = (64 - stringLength) / 2; - sub_8003460(&gUnknown_03004824->window, string1, gUnknown_03004824->unk_007a + whichParty * 6 * 32, gUnknown_0820C334[whichParty][0], gUnknown_0820C334[whichParty][1]); + Text_InitWindowAndPrintText(&gUnknown_03004824->window, string1, gUnknown_03004824->unk_007a + whichParty * 6 * 32, gUnknown_0820C334[whichParty][0], gUnknown_0820C334[whichParty][1]); sub_804A33C(string2, whichParty, whichPokemon); - sub_8003460(&gUnknown_03004824->window, gOtherText_Terminator2, gUnknown_03004824->unk_007a + whichParty * 6 * 32 + 32, gUnknown_0820C334[whichParty + 1][0], gUnknown_0820C334[whichParty + 1][1] + 1); - sub_8003460(&gUnknown_03004824->window, string2, gUnknown_03004824->unk_007a + whichParty * 6 * 32 + 38, gUnknown_0820C334[whichParty + 1][0], gUnknown_0820C334[whichParty + 1][1] + 1); + Text_InitWindowAndPrintText(&gUnknown_03004824->window, gOtherText_Terminator2, gUnknown_03004824->unk_007a + whichParty * 6 * 32 + 32, gUnknown_0820C334[whichParty + 1][0], gUnknown_0820C334[whichParty + 1][1] + 1); + Text_InitWindowAndPrintText(&gUnknown_03004824->window, string2, gUnknown_03004824->unk_007a + whichParty * 6 * 32 + 38, gUnknown_0820C334[whichParty + 1][0], gUnknown_0820C334[whichParty + 1][1] + 1); gUnknown_03004824->unk_0080[a0] ++; break; case 4: @@ -2692,7 +2675,7 @@ static void sub_8049ED4(u8 a0) "\tlsls r0, 2\n" "\tadds r0, r7\n" "\tbl sub_8078A34\n" - "\tbl HandleDestroyMenuCursors\n" + "\tbl Menu_DestroyCursor\n" "\tldr r3, _0804A09C @ =gUnknown_03004824\n" "\tldr r0, [r3]\n" "\tadds r0, 0x4\n" @@ -2708,7 +2691,7 @@ static void sub_8049ED4(u8 a0) "\tstr r1, [sp, 0x4]\n" "\tmovs r1, 0\n" "\tmovs r3, 0\n" - "\tbl FillWindowRect_DefaultPalette\n" + "\tbl Text_FillWindowRectDefPalette\n" "\tldr r1, _0804A09C @ =gUnknown_03004824\n" "\tldr r0, [r1]\n" "\tadds r0, 0xC8\n" @@ -2884,7 +2867,7 @@ static void sub_8049ED4(u8 a0) "\tldrb r1, [r1]\n" "\tstr r1, [sp]\n" "\tadd r1, sp, 0xC\n" - "\tbl sub_8003460\n" + "\tbl Text_InitWindowAndPrintText\n" "\tadd r7, sp, 0x34\n" "\tadds r0, r7, 0\n" "\tldr r1, [sp, 0x6C]\n" @@ -2910,7 +2893,7 @@ static void sub_8049ED4(u8 a0) "\tlsrs r4, 24\n" "\tstr r4, [sp]\n" "\tadds r3, r5, 0\n" - "\tbl sub_8003460\n" + "\tbl Text_InitWindowAndPrintText\n" "\tldr r0, _0804A22C @ =gUnknown_03004824\n" "\tldr r1, [r0]\n" "\tadds r0, r1, 0x4\n" @@ -2921,7 +2904,7 @@ static void sub_8049ED4(u8 a0) "\tstr r4, [sp]\n" "\tadds r1, r7, 0\n" "\tadds r3, r5, 0\n" - "\tbl sub_8003460\n" + "\tbl Text_InitWindowAndPrintText\n" "\tldr r2, _0804A22C @ =gUnknown_03004824\n" "\tldr r1, [r2]\n" "\tb _0804A28A\n" @@ -3010,7 +2993,7 @@ u8 sub_804A2B4(u8 *a0, u8 whichParty, u8 whichPokemon) GetMonGender(&gEnemyParty[whichPokemon]); GetMonData(&gEnemyParty[whichPokemon], MON_DATA_LEVEL); } - return GetStringWidthGivenWindowConfig(&gWindowConfig_81E7294, a0); + return Text_GetStringWidthFromWindowTemplate(&gWindowTemplate_81E7294, a0); } #ifdef NONMATCHING @@ -3067,8 +3050,8 @@ static void sub_804A41C(u8 whichParty) GetMonData(pokemon, MON_DATA_NICKNAME, nickname); StringCopy10(string + 6, nickname); GetMonGender(pokemon); - string[5] = (50 - GetStringWidthGivenWindowConfig(&gWindowConfig_81E7294, string + 6)) / 2; - sub_8003460(&gUnknown_03004824->window, string, gUnknown_03004824->unk_007a + 22 * 6 * whichParty + 22 * i, gTradeMonSpriteCoords[i + 6 * whichParty][0], gTradeMonSpriteCoords[i + 6 * whichParty][1]); + string[5] = (50 - Text_GetStringWidthFromWindowTemplate(&gWindowTemplate_81E7294, string + 6)) / 2; + Text_InitWindowAndPrintText(&gUnknown_03004824->window, string, gUnknown_03004824->unk_007a + 22 * 6 * whichParty + 22 * i, gTradeMonSpriteCoords[i + 6 * whichParty][0], gTradeMonSpriteCoords[i + 6 * whichParty][1]); } } #else @@ -3141,8 +3124,8 @@ static void sub_804A41C(u8 whichParty) "\tbl GetMonGender\n" "\tmov r1, sp\n" "\tadds r1, 0x22\n" - "\tldr r0, _0804A518 @ =gWindowConfig_81E7294\n" - "\tbl GetStringWidthGivenWindowConfig\n" + "\tldr r0, _0804A518 @ =gWindowTemplate_81E7294\n" + "\tbl Text_GetStringWidthFromWindowTemplate\n" "\tlsls r0, 24\n" "\tlsrs r0, 24\n" "\tmovs r1, 0x32\n" @@ -3177,7 +3160,7 @@ static void sub_804A41C(u8 whichParty) "\tldrb r1, [r1]\n" "\tstr r1, [sp]\n" "\tmov r1, r8\n" - "\tbl sub_8003460\n" + "\tbl Text_InitWindowAndPrintText\n" "\tadds r0, r6, 0x1\n" "\tlsls r0, 24\n" "\tlsrs r6, r0, 24\n" @@ -3198,7 +3181,7 @@ static void sub_804A41C(u8 whichParty) "\tbx r0\n" "\t.align 2, 0\n" "_0804A514: .4byte gEnemyParty\n" - "_0804A518: .4byte gWindowConfig_81E7294"); + "_0804A518: .4byte gWindowTemplate_81E7294"); } #endif @@ -3337,7 +3320,7 @@ static void sub_804A740(u8 whichParty) static void sub_804A80C(void) { - FillWindowRect_DefaultPalette(&gUnknown_03004824->window, 0, gUnknown_0820C330[1][0], 0, gUnknown_0820C330[1][1], 19); + Text_FillWindowRectDefPalette(&gUnknown_03004824->window, 0, gUnknown_0820C330[1][0], 0, gUnknown_0820C330[1][1], 19); sub_804A41C(1); } @@ -3345,7 +3328,7 @@ static void sub_804A840(u8 whichParty) { if (whichParty == 0) { - FillWindowRect_DefaultPalette(&gUnknown_03004824->window, 0, gUnknown_0820C330[0][0], 0, gUnknown_0820C330[0][1], 19); + Text_FillWindowRectDefPalette(&gUnknown_03004824->window, 0, gUnknown_0820C330[0][0], 0, gUnknown_0820C330[0][1], 19); sub_804A96C_alt(&gUnknown_03004824->unk_00c8, 0, 0, gTradePartyBoxTilemap, 15, 17, 0); sub_804A6DC(0); sub_804A41C(0); @@ -3354,8 +3337,8 @@ static void sub_804A840(u8 whichParty) } else { - HandleDestroyMenuCursors(); - FillWindowRect_DefaultPalette(&gUnknown_03004824->window, 0, gUnknown_0820C330[1][0], 0, gUnknown_0820C330[1][1], 19); + Menu_DestroyCursor(); + Text_FillWindowRectDefPalette(&gUnknown_03004824->window, 0, gUnknown_0820C330[1][0], 0, gUnknown_0820C330[1][1], 19); sub_804A96C_alt(&gUnknown_03004824->unk_00c8, 15, 0, gTradePartyBoxTilemap, 15, 17, 0); sub_804A6DC(1); sub_804A41C(1); @@ -3413,18 +3396,18 @@ static void sub_804A96C_alt(struct UnkStructD *arg0, u8 left, u8 top, const u16 static void sub_804A9F4(u8 unused) { - MenuZeroFillScreen(); + Menu_EraseScreen(); } static void sub_804AA00(u8 unused) { - MenuZeroFillScreen(); + Menu_EraseScreen(); } static void sub_804AA0C(u8 a0) { - DrawTextWindow(&gUnknown_03004824->window, gTradeMessageWindowRects[a0][0], gTradeMessageWindowRects[a0][1], gTradeMessageWindowRects[a0][2], gTradeMessageWindowRects[a0][3]); - sub_8003460(&gUnknown_03004824->window, gUnknown_0820C2F0[a0], 0x180 + gUnknown_03004824->unk_007a, gTradeMessageWindowRects[a0][0] + 1, gTradeMessageWindowRects[a0][1] + 1); + TextWindow_DrawStdFrame(&gUnknown_03004824->window, gTradeMessageWindowRects[a0][0], gTradeMessageWindowRects[a0][1], gTradeMessageWindowRects[a0][2], gTradeMessageWindowRects[a0][3]); + Text_InitWindowAndPrintText(&gUnknown_03004824->window, gUnknown_0820C2F0[a0], 0x180 + gUnknown_03004824->unk_007a, gTradeMessageWindowRects[a0][0] + 1, gTradeMessageWindowRects[a0][1] + 1); } static void sub_804AA88(void) @@ -3523,7 +3506,7 @@ static bool8 sub_804ABF8(void) static void sub_804ACD8(const u8 *src, u8 *dest, u8 a2) { - sub_804AFB8(&gWindowConfig_81E725C, dest, src, a2); + sub_804AFB8(&gWindowTemplate_81E725C, dest, src, a2); } #ifdef NONMATCHING @@ -3798,7 +3781,7 @@ static void sub_804AF84(void) gSaveBlock1.giftRibbons[i] = gUnknown_03004824->unk_00b5[i]; } -static void sub_804AFB8(const struct WindowConfig *windowConfig, u8 *dest, const u8 *src, u8 size) +static void sub_804AFB8(const struct WindowTemplate *windowConfig, u8 *dest, const u8 *src, u8 size) { u8 i; u8 *tileBuffer; @@ -3806,7 +3789,7 @@ static void sub_804AFB8(const struct WindowConfig *windowConfig, u8 *dest, const tileBuffer = gTileBuffer; CpuFill16(0, tileBuffer, size * 0x80); CpuFill16(0, tileBuffer + windowConfig->width * 0x20, size * 0x80); - sub_8004E3C(windowConfig, tileBuffer, src); + Text_InitWindow8004E3C(windowConfig, tileBuffer, src); for (i = 0; i < size; i ++) { CpuCopy16(&tileBuffer[32 * (i * 4)], &dest[32 * (i * 8)], 0x80); @@ -4028,11 +4011,11 @@ static void sub_804B41C(void) FreeAllSpritePalettes(); SetVBlankCallback(sub_804B210); sub_804B228(); - SetUpWindowConfig(&gWindowConfig_81E6F84); - InitWindowFromConfig(&gUnknown_03004828->window, &gWindowConfig_81E6F84); - gUnknown_03004828->textWindowBaseTileNum = SetTextWindowBaseTileNum(2); - LoadTextWindowGraphics(&gUnknown_03004828->window); - MenuZeroFillScreen(); + Text_LoadWindowTemplate(&gWindowTemplate_81E6F84); + Text_InitWindowWithTemplate(&gUnknown_03004828->window, &gWindowTemplate_81E6F84); + gUnknown_03004828->textWindowBaseTileNum = TextWindow_SetBaseTileNum(2); + TextWindow_LoadStdFrameGraphics(&gUnknown_03004828->window); + Menu_EraseScreen(); gLinkType = 0x1144; gMain.state ++; LZDecompressVram(gUnknown_08D00000, (void *)VRAM); @@ -4182,22 +4165,22 @@ static __attribute__((naked)) void sub_804B41C(void) "\tldr r0, _0804B578 @ =sub_804B210\n" "\tbl SetVBlankCallback\n" "\tbl sub_804B228\n" - "\tldr r4, _0804B57C @ =gWindowConfig_81E6F84\n" + "\tldr r4, _0804B57C @ =gWindowTemplate_81E6F84\n" "\tadds r0, r4, 0\n" - "\tbl SetUpWindowConfig\n" + "\tbl Text_LoadWindowTemplate\n" "\tldr r0, [r6]\n" "\tadds r0, 0x4\n" "\tadds r1, r4, 0\n" - "\tbl InitWindowFromConfig\n" + "\tbl Text_InitWindowWithTemplate\n" "\tmovs r0, 0x2\n" - "\tbl SetTextWindowBaseTileNum\n" + "\tbl TextWindow_SetBaseTileNum\n" "\tldr r1, [r6]\n" "\tadds r1, 0x34\n" "\tstrb r0, [r1]\n" "\tldr r0, [r6]\n" "\tadds r0, 0x4\n" - "\tbl LoadTextWindowGraphics\n" - "\tbl MenuZeroFillScreen\n" + "\tbl TextWindow_LoadStdFrameGraphics\n" + "\tbl Menu_EraseScreen\n" "\tldr r1, _0804B580 @ =gLinkType\n" "\tldr r4, _0804B584 @ =0x00001144\n" "\tadds r0, r4, 0\n" @@ -4279,7 +4262,7 @@ static __attribute__((naked)) void sub_804B41C(void) "_0804B570: .4byte gUnknown_03004828\n" "_0804B574: .4byte gSharedMem + 0x1F000\n" "_0804B578: .4byte sub_804B210\n" - "_0804B57C: .4byte gWindowConfig_81E6F84\n" + "_0804B57C: .4byte gWindowTemplate_81E6F84\n" "_0804B580: .4byte gLinkType\n" "_0804B584: .4byte 0x00001144\n" "_0804B588: .4byte gMain\n" @@ -4512,8 +4495,8 @@ static __attribute__((naked)) void sub_804B41C(void) } #endif -static void sub_804B790(void) // In-game trade init +void sub_804B790(void) { u8 otName[11]; switch (gMain.state) @@ -4531,11 +4514,11 @@ static void sub_804B790(void) FreeAllSpritePalettes(); SetVBlankCallback(sub_804B210); sub_804B228(); - SetUpWindowConfig(&gWindowConfig_81E717C); - InitWindowFromConfig(&gUnknown_03004828->window, &gWindowConfig_81E717C); - gUnknown_03004828->textWindowBaseTileNum = SetTextWindowBaseTileNum(2); - LoadTextWindowGraphics(&gUnknown_03004828->window); - MenuZeroFillScreen(); + Text_LoadWindowTemplate(&gWindowTemplate_81E717C); + Text_InitWindowWithTemplate(&gUnknown_03004828->window, &gWindowTemplate_81E717C); + gUnknown_03004828->textWindowBaseTileNum = TextWindow_SetBaseTileNum(2); + TextWindow_LoadStdFrameGraphics(&gUnknown_03004828->window); + Menu_EraseScreen(); gLinkType = 0x1144; gUnknown_03004828->isLinkTrade = FALSE; gUnknown_03004828->unk_00b6 = 0; @@ -4649,7 +4632,7 @@ static void sub_804BB78(void) switch (gUnknown_03004828->unk_00bd) { case 1: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { Trade_SendData(gUnknown_03004828); gUnknown_03004828->unk_00bd ++; @@ -4733,7 +4716,7 @@ static void sub_804BBE8(u8 a0) for (i = 0; i < 0x280; i ++) buffer[i] |= 0x7000; DmaCopy16Defvars(3, gSharedMem, BG_SCREEN_ADDR(5), 0x500); - MenuZeroFillWindowRect(2, 15, 27, 18); + Menu_EraseWindowRect(2, 15, 27, 18); break; case 6: REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; @@ -4843,7 +4826,7 @@ static bool8 sub_804C29C(void) case 10: StringExpandPlaceholders(gStringVar4, gTradeText_WillBeSent); - sub_8003460(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + Text_InitWindowAndPrintText(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); gUnknown_03004828->unk_00c4 = 11; gUnknown_03004828->unk_00c0 = 0; break; @@ -4852,13 +4835,13 @@ static bool8 sub_804C29C(void) { gUnknown_03004828->unk_0102 = sub_8047580(gUnknown_03004828->pokePicSpriteIdxs[0], gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].oam.paletteNum, 0x78, 0x20, 0x2, 0x1, 0x14, 0xfffff); gUnknown_03004828->unk_00c4 ++; - ZeroFillWindowRect(&gUnknown_03004828->window, 0, 0, 29, 19); + Text_EraseWindowRect(&gUnknown_03004828->window, 0, 0, 29, 19); StringExpandPlaceholders(gStringVar4, gTradeText_ByeBye); - sub_8003460(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + Text_InitWindowAndPrintText(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); } break; case 12: - if (gSprites[gUnknown_03004828->unk_0102].callback == SpriteCallbackDummy && sub_80035AC(&gUnknown_03004828->window) == TRUE) + if (gSprites[gUnknown_03004828->unk_0102].callback == SpriteCallbackDummy && Text_UpdateWindow(&gUnknown_03004828->window) == TRUE) { gUnknown_03004828->unk_0103 = CreateSprite(&gSpriteTemplate_821595C, 0x78, 0x20, 0); gSprites[gUnknown_03004828->unk_0103].callback = sub_804D738; @@ -5199,9 +5182,9 @@ static bool8 sub_804C29C(void) break; case 67: REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; - ZeroFillWindowRect(&gUnknown_03004828->window, 0, 0, 29, 19); + Text_EraseWindowRect(&gUnknown_03004828->window, 0, 0, 29, 19); StringExpandPlaceholders(gStringVar4, gTradeText_SentOverPoke); - sub_8003460(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + Text_InitWindowAndPrintText(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); gUnknown_03004828->unk_00c4 ++; gUnknown_03004828->unk_00c0 = 0; break; @@ -5213,9 +5196,9 @@ static bool8 sub_804C29C(void) if (gUnknown_03004828->unk_00c0 == 0xf0) { gUnknown_03004828->unk_00c4 ++; - ZeroFillWindowRect(&gUnknown_03004828->window, 0, 0, 29, 19); + Text_EraseWindowRect(&gUnknown_03004828->window, 0, 0, 29, 19); StringExpandPlaceholders(gStringVar4, gTradeText_TakeGoodCare); - sub_8003460(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + Text_InitWindowAndPrintText(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); gUnknown_03004828->unk_00c0 = 0; } break; @@ -5536,9 +5519,9 @@ static void sub_804DC88(void) case 0: gUnknown_03004828 = &ewram_2010000.unk_0f000; gMain.state ++; - ZeroFillWindowRect(&gUnknown_03004828->window, 0, 0, 29, 19); + Text_EraseWindowRect(&gUnknown_03004828->window, 0, 0, 29, 19); StringExpandPlaceholders(gStringVar4, gOtherText_LinkStandby2); - sub_8003460(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + Text_InitWindowAndPrintText(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); break; case 1: sub_80084A4(); @@ -5551,21 +5534,21 @@ static void sub_804DC88(void) gMain.state = 101; gUnknown_03004828->unk_00c0 = 0; } - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { gMain.state = 2; } break; case 101: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { gMain.state = 2; } break; case 2: gMain.state = 50; - ZeroFillWindowRect(&gUnknown_03004828->window, 0, 0, 29, 19); - sub_8003460(&gUnknown_03004828->window, gSystemText_Saving, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + Text_EraseWindowRect(&gUnknown_03004828->window, 0, 0, 29, 19); + Text_InitWindowAndPrintText(&gUnknown_03004828->window, gSystemText_Saving, gUnknown_03004828->textWindowBaseTileNum, 2, 15); break; case 50: SetSecretBase2Field_9_AndHideBG(); @@ -5609,7 +5592,7 @@ static void sub_804DC88(void) gMain.state = 42; break; case 42: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { sub_8125E04(); gSoftResetDisabled = FALSE; @@ -5624,7 +5607,7 @@ static void sub_804DC88(void) } break; case 6: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { BeginNormalPaletteFade(-1, 0, 0, 16, 0); gMain.state ++; @@ -5701,13 +5684,9 @@ static void sub_804E1DC(void) void sub_804E22C(void) { - const u16 *src; - u16 *dest; LZDecompressVram(gUnknown_08D00000, (void *)VRAM); CpuCopy16(gUnknown_08D00524, gSharedMem, 0x1000); - src = (const u16 *)gSharedMem; - dest = BG_SCREEN_ADDR(5); - DmaCopy16(3, src, dest, 0x500) + DmaCopy16Defvars(3, gSharedMem, BG_SCREEN_ADDR(5), 0x500); LoadCompressedPalette(gUnknown_08D004E0, 0, 32); REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(5); } diff --git a/src/engine/trainer_card.c b/src/engine/trainer_card.c index ffa4cbd08..998c4697e 100644 --- a/src/engine/trainer_card.c +++ b/src/engine/trainer_card.c @@ -5,6 +5,7 @@ #include "field_effect.h" #include "graphics.h" #include "link.h" +#include "m4a.h" #include "main.h" #include "menu.h" #include "money.h" @@ -18,7 +19,7 @@ #include "string_util.h" #include "strings2.h" #include "task.h" -#include "unknown_task.h" +#include "scanline_effect.h" #include "util.h" #include "ewram.h" @@ -26,25 +27,25 @@ typedef void (*Callback)(void); struct Struct2000000 { - /*0x00*/ u8 var_0; - /*0x01*/ bool8 var_1; - /*0x02*/ u8 var_2; - /*0x03*/ bool8 var_3; + /*0x00*/ u8 current_state; + /*0x01*/ bool8 isShowingLinkCard; + /*0x02*/ u8 starCount; + /*0x03*/ bool8 backSideShown; /*0x04*/ u8 var_4; - /*0x05*/ u8 var_5; - /*0x06*/ u8 var_6; - /*0x07*/ bool8 var_7; - /*0x08*/ bool8 var_8; - /*0x09*/ bool8 var_9; - /*0x0A*/ bool8 var_a; - /*0x0B*/ bool8 var_b; - /*0x0C*/ bool8 var_c; - /*0x0D*/ bool8 var_d; - /*0x0E*/ u8 var_e[8]; + /*0x05*/ bool8 showColon; + /*0x06*/ u8 frameCounter; /* Used to flash colon */ + /*0x07*/ bool8 showPokedexCount; + /*0x08*/ bool8 showHallOfFame; + /*0x09*/ bool8 showLinkBattleStatus; + /*0x0A*/ bool8 showBattleTowerStatus; + /*0x0B*/ bool8 showContestRecord; + /*0x0C*/ bool8 showMixingRecord; + /*0x0D*/ bool8 showTradingRecord; + /*0x0E*/ bool8 ownedBadges[8]; /*0x16*/ u8 filler_16[10]; - /*0x20*/ u8 var_20[4][0x10]; + /*0x20*/ u8 easyChatPhrase[4][0x10]; /*0x60*/ Callback *var_60; - /*0x64*/ struct TrainerCard var_64; + /*0x64*/ struct TrainerCard displayedCard; /*0x9C*/ u8 language; // 0x9C }; @@ -52,49 +53,76 @@ extern struct LinkPlayerMapObject gLinkPlayerMapObjects[]; EWRAM_DATA struct TrainerCard gTrainerCards[4] = {0}; -extern const u8 gBadgesTiles[]; extern const u16 gUnknown_083B5F0C[]; extern const u16 gBadgesPalette[]; extern const u16 gUnknown_083B5F4C[]; extern const u16 gUnknown_083B5F6C[]; -extern const u16 gUnknown_083B5F8C[][4]; +extern const u16 gTrainerCardBadgesMap[][4]; const u8 gBadgesTiles[] = INCBIN_U8("graphics/trainer_card/badges.4bpp"); // XXX: what is this? u8 *const ewram_ = gSharedMem; -bool8 sub_8093864(struct Task *); -bool8 sub_80938A8(struct Task *); -bool8 sub_80938CC(struct Task *); -bool8 sub_8093918(struct Task *); -bool8 sub_8093938(struct Task *); -bool8 sub_8093954(struct Task *); -bool8 sub_8093980(struct Task *); - -bool8 (*const gUnknown_083B5EBC[])(struct Task *) = -{ - sub_8093864, - sub_80938A8, - sub_80938CC, - sub_8093918, - sub_8093938, - sub_8093954, - sub_8093980, +#if DEBUG +const struct TrainerCard gUnknown_Debug_083E0448 = +{ + .gender = FEMALE, + .stars = 4, + .hasPokedex = TRUE, + .var_3 = TRUE, + .var_4 = TRUE, + .firstHallOfFameA = 999, + .firstHallOfFameB = 99, + .firstHallOfFameC = 99, + .pokedexSeen = 411, + .trainerId = 12345, + .playTimeHours = 99, + .playTimeMinutes = 99, + .linkBattleWins = 9999, + .linkBattleLosses = 9999, + .battleTowerWins = 9999, + .battleTowerLosses = 9999, + .contestsWithFriends = 999, + .pokeblocksWithFriends = 0xFFFF, + .pokemonTrades = 0xFFFF, + .money = 99999, + .var_28 = {1, 2, 3, 4}, + .playerName = _("てすと"), +}; +#endif + +bool8 TrainerCard_Init(struct Task *); +bool8 TrainerCard_WaitForFadeInToFinish(struct Task *); +bool8 TrainerCard_WaitForKeys(struct Task *); +bool8 TrainerCard_StartFlipAntimation(struct Task *); +bool8 TrainerCard_WaitForFlipToFinish(struct Task *); +bool8 TrainerCard_FadeOut(struct Task *); +bool8 TrainerCard_WaitForFadeOutToFinishAndQuit(struct Task *); + +bool8 (*const TrainerCard_StateMachine[])(struct Task *) = +{ + TrainerCard_Init, + TrainerCard_WaitForFadeInToFinish, + TrainerCard_WaitForKeys, + TrainerCard_StartFlipAntimation, + TrainerCard_WaitForFlipToFinish, + TrainerCard_FadeOut, + TrainerCard_WaitForFadeOutToFinishAndQuit, }; -bool8 sub_8093AA0(struct Task *); -bool8 sub_8093AF0(struct Task *); -bool8 sub_8093C0C(struct Task *); -bool8 sub_8093C38(struct Task *); -bool8 sub_8093D50(struct Task *); +bool8 TrainerCard_InitFlipAnimation(struct Task *); +bool8 TrainerCard_ScaleDownFlipAnimation(struct Task *); +bool8 TrainerCard_SwitchToNewSide(struct Task *); +bool8 TrainerCard_ScaleUpFlipAnimation(struct Task *); +bool8 TrainerCard_FinishFlipAnimation(struct Task *); -bool8 (*const gUnknown_083B5ED8[])(struct Task *) = +bool8 (*const TrainerCard_FlipAnimationStateMachine[])(struct Task *) = { - sub_8093AA0, - sub_8093AF0, - sub_8093C0C, - sub_8093C38, - sub_8093D50, + TrainerCard_InitFlipAnimation, + TrainerCard_ScaleDownFlipAnimation, + TrainerCard_SwitchToNewSide, + TrainerCard_ScaleUpFlipAnimation, + TrainerCard_FinishFlipAnimation, }; // FIXME: Other signature than on save_menu_util.h @@ -103,64 +131,64 @@ u16 GetPokedexSeenCount(void); enum { - TD_0, - TD_1, + TD_SHOWING_LINK_CARD, + TD_CARD_INDEX, TD_CALLBACK, }; static void sub_8093174(void); static void sub_809323C(void); static void sub_8093254(void); -static void sub_80932AC(Callback callBack); -static void sub_80932E4(u8 arg1, Callback callBack); -void sub_8093324(void); +static void TrainerCard_InitScreenForPlayer(Callback callBack); +static void TrainerCard_InitScreenForLinkPlayer(u8 arg1, Callback callBack); +void TrainerCard_FillTrainerCardStruct(void); static void nullsub_60(u8); static u32 sav12_xor_get_clamped_above(u8 index, u32 maxVal); -static u8 sub_80934F4(struct TrainerCard *); +static u8 TrainerCard_GetStarCount(struct TrainerCard *); static void sub_8093534(void); static void sub_8093550(void); static void sub_8093598(void); static void sub_80935EC(void); static void sub_8093610(void); static void sub_8093688(void); -void sub_80936D4(void); +static void TrainerCard_FillFlags(void); static void sub_80937A4(void); static void sub_80937BC(void); static void sub_80937D8(void); static void sub_80937F0(void); static void nullsub_15(void); static void sub_8093800(void); -static void sub_809380C(); -static void sub_809382C(u8 taskId); -static void sub_80939A4(void); -static void sub_80939C0(void); -static void sub_80939DC(u8 taskId); -static void sub_8093A28(void); -static u8 sub_8093A48(void); -static void sub_8093A68(u8 taskId); -void sub_8093D7C(void); -static void sub_8093DAC(void); -static void sub_8093DC8(void); -static void sub_8093DEC(void); -static void sub_8093E04(void); -static void sub_8093E28(void); -void sub_8093EA0(void); -static void sub_8093EF8(void); +static void TrainerCard_CreateStateMachine(void); +static void TrainerCard_RunStateMachine(u8 taskId); +static void TrainerCard_CreatePrintPlayTimeTask(void); +static void TrainerCard_DestoryPlayTimeTask(void); +static void TrainerCard_Front_PrintPlayTime(u8 taskId); +static void TrainerCard_CreateFlipAnimationTask(void); +static u8 TrainerCard_HasFlipAnimationFinished(void); +static void TrainerCard_RunFlipAnimationStateMachine(u8 taskId); +static void TrainerCard_FlipAnimationHBlankCallback(void); +static void TrainerCard_DrawCard(void); +static void TrainerCard_DrawCardFront(void); +static void TrainerCard_DrawCardBack(void); +static void TrainerCard_ResetOffsetRegisters(void); +static void TrainerCard_CopyGraphics(void); +static void TrainerCard_LoadPalettes(void); +static void TrainerCard_LoadTrainerGraphics(void); static void sub_8093F14(void); static void sub_8093F48(void); static void sub_8093F64(void); -static void sub_8093F80(void); -static void sub_8093FD0(void); -static void sub_8094038(void); -static void sub_80940E4(void); -static void sub_8094110(void); -static void sub_8094140(void); -static void sub_8094188(void); +static void TrainerCard_LoadTrainerTilemap(void); +static void TrainerCard_DrawStars(void); +static void TrainerCard_DisplayBadges(void); +static void TrainerCard_ClearTrainerGraphics(void); +static void TrainerCard_ClearPokedexLabel(void); +static void TrainerCard_Front_PrintTexts(void); +static void TrainerCard_Back_PrintTexts(void); static void TrainerCard_Front_PrintTrainerID(void); static void TrainerCard_Front_PrintMoney(void); static void TrainerCard_Front_PrintPokedexCount(void); -static void TrainerCard_Front_PrintPlayTime(u8 *arg1, s16 colon); -static void sub_809429C(void); +static void TrainerCard_Front_GetPlayTimeString(u8 *arg1, s16 colon); +static void TrainerCard_PrintEasyChatPhrase(void); static void TrainerCard_Back_PrintName(void); static void TrainerCard_Back_PrintHallOfFameTime_Label(void); static void TrainerCard_Back_PrintHallOfFameTime(void); @@ -176,20 +204,57 @@ static void TrainerCard_Back_PrintPokemonTrades_Label(void); static void TrainerCard_Back_PrintPokemonTrades(void); void unref_sub_8094588(u16 left, u16 top); -void sub_8093110(Callback arg1) +#if DEBUG +static u8 gDebug_03000748; +#endif + +void TrainerCard_ShowPlayerCard(Callback arg1) { - sub_80932AC(arg1); +#if DEBUG + gDebug_03000748 = 0; +#endif + TrainerCard_InitScreenForPlayer(arg1); SetMainCallback2(sub_8093174); ewram0_2.language = GAME_LANGUAGE; } -void sub_8093130(u8 playerIndex, Callback arg2) +void TrainerCard_ShowLinkCard(u8 playerIndex, Callback arg2) { - sub_80932E4(playerIndex, arg2); +#if DEBUG + gDebug_03000748 = 0; +#endif + TrainerCard_InitScreenForLinkPlayer(playerIndex, arg2); SetMainCallback2(sub_8093174); ewram0_2.language = gLinkPlayers[gLinkPlayerMapObjects[playerIndex].linkPlayerId].language; } +#if DEBUG +void debug_sub_80A0710(Callback callback) +{ + gDebug_03000748 = TRUE; + TrainerCard_InitScreenForPlayer(callback); + SetMainCallback2(sub_8093174); + ewram0_2.language = GAME_LANGUAGE; +} + +void debug_sub_80A073C(Callback callback) +{ + memcpy(&gTrainerCards[0], &gUnknown_Debug_083E0448, sizeof(struct TrainerCard)); + gDebug_03000748=TRUE; + TrainerCard_InitScreenForLinkPlayer(0, callback); + SetMainCallback2(sub_8093174); + ewram0_2.language = GAME_LANGUAGE; +} + +void debug_sub_80A0780() +{ + int i; + + for (i = 0; i < 4; i++) + memcpy(&gTrainerCards[i], &gUnknown_Debug_083E0448, sizeof(struct TrainerCard)); +} +#endif + static void sub_8093174(void) { switch (gMain.state) @@ -249,49 +314,49 @@ static void sub_8093254(void) LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); - ewram0_2.var_6++; - if (ewram0_2.var_6 >= 60) + ewram0_2.frameCounter++; + if (ewram0_2.frameCounter >= 60) { - ewram0_2.var_6 = 0; - ewram0_2.var_5 ^= 1; + ewram0_2.frameCounter = 0; + ewram0_2.showColon ^= 1; } if (ewram0_2.var_4) - DmaCopy16(3, &gUnknown_03004DE0[0], &gUnknown_03004DE0[1], 0x140); + DmaCopy16(3, &gScanlineEffectRegBuffers[0], &gScanlineEffectRegBuffers[1], 0x140); } -static void sub_80932AC(Callback callBack) +static void TrainerCard_InitScreenForPlayer(Callback callBack) { u8 taskId = CreateTask(nullsub_60, 0xFF); struct Task *task = &gTasks[taskId]; - task->data[TD_0] = FALSE; + task->data[TD_SHOWING_LINK_CARD] = FALSE; StoreWordInTwoHalfwords(&task->data[TD_CALLBACK], (u32)callBack); } -static void sub_80932E4(u8 arg1, Callback callBack) +static void TrainerCard_InitScreenForLinkPlayer(u8 arg1, Callback callBack) { u8 taskId = CreateTask(nullsub_60, 0xFF); struct Task *task = &gTasks[taskId]; - task->data[TD_0] = TRUE; - task->data[TD_1] = arg1; + task->data[TD_SHOWING_LINK_CARD] = TRUE; + task->data[TD_CARD_INDEX] = arg1; StoreWordInTwoHalfwords(&task->data[TD_CALLBACK], (u32)callBack); } -void sub_8093324(void) +void TrainerCard_FillTrainerCardStruct(void) { u8 taskId = FindTaskIdByFunc(nullsub_60); struct Task *task = &gTasks[taskId]; - ewram0_2.var_1 = task->data[TD_0]; + ewram0_2.isShowingLinkCard = task->data[TD_SHOWING_LINK_CARD]; LoadWordFromTwoHalfwords((u16 *)&task->data[TD_CALLBACK], (u32 *)&ewram0_2.var_60); - if (ewram0_2.var_1) + if (ewram0_2.isShowingLinkCard) { - ewram0_2.var_64 = gTrainerCards[task->data[TD_1]]; + ewram0_2.displayedCard = gTrainerCards[task->data[TD_CARD_INDEX]]; } else { - sub_8093390(&ewram0_2.var_64); + TrainerCard_GenerateCardForPlayer(&ewram0_2.displayedCard); } } @@ -299,7 +364,7 @@ static void nullsub_60(u8 taskid) { } -void sub_8093390(struct TrainerCard *trainerCard) +void TrainerCard_GenerateCardForPlayer(struct TrainerCard *trainerCard) { u32 playTime; bool32 enteredHallOfFame; @@ -370,7 +435,7 @@ void sub_8093390(struct TrainerCard *trainerCard) trainerCard->playerName[i] = gSaveBlock2.playerName[i]; } - trainerCard->stars = sub_80934F4(trainerCard); + trainerCard->stars = TrainerCard_GetStarCount(trainerCard); } u8 sub_80934C4(u8 id) @@ -390,7 +455,7 @@ static u32 sav12_xor_get_clamped_above(u8 index, u32 maxVal) return value; } -static u8 sub_80934F4(struct TrainerCard *trainerCard) +static u8 TrainerCard_GetStarCount(struct TrainerCard *trainerCard) { u8 value = 0; @@ -441,27 +506,12 @@ static void sub_8093550(void) void sub_8093598(void) { - u8 *addr = (void *)VRAM; - u32 size = 0x10000; - - while (1) - { - DmaFill16(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill16(3, 0, addr, size); - break; - } - } + DmaFill16Large(3, 0, (void *)VRAM, 0x10000, 0x1000); } void sub_80935EC(void) { - void *addr = (void *)OAM; - - DmaFill16(3, 0, addr, 0x400); + DmaFill16Defvars(3, 0, (void *)OAM, 0x400); } void sub_8093610(void) @@ -489,53 +539,53 @@ static void sub_8093688(void) { u8 i; - sub_8093324(); - ewram0_2.var_0 = 0; - ewram0_2.var_3 = 0; + TrainerCard_FillTrainerCardStruct(); + ewram0_2.current_state = 0; + ewram0_2.backSideShown = FALSE; ewram0_2.var_4 = FALSE; - ewram0_2.var_2 = ewram0_2.var_64.stars; - ewram0_2.var_5 = 0; - ewram0_2.var_6 = 0; + ewram0_2.starCount = ewram0_2.displayedCard.stars; + ewram0_2.showColon = 0; + ewram0_2.frameCounter = 0; for (i = 0; i < 4; i++) - EasyChat_GetWordText(ewram0_2.var_20[i], ewram0_2.var_64.var_28[i]); - sub_80936D4(); + EasyChat_GetWordText(ewram0_2.easyChatPhrase[i], ewram0_2.displayedCard.var_28[i]); + TrainerCard_FillFlags(); } -void sub_80936D4(void) +static void TrainerCard_FillFlags(void) { - ewram0_2.var_7 = 0; - ewram0_2.var_8 = 0; - ewram0_2.var_9 = 0; - ewram0_2.var_a = 0; - ewram0_2.var_b = 0; - ewram0_2.var_c = 0; - ewram0_2.var_d = 0; - memset(ewram0_2.var_e, 0, sizeof(ewram0_2.var_e)); + ewram0_2.showPokedexCount = 0; + ewram0_2.showHallOfFame = 0; + ewram0_2.showLinkBattleStatus = 0; + ewram0_2.showBattleTowerStatus = 0; + ewram0_2.showContestRecord = 0; + ewram0_2.showMixingRecord = 0; + ewram0_2.showTradingRecord = 0; + memset(ewram0_2.ownedBadges, 0, sizeof(ewram0_2.ownedBadges)); - if (ewram0_2.var_64.hasPokedex) - ewram0_2.var_7++; + if (ewram0_2.displayedCard.hasPokedex) + ewram0_2.showPokedexCount++; - if (ewram0_2.var_64.firstHallOfFameA != 0 - || ewram0_2.var_64.firstHallOfFameB != 0 - || ewram0_2.var_64.firstHallOfFameC != 0) - ewram0_2.var_8++; + if (ewram0_2.displayedCard.firstHallOfFameA != 0 + || ewram0_2.displayedCard.firstHallOfFameB != 0 + || ewram0_2.displayedCard.firstHallOfFameC != 0) + ewram0_2.showHallOfFame++; - if (ewram0_2.var_64.linkBattleWins != 0 || ewram0_2.var_64.linkBattleLosses != 0) - ewram0_2.var_9++; + if (ewram0_2.displayedCard.linkBattleWins != 0 || ewram0_2.displayedCard.linkBattleLosses != 0) + ewram0_2.showLinkBattleStatus++; - if (ewram0_2.var_64.battleTowerWins != 0 || ewram0_2.var_64.battleTowerLosses != 0) - ewram0_2.var_a++; + if (ewram0_2.displayedCard.battleTowerWins != 0 || ewram0_2.displayedCard.battleTowerLosses != 0) + ewram0_2.showBattleTowerStatus++; - if (ewram0_2.var_64.contestsWithFriends != 0) - ewram0_2.var_b++; + if (ewram0_2.displayedCard.contestsWithFriends != 0) + ewram0_2.showContestRecord++; - if (ewram0_2.var_64.pokeblocksWithFriends != 0) - ewram0_2.var_c++; + if (ewram0_2.displayedCard.pokeblocksWithFriends != 0) + ewram0_2.showMixingRecord++; - if (ewram0_2.var_64.pokemonTrades != 0) - ewram0_2.var_d++; + if (ewram0_2.displayedCard.pokemonTrades != 0) + ewram0_2.showTradingRecord++; - if (!ewram0_2.var_1) + if (!ewram0_2.isShowingLinkCard) { u32 badgeFlag; int i = 0; @@ -544,7 +594,7 @@ void sub_80936D4(void) while (1) { if (FlagGet(badgeFlag)) - ewram0_2.var_e[i]++; + ewram0_2.ownedBadges[i]++; badgeFlag++; i++; if (badgeFlag > FLAG_BADGE08_GET) @@ -553,6 +603,19 @@ void sub_80936D4(void) } } } + +#if DEBUG + if (gDebug_03000748 != 0) + { + ewram0_2.showHallOfFame = TRUE; + ewram0_2.showLinkBattleStatus = TRUE; + ewram0_2.showBattleTowerStatus = TRUE; + ewram0_2.showContestRecord = TRUE; + ewram0_2.showMixingRecord = TRUE; + ewram0_2.showTradingRecord = TRUE; + memset(ewram0_2.ownedBadges, TRUE, sizeof(ewram0_2.ownedBadges)); + } +#endif } void sub_80937A4() @@ -565,21 +628,21 @@ void sub_80937A4() void sub_80937BC() { - SetUpWindowConfig(&WindowConfig_TrainerCard_Back_Values); - MultistepInitMenuWindowBegin(&WindowConfig_TrainerCard_Back_Values); + Text_LoadWindowTemplate(&gWindowTemplate_TrainerCard_Back_Values); + MultistepInitMenuWindowBegin(&gWindowTemplate_TrainerCard_Back_Values); } static void sub_80937D8() { - sub_8093E04(); - sub_8093E28(); + TrainerCard_ResetOffsetRegisters(); + TrainerCard_CopyGraphics(); sub_8093F64(); - sub_8093DAC(); + TrainerCard_DrawCard(); } static void sub_80937F0() { - sub_8093EF8(); + TrainerCard_LoadTrainerGraphics(); } static void nullsub_15(void) @@ -588,159 +651,173 @@ static void nullsub_15(void) static void sub_8093800() { - sub_809380C(); + TrainerCard_CreateStateMachine(); } -static void sub_809380C() +static void TrainerCard_CreateStateMachine(void) { u8 taskId; - taskId = CreateTask(sub_809382C, 0); - sub_809382C(taskId); + taskId = CreateTask(TrainerCard_RunStateMachine, 0); + TrainerCard_RunStateMachine(taskId); } -static void sub_809382C(u8 taskId) +static void TrainerCard_RunStateMachine(u8 taskId) { - while (gUnknown_083B5EBC[ewram0_2.var_0](&gTasks[taskId]) != 0) + while (TrainerCard_StateMachine[ewram0_2.current_state](&gTasks[taskId]) != 0) ; } -bool8 sub_8093864(struct Task *task) +bool8 TrainerCard_Init(struct Task *task) { - ewram0_2.var_5 = gSaveBlock2.playTimeSeconds & 1; - ewram0_2.var_6 = gSaveBlock2.playTimeVBlanks; - sub_80939A4(); + ewram0_2.showColon = gSaveBlock2.playTimeSeconds & 1; + ewram0_2.frameCounter = gSaveBlock2.playTimeVBlanks; + TrainerCard_CreatePrintPlayTimeTask(); BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - ewram0_2.var_0++; + ewram0_2.current_state++; /* Advance state machine */ return FALSE; } -bool8 sub_80938A8(struct Task *task) +bool8 TrainerCard_WaitForFadeInToFinish(struct Task *task) { if (!gPaletteFade.active) - ewram0_2.var_0++; + ewram0_2.current_state++; /* Advance state machine */ return FALSE; } -bool8 sub_80938CC(struct Task *task) +bool8 TrainerCard_WaitForKeys(struct Task *task) { if (gMain.newKeys & B_BUTTON) { - ewram0_2.var_0 = 5; + ewram0_2.current_state = 5; /* Jump to fadeout state */ return TRUE; } else if (gMain.newKeys & A_BUTTON) { - if (ewram0_2.var_3 != 0) + /* It appears that it was previously possible to return the the front side + after viewing the back side. This was probably removed due to being + unintuitive. */ + if (ewram0_2.backSideShown) { - ewram0_2.var_0 = 5; + ewram0_2.current_state = 5; /* Jump to fadeout state */ } else { - ewram0_2.var_3 ^= 1; - ewram0_2.var_0 = 3; + ewram0_2.backSideShown ^= 1; /* Switch to back side */ + ewram0_2.current_state = 3; /* Jump to start flip animation state */ } return TRUE; } +#if DEBUG + else if (gDebug_03000748 && gMain.newKeys & R_BUTTON) + { + ewram0_2.starCount++; + ewram0_2.starCount %= 5; + TrainerCard_LoadPalettes(); + if (ewram0_2.backSideShown == 0) + TrainerCard_DrawStars(); + } +#endif + return FALSE; } -bool8 sub_8093918(struct Task *task) +bool8 TrainerCard_StartFlipAntimation(struct Task *task) { - sub_8093A28(); + TrainerCard_CreateFlipAnimationTask(); PlaySE(SE_CARD); - ewram0_2.var_0++; + ewram0_2.current_state++; /* Advance state machine */ return FALSE; } -bool8 sub_8093938(struct Task *task) +bool8 TrainerCard_WaitForFlipToFinish(struct Task *task) { - if (sub_8093A48()) - ewram0_2.var_0 = 2; + if (TrainerCard_HasFlipAnimationFinished()) + ewram0_2.current_state = 2; /* Return to wait for keys state */ return FALSE; } -bool8 sub_8093954(struct Task *task) +bool8 TrainerCard_FadeOut(struct Task *task) { - sub_80939C0(); + TrainerCard_DestoryPlayTimeTask(); BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - ewram0_2.var_0++; + ewram0_2.current_state++; /* Advance state machine */ return FALSE; } -bool8 sub_8093980(struct Task *task) +bool8 TrainerCard_WaitForFadeOutToFinishAndQuit(struct Task *task) { if (!gPaletteFade.active) SetMainCallback2((MainCallback)ewram0_2.var_60); return FALSE; } -static void sub_80939A4(void) +static void TrainerCard_CreatePrintPlayTimeTask(void) { - CreateTask(sub_80939DC, 0); - BasicInitMenuWindow(&WindowConfig_TrainerCard_Back_Values); + CreateTask(TrainerCard_Front_PrintPlayTime, 0); + BasicInitMenuWindow(&gWindowTemplate_TrainerCard_Back_Values); } -static void sub_80939C0(void) +static void TrainerCard_DestoryPlayTimeTask(void) { - u8 taskId = FindTaskIdByFunc(sub_80939DC); + u8 taskId = FindTaskIdByFunc(TrainerCard_Front_PrintPlayTime); if (taskId != 0xFF) DestroyTask(taskId); } -static void sub_80939DC(u8 taskId) +static void TrainerCard_Front_PrintPlayTime(u8 taskId) { u8 buffer[32]; struct Task *task = &gTasks[taskId]; - if (ewram0_2.var_5 != task->data[TD_1]) + if (ewram0_2.showColon != task->data[TD_CARD_INDEX]) { - task->data[TD_1] = ewram0_2.var_5; - task->data[TD_0] ^= TRUE; + task->data[TD_CARD_INDEX] = ewram0_2.showColon; + task->data[TD_SHOWING_LINK_CARD] ^= TRUE; } - TrainerCard_Front_PrintPlayTime(buffer, task->data[TD_0]); - MenuPrint(buffer, 10, 12); + TrainerCard_Front_GetPlayTimeString(buffer, task->data[TD_SHOWING_LINK_CARD]); + Menu_PrintText(buffer, 10, 12); } -static void sub_8093A28(void) +static void TrainerCard_CreateFlipAnimationTask(void) { u8 taskId; - taskId = CreateTask(sub_8093A68, 0); - sub_8093A68(taskId); + taskId = CreateTask(TrainerCard_RunFlipAnimationStateMachine, 0); + TrainerCard_RunFlipAnimationStateMachine(taskId); } -static u8 sub_8093A48(void) +static u8 TrainerCard_HasFlipAnimationFinished(void) { - if (FindTaskIdByFunc(sub_8093A68) == 0xFF) + if (FindTaskIdByFunc(TrainerCard_RunFlipAnimationStateMachine) == 0xFF) return TRUE; else return FALSE; } -static void sub_8093A68(u8 taskId) +static void TrainerCard_RunFlipAnimationStateMachine(u8 taskId) { - while (gUnknown_083B5ED8[gTasks[taskId].data[0]](&gTasks[taskId]) != 0) + while (TrainerCard_FlipAnimationStateMachine[gTasks[taskId].data[0]](&gTasks[taskId]) != 0) ; } -bool8 sub_8093AA0(struct Task *task) +bool8 TrainerCard_InitFlipAnimation(struct Task *task) { u32 i; ewram0_2.var_4 = FALSE; - dp12_8087EA4(); + ScanlineEffect_Clear(); for (i = 0; i < 0xA0; i++) - gUnknown_03004DE0[1][i] = -4; - SetHBlankCallback(sub_8093D7C); + gScanlineEffectRegBuffers[1][i] = -4; + SetHBlankCallback(TrainerCard_FlipAnimationHBlankCallback); ewram0_2.var_4 = TRUE; task->data[0]++; return FALSE; } /* -bool8 sub_8093AF0(struct Task *task) +bool8 TrainerCard_ScaleDownFlipAnimation(struct Task *task) { u32 r7; u16 r9; @@ -768,7 +845,7 @@ bool8 sub_8093AF0(struct Task *task) for (i = 0; i < r7; i++) { - gUnknown_03004DE0.filler0[i] = -4 - (u32)i; + gScanlineEffectRegBuffers.filler0[i] = -4 - (u32)i; } //_08093B74 for (; i < r9; i++) @@ -776,10 +853,10 @@ bool8 sub_8093AF0(struct Task *task) u16 var = r6 >> 16; r6 += r5; r5 -= sp0; - gUnknown_03004DE0.filler0[i] = -4 + var; + gScanlineEffectRegBuffers.filler0[i] = -4 + var; } for (; i < 160; i++) - gUnknown_03004DE0.filler0[i] = -4 + (u16)(r10 >> 16); + gScanlineEffectRegBuffers.filler0[i] = -4 + (u16)(r10 >> 16); ewram0_2.var_4 = 1; if (task->data[1] > 0x4A) task->data[0]++; @@ -788,7 +865,7 @@ bool8 sub_8093AF0(struct Task *task) */ __attribute__((naked)) -bool8 sub_8093AF0(struct Task *task) +bool8 TrainerCard_ScaleDownFlipAnimation(struct Task *task) { asm(".syntax unified\n\ push {r4-r7,lr}\n\ @@ -840,7 +917,7 @@ _08093B18:\n\ movs r3, 0\n\ cmp r3, r7\n\ bcs _08093B74\n\ - ldr r2, _08093C04 @ =gUnknown_03004DE0\n\ + ldr r2, _08093C04 @ =gScanlineEffectRegBuffers\n\ mov r12, r2\n\ ldr r0, _08093C08 @ =0x0000fffc\n\ adds r4, r0, 0\n\ @@ -866,7 +943,7 @@ _08093B74:\n\ lsrs r7, r4, 16\n\ cmp r2, r0\n\ bge _08093BAE\n\ - ldr r0, _08093C04 @ =gUnknown_03004DE0\n\ + ldr r0, _08093C04 @ =gScanlineEffectRegBuffers\n\ mov r9, r0\n\ ldr r4, _08093C08 @ =0x0000fffc\n\ mov r12, r4\n\ @@ -894,7 +971,7 @@ _08093BAE:\n\ asrs r0, 16\n\ cmp r0, 0x9F\n\ bgt _08093BD4\n\ - ldr r4, _08093C04 @ =gUnknown_03004DE0\n\ + ldr r4, _08093C04 @ =gScanlineEffectRegBuffers\n\ ldr r0, _08093C08 @ =0x0000fffc\n\ adds r2, r1, r0\n\ _08093BBE:\n\ @@ -934,23 +1011,25 @@ _08093BEA:\n\ .align 2, 0\n\ _08093BFC: .4byte gSharedMem\n\ _08093C00: .4byte 0xffff0000\n\ -_08093C04: .4byte gUnknown_03004DE0\n\ +_08093C04: .4byte gScanlineEffectRegBuffers\n\ _08093C08: .4byte 0x0000fffc\n\ .syntax divided\n"); } -bool8 sub_8093C0C(struct Task *task) +bool8 TrainerCard_SwitchToNewSide(struct Task *task) { - sub_80939C0(); - sub_8093DAC(); - if (!ewram0_2.var_3) - sub_80939A4(); + TrainerCard_DestoryPlayTimeTask(); + TrainerCard_DrawCard(); + if (!ewram0_2.backSideShown) { + /* This code never runs because it is impossible to flip the back side back to the front side */ + TrainerCard_CreatePrintPlayTimeTask(); + } task->data[0]++; return TRUE; } __attribute__((naked)) -bool8 sub_8093C38(struct Task *task) +bool8 TrainerCard_ScaleUpFlipAnimation(struct Task *task) { asm(".syntax unified\n\ push {r4-r7,lr}\n\ @@ -1000,7 +1079,7 @@ _08093C5C:\n\ movs r3, 0\n\ cmp r3, r7\n\ bcs _08093CB8\n\ - ldr r2, _08093D48 @ =gUnknown_03004DE0\n\ + ldr r2, _08093D48 @ =gScanlineEffectRegBuffers\n\ mov r12, r2\n\ ldr r0, _08093D4C @ =0x0000fffc\n\ adds r4, r0, 0\n\ @@ -1026,7 +1105,7 @@ _08093CB8:\n\ lsrs r7, r4, 16\n\ cmp r2, r0\n\ bge _08093CF2\n\ - ldr r0, _08093D48 @ =gUnknown_03004DE0\n\ + ldr r0, _08093D48 @ =gScanlineEffectRegBuffers\n\ mov r9, r0\n\ ldr r3, _08093D4C @ =0x0000fffc\n\ mov r12, r3\n\ @@ -1054,7 +1133,7 @@ _08093CF2:\n\ asrs r0, 16\n\ cmp r0, 0x9F\n\ bgt _08093D18\n\ - ldr r4, _08093D48 @ =gUnknown_03004DE0\n\ + ldr r4, _08093D48 @ =gScanlineEffectRegBuffers\n\ ldr r0, _08093D4C @ =0x0000fffc\n\ adds r2, r1, r0\n\ _08093D02:\n\ @@ -1094,60 +1173,60 @@ _08093D2E:\n\ .align 2, 0\n\ _08093D40: .4byte gSharedMem\n\ _08093D44: .4byte 0xffff0000\n\ -_08093D48: .4byte gUnknown_03004DE0\n\ +_08093D48: .4byte gScanlineEffectRegBuffers\n\ _08093D4C: .4byte 0x0000fffc\n\ .syntax divided\n"); } -bool8 sub_8093D50(struct Task *task) +bool8 TrainerCard_FinishFlipAnimation(struct Task *task) { u8 taskId; ewram0_2.var_4 = FALSE; SetHBlankCallback(NULL); - sub_8093E04(); - taskId = FindTaskIdByFunc(sub_8093A68); + TrainerCard_ResetOffsetRegisters(); + taskId = FindTaskIdByFunc(TrainerCard_RunFlipAnimationStateMachine); DestroyTask(taskId); return FALSE; } -void sub_8093D7C(void) +static void TrainerCard_FlipAnimationHBlankCallback(void) { - u16 bgVOffset = gUnknown_03004DE0[1][REG_VCOUNT & 0xFF]; + u16 bgVOffset = gScanlineEffectRegBuffers[1][REG_VCOUNT & 0xFF]; REG_BG0VOFS = bgVOffset; REG_BG1VOFS = bgVOffset; REG_BG2VOFS = bgVOffset; } -static void sub_8093DAC(void) +static void TrainerCard_DrawCard(void) { - if (ewram0_2.var_3) - sub_8093DEC(); + if (ewram0_2.backSideShown) + TrainerCard_DrawCardBack(); else - sub_8093DC8(); + TrainerCard_DrawCardFront(); } -static void sub_8093DC8(void) +static void TrainerCard_DrawCardFront(void) { - MenuZeroFillScreen(); - sub_80940E4(); + Menu_EraseScreen(); + TrainerCard_ClearTrainerGraphics(); sub_8093F14(); - sub_8093F80(); - sub_8093FD0(); - sub_8094038(); - sub_8094140(); + TrainerCard_LoadTrainerTilemap(); + TrainerCard_DrawStars(); + TrainerCard_DisplayBadges(); + TrainerCard_Front_PrintTexts(); } -static void sub_8093DEC(void) +static void TrainerCard_DrawCardBack(void) { - MenuZeroFillScreen(); - sub_80940E4(); + Menu_EraseScreen(); + TrainerCard_ClearTrainerGraphics(); sub_8093F48(); - sub_8094188(); + TrainerCard_Back_PrintTexts(); } -static void sub_8093E04(void) +static void TrainerCard_ResetOffsetRegisters(void) { REG_BG0VOFS = -4; REG_BG1HOFS = 0; @@ -1156,65 +1235,42 @@ static void sub_8093E04(void) REG_BG2VOFS = -4; } -static void sub_8093E28(void) +static void TrainerCard_CopyGraphics(void) { - const u8 *src; - u8 *dst; - u32 size; - - sub_8093EA0(); + TrainerCard_LoadPalettes(); LoadPalette(gUnknown_083B5F6C, 0xE0, 32); - src = gMenuTrainerCard_Gfx; - dst = (void *)VRAM; - size = 0x1480; - while (1) - { - DmaCopy16(3, src, dst, 0x1000); - src += 0x1000; - dst += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaCopy16(3, src, dst, size); - break; - } - } - { - const void *src = gBadgesTiles; - void *dst = (void *)(VRAM + 0x1480); - - DmaCopy16(3, src, dst, 0x400); - } + DmaCopyLarge16(3, gMenuTrainerCard_Gfx, (void *)VRAM, 0x1480, 0x1000); + DmaCopy16Defvars(3, gBadgesTiles, (void *)(VRAM + 0x1480), 0x400); } -extern const u16 *const gUnknown_083B5EF8[]; +extern const u16 *const gTrainerCardPalettes[]; -void sub_8093EA0(void) +static void TrainerCard_LoadPalettes(void) { - LoadPalette(gUnknown_083B5EF8[ewram0_2.var_2], 0, 48 * 2); + LoadPalette(gTrainerCardPalettes[ewram0_2.starCount], 0, 48 * 2); LoadPalette(gBadgesPalette, 48, 16 * 2); LoadPalette(gUnknown_083B5F4C, 64, 16 * 2); - if (ewram0_2.var_64.gender != MALE) + if (ewram0_2.displayedCard.gender != MALE) LoadPalette(gUnknown_083B5F0C, 16, 16 * 2); } -static void sub_8093EF8(void) +static void TrainerCard_LoadTrainerGraphics(void) { - LoadTrainerGfx_TrainerCard(ewram0_2.var_64.gender, 80, (void *)(VRAM + 0x1880)); + LoadTrainerGfx_TrainerCard(ewram0_2.displayedCard.gender, 80, (void *)(VRAM + 0x1880)); } static void sub_8093F14(void) { const void *arr[] = {gUnknown_08E8CAC0, gUnknown_08E8D4C0}; - CpuFastSet(arr[ewram0_2.var_1], (void *)(VRAM + 0x4800), 0x140); + CpuFastSet(arr[ewram0_2.isShowingLinkCard], (void *)(VRAM + 0x4800), 0x140); } // I don't really know where to put the data. It's in such a weird order. const u8 gUnknown_083B5EF4[] = _(" : "); -const u16 *const gUnknown_083B5EF8[] = +const u16 *const gTrainerCardPalettes[] = { gMenuTrainerCard0Star_Pal, gMenuTrainerCard1Star_Pal, @@ -1227,7 +1283,7 @@ const u16 gUnknown_083B5F0C[] = INCBIN_U16("graphics/trainer_card/83B5F0C.gbapal const u16 gBadgesPalette[] = INCBIN_U16("graphics/trainer_card/badges.gbapal"); const u16 gUnknown_083B5F4C[] = INCBIN_U16("graphics/trainer_card/83B5F4C.gbapal"); const u16 gUnknown_083B5F6C[] = INCBIN_U16("graphics/trainer_card/83B5F6C.gbapal"); -const u16 gUnknown_083B5F8C[][4] = INCBIN_U16("graphics/trainer_card/83B5F8C_map.bin"); +const u16 gTrainerCardBadgesMap[][4] = INCBIN_U16("graphics/trainer_card/83B5F8C_map.bin"); static void sub_8093F48(void) { @@ -1239,7 +1295,7 @@ static void sub_8093F64(void) CpuFastSet(gUnknown_08E8D9C0, (void *)(VRAM + 0x5000), 320); } -static void sub_8093F80(void) +static void TrainerCard_LoadTrainerTilemap(void) { u16 r5 = 0xC4; u16 *ptr = (u16 *)(VRAM + 0x4000); @@ -1253,11 +1309,11 @@ static void sub_8093F80(void) } } -static void sub_8093FD0(void) +static void TrainerCard_DrawStars(void) { u16 *ptr = (u16 *)(VRAM + 0x4000); s16 i = 15; - s16 var = 15 + ewram0_2.var_2; + s16 var = 15 + ewram0_2.starCount; while (i < var) { @@ -1271,9 +1327,9 @@ static void sub_8093FD0(void) } } -static void sub_8094038(void) +static void TrainerCard_DisplayBadges(void) { - if (ewram0_2.var_1 == 0) + if (!ewram0_2.isShowingLinkCard) { u16 *ptr = (u16 *)(VRAM + 0x4000); s16 i; @@ -1281,18 +1337,18 @@ static void sub_8094038(void) for (i = 0, r2 = 4; i < 8; i++, r2 += 3) { - if (ewram0_2.var_e[i] != 0) + if (ewram0_2.ownedBadges[i] != 0) { - ptr[15 * 32 + r2 + 0] = gUnknown_083B5F8C[i][0] | 0x3000; - ptr[15 * 32 + r2 + 1] = gUnknown_083B5F8C[i][1] | 0x3000; - ptr[16 * 32 + r2 + 0] = gUnknown_083B5F8C[i][2] | 0x3000; - ptr[16 * 32 + r2 + 1] = gUnknown_083B5F8C[i][3] | 0x3000; + ptr[15 * 32 + r2 + 0] = gTrainerCardBadgesMap[i][0] | 0x3000; + ptr[15 * 32 + r2 + 1] = gTrainerCardBadgesMap[i][1] | 0x3000; + ptr[16 * 32 + r2 + 0] = gTrainerCardBadgesMap[i][2] | 0x3000; + ptr[16 * 32 + r2 + 1] = gTrainerCardBadgesMap[i][3] | 0x3000; } } } } -static void sub_80940E4(void) +static void TrainerCard_ClearTrainerGraphics(void) { s16 i; u16 *ptr; @@ -1301,7 +1357,7 @@ static void sub_80940E4(void) *ptr = 0; } -static void sub_8094110(void) +static void TrainerCard_ClearPokedexLabel(void) { u16 *ptr = (u16 *)(VRAM + 0x4800); u16 i; @@ -1313,26 +1369,26 @@ static void sub_8094110(void) } } -static void sub_8094140(void) +static void TrainerCard_Front_PrintTexts(void) { u8 *buffer; - BasicInitMenuWindow(&WindowConfig_TrainerCard_Back_Values); + BasicInitMenuWindow(&gWindowTemplate_TrainerCard_Back_Values); buffer = gStringVar1; - StringCopy(buffer, ewram0_2.var_64.playerName); + StringCopy(buffer, ewram0_2.displayedCard.playerName); ConvertInternationalString(buffer, ewram0_2.language); - MenuPrint(buffer, 7, 5); + Menu_PrintText(buffer, 7, 5); TrainerCard_Front_PrintTrainerID(); TrainerCard_Front_PrintMoney(); TrainerCard_Front_PrintPokedexCount(); - sub_809429C(); + TrainerCard_PrintEasyChatPhrase(); } -static void sub_8094188(void) +static void TrainerCard_Back_PrintTexts(void) { - BasicInitMenuWindow(&WindowConfig_TrainerCard_Back_Values); + BasicInitMenuWindow(&gWindowTemplate_TrainerCard_Back_Values); TrainerCard_Back_PrintName(); TrainerCard_Back_PrintHallOfFameTime_Label(); TrainerCard_Back_PrintLinkBattlesLabel(); @@ -1341,7 +1397,7 @@ static void sub_8094188(void) TrainerCard_Back_PrintLinkPokeblocks_Label(); TrainerCard_Back_PrintPokemonTrades_Label(); - BasicInitMenuWindow(&WindowConfig_TrainerCard_Back_Labels); + BasicInitMenuWindow(&gWindowTemplate_TrainerCard_Back_Labels); TrainerCard_Back_PrintHallOfFameTime(); TrainerCard_Back_PrintLinkBattles(); TrainerCard_Back_PrintBattleTower(); @@ -1354,31 +1410,35 @@ static void TrainerCard_Front_PrintTrainerID(void) { u8 buffer[8]; - ConvertIntToDecimalStringN(buffer, ewram0_2.var_64.trainerId, STR_CONV_MODE_LEADING_ZEROS, 5); - MenuPrint(buffer, 20, 2); + ConvertIntToDecimalStringN(buffer, ewram0_2.displayedCard.trainerId, STR_CONV_MODE_LEADING_ZEROS, 5); + Menu_PrintText(buffer, 20, 2); } static void TrainerCard_Front_PrintMoney(void) { - sub_80B7AEC(ewram0_2.var_64.money, 16, 8); + sub_80B7AEC(ewram0_2.displayedCard.money, 16, 8); } static void TrainerCard_Front_PrintPokedexCount(void) { u8 buffer[16]; - if (ewram0_2.var_7 == FALSE) + if ( +#if DEBUG + gDebug_03000748 == 0 && +#endif + !ewram0_2.showPokedexCount) { - sub_8094110(); + TrainerCard_ClearPokedexLabel(); } else { - ConvertIntToDecimalStringN(buffer, ewram0_2.var_64.pokedexSeen, STR_CONV_MODE_LEFT_ALIGN, 3); + ConvertIntToDecimalStringN(buffer, ewram0_2.displayedCard.pokedexSeen, STR_CONV_MODE_LEFT_ALIGN, 3); MenuPrint_RightAligned(buffer, 16, 10); } } -static void TrainerCard_Front_PrintPlayTime(u8 *arg1, s16 colon) +static void TrainerCard_Front_GetPlayTimeString(u8 *arg1, s16 colon) { u8 buffer[16]; u16 playTimeHours; @@ -1386,34 +1446,34 @@ static void TrainerCard_Front_PrintPlayTime(u8 *arg1, s16 colon) playTimeHours = gSaveBlock2.playTimeHours; playTimeMinutes = gSaveBlock2.playTimeMinutes; - if (ewram0_2.var_1 != 0) + if (ewram0_2.isShowingLinkCard != 0) { - playTimeHours = ewram0_2.var_64.playTimeHours; - playTimeMinutes = ewram0_2.var_64.playTimeMinutes; + playTimeHours = ewram0_2.displayedCard.playTimeHours; + playTimeMinutes = ewram0_2.displayedCard.playTimeMinutes; } FormatPlayTime(buffer, playTimeHours, playTimeMinutes, colon); sub_8072C74(arg1, buffer, 48, 1); } -static void sub_809429C(void) +static void TrainerCard_PrintEasyChatPhrase(void) { u8 *str; - if (ewram0_2.var_1 != 0) + if (ewram0_2.isShowingLinkCard != 0) { str = gStringVar1; - str = StringCopy(str, ewram0_2.var_20[0]); + str = StringCopy(str, ewram0_2.easyChatPhrase[0]); str[0] = 00; str++; - str = StringCopy(str, ewram0_2.var_20[1]); - MenuPrint(gStringVar1, 2, 14); + str = StringCopy(str, ewram0_2.easyChatPhrase[1]); + Menu_PrintText(gStringVar1, 2, 14); str = gStringVar1; - str = StringCopy(str, ewram0_2.var_20[2]); + str = StringCopy(str, ewram0_2.easyChatPhrase[2]); str[0] = 00; str++; - str = StringCopy(str, ewram0_2.var_20[3]); - MenuPrint(gStringVar1, 2, 16); + str = StringCopy(str, ewram0_2.easyChatPhrase[3]); + Menu_PrintText(gStringVar1, 2, 16); } } @@ -1422,7 +1482,7 @@ static void TrainerCard_Back_PrintName(void) u8 *str; str = gStringVar1; - StringCopy(str, ewram0_2.var_64.playerName); + StringCopy(str, ewram0_2.displayedCard.playerName); ConvertInternationalString(str, ewram0_2.language); #if ENGLISH @@ -1436,113 +1496,113 @@ static void TrainerCard_Back_PrintName(void) static void TrainerCard_Back_PrintHallOfFameTime_Label(void) { - if (ewram0_2.var_8 != 0) - MenuPrint(gOtherText_FirstHOF, 3, 5); + if (ewram0_2.showHallOfFame != 0) + Menu_PrintText(gOtherText_FirstHOF, 3, 5); } static void TrainerCard_Back_PrintHallOfFameTime(void) { u8 *str; - if (ewram0_2.var_8 != 0) + if (ewram0_2.showHallOfFame != 0) { str = gStringVar1; - str = ConvertIntToDecimalStringN(str, ewram0_2.var_64.firstHallOfFameA, STR_CONV_MODE_RIGHT_ALIGN, 3); + str = ConvertIntToDecimalStringN(str, ewram0_2.displayedCard.firstHallOfFameA, STR_CONV_MODE_RIGHT_ALIGN, 3); str = StringCopy(str, gUnknown_083B5EF4); - str = ConvertIntToDecimalStringN(str, ewram0_2.var_64.firstHallOfFameB, STR_CONV_MODE_LEADING_ZEROS, 2); + str = ConvertIntToDecimalStringN(str, ewram0_2.displayedCard.firstHallOfFameB, STR_CONV_MODE_LEADING_ZEROS, 2); str = StringCopy(str, gUnknown_083B5EF4); - str = ConvertIntToDecimalStringN(str, ewram0_2.var_64.firstHallOfFameC, STR_CONV_MODE_LEADING_ZEROS, 2); + str = ConvertIntToDecimalStringN(str, ewram0_2.displayedCard.firstHallOfFameC, STR_CONV_MODE_LEADING_ZEROS, 2); MenuPrint_RightAligned(gStringVar1, 28, 5); } } static void TrainerCard_Back_PrintLinkBattlesLabel(void) { - if (ewram0_2.var_9 != 0) - MenuPrint(gOtherText_LinkCableBattles, 3, 7); + if (ewram0_2.showLinkBattleStatus != 0) + Menu_PrintText(gOtherText_LinkCableBattles, 3, 7); } static void TrainerCard_Back_PrintLinkBattles(void) { u8 buffer[16]; - if (ewram0_2.var_9 != 0) + if (ewram0_2.showLinkBattleStatus != 0) { - ConvertIntToDecimalString(buffer, ewram0_2.var_64.linkBattleWins); + ConvertIntToDecimalString(buffer, ewram0_2.displayedCard.linkBattleWins); MenuPrint_RightAligned(buffer, 22, 7); - ConvertIntToDecimalString(buffer, ewram0_2.var_64.linkBattleLosses); + ConvertIntToDecimalString(buffer, ewram0_2.displayedCard.linkBattleLosses); MenuPrint_RightAligned(buffer, 28, 7); } } static void TrainerCard_Back_PrintBattleTower_Label(void) { - if (ewram0_2.var_a != 0) - MenuPrint(gOtherText_BattleTowerWinRecord, 3, 15); + if (ewram0_2.showBattleTowerStatus != 0) + Menu_PrintText(gOtherText_BattleTowerWinRecord, 3, 15); } static void TrainerCard_Back_PrintBattleTower(void) { u8 buffer[16]; - if (ewram0_2.var_a != 0) + if (ewram0_2.showBattleTowerStatus != 0) { - sub_8072C44(buffer, ewram0_2.var_64.battleTowerWins, 24, 1); - MenuPrint_PixelCoords(buffer, 112, 120, 0); + sub_8072C44(buffer, ewram0_2.displayedCard.battleTowerWins, 24, 1); + Menu_PrintTextPixelCoords(buffer, 112, 120, 0); - sub_8072C44(buffer, ewram0_2.var_64.battleTowerLosses, 24, 1); - MenuPrint_PixelCoords(buffer, 149, 120, 0); + sub_8072C44(buffer, ewram0_2.displayedCard.battleTowerLosses, 24, 1); + Menu_PrintTextPixelCoords(buffer, 149, 120, 0); } } static void TrainerCard_Back_PrintLinkContests_Label(void) { - if (ewram0_2.var_b != 0) - MenuPrint(gOtherText_ContestRecord, 3, 13); + if (ewram0_2.showContestRecord != 0) + Menu_PrintText(gOtherText_ContestRecord, 3, 13); } static void TrainerCard_Back_PrintLinkContests(void) { u8 buffer[8]; - if (ewram0_2.var_b != 0) + if (ewram0_2.showContestRecord != 0) { - ConvertIntToDecimalStringN(buffer, ewram0_2.var_64.contestsWithFriends, STR_CONV_MODE_RIGHT_ALIGN, 3); + ConvertIntToDecimalStringN(buffer, ewram0_2.displayedCard.contestsWithFriends, STR_CONV_MODE_RIGHT_ALIGN, 3); MenuPrint_RightAligned(buffer, 28, 13); } } static void TrainerCard_Back_PrintLinkPokeblocks_Label(void) { - if (ewram0_2.var_c != 0) - MenuPrint(gOtherText_MixingRecord, 3, 11); + if (ewram0_2.showMixingRecord != 0) + Menu_PrintText(gOtherText_MixingRecord, 3, 11); } static void TrainerCard_Back_PrintLinkPokeblocks(void) { u8 buffer[8]; - if (ewram0_2.var_c != 0) + if (ewram0_2.showMixingRecord != 0) { - ConvertIntToDecimalStringN(buffer, ewram0_2.var_64.pokeblocksWithFriends, STR_CONV_MODE_RIGHT_ALIGN, 5); + ConvertIntToDecimalStringN(buffer, ewram0_2.displayedCard.pokeblocksWithFriends, STR_CONV_MODE_RIGHT_ALIGN, 5); MenuPrint_RightAligned(buffer, 28, 11); } } static void TrainerCard_Back_PrintPokemonTrades_Label(void) { - if (ewram0_2.var_d != 0) - MenuPrint(gOtherText_TradeRecord, 3, 9); + if (ewram0_2.showTradingRecord != 0) + Menu_PrintText(gOtherText_TradeRecord, 3, 9); } static void TrainerCard_Back_PrintPokemonTrades(void) { u8 buffer[8]; - if (ewram0_2.var_d != 0) + if (ewram0_2.showTradingRecord != 0) { - ConvertIntToDecimalStringN(buffer, ewram0_2.var_64.pokemonTrades, STR_CONV_MODE_RIGHT_ALIGN, 5); + ConvertIntToDecimalStringN(buffer, ewram0_2.displayedCard.pokemonTrades, STR_CONV_MODE_RIGHT_ALIGN, 5); MenuPrint_RightAligned(buffer, 28, 9); } } @@ -1553,5 +1613,5 @@ void unref_sub_8094588(u16 left, u16 top) if (gSaveBlock2.playerGender == FEMALE) text = gOtherText_Girl; - MenuPrint(text, left, top); + Menu_PrintText(text, left, top); } diff --git a/src/field/battle_tower.c b/src/field/battle_tower.c index caebc6a7b..41d5ae9d1 100644 --- a/src/field/battle_tower.c +++ b/src/field/battle_tower.c @@ -103,59 +103,59 @@ static const u16 sBattleTowerHeldItems[] = { #include "../data/battle_tower/level_100_mons.h" static const u8 sMaleTrainerClasses[] = { - TRAINER_CLASS_RUIN_MANIAC, - TRAINER_CLASS_TUBER_M, - TRAINER_CLASS_COOL_TRAINER_M, - TRAINER_CLASS_RICH_BOY, - TRAINER_CLASS_POKEMANIAC, - TRAINER_CLASS_SWIMMER_M, - TRAINER_CLASS_BLACK_BELT, - TRAINER_CLASS_GUITARIST, - TRAINER_CLASS_KINDLER, - TRAINER_CLASS_CAMPER, - TRAINER_CLASS_BUG_MANIAC, - TRAINER_CLASS_PSYCHIC_M, - TRAINER_CLASS_GENTLEMAN, - TRAINER_CLASS_SCHOOL_KID_M, - TRAINER_CLASS_POKEFAN_M, - TRAINER_CLASS_EXPERT_M, - TRAINER_CLASS_YOUNGSTER, - TRAINER_CLASS_FISHERMAN, - TRAINER_CLASS_CYCLING_TRIATHLETE_M, - TRAINER_CLASS_RUNNING_TRIATHLETE_M, - TRAINER_CLASS_SWIMMING_TRIATHLETE_M, - TRAINER_CLASS_DRAGON_TAMER, - TRAINER_CLASS_BIRD_KEEPER, - TRAINER_CLASS_NINJA_BOY, - TRAINER_CLASS_SAILOR, - TRAINER_CLASS_COLLECTOR, - TRAINER_CLASS_POKEMON_BREEDER_M, - TRAINER_CLASS_POKEMON_RANGER_M, - TRAINER_CLASS_BUG_CATCHER, - TRAINER_CLASS_HIKER, + FACILITY_CLASS_RUIN_MANIAC, + FACILITY_CLASS_TUBER_M, + FACILITY_CLASS_COOL_TRAINER_M, + FACILITY_CLASS_RICH_BOY, + FACILITY_CLASS_POKEMANIAC, + FACILITY_CLASS_SWIMMER_M, + FACILITY_CLASS_BLACK_BELT, + FACILITY_CLASS_GUITARIST, + FACILITY_CLASS_KINDLER, + FACILITY_CLASS_CAMPER, + FACILITY_CLASS_BUG_MANIAC, + FACILITY_CLASS_PSYCHIC_M, + FACILITY_CLASS_GENTLEMAN, + FACILITY_CLASS_SCHOOL_KID_M, + FACILITY_CLASS_POKEFAN_M, + FACILITY_CLASS_EXPERT_M, + FACILITY_CLASS_YOUNGSTER, + FACILITY_CLASS_FISHERMAN, + FACILITY_CLASS_CYCLING_TRIATHLETE_M, + FACILITY_CLASS_RUNNING_TRIATHLETE_M, + FACILITY_CLASS_SWIMMING_TRIATHLETE_M, + FACILITY_CLASS_DRAGON_TAMER, + FACILITY_CLASS_BIRD_KEEPER, + FACILITY_CLASS_NINJA_BOY, + FACILITY_CLASS_SAILOR, + FACILITY_CLASS_COLLECTOR, + FACILITY_CLASS_POKEMON_BREEDER_M, + FACILITY_CLASS_POKEMON_RANGER_M, + FACILITY_CLASS_BUG_CATCHER, + FACILITY_CLASS_HIKER, }; static const u8 sFemaleTrainerClasses[] = { - TRAINER_CLASS_AROMA_LADY, - TRAINER_CLASS_TUBER_F, - TRAINER_CLASS_COOL_TRAINER_F, - TRAINER_CLASS_HEX_MANIAC, - TRAINER_CLASS_LADY, - TRAINER_CLASS_BEAUTY, - TRAINER_CLASS_PSYCHIC_F, - TRAINER_CLASS_SCHOOL_KID_F, - TRAINER_CLASS_POKEFAN_F, - TRAINER_CLASS_EXPERT_F, - TRAINER_CLASS_CYCLING_TRIATHLETE_F, - TRAINER_CLASS_RUNNING_TRIATHLETE_F, - TRAINER_CLASS_SWIMMING_TRIATHLETE_F, - TRAINER_CLASS_BATTLE_GIRL, - TRAINER_CLASS_PARASOL_LADY, - TRAINER_CLASS_SWIMMER_F, - TRAINER_CLASS_PICNICKER, - TRAINER_CLASS_POKEMON_BREEDER_F, - TRAINER_CLASS_POKEMON_RANGER_F, - TRAINER_CLASS_LASS, + FACILITY_CLASS_AROMA_LADY, + FACILITY_CLASS_TUBER_F, + FACILITY_CLASS_COOL_TRAINER_F, + FACILITY_CLASS_HEX_MANIAC, + FACILITY_CLASS_LADY, + FACILITY_CLASS_BEAUTY, + FACILITY_CLASS_PSYCHIC_F, + FACILITY_CLASS_SCHOOL_KID_F, + FACILITY_CLASS_POKEFAN_F, + FACILITY_CLASS_EXPERT_F, + FACILITY_CLASS_CYCLING_TRIATHLETE_F, + FACILITY_CLASS_RUNNING_TRIATHLETE_F, + FACILITY_CLASS_SWIMMING_TRIATHLETE_F, + FACILITY_CLASS_BATTLE_GIRL, + FACILITY_CLASS_PARASOL_LADY, + FACILITY_CLASS_SWIMMER_F, + FACILITY_CLASS_PICNICKER, + FACILITY_CLASS_POKEMON_BREEDER_F, + FACILITY_CLASS_POKEMON_RANGER_F, + FACILITY_CLASS_LASS, }; static const u8 sMaleTrainerGfxIds[] = { @@ -255,11 +255,11 @@ static void ResetBattleTowerStreak(u8 levelType); static void ValidateBattleTowerRecordChecksums(void); static void PrintEReaderTrainerFarewellMessage(void); extern void SetBattleTowerTrainerGfxId(u8); -extern void sub_8135A3C(void); +static void SaveCurrentWinStreak(void); static void sub_8135CFC(void); static void CheckMonBattleTowerBanlist(u16, u16, u16, u8, u8, u16 *, u16 *, u8 *); static void ClearEReaderTrainer(struct BattleTowerEReaderTrainer *); -static void SetEReaderTrainerChecksum(struct BattleTowerEReaderTrainer *ereaderTrainer); +void SetEReaderTrainerChecksum(struct BattleTowerEReaderTrainer *ereaderTrainer); static void SetBattleTowerRecordChecksum(struct BattleTowerRecord *); static void ClearBattleTowerRecord(struct BattleTowerRecord *); @@ -1538,7 +1538,7 @@ void CheckPartyBattleTowerBanlist(void) StringAppend(gStringVar1, BattleText_Format8); return; } - + if (1 & counter) StringAppend(gStringVar1, BattleText_Format6); else @@ -1699,7 +1699,7 @@ void SetBattleTowerProperty(void) } gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType]++; - sub_8135A3C(); + SaveCurrentWinStreak(); gSpecialVar_Result = gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType]; gStringVar1[0] = gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType] + 0xA1; @@ -1711,7 +1711,7 @@ void SetBattleTowerProperty(void) gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType]++; } - sub_8135A3C(); + SaveCurrentWinStreak(); gSpecialVar_Result = gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType]; break; case 8: @@ -1801,118 +1801,35 @@ void SetBattleTowerParty(void) ReducePlayerPartyToThree(); } -#ifdef NONMATCHING -void sub_8135A3C(void) +static void SaveCurrentWinStreak(void) { - u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; - u16 winStreak = GetCurrentBattleTowerWinStreak(battleTowerLevelType); + u8 levelType = gSaveBlock2.battleTower.battleTowerLevelType; + u16 streak = GetCurrentBattleTowerWinStreak(levelType); - if (gSaveBlock2.battleTower.recordWinStreaks[battleTowerLevelType] < winStreak) - { - gSaveBlock2.battleTower.recordWinStreaks[battleTowerLevelType] = winStreak; - } + if (gSaveBlock2.battleTower.recordWinStreaks[levelType] < streak) + gSaveBlock2.battleTower.recordWinStreaks[levelType] = streak; if (gSaveBlock2.battleTower.recordWinStreaks[0] > gSaveBlock2.battleTower.recordWinStreaks[1]) { - u16 streak = gSaveBlock2.battleTower.recordWinStreaks[0]; + streak = gSaveBlock2.battleTower.recordWinStreaks[0]; SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, streak); + if (streak > 9999) - { gSaveBlock2.battleTower.bestBattleTowerWinStreak = 9999; - } else - { gSaveBlock2.battleTower.bestBattleTowerWinStreak = streak; - } } else { - u16 streak = gSaveBlock2.battleTower.recordWinStreaks[1]; + streak = gSaveBlock2.battleTower.recordWinStreaks[1]; SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, streak); + if (streak > 9999) - { gSaveBlock2.battleTower.bestBattleTowerWinStreak = 9999; - } else - { gSaveBlock2.battleTower.bestBattleTowerWinStreak = streak; - } } } -#else -__attribute__((naked)) -void sub_8135A3C(void) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - ldr r6, _08135A84 @ =gSaveBlock2\n\ - ldr r1, _08135A88 @ =0x00000554\n\ - adds r0, r6, r1\n\ - ldrb r4, [r0]\n\ - lsls r4, 31\n\ - lsrs r4, 31\n\ - adds r0, r4, 0\n\ - bl GetCurrentBattleTowerWinStreak\n\ - lsls r0, 16\n\ - lsrs r5, r0, 16\n\ - lsls r4, 1\n\ - movs r3, 0xAC\n\ - lsls r3, 3\n\ - adds r2, r6, r3\n\ - adds r4, r2\n\ - ldrh r0, [r4]\n\ - cmp r0, r5\n\ - bcs _08135A66\n\ - strh r5, [r4]\n\ -_08135A66:\n\ - ldr r0, _08135A8C @ =0x00000562\n\ - adds r1, r6, r0\n\ - ldrh r0, [r2]\n\ - ldrh r3, [r1]\n\ - cmp r0, r3\n\ - bls _08135A94\n\ - adds r5, r0, 0\n\ - movs r0, 0x20\n\ - adds r1, r5, 0\n\ - bl SetGameStat\n\ - ldr r1, _08135A90 @ =0x0000270f\n\ - cmp r5, r1\n\ - bhi _08135AA4\n\ - b _08135AB4\n\ - .align 2, 0\n\ -_08135A84: .4byte gSaveBlock2\n\ -_08135A88: .4byte 0x00000554\n\ -_08135A8C: .4byte 0x00000562\n\ -_08135A90: .4byte 0x0000270f\n\ -_08135A94:\n\ - ldrh r5, [r1]\n\ - movs r0, 0x20\n\ - adds r1, r5, 0\n\ - bl SetGameStat\n\ - ldr r1, _08135AAC @ =0x0000270f\n\ - cmp r5, r1\n\ - bls _08135AB4\n\ -_08135AA4:\n\ - ldr r2, _08135AB0 @ =0x00000572\n\ - adds r0, r6, r2\n\ - strh r1, [r0]\n\ - b _08135ABA\n\ - .align 2, 0\n\ -_08135AAC: .4byte 0x0000270f\n\ -_08135AB0: .4byte 0x00000572\n\ -_08135AB4:\n\ - ldr r3, _08135AC0 @ =0x00000572\n\ - adds r0, r6, r3\n\ - strh r5, [r0]\n\ -_08135ABA:\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08135AC0: .4byte 0x00000572\n\ - .syntax divided\n"); -} -#endif // NONMATCHING void sub_8135AC4(void) { @@ -1951,7 +1868,7 @@ void sub_8135AC4(void) } SetBattleTowerRecordChecksum(&gSaveBlock2.battleTower.playerRecord); - sub_8135A3C(); + SaveCurrentWinStreak(); } void SaveBattleTowerProgress(void) @@ -1978,7 +1895,7 @@ void SaveBattleTowerProgress(void) VarSet(VAR_TEMP_0, 0); gSaveBlock2.battleTower.unk_554 = 1; - TrySavingData(EREADER_SAVE); + Save_WriteData(SAVE_EREADER); } void BattleTower_SoftReset(void) @@ -2068,79 +1985,15 @@ u16 GetCurrentBattleTowerWinStreak(u8 battleTowerLevelType) return winStreak; } -#ifdef NONMATCHING void DetermineBattleTowerPrize(void) { - u16 prizeItem; - struct SaveBlock2 *saveBlock = &gSaveBlock2; - u8 battleTowerLevelType = saveBlock->battleTower.battleTowerLevelType; + u8 levelType = gSaveBlock2.battleTower.battleTowerLevelType; - if (saveBlock->battleTower.curStreakChallengesNum[battleTowerLevelType] - 1 > 5) - { - prizeItem = sLongStreakPrizes[Random() % ARRAY_COUNT(sLongStreakPrizes)]; - } + if (gSaveBlock2.battleTower.curStreakChallengesNum[levelType] - 1 > 5) + gSaveBlock2.battleTower.prizeItem = sLongStreakPrizes[Random() % ARRAY_COUNT(sLongStreakPrizes)]; else - { - prizeItem = sShortStreakPrizes[Random() % ARRAY_COUNT(sShortStreakPrizes)]; - } - - saveBlock->battleTower.prizeItem = prizeItem; -} -#else -__attribute__((naked)) -void DetermineBattleTowerPrize(void) -{ - asm(".syntax unified\n\ - push {r4,r5,lr}\n\ - ldr r5, _08135DB0 @ =gSaveBlock2\n\ - ldr r1, _08135DB4 @ =0x00000554\n\ - adds r0, r5, r1\n\ - ldrb r0, [r0]\n\ - lsls r0, 31\n\ - lsrs r0, 31\n\ - lsls r0, 1\n\ - ldr r2, _08135DB8 @ =0x0000055c\n\ - adds r1, r5, r2\n\ - adds r0, r1\n\ - ldrh r0, [r0]\n\ - subs r0, 0x1\n\ - cmp r0, 0x5\n\ - ble _08135DC0\n\ - bl Random\n\ - ldr r4, _08135DBC @ =sLongStreakPrizes\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0x9\n\ - b _08135DCC\n\ - .align 2, 0\n\ -_08135DB0: .4byte gSaveBlock2\n\ -_08135DB4: .4byte 0x00000554\n\ -_08135DB8: .4byte 0x0000055c\n\ -_08135DBC: .4byte sLongStreakPrizes\n\ -_08135DC0:\n\ - bl Random\n\ - ldr r4, _08135DE8 @ =sShortStreakPrizes\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0x6\n\ -_08135DCC:\n\ - bl __umodsi3\n\ - lsls r0, 16\n\ - lsrs r0, 15\n\ - adds r0, r4\n\ - ldrh r1, [r0]\n\ - movs r2, 0xAD\n\ - lsls r2, 3\n\ - adds r0, r5, r2\n\ - strh r1, [r0]\n\ - pop {r4,r5}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08135DE8: .4byte sShortStreakPrizes\n\ - .syntax divided\n"); + gSaveBlock2.battleTower.prizeItem = sShortStreakPrizes[Random() % ARRAY_COUNT(sShortStreakPrizes)]; } -#endif // NONMATCHING void GiveBattleTowerPrize(void) { diff --git a/src/field/berry.c b/src/field/berry.c index 088267ad0..588807755 100644 --- a/src/field/berry.c +++ b/src/field/berry.c @@ -999,6 +999,66 @@ extern u16 gSpecialVar_0x8006; static u8 CalcBerryYield(struct BerryTree *tree); static u16 GetStageDurationByBerryType(u8 berry); +#if DEBUG +__attribute__((naked)) +void debug_sub_80C2B04() +{ + asm( + " push {lr}\n" + " mov r0, #0x0\n" + " bl sub_80B47D8\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldr r2, ._1 @ gTasks\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r2\n" + " ldrh r0, [r1, #0x10]\n" + " sub r0, r0, #0x1\n" + " strh r0, [r1, #0x10]\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._2:\n" + " .align 2, 0\n" + "._1:\n" + " .word gTasks\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_80C2B30() +{ + asm( + " push {lr}\n" + " mov r0, #0x1\n" + " bl sub_80B47D8\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldr r2, ._3 @ gTasks\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r2\n" + " ldrh r0, [r1, #0x10]\n" + " sub r0, r0, #0x1\n" + " strh r0, [r1, #0x10]\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._4:\n" + " .align 2, 0\n" + "._3:\n" + " .word gTasks\n" + "\n" + ); +} +#endif + // unused // this could be static, but making it so causes a compile-time warning. void ClearEnigmaBerries(void) @@ -1022,6 +1082,180 @@ void SetEnigmaBerry(u8 *src) gSaveBlock1.enigmaBerry.berry.description2 = gSaveBlock1.enigmaBerry.description2; } +#if DEBUG +__attribute__((naked)) +void debug_sub_80C2BD0() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " ldr r3, ._11 @ gSaveBlock1\n" + " ldr r1, ._11 + 4 @ 0x316c\n" + " add r4, r3, r1\n" + " ldr r6, [r4]\n" + " add r1, r1, #0x4\n" + " add r2, r3, r1\n" + " ldr r7, [r2]\n" + " mov r1, #0x0\n" + " str r1, [r4]\n" + " str r1, [r2]\n" + " add r4, r0, #0\n" + " mov r2, #0x0\n" + " ldr r5, ._11 + 8 @ 0x52b\n" + "._10:\n" + " add r0, r4, r1\n" + " ldrb r0, [r0]\n" + " add r2, r2, r0\n" + " add r1, r1, #0x1\n" + " cmp r1, r5\n" + " bls ._10 @cond_branch\n" + " ldr r1, ._11 + 4 @ 0x316c\n" + " add r0, r3, r1\n" + " str r6, [r0]\n" + " add r1, r1, #0x4\n" + " add r0, r3, r1\n" + " str r7, [r0]\n" + " add r0, r2, #0\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._12:\n" + " .align 2, 0\n" + "._11:\n" + " .word gSaveBlock1\n" + " .word 0x316c\n" + " .word 0x52b\n" + "\n" + ); +} +#endif + +#if DEBUG +__attribute__((naked)) +u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry) +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r9\n" + " mov r6, r8\n" + " push {r6, r7}\n" + " add r3, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " mov r9, r1\n" + " lsl r2, r2, #0x18\n" + " lsr r2, r2, #0x18\n" + " mov r8, r2\n" + " ldr r4, ._16 @ gSaveBlock1\n" + " ldr r1, ._16 + 4 @ 0x3160\n" + " add r0, r4, r1\n" + " add r2, r0, #0\n" + " ldr r1, ._16 + 8 @ gBerries\n" + " ldmia r1!, {r5, r6, r7}\n" + " stmia r2!, {r5, r6, r7}\n" + " ldmia r1!, {r5, r6, r7}\n" + " stmia r2!, {r5, r6, r7}\n" + " ldr r1, [r1]\n" + " str r1, [r2]\n" + " add r1, r3, #0\n" + " bl StringCopy\n" + " ldr r0, ._16 + 12 @ 0x361c\n" + " add r6, r4, r0\n" + " ldr r1, ._16 + 16 @ gUnknown_Debug_083F7F84\n" + " add r0, r6, #0\n" + " bl StringCopy\n" + " ldr r1, ._16 + 20 @ 0x3649\n" + " add r5, r4, r1\n" + " ldr r1, ._16 + 24 @ gUnknown_Debug_083F7F90\n" + " add r0, r5, #0\n" + " bl StringCopy\n" + " ldr r2, ._16 + 28 @ 0x316c\n" + " add r0, r4, r2\n" + " str r6, [r0]\n" + " ldr r6, ._16 + 32 @ 0x3170\n" + " add r0, r4, r6\n" + " str r5, [r0]\n" + " mov r2, #0x0\n" + " ldr r6, ._16 + 36 @ 0x47f\n" + " ldr r7, ._16 + 40 @ 0x317c\n" + " add r5, r4, r7\n" + " ldr r3, ._16 + 44 @ gSpriteImage_UnusedCherry\n" + "._13:\n" + " add r0, r2, r5\n" + " add r1, r2, r3\n" + " ldrb r1, [r1]\n" + " strb r1, [r0]\n" + " add r2, r2, #0x1\n" + " cmp r2, r6\n" + " ble ._13 @cond_branch\n" + " ldr r0, ._16 @ gSaveBlock1\n" + " ldr r3, ._16 + 48 @ gSpritePalette_UnusedCherry\n" + " ldr r2, ._16 + 52 @ 0x35fc\n" + " add r1, r0, r2\n" + " mov r2, #0xf\n" + "._14:\n" + " ldrh r0, [r3]\n" + " strh r0, [r1]\n" + " add r3, r3, #0x2\n" + " add r1, r1, #0x2\n" + " sub r2, r2, #0x1\n" + " cmp r2, #0\n" + " bge ._14 @cond_branch\n" + " mov r2, #0x0\n" + " ldr r5, ._16 + 56 @ gSaveBlock1\n" + " ldr r3, ._16 + 60 @ gUnknown_Debug_839B6CE\n" + "._15:\n" + " add r0, r2, r5\n" + " add r1, r2, r3\n" + " ldrb r1, [r1]\n" + " strb r1, [r0]\n" + " add r2, r2, #0x1\n" + " cmp r2, #0x11\n" + " ble ._15 @cond_branch\n" + " ldr r5, ._16 + 64 @ 0x3688\n" + " add r0, r4, r5\n" + " mov r6, r9\n" + " strb r6, [r0]\n" + " ldr r7, ._16 + 68 @ 0x3689\n" + " add r0, r4, r7\n" + " mov r1, r8\n" + " strb r1, [r0]\n" + " ldr r2, ._16 + 4 @ 0x3160\n" + " add r0, r4, r2\n" + " bl debug_sub_80C2BD0\n" + " add r5, r5, #0x4\n" + " add r1, r4, r5\n" + " str r0, [r1]\n" + " pop {r3, r4}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._17:\n" + " .align 2, 0\n" + "._16:\n" + " .word gSaveBlock1\n" + " .word 0x3160\n" + " .word gBerries\n" + " .word 0x361c\n" + " .word gUnknown_Debug_083F7F84\n" + " .word 0x3649\n" + " .word gUnknown_Debug_083F7F90\n" + " .word 0x316c\n" + " .word 0x3170\n" + " .word 0x47f\n" + " .word 0x317c\n" + " .word gSpriteImage_UnusedCherry\n" + " .word gSpritePalette_UnusedCherry\n" + " .word 0x35fc\n" + " .word gSaveBlock1+0x3676\n" + " .word gUnknown_Debug_839B6CE\n" + " .word 0x3688\n" + " .word 0x3689\n" + "\n" + ); +} +#else static u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry) { const u8 *description1; @@ -1051,9 +1285,110 @@ static u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry) return checksum; } +#endif + +#if DEBUG +__attribute__((naked)) +void debug_sub_80C2D24() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " ldr r6, [sp, #0x18]\n" + " ldr r4, [sp, #0x1c]\n" + " mov r8, r4\n" + " ldr r5, ._18 @ gSaveBlock1\n" + " ldr r7, ._18 + 4 @ 0x3175\n" + " add r4, r5, r7\n" + " strb r0, [r4]\n" + " ldr r4, ._18 + 8 @ 0x3176\n" + " add r0, r5, r4\n" + " strb r1, [r0]\n" + " add r7, r7, #0x2\n" + " add r0, r5, r7\n" + " strb r2, [r0]\n" + " ldr r1, ._18 + 12 @ 0x3178\n" + " add r0, r5, r1\n" + " strb r3, [r0]\n" + " add r4, r4, #0x3\n" + " add r0, r5, r4\n" + " strb r6, [r0]\n" + " add r7, r7, #0x3\n" + " add r0, r5, r7\n" + " mov r1, r8\n" + " strb r1, [r0]\n" + " sub r4, r4, #0x19\n" + " add r0, r5, r4\n" + " bl debug_sub_80C2BD0\n" + " ldr r7, ._18 + 16 @ 0x368c\n" + " add r5, r5, r7\n" + " str r0, [r5]\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._19:\n" + " .align 2, 0\n" + "._18:\n" + " .word gSaveBlock1\n" + " .word 0x3175\n" + " .word 0x3176\n" + " .word 0x3178\n" + " .word 0x368c\n" + "\n" + ); +} +#endif // due to e-reader scans being particularly volatile to failure, it is a requirement to check for // their integrity here due to scans possibly failing to produce the correct result. +#if DEBUG +__attribute__((naked)) +bool32 IsEnigmaBerryValid() +{ + asm( + " push {r4, lr}\n" + " ldr r4, ._24 @ gSaveBlock1\n" + " ldr r1, ._24 + 4 @ 0x3174\n" + " add r0, r4, r1\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " beq ._22 @cond_branch\n" + " ldr r2, ._24 + 8 @ 0x316a\n" + " add r0, r4, r2\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " beq ._22 @cond_branch\n" + " ldr r1, ._24 + 12 @ 0x3160\n" + " add r0, r4, r1\n" + " bl debug_sub_80C2BD0\n" + " ldr r2, ._24 + 16 @ 0x368c\n" + " add r1, r4, r2\n" + " ldr r1, [r1]\n" + " cmp r0, r1\n" + " bne ._22 @cond_branch\n" + " mov r0, #0x1\n" + " b ._23\n" + "._25:\n" + " .align 2, 0\n" + "._24:\n" + " .word gSaveBlock1\n" + " .word 0x3174\n" + " .word 0x316a\n" + " .word 0x3160\n" + " .word 0x368c\n" + "._22:\n" + " mov r0, #0x0\n" + "._23:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} +#else bool32 IsEnigmaBerryValid(void) { if (gSaveBlock1.enigmaBerry.berry.stageDuration == 0) @@ -1064,6 +1399,7 @@ bool32 IsEnigmaBerryValid(void) return FALSE; return TRUE; } +#endif const struct Berry *GetBerryInfo(u8 berry) { @@ -1417,6 +1753,177 @@ bool8 PlayerHasBerries(void) return IsBagPocketNonEmpty(BAG_BERRIES); } +#if DEBUG +void debug_sub_80C33FC(u8 *buffer, s32 value, u8 n) +{ + StringAppend(gStringVar4, buffer); + ConvertIntToDecimalStringN(gStringVar1, value, STR_CONV_MODE_LEADING_ZEROS, n); + StringAppend(gStringVar4, gStringVar1); +} + +extern const u8 gUnknown_Debug_083F7F9D[]; +extern const u8 gUnknown_Debug_083F7FA2[]; +extern const u8 gUnknown_Debug_083F7FA9[]; +extern const u8 gUnknown_Debug_083F7FB0[]; +extern const u8 gUnknown_Debug_083F7FB7[]; +extern const u8 gUnknown_Debug_083F7FBE[]; +extern const u8 gUnknown_Debug_083F7FC5[]; +extern const u8 gUnknown_Debug_083F7FCC[]; +extern const u8 gUnknown_Debug_083F7FD3[]; +extern const u8 gUnknown_Debug_083F7FD3[]; +extern const u8 gUnknown_Debug_083F7FD3[]; + +#ifdef NONMATCHING +u8* DebugOpenBerryInfo(void) +{ + s32 i; + u8 berryTreeId; + struct BerryTree *berryTree; + + if (GetFieldObjectScriptPointerPlayerFacing() != &S_BerryTree) + return NULL; + + berryTreeId = FieldObjectGetBerryTreeId(gSelectedMapObject); + berryTree = GetBerryTreeInfo(berryTreeId); + + for (i = 0; i < 500; i++) + gStringVar4[i] |= 0xFF; + + debug_sub_80C33FC(gUnknown_Debug_083F7F9D, berryTreeId, 3); + debug_sub_80C33FC(gUnknown_Debug_083F7FA2, berryTree->berry, 2); + debug_sub_80C33FC(gUnknown_Debug_083F7FA9, berryTree->stage, 2); + debug_sub_80C33FC(gUnknown_Debug_083F7FB0, berryTree->secondsUntilNextStage, 5); + debug_sub_80C33FC(gUnknown_Debug_083F7FB7, berryTree->berryYield, 2); + debug_sub_80C33FC(gUnknown_Debug_083F7FBE, berryTree->regrowthCount, 3); + debug_sub_80C33FC(gUnknown_Debug_083F7FC5, berryTree->growthSparkle, 1); + debug_sub_80C33FC(gUnknown_Debug_083F7FCC, berryTree->watered1, 1); + debug_sub_80C33FC(gUnknown_Debug_083F7FD3, berryTree->watered2, 1); + debug_sub_80C33FC(gUnknown_Debug_083F7FD3, berryTree->watered3, 1); + debug_sub_80C33FC(gUnknown_Debug_083F7FD3, berryTree->watered4, 1); + + return gStringVar4; +} +#else +__attribute__((naked)) +void DebugOpenBerryInfo() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " bl GetFieldObjectScriptPointerPlayerFacing\n" + " ldr r1, ._138 @ S_BerryTree\n" + " cmp r0, r1\n" + " beq ._136 @cond_branch\n" + " mov r0, #0x0\n" + " b ._137\n" + "._139:\n" + " .align 2, 0\n" + "._138:\n" + " .word S_BerryTree\n" + "._136:\n" + " ldr r0, ._141 @ gSelectedMapObject\n" + " ldrb r0, [r0]\n" + " bl FieldObjectGetBerryTreeId\n" + " lsl r0, r0, #0x18\n" + " lsr r6, r0, #0x18\n" + " add r0, r6, #0\n" + " bl GetBerryTreeInfo\n" + " add r5, r0, #0\n" + " mov r2, #0x0\n" + " ldr r7, ._141 + 4 @ 0x1f3\n" + " ldr r4, ._141 + 8 @ gStringVar4\n" + " mov r3, #0xff\n" + "._140:\n" + " add r1, r2, r4\n" + " ldrb r0, [r1]\n" + " orr r0, r0, r3\n" + " strb r0, [r1]\n" + " add r2, r2, #0x1\n" + " cmp r2, r7\n" + " ble ._140 @cond_branch\n" + " ldr r0, ._141 + 12 @ gUnknown_Debug_083F7F9D\n" + " add r1, r6, #0\n" + " mov r2, #0x3\n" + " bl debug_sub_80C33FC\n" + " ldr r0, ._141 + 16 @ gUnknown_Debug_083F7FA2\n" + " ldrb r1, [r5]\n" + " mov r2, #0x2\n" + " bl debug_sub_80C33FC\n" + " ldr r0, ._141 + 20 @ gUnknown_Debug_083F7FA9\n" + " ldrb r1, [r5, #0x1]\n" + " lsl r1, r1, #0x19\n" + " lsr r1, r1, #0x19\n" + " mov r2, #0x2\n" + " bl debug_sub_80C33FC\n" + " ldr r0, ._141 + 24 @ gUnknown_Debug_083F7FB0\n" + " ldrh r1, [r5, #0x2]\n" + " mov r2, #0x5\n" + " bl debug_sub_80C33FC\n" + " ldr r0, ._141 + 28 @ gUnknown_Debug_083F7FB7\n" + " ldrb r1, [r5, #0x4]\n" + " mov r2, #0x2\n" + " bl debug_sub_80C33FC\n" + " ldr r0, ._141 + 32 @ gUnknown_Debug_083F7FBE\n" + " ldrb r1, [r5, #0x5]\n" + " lsl r1, r1, #0x1c\n" + " lsr r1, r1, #0x1c\n" + " mov r2, #0x3\n" + " bl debug_sub_80C33FC\n" + " ldr r0, ._141 + 36 @ gUnknown_Debug_083F7FC5\n" + " ldrb r1, [r5, #0x1]\n" + " lsr r1, r1, #0x7\n" + " mov r2, #0x1\n" + " bl debug_sub_80C33FC\n" + " ldr r0, ._141 + 40 @ gUnknown_Debug_083F7FCC\n" + " ldrb r1, [r5, #0x5]\n" + " lsl r1, r1, #0x1b\n" + " lsr r1, r1, #0x1f\n" + " mov r2, #0x1\n" + " bl debug_sub_80C33FC\n" + " ldr r4, ._141 + 44 @ gUnknown_Debug_083F7FD3\n" + " ldrb r1, [r5, #0x5]\n" + " lsl r1, r1, #0x1a\n" + " lsr r1, r1, #0x1f\n" + " add r0, r4, #0\n" + " mov r2, #0x1\n" + " bl debug_sub_80C33FC\n" + " ldrb r1, [r5, #0x5]\n" + " lsl r1, r1, #0x19\n" + " lsr r1, r1, #0x1f\n" + " add r0, r4, #0\n" + " mov r2, #0x1\n" + " bl debug_sub_80C33FC\n" + " ldrb r1, [r5, #0x5]\n" + " lsr r1, r1, #0x7\n" + " add r0, r4, #0\n" + " mov r2, #0x1\n" + " bl debug_sub_80C33FC\n" + " ldr r0, ._141 + 8 @ gStringVar4\n" + "._137:\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._142:\n" + " .align 2, 0\n" + "._141:\n" + " .word gSelectedMapObject\n" + " .word 0x1f3\n" + " .word gStringVar4\n" + " .word gUnknown_Debug_083F7F9D\n" + " .word gUnknown_Debug_083F7FA2\n" + " .word gUnknown_Debug_083F7FA9\n" + " .word gUnknown_Debug_083F7FB0\n" + " .word gUnknown_Debug_083F7FB7\n" + " .word gUnknown_Debug_083F7FBE\n" + " .word gUnknown_Debug_083F7FC5\n" + " .word gUnknown_Debug_083F7FCC\n" + " .word gUnknown_Debug_083F7FD3\n" + "\n" + ); +} +#endif + +#endif + // whenever the player is not within view of the berry tree during its sparkle state, the // sparkle state will be reset. void ResetBerryTreeSparkleFlags(void) @@ -1445,3 +1952,17 @@ void ResetBerryTreeSparkleFlags(void) } } } + +#if DEBUG +static const u8 gUnknown_Debug_083F7F84[] = _("そとから きた きのみ"); +static const u8 gUnknown_Debug_083F7F90[] = _("ただいま かいはつちゅう"); +static const u8 gUnknown_Debug_083F7F9D[] = _("POS:"); +static const u8 gUnknown_Debug_083F7FA2[] = _("\nTYPE:"); +static const u8 gUnknown_Debug_083F7FA9[] = _("\nGROW:"); +static const u8 gUnknown_Debug_083F7FB0[] = _("\nTIME:"); +static const u8 gUnknown_Debug_083F7FB7[] = _("\nFCNT:"); +static const u8 gUnknown_Debug_083F7FBE[] = _("\nSCNT:"); +static const u8 gUnknown_Debug_083F7FC5[] = _("\nHOOK:"); +static const u8 gUnknown_Debug_083F7FCC[] = _("\nWBIT:"); +static const u8 gUnknown_Debug_083F7FD3[] = _(""); +#endif diff --git a/src/field/berry_tag_screen.c b/src/field/berry_tag_screen.c index 960a163c1..ed0ab86ae 100644 --- a/src/field/berry_tag_screen.c +++ b/src/field/berry_tag_screen.c @@ -42,7 +42,7 @@ extern u8 gBerryCheck_Pal[]; extern u8 gUnknown_08E788E4[]; extern u8 gUnknown_08E78A84[]; -static const u8 *const gUnknown_0841192C[] = +const u8 *const gUnknown_0841192C[] = { ContestStatsText_VerySoft, ContestStatsText_Soft, @@ -93,7 +93,7 @@ static bool8 sub_8146058(void) switch (gMain.state) { case 0: - sub_80F9438(); + ClearVideoCallbacks(); sub_80F9368(); sub_8146288(); REG_BLDCNT = 0; @@ -109,11 +109,11 @@ static bool8 sub_8146058(void) gMain.state += 1; break; case 3: - SetUpWindowConfig(&gWindowConfig_81E6E18); + Text_LoadWindowTemplate(&gWindowTemplate_81E6E18); gMain.state += 1; break; case 4: - MultistepInitMenuWindowBegin(&gWindowConfig_81E6E18); + MultistepInitMenuWindowBegin(&gWindowTemplate_81E6E18); gMain.state += 1; break; case 5: @@ -189,7 +189,6 @@ static void sub_8146288(void) bool8 sub_81462B8(void) { u16 i; - void *addr; switch (gSharedMem.var_1FFFF) { @@ -213,8 +212,7 @@ bool8 sub_81462B8(void) else gBGTilemapBuffers[2][i] = 0x5042; } - addr = (void *)(VRAM + 0x3800); - DmaCopy16(3, gBGTilemapBuffers[2], addr, 0x800); + DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(VRAM + 0x3800), 0x800); gSharedMem.var_1FFFF += 1; break; case 4: @@ -280,18 +278,18 @@ static void sub_81464E4(void) berryInfo = GetBerryInfo(gSpecialVar_ItemId + OFFSET_7B + 1); ConvertIntToDecimalStringN(gStringVar1, gSpecialVar_ItemId - FIRST_BERRY + 1, STR_CONV_MODE_LEADING_ZEROS, 2); - MenuPrint(gStringVar1, 12, 4); + Menu_PrintText(gStringVar1, 12, 4); #if ENGLISH - MenuPrint(berryInfo->name, 14, 4); + Menu_PrintText(berryInfo->name, 14, 4); #elif GERMAN StringCopy(buffer, berryInfo->name); StringAppend(buffer, gOtherText_Berry2); - MenuPrint(buffer, 14, 4); + Menu_PrintText(buffer, 14, 4); #endif - MenuPrint(berryInfo->description1, 4, 14); - MenuPrint(berryInfo->description2, 4, 16); + Menu_PrintText(berryInfo->description1, 4, 14); + Menu_PrintText(berryInfo->description2, 4, 16); #ifdef UNITS_IMPERIAL size = (berryInfo->size * 1000) / 254; @@ -301,7 +299,7 @@ static void sub_81464E4(void) sizeMajor = size / 100; #endif - MenuPrint(gOtherText_Size, 11, 7); + Menu_PrintText(gOtherText_Size, 11, 7); if (berryInfo->size != 0) { #ifdef UNITS_IMPERIAL @@ -311,18 +309,18 @@ static void sub_81464E4(void) ConvertIntToDecimalStringN(gStringVar1, berryInfo->size / 10, STR_CONV_MODE_LEFT_ALIGN, 2); ConvertIntToDecimalStringN(gStringVar2, berryInfo->size % 10, STR_CONV_MODE_LEFT_ALIGN, 2); #endif - MenuPrint(gContestStatsText_Unknown1, 16, 7); + Menu_PrintText(gContestStatsText_Unknown1, 16, 7); } else { - MenuPrint(gOtherText_ThreeQuestions2, 16, 7); + Menu_PrintText(gOtherText_ThreeQuestions2, 16, 7); } - MenuPrint(gOtherText_Firm, 11, 9); + Menu_PrintText(gOtherText_Firm, 11, 9); if (berryInfo->firmness != 0) - MenuPrint(gUnknown_0841192C[berryInfo->firmness - 1], 16, 9); + Menu_PrintText(gUnknown_0841192C[berryInfo->firmness - 1], 16, 9); else - MenuPrint(gOtherText_ThreeQuestions2, 16, 9); + Menu_PrintText(gOtherText_ThreeQuestions2, 16, 9); } static void sub_8146600(u8 berry) @@ -445,7 +443,7 @@ static void sub_8146810(s8 berry) static void sub_81468BC(void) { - MenuZeroFillWindowRect(0, 4, 29, 19); + Menu_EraseWindowRect(0, 4, 29, 19); sub_81464E4(); // center of berry sprite diff --git a/src/field/bike.c b/src/field/bike.c index 8db01b4b4..98966ebd4 100644 --- a/src/field/bike.c +++ b/src/field/bike.c @@ -14,6 +14,11 @@ extern bool8 gBikeCyclingChallenge; extern u8 gBikeCollisions; extern u8 gUnusedBikeCameraAheadPanback; +#if DEBUG +extern u8 gUnknown_020297ED; +u8 debug_sub_805F2B0(u8); +#endif + static void MovePlayerOnMachBike(u8, u16, u16); static u8 GetMachBikeTransition(u8 *); static void MachBikeTransition_FaceDirection(u8); @@ -134,6 +139,13 @@ void MovePlayerOnBike(u8 direction, u16 newKeys, u16 heldKeys) static void MovePlayerOnMachBike(u8 direction, u16 newKeys, u16 heldKeys) { +#if DEBUG + if (gUnknown_020297ED && debug_sub_805F2B0(direction)) + { + Bike_SetBikeStill(); + return; + } +#endif sMachBikeTransitions[GetMachBikeTransition(&direction)](direction); } @@ -271,6 +283,14 @@ static void MachBikeTransition_TrySlowDown(u8 var) // the acro bike requires the input handler to be executed before the transition can. static void MovePlayerOnAcroBike(u8 newDirection, u16 newKeys, u16 heldKeys) { +#if DEBUG + if (gUnknown_020297ED && debug_sub_805F2B0(newDirection)) + { + Bike_SetBikeStill(); + return; + } +#endif + sAcroBikeTransitions[CheckMovementInputAcroBike(&newDirection, newKeys, heldKeys)](newDirection); } diff --git a/src/field/braille_puzzles.c b/src/field/braille_puzzles.c index 0d304714d..f11fb5fb3 100644 --- a/src/field/braille_puzzles.c +++ b/src/field/braille_puzzles.c @@ -161,7 +161,7 @@ void Task_BrailleWait(u8 taskId) case 1: if (BrailleWait_CheckButtonPress() != FALSE) { - MenuZeroFillScreen(); + Menu_EraseScreen(); PlaySE(SE_SELECT); data[0] = 2; } @@ -170,7 +170,7 @@ void Task_BrailleWait(u8 taskId) data[1] = data[1] - 1; if (data[1] == 0) { - MenuZeroFillScreen(); + Menu_EraseScreen(); data[0] = 3; data[1] = 30; } diff --git a/src/field/choose_party.c b/src/field/choose_party.c index d278eda4a..7529c4271 100644 --- a/src/field/choose_party.c +++ b/src/field/choose_party.c @@ -1,5 +1,5 @@ #include "global.h" -#include "decoration.h" +#include "event_data.h" #include "field_fadetransition.h" #include "main.h" #include "menu.h" @@ -7,6 +7,7 @@ #include "palette.h" #include "party_menu.h" #include "pokemon_menu.h" +#include "field_weather.h" #include "pokemon.h" #include "pokemon_summary_screen.h" #include "overworld.h" @@ -318,19 +319,19 @@ static void sub_812238C(u8 taskId) { if (gMain.newAndRepeatedKeys & 0x40) { - if (GetMenuCursorPos() != 0) + if (Menu_GetCursorPos() != 0) { PlaySE(SE_SELECT); - MoveMenuCursor(-1); + Menu_MoveCursor(-1); } return; } if (gMain.newAndRepeatedKeys & 0x80) { - if (GetMenuCursorPos() != 3) + if (Menu_GetCursorPos() != 3) { PlaySE(SE_SELECT); - MoveMenuCursor(1); + Menu_MoveCursor(1); } return; } @@ -343,7 +344,7 @@ static void sub_812238C(u8 taskId) gTasks[taskId].data[4], sBattleTowerEntryMenu, sBattleTowerEntryMenuItems, - GetMenuCursorPos()); + Menu_GetCursorPos()); popupMenuFunc(taskId); return; } @@ -461,8 +462,8 @@ static void BattleTowerEntryMenuCallback_Enter(u8 taskId) } } PlaySE(SE_HAZURE); - MenuZeroFillWindowRect(20, 10, 29, 19); - HandleDestroyMenuCursors(); + Menu_EraseWindowRect(20, 10, 29, 19); + Menu_DestroyCursor(); sub_806D5A4(); sub_806E834(gOtherText_NoMoreThreePoke, 1); gTasks[taskId].func = sub_8122728; @@ -475,8 +476,8 @@ static void sub_8122728(u8 taskId) if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) { - MenuZeroFillWindowRect(0, 14, 29, 19); - HandleDestroyMenuCursors(); + Menu_EraseWindowRect(0, 14, 29, 19); + Menu_DestroyCursor(); BattleTowerEntryMenuCallback_Exit(taskId); } } @@ -515,8 +516,8 @@ static void BattleTowerEntryMenuCallback_NoEntry(u8 taskId) static void sub_81227FC(u8 taskId) { - MenuZeroFillWindowRect(20, 10, 29, 19); - HandleDestroyMenuCursors(); + Menu_EraseWindowRect(20, 10, 29, 19); + Menu_DestroyCursor(); PrintPartyMenuPromptText(0, 0); gTasks[taskId].func = HandleBattleTowerPartyMenu; } @@ -527,6 +528,107 @@ static void BattleTowerEntryMenuCallback_Exit(u8 taskId) sub_81227FC(taskId); } +#if DEBUG +__attribute__((naked)) +void debug_sub_81381B4() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r9\n" + " mov r6, r8\n" + " push {r6, r7}\n" + " ldr r4, ._189 @ gUnknown_02023A00\n" + " add r0, r4, #0\n" + " mov r1, #0x0\n" + " mov r2, #0x60\n" + " bl memset\n" + " mov r7, #0x0\n" + " mov r8, r4\n" + " mov r0, #0x4\n" + " add r0, r0, r8\n" + " mov r9, r0\n" + "._188:\n" + " mov r0, #0x64\n" + " add r1, r7, #0\n" + " mul r1, r1, r0\n" + " ldr r0, ._189 + 4 @ gPlayerParty\n" + " add r5, r1, r0\n" + " add r0, r5, #0\n" + " mov r1, #0x41\n" + " bl GetMonData\n" + " lsl r4, r7, #0x5\n" + " mov r1, r8\n" + " add r6, r4, r1\n" + " strh r0, [r6]\n" + " lsl r0, r0, #0x10\n" + " cmp r0, #0\n" + " beq ._187 @cond_branch\n" + " add r0, r5, #0\n" + " mov r1, #0x38\n" + " bl GetMonData\n" + " strb r0, [r6, #0xf]\n" + " add r0, r5, #0\n" + " mov r1, #0x39\n" + " bl GetMonData\n" + " strh r0, [r6, #0x10]\n" + " add r0, r5, #0\n" + " mov r1, #0x3a\n" + " bl GetMonData\n" + " strh r0, [r6, #0x12]\n" + " add r0, r5, #0\n" + " mov r1, #0x37\n" + " bl GetMonData\n" + " mov r1, r8\n" + " add r1, r1, #0x14\n" + " add r1, r4, r1\n" + " str r0, [r1]\n" + " add r0, r5, #0\n" + " mov r1, #0xc\n" + " bl GetMonData\n" + " strh r0, [r6, #0x2]\n" + " add r0, r5, #0\n" + " mov r1, #0x0\n" + " bl GetMonData\n" + " mov r1, r8\n" + " add r1, r1, #0x18\n" + " add r1, r4, r1\n" + " str r0, [r1]\n" + " add r0, r5, #0\n" + " bl GetMonGender\n" + " strb r0, [r6, #0x1c]\n" + " add r4, r4, r9\n" + " add r0, r5, #0\n" + " mov r1, #0x2\n" + " add r2, r4, #0\n" + " bl GetMonData\n" + " add r0, r4, #0\n" + " bl Text_StripExtCtrlCodes\n" + " add r0, r5, #0\n" + " mov r1, #0x3\n" + " bl GetMonData\n" + " strb r0, [r6, #0x1d]\n" + "._187:\n" + " add r0, r7, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + " cmp r7, #0x2\n" + " bls ._188 @cond_branch\n" + " pop {r3, r4}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._190:\n" + " .align 2, 0\n" + "._189:\n" + " .word gUnknown_02023A00\n" + " .word gPlayerParty+0x12c\n" + "\n" + ); +} +#endif + bool8 SetupLinkMultiBattlePartyMenu(void) { switch (ewram1B000_alt.setupState) @@ -806,19 +908,19 @@ static void Task_DaycareStorageMenu8122EAC(u8 taskId) { if (gMain.newAndRepeatedKeys & 0x40) { - if (GetMenuCursorPos() != 0) + if (Menu_GetCursorPos() != 0) { PlaySE(SE_SELECT); - MoveMenuCursor(-1); + Menu_MoveCursor(-1); } return; } if (gMain.newAndRepeatedKeys & 0x80) { - if (GetMenuCursorPos() != 3) + if (Menu_GetCursorPos() != 3) { PlaySE(SE_SELECT); - MoveMenuCursor(1); + Menu_MoveCursor(1); } return; } @@ -831,7 +933,7 @@ static void Task_DaycareStorageMenu8122EAC(u8 taskId) gTasks[taskId].data[4], sDaycareStorageMenus, sDaycareStorageMenuItems, - GetMenuCursorPos()); + Menu_GetCursorPos()); popupMenuFunc(taskId); return; } @@ -896,8 +998,8 @@ static void DaycareStorageMenuCallback_Summary(u8 taskId) static void DaycareStorageMenuCallback_Exit(u8 taskId) { PlaySE(SE_SELECT); - MenuZeroFillWindowRect(20, 10, 29, 19); - HandleDestroyMenuCursors(); + Menu_EraseWindowRect(20, 10, 29, 19); + Menu_DestroyCursor(); PrintPartyMenuPromptText(15, 0); gTasks[taskId].func = HandleDaycarePartyMenu; } @@ -930,7 +1032,7 @@ void sub_81231AC(void) static void sub_81231C4(u8 taskId) { - if (sub_807D770() == TRUE) + if (IsWeatherNotFadingIn() == TRUE) { DestroyTask(taskId); ScriptContext2_Disable(); diff --git a/src/field/coins.c b/src/field/coins.c index 91a4b508d..2c217e635 100644 --- a/src/field/coins.c +++ b/src/field/coins.c @@ -13,13 +13,13 @@ void UpdateCoinsWindow(s32 coins, u8 x, u8 y) void ShowCoinsWindow(u32 coins, u8 x, u8 y) { - MenuDrawTextWindow(x, y, x + 9, y + 3); + Menu_DrawStdWindowFrame(x, y, x + 9, y + 3); UpdateCoinsWindow(coins, x, y); } void HideCoinsWindow(u8 x, u8 y) { - MenuZeroFillWindowRect(x, y, x + 9, y + 3); + Menu_EraseWindowRect(x, y, x + 9, y + 3); } void PrintCoins(s32 coins, u8 b, u8 x, u8 y) @@ -46,7 +46,7 @@ void PrintCoins(s32 coins, u8 b, u8 x, u8 y) ptr[2] = (b - StringLength(string)) * 6; ptr += 3; StringCopy(ptr, string); - MenuPrint(gOtherText_Coins2, x, y); + Menu_PrintText(gOtherText_Coins2, x, y); } u16 GetCoins(void) diff --git a/src/field/coord_event_weather.c b/src/field/coord_event_weather.c index db4e9c161..60b87fa30 100644 --- a/src/field/coord_event_weather.c +++ b/src/field/coord_event_weather.c @@ -34,7 +34,7 @@ static const struct CoordEventWeather sCoordEventWeatherFuncs[] = { COORD_EVENT_WEATHER_FOG_2, CoordEventWeather_DiagonalFog }, { COORD_EVENT_WEATHER_ASH, CoordEventWeather_Ash }, { COORD_EVENT_WEATHER_SANDSTORM, CoordEventWeather_Sandstorm }, - { COORD_EVENT_WEATHER_DARK, CoordEventWeather_Dark }, + { COORD_EVENT_WEATHER_SHADE, CoordEventWeather_Dark }, { COORD_EVENT_WEATHER_DROUGHT, CoordEventWeather_Drought }, { COORD_EVENT_WEATHER_ROUTE119_CYCLE, CoordEventWeather_Route119Cycle }, { COORD_EVENT_WEATHER_ROUTE123_CYCLE, CoordEventWeather_Route123Cycle }, @@ -87,7 +87,7 @@ static void CoordEventWeather_Sandstorm(void) static void CoordEventWeather_Dark(void) { - SetWeather(WEATHER_DARK); + SetWeather(WEATHER_SHADE); } static void CoordEventWeather_Drought(void) diff --git a/src/field/daycare.c b/src/field/daycare.c index c28bc65ca..2f0c7281e 100644 --- a/src/field/daycare.c +++ b/src/field/daycare.c @@ -205,7 +205,7 @@ static u16 TakeSelectedPokemonFromDaycare(struct DayCare * daycare, u8 slot) GetBoxMonNick(&daycare->mons[slot], gStringVar1); species = GetBoxMonData(&daycare->mons[slot], MON_DATA_SPECIES); - sub_803B4B4(&daycare->mons[slot], &pokemon); + ExpandBoxMon(&daycare->mons[slot], &pokemon); if (GetMonData(&pokemon, MON_DATA_LEVEL) != MAX_LEVEL) { @@ -341,7 +341,7 @@ u16 GetEggSpecies(u16 species) { for (k = 0; k < 5; k++) { - if (gEvolutionTable[j].evolutions[k].targetSpecies == species) + if (gEvolutionTable[j][k].targetSpecies == species) { species = j; found = TRUE; @@ -557,7 +557,7 @@ void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, struct BoxP { for (j = 0; j < NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES; j++) { - if (gHatchedEggFatherMoves[i] == ItemIdToBattleMoveId(ITEM_TM01 + j) && CanMonLearnTMHM(egg, j)) + if (gHatchedEggFatherMoves[i] == ItemIdToBattleMoveId(ITEM_TM01_FOCUS_PUNCH + j) && CanMonLearnTMHM(egg, j)) { if (GiveMoveToMon(egg, gHatchedEggFatherMoves[i]) == 0xffff) DeleteFirstMoveAndGiveMoveToMon(egg, gHatchedEggFatherMoves[i]); @@ -1741,7 +1741,7 @@ static void HandleDaycareLevelMenuInput(u8 taskId) if (gTasks[taskId].data[0] != 0) { gTasks[taskId].data[0] --; - MoveMenuCursor(-1); + Menu_MoveCursor(-1); PlaySE(SE_SELECT); } } @@ -1750,25 +1750,25 @@ static void HandleDaycareLevelMenuInput(u8 taskId) if (gTasks[taskId].data[0] != 2) { gTasks[taskId].data[0]++; - MoveMenuCursor(+1); + Menu_MoveCursor(+1); PlaySE(SE_SELECT); } } else if (gMain.newKeys & A_BUTTON) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); PlaySE(SE_SELECT); gLastFieldPokeMenuOpened = gSpecialVar_Result = gTasks[taskId].data[0]; DestroyTask(taskId); - MenuZeroFillWindowRect(15, 6, 29, 13); + Menu_EraseWindowRect(15, 6, 29, 13); EnableBothScriptContexts(); } else if (gMain.newKeys & B_BUTTON) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); gLastFieldPokeMenuOpened = gSpecialVar_Result = 2; DestroyTask(taskId); - MenuZeroFillWindowRect(15, 6, 29, 13); + Menu_EraseWindowRect(15, 6, 29, 13); EnableBothScriptContexts(); } } @@ -1776,11 +1776,11 @@ static void HandleDaycareLevelMenuInput(u8 taskId) void ShowDaycareLevelMenu(void) { u8 buffer[100]; - MenuDrawTextWindow(15, 6, 29, 13); + Menu_DrawStdWindowFrame(15, 6, 29, 13); GetDaycareLevelMenuText(&gSaveBlock1.daycare, buffer); - MenuPrint(buffer, 16, 7); + Menu_PrintText(buffer, 16, 7); GetDaycareLevelMenuLevelText(&gSaveBlock1.daycare, buffer); - MenuPrint_PixelCoords(buffer, 0xce, 0x38, TRUE); + Menu_PrintTextPixelCoords(buffer, 0xce, 0x38, TRUE); InitMenu(0, 16, 7, 3, 0, 13); CreateTask(HandleDaycareLevelMenuInput, 3); } diff --git a/src/field/decoration.c b/src/field/decoration.c index 87a9d8028..0e7fa5f41 100644 --- a/src/field/decoration.c +++ b/src/field/decoration.c @@ -19,6 +19,7 @@ #include "event_data.h" #include "field_weather.h" #include "decoration.h" +#include "shop.h" #include "ewram.h" EWRAM_DATA u8 *gUnknown_020388D0 = NULL; @@ -1433,8 +1434,8 @@ extern u8 gUnknown_0815F399[]; void sub_80FE1DC(void) { sub_80FE2B4(); - MenuDrawTextWindow(0, 0, 10, 9); - PrintMenuItems(1, 1, 4, (const struct MenuAction *)gUnknown_083EC604); + Menu_DrawStdWindowFrame(0, 0, 10, 9); + Menu_PrintItems(1, 1, 4, (const struct MenuAction *)gUnknown_083EC604); InitMenu(0, 1, 1, 4, gUnknown_020388D4, 9); } @@ -1487,13 +1488,13 @@ void Task_DecorationPCProcessMenuInput(u8 taskId) if (gMain.newKeys & DPAD_UP) { PlaySE(SE_SELECT); - gUnknown_020388D4 = MoveMenuCursor(-1); + gUnknown_020388D4 = Menu_MoveCursor(-1); sub_80FE394(); } if (gMain.newKeys & DPAD_DOWN) { PlaySE(SE_SELECT); - gUnknown_020388D4 = MoveMenuCursor(1); + gUnknown_020388D4 = Menu_MoveCursor(1); sub_80FE394(); } if (gMain.newKeys & A_BUTTON) @@ -1510,15 +1511,15 @@ void Task_DecorationPCProcessMenuInput(u8 taskId) void sub_80FE394(void) { - MenuFillWindowRectWithBlankTile(2, 15, 27, 18); - MenuPrint(gUnknown_083EC624[gUnknown_020388D4], 2, 15); + Menu_BlankWindowRect(2, 15, 27, 18); + Menu_PrintText(gUnknown_083EC624[gUnknown_020388D4], 2, 15); } void gpu_pal_decompress_alloc_tag_and_upload(u8 taskId) { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 10, 9); - MenuFillWindowRectWithBlankTile(2, 15, 27, 18); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 10, 9); + Menu_BlankWindowRect(2, 15, 27, 18); FreeSpritePaletteByTag(6); if (ewram_1f000.isPlayerRoom == 0) { @@ -1546,7 +1547,7 @@ void sub_80FE470(u8 decoCat, u8 left, u8 top, u8 palIdx) // PrintDecorationCateg { u8 *strptr; u8 v0; - v0 = sub_8072CBC(); + v0 = Menu_GetTextWindowPaletteNum(); // PALETTE {palIdx} strptr = gStringVar4; strptr[0] = EXT_CTRL_CODE_BEGIN; @@ -1561,13 +1562,13 @@ void sub_80FE470(u8 decoCat, u8 left, u8 top, u8 palIdx) // PrintDecorationCateg strptr[1] = 5; strptr[2] = v0; strptr[3] = EOS; - MenuPrint(gStringVar4, left, top); + Menu_PrintText(gStringVar4, left, top); } void sub_80FE528(u8 taskId) // PrintDecorationCategorySelectionMenuStrings { u8 decoCat; - MenuDrawTextWindow(0, 0, 14, 19); + Menu_DrawStdWindowFrame(0, 0, 14, 19); for (decoCat=0; decoCat<8; decoCat++) { if (ewram_1f000.isPlayerRoom == 1 && gTasks[taskId].data[11] == 0 && decoCat != DECORCAT_DOLL && decoCat != DECORCAT_CUSHION) @@ -1578,13 +1579,13 @@ void sub_80FE528(u8 taskId) // PrintDecorationCategorySelectionMenuStrings sub_80FE470(decoCat, 1, 2 * decoCat + 1, 255); // Unselectable } } - MenuPrint(gUnknownText_Exit, 1, 17); + Menu_PrintText(gUnknownText_Exit, 1, 17); } void sub_80FE5AC(u8 taskId) { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 29, 19); sub_80FE528(taskId); InitMenu(0, 1, 1, 9, gUnknown_020388F6, 13); gTasks[taskId].func = sub_80FE604; @@ -1597,15 +1598,15 @@ void sub_80FE604(u8 taskId) if (gMain.newAndRepeatedKeys & DPAD_UP) { PlaySE(SE_SELECT); - MoveMenuCursor(-1); + Menu_MoveCursor(-1); } else if (gMain.newAndRepeatedKeys & DPAD_DOWN) { PlaySE(SE_SELECT); - MoveMenuCursor(1); + Menu_MoveCursor(1); } else if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); - gUnknown_020388F6 = GetMenuCursorPos(); + gUnknown_020388F6 = Menu_GetCursorPos(); if (gUnknown_020388F6 != 8) { gUnknown_020388D5 = sub_8134194(gUnknown_020388F6); @@ -1614,14 +1615,14 @@ void sub_80FE604(u8 taskId) sub_8134104(gUnknown_020388F6); gUnknown_020388D0 = gDecorationInventories[gUnknown_020388F6].items; sub_80FEF50(taskId); - sub_80F944C(); + ClearVerticalScrollIndicatorPalettes(); sub_80F9480(gUnknown_020388F7, 8); LoadScrollIndicatorPalette(); gTasks[taskId].func = sub_80FE868; } else { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 14, 19); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 14, 19); DisplayItemMessageOnField(taskId, gSecretBaseText_NoDecors, sub_80FE418, 0); } } else @@ -1649,17 +1650,17 @@ void sub_80FE728(u8 taskId) void sub_80FE758(u8 taskId) { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 14, 19); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 14, 19); if (gTasks[taskId].data[11] != 2) { sub_80FE1DC(); - MenuDisplayMessageBox(); + Menu_DisplayDialogueFrame(); sub_80FE394(); gTasks[taskId].func = Task_DecorationPCProcessMenuInput; } else { - sub_80B3068(taskId); + Shop_RunExitSellMenuTask(taskId); } } @@ -1677,18 +1678,18 @@ void sub_80FE7D4(u8 *dest, u8 decClass) void sub_80FE7EC(u8 taskId) { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 29, 19); sub_80FEC94(taskId); sub_80FECB8(gUnknown_020388F6); #if ENGLISH - MenuDrawTextWindow(15, 12, 29, 19); + Menu_DrawStdWindowFrame(15, 12, 29, 19); #elif GERMAN if ((gUnknown_020388F2 + gUnknown_020388F4) != gUnknown_020388D5) { - MenuDrawTextWindow(15, 12, 29, 19); + Menu_DrawStdWindowFrame(15, 12, 29, 19); } #endif @@ -1710,7 +1711,7 @@ void sub_80FE894(u8 taskId /*r8*/, s8 cursorVector /*r5*/, s8 bgVector /*r7*/) PlaySE(SE_SELECT); if (cursorVector != 0) { - gUnknown_020388F2 = MoveMenuCursor(cursorVector); + gUnknown_020388F2 = Menu_MoveCursor(cursorVector); } if (bgVector != 0) { @@ -1722,12 +1723,12 @@ void sub_80FE894(u8 taskId /*r8*/, s8 cursorVector /*r5*/, s8 bgVector /*r7*/) { if (v0) { - MenuDrawTextWindow(15, 12, 29, 19); + Menu_DrawStdWindowFrame(15, 12, 29, 19); } sub_80FECE0(gUnknown_020388F2 + gUnknown_020388F4); } else { - MenuZeroFillWindowRect(15, 12, 29, 19); + Menu_EraseWindowRect(15, 12, 29, 19); } } @@ -1757,7 +1758,7 @@ void sub_80FE948(u8 taskId) } if (gMain.newKeys & A_BUTTON) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); PlaySE(SE_SELECT); gUnknown_020388F5 = gUnknown_020388F2 + gUnknown_020388F4; if (gUnknown_020388F5 == gUnknown_020388D5) @@ -1769,7 +1770,7 @@ void sub_80FE948(u8 taskId) } } else if (gMain.newKeys & B_BUTTON) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); PlaySE(SE_SELECT); gUnknown_083EC634[gTasks[taskId].data[11]].noFunc(taskId); } @@ -1783,17 +1784,17 @@ void sub_80FEABC(u8 taskId, u8 dummy1) u16 i; u16 j; u8 ni; - if (gUnknown_020388F4 != 0 || (DestroyVerticalScrollIndicator(0), gUnknown_020388F4 != 0)) + if (gUnknown_020388F4 != 0 || (DestroyVerticalScrollIndicator(TOP_ARROW), gUnknown_020388F4 != 0)) { - CreateVerticalScrollIndicators(0, 0x3c, 0x08); + CreateVerticalScrollIndicators(TOP_ARROW, 0x3c, 0x08); } if (gUnknown_020388F4 + 7 == gUnknown_020388D5) { - DestroyVerticalScrollIndicator(1); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); } if (gUnknown_020388F4 + 7 < gUnknown_020388D5) { - CreateVerticalScrollIndicators(1, 0x3c, 0x98); + CreateVerticalScrollIndicators(BOTTOM_ARROW, 0x3c, 0x98); } for (i=gUnknown_020388F4; i<gUnknown_020388F4+8; i++) { @@ -1839,13 +1840,13 @@ void sub_80FEABC(u8 taskId, u8 dummy1) void sub_80FEC94(u8 taskId) { - MenuDrawTextWindow(0, 0, 14, 19); + Menu_DrawStdWindowFrame(0, 0, 14, 19); sub_80FEABC(taskId, 0); } void sub_80FECB8(u8 decoCat) { - MenuDrawTextWindow(15, 0, 29, 3); + Menu_DrawStdWindowFrame(15, 0, 29, 3); sub_80FE470(decoCat, 16, 1, 0xff); } @@ -1902,8 +1903,8 @@ _080FED26:\n\ void sub_80FED1C(void) { - MenuZeroFillWindowRect(15, 0, 29, 3); - MenuZeroFillWindowRect(15, 12, 29, 19); + Menu_EraseWindowRect(15, 0, 29, 3); + Menu_EraseWindowRect(15, 12, 29, 19); } void sub_80FED3C(u8 taskId) @@ -2003,10 +2004,10 @@ void sub_80FEF50(u8 taskId) void sub_80FEF74(void) { sub_80F9520(gUnknown_020388F7, 8); - DestroyVerticalScrollIndicator(0); - DestroyVerticalScrollIndicator(1); - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 14, 19); + DestroyVerticalScrollIndicator(TOP_ARROW); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 14, 19); } bool8 sub_80FEFA4(void) @@ -2035,16 +2036,16 @@ void sub_80FEFF4(u8 taskId) void sub_80FF034(u8 taskId) { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 14, 19); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 14, 19); sub_80FE5AC(taskId); } void sub_80FF058(u8 taskId) { sub_80F9520(gUnknown_020388F7, 8); - DestroyVerticalScrollIndicator(0); - DestroyVerticalScrollIndicator(1); + DestroyVerticalScrollIndicator(TOP_ARROW); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); BuyMenuFreeMemory(); gTasks[taskId].func = sub_80FF034; } @@ -2238,7 +2239,7 @@ void sub_80FF5BC(u8 taskId) { if (sub_80FF58C() == TRUE) { - fade_screen(1, 0); + FadeScreen(1, 0); gTasks[taskId].data[2] = 0; gTasks[taskId].func = sub_80FF6AC; } else @@ -2271,8 +2272,8 @@ void sub_80FF6AC(u8 taskId) if (!gPaletteFade.active) { sub_80FF0E0(taskId); - DestroyVerticalScrollIndicator(0); - DestroyVerticalScrollIndicator(1); + DestroyVerticalScrollIndicator(TOP_ARROW); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); sub_80F9520(gUnknown_020388F7, 8); BuyMenuFreeMemory(); gTasks[taskId].data[2] = 1; @@ -2288,7 +2289,7 @@ void sub_80FF6AC(u8 taskId) gTasks[taskId].data[2] = 2; break; case 2: - if (sub_807D770() == 1) + if (IsWeatherNotFadingIn() == TRUE) { gTasks[taskId].data[12] = 0; sub_810065C(taskId); @@ -3128,7 +3129,7 @@ void sub_81000A0(u8 taskId) void sub_81000C4(u8 taskId) { - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_EraseWindowRect(0, 0, 29, 19); sub_8100174(taskId); if (gDecorations[gUnknown_020388D0[gUnknown_020388F5]].permission != DECORPERM_SOLID_MAT) { @@ -3186,13 +3187,13 @@ void sub_8100248(u8 taskId) void sub_810026C(u8 taskId) { - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_EraseWindowRect(0, 0, 29, 19); sub_810028C(taskId); } void sub_810028C(u8 taskId) { - fade_screen(1, 0); + FadeScreen(1, 0); gTasks[taskId].data[2] = 0; gTasks[taskId].func = c1_overworld_prev_quest; } @@ -3221,7 +3222,7 @@ void c1_overworld_prev_quest(u8 taskId) void sub_8100334(u8 taskId) { - if (sub_807D770() == 1) + if (IsWeatherNotFadingIn() == TRUE) { gTasks[taskId].func = sub_80FE948; } @@ -3341,7 +3342,7 @@ void sub_8100494(u8 taskId) void sub_810065C(u8 taskId) { - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_EraseWindowRect(0, 0, 29, 19); gSprites[gUnknown_020391A8].data[7] = 0; gTasks[taskId].data[10] = 0; gTasks[taskId].func = sub_8100494; @@ -3628,7 +3629,7 @@ void sub_8100A0C(u8 taskId) { if (sub_8100D38(taskId) == 1) { - fade_screen(1, 0); + FadeScreen(1, 0); gTasks[taskId].data[2] = 0; gTasks[taskId].func = sub_8100E70; } else @@ -3723,7 +3724,7 @@ void sub_8100C88(u8 taskId) { DrawWholeMapView(); ScriptContext1_SetupScript(gUnknown_081A2F8A); - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_EraseWindowRect(0, 0, 29, 19); gTasks[taskId].data[2] = 2; } break; @@ -3734,7 +3735,7 @@ void sub_8100C88(u8 taskId) gTasks[taskId].data[2] = 3; break; case 3: - if (sub_807D770() == 1) + if (IsWeatherNotFadingIn() == TRUE) { gTasks[taskId].data[13] = -1; DisplayItemMessageOnField(taskId, gSecretBaseText_DecorReturned, sub_81010F0, 0); @@ -3760,7 +3761,7 @@ bool8 sub_8100D38(u8 taskId) void SetUpPuttingAwayDecorationPlayerAvatar(void) { player_get_direction_lower_nybble(); - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_EraseWindowRect(0, 0, 29, 19); gUnknown_020391A8 = gSprites[gUnknown_03004880.unk4].data[0]; sub_81016C8(); gUnknown_03004880.unk4 = CreateSprite(&gSpriteTemplate_83ECA88, 0x78, 0x50, 0); @@ -3790,7 +3791,7 @@ void sub_8100E70(u8 taskId) data[2] = 1; data[6] = 1; data[5] = 1; - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); } break; case 1: @@ -3799,7 +3800,7 @@ void sub_8100E70(u8 taskId) data[2] = 2; break; case 2: - if (sub_807D770() == TRUE) + if (IsWeatherNotFadingIn() == TRUE) { data[12] = 1; sub_8100EEC(taskId); @@ -3810,7 +3811,7 @@ void sub_8100E70(u8 taskId) void sub_8100EEC(u8 taskId) { - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_EraseWindowRect(0, 0, 29, 19); gSprites[gUnknown_020391A8].data[7] = 0; gSprites[gUnknown_020391A8].invisible = 0; gSprites[gUnknown_020391A8].callback = sub_8101698; @@ -4137,7 +4138,7 @@ void sub_8101518(u8 taskId) void sub_810153C(u8 taskId) { - fade_screen(1, 0); + FadeScreen(1, 0); gTasks[taskId].data[2] = 0; gTasks[taskId].func = sub_8100C88; } @@ -4150,13 +4151,13 @@ void sub_810156C(u8 taskId) void sub_8101590(u8 taskId) { - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_EraseWindowRect(0, 0, 29, 19); sub_81015B0(taskId); } void sub_81015B0(u8 taskId) { - fade_screen(1, 0); + FadeScreen(1, 0); gTasks[taskId].data[2] = 0; gTasks[taskId].func = sub_81015E0; } @@ -4183,7 +4184,7 @@ void sub_81015E0(u8 taskId) void sub_8101648(u8 taskId) { - if (sub_807D770() == TRUE) + if (IsWeatherNotFadingIn() == TRUE) { gTasks[taskId].func = Task_DecorationPCProcessMenuInput; } @@ -4192,7 +4193,7 @@ void sub_8101648(u8 taskId) void sub_8101678(void) { pal_fill_black(); - MenuDisplayMessageBox(); + Menu_DisplayDialogueFrame(); sub_80FE220(); CreateTask(sub_8101648, 8); } @@ -4274,7 +4275,7 @@ void sub_8101824(u8 taskId) void sub_8101848(u8 taskId) { - MenuZeroFillWindowRect(20, 8, 26, 14); + Menu_EraseWindowRect(20, 8, 26, 14); sub_8109A30(gUnknown_020388D0[gUnknown_020388F5]); gUnknown_020388D0[gUnknown_020388F5] = DECOR_NONE; sub_80FF098(taskId); diff --git a/src/field/decoration_inventory.c b/src/field/decoration_inventory.c index dd0e972aa..8f7f5eb92 100644 --- a/src/field/decoration_inventory.c +++ b/src/field/decoration_inventory.c @@ -164,3 +164,14 @@ u8 sub_81341D4(void) } return count; } + + +#if DEBUG +void debug_sub_814A3A8(void) +{ + u8 decor; + + for (decor = 0; decor < DECOR_COUNT; decor++) + IsThereStorageSpaceForDecoration(decor); +} +#endif diff --git a/src/field/diploma.c b/src/field/diploma.c index 27601404c..b31fc7dec 100644 --- a/src/field/diploma.c +++ b/src/field/diploma.c @@ -10,7 +10,7 @@ #include "strings2.h" #include "task.h" #include "text.h" -#include "unknown_task.h" +#include "scanline_effect.h" static void VBlankCB(void); static void MainCB2(void); @@ -62,14 +62,14 @@ void CB2_ShowDiploma(void) LZ77UnCompVram(gDiplomaTiles, (void *)VRAM); LZ77UnCompVram(gDiplomaTilemap, (void *)(VRAM + 0x3000)); - remove_some_task(); + ScanlineEffect_Stop(); ResetTasks(); ResetSpriteData(); ResetPaletteFade(); FreeAllSpritePalettes(); LoadPalette(gDiplomaPalettes, 0, 64); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow(&gWindowTemplate_81E6CE4); DisplayDiplomaText(); BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); @@ -125,7 +125,7 @@ static void Task_DiplomaFadeOut(u8 taskId) static void DisplayDiplomaText(void) { - if (sub_8090FF4()) + if (CompletedNationalPokedex()) { REG_BG3HOFS = 256; StringCopy(gStringVar1, gOtherText_NationalDex); @@ -135,5 +135,5 @@ static void DisplayDiplomaText(void) REG_BG3HOFS = 0; StringCopy(gStringVar1, gOtherText_HoennDex); } - MenuPrint(gOtherText_DiplomaCertificationGameFreak, 6, 2); + Menu_PrintText(gOtherText_DiplomaCertificationGameFreak, 6, 2); }
\ No newline at end of file diff --git a/src/field/easy_chat.c b/src/field/easy_chat.c deleted file mode 100644 index 94532506f..000000000 --- a/src/field/easy_chat.c +++ /dev/null @@ -1,445 +0,0 @@ -#include "global.h" -#include "easy_chat.h" -#include "constants/easy_chat.h" -#include "data2.h" -#include "event_data.h" -#include "field_message_box.h" -#include "pokedex.h" -#include "random.h" -#include "string_util.h" -#include "strings.h" -#include "strings2.h" -#include "text.h" - -static bool8 sub_80EB680(u16 *, u16, u16, u16); -static u16 sub_80EB9D8(void); -static u16 sub_80EB960(void); - -extern void *gEasyChatGroupWords[]; -extern const u8 gEasyChatGroupSizes[]; - -extern u16 gSpecialVar_0x8004; - -IWRAM_DATA u8 gUnknown_03000740; - -// returns the end of the destination buffer text -u8 *EasyChat_GetWordText(u8 *dst, u16 word) -{ - u16 group; - u16 wordIndex; - u8 *src; - u16 i; - - if (sub_80EB37C(word)) - return StringCopy(dst, gOtherText_ThreeQuestions); - - if (word == 0xFFFF) - { - *dst = EOS; - return dst; - } - else - { - group = EC_GROUP(word); - wordIndex = EC_INDEX(word); - switch (group) - { - case EC_GROUP_POKEMON: // 0 - case EC_GROUP_POKEMON_2: // 21 - dst = StringCopy(dst, gSpeciesNames[wordIndex]); - break; - case EC_GROUP_MOVE_1: // 18 - case EC_GROUP_MOVE_2: // 19 - dst = StringCopy(dst, gMoveNames[wordIndex]); - break; - default: - src = gEasyChatGroupWords[group]; - for (i = wordIndex - 1; i != 0xFFFF; i--) - { - while (*src++ != EOS) - ; - } - dst = StringCopy(dst, src); - break; - } - *dst = EOS; - return dst; - } -} - -u8 *ConvertEasyChatWordsToString(u8 *dst, u16 *words, u16 arg2, u16 arg3) -{ - u16 i; - u16 n; - - const u16 i1 = arg2 - 1; - - for (i = 0; i < arg3; i++) - { - u16 word; - - for (n = 0; n < i1; n++) - { - dst = EasyChat_GetWordText(dst, words[0]); - - if (words[0] != 0xFFFF) - { - dst[0] = CHAR_SPACE; - dst++; - } - - words++; - } - - word = words[0]; - words++; - dst = EasyChat_GetWordText(dst, word); - - dst[0] = CHAR_NEWLINE; - dst++; - } - - dst--; - dst[0] = EOS; - - return dst; -} - -u8 *sub_80EB544(u8 *dst, u16 *words, u16 arg2, u16 arg3) -{ - u16 i; - u16 n; - - const u16 i1 = arg2 - 1; - - for (i = 0; i < arg3; i++) - { - u16 word; - - for (n = 0; n < i1; n++) - { - dst = EasyChat_GetWordText(dst, words[0]); - - if (words[0] != 0xFFFF) - { - dst[0] = CHAR_SPACE; - dst++; - } - - words++; - } - - word = words[0]; - words++; - dst = EasyChat_GetWordText(dst, word); - - // Only difference with ConvertEasyChatWordsToString - dst[0] = (i == 0) ? CHAR_NEWLINE : CHAR_PROMPT_SCROLL; - dst++; - } - - dst--; - dst[0] = EOS; - - return dst; -} - - -u16 unref_sub_80EB5E0(u16 arg0) -{ - const u8 *chars; - u16 i; - u16 length; - int group, word; - - - if (arg0 == 0xFFFF) - return 0; - - group = EC_GROUP(arg0); - word = EC_INDEX(arg0); - switch (group) - { - case EC_GROUP_POKEMON: // 0 - case EC_GROUP_POKEMON_2: // 21 - chars = gSpeciesNames[word]; - break; - case EC_GROUP_MOVE_1: // 18 - case EC_GROUP_MOVE_2: // 19 - chars = gMoveNames[word]; - break; - default: - chars = gEasyChatGroupWords[group]; - for (i = word - 1; i != 0xFFFF; i--) - { - while (*chars++ != EOS) - ; - } - break; - } - - length = 0; - while (*chars != EOS) - { - chars++; - length++; - } - - return length; -} - -static bool8 sub_80EB680(u16 *arg0, u16 arg1, u16 arg2, u16 arg3) -{ - return FALSE; -} - -void unref_sub_80EB684(u8 arg0, u16 arg1) -{ - u16 *ptr; - u16 c; - - // FIXME: find actual tv shows used - switch (arg0) - { - case 5: - c = 6; - ptr = (u16*)((void *)&gSaveBlock1.tvShows[arg1] + 0x04); - break; - case 7: - c = 2; - ptr = (u16*)((void *)&gSaveBlock1.tvShows[arg1] + 0x1C); - break; - case 8: - c = 1; - ptr = (u16*)((void *)&gSaveBlock1.tvShows[arg1] + 0x02); - break; - default: - return; - } - - c -= 1; - while (c != 0xFFFF) - { - *ptr = -1; - ptr++; - c -= 1; - } -} - -void sub_80EB6FC(u16 *arg0, u16 arg1) -{ - u16 i; - - for (i = arg1 - 1; i != 0xFFFF; i--) - { - *arg0 = 0xFFFF; - arg0++; - } - -} - -u16 sub_80EB72C(u16 group) -{ - u16 local1 = Random() % gEasyChatGroupSizes[group]; - - if (group == EC_GROUP_POKEMON - || group == EC_GROUP_POKEMON_2 - || group == EC_GROUP_MOVE_1 - || group == EC_GROUP_MOVE_2) - { - local1 = ((u16 *) gEasyChatGroupWords[group])[local1]; - } - - return ((group & 0x7F) << 9) | (local1 & 0x1FF); -} - -u16 sub_80EB784(u16 group) -{ - if (!sub_80EAD7C(group)) - return -1; - - if (group != EC_GROUP_POKEMON) - { - if (group == EC_GROUP_TRENDY_SAYING) - return sub_80EB960(); - } - else - { - return sub_80EB9D8(); - } - - return sub_80EB72C(group); -} - -void sub_80EB7C4(void) -{ - u16 *words; - u16 arg1, arg2; - - switch (gSpecialVar_0x8004) - { - case 0: - words = gSaveBlock1.easyChats.unk2B1C; - arg1 = 2; - arg2 = 2; - break; - case 1: - words = gSaveBlock1.easyChats.unk2B28; - if (sub_80EB680(gSaveBlock1.easyChats.unk2B28, 3, 2, 20)) - { - arg1 = 2; - arg2 = 3; - } - else - { - arg1 = 3; - arg2 = 2; - } - break; - case 2: - words = gSaveBlock1.easyChats.unk2B34; - arg1 = 3; - arg2 = 2; - break; - case 3: - words = gSaveBlock1.easyChats.unk2B40; - arg1 = 3; - arg2 = 2; - break; - default: - return; - } - - ConvertEasyChatWordsToString(gStringVar4, words, arg1, arg2); - ShowFieldAutoScrollMessage(gStringVar4); -} - -void BufferRandomHobbyOrLifestyleString(void) -{ - u16 group, local2; - - if (Random() & 1) - group = EC_GROUP_HOBBIES; - else - group = EC_GROUP_LIFESTYLE; - - local2 = sub_80EB784(group); - EasyChat_GetWordText(gStringVar2, local2); -} - -u8 sub_80EB868(u8 arg0) -{ - int offset; - int index; - - index = arg0 / 8; - offset = arg0 % 8; - return (gSaveBlock1.unk2D8C[index] >> offset) & 1; -} - -void sub_80EB890(u8 arg0) -{ - int offset; - int index; - - if (arg0 < 33) - { - index = arg0 / 8; - offset = arg0 % 8; - gSaveBlock1.unk2D8C[index] |= 1 << offset; - } -} - -u8 sub_80EB8C0(void) -{ - u8 i, count; - - for (i = 0, count = 0; i < 33; i++) - { - if (sub_80EB868(i)) - count++; - } - return count; -} - -u16 sub_80EB8EC(void) -{ - u16 i; - u16 local1, local2; - - local1 = sub_80EB8C0(); - if (local1 == 33) - return -1; - - local2 = Random() % (33 - local1); - for (i = 0; i < 33; i++) - { - if (sub_80EB868(i) == 0) - { - if (local2 == 0) - { - sub_80EB890(i); - return (i & 0x1FF) | 0x2800; - } - local2--; - } - } - return -1; -} - -static u16 sub_80EB960(void) -{ - u16 i; - u16 local1; - - local1 = sub_80EB8C0(); - if (local1 == 0) - return -1; - - local1 = Random() % local1; - for (i = 0; i < 33; i++) - { - if (sub_80EB868(i)) - { - if (local1 == 0) - return (i & 0x1FF) | 0x2800; - local1--; - } - } - - return -1; -} - -u8 sub_80EB9C8(void) -{ - return IsNationalPokedexEnabled(); -} - -static u16 sub_80EB9D8(void) -{ - u16 *speciesList; - u16 local1; - u16 i; - - local1 = sub_80EAE88(0); - - if (local1 == 0) - return -1; - - local1 = Random() % local1; - speciesList = (u16 *) gEasyChatGroupWords[EC_GROUP_POKEMON]; - for (i = 0; i < gEasyChatGroupSizes[EC_GROUP_POKEMON]; i++) - { - const u16 dexNum = SpeciesToNationalPokedexNum(*speciesList); - const u8 local2 = GetSetPokedexFlag(dexNum, 0); - - if (local2) - { - if (local1 == 0) - return *speciesList & 0x1FF; - local1--; - } - speciesList++; - } - return -1; -} diff --git a/src/field/field_control_avatar.c b/src/field/field_control_avatar.c index 52e66f16e..3ae422512 100644 --- a/src/field/field_control_avatar.c +++ b/src/field/field_control_avatar.c @@ -4,6 +4,7 @@ #include "bike.h" #include "coord_event_weather.h" #include "daycare.h" +#include "debug.h" #include "event_data.h" #include "field_fadetransition.h" #include "field_player_avatar.h" @@ -35,6 +36,7 @@ extern u16 gSpecialVar_Facing; extern struct LinkPlayerMapObject gLinkPlayerMapObjects[]; extern u16 gSpecialVar_0x8004; extern u16 gSpecialVar_0x8005; +extern u8 gUnknown_020297ED; static EWRAM_DATA u8 gUnknown_0202E8C0 = 0; static EWRAM_DATA u16 gUnknown_0202E8C2 = 0; @@ -103,7 +105,7 @@ static void sub_8068C30(struct MapHeader *, s8, struct MapPosition *); static bool8 map_warp_consider_2_to_inside(struct MapPosition *, u16, u8); static s8 map_warp_check(struct MapHeader *, u16, u16, u8); static u8 *mapheader_trigger_activate_at(struct MapHeader *, u16, u16, u8); -static struct BgEvent *FindInvisibleMapObjectByPosition(struct MapHeader *, u16, u16, u8); +static struct BgEvent *FindInvisibleMapObjectByPosition(struct MapHeader *, u16, u16, u8);; void FieldClearPlayerInput(struct FieldInput *input) { @@ -162,6 +164,31 @@ void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys) input->dpadDirection = DIR_WEST; else if (heldKeys & DPAD_RIGHT) input->dpadDirection = DIR_EAST; +#if DEBUG + if ((heldKeys & R_BUTTON) && input->pressedStartButton) + { + input->input_field_1_2 = TRUE; + input->pressedStartButton = FALSE; + } + if (gUnknown_020297ED) + { + if (heldKeys & R_BUTTON) + { + input->input_field_1_1 = TRUE; + input->input_field_0_6 = FALSE; + input->input_field_0_1 = FALSE; + input->input_field_0_4 = FALSE; + input->input_field_0_5 = FALSE; + if (newKeys & SELECT_BUTTON) + { + input->input_field_1_0 = TRUE; + input->pressedSelectButton = FALSE; + } + } + if (heldKeys & L_BUTTON) + input->input_field_1_3 = TRUE; + } +#endif } int sub_8068024(struct FieldInput *input) @@ -173,15 +200,30 @@ int sub_8068024(struct FieldInput *input) r6 = player_get_direction_lower_nybble(); player_get_pos_to_and_height(&position); r4 = MapGridGetMetatileBehaviorAt(position.x, position.y); - if (CheckTrainers() == TRUE) +#if DEBUG + if (input->input_field_1_3 && dive_warp(&position, r4) == TRUE) return TRUE; - if (mapheader_run_first_tag2_script_list_match() == 1) +#endif + + if ( +#if DEBUG + !input->input_field_1_1 && +#endif + CheckTrainers() == TRUE) + return TRUE; + + if ( +#if DEBUG + !input->input_field_1_1 && +#endif + mapheader_run_first_tag2_script_list_match() == 1) return TRUE; + if (input->pressedBButton && sub_80687A4() == 1) return TRUE; if (input->input_field_0_6) { - IncrementGameStat(5); + IncrementGameStat(GAME_STAT_STEPS); if (sub_80687E4(&position, r4, r6) == 1) return TRUE; } @@ -211,6 +253,21 @@ int sub_8068024(struct FieldInput *input) } if (input->pressedSelectButton && sub_80A6D1C() == TRUE) return TRUE; + +#if DEBUG + if (input->input_field_1_0) + { + debug_sub_80888D8(); + return TRUE; + } + if (input->input_field_1_2) + { + PlaySE(SE_WIN_OPEN); + DebugMenu_8077048(); + return TRUE; + } +#endif + return FALSE; } @@ -532,7 +589,7 @@ static void happiness_algorithm_step(void) { struct Pokemon *pkmn = gPlayerParty; - for (i = 5; i >= 0; i--) + for (i = 0; i < 6; i++) { AdjustFriendship(pkmn, 5); pkmn++; @@ -767,20 +824,19 @@ static u8 *trigger_activate(struct CoordEvent *coordEvent) return NULL; } -static u8 *mapheader_trigger_activate_at(struct MapHeader *mapHeader, u16 x, u16 y, u8 d) +static u8 *mapheader_trigger_activate_at(struct MapHeader *mapHeader, u16 x, u16 y, u8 elevation) { s32 i; struct CoordEvent *coordEvents = mapHeader->events->coordEvents; u8 coordEventCount = mapHeader->events->coordEventCount; - u8 *script; for (i = 0; i < coordEventCount; i++) { if ((u16)coordEvents[i].x == x && (u16)coordEvents[i].y == y) { - if (coordEvents[i].unk4 == d || coordEvents[i].unk4 == 0) + if (coordEvents[i].elevation == elevation || coordEvents[i].elevation == 0) { - script = trigger_activate(&coordEvents[i]); + u8 *script = trigger_activate(&coordEvents[i]); if (script != NULL) return script; } @@ -811,7 +867,7 @@ static struct BgEvent *FindInvisibleMapObjectByPosition(struct MapHeader *mapHea return NULL; } -int dive_warp(struct MapPosition *position, u16 b) +bool8 dive_warp(struct MapPosition *position, u16 b) { if (gMapHeader.mapType == MAP_TYPE_UNDERWATER && sub_805750C(b) == 0) { diff --git a/src/field/field_effect.c b/src/field/field_effect.c index 1e2aaa4ed..e1389c378 100644 --- a/src/field/field_effect.c +++ b/src/field/field_effect.c @@ -25,6 +25,7 @@ #include "field_map_obj.h" #include "util.h" #include "field_effect_helpers.h" +#include "pokemon_storage_system.h" #define subsprite_table(ptr) {.subsprites = ptr, .subspriteCount = (sizeof ptr) / (sizeof(struct Subsprite))} @@ -407,7 +408,7 @@ void FieldEffectScript_LoadFadedPalette(u8 **script) { struct SpritePalette *palette = (struct SpritePalette *)FieldEffectScript_ReadWord(script); LoadSpritePalette(palette); - sub_807D78C(IndexOfSpritePaletteTag(palette->tag)); + UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(palette->tag)); (*script) += 4; } @@ -543,7 +544,7 @@ u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, u8 subpriority) LoadCompressedObjectPalette(&gMonPaletteTable[species]); GetMonSpriteTemplate_803C56C(species, 3); gUnknown_02024E8C.paletteTag = gMonPaletteTable[0].tag; - sub_807DE38(IndexOfSpritePaletteTag(gMonPaletteTable[0].tag) + 0x10); + PreservePaletteInWeather(IndexOfSpritePaletteTag(gMonPaletteTable[0].tag) + 0x10); return CreateSprite(&gUnknown_02024E8C, x, y, subpriority); } @@ -556,13 +557,13 @@ u8 CreateMonSprite_FieldMove(u16 species, u32 d, u32 g, s16 x, s16 y, u8 subprio LoadCompressedObjectPalette(spritePalette); GetMonSpriteTemplate_803C56C(species, 3); gUnknown_02024E8C.paletteTag = spritePalette->tag; - sub_807DE38(IndexOfSpritePaletteTag(spritePalette->tag) + 0x10); + PreservePaletteInWeather(IndexOfSpritePaletteTag(spritePalette->tag) + 0x10); return CreateSprite(&gUnknown_02024E8C, x, y, subpriority); } void FreeResourcesAndDestroySprite(struct Sprite *sprite) { - sub_807DE68(); + ResetPreservedPalettesInWeather(); FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum)); if (sprite->oam.affineMode != 0) { @@ -1091,7 +1092,7 @@ void task00_8084310(u8 taskId) task = &gTasks[taskId]; if (!task->data[0]) { - if (!sub_807D770()) + if (!IsWeatherNotFadingIn()) { return; } @@ -1191,7 +1192,7 @@ bool8 sub_80867AC(struct Task *task) // gUnknown_0839F2CC[0] bool8 sub_8086854(struct Task *task) // gUnknown_0839F2CC[1] { - if (sub_807D770()) + if (IsWeatherNotFadingIn()) { task->data[0]++; } @@ -1813,7 +1814,7 @@ bool8 sub_80874CC(struct Task *task, struct MapObject *mapObject, struct Sprite bool8 sub_80874FC(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) { - if (sub_807D770()) + if (IsWeatherNotFadingIn()) { gFieldEffectArguments[0] = mapObject->coords2.x; gFieldEffectArguments[1] = mapObject->coords2.y; @@ -2046,7 +2047,7 @@ void sub_8087A74(u8 taskId) void sub_8087AA4(struct Task *task) { - if (sub_807D770()) + if (IsWeatherNotFadingIn()) { task->data[0]++; task->data[15] = player_get_direction_lower_nybble(); @@ -2199,7 +2200,7 @@ void sub_8087E4C(struct Task *task) { struct Sprite *sprite; s16 centerToCornerVecY; - if (sub_807D770()) + if (IsWeatherNotFadingIn()) { sprite = &gSprites[gPlayerAvatar.spriteId]; centerToCornerVecY = -(sprite->centerToCornerVecY << 1); @@ -2434,8 +2435,8 @@ void sub_8088380(struct Task *task) IntrCallback callback; LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&callback); SetVBlankCallback(callback); - SetUpWindowConfig(&gWindowConfig_81E6CE4); - InitMenuWindow(&gWindowConfig_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); FreeResourcesAndDestroySprite(&gSprites[task->data[15]]); FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON); DestroyTask(FindTaskIdByFunc(sub_8088120)); @@ -2557,8 +2558,8 @@ void sub_808862C(struct Task *task) CpuFill32(0, (void *)VRAM + bg0cnt, 0x800); LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&intrCallback); SetVBlankCallback(intrCallback); - SetUpWindowConfig(&gWindowConfig_81E6CE4); - InitMenuWindow(&gWindowConfig_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); FreeResourcesAndDestroySprite(&gSprites[task->data[15]]); FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON); DestroyTask(FindTaskIdByFunc(sub_808847C)); diff --git a/src/field/field_effect_helpers.c b/src/field/field_effect_helpers.c index 165829a55..c9d337de1 100644 --- a/src/field/field_effect_helpers.c +++ b/src/field/field_effect_helpers.c @@ -29,8 +29,6 @@ static void sub_81280A0(struct MapObject *, struct Sprite *, struct Sprite *); static void sub_8128174(struct Sprite *); static u32 ShowDisguiseFieldEffect(u8, u8, u8); -const u8 UnusedEggString_8401E28[] = _("タマゴ"); - void SetUpReflection(struct MapObject *mapObject, struct Sprite *sprite, bool8 flag) { struct Sprite *newSprite; @@ -95,7 +93,7 @@ static void npc_pal_op_B(struct MapObject *mapObject, u8 paletteNum) { pal_patch_for_npc(npc_paltag_by_palslot(paletteNum), paletteNum); } - sub_807D78C(paletteNum); + UpdateSpritePaletteWithWeather(paletteNum); } } @@ -107,7 +105,7 @@ static void npc_pal_op_A(struct MapObject *mapObject, u8 paletteNum) if (graphicsInfo->paletteTag2 != 0x11ff) { pal_patch_for_npc(graphicsInfo->paletteTag2, paletteNum); - sub_807D78C(paletteNum); + UpdateSpritePaletteWithWeather(paletteNum); } } diff --git a/src/field/field_fadetransition.c b/src/field/field_fadetransition.c index 5014e97e3..21235500a 100644 --- a/src/field/field_fadetransition.c +++ b/src/field/field_fadetransition.c @@ -44,18 +44,18 @@ void pal_fill_for_map_transition(void) switch (fade_type_for_given_maplight_pair(map_light, Overworld_GetMapTypeOfSaveblockLocation())) { case 0: - fade_screen(0, 0); + FadeScreen(0, 0); palette_bg_fill_black(); break; case 1: - fade_screen(2, 0); + FadeScreen(2, 0); palette_bg_fill_white(); } } void pal_fill_black(void) { - fade_screen(0, 0); + FadeScreen(0, 0); palette_bg_fill_black(); } @@ -65,10 +65,10 @@ void fade_8080918(void) switch (sub_810CDB8(light_level, warp1_get_mapheader()->mapType)) { case 0: - fade_screen(1, 0); + FadeScreen(1, 0); break; case 1: - fade_screen(3, 0); + FadeScreen(3, 0); } } @@ -146,7 +146,7 @@ void sub_8080A5C(u8 taskId) task->data[0]++; break; case 1: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { pal_fill_for_map_transition(); task->data[0]++; @@ -366,7 +366,7 @@ bool32 sub_8080E64(void) bool32 sub_8080E70(void) { - if (sub_807D770() == TRUE) + if (IsWeatherNotFadingIn() == TRUE) return TRUE; else return FALSE; @@ -483,7 +483,7 @@ void sub_8081050(u8 taskId) { case 0: ClearLinkCallback_2(); - fade_screen(1, 0); + FadeScreen(1, 0); sub_8053FF8(); PlaySE(SE_KAIDAN); data[0]++; @@ -511,6 +511,22 @@ void sub_80810DC(void) CreateTask(sub_8081050, 10); } +#if DEBUG + +__attribute__((naked)) +void debug_sub_80888D8() +{ + asm("\ + PUSH {LR}\n\ + BL debug_sub_8052E04\n\ + BL sub_8080E88\n\ + BL ScriptContext2_Enable\n\ + POP {R0}\n\ + BX R0"); +} + +#endif + void task0A_fade_n_map_maybe(u8 taskId) { struct Task *task = &gTasks[taskId]; diff --git a/src/field/field_map_obj.c b/src/field/field_map_obj.c index ba7c3d68e..13d8ebb5b 100644 --- a/src/field/field_map_obj.c +++ b/src/field/field_map_obj.c @@ -1907,6 +1907,9 @@ static u8 gUnknown_030005A4; static u16 gUnknown_030005A6; struct MapObject gMapObjects[16]; +#if DEBUG +u8 gUnknown_Debug_03004BC0[4]; // unknown type +#endif void npc_clear_ids_and_state(struct MapObject *mapObj) { @@ -1917,6 +1920,40 @@ void npc_clear_ids_and_state(struct MapObject *mapObj) mapObj->mapobj_unk_1C = 0xFF; } +#if DEBUG +__attribute__((naked)) +void npcs_clear_ids_and_state() +{ + asm( + " push {r4, r5, lr}\n" + " mov r4, #0x0\n" + " ldr r5, ._2 @ gMapObjects\n" + "._1:\n" + " lsl r0, r4, #0x3\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r5\n" + " bl npc_clear_ids_and_state\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " cmp r4, #0xf\n" + " bls ._1 @cond_branch\n" + " ldr r1, ._2 + 4 @ gUnknown_Debug_03004BC0\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._3:\n" + " .align 2, 0\n" + "._2:\n" + " .word gMapObjects\n" + " .word gUnknown_Debug_03004BC0\n" + "\n" + ); +} +#else void npcs_clear_ids_and_state(void) { u8 i; @@ -1924,6 +1961,7 @@ void npcs_clear_ids_and_state(void) for (i = 0; i < 16; i++) npc_clear_ids_and_state(&gMapObjects[i]); } +#endif void sub_805AA98(void) { @@ -2017,6 +2055,176 @@ u8 GetFieldObjectIdByLocalId(u8 localId) return 16; } +#if DEBUG +__attribute__((naked)) +u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c) +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r9\n" + " mov r6, r8\n" + " push {r6, r7}\n" + " add sp, sp, #0xfffffffc\n" + " add r5, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r6, r1, #0x18\n" + " lsl r2, r2, #0x18\n" + " lsr r7, r2, #0x18\n" + " ldrb r0, [r5]\n" + " add r1, r6, #0\n" + " add r2, r7, #0\n" + " mov r3, sp\n" + " bl GetAvailableFieldObjectSlot\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " beq ._35 @cond_branch\n" + " mov r0, #0x10\n" + " b ._36\n" + "._35:\n" + " mov r0, sp\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._40 @ gMapObjects\n" + " add r4, r0, r1\n" + " add r0, r4, #0\n" + " bl npc_clear_ids_and_state\n" + " ldrh r3, [r5, #0x4]\n" + " add r3, r3, #0x7\n" + " lsl r3, r3, #0x10\n" + " lsr r3, r3, #0x10\n" + " ldrh r2, [r5, #0x6]\n" + " add r2, r2, #0x7\n" + " lsl r2, r2, #0x10\n" + " lsr r2, r2, #0x10\n" + " ldrb r0, [r4]\n" + " mov r1, #0x1\n" + " orr r0, r0, r1\n" + " mov r1, #0x4\n" + " orr r0, r0, r1\n" + " strb r0, [r4]\n" + " ldrb r0, [r5, #0x1]\n" + " strb r0, [r4, #0x5]\n" + " ldrb r0, [r5, #0x9]\n" + " strb r0, [r4, #0x6]\n" + " ldrb r0, [r5]\n" + " strb r0, [r4, #0x8]\n" + " strb r6, [r4, #0x9]\n" + " strb r7, [r4, #0xa]\n" + " strh r3, [r4, #0xc]\n" + " strh r2, [r4, #0xe]\n" + " strh r3, [r4, #0x10]\n" + " strh r2, [r4, #0x12]\n" + " strh r3, [r4, #0x14]\n" + " strh r2, [r4, #0x16]\n" + " ldrb r0, [r5, #0x8]\n" + " mov r7, #0xf\n" + " add r1, r7, #0\n" + " and r1, r1, r0\n" + " ldrb r2, [r4, #0xb]\n" + " mov r0, #0x10\n" + " neg r0, r0\n" + " mov r8, r0\n" + " and r0, r0, r2\n" + " orr r0, r0, r1\n" + " strb r0, [r4, #0xb]\n" + " ldrb r1, [r5, #0x8]\n" + " lsl r1, r1, #0x4\n" + " and r0, r0, r7\n" + " orr r0, r0, r1\n" + " strb r0, [r4, #0xb]\n" + " ldrb r1, [r5, #0xa]\n" + " lsl r1, r1, #0x1c\n" + " mov r0, #0xf\n" + " mov r9, r0\n" + " lsr r1, r1, #0x1c\n" + " ldrb r2, [r4, #0x19]\n" + " mov r0, r8\n" + " and r0, r0, r2\n" + " orr r0, r0, r1\n" + " strb r0, [r4, #0x19]\n" + " ldrb r1, [r5, #0xa]\n" + " lsr r1, r1, #0x4\n" + " lsl r1, r1, #0x4\n" + " and r0, r0, r7\n" + " orr r0, r0, r1\n" + " strb r0, [r4, #0x19]\n" + " ldrh r0, [r5, #0xc]\n" + " strb r0, [r4, #0x7]\n" + " ldrh r0, [r5, #0xe]\n" + " strb r0, [r4, #0x1d]\n" + " ldr r1, ._40 + 4 @ gUnknown_0836DC09\n" + " ldrb r0, [r5, #0x9]\n" + " add r0, r0, r1\n" + " ldrb r1, [r0]\n" + " add r0, r4, #0\n" + " add r0, r0, #0x20\n" + " strb r1, [r0]\n" + " ldrb r1, [r0]\n" + " add r0, r4, #0\n" + " bl FieldObjectSetDirection\n" + " add r0, r4, #0\n" + " bl FieldObjectHandleDynamicGraphicsId\n" + " ldr r1, ._40 + 8 @ gUnknown_0836DBBC\n" + " ldrb r0, [r4, #0x6]\n" + " add r0, r0, r1\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " beq ._39 @cond_branch\n" + " ldrb r2, [r4, #0x19]\n" + " add r0, r7, #0\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " bne ._38 @cond_branch\n" + " lsl r0, r2, #0x1c\n" + " lsr r0, r0, #0x1c\n" + " add r0, r0, #0x1\n" + " mov r1, r9\n" + " and r0, r0, r1\n" + " mov r1, r8\n" + " and r1, r1, r2\n" + " orr r1, r1, r0\n" + " strb r1, [r4, #0x19]\n" + "._38:\n" + " ldrb r2, [r4, #0x19]\n" + " mov r0, #0xf0\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " bne ._39 @cond_branch\n" + " lsr r1, r2, #0x4\n" + " add r1, r1, #0x1\n" + " lsl r1, r1, #0x4\n" + " add r0, r7, #0\n" + " and r0, r0, r2\n" + " orr r0, r0, r1\n" + " strb r0, [r4, #0x19]\n" + "._39:\n" + " ldr r1, ._40 + 12 @ gUnknown_Debug_03004BC0\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + " mov r0, sp\n" + " ldrb r0, [r0]\n" + "._36:\n" + " add sp, sp, #0x4\n" + " pop {r3, r4}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._41:\n" + " .align 2, 0\n" + "._40:\n" + " .word gMapObjects\n" + " .word gUnknown_0836DC09\n" + " .word gUnknown_0836DBBC\n" + " .word gUnknown_Debug_03004BC0\n" + "\n" + ); +} +#else #ifdef NONMATCHING u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c) { @@ -2227,6 +2435,7 @@ _0805ADD8: .4byte gUnknown_0836DBBC\n\ .syntax divided\n"); } #endif +#endif u8 sub_805ADDC(u8 localId) { @@ -2266,11 +2475,38 @@ u8 GetAvailableFieldObjectSlot(u16 a, u8 b, u8 c, u8 *d) return 0; } +#if DEBUG +__attribute__((naked)) +void RemoveFieldObject(struct MapObject *mapObject) +{ + asm( + " push {lr}\n" + " ldrb r2, [r0]\n" + " mov r1, #0x2\n" + " neg r1, r1\n" + " and r1, r1, r2\n" + " strb r1, [r0]\n" + " bl RemoveFieldObjectInternal\n" + " ldr r1, ._72 @ gUnknown_Debug_03004BC0\n" + " ldrb r0, [r1]\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1]\n" + " pop {r0}\n" + " bx r0\n" + "._73:\n" + " .align 2, 0\n" + "._72:\n" + " .word gUnknown_Debug_03004BC0\n" + "\n" + ); +} +#else void RemoveFieldObject(struct MapObject *mapObject) { mapObject->active = FALSE; RemoveFieldObjectInternal(mapObject); } +#endif void RemoveFieldObjectByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) { @@ -2303,6 +2539,226 @@ void npc_hide_all_but_player(void) } } +#if DEBUG +__attribute__((naked)) +u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, u8 c, u8 d, s16 e, s16 f) +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " add r7, r1, #0\n" + " add r1, r2, #0\n" + " add r2, r3, #0\n" + " ldr r3, [sp, #0x20]\n" + " ldr r4, [sp, #0x24]\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " lsl r2, r2, #0x18\n" + " lsr r2, r2, #0x18\n" + " lsl r3, r3, #0x10\n" + " lsr r3, r3, #0x10\n" + " mov r9, r3\n" + " lsl r4, r4, #0x10\n" + " lsr r4, r4, #0x10\n" + " mov sl, r4\n" + " bl InitFieldObjectStateFromTemplate\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r8, r0\n" + " cmp r0, #0x10\n" + " bne ._83 @cond_branch\n" + " mov r0, #0x10\n" + " b ._92\n" + "._83:\n" + " mov r0, r8\n" + " lsl r4, r0, #0x3\n" + " add r0, r4, r0\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._87 @ gMapObjects\n" + " add r5, r0, r1\n" + " ldrb r0, [r5, #0x5]\n" + " bl GetFieldObjectGraphicsInfo\n" + " add r6, r0, #0\n" + " ldrb r1, [r6, #0xc]\n" + " mov r0, #0xf\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._85 @cond_branch\n" + " ldrh r0, [r6, #0x2]\n" + " lsl r1, r1, #0x1c\n" + " lsr r1, r1, #0x1c\n" + " bl npc_load_two_palettes__no_record\n" + " b ._89\n" + "._88:\n" + " .align 2, 0\n" + "._87:\n" + " .word gMapObjects\n" + "._85:\n" + " cmp r0, #0xa\n" + " bne ._89 @cond_branch\n" + " ldrh r0, [r6, #0x2]\n" + " lsl r1, r1, #0x1c\n" + " lsr r1, r1, #0x1c\n" + " bl npc_load_two_palettes__and_record\n" + "._89:\n" + " ldrb r0, [r5, #0x6]\n" + " cmp r0, #0x4c\n" + " bne ._90 @cond_branch\n" + " ldrb r0, [r5, #0x1]\n" + " mov r1, #0x20\n" + " orr r0, r0, r1\n" + " strb r0, [r5, #0x1]\n" + "._90:\n" + " ldr r1, ._93 @ 0xffff\n" + " add r0, r1, #0\n" + " strh r0, [r7, #0x2]\n" + " add r0, r7, #0\n" + " mov r1, #0x0\n" + " mov r2, #0x0\n" + " mov r3, #0x0\n" + " bl CreateSprite\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + " cmp r7, #0x40\n" + " bne ._91 @cond_branch\n" + " ldr r1, ._93 + 4 @ gUnknown_Debug_03004BC0\n" + " ldrb r0, [r1]\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1]\n" + " ldr r0, ._93 + 8 @ gMapObjects\n" + " mov r2, r8\n" + " add r1, r4, r2\n" + " lsl r1, r1, #0x2\n" + " add r1, r1, r0\n" + " ldrb r2, [r1]\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " and r0, r0, r2\n" + " strb r0, [r1]\n" + " mov r0, #0x10\n" + " b ._92\n" + "._94:\n" + " .align 2, 0\n" + "._93:\n" + " .word 0xffff\n" + " .word gUnknown_Debug_03004BC0\n" + " .word gMapObjects\n" + "._91:\n" + " lsl r0, r7, #0x4\n" + " add r0, r0, r7\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._96 @ gSprites\n" + " add r4, r0, r1\n" + " mov r1, r9\n" + " lsl r0, r1, #0x10\n" + " asr r0, r0, #0x10\n" + " ldrh r2, [r5, #0x10]\n" + " add r0, r0, r2\n" + " lsl r0, r0, #0x10\n" + " asr r0, r0, #0x10\n" + " mov r2, sl\n" + " lsl r1, r2, #0x10\n" + " asr r1, r1, #0x10\n" + " ldrh r2, [r5, #0x12]\n" + " add r1, r1, r2\n" + " lsl r1, r1, #0x10\n" + " asr r1, r1, #0x10\n" + " add r2, r4, #0\n" + " add r2, r2, #0x20\n" + " add r3, r4, #0\n" + " add r3, r3, #0x22\n" + " bl sub_8060388\n" + " ldrh r0, [r6, #0x8]\n" + " lsl r0, r0, #0x10\n" + " asr r0, r0, #0x11\n" + " neg r0, r0\n" + " add r1, r4, #0\n" + " add r1, r1, #0x28\n" + " strb r0, [r1]\n" + " ldrh r0, [r6, #0xa]\n" + " lsl r0, r0, #0x10\n" + " asr r0, r0, #0x11\n" + " neg r0, r0\n" + " add r2, r4, #0\n" + " add r2, r2, #0x29\n" + " strb r0, [r2]\n" + " ldrh r0, [r4, #0x20]\n" + " add r0, r0, #0x8\n" + " strh r0, [r4, #0x20]\n" + " ldrh r1, [r4, #0x22]\n" + " add r1, r1, #0x10\n" + " mov r0, #0x0\n" + " ldsb r0, [r2, r0]\n" + " add r0, r0, r1\n" + " strh r0, [r4, #0x22]\n" + " ldrb r1, [r6, #0xc]\n" + " lsl r1, r1, #0x1c\n" + " lsr r1, r1, #0x18\n" + " ldrb r2, [r4, #0x5]\n" + " mov r0, #0xf\n" + " and r0, r0, r2\n" + " orr r0, r0, r1\n" + " strb r0, [r4, #0x5]\n" + " add r2, r4, #0\n" + " add r2, r2, #0x3e\n" + " ldrb r0, [r2]\n" + " mov r1, #0x2\n" + " orr r0, r0, r1\n" + " strb r0, [r2]\n" + " mov r0, r8\n" + " strh r0, [r4, #0x2e]\n" + " strb r7, [r5, #0x4]\n" + " ldrb r1, [r6, #0xc]\n" + " lsl r1, r1, #0x19\n" + " lsr r1, r1, #0x1f\n" + " lsl r1, r1, #0x4\n" + " ldrb r2, [r5, #0x1]\n" + " mov r0, #0x11\n" + " neg r0, r0\n" + " and r0, r0, r2\n" + " orr r0, r0, r1\n" + " strb r0, [r5, #0x1]\n" + " lsl r0, r0, #0x1b\n" + " cmp r0, #0\n" + " blt ._95 @cond_branch\n" + " ldrb r0, [r5, #0x18]\n" + " lsl r0, r0, #0x1c\n" + " lsr r0, r0, #0x1c\n" + " bl FieldObjectDirectionToImageAnimId\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " add r0, r4, #0\n" + " bl StartSpriteAnim\n" + "._95:\n" + " ldrb r0, [r5, #0xb]\n" + " lsr r0, r0, #0x4\n" + " add r1, r4, #0\n" + " mov r2, #0x1\n" + " bl SetObjectSubpriorityByZCoord\n" + " add r0, r5, #0\n" + " add r1, r4, #0\n" + " bl sub_80634D0\n" + " mov r0, r8\n" + "._92:\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._97:\n" + " .align 2, 0\n" + "._96:\n" + " .word gSprites\n" + "\n" + ); +} +#else u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, u8 c, u8 d, s16 e, s16 f) { u8 mapObjectId; @@ -2352,6 +2808,7 @@ u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate * sub_80634D0(mapObject, sprite); return mapObjectId; } +#endif u8 SpawnFieldObject(struct MapObjectTemplate *mapObjTemplate, u8 b, u8 c, s16 d, s16 e) { @@ -2440,7 +2897,7 @@ void MakeObjectTemplateFromFieldObjectTemplate(struct MapObjectTemplate *mapObjT MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(mapObjTemplate->graphicsId, mapObjTemplate->movementType, sprTemplate, subspriteTables); } -u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 c, s16 d, u8 subpriority) +u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority) { struct SpriteTemplate spriteTemplate; const struct SubspriteTable *subspriteTables; @@ -2449,7 +2906,7 @@ u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 c MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, callback, &spriteTemplate, &subspriteTables); if (spriteTemplate.paletteTag != 0xFFFF) sub_805BDF8(spriteTemplate.paletteTag); - spriteId = CreateSprite(&spriteTemplate, c, d, subpriority); + spriteId = CreateSprite(&spriteTemplate, x, y, subpriority); if (spriteId != 64 && subspriteTables != NULL) { SetSubspriteTables(&gSprites[spriteId], subspriteTables); @@ -2574,6 +3031,66 @@ void RemoveFieldObjectIfOutsideView(struct MapObject *mapObject) void sub_805B75C(u8, s16, s16); +#if DEBUG +__attribute__((naked)) +void sub_805B710(u16 u161, u16 u162) +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " add r4, r0, #0\n" + " add r5, r1, #0\n" + " lsl r4, r4, #0x10\n" + " lsr r4, r4, #0x10\n" + " lsl r5, r5, #0x10\n" + " lsr r5, r5, #0x10\n" + " ldr r6, ._153 @ gUnknown_Debug_03004BC0\n" + " mov r0, #0x0\n" + " strb r0, [r6]\n" + " bl ClearPlayerAvatarInfo\n" + " mov r7, #0x0\n" + " ldr r0, ._153 + 4 @ gMapObjects\n" + " mov r8, r0\n" + " lsl r4, r4, #0x10\n" + " lsl r5, r5, #0x10\n" + "._152:\n" + " lsl r0, r7, #0x3\n" + " add r0, r0, r7\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r8\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x1f\n" + " cmp r0, #0\n" + " beq ._151 @cond_branch\n" + " add r0, r7, #0\n" + " asr r1, r4, #0x10\n" + " asr r2, r5, #0x10\n" + " bl sub_805B75C\n" + " ldrb r0, [r6]\n" + " add r0, r0, #0x1\n" + " strb r0, [r6]\n" + "._151:\n" + " add r0, r7, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + " cmp r7, #0xf\n" + " bls ._152 @cond_branch\n" + " bl sub_805AAB0\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._154:\n" + " .align 2, 0\n" + "._153:\n" + " .word gUnknown_Debug_03004BC0\n" + " .word gMapObjects\n" + "\n" + ); +} +#else void sub_805B710(u16 a, u16 b) { u8 i; @@ -2586,6 +3103,7 @@ void sub_805B710(u16 a, u16 b) } sub_805AAB0(); } +#endif extern void SetPlayerAvatarFieldObjectIdAndObjectId(u8, u8); extern void sub_805B914(struct MapObject *); diff --git a/src/field/field_message_box.c b/src/field/field_message_box.c index 35aac7ac9..5eec7a14b 100644 --- a/src/field/field_message_box.c +++ b/src/field/field_message_box.c @@ -19,8 +19,8 @@ static void PrintFieldMessageFromStringVar4(void); void InitFieldMessageBox(void) { sMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN; - SetMessageBoxBaseTileNum(gMenuTextWindowContentTileOffset); - InitWindowFromConfig(&gFieldMessageBoxWindow, &gWindowConfig_81E6CE4); + TextWindow_SetDlgFrameBaseTileNum(gMenuTextWindowContentTileOffset); + Text_InitWindowWithTemplate(&gFieldMessageBoxWindow, &gWindowTemplate_81E6CE4); } static void Task_FieldMessageBox(u8 taskId) @@ -29,22 +29,22 @@ static void Task_FieldMessageBox(u8 taskId) switch (task->data[0]) { case 0: - LoadMessageBoxTiles(&gFieldMessageBoxWindow); + TextWindow_LoadDialogueFrameTiles(&gFieldMessageBoxWindow); task->data[0]++; break; case 1: - DrawStandardMessageBox(&gFieldMessageBoxWindow); + TextWindow_DrawDialogueFrame(&gFieldMessageBoxWindow); task->data[0]++; break; case 2: switch (sMessageBoxMode) { case FIELD_MESSAGE_BOX_NORMAL: - if (!sub_80035AC(&gFieldMessageBoxWindow)) + if (!Text_UpdateWindow(&gFieldMessageBoxWindow)) return; break; case FIELD_MESSAGE_BOX_AUTO_SCROLL: - if (!sub_8003778(&gFieldMessageBoxWindow)) + if (!Text_UpdateWindowAutoscroll(&gFieldMessageBoxWindow)) return; break; } @@ -117,20 +117,20 @@ bool8 unref_sub_8064BD0(const u8 *message) static void PrintFieldMessage(const u8 *message) { StringExpandPlaceholders(gStringVar4, message); - sub_8002EB0(&gFieldMessageBoxWindow, gStringVar4, gMenuTextTileOffset, 2, 15); + Text_InitWindow8002EB0(&gFieldMessageBoxWindow, gStringVar4, gMenuTextTileOffset, 2, 15); CreateFieldMessageBoxTask(); } static void PrintFieldMessageFromStringVar4(void) { - sub_8002EB0(&gFieldMessageBoxWindow, gStringVar4, gMenuTextTileOffset, 2, 15); + Text_InitWindow8002EB0(&gFieldMessageBoxWindow, gStringVar4, gMenuTextTileOffset, 2, 15); CreateFieldMessageBoxTask(); } void HideFieldMessageBox(void) { DestroyFieldMessageBoxTask(); - ClearStandardMessageBox(&gFieldMessageBoxWindow); + TextWindow_EraseDialogueFrame(&gFieldMessageBoxWindow); sMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN; } @@ -150,6 +150,6 @@ bool8 IsFieldMessageBoxHidden(void) void unref_sub_8064CA0(void) { DestroyFieldMessageBoxTask(); - DrawStandardMessageBox(&gFieldMessageBoxWindow); + TextWindow_DrawDialogueFrame(&gFieldMessageBoxWindow); sMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN; } diff --git a/src/field/field_player_avatar.c b/src/field/field_player_avatar.c index d80076be4..a7594372d 100644 --- a/src/field/field_player_avatar.c +++ b/src/field/field_player_avatar.c @@ -32,9 +32,9 @@ static void npc_clear_strange_bits(struct MapObject *a); static void MovePlayerAvatarUsingKeypadInput(u8 a, u16 b, u16 c); static void PlayerAllowForcedMovementIfMovingSameDirection(void); static bool8 TryDoMetatileBehaviorForcedMovement(void); -static u8 GetForcedMovementByMetatileBehavior(void); +/*static*/ u8 GetForcedMovementByMetatileBehavior(void); static void MovePlayerNotOnBike(u8 a, u16 b); -static u8 CheckMovementInputNotOnBike(u8 a); +/*static*/ u8 CheckMovementInputNotOnBike(u8 a); static u8 CheckForPlayerAvatarCollision(u8 a); static u8 sub_8058EF0(s16 a, s16 b, u8 c); static bool8 ShouldJumpLedge(s16 a, s16 b, u8 c); @@ -260,12 +260,59 @@ static void PlayerAllowForcedMovementIfMovingSameDirection(void) gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_5; } +#if DEBUG +__attribute__((naked)) +u8 TryDoMetatileBehaviorForcedMovement() +{ + asm( + " push {r4, lr}\n" + " ldr r0, ._27 @ gUnknown_020297ED\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " beq ._25 @cond_branch\n" + " ldr r0, ._27 + 4 @ gMain\n" + " ldrh r1, [r0, #0x2c]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._25 @cond_branch\n" + " mov r0, #0x0\n" + " b ._26\n" + "._28:\n" + " .align 2, 0\n" + "._27:\n" + " .word gUnknown_020297ED\n" + " .word gMain\n" + "._25:\n" + " ldr r4, ._29 @ gUnknown_0830FBA0\n" + " bl GetForcedMovementByMetatileBehavior\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x16\n" + " add r0, r0, r4\n" + " ldr r0, [r0]\n" + " bl _call_via_r0\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + "._26:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "._30:\n" + " .align 2, 0\n" + "._29:\n" + " .word gUnknown_0830FBA0\n" + "\n" + ); +} +#else static bool8 TryDoMetatileBehaviorForcedMovement(void) { return gUnknown_0830FBA0[GetForcedMovementByMetatileBehavior()](); } +#endif -static u8 GetForcedMovementByMetatileBehavior(void) +/*static*/ u8 GetForcedMovementByMetatileBehavior(void) { u8 i; @@ -436,12 +483,57 @@ bool8 ForcedMovement_MuddySlope(void) } } +#if DEBUG +__attribute__((naked)) +void MovePlayerNotOnBike(u8 u81, u16 u161) +{ + asm( + " push {r4, r5, r6, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " add r5, r2, #0\n" + " lsl r1, r1, #0x10\n" + " lsr r6, r1, #0x10\n" + " ldr r0, ._84 @ gUnknown_020297ED\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " beq ._82 @cond_branch\n" + " add r0, r2, #0\n" + " bl debug_sub_805F2B0\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._83 @cond_branch\n" + "._82:\n" + " ldr r4, ._84 + 4 @ gUnknown_0830FBEC\n" + " add r0, r5, #0\n" + " bl CheckMovementInputNotOnBike\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x16\n" + " add r0, r0, r4\n" + " ldr r2, [r0]\n" + " add r0, r5, #0\n" + " add r1, r6, #0\n" + " bl _call_via_r2\n" + "._83:\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._85:\n" + " .align 2, 0\n" + "._84:\n" + " .word gUnknown_020297ED\n" + " .word gUnknown_0830FBEC\n" + "\n" + ); +} +#else static void MovePlayerNotOnBike(u8 direction, u16 heldKeys) { gUnknown_0830FBEC[CheckMovementInputNotOnBike(direction)](direction, heldKeys); } +#endif -static u8 CheckMovementInputNotOnBike(u8 direction) +/*static*/ u8 CheckMovementInputNotOnBike(u8 direction) { if (direction == DIR_NONE) { @@ -523,7 +615,7 @@ u8 CheckForFieldObjectCollision(struct MapObject *a, s16 x, s16 y, u8 direction, return 5; if (ShouldJumpLedge(x, y, direction)) { - IncrementGameStat(0x2B); + IncrementGameStat(GAME_STAT_JUMPED_DOWN_LEDGES); return COLLISION_LEDGE_JUMP; } if (collision == 4 && sub_8058F6C(x, y, direction)) @@ -1507,7 +1599,7 @@ u8 Fishing4(struct Task *task) { u32 randVal; - MenuDisplayMessageBox(); + Menu_DisplayDialogueFrame(); task->tStep++; task->tFrameCounter = 0; task->tNumDots = 0; @@ -1549,7 +1641,7 @@ u8 Fishing5(struct Task *task) } else { - MenuPrint(dot, task->tNumDots + 4, 15); + Menu_PrintText(dot, task->tNumDots + 4, 15); task->tNumDots++; } } @@ -1573,7 +1665,7 @@ u8 Fishing6(struct Task *task) u8 Fishing7(struct Task *task) { sub_805A954(); - MenuPrint(gOtherText_OhABite, 4, 17); + Menu_PrintText(gOtherText_OhABite, 4, 17); task->tStep++; task->tFrameCounter = 0; return 0; @@ -1624,7 +1716,7 @@ u8 Fishing10(struct Task *task) { sub_805A954(); MenuPrintMessageDefaultCoords(gOtherText_PokeOnHook); - MenuDisplayMessageBox(); + Menu_DisplayDialogueFrame(); task->tStep++; task->tFrameCounter = 0; return 0; @@ -1637,7 +1729,7 @@ u8 Fishing11(struct Task *task) if (task->tFrameCounter == 0) { - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) { struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; @@ -1647,7 +1739,7 @@ u8 Fishing11(struct Task *task) sub_8127F28(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1A, 0, 0); gSprites[gPlayerAvatar.spriteId].pos2.x = 0; gSprites[gPlayerAvatar.spriteId].pos2.y = 0; - MenuZeroFillScreen(); + Menu_EraseScreen(); task->tFrameCounter++; return 0; } @@ -1688,7 +1780,7 @@ u8 Fishing13(struct Task *task) u8 Fishing14(struct Task *task) { sub_805A954(); - MenuDisplayMessageBox(); + Menu_DisplayDialogueFrame(); task->tStep++; return 0; } @@ -1713,12 +1805,12 @@ u8 Fishing15(struct Task *task) u8 Fishing16(struct Task *task) { - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) { gPlayerAvatar.preventStep = FALSE; ScriptContext2_Disable(); UnfreezeMapObjects(); - MenuZeroFillScreen(); + Menu_EraseScreen(); sub_80BE97C(0); DestroyTask(FindTaskIdByFunc(Task_Fishing)); } @@ -1763,3 +1855,98 @@ static void sub_805A954(void) if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) sub_8127F28(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1A, 1, playerSprite->pos2.y); } + +#if DEBUG +__attribute__((naked)) +void debug_sub_805F2B0() +{ + asm( + " push {lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " ldr r0, ._422 @ gMain\n" + " ldrh r1, [r0, #0x2c]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._420 @cond_branch\n" + " mov r0, #0x0\n" + " b ._421\n" + "._423:\n" + " .align 2, 0\n" + "._422:\n" + " .word gMain\n" + "._420:\n" + " add r0, r2, #0\n" + " bl debug_sub_805F2DC\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + "._421:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_805F2DC() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " cmp r4, #0\n" + " bne ._424 @cond_branch\n" + " ldr r2, ._426 @ gMapObjects\n" + " ldr r0, ._426 + 4 @ gPlayerAvatar\n" + " ldrb r1, [r0, #0x5]\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r2\n" + " ldrb r0, [r0, #0x18]\n" + " lsr r0, r0, #0x4\n" + " bl PlayerFaceDirection\n" + " b ._430\n" + "._427:\n" + " .align 2, 0\n" + "._426:\n" + " .word gMapObjects\n" + " .word gPlayerAvatar\n" + "._424:\n" + " ldr r2, ._431 @ gMapObjects\n" + " ldr r0, ._431 + 4 @ gPlayerAvatar\n" + " ldrb r1, [r0, #0x5]\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r2\n" + " ldrb r0, [r0, #0x1]\n" + " lsr r0, r0, #0x7\n" + " cmp r0, #0\n" + " beq ._429 @cond_branch\n" + " add r0, r4, #0\n" + " bl CanCameraMoveInDirection\n" + " cmp r0, #0\n" + " bne ._429 @cond_branch\n" + " add r0, r4, #0\n" + " bl PlayerOnBikeCollide\n" + " b ._430\n" + "._432:\n" + " .align 2, 0\n" + "._431:\n" + " .word gMapObjects\n" + " .word gPlayerAvatar\n" + "._429:\n" + " add r0, r4, #0\n" + " bl PlayerGoSpeed4\n" + "._430:\n" + " mov r0, #0x1\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} +#endif diff --git a/src/field/field_poison.c b/src/field/field_poison.c index 49678f269..8365351f9 100644 --- a/src/field/field_poison.c +++ b/src/field/field_poison.c @@ -43,7 +43,7 @@ void MonFaintFromPoisonOnField(u8 partyMember) u32 val = 0; AdjustFriendship(pkmn, 7); - SetMonData(pkmn, MON_DATA_STATUS, (u8*)&val); + SetMonData(pkmn, MON_DATA_STATUS, &val); GetMonData(pkmn, MON_DATA_NICKNAME, gStringVar1); StringGetEnd10(gStringVar1); } @@ -60,38 +60,36 @@ bool32 CheckMonFaintedFromPoison(u8 partyMember) return FALSE; } -//Task data -enum -{ - TD_STATE, - TD_PARTY_MEMBER, -}; +#define tState data[0] +#define tPartyMember data[1] void Task_WhiteOut(u8 taskId) { - s16 *taskData = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; - switch (taskData[TD_STATE]) + switch (tState) { - case 0: //Check if Pokemon have fainted due to poison - while (taskData[TD_PARTY_MEMBER] < 6) + case 0: + // Check if any Pokemon have fainted due to poison + while (tPartyMember < 6) { - if (CheckMonFaintedFromPoison(taskData[TD_PARTY_MEMBER])) + if (CheckMonFaintedFromPoison(tPartyMember)) { - MonFaintFromPoisonOnField(taskData[TD_PARTY_MEMBER]); + // Show message about fainted mon + MonFaintFromPoisonOnField(tPartyMember); ShowFieldMessage(fieldPoisonText_PokemonFainted); - taskData[TD_STATE]++; + tState++; return; } - taskData[TD_PARTY_MEMBER]++; + tPartyMember++; } - taskData[TD_STATE] = 2; + tState = 2; break; - case 1: //Wait for message box to disappear + case 1: // Wait for message box to disappear if (IsFieldMessageBoxHidden()) - taskData[TD_STATE]--; //Check next party member + tState--; // Go to previous step and check next party member break; - case 2: //Done checking Pokemon + case 2: // done checking all mons if (AllMonsFainted()) gSpecialVar_Result = 1; else @@ -102,6 +100,9 @@ void Task_WhiteOut(u8 taskId) } } +#undef tState +#undef tPartyMember + void ExecuteWhiteOut(void) { CreateTask(Task_WhiteOut, 0x50); @@ -115,26 +116,28 @@ s32 DoPoisonFieldEffect(void) u32 numFainting = 0; int i; + // count the number of mons that are poisoned and fainting from poison, + // and decrement HP of all poisoned mons for (i = 0; i < 6; i++) { u32 hp; - // UB: Too few arguments for function 'GetMonData' if (GetMonData(pkmn, MON_DATA_SANITY_BIT2) != 0 && pokemon_ailments_get_primary(GetMonData(pkmn, MON_DATA_STATUS)) == 1) { + // decrement HP of poisoned mon hp = GetMonData(pkmn, MON_DATA_HP); if (hp != 0) hp--; if (hp == 0) - numFainting++; //Pokemon will now faint due to poison + numFainting++; SetMonData(pkmn, MON_DATA_HP, &hp); numPoisoned++; } pkmn++; } if (numFainting != 0 || numPoisoned != 0) - DoFieldPoisonEffect(); + FldeffPoison_Start(); if (numFainting != 0) return 2; if (numPoisoned != 0) diff --git a/src/field/field_region_map.c b/src/field/field_region_map.c index 73e101d8f..54091459f 100644 --- a/src/field/field_region_map.c +++ b/src/field/field_region_map.c @@ -50,13 +50,13 @@ void CB2_FieldInitRegionMap(void) InitRegionMap((void *)&ewram0_5.unk8, 0); CreateRegionMapPlayerIcon(0, 0); CreateRegionMapCursor(1, 1); - SetUpWindowConfig(&gWindowConfig_81E709C); - InitMenuWindow(&gWindowConfig_81E709C); - MenuZeroFillScreen(); + Text_LoadWindowTemplate(&gWindowTemplate_81E709C); + InitMenuWindow(&gWindowTemplate_81E709C); + Menu_EraseScreen(); REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256; - MenuDrawTextWindow(21, 0, 29, 3); + Menu_DrawStdWindowFrame(21, 0, 29, 3); sub_8072BD8(gOtherText_Hoenn, 0x16, 1, 0x38); - MenuDrawTextWindow(16, 16, 29, 19); + Menu_DrawStdWindowFrame(16, 16, 29, 19); sub_813F0C8(); SetMainCallback2(CB2_FieldRegionMap); SetVBlankCallback(VBlankCB_FieldRegionMap); @@ -117,7 +117,7 @@ void sub_813EFDC(void) void sub_813F0C8(void) { - MenuFillWindowRectWithBlankTile(17, 17, 28, 18); + Menu_BlankWindowRect(17, 17, 28, 18); if (ewram0_5.unk8.unk16) - MenuPrint(ewram0_5.unk8.str, 17, 17); + Menu_PrintText(ewram0_5.unk8.str, 17, 17); } diff --git a/src/field/field_screen_effect.c b/src/field/field_screen_effect.c index a472d5a9c..61301c5a9 100644 --- a/src/field/field_screen_effect.c +++ b/src/field/field_screen_effect.c @@ -7,13 +7,13 @@ #include "script.h" #include "task.h" #include "text.h" -#include "unknown_task.h" +#include "scanline_effect.h" const static u16 gUnknown_0839ACDC[] = { 0xC8, 0x48, 0x38, 0x28, 0x18, 0x0 }; const s32 gMaxFlashLevel = 4; -const static struct UnknownTaskStruct gUnknown_0839ACEC = +const static struct ScanlineEffectParams gUnknown_0839ACEC = { (void *)REG_ADDR_WIN0H, ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1, @@ -64,18 +64,18 @@ static void sub_8081424(u8 taskId) switch (data[0]) { case 0: - sub_8081398(&gUnknown_03004DE0[gUnknown_03004DC0.srcBank][0], data[1], data[2], data[3]); + sub_8081398(gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer], data[1], data[2], data[3]); data[0] = 1; break; case 1: - sub_8081398(&gUnknown_03004DE0[gUnknown_03004DC0.srcBank][0], data[1], data[2], data[3]); + sub_8081398(gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer], data[1], data[2], data[3]); data[0] = 0; data[3] += data[5]; if (data[3] > data[4]) { if (data[6] == 1) { - remove_some_task(); + ScanlineEffect_Stop(); data[0] = 2; } else @@ -85,7 +85,7 @@ static void sub_8081424(u8 taskId) } break; case 2: - dp12_8087EA4(); + ScanlineEffect_Clear(); DestroyTask(taskId); break; } @@ -140,8 +140,8 @@ void sub_80815E0(u8 a1) { if (a1) { - sub_8081398(&gUnknown_03004DE0[0][0], 120, 80, gUnknown_0839ACDC[a1]); - CpuFastSet(&gUnknown_03004DE0[0], &gUnknown_03004DE0[1], 480); + sub_8081398(&gScanlineEffectRegBuffers[0][0], 120, 80, gUnknown_0839ACDC[a1]); + CpuFastSet(&gScanlineEffectRegBuffers[0], &gScanlineEffectRegBuffers[1], 480); } } @@ -208,14 +208,14 @@ static void sub_80816A8(u8 taskId) REG_BLDALPHA = 1804; REG_WININ = 63; REG_WINOUT = 30; - sub_8081398(&gUnknown_03004DE0[0][0], data[2], data[3], 1); - CpuFastSet(&gUnknown_03004DE0[0], &gUnknown_03004DE0[1], 480); - //sub_80895F8(gUnknown_0839ACEC[0], gUnknown_0839ACEC[1], gUnknown_0839ACEC[2]); - sub_80895F8(gUnknown_0839ACEC); + sub_8081398(&gScanlineEffectRegBuffers[0][0], data[2], data[3], 1); + CpuFastSet(&gScanlineEffectRegBuffers[0], &gScanlineEffectRegBuffers[1], 480); + //ScanlineEffect_SetParams(gUnknown_0839ACEC[0], gUnknown_0839ACEC[1], gUnknown_0839ACEC[2]); + ScanlineEffect_SetParams(gUnknown_0839ACEC); data[0] = 1; break; case 1: - MenuFillWindowRectWithBlankTile(0, 0, 29, 19); + Menu_BlankWindowRect(0, 0, 29, 19); sub_808161C(data[1]); sub_8081534(data[2], data[3], 1, 160, 1, 2); data[0] = 2; @@ -264,8 +264,8 @@ static void sub_80816A8(u8 taskId) } break; case 5: - MenuZeroFillWindowRect(0, 0, 29, 19); - LoadFontDefaultPalette(&gWindowConfig_81E6CE4); + Menu_EraseWindowRect(0, 0, 29, 19); + LoadFontDefaultPalette(&gWindowTemplate_81E6CE4); REG_WIN0H = 255; REG_DISPCNT = data[6]; REG_BLDCNT = data[7]; diff --git a/src/field/field_specials.c b/src/field/field_specials.c index fc6f690a3..e56d9ddbb 100644 --- a/src/field/field_specials.c +++ b/src/field/field_specials.c @@ -1058,21 +1058,21 @@ static void sub_810E874(void) ScriptContext2_Enable(); if (gUnknown_0203925A > 5) { - MenuDrawTextWindow(0, 0, 8, 11); + Menu_DrawStdWindowFrame(0, 0, 8, 11); InitMenu(0, 1, 1, 5, 0, 7); gUnknown_0203925C = 0; - sub_80F944C(); + ClearVerticalScrollIndicatorPalettes(); LoadScrollIndicatorPalette(); sub_810ECD4(); } else { - MenuDrawTextWindow(0, 0, 8, 2 * gUnknown_0203925A + 1); + Menu_DrawStdWindowFrame(0, 0, 8, 2 * gUnknown_0203925A + 1); InitMenu(0, 1, 1, gUnknown_0203925A, 0, 7); } for (i = 0; i < 5 && gUnknown_03000760[i].var0 != 16; i ++) { - MenuPrint(gUnknown_083F8380[gUnknown_03000760[i].var0], 1, 2 * i + 1); + Menu_PrintText(gUnknown_083F8380[gUnknown_03000760[i].var0], 1, 2 * i + 1); } DisplayCurrentElevatorFloor(); CreateTask(sub_810E984, 8); @@ -1080,7 +1080,7 @@ static void sub_810E874(void) void DisplayCurrentElevatorFloor(void) { - MenuDrawTextWindow(20, 0, 29, 5); + Menu_DrawStdWindowFrame(20, 0, 29, 5); sub_8072BD8(gOtherText_NowOn, 21, 1, 64); sub_8072BD8(gUnknown_083F8380[gSpecialVar_0x8005], 21, 3, 64); } @@ -1091,15 +1091,15 @@ void sub_810E984(u8 taskId) if (gMain.newKeys == DPAD_UP && gUnknown_0203925B != 0) { gUnknown_0203925B--; - curMenuPos = GetMenuCursorPos(); - MoveMenuCursorNoWrap(-1); + curMenuPos = Menu_GetCursorPos(); + Menu_MoveCursorNoWrap(-1); sub_810EAC8(curMenuPos, DPAD_UP); } if (gMain.newKeys == DPAD_DOWN && gUnknown_0203925B != gUnknown_0203925A - 1) { gUnknown_0203925B++; - curMenuPos = GetMenuCursorPos(); - MoveMenuCursorNoWrap(+1); + curMenuPos = Menu_GetCursorPos(); + Menu_MoveCursorNoWrap(+1); sub_810EAC8(curMenuPos, DPAD_DOWN); } if (gMain.newKeys & A_BUTTON) @@ -1109,7 +1109,7 @@ void sub_810E984(u8 taskId) { gSpecialVar_Result = 0; PlaySE(SE_SELECT); - MenuZeroFillWindowRect(0, 0, 29, 12); + Menu_EraseWindowRect(0, 0, 29, 12); sub_810EC9C(taskId); } else @@ -1119,7 +1119,7 @@ void sub_810E984(u8 taskId) ShakeScreenInElevator(); FieldObjectTurnByLocalIdAndMap(gSpecialVar_LastTalked, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, DIR_SOUTH); sub_810EEDC(); - MenuZeroFillScreen(); + Menu_EraseScreen(); DestroyTask(taskId); } } @@ -1128,7 +1128,7 @@ void sub_810E984(u8 taskId) gSpecialVar_Result = 0; PlaySE(SE_SELECT); sub_810EEDC(); - MenuZeroFillWindowRect(0, 0, 29, 12); + Menu_EraseWindowRect(0, 0, 29, 12); sub_810EC9C(taskId); } } @@ -1163,10 +1163,10 @@ bool8 sub_810EAC8(u8 prevMenuPos, u8 dpadInput) if (flag) { sub_810EB90(newPos, 5); - MenuFillWindowRectWithBlankTile(2, 1, 7, 10); + Menu_BlankWindowRect(2, 1, 7, 10); for (i=0; i<5 && gUnknown_03000760[newPos].var0 != 16; newPos++, i++) { - MenuPrint(gUnknown_083F8380[gUnknown_03000760[newPos].var0], 1, i * 2 + 1); + Menu_PrintText(gUnknown_083F8380[gUnknown_03000760[newPos].var0], 1, i * 2 + 1); } } return flag; @@ -1227,7 +1227,7 @@ bool8 sub_810EAC8(u8 prevMenuPos, u8 dpadInput) "\tmovs r1, 0x1\n" "\tmovs r2, 0x7\n" "\tmovs r3, 0xA\n" - "\tbl MenuFillWindowRectWithBlankTile\n" + "\tbl Menu_BlankWindowRect\n" "\tmovs r5, 0\n" "\tldr r2, _0810EB88 @ =gUnknown_03000760\n" "\tlsls r1, r4, 2\n" @@ -1249,7 +1249,7 @@ bool8 sub_810EAC8(u8 prevMenuPos, u8 dpadInput) "\tlsls r2, 24\n" "\tlsrs r2, 24\n" "\tmovs r1, 0x1\n" - "\tbl MenuPrint\n" + "\tbl Menu_PrintText\n" "\tadds r0, r4, 0x1\n" "\tlsls r0, 24\n" "\tlsrs r4, r0, 24\n" @@ -1283,7 +1283,7 @@ void sub_810EB90(u8 newPos, u8 maxItems) if (newPos == 0) { gUnknown_0203925C ^= 0x02; - DestroyVerticalScrollIndicator(0); + DestroyVerticalScrollIndicator(TOP_ARROW); } else { @@ -1296,7 +1296,7 @@ void sub_810EB90(u8 newPos, u8 maxItems) else if (newPos + maxItems == gUnknown_0203925A) { gUnknown_0203925C ^= 0x01; - DestroyVerticalScrollIndicator(1); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); } } @@ -1347,7 +1347,7 @@ void sub_810ECB0(void) if (gUnknown_0203925C >> 1 != 1) { gUnknown_0203925C |= 0x2; - CreateVerticalScrollIndicators(0, 0x24, 0x08); + CreateVerticalScrollIndicators(TOP_ARROW, 0x24, 0x08); } } @@ -1356,7 +1356,7 @@ void sub_810ECD4(void) if ((gUnknown_0203925C & 1) == 0) { gUnknown_0203925C |= 0x1; - CreateVerticalScrollIndicators(1, 0x24, 0x48); + CreateVerticalScrollIndicators(BOTTOM_ARROW, 0x24, 0x48); } } @@ -1428,11 +1428,11 @@ void sub_810EEDC(void) { if ((gUnknown_0203925C & 1) != 0) { - DestroyVerticalScrollIndicator(1); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); } if ((gUnknown_0203925C >> 1) == 1) { - DestroyVerticalScrollIndicator(0); + DestroyVerticalScrollIndicator(TOP_ARROW); } BuyMenuFreeMemory(); } @@ -1539,15 +1539,15 @@ void ShowGlassWorkshopMenu(void) { u8 i; ScriptContext2_Enable(); - MenuDrawTextWindow(0, 0, 10, 11); + Menu_DrawStdWindowFrame(0, 0, 10, 11); InitMenu(0, 1, 1, 5, 0, 9); gUnknown_0203925C = 0; - sub_80F944C(); + ClearVerticalScrollIndicatorPalettes(); LoadScrollIndicatorPalette(); sub_810F2B4(); for (i=0; i<5; i++) { - MenuPrint(gUnknown_083F83C0[i], 1, 2 * i + 1); + Menu_PrintText(gUnknown_083F83C0[i], 1, 2 * i + 1); } gUnknown_0203925B = 0; gUnknown_0203925A = ARRAY_COUNT(gUnknown_083F83C0); @@ -1560,33 +1560,33 @@ void sub_810F118(u8 taskId) if (gMain.newKeys == DPAD_UP && gUnknown_0203925B != 0) { gUnknown_0203925B--; - prevCursorPos = GetMenuCursorPos(); - MoveMenuCursorNoWrap(-1); + prevCursorPos = Menu_GetCursorPos(); + Menu_MoveCursorNoWrap(-1); sub_810F1F4(prevCursorPos, DPAD_UP); } if (gMain.newKeys == DPAD_DOWN && gUnknown_0203925B != gUnknown_0203925A - 1) { gUnknown_0203925B++; - prevCursorPos = GetMenuCursorPos(); - MoveMenuCursorNoWrap(1); + prevCursorPos = Menu_GetCursorPos(); + Menu_MoveCursorNoWrap(1); sub_810F1F4(prevCursorPos, DPAD_DOWN); } if (gMain.newKeys & A_BUTTON) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); gSpecialVar_Result = gUnknown_0203925B; PlaySE(SE_SELECT); sub_810EEDC(); - MenuZeroFillWindowRect(0, 0, 29, 12); + Menu_EraseWindowRect(0, 0, 29, 12); sub_810EC9C(taskId); } if (gMain.newKeys & B_BUTTON) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); gSpecialVar_Result = 0x7f; PlaySE(SE_SELECT); sub_810EEDC(); - MenuZeroFillWindowRect(0, 0, 29, 12); + Menu_EraseWindowRect(0, 0, 29, 12); sub_810EC9C(taskId); } } @@ -1621,10 +1621,10 @@ bool8 sub_810F1F4(u8 prevCursorPos, u8 dpadInput) if (flag) { GlassWorkshopUpdateScrollIndicators(newPos, 5); - MenuFillWindowRectWithBlankTile(2, 1, 9, 10); + Menu_BlankWindowRect(2, 1, 9, 10); for (i=0; i<5; newPos++, i++) { - MenuPrint(gUnknown_083F83C0[newPos], 1, 2 * i + 1); + Menu_PrintText(gUnknown_083F83C0[newPos], 1, 2 * i + 1); } } return flag; @@ -1683,7 +1683,7 @@ bool8 sub_810F1F4(u8 prevCursorPos, u8 dpadInput) "\tmovs r1, 0x1\n" "\tmovs r2, 0x9\n" "\tmovs r3, 0xA\n" - "\tbl MenuFillWindowRectWithBlankTile\n" + "\tbl Menu_BlankWindowRect\n" "\tmovs r5, 0\n" "\tldr r7, _0810F28C @ =gUnknown_083F83C0\n" "_0810F25C:\n" @@ -1695,7 +1695,7 @@ bool8 sub_810F1F4(u8 prevCursorPos, u8 dpadInput) "\tlsls r2, 24\n" "\tlsrs r2, 24\n" "\tmovs r1, 0x1\n" - "\tbl MenuPrint\n" + "\tbl Menu_PrintText\n" "\tadds r0, r4, 0x1\n" "\tlsls r0, 24\n" "\tlsrs r4, r0, 24\n" @@ -1721,7 +1721,7 @@ void sub_810F290(void) if (gUnknown_0203925C >> 1 != 1) { gUnknown_0203925C |= 0x02; - CreateVerticalScrollIndicators(0, 0x2c, 0x08); + CreateVerticalScrollIndicators(TOP_ARROW, 0x2c, 0x08); } } @@ -1730,7 +1730,7 @@ void sub_810F2B4(void) if (!(gUnknown_0203925C & 0x01)) { gUnknown_0203925C |= 0x01; - CreateVerticalScrollIndicators(1, 0x2c, 0x58); + CreateVerticalScrollIndicators(BOTTOM_ARROW, 0x2c, 0x58); } } @@ -1739,7 +1739,7 @@ void GlassWorkshopUpdateScrollIndicators(u8 newPos, u8 maxItems) if (newPos == 0) { gUnknown_0203925C ^= 0x02; - DestroyVerticalScrollIndicator(0); + DestroyVerticalScrollIndicator(TOP_ARROW); } else { @@ -1752,7 +1752,7 @@ void GlassWorkshopUpdateScrollIndicators(u8 newPos, u8 maxItems) else if (newPos + maxItems == gUnknown_0203925A) { gUnknown_0203925C ^= 0x01; - DestroyVerticalScrollIndicator(1); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); } } diff --git a/src/field/field_weather.c b/src/field/field_weather.c index 4a819bddf..fbc5431ae 100644 --- a/src/field/field_weather.c +++ b/src/field/field_weather.c @@ -13,7 +13,13 @@ #include "trig.h" #include "ewram.h" -#define MACRO1(a) ((((a) >> 1) & 0xF) | (((a) >> 2) & 0xF0) | (((a) >> 3) & 0xF00)) +#define MACRO1(color) ((((color) >> 1) & 0xF) | (((color) >> 2) & 0xF0) | (((color) >> 3) & 0xF00)) + +enum { + GAMMA_NONE, + GAMMA_NORMAL, + GAMMA_ALT, +}; struct RGBColor { @@ -24,7 +30,7 @@ struct RGBColor struct WeatherPaletteData { - u16 data[0][0x1000]; // unknown length + u16 gammaShiftColors[8][0x1000]; // 0x1000 is the number of bytes that make up all palettes. }; struct WeatherCallbacks @@ -35,10 +41,14 @@ struct WeatherCallbacks bool8 (*finish)(void); }; -extern struct Weather gWeather; -extern u8 gUnknown_0202FF38[]; -extern u16 gUnknown_0202FF58; -IWRAM_DATA const u8 *gUnknown_030006DC; +EWRAM_DATA struct Weather gWeather = {0}; +EWRAM_DATA u8 gFieldEffectPaletteGammaTypes[32] = {0}; +EWRAM_DATA u16 gUnknown_0202FF58 = 0; +#if DEBUG +EWRAM_DATA u16 gUnknown_Debug_20301FE = 0; +#endif + +static const u8 *sPaletteGammaTypes; const u8 DroughtPaletteData_0[] = INCBIN_U8("graphics/weather/drought0.bin.lz"); const u8 DroughtPaletteData_1[] = INCBIN_U8("graphics/weather/drought1.bin.lz"); @@ -46,8 +56,6 @@ const u8 DroughtPaletteData_2[] = INCBIN_U8("graphics/weather/drought2.bin.lz"); const u8 DroughtPaletteData_3[] = INCBIN_U8("graphics/weather/drought3.bin.lz"); const u8 DroughtPaletteData_4[] = INCBIN_U8("graphics/weather/drought4.bin.lz"); const u8 DroughtPaletteData_5[] = INCBIN_U8("graphics/weather/drought5.bin.lz"); -extern u8 (*gUnknown_0202FC48)[32]; -extern u8 gUnknown_0202F9E8[32]; static const u8 *const sCompressedDroughtPalettes[] = { @@ -57,7 +65,7 @@ static const u8 *const sCompressedDroughtPalettes[] = DroughtPaletteData_3, DroughtPaletteData_4, DroughtPaletteData_5, - gSharedMem, + (u8*)eDroughtPaletteData.gammaShiftColors, }; // This is a pointer to gWeather. All code in this file accesses gWeather directly, @@ -66,6 +74,18 @@ static const u8 *const sCompressedDroughtPalettes[] = // this file produces the same result as accessing gWeather directly. struct Weather *const gWeatherPtr = &gWeather; +static bool8 LightenSpritePaletteInFog(u8); +static void BuildGammaShiftTables(void); +static void UpdateWeatherGammaShift(void); +static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex); +static void ApplyGammaShiftWithBlend(u8 startPalIndex, u8 numPalettes, s8 gammaIndex, u8 blendCoeff, u16 blendColor); +static void ApplyDroughtGammaShiftWithBlend(s8 gammaIndex, u8 blendCoeff, u16 blendColor); +static void ApplyFogBlend(u8 blendCoeff, u16 blendColor); +static bool8 FadeInScreen_RainShowShade(void); +static bool8 FadeInScreen_Drought(void); +static bool8 FadeInScreen_Fog1(void); +static void FadeInScreenWithWeather(void); +static void DoNothing(void); void None_Init(void); void None_Main(void); bool8 None_Finish(void); @@ -109,10 +129,10 @@ void Fog1_InitVars(void); void Fog1_Main(void); void Fog1_InitAll(void); bool8 Fog1_Finish(void); -void Weather11_InitVars(void); -void Weather11_Main(void); -void Weather11_InitAll(void); -bool8 Weather11_Finish(void); +void Shade_InitVars(void); +void Shade_Main(void); +void Shade_InitAll(void); +bool8 Shade_Finish(void); void Drought_InitVars(void); void Drought_Main(void); void Drought_InitAll(void); @@ -131,7 +151,7 @@ static const struct WeatherCallbacks sWeatherFuncs[] = {None_Init, None_Main, None_Init, None_Finish}, {Clouds_InitVars, Clouds_Main, Clouds_InitAll, Clouds_Finish}, {Weather2_InitVars, Weather2_Main, Weather2_InitAll, Weather2_Finish}, - {LightRain_InitVars, LightRain_Main, LightRain_InitAll, LightRain_Finish}, // light rain + {LightRain_InitVars, LightRain_Main, LightRain_InitAll, LightRain_Finish}, {Snow_InitVars, Snow_Main, Snow_InitAll, Snow_Finish}, {MedRain_InitVars, Rain_Main, MedRain_InitAll, Rain_Finish}, {Fog1_InitVars, Fog1_Main, Fog1_InitAll, Fog1_Finish}, @@ -139,68 +159,112 @@ static const struct WeatherCallbacks sWeatherFuncs[] = {Sandstorm_InitVars, Sandstorm_Main, Sandstorm_InitAll, Sandstorm_Finish}, {Fog2_InitVars, Fog2_Main, Fog2_InitAll, Fog2_Finish}, {Fog1_InitVars, Fog1_Main, Fog1_InitAll, Fog1_Finish}, - {Weather11_InitVars, Weather11_Main, Weather11_InitAll, Weather11_Finish}, + {Shade_InitVars, Shade_Main, Shade_InitAll, Shade_Finish}, {Drought_InitVars, Drought_Main, Drought_InitAll, Drought_Finish}, {HeavyRain_InitVars, Rain_Main, HeavyRain_InitAll, Rain_Finish}, {Bubbles_InitVars, Bubbles_Main, Bubbles_InitAll, Bubbles_Finish}, }; -void (*const gUnknown_083970B8[])(void) = +void (*const gWeatherPalStateFuncs[])(void) = { - sub_807CC24, - sub_807CCAC, - nullsub_39, - nullsub_39, + UpdateWeatherGammaShift, // WEATHER_PAL_STATE_CHANGING_WEATHER + FadeInScreenWithWeather, // WEATHER_PAL_STATE_SCREEN_FADING_IN + DoNothing, // WEATHER_PAL_STATE_SCREEN_FADING_OUT + DoNothing, // WEATHER_PAL_STATE_IDLE }; -const u8 gUnknown_083970C8[] = +// This table specifies which of the gamma shift tables should be +// applied to each of the background and sprite palettes. +static const u8 sBasePaletteGammaTypes[32] = { - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 2, - 1, - 2, - 2, - 2, - 2, - 1, - 1, - 1, - 1, - 2, - 1, - 1, - 1, - 1, - 1, + // background palettes + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NONE, + GAMMA_NONE, + // sprite palettes + GAMMA_ALT, + GAMMA_NORMAL, + GAMMA_ALT, + GAMMA_ALT, + GAMMA_ALT, + GAMMA_ALT, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_ALT, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, }; +#if DEBUG + +const u8 gDebugText_Weather_0[] = _("なし "); +const u8 gDebugText_Weather_1[] = _("はれ "); +const u8 gDebugText_Weather_2[] = _("はれ2 "); +const u8 gDebugText_Weather_3[] = _("あめ "); +const u8 gDebugText_Weather_4[] = _("ゆき "); +const u8 gDebugText_Weather_5[] = _("かみなり "); +const u8 gDebugText_Weather_6[] = _("きり "); +const u8 gDebugText_Weather_7[] = _("かざんばい"); +const u8 gDebugText_Weather_8[] = _("すなあらし"); +const u8 gDebugText_Weather_9[] = _("きり2 "); +const u8 gDebugText_Weather_10[] = _("かいてい "); +const u8 gDebugText_Weather_11[] = _("くもり "); +const u8 gDebugText_Weather_12[] = _("はれ3 "); +const u8 gDebugText_Weather_13[] = _("おおあめ"); +const u8 gDebugText_Weather_14[] = _("かいてい2"); + +const u8 *const gDebugText_Weather[] = +{ + gDebugText_Weather_0, + gDebugText_Weather_1, + gDebugText_Weather_2, + gDebugText_Weather_3, + gDebugText_Weather_4, + gDebugText_Weather_5, + gDebugText_Weather_6, + gDebugText_Weather_7, + gDebugText_Weather_8, + gDebugText_Weather_9, + gDebugText_Weather_10, + gDebugText_Weather_11, + gDebugText_Weather_12, + gDebugText_Weather_13, + gDebugText_Weather_14, +}; + +#endif + const u16 gUnknown_083970E8[] = INCBIN_U16("graphics/weather/0.gbapal"); void StartWeather(void) { u8 index; + if (!FuncIsActiveTask(Task_WeatherMain)) { index = AllocSpritePalette(0x1200); CpuCopy32(gUnknown_083970E8, &gPlttBufferUnfaded[0x100 + index * 16], 32); - sub_807CB10(); - gWeatherPtr->unknown_6D5 = index; - gWeatherPtr->unknown_6D4 = AllocSpritePalette(0x1201); + BuildGammaShiftTables(); + gWeatherPtr->altGammaSpritePalIndex = index; + gWeatherPtr->weatherPicSpritePalIndex = AllocSpritePalette(0x1201); gWeatherPtr->rainSpriteCount = 0; gWeatherPtr->unknown_6D8 = 0; gWeatherPtr->cloudSpritesCreated = 0; @@ -211,49 +275,53 @@ void StartWeather(void) gWeatherPtr->sandstormSprites1Created = 0; gWeatherPtr->sandstormSprites2Created = 0; gWeatherPtr->unknown_72E = 0; - gWeatherPtr->unknown_6FA = 0; + gWeatherPtr->lightenedFogSpritePalsCount = 0; Weather_SetBlendCoeffs(16, 0); gWeatherPtr->currWeather = 0; - gWeatherPtr->unknown_6C6 = 3; - gWeatherPtr->unknown_6C8 = 0; - gWeatherPtr->unknown_6D3 = 1; - gWeatherPtr->unknown_6C9 = CreateTask(Task_WeatherInit, 80); + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; + gWeatherPtr->readyForInit = FALSE; + gWeatherPtr->weatherChangeComplete = TRUE; + gWeatherPtr->taskId = CreateTask(Task_WeatherInit, 80); } } -void DoWeatherEffect(u8 effect) +void ChangeWeather(u8 weather) { - if (effect != WEATHER_RAIN_LIGHT && effect != WEATHER_RAIN_MED && effect != WEATHER_RAIN_HEAVY) + if (weather != WEATHER_RAIN_LIGHT && weather != WEATHER_RAIN_MED && weather != WEATHER_RAIN_HEAVY) { PlayRainSoundEffect(); } - if (gWeatherPtr->nextWeather != effect && gWeatherPtr->currWeather == effect) + + if (gWeatherPtr->nextWeather != weather && gWeatherPtr->currWeather == weather) { - sWeatherFuncs[effect].initVars(); + sWeatherFuncs[weather].initVars(); } - gWeatherPtr->unknown_6D3 = 0; - gWeatherPtr->nextWeather = effect; + + gWeatherPtr->weatherChangeComplete = FALSE; + gWeatherPtr->nextWeather = weather; gWeatherPtr->finishStep = 0; } -void sub_807C988(u8 effect) +void sub_807C988(u8 weather) { PlayRainSoundEffect(); - gWeatherPtr->currWeather = effect; - gWeatherPtr->nextWeather = effect; + gWeatherPtr->currWeather = weather; + gWeatherPtr->nextWeather = weather; } -void sub_807C9B4(u8 effect) +void sub_807C9B4(u8 weather) { PlayRainSoundEffect(); - gWeatherPtr->currWeather = effect; - gWeatherPtr->nextWeather = effect; - gWeatherPtr->unknown_6C8 = 1; + gWeatherPtr->currWeather = weather; + gWeatherPtr->nextWeather = weather; + gWeatherPtr->readyForInit = TRUE; } void Task_WeatherInit(u8 taskId) { - if (gWeatherPtr->unknown_6C8) + // Waits until it's ok to initialize weather. + // When the screen fades in, this is set to TRUE. + if (gWeatherPtr->readyForInit) { sWeatherFuncs[gWeatherPtr->currWeather].initAll(); gTasks[taskId].func = Task_WeatherMain; @@ -266,24 +334,26 @@ void Task_WeatherMain(u8 taskId) { if (!sWeatherFuncs[gWeatherPtr->currWeather].finish()) { + // Finished cleaning up previous weather. Now transition to next weather. sWeatherFuncs[gWeatherPtr->nextWeather].initVars(); - gWeatherPtr->unknown_6C3 = 0; - gWeatherPtr->unknown_6C6 = 0; + gWeatherPtr->gammaStepFrameCounter = 0; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_CHANGING_WEATHER; gWeatherPtr->currWeather = gWeatherPtr->nextWeather; - gWeatherPtr->unknown_6D3 = 1; + gWeatherPtr->weatherChangeComplete = TRUE; } } else { sWeatherFuncs[gWeatherPtr->currWeather].main(); } - gUnknown_083970B8[gWeatherPtr->unknown_6C6](); + + gWeatherPalStateFuncs[gWeatherPtr->palProcessingState](); } void None_Init(void) { - gWeatherPtr->unknown_6C1 = 0; - gWeatherPtr->unknown_6C2 = 0; + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 0; } void None_Main(void) @@ -295,7 +365,10 @@ u8 None_Finish(void) return 0; } -void sub_807CB10(void) +// Builds two tables that contain gamma shifts for palette colors. +// It's unclear why the two tables aren't declared as const arrays, since +// this function always builds the same two tables. +static void BuildGammaShiftTables(void) { u16 v0; u8 (*v1)[32]; @@ -308,15 +381,15 @@ void sub_807CB10(void) u16 v11; s16 dunno; - gUnknown_030006DC = gUnknown_083970C8; + sPaletteGammaTypes = sBasePaletteGammaTypes; for (v0 = 0; v0 <= 1; v0++) { if (v0 == 0) - v1 = gWeatherPtr->unknown_200; + v1 = gWeatherPtr->gammaShifts; else - v1 = gWeatherPtr->unk460; + v1 = gWeatherPtr->altGammaShifts; - for (v2 = 0; (u16)v2 <= 0x1f; v2++) + for (v2 = 0; v2 < 32; v2++) { v4 = v2 << 8; if (v0 == 0) @@ -335,88 +408,86 @@ void sub_807CB10(void) v10 += 0xf; } v11 = v10 >> 4; - if (v2 <= 0xb) + if (v2 < 12) { - for (; v6 <= 0x12; v6++) + for (; v6 < 19; v6++) { v4 += v11; dunno = v4 - v9; if (dunno > 0) - { v4 -= (dunno + ((u16)dunno >> 15)) >> 1; - } v1[v6][v2] = v4 >> 8; if (v1[v6][v2] > 0x1f) - { v1[v6][v2] = 0x1f; - } } } else { - for (; v6 <= 0x12; v6++) + for (; v6 < 19; v6++) { v4 += v11; v1[v6][v2] = v4 >> 8; if (v1[v6][v2] > 0x1f) - { v1[v6][v2] = 0x1f; - } } } } } } -void sub_807CC24(void) +// When the weather is changing, it gradually updates the palettes +// towards the desired gamma shift. +static void UpdateWeatherGammaShift(void) { - if (gWeatherPtr->unknown_6C0 == gWeatherPtr->unknown_6C1) + if (gWeatherPtr->gammaIndex == gWeatherPtr->gammaTargetIndex) { - gWeatherPtr->unknown_6C6 = 3; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; } else { - if (++gWeatherPtr->unknown_6C3 >= gWeatherPtr->unknown_6C2) + if (++gWeatherPtr->gammaStepFrameCounter >= gWeatherPtr->gammaStepDelay) { - gWeatherPtr->unknown_6C3 = 0; - if (gWeatherPtr->unknown_6C0 < gWeatherPtr->unknown_6C1) - gWeatherPtr->unknown_6C0++; + gWeatherPtr->gammaStepFrameCounter = 0; + if (gWeatherPtr->gammaIndex < gWeatherPtr->gammaTargetIndex) + gWeatherPtr->gammaIndex++; else - gWeatherPtr->unknown_6C0--; - sub_807CEBC(0, 0x20, gWeatherPtr->unknown_6C0); + gWeatherPtr->gammaIndex--; + + ApplyGammaShift(0, 32, gWeatherPtr->gammaIndex); } } } -void sub_807CCAC(void) +static void FadeInScreenWithWeather(void) { if (++gWeatherPtr->unknown_6CB > 1) gWeatherPtr->unknown_6CA = 0; + switch (gWeatherPtr->currWeather) { case WEATHER_RAIN_LIGHT: case WEATHER_RAIN_MED: case WEATHER_RAIN_HEAVY: case WEATHER_SNOW: - case WEATHER_DARK: - if (sub_807CDC4() == 0) + case WEATHER_SHADE: + if (FadeInScreen_RainShowShade() == FALSE) { - gWeatherPtr->unknown_6C0 = 3; - gWeatherPtr->unknown_6C6 = 3; + gWeatherPtr->gammaIndex = 3; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; } break; case WEATHER_DROUGHT: - if (sub_807CE24() == 0) + if (FadeInScreen_Drought() == FALSE) { - gWeatherPtr->unknown_6C0 = -6; - gWeatherPtr->unknown_6C6 = 3; + gWeatherPtr->gammaIndex = -6; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; } break; case WEATHER_FOG_1: - if (sub_807CE7C() == 0) + if (FadeInScreen_Fog1() == FALSE) { - gWeatherPtr->unknown_6C0 = 0; - gWeatherPtr->unknown_6C6 = 3; + gWeatherPtr->gammaIndex = 0; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; } break; case WEATHER_ASH: @@ -426,71 +497,78 @@ void sub_807CCAC(void) default: if (!gPaletteFade.active) { - gWeatherPtr->unknown_6C0 = gWeatherPtr->unknown_6C1; - gWeatherPtr->unknown_6C6 = 3; + gWeatherPtr->gammaIndex = gWeatherPtr->gammaTargetIndex; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; } break; } } -u8 sub_807CDC4(void) +bool8 FadeInScreen_RainShowShade(void) { - if (gWeatherPtr->unknown_6C7 == 0x10) - return 0; - if (++gWeatherPtr->unknown_6C7 >= 0x10) + if (gWeatherPtr->fadeScreenCounter == 16) + return FALSE; + + if (++gWeatherPtr->fadeScreenCounter >= 16) { - sub_807CEBC(0, 0x20, 3); - gWeatherPtr->unknown_6C7 = 0x10; - return 0; + ApplyGammaShift(0, 32, 3); + gWeatherPtr->fadeScreenCounter = 16; + return FALSE; } - sub_807D1BC(0, 0x20, 3, 0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->unknown_6C4); - return 1; + + ApplyGammaShiftWithBlend(0, 32, 3, 16 - gWeatherPtr->fadeScreenCounter, gWeatherPtr->fadeDestColor); + return TRUE; } -u8 sub_807CE24(void) +bool8 FadeInScreen_Drought(void) { - if (gWeatherPtr->unknown_6C7 == 0x10) - return 0; - if (++gWeatherPtr->unknown_6C7 >= 0x10) + if (gWeatherPtr->fadeScreenCounter == 16) + return FALSE; + + if (++gWeatherPtr->fadeScreenCounter >= 16) { - sub_807CEBC(0, 0x20, -6); - gWeatherPtr->unknown_6C7 = 0x10; - return 0; + ApplyGammaShift(0, 32, -6); + gWeatherPtr->fadeScreenCounter = 16; + return FALSE; } - sub_807D304(-6, 0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->unknown_6C4); - return 1; -} -u8 sub_807CE7C(void) -{ - if (gWeatherPtr->unknown_6C7 == 0x10) - return 0; - ++gWeatherPtr->unknown_6C7; - sub_807D424(0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->unknown_6C4); - return 1; + ApplyDroughtGammaShiftWithBlend(-6, 16 - gWeatherPtr->fadeScreenCounter, gWeatherPtr->fadeDestColor); + return TRUE; } -void nullsub_39(void) +bool8 FadeInScreen_Fog1(void) { + if (gWeatherPtr->fadeScreenCounter == 16) + return FALSE; + + gWeatherPtr->fadeScreenCounter++; + ApplyFogBlend(16 - gWeatherPtr->fadeScreenCounter, gWeatherPtr->fadeDestColor); + return TRUE; } -void sub_807CEBC(u8 a, u8 b, s8 c) +static void DoNothing(void) +{ } + +static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex) { - u16 r4; + u16 curPalIndex; u16 palOffset; - u8 *r6; + u8 *gammaTable; u16 i; - if (c > 0) + if (gammaIndex > 0) { - c = c - 1; - palOffset = a * 16; - b += a; - r4 = a; - while (r4 < b) + gammaIndex--; + palOffset = startPalIndex * 16; + numPalettes += startPalIndex; + curPalIndex = startPalIndex; + + // Loop through the speficied palette range and apply necessary gamma shifts to the colors. + while (curPalIndex < numPalettes) { - if (gUnknown_030006DC[r4] == 0) + if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) { + // No palette change. CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 16 * sizeof(u16)); palOffset += 16; } @@ -498,25 +576,27 @@ void sub_807CEBC(u8 a, u8 b, s8 c) { u8 r, g, b; - if (gUnknown_030006DC[r4] == 2 || r4 - 16 == gWeatherPtr->unknown_6D5) - r6 = gWeatherPtr->unk460[c]; + if (sPaletteGammaTypes[curPalIndex] == GAMMA_ALT || curPalIndex - 16 == gWeatherPtr->altGammaSpritePalIndex) + gammaTable = gWeatherPtr->altGammaShifts[gammaIndex]; else - r6 = gWeatherPtr->unknown_200[c]; - if (r4 == 16 || r4 > 0x1B) + gammaTable = gWeatherPtr->gammaShifts[gammaIndex]; + + if (curPalIndex == 16 || curPalIndex > 27) { for (i = 0; i < 16; i++) { - if (gPlttBufferUnfaded[palOffset] == 0x2D9F) + if (gPlttBufferUnfaded[palOffset] == RGB(31, 12, 11)) { + // Skip gamma shift for this specific color. (Why?) palOffset++; } else { - struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; - - r = r6[color.r]; - g = r6[color.g]; - b = r6[color.b]; + // Apply gamma shift to the original color. + struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; + r = gammaTable[baseColor.r]; + g = gammaTable[baseColor.g]; + b = gammaTable[baseColor.b]; gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r; } } @@ -525,39 +605,45 @@ void sub_807CEBC(u8 a, u8 b, s8 c) { for (i = 0; i < 16; i++) { - struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; - - r = r6[color.r]; - g = r6[color.g]; - b = r6[color.b]; + // Apply gamma shift to the original color. + struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; + r = gammaTable[baseColor.r]; + g = gammaTable[baseColor.g]; + b = gammaTable[baseColor.b]; gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r; } } } - r4++; + + curPalIndex++; } } - else if (c < 0) + else if (gammaIndex < 0) { - c = -c - 1; - palOffset = a * 16; - b += a; - r4 = a; - while (r4 < b) + // A negative gammIndex value means that the blending will come from the special Drought weather's palette tables. + gammaIndex = -gammaIndex - 1; + palOffset = startPalIndex * 16; + numPalettes += startPalIndex; + curPalIndex = startPalIndex; + + while (curPalIndex < numPalettes) { - if (gUnknown_030006DC[r4] == 0) + if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) { + // No palette change. CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 16 * sizeof(u16)); palOffset += 16; } else { - if (r4 == 16 || r4 > 0x1B) + if (curPalIndex == 16 || curPalIndex > 27) { for (i = 0; i < 16; i++) { - if (gPlttBufferUnfaded[palOffset] != 0x2D9F) - gPlttBufferFaded[palOffset] = eWeatherPaletteData.data[c][MACRO1(gPlttBufferUnfaded[palOffset])]; + // Skip gamma shift for this specific color. (Why?) + if (gPlttBufferUnfaded[palOffset] != RGB(31, 12, 11)) + gPlttBufferFaded[palOffset] = eDroughtPaletteData.gammaShiftColors[gammaIndex][MACRO1(gPlttBufferUnfaded[palOffset])]; + palOffset++; } } @@ -565,93 +651,100 @@ void sub_807CEBC(u8 a, u8 b, s8 c) { for (i = 0; i < 16; i++) { - gPlttBufferFaded[palOffset] = eWeatherPaletteData.data[c][MACRO1(gPlttBufferUnfaded[palOffset])]; + gPlttBufferFaded[palOffset] = eDroughtPaletteData.gammaShiftColors[gammaIndex][MACRO1(gPlttBufferUnfaded[palOffset])]; palOffset++; } } } - r4++; + + curPalIndex++; } } else { - CpuFastCopy(gPlttBufferUnfaded + a * 16, gPlttBufferFaded + a * 16, b * 16 * sizeof(u16)); + // No palette blending. + CpuFastCopy(gPlttBufferUnfaded + startPalIndex * 16, gPlttBufferFaded + startPalIndex * 16, numPalettes * 16 * sizeof(u16)); } } -void sub_807D1BC(u8 a1, u8 a2, s8 c, u8 d, u16 e) +static void ApplyGammaShiftWithBlend(u8 startPalIndex, u8 numPalettes, s8 gammaIndex, u8 blendCoeff, u16 blendColor) { u16 palOffset; - u16 r4; + u16 curPalIndex; u16 i; - struct RGBColor color = *(struct RGBColor *)&e; - u8 r_ = color.r; - u8 g_ = color.g; - u8 b_ = color.b; - - palOffset = a1 * 16; - a2 += a1; - c = c - 1; - r4 = a1; - while (r4 < a2) + struct RGBColor color = *(struct RGBColor *)&blendColor; + u8 rBlend = color.r; + u8 gBlend = color.g; + u8 bBlend = color.b; + + palOffset = startPalIndex * 16; + numPalettes += startPalIndex; + gammaIndex--; + curPalIndex = startPalIndex; + + while (curPalIndex < numPalettes) { - if (gUnknown_030006DC[r4] == 0) + if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) { - BlendPalette(palOffset, 16, d, e); + // No gamma shift. Simply blend the colors. + BlendPalette(palOffset, 16, blendCoeff, blendColor); palOffset += 16; } else { - u8 *r5; + u8 *gammaTable; - if (gUnknown_030006DC[r4] == 1) - r5 = gWeatherPtr->unknown_200[c]; + if (sPaletteGammaTypes[curPalIndex] == GAMMA_NORMAL) + gammaTable = gWeatherPtr->gammaShifts[gammaIndex]; else - r5 = gWeatherPtr->unk460[c]; + gammaTable = gWeatherPtr->altGammaShifts[gammaIndex]; for (i = 0; i < 16; i++) { - struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; - u8 r = r5[color.r]; - u8 g = r5[color.g]; - u8 b = r5[color.b]; - - r += ((r_ - r) * d) >> 4; - g += ((g_ - g) * d) >> 4; - b += ((b_ - b) * d) >> 4; + struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; + u8 r = gammaTable[baseColor.r]; + u8 g = gammaTable[baseColor.g]; + u8 b = gammaTable[baseColor.b]; + + // Apply gamma shift and target blend color to the original color. + r += ((rBlend - r) * blendCoeff) >> 4; + g += ((gBlend - g) * blendCoeff) >> 4; + b += ((bBlend - b) * blendCoeff) >> 4; gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r; } } - r4++; + + curPalIndex++; } } -void sub_807D304(s8 a, u8 coeff, u16 c) +void ApplyDroughtGammaShiftWithBlend(s8 gammaIndex, u8 blendCoeff, u16 blendColor) { struct RGBColor color; - u8 r_; - u8 g_; - u8 b_; - u16 r4; + u8 rBlend; + u8 gBlend; + u8 bBlend; + u16 curPalIndex; u16 palOffset; - u16 r12; + u16 i; - a = -a - 1; - color = *(struct RGBColor *)&c; - r_ = color.r; - g_ = color.g; - b_ = color.b; + gammaIndex = -gammaIndex - 1; + color = *(struct RGBColor *)&blendColor; + rBlend = color.r; + gBlend = color.g; + bBlend = color.b; palOffset = 0; - for (r4 = 0; r4 < 32; r4++) + for (curPalIndex = 0; curPalIndex < 32; curPalIndex++) { - if (gUnknown_030006DC[r4] == 0) + if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) { - BlendPalette(palOffset, 16, coeff, c); + // No gamma shift. Simply blend the colors. + BlendPalette(palOffset, 16, blendCoeff, blendColor); palOffset += 16; } else { - for (r12 = 0; r12 < 16; r12++) + for (i = 0; i < 16; i++) { u32 offset; struct RGBColor color1; @@ -665,14 +758,14 @@ void sub_807D304(s8 a, u8 coeff, u16 c) b1 = color1.b; offset = ((b1 & 0x1E) << 7) | ((g1 & 0x1E) << 3) | ((r1 & 0x1E) >> 1); - color2 = *(struct RGBColor *)&eWeatherPaletteData.data[a][offset]; + color2 = *(struct RGBColor *)&eDroughtPaletteData.gammaShiftColors[gammaIndex][offset]; r2 = color2.r; g2 = color2.g; b2 = color2.b; - r2 += ((r_ - r2) * coeff) >> 4; - g2 += ((g_ - g2) * coeff) >> 4; - b2 += ((b_ - b2) * coeff) >> 4; + r2 += ((rBlend - r2) * blendCoeff) >> 4; + g2 += ((gBlend - g2) * blendCoeff) >> 4; + b2 += ((bBlend - b2) * blendCoeff) >> 4; gPlttBufferFaded[palOffset++] = (b2 << 10) | (g2 << 5) | r2; } @@ -680,33 +773,30 @@ void sub_807D304(s8 a, u8 coeff, u16 c) } } -bool8 sub_807D574(u8); - -void sub_807D424(u8 a, u16 b) +void ApplyFogBlend(u8 blendCoeff, u16 blendColor) { struct RGBColor color; - u8 r_; - u8 g_; - u8 b_; - u16 r4; - - BlendPalette(0, 0x100, a, b); - color = *(struct RGBColor *)&b; - r_ = color.r; - g_ = color.g; - b_ = color.b; - - r4 = 16; - while (r4 < 32) + u8 rBlend; + u8 gBlend; + u8 bBlend; + u16 curPalIndex; + + BlendPalette(0, 0x100, blendCoeff, blendColor); + color = *(struct RGBColor *)&blendColor; + rBlend = color.r; + gBlend = color.g; + bBlend = color.b; + + for (curPalIndex = 16; curPalIndex < 32; curPalIndex++) { - if (sub_807D574(r4)) + if (LightenSpritePaletteInFog(curPalIndex)) { - u16 r12 = (r4 + 1) * 16; - u16 r6 = r4 * 16; + u16 palEnd = (curPalIndex + 1) * 16; + u16 palOffset = curPalIndex * 16; - while (r6 < r12) + while (palOffset < palEnd) { - struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[r6]; + struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; u8 r = color.r; u8 g = color.g; u8 b = color.b; @@ -715,88 +805,88 @@ void sub_807D424(u8 a, u16 b) g += ((31 - g) * 3) >> 2; b += ((28 - b) * 3) >> 2; - r += ((r_ - r) * a) >> 4; - g += ((g_ - g) * a) >> 4; - b += ((b_ - b) * a) >> 4; + r += ((rBlend - r) * blendCoeff) >> 4; + g += ((gBlend - g) * blendCoeff) >> 4; + b += ((bBlend - b) * blendCoeff) >> 4; - gPlttBufferFaded[r6] = (b << 10) | (g << 5) | r; - r6++; + gPlttBufferFaded[palOffset] = (b << 10) | (g << 5) | r; + palOffset++; } } else { - BlendPalette(r4 * 16, 16, a, b); + BlendPalette(curPalIndex * 16, 16, blendCoeff, blendColor); } - r4++; } } -void sub_807D540(u8 a) +static void MarkFogSpritePalToLighten(u8 paletteIndex) { - if (gWeatherPtr->unknown_6FA < 6) + if (gWeatherPtr->lightenedFogSpritePalsCount < 6) { - gWeatherPtr->unknown_6F4[gWeatherPtr->unknown_6FA] = a; - gWeatherPtr->unknown_6FA++; + gWeatherPtr->lightenedFogSpritePals[gWeatherPtr->lightenedFogSpritePalsCount] = paletteIndex; + gWeatherPtr->lightenedFogSpritePalsCount++; } } -bool8 sub_807D574(u8 a) +static bool8 LightenSpritePaletteInFog(u8 paletteIndex) { u16 i; - for (i = 0; i < gWeatherPtr->unknown_6FA; i++) + for (i = 0; i < gWeatherPtr->lightenedFogSpritePalsCount; i++) { - if (gWeatherPtr->unknown_6F4[i] == a) + if (gWeatherPtr->lightenedFogSpritePals[i] == paletteIndex) return TRUE; } + return FALSE; } -void sub_807D5BC(s8 a) +void sub_807D5BC(s8 gammaIndex) { - if (gWeatherPtr->unknown_6C6 == 3) + if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE) { - sub_807CEBC(0, 32, a); - gWeatherPtr->unknown_6C0 = a; + ApplyGammaShift(0, 32, gammaIndex); + gWeatherPtr->gammaIndex = gammaIndex; } } -void sub_807D5F0(u8 a, u8 b, u8 c) +void sub_807D5F0(u8 gammaIndex, u8 gammaTargetIndex, u8 gammaStepDelay) { - if (gWeatherPtr->unknown_6C6 == 3) + if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE) { - gWeatherPtr->unknown_6C6 = 0; - gWeatherPtr->unknown_6C0 = a; - gWeatherPtr->unknown_6C1 = b; - gWeatherPtr->unknown_6C3 = 0; - gWeatherPtr->unknown_6C2 = c; - sub_807D5BC(a); + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_CHANGING_WEATHER; + gWeatherPtr->gammaIndex = gammaIndex; + gWeatherPtr->gammaTargetIndex = gammaTargetIndex; + gWeatherPtr->gammaStepFrameCounter = 0; + gWeatherPtr->gammaStepDelay = gammaStepDelay; + sub_807D5BC(gammaIndex); } } -void fade_screen(u8 a, u8 delay) +void FadeScreen(u8 mode, u8 delay) { u32 fadeColor; - u32 r1; - u32 r2; + bool8 fadeOut; + bool8 useWeatherPal; - switch (a) + switch (mode) { - case 0: + case FADE_FROM_BLACK: fadeColor = 0; - r1 = 0; + fadeOut = FALSE; break; - case 2: + case FADE_FROM_WHITE: fadeColor = 0xFFFF; - r1 = 0; + fadeOut = FALSE; break; - case 1: + case FADE_TO_BLACK: fadeColor = 0; - r1 = 1; + fadeOut = TRUE; break; - case 3: + case FADE_TO_WHITE: fadeColor = 0xFFFF; - r1 = 1; + fadeOut = TRUE; break; default: return; @@ -809,145 +899,149 @@ void fade_screen(u8 a, u8 delay) case WEATHER_RAIN_HEAVY: case WEATHER_SNOW: case WEATHER_FOG_1: - case WEATHER_DARK: + case WEATHER_SHADE: case WEATHER_DROUGHT: - r2 = 1; + useWeatherPal = TRUE; break; default: - r2 = 0; + useWeatherPal = FALSE; break; } - if (r1 != 0) + if (fadeOut) { - if (r2 != 0) + if (useWeatherPal) CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, 0x400); + BeginNormalPaletteFade(0xFFFFFFFF, delay, 0, 16, fadeColor); - gWeatherPtr->unknown_6C6 = 2; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_OUT; } else { - gWeatherPtr->unknown_6C4 = fadeColor; - if (r2 != 0) - gWeatherPtr->unknown_6C7 = 0; + gWeatherPtr->fadeDestColor = fadeColor; + if (useWeatherPal) + gWeatherPtr->fadeScreenCounter = 0; else BeginNormalPaletteFade(0xFFFFFFFF, delay, 16, 0, fadeColor); - gWeatherPtr->unknown_6C6 = 1; + + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_IN; gWeatherPtr->unknown_6CA = 1; gWeatherPtr->unknown_6CB = 0; Weather_SetBlendCoeffs(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB); - gWeatherPtr->unknown_6C8 = 1; + gWeatherPtr->readyForInit = TRUE; } } -bool8 sub_807D770(void) +bool8 IsWeatherNotFadingIn(void) { - return gWeatherPtr->unknown_6C6 ^ 1 ? TRUE : FALSE; + return (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_SCREEN_FADING_IN); } -void sub_807D78C(u8 a) +void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex) { - u16 r4 = 16 + a; + u16 paletteIndex = 16 + spritePaletteIndex; u16 i; - switch (gWeatherPtr->unknown_6C6) + switch (gWeatherPtr->palProcessingState) { - case 1: + case WEATHER_PAL_STATE_SCREEN_FADING_IN: if (gWeatherPtr->unknown_6CA != 0) { if (gWeatherPtr->currWeather == WEATHER_FOG_1) - sub_807D540(r4); - r4 *= 16; + MarkFogSpritePalToLighten(paletteIndex); + paletteIndex *= 16; for (i = 0; i < 16; i++) - gPlttBufferFaded[r4 + i] = gWeatherPtr->unknown_6C4; + gPlttBufferFaded[paletteIndex + i] = gWeatherPtr->fadeDestColor; } break; - case 2: - r4 *= 16; - CpuFastCopy(gPlttBufferFaded + r4, gPlttBufferUnfaded + r4, 32); - BlendPalette(r4, 16, gPaletteFade.y, gPaletteFade.blendColor); + case WEATHER_PAL_STATE_SCREEN_FADING_OUT: + paletteIndex *= 16; + CpuFastCopy(gPlttBufferFaded + paletteIndex, gPlttBufferUnfaded + paletteIndex, 32); + BlendPalette(paletteIndex, 16, gPaletteFade.y, gPaletteFade.blendColor); break; + // WEATHER_PAL_STATE_CHANGING_WEATHER + // WEATHER_PAL_STATE_CHANGING_IDLE default: if (gWeatherPtr->currWeather != WEATHER_FOG_1) { - sub_807CEBC(r4, 1, gWeatherPtr->unknown_6C0); + ApplyGammaShift(paletteIndex, 1, gWeatherPtr->gammaIndex); } else { - r4 *= 16; - BlendPalette(r4, 16, 12, 0x73FC); + paletteIndex *= 16; + BlendPalette(paletteIndex, 16, 12, 0x73FC); } break; } } -void sub_807D874(u8 a) +void ApplyWeatherGammaShiftToPal(u8 paletteIndex) { - sub_807CEBC(a, 1, gWeatherPtr->unknown_6C0); + ApplyGammaShift(paletteIndex, 1, gWeatherPtr->gammaIndex); } u8 unref_sub_807D894(void) { - if (gWeatherPtr->unknown_6C6 == 1) + if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_SCREEN_FADING_IN) return gWeatherPtr->unknown_6CA; else return 0; } -void sub_807D8C0(const u16 *palette) +void LoadCustomWeatherSpritePalette(const u16 *palette) { - LoadPalette(palette, 0x100 + gWeatherPtr->unknown_6D4 * 16, 32); - sub_807D78C(gWeatherPtr->unknown_6D4); + LoadPalette(palette, 0x100 + gWeatherPtr->weatherPicSpritePalIndex * 16, 32); + UpdateSpritePaletteWithWeather(gWeatherPtr->weatherPicSpritePalIndex); } -void sub_807D8F0(u8 *a, u8 *b) +static void LoadDroughtWeatherPalette(u8 *gammaIndexPtr, u8 *b) { - u8 r4 = *a; + u8 gammaIndex = *gammaIndexPtr; u16 i; - if (r4 < 7) + if (gammaIndex < 7) { - r4--; - LZ77UnCompWram(sCompressedDroughtPalettes[r4], eWeatherPaletteData.data[r4]); - if (r4 == 0) + gammaIndex--; + LZ77UnCompWram(sCompressedDroughtPalettes[gammaIndex], eDroughtPaletteData.gammaShiftColors[gammaIndex]); + if (gammaIndex == 0) { - eWeatherPaletteData.data[r4][0] = 0x421; + eDroughtPaletteData.gammaShiftColors[gammaIndex][0] = RGB(1, 1, 1); for (i = 1; i < 0x1000; i++) - eWeatherPaletteData.data[r4][i] += eWeatherPaletteData.data[r4][i - 1]; + eDroughtPaletteData.gammaShiftColors[gammaIndex][i] += eDroughtPaletteData.gammaShiftColors[gammaIndex][i - 1]; } else { for (i = 0; i < 0x1000; i++) - eWeatherPaletteData.data[r4][i] += eWeatherPaletteData.data[r4 - 1][i]; + eDroughtPaletteData.gammaShiftColors[gammaIndex][i] += eDroughtPaletteData.gammaShiftColors[gammaIndex - 1][i]; } - if (++(*a) == 7) + if (++(*gammaIndexPtr) == 7) { - *a = 32; + *gammaIndexPtr = 32; *b = 32; } } } -void sub_807D9A8(void) +void ResetDroughtWeatherPaletteLoading(void) { - gWeatherPtr->unknown_74D = 1; - gWeatherPtr->unknown_74E = 1; + gWeatherPtr->loadDroughtPalsIndex = 1; + gWeatherPtr->loadDroughtPalsOffset = 1; } -bool8 sub_807D9C8(void) +bool8 LoadDroughtWeatherPalettes(void) { - if (gWeatherPtr->unknown_74D < 32) + if (gWeatherPtr->loadDroughtPalsIndex < 32) { - sub_807D8F0(&gWeatherPtr->unknown_74D, &gWeatherPtr->unknown_74E); - if (gWeatherPtr->unknown_74D < 32) + LoadDroughtWeatherPalette(&gWeatherPtr->loadDroughtPalsIndex, &gWeatherPtr->loadDroughtPalsOffset); + if (gWeatherPtr->loadDroughtPalsIndex < 32) return TRUE; } return FALSE; } -void sub_807DA04(s8 a) +void sub_807DA04(s8 gammaIndex) { - sub_807D5BC(-a - 1); + sub_807D5BC(-gammaIndex - 1); } void sub_807DA14(void) @@ -1009,8 +1103,8 @@ void Weather_SetTargetBlendCoeffs(u8 eva, u8 evb, int delay) gWeatherPtr->targetBlendEVA = eva; gWeatherPtr->targetBlendEVB = evb; gWeatherPtr->blendDelay = delay; - gWeatherPtr->unknown_739 = 0; - gWeatherPtr->unknown_738 = 0; + gWeatherPtr->blendFrameCounter = 0; + gWeatherPtr->blendUpdateCounter = 0; } bool8 Weather_UpdateBlend(void) @@ -1019,13 +1113,13 @@ bool8 Weather_UpdateBlend(void) && gWeatherPtr->currBlendEVB == gWeatherPtr->targetBlendEVB) return TRUE; - if (++gWeatherPtr->unknown_739 > gWeatherPtr->blendDelay) + if (++gWeatherPtr->blendFrameCounter > gWeatherPtr->blendDelay) { - gWeatherPtr->unknown_739 = 0; - gWeatherPtr->unknown_738++; + gWeatherPtr->blendFrameCounter = 0; + gWeatherPtr->blendUpdateCounter++; // Update currBlendEVA and currBlendEVB on alternate frames - if (gWeatherPtr->unknown_738 & 1) + if (gWeatherPtr->blendUpdateCounter & 1) { if (gWeatherPtr->currBlendEVA < gWeatherPtr->targetBlendEVA) gWeatherPtr->currBlendEVA++; @@ -1055,48 +1149,48 @@ void unref_sub_807DCB4(u8 a) switch (a) { case 1: - SetWeather(1); + SetWeather(WEATHER_CLOUDS); break; case 2: - SetWeather(2); + SetWeather(WEATHER_SUNNY); break; case 3: - SetWeather(3); + SetWeather(WEATHER_RAIN_LIGHT); break; case 4: - SetWeather(4); + SetWeather(WEATHER_SNOW); break; case 5: - SetWeather(5); + SetWeather(WEATHER_RAIN_MED); break; case 6: - SetWeather(6); + SetWeather(WEATHER_FOG_1); break; case 7: - SetWeather(9); + SetWeather(WEATHER_FOG_2); break; case 8: - SetWeather(7); + SetWeather(WEATHER_ASH); break; case 9: - SetWeather(8); + SetWeather(WEATHER_SANDSTORM); break; case 10: - SetWeather(11); + SetWeather(WEATHER_SHADE); break; } } -u8 weather_get_current(void) +u8 GetCurrentWeather(void) { return gWeatherPtr->currWeather; } -void SetRainStrengthFromSoundEffect(u16 sndEff) +void SetRainStrengthFromSoundEffect(u16 soundEffect) { - if (gWeatherPtr->unknown_6C6 != 2) + if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_SCREEN_FADING_OUT) { - switch (sndEff) + switch (soundEffect) { case SE_T_KOAME: gWeatherPtr->rainStrength = 0; @@ -1110,7 +1204,8 @@ void SetRainStrengthFromSoundEffect(u16 sndEff) default: return; } - PlaySE(sndEff); + + PlaySE(soundEffect); } } @@ -1134,29 +1229,171 @@ void PlayRainSoundEffect(void) } } -u8 sub_807DDFC(void) +u8 IsWeatherChangeComplete(void) { - return gWeatherPtr->unknown_6D3; + return gWeatherPtr->weatherChangeComplete; } -void sub_807DE10(void) +void SetWeatherScreenFadeOut(void) { - gWeatherPtr->unknown_6C6 = 2; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_OUT; } void unref_sub_807DE24(void) { - gWeatherPtr->unknown_6C6 = 3; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; } -void sub_807DE38(u8 a) +void PreservePaletteInWeather(u8 preservedPalIndex) { - CpuCopy16(gUnknown_083970C8, gUnknown_0202FF38, 32); - gUnknown_0202FF38[a] = 0; - gUnknown_030006DC = gUnknown_0202FF38; + CpuCopy16(sBasePaletteGammaTypes, gFieldEffectPaletteGammaTypes, 32); + gFieldEffectPaletteGammaTypes[preservedPalIndex] = GAMMA_NONE; + sPaletteGammaTypes = gFieldEffectPaletteGammaTypes; } -void sub_807DE68(void) +void ResetPreservedPalettesInWeather(void) { - gUnknown_030006DC = gUnknown_083970C8; + sPaletteGammaTypes = sBasePaletteGammaTypes; } + +#if DEBUG + +__attribute__((naked)) +u8 debug_sub_8085564(void) +{ + asm("\ + push {lr}\n\ + mov r2, #0x0\n\ + ldr r0, ._375 @ gMain\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._370 @cond_branch\n\ + ldr r1, ._375 + 4 @ gUnknown_Debug_20301FE\n\ + ldrb r0, [r1]\n\ + add r0, r0, #0x1\n\ + strb r0, [r1]\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0xf\n\ + bne ._371 @cond_branch\n\ + strb r2, [r1]\n\ +._371:\n\ + mov r2, #0x1\n\ +._370:\n\ + ldr r0, ._375 @ gMain\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._372 @cond_branch\n\ + ldr r1, ._375 + 4 @ gUnknown_Debug_20301FE\n\ + ldrb r0, [r1]\n\ + cmp r0, #0\n\ + beq ._373 @cond_branch\n\ + sub r0, r0, #0x1\n\ + b ._374\n\ +._376:\n\ + .align 2, 0\n\ +._375:\n\ + .word gMain\n\ + .word gUnknown_Debug_20301FE\n\ +._373:\n\ + mov r0, #0xe\n\ +._374:\n\ + strb r0, [r1]\n\ + mov r2, #0x1\n\ +._372:\n\ + cmp r2, #0\n\ + beq ._377 @cond_branch\n\ + mov r0, #0x16\n\ + mov r1, #0x1\n\ + mov r2, #0x1c\n\ + mov r3, #0x2\n\ + bl Menu_BlankWindowRect\n\ + ldr r1, ._380 @ gDebugText_Weather\n\ + ldr r0, ._380 + 4 @ gUnknown_Debug_20301FE\n\ + ldrb r0, [r0]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x17\n\ + mov r2, #0x1\n\ + bl Menu_PrintText\n\ +._377:\n\ + ldr r0, ._380 + 8 @ gMain\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._378 @cond_branch\n\ + mov r0, #0x0\n\ + b ._379\n\ +._381:\n\ + .align 2, 0\n\ +._380:\n\ + .word gDebugText_Weather\n\ + .word gUnknown_Debug_20301FE\n\ + .word gMain\n\ +._378:\n\ + ldr r0, ._382 @ gUnknown_Debug_20301FE\n\ + ldrb r0, [r0]\n\ + bl ChangeWeather\n\ + bl CloseMenu\n\ + mov r0, #0x1\n\ +._379:\n\ + pop {r1}\n\ + bx r1\n\ +._383:\n\ + .align 2, 0\n\ +._382:\n\ + .word gUnknown_Debug_20301FE"); +} + +__attribute__((naked)) +u8 debug_sub_808560C(void) +{ + asm("\ + push {r4, lr}\n\ + ldr r4, ._384 @ gUnknown_Debug_20301FE\n\ + ldr r0, ._384 + 4 @ gWeather\n\ + mov r1, #0xda\n\ + lsl r1, r1, #0x3\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + strb r0, [r4]\n\ + bl Menu_EraseScreen\n\ + mov r0, #0x16\n\ + mov r1, #0x1\n\ + mov r2, #0x1c\n\ + mov r3, #0x2\n\ + bl Menu_BlankWindowRect\n\ + ldr r1, ._384 + 8 @ gDebugText_Weather\n\ + ldrb r0, [r4]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x17\n\ + mov r2, #0x1\n\ + bl Menu_PrintText\n\ + ldr r1, ._384 + 12 @ gMenuCallback\n\ + ldr r0, ._384 + 16 @ debug_sub_8085564\n\ + str r0, [r1]\n\ + mov r0, #0x0\n\ + pop {r4}\n\ + pop {r1}\n\ + bx r1\n\ +._385:\n\ + .align 2, 0\n\ +._384:\n\ + .word gUnknown_Debug_20301FE\n\ + .word gWeather\n\ + .word gDebugText_Weather\n\ + .word gMenuCallback\n\ + .word debug_sub_8085564+1"); +} + +#endif diff --git a/src/field/field_weather_effects.c b/src/field/field_weather_effects.c index 5a59d6c2a..eff702f8c 100644 --- a/src/field/field_weather_effects.c +++ b/src/field/field_weather_effects.c @@ -74,10 +74,7 @@ static const struct SpriteTemplate sCloudSpriteTemplate = .callback = sub_807E0F4, }; -extern void sub_807D5BC(s8 a); -extern void sub_807D8C0(const u16 *palette); -extern void sub_807D9A8(void); -extern bool8 sub_807D9C8(void); +extern void sub_807D5BC(s8 gammaIndex); extern void sub_807DA14(void); extern void sub_807DA4C(void); extern void Weather_SetTargetBlendCoeffs(u8 a, u8 b, int c); @@ -91,8 +88,8 @@ extern void sub_807D5F0(u8 a, u8 b, u8 c); void Clouds_InitVars(void) { - gWeatherPtr->unknown_6C1 = 0; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->weatherGfxLoaded = FALSE; gWeatherPtr->initStep = 0; if (gWeatherPtr->cloudSpritesCreated == FALSE) @@ -159,8 +156,8 @@ bool8 Clouds_Finish(void) void Weather2_InitVars(void) { - gWeatherPtr->unknown_6C1 = 0; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 20; } void Weather2_InitAll(void) @@ -184,7 +181,7 @@ void CreateCloudSprites(void) if (gWeatherPtr->cloudSpritesCreated == TRUE) return; LoadSpriteSheet(&sCloudSpriteSheet); - sub_807D8C0(gUnknown_08397108); + LoadCustomWeatherSpritePalette(gUnknown_08397108); for (i = 0; i < 3; i++) { u8 spriteId = CreateSprite(&sCloudSpriteTemplate, 0, 0, 0xFF); @@ -236,8 +233,8 @@ void Drought_InitVars(void) { gWeatherPtr->initStep = 0; gWeatherPtr->weatherGfxLoaded = FALSE; - gWeatherPtr->unknown_6C1 = 0; - gWeatherPtr->unknown_6C2 = 0; + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 0; } void Drought_Main(void); @@ -254,15 +251,15 @@ void Drought_Main(void) switch (gWeatherPtr->initStep) { case 0: - if (gWeatherPtr->unknown_6C6 != 0) + if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_CHANGING_WEATHER) gWeatherPtr->initStep++; break; case 1: - sub_807D9A8(); + ResetDroughtWeatherPaletteLoading(); gWeatherPtr->initStep++; break; case 2: - if (sub_807D9C8() == FALSE) + if (LoadDroughtWeatherPalettes() == FALSE) gWeatherPtr->initStep++; break; case 3: @@ -368,8 +365,8 @@ void LightRain_InitVars(void) gWeatherPtr->unknown_6DB = 8; gWeatherPtr->unknown_6DC = 0; gWeatherPtr->unknown_6D9 = 10; - gWeatherPtr->unknown_6C1 = 3; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 3; + gWeatherPtr->gammaStepDelay = 20; SetRainStrengthFromSoundEffect(SE_T_KOAME); } @@ -885,8 +882,8 @@ void Snow_InitVars(void) { gWeatherPtr->initStep = 0; gWeatherPtr->weatherGfxLoaded = FALSE; - gWeatherPtr->unknown_6C1 = 3; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 3; + gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->unknown_6E5 = 16; gWeatherPtr->unknown_6E0 = 0; } @@ -1074,8 +1071,8 @@ void MedRain_InitVars(void) gWeatherPtr->unknown_6DB = 4; gWeatherPtr->unknown_6DC = 0; gWeatherPtr->unknown_6D9 = 16; - gWeatherPtr->unknown_6C1 = 3; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 3; + gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment gWeatherPtr->unknown_6ED = 0; SetRainStrengthFromSoundEffect(SE_T_AME); @@ -1102,8 +1099,8 @@ void HeavyRain_InitVars(void) gWeatherPtr->unknown_6DB = 4; gWeatherPtr->unknown_6DC = 1; gWeatherPtr->unknown_6D9 = 24; - gWeatherPtr->unknown_6C1 = 3; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 3; + gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment SetRainStrengthFromSoundEffect(SE_T_OOAME); } @@ -1139,7 +1136,7 @@ void Rain_Main(void) gWeatherPtr->initStep++; break; case 3: - if (gWeatherPtr->unknown_6C6 == 0) + if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_CHANGING_WEATHER) break; gWeatherPtr->initStep = 6; break; @@ -1213,7 +1210,7 @@ void Rain_Main(void) gWeatherPtr->initStep++; break; case 14: - if (gWeatherPtr->unknown_6C6 != 3) + if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_IDLE) break; gWeatherPtr->unknown_6EA = 1; gWeatherPtr->initStep = 4; @@ -1296,8 +1293,8 @@ void Fog1_InitVars(void) { gWeatherPtr->initStep = 0; gWeatherPtr->weatherGfxLoaded = FALSE; - gWeatherPtr->unknown_6C1 = 0; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 20; if (gWeatherPtr->fog1SpritesCreated == 0) { gWeatherPtr->unknown_6F0 = 0; @@ -1446,8 +1443,8 @@ void Ash_InitVars(void) { gWeatherPtr->initStep = 0; gWeatherPtr->weatherGfxLoaded = FALSE; - gWeatherPtr->unknown_6C1 = 0; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->unknown_6FE = 20; if (!gWeatherPtr->ashSpritesCreated) { @@ -1634,8 +1631,8 @@ void Fog2_InitVars(void) { gWeatherPtr->initStep = 0; gWeatherPtr->weatherGfxLoaded = 0; - gWeatherPtr->unknown_6C1 = 0; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->unknown_6F0 = 0; gWeatherPtr->unknown_6F2 = 1; if (gWeatherPtr->fog2SpritesCreated == 0) @@ -1835,8 +1832,8 @@ void Sandstorm_InitVars(void) { gWeatherPtr->initStep = 0; gWeatherPtr->weatherGfxLoaded = 0; - gWeatherPtr->unknown_6C1 = 0; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 20; if (gWeatherPtr->sandstormSprites1Created == 0) { gWeatherPtr->unknown_704 = gWeatherPtr->unknown_708 = 0; @@ -2015,7 +2012,7 @@ void CreateSandstormSprites_1(void) if (!gWeatherPtr->sandstormSprites1Created) { LoadSpriteSheet(&sSandstormSpriteSheet); - sub_807D8C0(gUnknown_08397128); + LoadCustomWeatherSpritePalette(gUnknown_08397128); for (i = 0; i < 20; i++) { u8 spriteId = CreateSpriteAtEnd(&sSandstormSpriteTemplate, 0, (i / 5) * 64, 1); @@ -2113,26 +2110,26 @@ void SandstormSpriteCallback3(struct Sprite *sprite) } //------------------------------------------------------------------------------ -// Weather 11 +// Shade //------------------------------------------------------------------------------ -void Weather11_InitVars(void) +void Shade_InitVars(void) { gWeatherPtr->initStep = 0; - gWeatherPtr->unknown_6C1 = 3; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 3; + gWeatherPtr->gammaStepDelay = 20; } -void Weather11_InitAll(void) +void Shade_InitAll(void) { - Weather11_InitVars(); + Shade_InitVars(); } -void Weather11_Main(void) +void Shade_Main(void) { } -bool8 Weather11_Finish(void) +bool8 Shade_Finish(void) { return FALSE; } @@ -2322,7 +2319,7 @@ void SetSav1WeatherFromCurrMapHeader(void) void SetWeather(u32 weather) { SetSav1Weather(weather); - DoWeatherEffect(GetSav1Weather()); + ChangeWeather(GetSav1Weather()); } void SetWeather_Unused(u32 weather) @@ -2333,7 +2330,7 @@ void SetWeather_Unused(u32 weather) void DoCurrentWeather(void) { - DoWeatherEffect(GetSav1Weather()); + ChangeWeather(GetSav1Weather()); } void sub_8080750(void) @@ -2380,5 +2377,5 @@ void UpdateRainCounter(u8 newWeather, u8 oldWeather) { if (newWeather != oldWeather && (newWeather == WEATHER_RAIN_LIGHT || newWeather == WEATHER_RAIN_MED)) - IncrementGameStat(0x28); + IncrementGameStat(GAME_STAT_GOT_RAINED_ON); } diff --git a/src/field/fieldmap.c b/src/field/fieldmap.c index 7a31ae720..7383bb174 100644 --- a/src/field/fieldmap.c +++ b/src/field/fieldmap.c @@ -86,18 +86,20 @@ void map_copy_with_padding(u16 *map, u16 width, u16 height) void sub_80560AC(struct MapHeader *mapHeader) { + // BUG: This results in a null pointer dereference when mapHeader->connections + // is NULL, causing count to be assigned a garbage value. This garbage value + // just so happens to have the most significant bit set, so it is treated as + // negative and the loop below thankfully never executes in this scenario. + int count = mapHeader->connections->count; + struct MapConnection *connection = mapHeader->connections->connections; int i; - struct MapConnection *connection; - struct MapHeader *cMap; - u32 offset; - int count; - count = mapHeader->connections->count; - connection = mapHeader->connections->connections; + gUnknown_0202E850 = sDummyConnectionFlags; for (i = 0; i < count; i++, connection++) { - cMap = mapconnection_get_mapheader(connection); - offset = connection->offset; + struct MapHeader *cMap = mapconnection_get_mapheader(connection); + u32 offset = connection->offset; + switch (connection->direction) { case CONNECTION_SOUTH: diff --git a/src/field/fldeff_cut.c b/src/field/fldeff_cut.c index e4328acfc..5d39b87a9 100644 --- a/src/field/fldeff_cut.c +++ b/src/field/fldeff_cut.c @@ -72,6 +72,115 @@ static const struct SpriteTemplate gSpriteTemplate_CutGrass = .callback = sub_80A2A48, }; +#if DEBUG +__attribute__((naked)) +void debug_sub_80AFEE4() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " mov r0, #0x52\n" + " bl npc_before_player_of_type\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " bne ._1 @cond_branch\n" + " ldr r1, ._3 @ gLastFieldPokeMenuOpened\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + " bl sub_80A2634\n" + " b ._8\n" + "._4:\n" + " .align 2, 0\n" + "._3:\n" + " .word gLastFieldPokeMenuOpened\n" + "._1:\n" + " ldr r4, ._9 @ gUnknown_0203923C\n" + " add r1, r4, #2\n" + " add r0, r4, #0\n" + " bl PlayerGetDestCoords\n" + " mov r7, #0x0\n" + " mov r8, r4\n" + "._12:\n" + " ldr r1, ._9 + 4 @ 0xffff\n" + " add r0, r7, r1\n" + " mov r2, r8\n" + " ldrh r2, [r2, #0x2]\n" + " add r0, r0, r2\n" + " mov r6, #0x0\n" + " lsl r0, r0, #0x10\n" + " asr r5, r0, #0x10\n" + "._11:\n" + " ldr r1, ._9 + 4 @ 0xffff\n" + " add r0, r6, r1\n" + " mov r2, r8\n" + " ldrh r2, [r2]\n" + " add r0, r0, r2\n" + " lsl r0, r0, #0x10\n" + " asr r4, r0, #0x10\n" + " add r0, r4, #0\n" + " add r1, r5, #0\n" + " bl MapGridGetZCoordAt\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r2, r8\n" + " mov r1, #0x4\n" + " ldsb r1, [r2, r1]\n" + " cmp r0, r1\n" + " bne ._7 @cond_branch\n" + " add r0, r4, #0\n" + " add r1, r5, #0\n" + " bl MapGridGetMetatileBehaviorAt\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " add r0, r4, #0\n" + " bl MetatileBehavior_IsPokeGrass\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " beq ._6 @cond_branch\n" + " add r0, r4, #0\n" + " bl MetatileBehavior_IsAshGrass\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " bne ._7 @cond_branch\n" + "._6:\n" + " ldr r1, ._9 + 8 @ gLastFieldPokeMenuOpened\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + " bl sub_80A25E8\n" + " b ._8\n" + "._10:\n" + " .align 2, 0\n" + "._9:\n" + " .word gUnknown_0203923C\n" + " .word 0xffff\n" + " .word gLastFieldPokeMenuOpened\n" + "._7:\n" + " add r0, r6, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r6, r0, #0x18\n" + " cmp r6, #0x2\n" + " bls ._11 @cond_branch\n" + " add r0, r7, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + " cmp r7, #0x2\n" + " bls ._12 @cond_branch\n" + " bl ScriptContext2_Disable\n" + "._8:\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} +#endif + bool8 SetUpFieldMove_Cut(void) { s16 x, y; @@ -122,7 +231,7 @@ bool8 FldEff_UseCutOnGrass(void) gTasks[taskId].data[8] = (u32)sub_80A2684 >> 16; gTasks[taskId].data[9] = (u32)sub_80A2684; - IncrementGameStat(0x12); + IncrementGameStat(GAME_STAT_USED_CUT); return FALSE; } @@ -138,7 +247,7 @@ bool8 FldEff_UseCutOnTree(void) gTasks[taskId].data[8] = (u32)sub_80A2B00 >> 16; gTasks[taskId].data[9] = (u32)sub_80A2B00; - IncrementGameStat(0x12); + IncrementGameStat(GAME_STAT_USED_CUT); return FALSE; } diff --git a/src/field/fldeff_escalator.c b/src/field/fldeff_escalator.c new file mode 100644 index 000000000..981233480 --- /dev/null +++ b/src/field/fldeff_escalator.c @@ -0,0 +1,132 @@ +#include "global.h" +#include "task.h" +#include "fieldmap.h" +#include "field_camera.h" +#include "field_player_avatar.h" + +extern u8 gUnknown_02038731; + +void sub_80B45B4(u8 taskId, const s16 *list, u16 c) +{ + s16 r5 = gTasks[taskId].data[4] - 1; + s16 r3 = gTasks[taskId].data[5] - 1; + s16 r4 = gTasks[taskId].data[1]; + s16 y; + s16 x; + + if (gTasks[taskId].data[2] == 0) + { + for (y = 0; y < 3; y++) + { + for (x = 0; x < 3; x++) + { + s16 metatileId = MapGridGetMetatileIdAt(r5 + x, r3 + y); + + if (list[r4] == metatileId) + { + if (r4 != 2) + MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[r4 + 1]); + else + MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[0]); + } + } + } + } + else + { + for (y = 0; y < 3; y++) + { + for (x = 0; x < 3; x++) + { + s16 metatileId = MapGridGetMetatileIdAt(r5 + x, r3 + y); + + if (list[2 - r4] == metatileId) + { + if (r4 != 2) + MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[1 - r4]); + else + MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[2]); + } + } + } + } +} + +const u16 gUnknown_083CC714[] = {0x284, 0x282, 0x280}; +const u16 gUnknown_083CC71A[] = {0x285, 0x283, 0x281}; +const u16 gUnknown_083CC720[] = {0x28C, 0x28A, 0x288}; +const u16 gUnknown_083CC726[] = {0x28D, 0x28B, 0x289}; +const u16 gUnknown_083CC72C[] = {0x2A0, 0x2A2, 0x2A4}; +const u16 gUnknown_083CC732[] = {0x2A1, 0x2A3, 0x2A5}; +const u16 gUnknown_083CC738[] = {0x2A8, 0x2AA, 0x2AC}; + +void sub_80B4710(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + data[3] = 1; + + switch (data[0]) + { + case 0: + sub_80B45B4(taskId, gUnknown_083CC714, 0); + break; + case 1: + sub_80B45B4(taskId, gUnknown_083CC71A, 0); + break; + case 2: + sub_80B45B4(taskId, gUnknown_083CC720, 0xC00); + break; + case 3: + sub_80B45B4(taskId, gUnknown_083CC726, 0); + break; + case 4: + sub_80B45B4(taskId, gUnknown_083CC72C, 0xC00); + break; + case 5: + sub_80B45B4(taskId, gUnknown_083CC732, 0); + break; + case 6: + sub_80B45B4(taskId, gUnknown_083CC738, 0); + break; + } + + data[0] = (data[0] + 1) & 7; + if (!data[0]) + { + DrawWholeMapView(); + data[1] = (data[1] + 1) % 3; + data[3] = 0; + } +} + +u8 sub_80B47D8(u16 var) +{ + u8 taskId = CreateTask(sub_80B4710, 0); + s16 *data = gTasks[taskId].data; + + PlayerGetDestCoords(&data[4], &data[5]); + data[0] = 0; + data[1] = 0; + data[2] = var; + sub_80B4710(taskId); + return taskId; +} + +void sub_80B4824(u8 var) +{ + gUnknown_02038731 = sub_80B47D8(var); +} + +void sub_80B483C(void) +{ + DestroyTask(gUnknown_02038731); +} + +bool8 sub_80B4850(void) +{ + if (gTasks[gUnknown_02038731].data[3] == 0 && gTasks[gUnknown_02038731].data[1] == 2) + return FALSE; + else + return TRUE; +} diff --git a/src/field/fldeff_flash.c b/src/field/fldeff_flash.c index 22f170184..8c0f09bd9 100644 --- a/src/field/fldeff_flash.c +++ b/src/field/fldeff_flash.c @@ -71,6 +71,36 @@ static const u16 gUnknown_083F809C[] = INCBIN_U16("graphics/misc/83F809C.gbapal" static const u16 gCaveTransitionTilemap[] = INCBIN_U16("graphics/misc/cave_transition_map.bin.lz"); static const u8 gCaveTransitionTiles[] = INCBIN_U8("graphics/misc/cave_transition.4bpp.lz"); +#if DEBUG +__attribute__((naked)) +void debug_sub_8122080(void) +{ + asm("\ + push {lr}\n\ + ldr r0, ._4 @ gMapHeader\n\ + ldrb r0, [r0, #0x15]\n\ + cmp r0, #0x1\n\ + bne ._2 @cond_branch\n\ + ldr r0, ._4 + 4 @ 0x828\n\ + bl FlagGet\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._2 @cond_branch\n\ + bl sub_810CBFC\n\ + b ._3\n\ +._5:\n\ + .align 2, 0\n\ +._4:\n\ + .word gMapHeader\n\ + .word 0x828\n\ +._2:\n\ + bl ScriptContext2_Disable\n\ +._3:\n\ + pop {r0}\n\ + bx r0"); +} +#endif + bool8 SetUpFieldMove_Flash(void) { if (gMapHeader.cave == TRUE && !FlagGet(FLAG_SYS_USE_FLASH)) diff --git a/src/field/fldeff_poison.c b/src/field/fldeff_poison.c index b0052d59d..52afc2516 100644 --- a/src/field/fldeff_poison.c +++ b/src/field/fldeff_poison.c @@ -32,13 +32,13 @@ static void Task_FieldPoisonEffect(u8 taskId) REG_MOSAIC = (data[1] << 4) | data[1]; } -void DoFieldPoisonEffect(void) +void FldeffPoison_Start(void) { PlaySE(SE_DOKU); CreateTask(Task_FieldPoisonEffect, 80); } -bool32 FieldPoisonEffectIsRunning(void) +bool32 FldeffPoison_IsActive(void) { return FuncIsActiveTask(Task_FieldPoisonEffect); } diff --git a/src/field/fldeff_secretpower.c b/src/field/fldeff_secretpower.c index bf8e98403..0e91bb55c 100644 --- a/src/field/fldeff_secretpower.c +++ b/src/field/fldeff_secretpower.c @@ -243,6 +243,102 @@ void sub_80C6280(void) } } +#if DEBUG + +__attribute__((naked)) +void debug_sub_80D93F4() +{ + asm("\ + push {r4, lr}\n\ + bl sub_80BB63C\n\ + ldr r0, ._98 @ gSpecialVar_Result\n\ + ldrh r0, [r0]\n\ + cmp r0, #0x1\n\ + beq ._95 @cond_branch\n\ + bl player_get_direction_lower_nybble\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x2\n\ + beq ._96 @cond_branch\n\ +._95:\n\ + bl ScriptContext2_Disable\n\ + b ._109\n\ +._99:\n\ + .align 2, 0\n\ +._98:\n\ + .word gSpecialVar_Result\n\ +._96:\n\ + ldr r4, ._102 @ gUnknown_0203923C\n\ + add r1, r4, #2\n\ + add r0, r4, #0\n\ + bl GetXYCoordsOneStepInFrontOfPlayer\n\ + mov r1, #0x0\n\ + ldsh r0, [r4, r1]\n\ + mov r2, #0x2\n\ + ldsh r1, [r4, r2]\n\ + bl MapGridGetMetatileBehaviorAt\n\ + lsl r0, r0, #0x18\n\ + lsr r4, r0, #0x18\n\ + add r0, r4, #0\n\ + bl MetatileBehavior_IsSecretBaseCave\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x1\n\ + bne ._100 @cond_branch\n\ + bl sub_80C6264\n\ + ldr r1, ._102 + 4 @ gLastFieldPokeMenuOpened\n\ + mov r0, #0x0\n\ + strb r0, [r1]\n\ + bl sub_80C639C\n\ + b ._109\n\ +._103:\n\ + .align 2, 0\n\ +._102:\n\ + .word gUnknown_0203923C\n\ + .word gLastFieldPokeMenuOpened\n\ +._100:\n\ + add r0, r4, #0\n\ + bl MetatileBehavior_IsSecretBaseTree\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x1\n\ + bne ._104 @cond_branch\n\ + bl sub_80C6264\n\ + ldr r1, ._106 @ gLastFieldPokeMenuOpened\n\ + mov r0, #0x0\n\ + strb r0, [r1]\n\ + bl sub_80C64A8\n\ + b ._109\n\ +._107:\n\ + .align 2, 0\n\ +._106:\n\ + .word gLastFieldPokeMenuOpened\n\ +._104:\n\ + add r0, r4, #0\n\ + bl MetatileBehavior_IsSecretBaseShrub\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x1\n\ + bne ._108 @cond_branch\n\ + bl sub_80C6264\n\ + ldr r1, ._110 @ gLastFieldPokeMenuOpened\n\ + mov r0, #0x0\n\ + strb r0, [r1]\n\ + bl sub_80C660C\n\ + b ._109\n\ +._111:\n\ + .align 2, 0\n\ +._110:\n\ + .word gLastFieldPokeMenuOpened\n\ +._108:\n\ + bl ScriptContext2_Disable\n\ +._109:\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0"); +} +#endif + bool8 SetUpFieldMove_SecretPower(void) { u8 behavior; diff --git a/src/field/fldeff_softboiled.c b/src/field/fldeff_softboiled.c index a574232a8..3c64ec520 100644 --- a/src/field/fldeff_softboiled.c +++ b/src/field/fldeff_softboiled.c @@ -126,7 +126,7 @@ static void sub_8133E74(u8 taskId) { return; } - MenuZeroFillWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); + Menu_EraseWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); PrintPartyMenuPromptText(3, 0); gTasks[taskId].func = HandlePartyMenuSwitchPokemonInput; } @@ -142,7 +142,7 @@ static void sub_8133EF8(void) { sub_806CCE4(); EWRAM_1B000_2.unk261 = 2; DestroySprite(&gSprites[EWRAM_1000.unk1]); - MenuZeroFillWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); + Menu_EraseWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); PrintPartyMenuPromptText(0, 0); SwitchTaskToFollowupFunc(EWRAM_1000.unk0); } diff --git a/src/field/fldeff_strength.c b/src/field/fldeff_strength.c index 565ac1651..9f9cd4013 100644 --- a/src/field/fldeff_strength.c +++ b/src/field/fldeff_strength.c @@ -1,4 +1,5 @@ #include "global.h" +#include "constants/map_objects.h" #include "braille_puzzles.h" #include "field_effect.h" #include "party_menu.h" @@ -20,6 +21,28 @@ extern void (*gUnknown_03005CE4)(void); extern u8 S_UseStrength[]; +#if DEBUG +void debug_sub_8130318(void) +{ + if (ShouldDoBrailleStrengthEffect()) + { + gLastFieldPokeMenuOpened = 0; + gSpecialVar_Result = 0; + sub_811AA38(); + } + else if (npc_before_player_of_type(MAP_OBJ_GFX_PUSHABLE_BOULDER) == TRUE) + { + gLastFieldPokeMenuOpened = 0; + gSpecialVar_Result = 0; + sub_811AA18(); + } + else + { + ScriptContext2_Disable(); + } +} +#endif + bool8 SetUpFieldMove_Strength(void) { if (ShouldDoBrailleStrengthEffect()) diff --git a/src/field/item.c b/src/field/item.c index 66d7d65df..6ff7a7cbe 100644 --- a/src/field/item.c +++ b/src/field/item.c @@ -571,7 +571,7 @@ void SwapRegisteredBike(void) static u16 SanitizeItemId(u16 itemId) { - if (itemId > 0x15C) + if (itemId >= ARRAY_COUNT(gItems)) return 0; else return itemId; diff --git a/src/field/item_menu.c b/src/field/item_menu.c index e9b8b24d3..ae1465fbd 100644 --- a/src/field/item_menu.c +++ b/src/field/item_menu.c @@ -33,13 +33,13 @@ #include "string_util.h" #include "task.h" #include "text.h" -#include "unknown_task.h" +#include "scanline_effect.h" +#include "menu_helpers.h" #include "ewram.h" // External stuff extern void gpu_pal_allocator_reset__manage_upper_four(void); -extern void sub_80F9020(void); -extern void sub_80F9988(); +extern void SetVerticalScrollIndicatorPriority(); extern void sub_809D104(u16 *, u16, u16, const u8 *, u16, u16, u16, u16); extern void PauseVerticalScrollIndicator(); extern u8 sub_80F9284(void); @@ -47,10 +47,10 @@ extern void sub_808B5B4(); extern u8 sub_80F92F4(); extern void sub_80C9C7C(u8); extern void pal_fill_black(void); -extern bool8 sub_807D770(void); +extern bool8 IsWeatherNotFadingIn(void); extern u8 sub_80F931C(); extern void sub_808A3F8(u8); -extern void sub_80B3050(void); +extern void Shop_FadeReturnToMartMenu(void); extern void sub_80546B8(u8); extern void sub_804E990(u8); extern void sub_802E424(u8); @@ -158,6 +158,9 @@ extern struct PocketScrollState gBagPocketScrollStates[]; extern struct ItemSlot *gCurrentBagPocketItemSlots; // selected pocket item slots extern const u8 Event_NoRegisteredItem[]; +// TODO: decompile the debug code so we can use static in this file +#define static + extern const struct CompressedSpriteSheet sMaleBagSpriteSheet; extern const struct CompressedSpriteSheet sFemaleBagSpriteSheet; extern const struct CompressedSpritePalette sBagSpritePalette; @@ -286,6 +289,24 @@ static void sub_80A6618(u8); const struct YesNoFuncTable gUnknown_083C16FC = {sub_80A65AC, sub_80A6618}; +#if DEBUG +const struct {u16 item; u8 unk;} gUnknown_Debug_083EBC68[12+48] = +{ + {ITEM_POKE_BALL, 10}, + {ITEM_ULTRA_BALL, 15}, + {ITEM_GREAT_BALL, 20}, + {ITEM_MASTER_BALL, 25}, + {ITEM_ACRO_BIKE, 1 }, + {ITEM_OLD_ROD, 1 }, + {ITEM_GOOD_ROD, 1 }, + {ITEM_SUPER_ROD, 1 }, + {ITEM_POKEBLOCK_CASE, 1 }, + {ITEM_WAILMER_PAIL, 1 }, + {ITEM_ITEMFINDER, 1 }, + {ITEM_NONE, 1 }, +}; +#endif + void sub_80A34E8(void); static bool8 LoadBagGraphicsMultistep(void); static void sub_80A362C(void); @@ -368,22 +389,394 @@ static void sub_80A3134(void) LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); - - { - const void *src = gBGTilemapBuffers[1]; - void *dst = (void *)(VRAM + 0x2000); - - DmaCopy16(3, src, dst, 0x800); - } - - { - const void *src = gBGTilemapBuffers[2]; - void *dst = (void *)(VRAM + 0x6000); - - DmaCopy16(3, src, dst, 0x800); - } + DmaCopy16Defvars(3, gBGTilemapBuffers[1], (void *)(VRAM + 0x2000), 0x800); + DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(VRAM + 0x6000), 0x800); } +#if DEBUG +__attribute__((naked)) +static bool8 SetupBagMultistep(void) +{ + asm("\ + push {r4, r5, lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r0, ._5 @ gMain\n\ + ldr r1, ._5 + 4 @ 0x43c\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x10\n\ + bls ._3 @cond_branch\n\ + b ._66\n\ +._3:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._5 + 8 @ \n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._6:\n\ + .align 2, 0\n\ +._5:\n\ + .word gMain\n\ + .word 0x43c\n\ + .word ._7\n\ +._7:\n\ + .word ._8\n\ + .word ._9\n\ + .word ._10\n\ + .word ._11\n\ + .word ._12\n\ + .word ._13\n\ + .word ._14\n\ + .word ._15\n\ + .word ._16\n\ + .word ._17\n\ + .word ._18\n\ + .word ._19\n\ + .word ._20\n\ + .word ._21\n\ + .word ._22\n\ + .word ._23\n\ + .word ._24\n\ +._8:\n\ + bl ClearVideoCallbacks\n\ + bl sub_80A34E8\n\ + b ._61\n\ +._9:\n\ + bl ScanlineEffect_Stop\n\ + ldr r1, ._27 @ gMain\n\ + ldr r0, ._27 + 4 @ 0x43c\n\ + add r1, r1, r0\n\ + b ._62\n\ +._28:\n\ + .align 2, 0\n\ +._27:\n\ + .word gMain\n\ + .word 0x43c\n\ +._10:\n\ + bl gpu_pal_allocator_reset__manage_upper_four\n\ + b ._61\n\ +._11:\n\ + bl ClearBGTilemapBuffers\n\ + ldr r0, ._31 @ \n\ + ldr r1, ._31 + 4 @ \n\ + add r0, r0, r1\n\ + mov r1, #0x0\n\ + strb r1, [r0]\n\ + b ._61\n\ +._32:\n\ + .align 2, 0\n\ +._31:\n\ + .word +0x2000000\n\ + .word 0x1ffff\n\ +._12:\n\ + bl ResetPaletteFade\n\ + ldr r2, ._34 @ gPaletteFade\n\ + ldrb r0, [r2, #0x8]\n\ + mov r1, #0x80\n\ + orr r0, r0, r1\n\ + strb r0, [r2, #0x8]\n\ + ldr r1, ._34 + 4 @ gMain\n\ + ldr r0, ._34 + 8 @ 0x43c\n\ + add r1, r1, r0\n\ + b ._62\n\ +._35:\n\ + .align 2, 0\n\ +._34:\n\ + .word gPaletteFade\n\ + .word gMain\n\ + .word 0x43c\n\ +._13:\n\ + bl ResetSpriteData\n\ + b ._61\n\ +._14:\n\ + bl LoadBagGraphicsMultistep\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._37 @cond_branch\n\ + b ._66\n\ +._37:\n\ + ldr r1, ._40 @ gMain\n\ + ldr r0, ._40 + 4 @ 0x43c\n\ + add r1, r1, r0\n\ + b ._62\n\ +._41:\n\ + .align 2, 0\n\ +._40:\n\ + .word gMain\n\ + .word 0x43c\n\ +._15:\n\ + ldr r0, ._43 @ gWindowTemplate_81E6DFC\n\ + bl Text_LoadWindowTemplate\n\ + b ._61\n\ +._44:\n\ + .align 2, 0\n\ +._43:\n\ + .word gWindowTemplate_81E6DFC\n\ +._16:\n\ + ldr r0, ._46 @ gWindowTemplate_81E6DFC\n\ + bl MultistepInitMenuWindowBegin\n\ + ldr r1, ._46 + 4 @ gMain\n\ + ldr r0, ._46 + 8 @ 0x43c\n\ + add r1, r1, r0\n\ + b ._62\n\ +._47:\n\ + .align 2, 0\n\ +._46:\n\ + .word gWindowTemplate_81E6DFC\n\ + .word gMain\n\ + .word 0x43c\n\ +._17:\n\ + bl MultistepInitMenuWindowContinue\n\ + cmp r0, #0\n\ + bne ._48 @cond_branch\n\ + b ._66\n\ +._48:\n\ + b ._61\n\ +._18:\n\ + bl ClearVerticalScrollIndicatorPalettes\n\ + bl LoadScrollIndicatorPalette\n\ + mov r0, #0x0\n\ + mov r1, #0xac\n\ + mov r2, #0xc\n\ + bl CreateVerticalScrollIndicators\n\ + mov r0, #0x1\n\ + mov r1, #0xac\n\ + mov r2, #0x94\n\ + bl CreateVerticalScrollIndicators\n\ + mov r0, #0x2\n\ + mov r1, #0x1c\n\ + mov r2, #0x58\n\ + bl CreateVerticalScrollIndicators\n\ + mov r0, #0x3\n\ + mov r1, #0x64\n\ + mov r2, #0x58\n\ + bl CreateVerticalScrollIndicators\n\ + mov r0, #0x0\n\ + mov r1, #0x2\n\ + bl SetVerticalScrollIndicatorPriority\n\ + mov r0, #0x1\n\ + mov r1, #0x2\n\ + bl SetVerticalScrollIndicatorPriority\n\ + mov r0, #0x2\n\ + mov r1, #0x2\n\ + bl SetVerticalScrollIndicatorPriority\n\ + mov r0, #0x3\n\ + mov r1, #0x2\n\ + bl SetVerticalScrollIndicatorPriority\n\ + ldr r0, ._53 @ sReturnLocation\n\ + ldrb r0, [r0]\n\ + sub r0, r0, #0x4\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x1\n\ + bhi ._51 @cond_branch\n\ + mov r0, #0x2\n\ + mov r1, #0x1\n\ + bl SetVerticalScrollIndicators\n\ + mov r0, #0x3\n\ + mov r1, #0x1\n\ + bl SetVerticalScrollIndicators\n\ +._51:\n\ + ldr r1, ._53 + 4 @ gMain\n\ + ldr r0, ._53 + 8 @ 0x43c\n\ + add r1, r1, r0\n\ + b ._62\n\ +._54:\n\ + .align 2, 0\n\ +._53:\n\ + .word sReturnLocation\n\ + .word gMain\n\ + .word 0x43c\n\ +._19:\n\ + ldr r1, ._56 @ gUnknown_0203855A\n\ + mov r0, #0x10\n\ + strb r0, [r1]\n\ + ldr r4, ._56 + 4 @ gBGTilemapBuffers\n\ + ldr r5, ._56 + 8 @ sCurrentBagPocket\n\ + ldrb r1, [r5]\n\ + add r1, r1, #0x1\n\ + lsl r1, r1, #0x18\n\ + lsr r1, r1, #0x18\n\ + add r0, r4, #0\n\ + bl sub_80A39B8\n\ + ldrb r1, [r5]\n\ + add r0, r4, #0\n\ + bl DrawPocketIndicatorDots\n\ + bl UpdateAllBagPockets\n\ + ldr r4, ._56 + 12 @ gBagPockets\n\ + ldr r0, [r4, #0x10]\n\ + ldr r1, [r4, #0x14]\n\ + bl SortItemSlots\n\ + ldr r0, [r4, #0x18]\n\ + ldr r1, [r4, #0x1c]\n\ + bl SortItemSlots\n\ + bl sub_80A3D40\n\ + ldr r1, ._56 + 16 @ gCurrentBagPocketItemSlots\n\ + mov r0, #0x0\n\ + ldsb r0, [r5, r0]\n\ + lsl r0, r0, #0x3\n\ + add r0, r0, r4\n\ + ldr r0, [r0]\n\ + str r0, [r1]\n\ + bl sub_80A362C\n\ + b ._61\n\ +._57:\n\ + .align 2, 0\n\ +._56:\n\ + .word gUnknown_0203855A\n\ + .word gBGTilemapBuffers+0x1000\n\ + .word sCurrentBagPocket\n\ + .word gBagPockets\n\ + .word gCurrentBagPocketItemSlots\n\ +._20:\n\ + ldr r0, ._59 @ 0xffff\n\ + mov r1, #0x0\n\ + mov r2, #0x7\n\ + bl sub_80A48E8\n\ + ldr r1, ._59 + 4 @ gBagPocketScrollStates\n\ + ldr r4, ._59 + 8 @ sCurrentBagPocket\n\ + mov r0, #0x0\n\ + ldsb r0, [r4, r0]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldrb r1, [r0, #0x1]\n\ + ldrb r0, [r0]\n\ + add r1, r1, r0\n\ + ldr r0, ._59 + 12 @ gCurrentBagPocketItemSlots\n\ + ldr r0, [r0]\n\ + lsl r1, r1, #0x2\n\ + add r1, r1, r0\n\ + mov r2, #0x0\n\ + ldsh r0, [r1, r2]\n\ + bl ItemListMenu_InitDescription\n\ + bl ItemListMenu_InitMenu\n\ + ldr r1, ._59 + 16 @ gUnknown_0203855B\n\ + ldrb r0, [r4]\n\ + add r0, r0, #0x1\n\ + strb r0, [r1]\n\ + ldr r1, ._59 + 20 @ gUnknown_0203855C\n\ + mov r0, #0x0\n\ + strb r0, [r1]\n\ + ldr r1, ._59 + 24 @ gMain\n\ + ldr r0, ._59 + 28 @ 0x43c\n\ + add r1, r1, r0\n\ + b ._62\n\ +._60:\n\ + .align 2, 0\n\ +._59:\n\ + .word 0xffff\n\ + .word gBagPocketScrollStates\n\ + .word sCurrentBagPocket\n\ + .word gCurrentBagPocketItemSlots\n\ + .word gUnknown_0203855B\n\ + .word gUnknown_0203855C\n\ + .word gMain\n\ + .word 0x43c\n\ +._21:\n\ + bl CreateBagSprite\n\ + mov r0, #0x0\n\ + bl CreateBagPokeballSprite\n\ + bl sub_80A3740\n\ + b ._61\n\ +._22:\n\ + ldr r3, ._63 @ 0x4000208\n\ + ldrh r2, [r3]\n\ + mov r0, #0x0\n\ + strh r0, [r3]\n\ + ldr r4, ._63 + 4 @ 0x4000200\n\ + ldrh r0, [r4]\n\ + mov r1, #0x1\n\ + orr r0, r0, r1\n\ + strh r0, [r4]\n\ + strh r2, [r3]\n\ + ldr r2, ._63 + 8 @ 0x4000004\n\ + ldrh r0, [r2]\n\ + mov r1, #0x8\n\ + orr r0, r0, r1\n\ + strh r0, [r2]\n\ + mov r0, #0x1\n\ + neg r0, r0\n\ + mov r1, #0x0\n\ + str r1, [sp]\n\ + mov r2, #0x10\n\ + mov r3, #0x0\n\ + bl BeginNormalPaletteFade\n\ + ldr r2, ._63 + 12 @ gPaletteFade\n\ + ldrb r1, [r2, #0x8]\n\ + mov r0, #0x7f\n\ + and r0, r0, r1\n\ + strb r0, [r2, #0x8]\n\ + ldr r1, ._63 + 16 @ gMain\n\ + ldr r0, ._63 + 20 @ 0x43c\n\ + add r1, r1, r0\n\ + b ._62\n\ +._64:\n\ + .align 2, 0\n\ +._63:\n\ + .word 0x4000208\n\ + .word 0x4000200\n\ + .word 0x4000004\n\ + .word gPaletteFade\n\ + .word gMain\n\ + .word 0x43c\n\ +._23:\n\ + bl sub_8055870\n\ + cmp r0, #0x1\n\ + beq ._66 @cond_branch\n\ +._61:\n\ + ldr r1, ._67 @ gMain\n\ + ldr r2, ._67 + 4 @ 0x43c\n\ + add r1, r1, r2\n\ +._62:\n\ + ldrb r0, [r1]\n\ + add r0, r0, #0x1\n\ + strb r0, [r1]\n\ + b ._66\n\ +._68:\n\ + .align 2, 0\n\ +._67:\n\ + .word gMain\n\ + .word 0x43c\n\ +._24:\n\ + ldr r0, ._71 @ sub_80A3134\n\ + bl SetVBlankCallback\n\ + ldr r0, ._71 + 4 @ sub_80A3118\n\ + bl SetMainCallback2\n\ + bl sub_80A751C\n\ + bl sub_80A7630\n\ + bl sub_80A770C\n\ + bl sub_80A7828\n\ + bl sub_80A78B8\n\ + ldr r0, ._71 + 8 @ gLinkOpen\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._69 @cond_branch\n\ + ldr r0, ._71 + 12 @ 0x600f5e0\n\ + mov r1, #0x80\n\ + lsl r1, r1, #0x8\n\ + ldr r2, ._71 + 16 @ 0x600f800\n\ + mov r3, #0x0\n\ + bl debug_sub_8008218\n\ +._69:\n\ + mov r0, #0x1\n\ + b ._70\n\ +._72:\n\ + .align 2, 0\n\ +._71:\n\ + .word sub_80A3134+1\n\ + .word sub_80A3118+1\n\ + .word gLinkOpen\n\ + .word 0x600f5e0\n\ + .word 0x600f800\n\ +._66:\n\ + mov r0, #0x0\n\ +._70:\n\ + add sp, sp, #0x4\n\ + pop {r4, r5}\n\ + pop {r1}\n\ + bx r1"); +} +#else static bool8 SetupBagMultistep(void) { u32 index; @@ -392,12 +785,12 @@ static bool8 SetupBagMultistep(void) switch (gMain.state) { case 0: - sub_80F9438(); + ClearVideoCallbacks(); sub_80A34E8(); gMain.state++; break; case 1: - remove_some_task(); + ScanlineEffect_Stop(); gMain.state++; break; case 2: @@ -405,7 +798,7 @@ static bool8 SetupBagMultistep(void) gMain.state++; break; case 3: - sub_80F9020(); + ClearBGTilemapBuffers(); ewramBagSetupStep = 0; gMain.state++; break; @@ -424,11 +817,11 @@ static bool8 SetupBagMultistep(void) gMain.state++; break; case 7: - SetUpWindowConfig(&gWindowConfig_81E6DFC); + Text_LoadWindowTemplate(&gWindowTemplate_81E6DFC); gMain.state++; break; case 8: - MultistepInitMenuWindowBegin(&gWindowConfig_81E6DFC); + MultistepInitMenuWindowBegin(&gWindowTemplate_81E6DFC); gMain.state++; break; case 9: @@ -437,20 +830,20 @@ static bool8 SetupBagMultistep(void) gMain.state++; break; case 10: - sub_80F944C(); + ClearVerticalScrollIndicatorPalettes(); LoadScrollIndicatorPalette(); - CreateVerticalScrollIndicators(0, 172, 12); - CreateVerticalScrollIndicators(1, 172, 148); - CreateVerticalScrollIndicators(2, 28, 88); - CreateVerticalScrollIndicators(3, 100, 88); - sub_80F9988(0, 2); - sub_80F9988(1, 2); - sub_80F9988(2, 2); - sub_80F9988(3, 2); + CreateVerticalScrollIndicators(TOP_ARROW, 172, 12); + CreateVerticalScrollIndicators(BOTTOM_ARROW, 172, 148); + CreateVerticalScrollIndicators(LEFT_ARROW, 28, 88); + CreateVerticalScrollIndicators(RIGHT_ARROW, 100, 88); + SetVerticalScrollIndicatorPriority(TOP_ARROW, 2); + SetVerticalScrollIndicatorPriority(BOTTOM_ARROW, 2); + SetVerticalScrollIndicatorPriority(LEFT_ARROW, 2); + SetVerticalScrollIndicatorPriority(RIGHT_ARROW, 2); if (sReturnLocation == RETURN_TO_FIELD_4 || sReturnLocation == RETURN_TO_FIELD_5) { - sub_80F979C(2, 1); - sub_80F979C(3, 1); + SetVerticalScrollIndicators(LEFT_ARROW, INVISIBLE); + SetVerticalScrollIndicators(RIGHT_ARROW, INVISIBLE); } gMain.state++; break; @@ -508,6 +901,7 @@ static bool8 SetupBagMultistep(void) } return FALSE; } +#endif static bool8 sub_80A34B4(void) { @@ -634,6 +1028,79 @@ void ClearBag(void) ResetBagScrollPositions(); } +#if DEBUG +__attribute__((naked)) +void debug_sub_80A3714() +{ + asm("\ + push {r4, r5, r6, lr}\n\ + add sp, sp, #0xfffffff4\n\ + mov r5, #0x0\n\ + ldr r2, ._138 @ gUnknown_Debug_083EBC68\n\ + mov r1, #0x0\n\ +._134:\n\ + lsl r0, r5, #0x1\n\ + add r0, r0, sp\n\ + strh r1, [r0]\n\ + add r0, r5, #1\n\ + lsl r0, r0, #0x10\n\ + lsr r5, r0, #0x10\n\ + cmp r5, #0x4\n\ + bls ._134 @cond_branch\n\ + mov r5, #0x0\n\ + ldrh r0, [r2]\n\ + cmp r0, #0\n\ + beq ._136 @cond_branch\n\ + add r6, r2, #0\n\ +._137:\n\ + lsl r4, r5, #0x2\n\ + add r4, r4, r6\n\ + ldrh r0, [r4]\n\ + bl ItemId_GetPocket\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x8\n\ + ldr r1, ._138 + 4 @ 0xffff0000\n\ + add r0, r0, r1\n\ + lsr r0, r0, #0x10\n\ + ldr r1, ._138 + 8 @ gBagPockets\n\ + lsl r2, r0, #0x3\n\ + add r2, r2, r1\n\ + lsl r0, r0, #0x1\n\ + mov r1, sp\n\ + add r3, r1, r0\n\ + ldrh r1, [r3]\n\ + ldr r0, [r2]\n\ + lsl r1, r1, #0x2\n\ + add r1, r1, r0\n\ + ldr r0, [r4]\n\ + str r0, [r1]\n\ + ldrh r0, [r3]\n\ + add r0, r0, #0x1\n\ + strh r0, [r3]\n\ + add r0, r5, #1\n\ + lsl r0, r0, #0x10\n\ + lsr r5, r0, #0x10\n\ + cmp r5, #0x3b\n\ + bhi ._136 @cond_branch\n\ + lsl r0, r5, #0x2\n\ + add r0, r0, r6\n\ + ldrh r0, [r0]\n\ + cmp r0, #0\n\ + bne ._137 @cond_branch\n\ +._136:\n\ + add sp, sp, #0xc\n\ + pop {r4, r5, r6}\n\ + pop {r0}\n\ + bx r0\n\ +._139:\n\ + .align 2, 0\n\ +._138:\n\ + .word gUnknown_Debug_083EBC68\n\ + .word 0xffff0000\n\ + .word gBagPockets"); +} +#endif + static void sub_80A3740(void) { const u16 colors[2] = {RGB(14, 15, 16), RGB_WHITE}; @@ -657,10 +1124,10 @@ static void sub_80A3770(void) static void sub_80A37C0(u8 taskId) { gTasks[taskId].func = sub_80A50C8; - StartVerticalScrollIndicators(0); - StartVerticalScrollIndicators(1); - StartVerticalScrollIndicators(2); - StartVerticalScrollIndicators(3); + StartVerticalScrollIndicators(TOP_ARROW); + StartVerticalScrollIndicators(BOTTOM_ARROW); + StartVerticalScrollIndicators(LEFT_ARROW); + StartVerticalScrollIndicators(RIGHT_ARROW); } static void sub_80A37F8(u8 taskId) @@ -702,8 +1169,8 @@ static void sub_80A37F8(u8 taskId) sub_80A37C0(FindTaskIdByFunc(sub_80A4F68)); DestroyTask(taskId); ItemListMenu_InitMenu(); - sub_80F979C(2, 0); - sub_80F979C(3, 0); + SetVerticalScrollIndicators(LEFT_ARROW, VISIBLE); + SetVerticalScrollIndicators(RIGHT_ARROW, VISIBLE); } } @@ -1062,7 +1529,7 @@ void sub_80A4164(u8 *dest, u16 value, enum StringConvertMode mode, u8 digits) void sub_80A418C(u16 value, enum StringConvertMode mode, u8 c, u8 d, u8 digits) { sub_80A4164(gStringVar1, value, mode, digits); - MenuPrint(gStringVar1, c, d); + Menu_PrintText(gStringVar1, c, d); } static void sub_80A41D4(u8 taskId) @@ -1112,7 +1579,7 @@ static bool8 sub_80A42B0(u8 itemPos, int b) return TRUE; r5 = itemPos * 2 + 2; sub_8072C74(gStringVar1, gOtherText_CloseBag, 0x78, 0); - MenuPrint(gStringVar1, 14, r5); + Menu_PrintText(gStringVar1, 14, r5); ptr = gBGTilemapBuffers[2] + 14 + r5 * 32; ptr[0] = 0x4F; ptr[1] = 0x4F; @@ -1121,9 +1588,9 @@ static bool8 sub_80A42B0(u8 itemPos, int b) if (itemPos == 7) return TRUE; if ((b == 1 && r8->unk2 != 0) || b == 2) - MenuFillWindowRectWithBlankTile(14, r5 + 2, 29, 13); + Menu_BlankWindowRect(14, r5 + 2, 29, 13); else - MenuFillWindowRectWithBlankTile(14, r5 + 2, 29, 17); + Menu_BlankWindowRect(14, r5 + 2, 29, 17); return TRUE; } return FALSE; @@ -1148,7 +1615,7 @@ static void sub_80A4380(u16 a, int b, int c, int d) text = sub_8072C74(text, ItemId_GetItem(gCurrentBagPocketItemSlots[r4].itemId)->name, 0x66, 0); *text++ = CHAR_MULT_SIGN; sub_8072C14(text, gCurrentBagPocketItemSlots[r4].quantity, 0x78, 1); - MenuPrint(gStringVar1, 14, r5); + Menu_PrintText(gStringVar1, 14, r5); } } @@ -1173,7 +1640,7 @@ static void sub_80A444C(u16 a, int b, int c, int d) #else sub_8072C74(text, ItemId_GetItem(gCurrentBagPocketItemSlots[r4].itemId)->name, 0x63, 0); #endif - MenuPrint(gStringVar1, 14, r5); + Menu_PrintText(gStringVar1, 14, r5); if (gUnknown_02038558 != 0) { if (gCurrentBagPocketItemSlots[r4].itemId == gSaveBlock1.registeredItem) @@ -1240,7 +1707,7 @@ static void sub_80A4548(u16 a, int b, int c, int d) moveName = gMoveNames[ItemIdToBattleMoveId(gCurrentBagPocketItemSlots[r4].itemId)]; sub_8072C74(text, moveName, 0x78, 0); } - MenuPrint(gStringVar1, 14, sp10); + Menu_PrintText(gStringVar1, 14, sp10); } } #else @@ -1421,7 +1888,7 @@ _080A46AE:\n\ ldr r0, _080A46F8 @ =gStringVar1\n\ movs r1, 0xE\n\ ldr r2, [sp, 0x10]\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ mov r0, r8\n\ adds r0, 0x1\n\ lsls r0, 24\n\ @@ -1482,7 +1949,7 @@ static void sub_80A46FC(u16 a, int b, int c, int d) text = sub_80A425C(a, text, i); CopyItemName(gCurrentBagPocketItemSlots[r4].itemId, gStringVar2); sub_80A41E0(text, gCurrentBagPocketItemSlots[r4].itemId - 0x84, gStringVar2, gCurrentBagPocketItemSlots[r4].quantity, 3); - MenuPrint(gStringVar1, 14, r5); + Menu_PrintText(gStringVar1, 14, r5); } } @@ -1505,14 +1972,14 @@ static void sub_80A47E8(u16 a, int b, int c, int d) break; } if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop != 0) - sub_80F979C(0, 0); + SetVerticalScrollIndicators(TOP_ARROW, VISIBLE); else - sub_80F979C(0, 1); + SetVerticalScrollIndicators(TOP_ARROW, INVISIBLE); if ((sReturnLocation != RETURN_TO_FIELD_5 && gBagPocketScrollStates[sCurrentBagPocket].scrollTop + 8 < gBagPocketScrollStates[sCurrentBagPocket].numSlots + 1) || (sReturnLocation == RETURN_TO_FIELD_5 && gBagPocketScrollStates[sCurrentBagPocket].scrollTop + 8 < gBagPocketScrollStates[sCurrentBagPocket].numSlots)) - sub_80F979C(1, 0); + SetVerticalScrollIndicators(BOTTOM_ARROW, VISIBLE); else - sub_80F979C(1, 1); + SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE); } static void sub_80A48E8(u16 taskId, int b, int c) @@ -1540,7 +2007,7 @@ static void ItemListMenu_InitDescription(s16 itemId) } if (r5 < 3) - MenuZeroFillWindowRect(0, 13 + r5 * 2, 13, 20); + Menu_EraseWindowRect(0, 13 + r5 * 2, 13, 20); } static void ItemListMenu_ChangeDescription(s16 itemId, int b) @@ -1551,20 +2018,20 @@ static void ItemListMenu_ChangeDescription(s16 itemId, int b) { if (b == 0) { - MenuZeroFillWindowRect(0, 13, 13, 20); - MenuPrint_PixelCoords(gOtherText_ReturnTo, 4, 0x68, 0); + Menu_EraseWindowRect(0, 13, 13, 20); + Menu_PrintTextPixelCoords(gOtherText_ReturnTo, 4, 0x68, 0); } else if (b == 1) { - MenuPrint_PixelCoords(gUnknown_0840E740[sReturnLocation], 4, 0x78, 0); + Menu_PrintTextPixelCoords(gUnknown_0840E740[sReturnLocation], 4, 0x78, 0); } } else { if (b == 0) - MenuZeroFillWindowRect(0, 13, 13, 20); + Menu_EraseWindowRect(0, 13, 13, 20); if (ItemId_CopyDescription(description, itemId, b)) - MenuPrint_PixelCoords(description, 4, 104 + b * 16, 0); + Menu_PrintTextPixelCoords(description, 4, 104 + b * 16, 0); } } @@ -1602,9 +2069,9 @@ static void sub_80A4A98(const u8 *text, u32 line) u8 buffer[100]; if (line == 0) - MenuZeroFillWindowRect(0, 13, 13, 20); + Menu_EraseWindowRect(0, 13, 13, 20); if (CopyTextLine(buffer, text, line)) - MenuPrint_PixelCoords(buffer, 4, 104 + line * 16, 0); + Menu_PrintTextPixelCoords(buffer, 4, 104 + line * 16, 0); } static void sub_80A4ADC(u8 taskId) @@ -1618,7 +2085,7 @@ static void sub_80A4ADC(u8 taskId) static void sub_80A4B14(s8 a, u8 b) { gBagPocketScrollStates[sCurrentBagPocket].scrollTop += a; - MoveMenuCursor(0); + Menu_MoveCursor(0); sub_80A73C0(); sub_80A763C(); sub_80A4ADC(b); @@ -1626,7 +2093,7 @@ static void sub_80A4B14(s8 a, u8 b) static void sub_80A4B58(s8 delta, u8 b) { - gBagPocketScrollStates[sCurrentBagPocket].cursorPos = MoveMenuCursor(delta); + gBagPocketScrollStates[sCurrentBagPocket].cursorPos = Menu_MoveCursor(delta); sub_80A73C0(); sub_80A4ADC(b); } @@ -1649,7 +2116,7 @@ static void sub_80A4BF0(u16 *a) if (gUnknown_02038564 == 4) { - MenuDrawTextWindow(0, 7, 13, 12); + Menu_DrawStdWindowFrame(0, 7, 13, 12); sub_80A4008(a, 1, 8, 12, 4); if (sub_80F9344() == TRUE && sReturnLocation == RETURN_TO_FIELD_5) { @@ -1665,7 +2132,7 @@ static void sub_80A4BF0(u16 *a) text = sub_80A4B90(gSpecialVar_ItemId); else text = sItemPopupMenuActions[sPopupMenuActionList[i]].text; - MenuPrint(text, 1 + (i / 2) * 6, 8 + (i % 2) * 2); + Menu_PrintText(text, 1 + (i / 2) * 6, 8 + (i % 2) * 2); } } if (sReturnLocation == RETURN_TO_FIELD_5) @@ -1676,10 +2143,10 @@ static void sub_80A4BF0(u16 *a) } else { - MenuDrawTextWindow(0, 5, 13, 12); + Menu_DrawStdWindowFrame(0, 5, 13, 12); sub_80A4008(a, 1, 6, 12, 6); for (i = 0; i < gUnknown_02038564; i++) - MenuPrint(sItemPopupMenuActions[sPopupMenuActionList[i]].text, 1 + (i / 3) * 6, 6 + (i % 3) * 2); + Menu_PrintText(sItemPopupMenuActions[sPopupMenuActionList[i]].text, 1 + (i / 3) * 6, 6 + (i % 3) * 2); InitMenu(0, 1, 6, gUnknown_02038564, 0, 1); sub_8072DCC(0x2F); } @@ -1690,7 +2157,7 @@ static void sub_80A4DA4(u16 *a) { sub_80A73FC(); sub_80A36B8(a, 0, 6, 13, 6); - MenuZeroFillWindowRect(0, 5, 13, 12); + Menu_EraseWindowRect(0, 5, 13, 12); sub_80A7590(); } @@ -1699,7 +2166,7 @@ static void sub_80A4DD8(u8 taskId, u8 b, u8 c, u8 d, u8 e, u8 digits) gTasks[taskId].data[1] = 1; gTasks[taskId].data[2] = b + 2; gTasks[taskId].data[3] = c + 1; - MenuDrawTextWindow(b, c, b + d, c + e); + Menu_DrawStdWindowFrame(b, c, b + d, c + e); sub_80A4008(gBGTilemapBuffers[1], b + 1, c + 1, d - 1, e - 1); sub_80A418C(1, 1, b + 2, c + 1, digits); } @@ -1707,14 +2174,14 @@ static void sub_80A4DD8(u8 taskId, u8 b, u8 c, u8 d, u8 e, u8 digits) static void sub_80A4E8C(s8 delta, u8 b) { PlaySE(SE_SELECT); - sub_80F979C(0, 1); - sub_80F979C(1, 1); - sub_80F979C(2, 1); - sub_80F979C(3, 1); - PauseVerticalScrollIndicator(0); - PauseVerticalScrollIndicator(1); - PauseVerticalScrollIndicator(2); - PauseVerticalScrollIndicator(3); + SetVerticalScrollIndicators(TOP_ARROW, INVISIBLE); + SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE); + SetVerticalScrollIndicators(LEFT_ARROW, INVISIBLE); + SetVerticalScrollIndicators(RIGHT_ARROW, INVISIBLE); + PauseVerticalScrollIndicator(TOP_ARROW); + PauseVerticalScrollIndicator(BOTTOM_ARROW); + PauseVerticalScrollIndicator(LEFT_ARROW); + PauseVerticalScrollIndicator(RIGHT_ARROW); ChangePocket(gBGTilemapBuffers[2], delta); DrawPocketIndicatorDots(gBGTilemapBuffers[2], sCurrentBagPocket); sub_80A3770(); @@ -1866,10 +2333,10 @@ static void sub_80A50C8(u8 taskId) gUnknown_02038560 = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos; gSpecialVar_ItemId = gCurrentBagPocketItemSlots[gUnknown_02038560].itemId; gUnknown_083C16BC[sReturnLocation].onItemSelect(taskId); - sub_80F98A4(0); - sub_80F98A4(1); - sub_80F98A4(2); - sub_80F98A4(3); + StopVerticalScrollIndicators(TOP_ARROW); + StopVerticalScrollIndicators(BOTTOM_ARROW); + StopVerticalScrollIndicators(LEFT_ARROW); + StopVerticalScrollIndicators(RIGHT_ARROW); sub_80A797C(); } else @@ -1901,7 +2368,7 @@ static void sub_80A50C8(u8 taskId) } } -bool8 sub_80A52C4(u8 taskId, u16 b) +bool8 SellMenu_QuantityRoller(u8 taskId, u16 b) { s16 *taskData = gTasks[taskId].data; @@ -1948,7 +2415,7 @@ static bool8 sub_80A5350(u8 taskId) { s16 *taskData = gTasks[taskId].data; - if (sub_80A52C4(taskId, gCurrentBagPocketItemSlots[gUnknown_02038560].quantity) == TRUE) + if (SellMenu_QuantityRoller(taskId, gCurrentBagPocketItemSlots[gUnknown_02038560].quantity) == TRUE) { // if (sCurrentBagPocket == BAG_POCKET_BERRIES) Can't get it to match this way if (sCurrentBagPocket + 1 == BAG_POCKET_BERRIES + 1) @@ -2539,7 +3006,7 @@ static void sub_80A57C4(void) r5 = 7; } sub_80A4008(gBGTilemapBuffers[1], 7, r5 + 1, 6, gUnknown_02038564 * 2); - MenuDrawTextWindow(6, r5, 13, gUnknown_02038564 * 2 + 1 + r5); + Menu_DrawStdWindowFrame(6, r5, 13, gUnknown_02038564 * 2 + 1 + r5); sub_80A7834(0, r5); InitMenu(0, 7, r5 + 1, gUnknown_02038564, 0, 6); } @@ -2553,7 +3020,7 @@ static void sub_80A5888(u8 taskId) if (sPopupMenuSelection != 0) { PlaySE(SE_SELECT); - sPopupMenuSelection = MoveMenuCursor(-1); + sPopupMenuSelection = Menu_MoveCursor(-1); } } else if (gMain.newAndRepeatedKeys & DPAD_DOWN) @@ -2561,7 +3028,7 @@ static void sub_80A5888(u8 taskId) if (sPopupMenuSelection != gUnknown_02038564 - 1) { PlaySE(SE_SELECT); - sPopupMenuSelection = MoveMenuCursor(1); + sPopupMenuSelection = Menu_MoveCursor(1); } } else if (gMain.newKeys & A_BUTTON) @@ -2690,14 +3157,14 @@ static void sub_80A5C24(u8 taskId) void CleanUpItemMenuMessage(u8 taskId) { sub_80A36B8(gBGTilemapBuffers[1], 0, 0, 31, 31); - MenuZeroFillWindowRect(7, 7, 13, 12); - MenuZeroFillWindowRect(0, 14, 29, 19); + Menu_EraseWindowRect(7, 7, 13, 12); + Menu_EraseWindowRect(0, 14, 29, 19); gTasks[taskId].func = sub_80A5C24; } void CleanUpOverworldMessage(u8 taskId) { - MenuZeroFillWindowRect(0, 13, 29, 19); + Menu_EraseWindowRect(0, 13, 29, 19); DestroyTask(taskId); sub_8064E2C(); ScriptContext2_Disable(); @@ -2711,7 +3178,7 @@ void ExecuteItemUseFromBlackPalette(void) static void Task_CallItemUseOnFieldCallback(u8 taskId) { - if (sub_807D770() == TRUE) + if (IsWeatherNotFadingIn() == TRUE) gFieldItemUseCallback(taskId); } @@ -2760,7 +3227,7 @@ static void sub_80A5DA0(u16 itemId, u16 quantity) static void sub_80A5DF8(void) { sub_80A4DA4(gBGTilemapBuffers[1]); - MenuZeroFillWindowRect(7, 6, 11, 13); + Menu_EraseWindowRect(7, 6, 11, 13); sub_80A7528(4); } @@ -2857,7 +3324,7 @@ static void sub_80A6024(u8 taskId) if (gMain.newKeys & A_BUTTON) { sub_80A36B8(gBGTilemapBuffers[1], 0, 0, 31, 31); - MenuZeroFillWindowRect(0, 14, 29, 19); + Menu_EraseWindowRect(0, 14, 29, 19); gTasks[taskId].func = sub_80A6000; } } @@ -2963,7 +3430,7 @@ static void sub_80A62D8(void) gUnknown_02038563 = CreateTask(sub_80A50C8, 0); } -void sub_80A6300(void) +void ItemMenu_LoadSellMenu(void) { sReturnLocation = RETURN_TO_SHOP; SetMainCallback2(sub_80A62D8); @@ -2971,7 +3438,7 @@ void sub_80A6300(void) static void OnBagClose_Shop(u8 taskId) { - gFieldCallback = sub_80B3050; + gFieldCallback = Shop_FadeReturnToMartMenu; gTasks[taskId].data[8] = (u32)c2_exit_to_overworld_2_switch >> 16; gTasks[taskId].data[9] = (u32)c2_exit_to_overworld_2_switch; sub_80A5AE4(taskId); @@ -3008,7 +3475,7 @@ static void sub_80A640C(u8 taskId) static void sub_80A6444(u8 taskId) { sub_80A36B8(gBGTilemapBuffers[1], 0, 0, 31, 31); - MenuZeroFillWindowRect(0, 14, 29, 19); + Menu_EraseWindowRect(0, 14, 29, 19); gTasks[taskId].func = sub_80A640C; } @@ -3016,7 +3483,7 @@ static void sub_80A648C(u8 taskId) { gTasks[taskId].func = Task_BuyHowManyDialogueHandleInput; sub_80A4008(gBGTilemapBuffers[1], 1, 11, 12, 2); - MenuDrawTextWindow(0, 10, 13, 13); + Menu_DrawStdWindowFrame(0, 10, 13, 13); gTasks[taskId].data[1] = 1; gTasks[taskId].data[2] = 1; gTasks[taskId].data[3] = 11; @@ -3053,7 +3520,7 @@ static void sub_80A6574(u8 taskId) static void sub_80A65AC(u8 taskId) { - MenuZeroFillWindowRect(7, 6, 13, 12); + Menu_EraseWindowRect(7, 6, 13, 12); sub_80A36B8(gBGTilemapBuffers[1], 7, 6, 6, 6); CopyItemName(gSpecialVar_ItemId, gStringVar2); StringExpandPlaceholders(gStringVar4, gOtherText_SoldItem); @@ -3063,7 +3530,7 @@ static void sub_80A65AC(u8 taskId) static void sub_80A6618(u8 taskId) { - MenuZeroFillWindowRect(7, 6, 13, 12); + Menu_EraseWindowRect(7, 6, 13, 12); sub_80A36B8(gBGTilemapBuffers[1], 7, 6, 6, 6); BuyMenuPrintItemQuantityAndPrice(taskId); } @@ -3078,13 +3545,13 @@ static void Task_BuyHowManyDialogueHandleInput(u8 taskId) { if (sub_80A5350(taskId) == TRUE) { - MenuZeroFillWindowRect(6, 11, 12, 11); + Menu_EraseWindowRect(6, 11, 12, 11); BuyMenuDisplayMessage(gSpecialVar_ItemId, gTasks[taskId].data[1]); } else if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); - MenuZeroFillWindowRect(0, 10, 13, 13); + Menu_EraseWindowRect(0, 10, 13, 13); sub_80A36B8(gBGTilemapBuffers[1], 0, 10, 13, 3); ConvertIntToDecimalStringN(gStringVar1, ItemId_GetPrice(gSpecialVar_ItemId) / 2 * gTasks[taskId].data[1], STR_CONV_MODE_LEFT_ALIGN, 6); StringExpandPlaceholders(gStringVar4, gOtherText_CanPay); @@ -3110,8 +3577,8 @@ static void BuyMenuPrintItemQuantityAndPrice(u8 taskId) { sub_80A36B8(gBGTilemapBuffers[1], 0, 0, 31, 31); CloseMoneyWindow(0, 0); - MenuZeroFillWindowRect(0, 4, 13, 13); - MenuZeroFillWindowRect(0, 14, 29, 19); + Menu_EraseWindowRect(0, 4, 13, 13); + Menu_EraseWindowRect(0, 14, 29, 19); gTasks[taskId].func = sub_80A6760; } @@ -3229,7 +3696,7 @@ static void sub_80A6A84(u8 taskId) sub_80A4DA4(gBGTilemapBuffers[1]); CopyItemName(gSpecialVar_ItemId, gStringVar1); ConvertIntToDecimalStringN(gStringVar2, taskData[1], STR_CONV_MODE_LEFT_ALIGN, 3); - MenuZeroFillWindowRect(7, 6, 11, 13); + Menu_EraseWindowRect(7, 6, 11, 13); sub_80A7528(7); sub_80A3D5C(taskId); gTasks[taskId].func = sub_80A5E1C; @@ -3361,16 +3828,16 @@ static void sub_80A6DF0(u16 *a) { u8 r6 = (gUnknown_02038564 - 1) * 2; - MenuDrawTextWindow(7, 9 - r6, 13, 12); + Menu_DrawStdWindowFrame(7, 9 - r6, 13, 12); sub_80A4008(a, 8, 10 - r6, 5, r6 + 2); if (gUnknown_02038564 == 1) { - MenuPrint(sItemPopupMenuActions[sPopupMenuActionList[0]].text, 8, 10); + Menu_PrintText(sItemPopupMenuActions[sPopupMenuActionList[0]].text, 8, 10); } else { - MenuPrint(sItemPopupMenuActions[sPopupMenuActionList[0]].text, 8, 8); - MenuPrint(sItemPopupMenuActions[sPopupMenuActionList[1]].text, 8, 10); + Menu_PrintText(sItemPopupMenuActions[sPopupMenuActionList[0]].text, 8, 8); + Menu_PrintText(sItemPopupMenuActions[sPopupMenuActionList[1]].text, 8, 10); } InitMenu(0, 8, 10 - r6, gUnknown_02038564, 0, 5); sub_80A7528(2); @@ -3383,7 +3850,7 @@ static void sub_80A6EB8(u8 taskId) if (sPopupMenuSelection == 1) { PlaySE(SE_SELECT); - sPopupMenuSelection = MoveMenuCursor(-1); + sPopupMenuSelection = Menu_MoveCursor(-1); } } else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) @@ -3391,7 +3858,7 @@ static void sub_80A6EB8(u8 taskId) if (sPopupMenuSelection + 1 < gUnknown_02038564) { PlaySE(SE_SELECT); - sPopupMenuSelection = MoveMenuCursor(1); + sPopupMenuSelection = Menu_MoveCursor(1); } } else if (gMain.newKeys & A_BUTTON) @@ -3523,8 +3990,8 @@ static void sub_80A7230(u8 taskId) break; case 204: PlaySE(SE_SELECT); - sub_80F98A4(2); - sub_80F98A4(3); + StopVerticalScrollIndicators(LEFT_ARROW); + StopVerticalScrollIndicators(RIGHT_ARROW); gSpecialVar_ItemId = ITEM_POKE_BALL; sPopupMenuActionList = gUnknown_083C1708; gUnknown_02038564 = 2; @@ -3559,7 +4026,7 @@ static void ItemListMenu_InitMenu(void) static void sub_80A73C0(void) { - sub_814AD7C(0x70, gBagPocketScrollStates[sCurrentBagPocket].cursorPos * 16 + 16); + MenuCursor_SetPos814AD7C(0x70, gBagPocketScrollStates[sCurrentBagPocket].cursorPos * 16 + 16); } static void sub_80A73F0(void) @@ -3569,16 +4036,53 @@ static void sub_80A73F0(void) static void sub_80A73FC(void) { - HandleDestroyMenuCursors(); - sub_814AD44(); + Menu_DestroyCursor(); + MenuCursor_Destroy814AD44(); } +#if DEBUG +__attribute__((naked)) +static void sub_80A740C(void) +{ + asm("\ + push {lr}\n\ + add sp, sp, #0xfffffffc\n\ + bl sub_80A75E4\n\ + bl sub_80A7768\n\ + bl sub_80A7420\n\ + ldr r0, ._931 @ gLinkOpen\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._930 @cond_branch\n\ + ldr r0, ._931 + 4 @ gLink\n\ + ldr r1, ._931 + 8 @ 0xfbd\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + mov r1, #0x0\n\ + str r1, [sp]\n\ + mov r1, #0x1\n\ + mov r2, #0x1\n\ + mov r3, #0x2\n\ + bl debug_sub_8008264\n\ +._930:\n\ + add sp, sp, #0x4\n\ + pop {r0}\n\ + bx r0\n\ +._932:\n\ + .align 2, 0\n\ +._931:\n\ + .word gLinkOpen\n\ + .word gLink\n\ + .word 0xfbd"); +} +#else static void sub_80A740C(void) { sub_80A75E4(); sub_80A7768(); sub_80A7420(); } +#endif static void sub_80A7420(void) { @@ -3669,7 +4173,7 @@ static void sub_80A756C(void) static void sub_80A7590(void) { - MenuZeroFillWindowRect(0, 13, 13, 20); + Menu_EraseWindowRect(0, 13, 13, 20); sub_80A756C(); } @@ -3748,7 +4252,7 @@ static void sub_80A7694(void) static void sub_80A76A0(void) { - MenuZeroFillWindowRect(14, 2, 29, 18); + Menu_EraseWindowRect(14, 2, 29, 18); sub_80A7678(); } @@ -3816,7 +4320,7 @@ static void sub_80A7768(void) const u8 *text = sItemPopupMenuActions[sPopupMenuActionList[r4->unk1 - 1]].text; int var = r4->unk1 - 1; - MenuPrint(text, 7, var * 2 + 1 + r4->unk3); + Menu_PrintText(text, 7, var * 2 + 1 + r4->unk3); } else { @@ -3828,7 +4332,7 @@ static void sub_80A7768(void) else text = sItemPopupMenuActions[sPopupMenuActionList[r4->unk1 - 1]].text; var = r4->unk1 - 1; - MenuPrint(text, (var >> 1) * 6 + 1, (var & 1) * 2 + 8); + Menu_PrintText(text, (var >> 1) * 6 + 1, (var & 1) * 2 + 8); } if (r4->unk1 == gUnknown_02038564) { diff --git a/src/field/item_use.c b/src/field/item_use.c index e1fdddce0..219ef5080 100644 --- a/src/field/item_use.c +++ b/src/field/item_use.c @@ -40,7 +40,7 @@ extern void (*gFieldItemUseCallback)(u8); extern void (*gFieldCallback)(void); extern void (*gUnknown_0300485C)(void); -extern void (*gUnknown_03004AE4)(u8, u16, TaskFunc); +extern void (*gPokemonItemUseCallback)(u8, u16, TaskFunc); extern u8 gUnknown_02038561; extern u8 gLastFieldPokeMenuOpened; @@ -100,7 +100,7 @@ void ItemMenu_ConfirmNormalFade(u8 var) void ItemMenu_ConfirmComplexFade(u8 var) { ExecuteSwitchToOverworldFromItemUse(var); - fade_screen(1, 0); + FadeScreen(1, 0); } void SetUpItemUseOnFieldCallback(u8 taskId) @@ -123,7 +123,7 @@ void HandleDeniedItemUseMessage(u8 var1, u8 playerMenuStatus, const u8 *text) switch (playerMenuStatus) { case 0: // Item Menu - MenuZeroFillWindowRect(0, 13, 13, 20); + Menu_EraseWindowRect(0, 13, 13, 20); DisplayItemMessageOnField(var1, gStringVar4, CleanUpItemMenuMessage, 1); break; default: // Field @@ -259,7 +259,7 @@ void ItemUseOnFieldCB_Rod(u8 taskId) void ItemUseOutOfBattle_Itemfinder(u8 var) { - IncrementGameStat(0x27); + IncrementGameStat(GAME_STAT_USED_ITEMFINDER); gFieldItemUseCallback = (void *)ItemUseOnFieldCB_Itemfinder; SetUpItemUseOnFieldCallback(var); } @@ -312,7 +312,7 @@ void RunItemfinderResults(u8 taskId) void ExitItemfinder(u8 taskId) { - MenuZeroFillWindowRect(0, 14, 29, 19); + Menu_EraseWindowRect(0, 14, 29, 19); sub_8064E2C(); ScriptContext2_Disable(); DestroyTask(taskId); @@ -744,7 +744,7 @@ void ItemUseOutOfBattle_CoinCase(u8 taskId) if (!gTasks[taskId].data[2]) { - MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); + Menu_EraseWindowRect(0, 0xD, 0xD, 0x14); DisplayItemMessageOnField(taskId, gStringVar4, CleanUpItemMenuMessage, 1); } else @@ -770,7 +770,7 @@ void ItemUseOutOfBattle_SSTicket(u8 taskId) { if (gTasks[taskId].data[2] == 0) { - MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); + Menu_EraseWindowRect(0, 0xD, 0xD, 0x14); DisplayItemMessageOnField(taskId, gUnknown_083D61DC[ItemId_GetSecondaryId(gSpecialVar_ItemId)], sub_80C9BB8, 1); } else @@ -832,7 +832,7 @@ void sub_80C9D98(u8 taskId) void ItemUseOutOfBattle_Medicine(u8 taskId) { - gUnknown_03004AE4 = UseMedicine; + gPokemonItemUseCallback = UseMedicine; sub_80C9D98(taskId); } @@ -850,34 +850,34 @@ void ItemUseOutOfBattle_SacredAsh(u8 taskId) break; } } - gUnknown_03004AE4 = sub_8070048; + gPokemonItemUseCallback = sub_8070048; gUnknown_02038561 = 4; ItemMenu_ConfirmNormalFade(taskId); } void ItemUseOutOfBattle_PPRecovery(u8 taskId) { - gUnknown_03004AE4 = DoPPRecoveryItemEffect; + gPokemonItemUseCallback = DoPPRecoveryItemEffect; sub_80C9D98(taskId); } void ItemUseOutOfBattle_PPUp(u8 taskId) { - gUnknown_03004AE4 = DoPPUpItemEffect; + gPokemonItemUseCallback = DoPPUpItemEffect; sub_80C9D98(taskId); } void ItemUseOutOfBattle_RareCandy(u8 taskId) { - gUnknown_03004AE4 = DoRareCandyItemEffect; + gPokemonItemUseCallback = DoRareCandyItemEffect; sub_80C9D98(taskId); } void ItemUseOutOfBattle_TMHM(u8 taskId) { - MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); + Menu_EraseWindowRect(0, 0xD, 0xD, 0x14); - if (gSpecialVar_ItemId >= ITEM_HM01) + if (gSpecialVar_ItemId >= ITEM_HM01_CUT) DisplayItemMessageOnField(taskId, gOtherText_BootedHM, sub_80C9EE4, 1); // HM else DisplayItemMessageOnField(taskId, gOtherText_BootedTM, sub_80C9EE4, 1); // TM @@ -908,7 +908,7 @@ void sub_80C9F80(u8 var) void sub_80C9FC0(u8 var) { - gUnknown_03004AE4 = TeachMonTMMove; + gPokemonItemUseCallback = TeachMonTMMove; sub_80C9D98(var); } @@ -1009,7 +1009,7 @@ void ItemUseOutOfBattle_EscapeRope(u8 taskId) void ItemUseOutOfBattle_EvolutionStone(u8 var) { - gUnknown_03004AE4 = DoEvolutionStoneItemEffect; + gPokemonItemUseCallback = DoEvolutionStoneItemEffect; sub_80C9D98(var); } @@ -1022,7 +1022,7 @@ void ItemUseInBattle_PokeBall(u8 var) } else { - MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); + Menu_EraseWindowRect(0, 0xD, 0xD, 0x14); DisplayItemMessageOnField(var, gOtherText_BoxIsFull, CleanUpItemMenuMessage, 1); } } @@ -1047,7 +1047,7 @@ void ItemUseInBattle_StatIncrease(u8 taskId) { u16 partyId = gBattlePartyID[gBankInMenu]; - MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); + Menu_EraseWindowRect(0, 0xD, 0xD, 0x14); if (ExecuteTableBasedItemEffect_(&gPlayerParty[partyId], gSpecialVar_ItemId, partyId, 0) != FALSE) { @@ -1078,25 +1078,25 @@ void sub_80CA3C0(u8 taskId) void ItemUseInBattle_Medicine(u8 var) { - gUnknown_03004AE4 = UseMedicine; + gPokemonItemUseCallback = UseMedicine; sub_80CA3C0(var); } void unref_sub_80CA410(u8 var) { - gUnknown_03004AE4 = sub_8070048; + gPokemonItemUseCallback = sub_8070048; sub_80CA3C0(var); } void ItemUseInBattle_PPRecovery(u8 var) { - gUnknown_03004AE4 = DoPPRecoveryItemEffect; + gPokemonItemUseCallback = DoPPRecoveryItemEffect; sub_80CA3C0(var); } void unref_sub_80CA448(u8 var) { - MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); + Menu_EraseWindowRect(0, 0xD, 0xD, 0x14); if (ExecuteTableBasedItemEffect__(0, gSpecialVar_ItemId, 0) == FALSE) { @@ -1113,7 +1113,7 @@ void unref_sub_80CA448(u8 var) void ItemUseInBattle_Escape(u8 taskId) { - MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); + Menu_EraseWindowRect(0, 0xD, 0xD, 0x14); if((gBattleTypeFlags & BATTLE_TYPE_TRAINER) == FALSE) { diff --git a/src/field/map_name_popup.c b/src/field/map_name_popup.c index 2e2dfc72e..49a470cc1 100644 --- a/src/field/map_name_popup.c +++ b/src/field/map_name_popup.c @@ -89,8 +89,8 @@ void HideMapNamePopup(void) { if (FuncIsActiveTask(Task_MapNamePopup)) { - MenuLoadTextWindowGraphics(); - MenuZeroFillWindowRect(0, 0, 13, 3); + Menu_LoadStdFrameGraphics(); + Menu_EraseWindowRect(0, 0, 13, 3); REG_BG0VOFS = 0; DestroyTask(sTaskId); } @@ -100,8 +100,8 @@ void DrawMapNamePopup(void) { u8 name[20]; - MenuLoadTextWindowGraphics_OverrideFrameType(0); + Menu_LoadStdFrameGraphicsOverrideStyle(0); GetMapSectionName(name, gMapHeader.regionMapSectionId, 0); - MenuDrawTextWindow(0, 0, 13, 3); + Menu_DrawStdWindowFrame(0, 0, 13, 3); sub_8072BD8(name, 1, 1, 0x60); } diff --git a/src/field/mauville_man.c b/src/field/mauville_man.c index 4db513f65..b42c50513 100644 --- a/src/field/mauville_man.c +++ b/src/field/mauville_man.c @@ -250,7 +250,88 @@ void SetupMauvilleOldMan(void) sub_80F83D0(); } -static u8 GetCurrentMauvilleOldMan(void) +#if DEBUG +__attribute__((naked)) +void debug_sub_810B32C() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffff8\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x4\n" + " bhi ._37 @cond_branch\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._23 @ \n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " mov pc, r0\n" + "._24:\n" + " .align 2, 0\n" + "._23:\n" + " .word ._22\n" + "._22:\n" + " .word ._25\n" + " .word ._26\n" + " .word ._27\n" + " .word ._28\n" + " .word ._29\n" + "._25:\n" + " bl SetupBard\n" + " b ._37\n" + "._26:\n" + " mov r2, #0x0\n" + " ldr r3, ._34 @ gSaveBlock1\n" + "._31:\n" + " mov r0, sp\n" + " add r1, r0, r2\n" + " add r0, r2, r3\n" + " ldrb r0, [r0]\n" + " strb r0, [r1]\n" + " add r0, r2, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " cmp r2, #0x7\n" + " bls ._31 @cond_branch\n" + " bl SetupHipster\n" + " mov r2, #0x0\n" + " ldr r3, ._34 @ gSaveBlock1\n" + "._32:\n" + " add r1, r2, r3\n" + " mov r4, sp\n" + " add r0, r4, r2\n" + " ldrb r0, [r0]\n" + " strb r0, [r1]\n" + " add r0, r2, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " cmp r2, #0x7\n" + " bls ._32 @cond_branch\n" + " b ._37\n" + "._35:\n" + " .align 2, 0\n" + "._34:\n" + " .word gSaveBlock1+0x2d8c\n" + "._27:\n" + " bl SetupTrader\n" + " b ._37\n" + "._28:\n" + " bl SetupStoryteller\n" + " b ._37\n" + "._29:\n" + " bl SetupGiddy\n" + "._37:\n" + " bl sub_80F83D0\n" + " add sp, sp, #0x8\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} +#endif + +u8 GetCurrentMauvilleOldMan(void) { struct MauvilleManCommon *common = &gSaveBlock1.mauvilleMan.common; @@ -345,7 +426,7 @@ void PrepareSongText(void) void ScrSpecial_PlayBardSong(void) { StartBardSong(gSpecialVar_0x8004); - MenuDisplayMessageBox(); + Menu_DisplayDialogueFrame(); ScriptContext1_Stop(); } @@ -858,8 +939,8 @@ static void Task_BardSong(u8 taskId) { case 0: // Initialize song PrepareSongText(); - InitWindowFromConfig(gMenuWindowPtr, &gWindowConfig_81E6CE4); - sub_8002EB0(gMenuWindowPtr, gStringVar4, 2, 4, 15); + Text_InitWindowWithTemplate(gMenuWindowPtr, &gWindowTemplate_81E6CE4); + Text_InitWindow8002EB0(gMenuWindowPtr, gStringVar4, 2, 4, 15); task->data[1] = 0; task->data[2] = 0; task->tCharIndex = 0; @@ -921,7 +1002,7 @@ static void Task_BardSong(u8 taskId) } else if (gStringVar4[task->tCharIndex] == CHAR_SPACE) { - sub_8003418(gMenuWindowPtr); + Text_PrintWindowSimple(gMenuWindowPtr); task->tCharIndex++; task->tState = 2; task->data[2] = 0; @@ -941,7 +1022,7 @@ static void Task_BardSong(u8 taskId) else if (gStringVar4[task->tCharIndex] == CHAR_SONG_WORD_SEPARATOR) { gStringVar4[task->tCharIndex] = CHAR_SPACE; // restore it back to a space - sub_8003418(gMenuWindowPtr); + Text_PrintWindowSimple(gMenuWindowPtr); task->tCharIndex++; task->data[2] = 0; } @@ -950,7 +1031,7 @@ static void Task_BardSong(u8 taskId) switch (task->data[1]) { case 0: - sub_8003418(gMenuWindowPtr); + Text_PrintWindowSimple(gMenuWindowPtr); task->data[1]++; break; case 1: @@ -1219,7 +1300,7 @@ static void PrintStoryList(void) { s32 i; - MenuDrawTextWindow(0, 0, 25, 4 + GetFreeStorySlot() * 2); + Menu_DrawStdWindowFrame(0, 0, 25, 4 + GetFreeStorySlot() * 2); for (i = 0; i < 4; i++) { struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller; @@ -1227,9 +1308,9 @@ static void PrintStoryList(void) if (stat == 0) break; - MenuPrint(GetStoryTitleByStat(stat), 1, 2 + i * 2); + Menu_PrintText(GetStoryTitleByStat(stat), 1, 2 + i * 2); } - MenuPrint(gPCText_Cancel, 1, 2 + i * 2); + Menu_PrintText(gPCText_Cancel, 1, 2 + i * 2); } static u8 gUnknown_03000748; @@ -1247,7 +1328,7 @@ static void Task_StoryListMenu(u8 taskId) task->data[0]++; break; case 1: - selection = ProcessMenuInput(); + selection = Menu_ProcessInput(); if (selection == -2) break; if (selection == -1 || selection == GetFreeStorySlot()) @@ -1259,8 +1340,8 @@ static void Task_StoryListMenu(u8 taskId) gSpecialVar_Result = 1; gUnknown_03000748 = selection; } - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 25, 12); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 25, 12); DestroyTask(taskId); EnableBothScriptContexts(); break; diff --git a/src/field/menu_helpers.c b/src/field/menu_helpers.c index e3ef0c790..388d98ec7 100644 --- a/src/field/menu_helpers.c +++ b/src/field/menu_helpers.c @@ -18,7 +18,7 @@ static void sub_80F9834(struct Sprite *sprite); -static EWRAM_DATA u8 gUnknown_020388C0[4] = {0}; +static EWRAM_DATA u8 gVerticalScrollIndicatorIds[4] = {0}; static EWRAM_DATA struct YesNoFuncTable gUnknown_020388C4 = {0}; static TaskFunc gUnknown_0300074C; @@ -125,7 +125,7 @@ static const struct SpriteTemplate gSpriteTemplate_83E5A00 = .callback = SpriteCallbackDummy, }; -void sub_80F9020(void) +void ClearBGTilemapBuffers(void) { memset(&gBGTilemapBuffers[1], 0, 0x800); memset(&gBGTilemapBuffers[2], 0, 0x800); @@ -135,7 +135,7 @@ void sub_80F9020(void) // display message box, fill box with tile if tile is not zero, print string static void PrintMessage(const u8 *str, u16 tile) { - MenuDisplayMessageBox(); + Menu_DisplayDialogueFrame(); if (tile) { sub_80A3FA0(&gBGTilemapBuffers[1][0], 2, 15, 26, 4, tile); @@ -145,7 +145,7 @@ static void PrintMessage(const u8 *str, u16 tile) static void sub_80F9090(u8 taskId) { - if (MenuUpdateWindowText() == TRUE) + if (Menu_UpdateWindowText() == TRUE) { gUnknown_0300074C(taskId); } @@ -160,7 +160,7 @@ void DisplayItemMessageOnField(u8 taskId, const u8 *str, TaskFunc callback, u16 static void Task_CallYesOrNoCallback(u8 taskId) { - switch (ProcessMenuInputNoWrap_()) + switch (Menu_ProcessInputNoWrap_()) { case 0: PlaySE(SE_SELECT); @@ -196,7 +196,7 @@ static void PrintStringWithPalette(const u8 *str, u8 paletteNum, u8 left, u8 top StringCopy(gStringVar4, str); } - MenuPrint(gStringVar4, left, top); + Menu_PrintText(gStringVar4, left, top); } // unused @@ -209,7 +209,7 @@ void PrintNumberWithPalette(s32 value, u8 paletteNum, u8 n, u8 mode, u8 left, u8 } else { - MenuPrint(gStringVar1, left, top); + Menu_PrintText(gStringVar1, left, top); } } @@ -296,9 +296,6 @@ bool8 sub_80F9344(void) void sub_80F9368(void) { - u8 *addr; - u32 size; - REG_DISPCNT = 0; REG_BG3CNT = 0; REG_BG2CNT = 0; @@ -312,38 +309,24 @@ void sub_80F9368(void) REG_BG1VOFS = 0; REG_BG0HOFS = 0; REG_BG0VOFS = 0; - - addr = (u8 *)VRAM; - size = 0x18000; - while (1) - { - DmaFill16(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill16(3, 0, addr, size); - break; - } - } - + DmaFill16Large(3, 0, (u8 *)VRAM, 0x18000, 0x1000); DmaClear32(3, OAM, OAM_SIZE); DmaClear16(3, PLTT, PLTT_SIZE); } -void sub_80F9438(void) +void ClearVideoCallbacks(void) { SetVBlankCallback(NULL); SetHBlankCallback(NULL); } -void sub_80F944C(void) +void ClearVerticalScrollIndicatorPalettes(void) { u8 i; for (i = 0; i < 4; i++) { - gUnknown_020388C0[i] = 0xFF; + gVerticalScrollIndicatorIds[i] = 0xFF; } FreeSpritePaletteByTag(SCROLL_INDICATOR_PAL_TAG); @@ -401,92 +384,92 @@ void CreateVerticalScrollIndicators(u8 id, u16 x, u16 y) switch (id) { - case 0: - if (gUnknown_020388C0[0] == 0xFF) + case TOP_ARROW: + if (gVerticalScrollIndicatorIds[TOP_ARROW] == 0xFF) { - gUnknown_020388C0[0] = CreateSprite(&gSpriteTemplate_83E59D0, x, y, 0); - gSprites[gUnknown_020388C0[0]].data[2] = -1; - if (gUnknown_020388C0[1] != 0xFF) + gVerticalScrollIndicatorIds[TOP_ARROW] = CreateSprite(&gSpriteTemplate_83E59D0, x, y, 0); + gSprites[gVerticalScrollIndicatorIds[TOP_ARROW]].data[2] = -1; + if (gVerticalScrollIndicatorIds[BOTTOM_ARROW] != 0xFF) { - gSprites[gUnknown_020388C0[0]].pos2.y = gSprites[gUnknown_020388C0[1]].pos2.y * -1; - gSprites[gUnknown_020388C0[0]].data[3] = gSprites[gUnknown_020388C0[1]].data[3]; + gSprites[gVerticalScrollIndicatorIds[TOP_ARROW]].pos2.y = gSprites[gVerticalScrollIndicatorIds[BOTTOM_ARROW]].pos2.y * -1; + gSprites[gVerticalScrollIndicatorIds[TOP_ARROW]].data[3] = gSprites[gVerticalScrollIndicatorIds[BOTTOM_ARROW]].data[3]; } else { - gSprites[gUnknown_020388C0[0]].data[3] = 0; + gSprites[gVerticalScrollIndicatorIds[TOP_ARROW]].data[3] = 0; } } break; - case 1: - if (gUnknown_020388C0[1] == 0xFF) + case BOTTOM_ARROW: + if (gVerticalScrollIndicatorIds[BOTTOM_ARROW] == 0xFF) { - gUnknown_020388C0[1] = CreateSprite(&gSpriteTemplate_83E59D0, x, y, 0); - gSprites[gUnknown_020388C0[1]].data[2] = 1; - if (gUnknown_020388C0[0] != 0xFF) + gVerticalScrollIndicatorIds[BOTTOM_ARROW] = CreateSprite(&gSpriteTemplate_83E59D0, x, y, 0); + gSprites[gVerticalScrollIndicatorIds[BOTTOM_ARROW]].data[2] = 1; + if (gVerticalScrollIndicatorIds[TOP_ARROW] != 0xFF) { - gSprites[gUnknown_020388C0[1]].pos2.y = gSprites[gUnknown_020388C0[0]].pos2.y * -1; - gSprites[gUnknown_020388C0[1]].data[3] = gSprites[gUnknown_020388C0[0]].data[3]; + gSprites[gVerticalScrollIndicatorIds[BOTTOM_ARROW]].pos2.y = gSprites[gVerticalScrollIndicatorIds[TOP_ARROW]].pos2.y * -1; + gSprites[gVerticalScrollIndicatorIds[BOTTOM_ARROW]].data[3] = gSprites[gVerticalScrollIndicatorIds[TOP_ARROW]].data[3]; } else { - gSprites[gUnknown_020388C0[1]].data[3] = 0; + gSprites[gVerticalScrollIndicatorIds[BOTTOM_ARROW]].data[3] = 0; } } break; - case 2: - if (gUnknown_020388C0[2] == 0xFF) + case LEFT_ARROW: + if (gVerticalScrollIndicatorIds[LEFT_ARROW] == 0xFF) { - gUnknown_020388C0[2] = CreateSprite(&gSpriteTemplate_83E59E8, x, y, 0); - gSprites[gUnknown_020388C0[2]].data[0] = -1; - if (gUnknown_020388C0[3] != 0xFF) + gVerticalScrollIndicatorIds[LEFT_ARROW] = CreateSprite(&gSpriteTemplate_83E59E8, x, y, 0); + gSprites[gVerticalScrollIndicatorIds[LEFT_ARROW]].data[0] = -1; + if (gVerticalScrollIndicatorIds[RIGHT_ARROW] != 0xFF) { - gSprites[gUnknown_020388C0[2]].pos2.x = gSprites[gUnknown_020388C0[3]].pos2.x * -1; - gSprites[gUnknown_020388C0[2]].data[1] = gSprites[gUnknown_020388C0[3]].data[1]; + gSprites[gVerticalScrollIndicatorIds[LEFT_ARROW]].pos2.x = gSprites[gVerticalScrollIndicatorIds[RIGHT_ARROW]].pos2.x * -1; + gSprites[gVerticalScrollIndicatorIds[LEFT_ARROW]].data[1] = gSprites[gVerticalScrollIndicatorIds[RIGHT_ARROW]].data[1]; } else { - gSprites[gUnknown_020388C0[2]].data[1] = 0; + gSprites[gVerticalScrollIndicatorIds[LEFT_ARROW]].data[1] = 0; } } break; - case 3: - if (gUnknown_020388C0[3] == 0xFF) + case RIGHT_ARROW: + if (gVerticalScrollIndicatorIds[RIGHT_ARROW] == 0xFF) { - gUnknown_020388C0[3] = CreateSprite(&gSpriteTemplate_83E59E8, x, y, 0); - gSprites[gUnknown_020388C0[3]].data[0] = 1; - if (gUnknown_020388C0[2] != 0xFF) + gVerticalScrollIndicatorIds[RIGHT_ARROW] = CreateSprite(&gSpriteTemplate_83E59E8, x, y, 0); + gSprites[gVerticalScrollIndicatorIds[RIGHT_ARROW]].data[0] = 1; + if (gVerticalScrollIndicatorIds[LEFT_ARROW] != 0xFF) { - gSprites[gUnknown_020388C0[3]].pos2.x = gSprites[gUnknown_020388C0[2]].pos2.x * -1; - gSprites[gUnknown_020388C0[3]].data[1] = gSprites[gUnknown_020388C0[2]].data[1]; + gSprites[gVerticalScrollIndicatorIds[RIGHT_ARROW]].pos2.x = gSprites[gVerticalScrollIndicatorIds[LEFT_ARROW]].pos2.x * -1; + gSprites[gVerticalScrollIndicatorIds[RIGHT_ARROW]].data[1] = gSprites[gVerticalScrollIndicatorIds[LEFT_ARROW]].data[1]; } else { - gSprites[gUnknown_020388C0[3]].data[1] = 0; + gSprites[gVerticalScrollIndicatorIds[RIGHT_ARROW]].data[1] = 0; } } break; } - StartSpriteAnim(&gSprites[gUnknown_020388C0[id]], id & 1); + StartSpriteAnim(&gSprites[gVerticalScrollIndicatorIds[id]], id & 1); } -void sub_80F979C(u8 id, bool8 invisible) +void SetVerticalScrollIndicators(u8 id, bool8 invisible) { - if (id < 4 && gUnknown_020388C0[id] != 0xFF) + if (id < 4 && gVerticalScrollIndicatorIds[id] != 0xFF) { - gSprites[gUnknown_020388C0[id]].invisible = invisible; + gSprites[gVerticalScrollIndicatorIds[id]].invisible = invisible; } } void DestroyVerticalScrollIndicator(u8 id) { - if (id < 4 && gUnknown_020388C0[id] != 0xFF) + if (id < 4 && gVerticalScrollIndicatorIds[id] != 0xFF) { - DestroySprite(&gSprites[gUnknown_020388C0[id]]); - gUnknown_020388C0[id] = 0xFF; + DestroySprite(&gSprites[gVerticalScrollIndicatorIds[id]]); + gVerticalScrollIndicatorIds[id] = 0xFF; } } @@ -530,43 +513,43 @@ static void sub_80F9834(struct Sprite *sprite) } } -void sub_80F98A4(u8 id) +void StopVerticalScrollIndicators(u8 id) { - if (gUnknown_020388C0[id] != 0xFF && id < 4) + if (gVerticalScrollIndicatorIds[id] != 0xFF && id < 4) { - gSprites[gUnknown_020388C0[id]].callback = SpriteCallbackDummy; + gSprites[gVerticalScrollIndicatorIds[id]].callback = SpriteCallbackDummy; } } void StartVerticalScrollIndicators(u8 id) { - if (gUnknown_020388C0[id] != 0xFF && id < 4) + if (gVerticalScrollIndicatorIds[id] != 0xFF && id < 4) { - gSprites[gUnknown_020388C0[id]].callback = sub_80F9834; + gSprites[gVerticalScrollIndicatorIds[id]].callback = sub_80F9834; } } -static void sub_80F9914(u8 id) +static void ResetVerticalScrollIndicators(u8 id) { - if (gUnknown_020388C0[id] != 0xFF && id < 4) + if (gVerticalScrollIndicatorIds[id] != 0xFF && id < 4) { - gSprites[gUnknown_020388C0[id]].pos2.x = 0; - gSprites[gUnknown_020388C0[id]].pos2.y = 0; - gSprites[gUnknown_020388C0[id]].data[1] = 0; - gSprites[gUnknown_020388C0[id]].data[3] = 0; + gSprites[gVerticalScrollIndicatorIds[id]].pos2.x = 0; + gSprites[gVerticalScrollIndicatorIds[id]].pos2.y = 0; + gSprites[gVerticalScrollIndicatorIds[id]].data[1] = 0; + gSprites[gVerticalScrollIndicatorIds[id]].data[3] = 0; } } void PauseVerticalScrollIndicator(u8 id) { - sub_80F98A4(id); - sub_80F9914(id); + StopVerticalScrollIndicators(id); + ResetVerticalScrollIndicators(id); } -void sub_80F9988(u8 id, u8 priority) +void SetVerticalScrollIndicatorPriority(u8 id, u8 priority) { - if (gUnknown_020388C0[id] != 0xFF && id < 4) + if (gVerticalScrollIndicatorIds[id] != 0xFF && id < 4) { - gSprites[gUnknown_020388C0[id]].oam.priority = priority; + gSprites[gVerticalScrollIndicatorIds[id]].oam.priority = priority; } } diff --git a/src/field/money.c b/src/field/money.c index d0f0ab1f6..3b7268dbc 100644 --- a/src/field/money.c +++ b/src/field/money.c @@ -100,6 +100,8 @@ void GetMoneyAmountText(u8 *buffer, u32 amount, u8 arg2) width = 7; else if (amount > 99999) width = 6; + // A special sprite is used for 10000 in the decoration + // shop, so be sure to account for this. else if (amount > 10000) width = 5; else if (amount > 999) @@ -143,12 +145,12 @@ void PrintMoneyAmount(u32 amount, u8 size, u8 x, u8 y) if (stringWidth >= (size + 1) * 8) { - MenuPrint(buffer, x, y); + Menu_PrintText(buffer, x, y); } else { int xPlusOne = x + 1; - MenuPrint_PixelCoords(buffer, (xPlusOne + size) * 8 - stringWidth, y * 8, 1); + Menu_PrintTextPixelCoords(buffer, (xPlusOne + size) * 8 - stringWidth, y * 8, 1); } } @@ -175,7 +177,7 @@ void sub_80B7AEC(u32 arg0, u8 left, u8 top) } __attribute__((naked)) -void sub_80B7B34(u8 var1, u8 var2, int var3) +void Draw10000Sprite(u8 var1, u8 var2, int var3) { asm(".syntax unified\n\ push {r4-r7,lr}\n\ @@ -275,7 +277,7 @@ void UpdateMoneyWindow(u32 amount, u8 x, u8 y) void OpenMoneyWindow(u32 amount, u8 x, u8 y) { - MenuDrawTextWindow(x, y, x + 13, y + 3); + Menu_DrawStdWindowFrame(x, y, x + 13, y + 3); UpdateMoneyWindow(amount, x, y); LoadCompressedObjectPic(gUnknown_083CF584); @@ -288,7 +290,7 @@ void CloseMoneyWindow(u8 x, u8 y) { DestroySpriteAndFreeResources(&gSprites[gUnknown_02038734]); FreeSpritePaletteByTag(SPRITE_TAG_MONEY); - MenuZeroFillWindowRect(x, y, x + 13, y + 3); + Menu_EraseWindowRect(x, y, x + 13, y + 3); } bool8 HasEnoughMoneyFor(void) diff --git a/src/field/overworld.c b/src/field/overworld.c index e239daec7..07135080e 100644 --- a/src/field/overworld.c +++ b/src/field/overworld.c @@ -25,6 +25,7 @@ #include "link.h" #include "load_save.h" #include "main.h" +#include "m4a.h" #include "constants/maps.h" #include "map_name_popup.h" #include "menu.h" @@ -47,7 +48,7 @@ #include "tileset_anim.h" #include "time_events.h" #include "tv.h" -#include "unknown_task.h" +#include "scanline_effect.h" #include "wild_encounter.h" #ifdef SAPPHIRE @@ -62,6 +63,7 @@ struct UnkTVStruct u32 tv_field_4; }; +extern u8 gUnknown_020297ED; extern u16 gUnknown_03004898; extern u16 gUnknown_0300489C; @@ -142,7 +144,7 @@ const struct UCoords32 gUnknown_0821664C[] = { 1, -1}, }; -const struct UnknownTaskStruct gUnknown_08216694 = +const struct ScanlineEffectParams gUnknown_08216694 = { (void *)REG_ADDR_WIN0H, ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1, @@ -590,7 +592,7 @@ bool8 sub_80538D0(u16 x, u16 y) void sub_80538F0(u8 mapGroup, u8 mapNum) { - s32 i; + s32 paletteIndex; Overworld_SetWarpDestination(mapGroup, mapNum, -1, -1, -1); sub_8053F0C(); @@ -611,8 +613,8 @@ void sub_80538F0(u8 mapGroup, u8 mapNum) sub_8056D38(gMapHeader.mapData); apply_map_tileset2_palette(gMapHeader.mapData); - for (i = 6; i < 12; i++) - sub_807D874(i); + for (paletteIndex = 6; paletteIndex < 12; paletteIndex++) + ApplyWeatherGammaShiftToPal(paletteIndex); sub_8072ED0(); UpdateLocationHistoryForRoamer(); @@ -1106,6 +1108,68 @@ u8 sav1_map_get_battletype(void) return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum)->battleType; } +#if DEBUG + +void debug_sub_8076B68(void); + +void debug_sub_80589D8(void); + +void debug_sub_8058A50(void); + +void CB2_InitTestMenu(void) +{ + m4aSoundVSyncOff(); + SetVBlankCallback(NULL); + DmaFill32(3, 0, (void *) VRAM, VRAM_SIZE); + DmaFill32(3, 0, (void *) PLTT, PLTT_SIZE); + ResetPaletteFade(); + ResetSpriteData(); + ResetTasks(); + ScanlineEffect_Stop(); + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); + debug_sub_8076B68(); + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + REG_IE |= 1; + REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP; + m4aSoundVSyncOn(); + SetVBlankCallback(debug_sub_8058A50); + m4aSongNumStart(0x19D); + SetMainCallback2(debug_sub_80589D8); +} + +void debug_sub_80589D8(void) +{ + if (UpdatePaletteFade()) + return; + + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); +} + +void debug_sub_80589F4(void) +{ + if (UpdatePaletteFade()) + return; + + SetVBlankCallback(NULL); + + DmaFill32(3, 0, (void *) VRAM, VRAM_SIZE); + DmaFill32(3, 0, (void *) PLTT, PLTT_SIZE); + + SetMainCallback2(gMain.savedCallback); +} + +void debug_sub_8058A50(void) +{ + ProcessSpriteCopyRequests(); + LoadOam(); + TransferPlttBuffer(); +} + +#endif + void ResetSafariZoneFlag_(void) { ResetSafariZoneFlag(); @@ -1210,6 +1274,33 @@ void CB2_NewGame(void) SetMainCallback2(c2_overworld); } +#if DEBUG + +extern void (*gFieldCallback)(void); + +void debug_sub_8058C00(void) +{ + FieldClearVBlankHBlankCallbacks(); + StopMapMusic(); + ResetSafariZoneFlag_(); + player_avatar_init_params_reset(); + PlayTimeCounter_Start(); + ScriptContext1_Init(); + ScriptContext2_Disable(); + + if (gMain.heldKeys & R_BUTTON) + gFieldCallback = ExecuteTruckSequence; + else + gFieldCallback = sub_8080B60; + + do_load_map_stuff_loop(&gMain.state); + SetFieldVBlankCallback(); + set_callback1(c1_overworld); + SetMainCallback2(c2_overworld); +} + +#endif + void CB2_WhiteOut(void) { u8 val; @@ -1365,6 +1456,10 @@ void CB2_ContinueSavedGame(void) { FieldClearVBlankHBlankCallbacks(); StopMapMusic(); +#if DEBUG + if (gMain.heldKeys & R_BUTTON) + gUnknown_020297ED = TRUE; +#endif ResetSafariZoneFlag_(); LoadSaveblockMapHeader(); LoadSaveblockMapObjScripts(); @@ -1410,7 +1505,7 @@ void VBlankCB_Field(void) { LoadOam(); ProcessSpriteCopyRequests(); - sub_8089668(); + ScanlineEffect_InitHBlankDmaTransfer(); sub_8057A58(); TransferPlttBuffer(); sub_8072E74(); @@ -1422,7 +1517,7 @@ void sub_8054814(void) if (val) { sub_80815E0(val); - sub_80895F8(gUnknown_08216694); + ScanlineEffect_SetParams(gUnknown_08216694); } } @@ -1456,8 +1551,8 @@ bool32 sub_805483C(u8 *a1) case 4: sub_8054814(); sub_8054C54(); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow(&gWindowTemplate_81E6CE4); (*a1)++; break; case 5: @@ -1522,8 +1617,8 @@ bool32 sub_805493C(u8 *a1, u32 a2) case 4: sub_8054814(); sub_8054C54(); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow(&gWindowTemplate_81E6CE4); (*a1)++; break; case 5: @@ -1612,8 +1707,8 @@ bool32 sub_8054A9C(u8 *a1) case 3: sub_8054814(); sub_8054C54(); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow(&gWindowTemplate_81E6CE4); (*a1)++; break; case 4: @@ -1664,29 +1759,12 @@ void do_load_map_stuff_loop(u8 *a1) void sub_8054BA8(void) { - u8 *addr; - u32 size; - REG_DISPCNT = 0; - remove_some_task(); + ScanlineEffect_Stop(); DmaClear16(3, PLTT + 2, PLTT_SIZE - 2); - - addr = (void *)VRAM; - size = 0x18000; - while (1) - { - DmaFill16(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill16(3, 0, addr, size); - break; - } - } - + DmaFill16Large(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000); ResetOamRange(0, 128); LoadOam(); } @@ -1695,8 +1773,8 @@ void sub_8054C2C(void) { sub_8054814(); sub_8054C54(); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow(&gWindowTemplate_81E6CE4); mapdata_load_assets_to_gpu_and_full_redraw(); } @@ -1731,7 +1809,7 @@ void sub_8054D4C(u32 a1) ResetTasks(); ResetSpriteData(); ResetPaletteFade(); - dp12_8087EA4(); + ScanlineEffect_Clear(); ResetCameraUpdateInfo(); InstallCameraPanAheadCallback(); sub_805C7C4(0); diff --git a/src/field/party_menu.c b/src/field/party_menu.c index 9c1150515..66e7e2319 100644 --- a/src/field/party_menu.c +++ b/src/field/party_menu.c @@ -32,7 +32,7 @@ #include "string_util.h" #include "strings.h" #include "task.h" -#include "unknown_task.h" +#include "scanline_effect.h" #include "util.h" #include "script_pokemon_80F9.h" #include "ewram.h" @@ -94,14 +94,21 @@ static void SpriteCB_UpdateHeldItemIconPosition(struct Sprite *sprite); static void ItemUseMoveMenu_HandleMoveSelection(u8 taskId); static void ItemUseMoveMenu_HandleCancel(u8 taskId); static bool8 SetupDefaultPartyMenu(void); -static void sub_806B4A8(void); -static void VBlankCB_PartyMenu(void); -static bool8 LoadPartyMenuGraphics(u8 a); +/*static*/ void sub_806B4A8(void); +/*static*/ void VBlankCB_PartyMenu(void); +/*static*/ bool8 LoadPartyMenuGraphics(u8 a); static void sub_806BF24(const u8 *a, u8 monIndex, u8 c, u8 d); static void sub_806BB9C(u8 a); static void sub_806BBEC(u8 a); -const u16 TMHMMoves[] = { +EWRAM_DATA u8 gUnknown_0202E8F4 = 0; +EWRAM_DATA u8 gUnknown_0202E8F5 = 0; +EWRAM_DATA u8 gUnknown_0202E8F6 = 0; +EWRAM_DATA u16 gUnknown_0202E8F8 = 0; +EWRAM_DATA u8 gPartyMenuType = 0; + +const u16 TMHMMoves[] = +{ MOVE_FOCUS_PUNCH, MOVE_DRAGON_CLAW, MOVE_WATER_PULSE, @@ -458,10 +465,6 @@ struct Unk201FE00 extern u16 gBattleTypeFlags; extern u8 gTileBuffer[]; -extern u8 gUnknown_0202E8F4; -extern u8 gUnknown_0202E8F6; -extern u16 gUnknown_0202E8F8; -extern u8 gPartyMenuType; extern u8 gLastFieldPokeMenuOpened; extern u8 gPlayerPartyCount; extern s32 gBattleMoveDamage; @@ -490,9 +493,71 @@ extern const u8 gStatusPal_Icons[]; #define WINDOW_RIGHT (29) #endif - -#ifdef NONMATCHING -// Main handler for the party menu. +#if DEBUG +__attribute__((naked)) +void CB2_PartyMenuMain(void) +{ + asm("\ + push {r4, r5, r6, lr}\n\ + add sp, sp, #0xfffffffc\n\ + bl AnimateSprites\n\ + bl BuildOamBuffer\n\ + ldr r0, ._3 @ gPartyMenuType\n\ + ldrb r1, [r0]\n\ + lsl r0, r1, #0x1\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x4\n\ + ldr r1, ._3 + 4 @ PartyMonTextSettings\n\ + add r5, r0, r1\n\ + mov r6, #0x0\n\ +._1:\n\ + ldrb r0, [r5]\n\ + lsl r0, r0, #0x3\n\ + ldrb r1, [r5, #0x1]\n\ + lsl r1, r1, #0x3\n\ + ldr r2, [r5, #0x4]\n\ + lsl r3, r6, #0x5\n\ + mov r4, #0x80\n\ + lsl r4, r4, #0x2\n\ + orr r3, r3, r4\n\ + str r3, [sp]\n\ + mov r3, #0x0\n\ + bl DrawPartyMenuMonText\n\ + add r5, r5, #0x8\n\ + add r6, r6, #0x1\n\ + cmp r6, #0x5\n\ + ble ._1 @cond_branch\n\ + bl RunTasks\n\ + bl UpdatePaletteFade\n\ + ldr r0, ._3 + 8 @ gLinkOpen\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._2 @cond_branch\n\ + ldr r0, ._3 + 12 @ gLink\n\ + ldr r1, ._3 + 16 @ 0xfbd\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + mov r1, #0x2\n\ + str r1, [sp]\n\ + mov r1, #0x1\n\ + mov r2, #0x1\n\ + mov r3, #0x2\n\ + bl debug_sub_8008264\n\ +._2:\n\ + add sp, sp, #0x4\n\ + pop {r4, r5, r6}\n\ + pop {r0}\n\ + bx r0\n\ +._4:\n\ + .align 2, 0\n\ +._3:\n\ + .word gPartyMenuType\n\ + .word PartyMonTextSettings\n\ + .word gLinkOpen\n\ + .word gLink\n\ + .word 0xfbd"); +} +#else void CB2_PartyMenuMain(void) { const struct PartyMonTextSettingsStruct *textSettings; @@ -506,62 +571,18 @@ void CB2_PartyMenuMain(void) { // Draw mon name, level, and hp sprites DrawPartyMenuMonText( - textSettings[i].xOffset * 8, - textSettings[i].yOffset * 8, - textSettings[i].oamSettings, + textSettings->xOffset * 8, + textSettings->yOffset * 8, + textSettings->oamSettings, 0, (i << 5) | 0x200); + textSettings++; } RunTasks(); UpdatePaletteFade(); } -#else -__attribute__((naked)) -void CB2_PartyMenuMain(void) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - sub sp, 0x4\n\ - bl AnimateSprites\n\ - bl BuildOamBuffer\n\ - ldr r0, _0806AF2C @ =gPartyMenuType\n\ - ldrb r1, [r0]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 4\n\ - ldr r1, _0806AF30 @ =PartyMonTextSettings\n\ - adds r5, r0, r1\n\ - movs r6, 0\n\ -_0806AEF8:\n\ - ldrb r0, [r5]\n\ - lsls r0, 3\n\ - ldrb r1, [r5, 0x1]\n\ - lsls r1, 3\n\ - ldr r2, [r5, 0x4]\n\ - lsls r3, r6, 5\n\ - movs r4, 0x80\n\ - lsls r4, 2\n\ - orrs r3, r4\n\ - str r3, [sp]\n\ - movs r3, 0\n\ - bl DrawPartyMenuMonText\n\ - adds r5, 0x8\n\ - adds r6, 0x1\n\ - cmp r6, 0x5\n\ - ble _0806AEF8\n\ - bl RunTasks\n\ - bl UpdatePaletteFade\n\ - add sp, 0x4\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0806AF2C: .4byte gPartyMenuType\n\ -_0806AF30: .4byte PartyMonTextSettings\n\ - .syntax divided\n"); -} -#endif // NONMATCHING +#endif void VBlankCB_PartyMenu(void) { @@ -666,29 +687,432 @@ bool8 SetupDefaultPartyMenu(void) return FALSE; } +#if DEBUG +__attribute__((naked)) +bool8 InitPartyMenu(void) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + add sp, sp, #0xfffffff4\n\ + ldr r0, ._55 @ gMain\n\ + ldr r1, ._55 + 4 @ 0x43c\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x11\n\ + bls ._53 @cond_branch\n\ + b ._125\n\ +._53:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._55 + 8 @ \n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._56:\n\ + .align 2, 0\n\ +._55:\n\ + .word gMain\n\ + .word 0x43c\n\ + .word ._57\n\ +._57:\n\ + .word ._58\n\ + .word ._59\n\ + .word ._60\n\ + .word ._61\n\ + .word ._62\n\ + .word ._63\n\ + .word ._64\n\ + .word ._65\n\ + .word ._66\n\ + .word ._67\n\ + .word ._68\n\ + .word ._69\n\ + .word ._70\n\ + .word ._71\n\ + .word ._72\n\ + .word ._73\n\ + .word ._74\n\ + .word ._75\n\ +._58:\n\ + mov r0, #0x0\n\ + bl SetVBlankCallback\n\ + mov r3, #0xc0\n\ + lsl r3, r3, #0x13\n\ + mov r4, #0xc0\n\ + lsl r4, r4, #0x9\n\ + add r2, sp, #0x8\n\ + mov r8, r2\n\ + add r2, sp, #0x4\n\ + mov r6, #0x0\n\ + ldr r1, ._78 @ 0x40000d4\n\ + mov r5, #0x80\n\ + lsl r5, r5, #0x5\n\ + ldr r7, ._78 + 4 @ 0x81000800\n\ + mov r0, #0x81\n\ + lsl r0, r0, #0x18\n\ + mov ip, r0\n\ +._76:\n\ + strh r6, [r2]\n\ + add r0, sp, #0x4\n\ + str r0, [r1]\n\ + str r3, [r1, #0x4]\n\ + str r7, [r1, #0x8]\n\ + ldr r0, [r1, #0x8]\n\ + add r3, r3, r5\n\ + sub r4, r4, r5\n\ + cmp r4, r5\n\ + bhi ._76 @cond_branch\n\ + strh r6, [r2]\n\ + add r2, sp, #0x4\n\ + str r2, [r1]\n\ + str r3, [r1, #0x4]\n\ + lsr r0, r4, #0x1\n\ + mov r3, ip\n\ + orr r0, r0, r3\n\ + str r0, [r1, #0x8]\n\ + ldr r0, [r1, #0x8]\n\ + mov r0, #0xe0\n\ + lsl r0, r0, #0x13\n\ + mov r3, #0x80\n\ + lsl r3, r3, #0x3\n\ + mov r4, #0x0\n\ + str r4, [sp, #0x8]\n\ + ldr r2, ._78 @ 0x40000d4\n\ + mov r1, r8\n\ + str r1, [r2]\n\ + str r0, [r2, #0x4]\n\ + lsr r0, r3, #0x2\n\ + mov r1, #0x85\n\ + lsl r1, r1, #0x18\n\ + orr r0, r0, r1\n\ + str r0, [r2, #0x8]\n\ + ldr r0, [r2, #0x8]\n\ + mov r1, #0xa0\n\ + lsl r1, r1, #0x13\n\ + add r0, sp, #0x4\n\ + strh r4, [r0]\n\ + str r0, [r2]\n\ + str r1, [r2, #0x4]\n\ + lsr r3, r3, #0x1\n\ + mov r0, #0x81\n\ + lsl r0, r0, #0x18\n\ + orr r3, r3, r0\n\ + str r3, [r2, #0x8]\n\ + ldr r0, [r2, #0x8]\n\ + ldr r2, ._78 + 8 @ gPaletteFade\n\ + ldrb r0, [r2, #0x8]\n\ + mov r1, #0x80\n\ + orr r0, r0, r1\n\ + strb r0, [r2, #0x8]\n\ + ldr r1, ._78 + 12 @ gMain\n\ + ldr r2, ._78 + 16 @ 0x43c\n\ + add r1, r1, r2\n\ + b ._122\n\ +._79:\n\ + .align 2, 0\n\ +._78:\n\ + .word 0x40000d4\n\ + .word 0x81000800\n\ + .word gPaletteFade\n\ + .word gMain\n\ + .word 0x43c\n\ +._59:\n\ + bl ScanlineEffect_Stop\n\ + b ._115\n\ +._60:\n\ + bl sub_806B4A8\n\ + ldr r1, ._82 @ \n\ + mov r2, #0x99\n\ + lsl r2, r2, #0x2\n\ + add r0, r1, r2\n\ + mov r2, #0x0\n\ + strh r2, [r0]\n\ + ldr r3, ._82 + 4 @ \n\ + add r0, r1, r3\n\ + strh r2, [r0]\n\ + mov r0, #0x9a\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + strh r2, [r1]\n\ + ldr r1, ._82 + 8 @ \n\ + ldr r2, ._82 + 12 @ \n\ + add r1, r1, r2\n\ + b ._122\n\ +._83:\n\ + .align 2, 0\n\ +._82:\n\ + .word +0x201b000\n\ + .word 0x266\n\ + .word gMain\n\ + .word 0x43c\n\ +._61:\n\ + bl ResetSpriteData\n\ + b ._115\n\ +._62:\n\ + ldr r0, ._88 @ \n\ + mov r1, #0x96\n\ + lsl r1, r1, #0x2\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + beq ._86 @cond_branch\n\ + cmp r0, #0x5\n\ + beq ._86 @cond_branch\n\ + bl ResetTasks\n\ +._86:\n\ + ldr r1, ._88 + 4 @ \n\ + ldr r2, ._88 + 8 @ \n\ + add r1, r1, r2\n\ + b ._122\n\ +._89:\n\ + .align 2, 0\n\ +._88:\n\ + .word +0x201b000\n\ + .word gMain\n\ + .word 0x43c\n\ +._63:\n\ + bl FreeAllSpritePalettes\n\ + b ._115\n\ +._64:\n\ + ldr r4, ._92 @ \n\ + mov r1, #0x97\n\ + lsl r1, r1, #0x2\n\ + add r0, r4, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x0\n\ + bl CreateTask\n\ + mov r2, #0x98\n\ + lsl r2, r2, #0x2\n\ + add r1, r4, r2\n\ + strb r0, [r1]\n\ + b ._115\n\ +._93:\n\ + .align 2, 0\n\ +._92:\n\ + .word +0x201b000\n\ +._65:\n\ + ldr r0, ._95 @ gWindowTemplate_81E6C90\n\ + bl Text_LoadWindowTemplate\n\ + ldr r1, ._95 + 4 @ gMain\n\ + ldr r0, ._95 + 8 @ 0x43c\n\ + add r1, r1, r0\n\ + b ._122\n\ +._96:\n\ + .align 2, 0\n\ +._95:\n\ + .word gWindowTemplate_81E6C90\n\ + .word gMain\n\ + .word 0x43c\n\ +._66:\n\ + ldr r4, ._98 @ gUnknown_03004210\n\ + ldr r1, ._98 + 4 @ gWindowTemplate_81E6C90\n\ + add r0, r4, #0\n\ + bl Text_InitWindowWithTemplate\n\ + add r0, r4, #0\n\ + mov r1, #0x1\n\ + bl MultistepInitWindowTileData\n\ + ldr r1, ._98 + 8 @ gMain\n\ + ldr r2, ._98 + 12 @ 0x43c\n\ + add r1, r1, r2\n\ + b ._122\n\ +._99:\n\ + .align 2, 0\n\ +._98:\n\ + .word gUnknown_03004210\n\ + .word gWindowTemplate_81E6C90\n\ + .word gMain\n\ + .word 0x43c\n\ +._67:\n\ + bl MultistepLoadFont\n\ + cmp r0, #0\n\ + bne ._100 @cond_branch\n\ + b ._125\n\ +._100:\n\ + ldr r0, ._103 @ \n\ + mov r3, #0x99\n\ + lsl r3, r3, #0x2\n\ + add r0, r0, r3\n\ + mov r1, #0x1\n\ + strh r1, [r0]\n\ + ldr r1, ._103 + 4 @ \n\ + ldr r0, ._103 + 8 @ \n\ + add r1, r1, r0\n\ + b ._122\n\ +._104:\n\ + .align 2, 0\n\ +._103:\n\ + .word +0x201b000\n\ + .word gMain\n\ + .word 0x43c\n\ +._68:\n\ + ldr r0, ._107 @ \n\ + mov r1, #0x99\n\ + lsl r1, r1, #0x2\n\ + add r4, r0, r1\n\ + ldrb r0, [r4]\n\ + bl LoadPartyMenuGraphics\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x1\n\ + bne ._105 @cond_branch\n\ + mov r0, #0x0\n\ + strh r0, [r4]\n\ + ldr r1, ._107 + 4 @ \n\ + ldr r2, ._107 + 8 @ \n\ + add r1, r1, r2\n\ + b ._122\n\ +._108:\n\ + .align 2, 0\n\ +._107:\n\ + .word +0x201b000\n\ + .word gMain\n\ + .word 0x43c\n\ +._105:\n\ + ldrh r0, [r4]\n\ + add r0, r0, #0x1\n\ + strh r0, [r4]\n\ + b ._125\n\ +._69:\n\ + bl sub_809D51C\n\ + b ._115\n\ +._70:\n\ + ldr r2, ._113 @ PartyMenuHandlers\n\ + ldr r0, ._113 + 4 @ \n\ + mov r1, #0x96\n\ + lsl r1, r1, #0x2\n\ + add r0, r0, r1\n\ + ldrb r1, [r0]\n\ + lsl r0, r1, #0x1\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x2\n\ + add r2, r2, #0x4\n\ + add r0, r0, r2\n\ + ldr r0, [r0]\n\ + bl _call_via_r0\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x1\n\ + bne ._125 @cond_branch\n\ + ldr r1, ._113 + 8 @ \n\ + ldr r2, ._113 + 12 @ \n\ + add r1, r1, r2\n\ + b ._122\n\ +._114:\n\ + .align 2, 0\n\ +._113:\n\ + .word PartyMenuHandlers\n\ + .word +0x201b000\n\ + .word gMain\n\ + .word 0x43c\n\ +._71:\n\ + ldr r0, ._116 @ gWindowTemplate_81E6CC8\n\ + bl MultistepInitMenuWindowBegin\n\ + b ._115\n\ +._117:\n\ + .align 2, 0\n\ +._116:\n\ + .word gWindowTemplate_81E6CC8\n\ +._72:\n\ + bl MultistepInitMenuWindowContinue\n\ + cmp r0, #0\n\ + beq ._125 @cond_branch\n\ + ldr r1, ._120 @ gMain\n\ + ldr r0, ._120 + 4 @ 0x43c\n\ + add r1, r1, r0\n\ + b ._122\n\ +._121:\n\ + .align 2, 0\n\ +._120:\n\ + .word gMain\n\ + .word 0x43c\n\ +._73:\n\ + ldr r0, ._123 @ \n\ + ldr r1, ._123 + 4 @ \n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + mov r1, #0x0\n\ + bl PrintPartyMenuPromptText\n\ + ldr r1, ._123 + 8 @ \n\ + ldr r2, ._123 + 12 @ \n\ + add r1, r1, r2\n\ + b ._122\n\ +._124:\n\ + .align 2, 0\n\ +._123:\n\ + .word +0x201b000\n\ + .word 0x259\n\ + .word gMain\n\ + .word 0x43c\n\ +._74:\n\ + mov r0, #0x1\n\ + neg r0, r0\n\ + mov r1, #0x0\n\ + str r1, [sp]\n\ + mov r2, #0x10\n\ + mov r3, #0x0\n\ + bl BeginNormalPaletteFade\n\ + ldr r2, ._126 @ gPaletteFade\n\ + ldrb r1, [r2, #0x8]\n\ + mov r0, #0x7f\n\ + and r0, r0, r1\n\ + strb r0, [r2, #0x8]\n\ +._115:\n\ + ldr r1, ._126 + 4 @ gMain\n\ + ldr r3, ._126 + 8 @ 0x43c\n\ + add r1, r1, r3\n\ +._122:\n\ + ldrb r0, [r1]\n\ + add r0, r0, #0x1\n\ + strb r0, [r1]\n\ + b ._125\n\ +._127:\n\ + .align 2, 0\n\ +._126:\n\ + .word gPaletteFade\n\ + .word gMain\n\ + .word 0x43c\n\ +._75:\n\ + ldr r0, ._130 @ VBlankCB_PartyMenu\n\ + bl SetVBlankCallback\n\ + ldr r0, ._130 + 4 @ gLinkOpen\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._128 @cond_branch\n\ + ldr r0, ._130 + 8 @ 0x600e5e0\n\ + mov r1, #0x80\n\ + lsl r1, r1, #0x8\n\ + ldr r2, ._130 + 12 @ 0x6007800\n\ + mov r3, #0x2\n\ + bl debug_sub_8008218\n\ +._128:\n\ + mov r0, #0x1\n\ + b ._129\n\ +._131:\n\ + .align 2, 0\n\ +._130:\n\ + .word VBlankCB_PartyMenu+1\n\ + .word gLinkOpen\n\ + .word 0x600e5e0\n\ + .word 0x6007800\n\ +._125:\n\ + mov r0, #0x0\n\ +._129:\n\ + add sp, sp, #0xc\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4, r5, r6, r7}\n\ + pop {r1}\n\ + bx r1"); +} +#else bool8 InitPartyMenu(void) { - u8 *addr; - u32 size; - switch (gMain.state) { case 0: SetVBlankCallback(NULL); - addr = (u8 *)VRAM; - size = VRAM_SIZE; - while (1) - { - DmaFill16(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill16(3, 0, addr, size); - break; - } - } - + DmaFill16Large(3, 0, (void *)(VRAM + 0x0), VRAM_SIZE, 0x1000); DmaClear32(3, OAM, OAM_SIZE); DmaClear16(3, PLTT, PLTT_SIZE); @@ -696,7 +1120,7 @@ bool8 InitPartyMenu(void) gMain.state++; break; case 1: - remove_some_task(); + ScanlineEffect_Stop(); gMain.state++; break; case 2: @@ -727,11 +1151,11 @@ bool8 InitPartyMenu(void) gMain.state++; break; case 7: - SetUpWindowConfig(&gWindowConfig_81E6C90); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C90); gMain.state++; break; case 8: - InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6C90); + Text_InitWindowWithTemplate(&gUnknown_03004210, &gWindowTemplate_81E6C90); MultistepInitWindowTileData(&gUnknown_03004210, 1); gMain.state++; break; @@ -764,7 +1188,7 @@ bool8 InitPartyMenu(void) } break; case 13: - MultistepInitMenuWindowBegin(&gWindowConfig_81E6CC8); + MultistepInitMenuWindowBegin(&gWindowTemplate_81E6CC8); gMain.state++; break; case 14: @@ -789,6 +1213,7 @@ bool8 InitPartyMenu(void) return FALSE; } +#endif void CB2_InitPartyMenu(void) { @@ -841,9 +1266,7 @@ void ReDrawPartyMonBackgrounds(void) { if (ewram1B000.unk261) { - const void *src = gBGTilemapBuffers[2]; - void *dest = (void *)(BG_VRAM + 0x3000); - DmaCopy16(3, src, dest, 0x800); + DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(BG_VRAM + 0x3000), 0x800); if (ewram1B000.unk261 == 2) { @@ -1226,8 +1649,6 @@ void sub_806BBEC(u8 a) } } -#ifdef NONMATCHING -// The original THUMB is preserving r8 for seemingly no reason. Unsure how to match. void sub_806BC3C(u8 monIndex, u8 b) { u16 *vramPtr = gUnknown_08376918[IsDoubleBattle()][monIndex]; @@ -1240,74 +1661,10 @@ void sub_806BC3C(u8 monIndex, u8 b) vramPtr[i] = gUnknown_08E9A300[offset] + 0x10C; vramPtr[i + 0x20] = gUnknown_08E9A300[offset + 0x20] + 0x10C; } + + // Some dead code was likely optimized out, but the compiler still think r8 was used. + asm("":::"r8"); } -#else -__attribute__((naked)) -void sub_806BC3C(u8 monIndex, u8 b) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - adds r4, r0, 0\n\ - adds r5, r1, 0\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - lsls r5, 24\n\ - lsrs r5, 24\n\ - ldr r6, _0806BCB0 @ =gUnknown_08376918\n\ - bl IsDoubleBattle\n\ - lsls r4, 2\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r1, r0, 1\n\ - adds r1, r0\n\ - lsls r1, 3\n\ - adds r4, r1\n\ - adds r4, r6\n\ - ldr r7, [r4]\n\ - movs r6, 0\n\ - adds r0, r5, 0\n\ - movs r1, 0x7\n\ - bl __udivsi3\n\ - lsls r0, 24\n\ - lsrs r4, r0, 19\n\ - ldr r5, _0806BCB4 @ =gUnknown_08E9A300\n\ - movs r0, 0x86\n\ - lsls r0, 1\n\ - adds r3, r0, 0\n\ -_0806BC7C:\n\ - adds r1, r6, r4\n\ - lsls r2, r6, 1\n\ - adds r2, r7\n\ - lsls r0, r1, 1\n\ - adds r0, r5\n\ - ldrh r0, [r0]\n\ - adds r0, r3, r0\n\ - strh r0, [r2]\n\ - adds r2, 0x40\n\ - adds r1, 0x20\n\ - lsls r1, 1\n\ - adds r1, r5\n\ - ldrh r1, [r1]\n\ - adds r0, r3, r1\n\ - strh r0, [r2]\n\ - adds r0, r6, 0x1\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - cmp r6, 0x6\n\ - bls _0806BC7C\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0806BCB0: .4byte gUnknown_08376918\n\ -_0806BCB4: .4byte gUnknown_08E9A300\n\ - .syntax divided\n"); -} -#endif // NONMATCHING void unref_sub_806BCB8(u8 a) { @@ -2790,26 +3147,26 @@ void PrintPartyMenuPromptText(u8 textId, u8 b) switch (b) { case 0: - MenuDrawTextWindow(0, 16, 23, 19); + Menu_DrawStdWindowFrame(0, 16, 23, 19); break; case 1: - MenuDrawTextWindow(0, 16, 19, 19); + Menu_DrawStdWindowFrame(0, 16, 19, 19); break; case 2: - MenuDrawTextWindow(0, 16, 22, 19); + Menu_DrawStdWindowFrame(0, 16, 22, 19); break; case 3: - MenuDrawTextWindow(0, 16, 18, 19); + Menu_DrawStdWindowFrame(0, 16, 18, 19); break; } - MenuPrint(PartyMenuPromptTexts[textId], 1, 17); + Menu_PrintText(PartyMenuPromptTexts[textId], 1, 17); } } void sub_806D5A4(void) { - MenuZeroFillWindowRect(0, 16, 29, 19); + Menu_EraseWindowRect(0, 16, 29, 19); } void sub_806D5B8(u8 monIndex) @@ -2820,7 +3177,7 @@ void sub_806D5B8(u8 monIndex) u8 right = gUnknown_08376948[IsDoubleBattle()][monIndex].right; u8 bottom = gUnknown_08376948[IsDoubleBattle()][monIndex].bottom; - ZeroFillWindowRect(&gUnknown_03004210, left, top, right, bottom); + Text_EraseWindowRect(&gUnknown_03004210, left, top, right, bottom); var1 = 0; CpuFastSet(&var1, OBJ_VRAM1 + monIndex * 0x400, 0x1000100); @@ -2834,7 +3191,7 @@ void sub_806D668(u8 monIndex) u8 right = gUnknown_08376978[IsDoubleBattle()][monIndex].right; u8 bottom = gUnknown_08376978[IsDoubleBattle()][monIndex].bottom; - ZeroFillWindowRect(&gUnknown_03004210, left, top, right, bottom); + Text_EraseWindowRect(&gUnknown_03004210, left, top, right, bottom); var1 = 0; CpuFastSet(&var1, OBJ_VRAM1 + 0x300 + monIndex * 0x400, 0x1000040); @@ -3427,7 +3784,7 @@ void PartyMenuDoPrintMonNickname(u8 monIndex, int b, const u8 *nameBuffer) { u32 var1 = 0; CpuFastSet(&var1, gTileBuffer, 0x1000100); - sub_8004E3C((struct WindowConfig *)&gWindowConfig_81E6CAC, gTileBuffer, nameBuffer); + Text_InitWindow8004E3C((struct WindowTemplate *)&gWindowTemplate_81E6CAC, gTileBuffer, nameBuffer); CpuFastSet(gTileBuffer, OBJ_VRAM1 + (monIndex * 0x400), 128); } @@ -3537,7 +3894,7 @@ void PartyMenuDoPrintLevel(u8 monIndex, u8 menuLayout, u8 level) var1 = 0; CpuFastSet(&var1, gUnknown_02039460, 0x1000020); - sub_8004E3C((struct WindowConfig *)&gWindowConfig_81E6CAC, gUnknown_02039460 - 0x100 /*gTileBuffer*/, gStringVar1); + Text_InitWindow8004E3C((struct WindowTemplate *)&gWindowTemplate_81E6CAC, gUnknown_02039460 - 0x100 /*gTileBuffer*/, gStringVar1); CpuFastSet(gUnknown_02039460, OBJ_VRAM1 + 0x200 + (monIndex * 0x400), 32); } @@ -3631,7 +3988,7 @@ void PartyMenuDoPrintHP(u8 monIndex, u8 b, u16 currentHP, u16 maxHP) var = 0; CpuFastSet(&var, gUnknown_02039460, 0x1000040); - sub_8004E3C((struct WindowConfig *)&gWindowConfig_81E6CAC, gUnknown_02039460 - 0x100 /*gTileBuffer*/, gStringVar1); + Text_InitWindow8004E3C((struct WindowTemplate *)&gWindowTemplate_81E6CAC, gUnknown_02039460 - 0x100 /*gTileBuffer*/, gStringVar1); CpuFastSet(gUnknown_02039460, OBJ_VRAM1 + 0x300 + (monIndex * 0x400), 64); } @@ -3781,8 +4138,8 @@ void ClosePartyPopupMenu(u8 index, const struct PartyPopupMenu *menu) SetPartyPopupMenuOffsets(index, &left, &top, menu); - MenuZeroFillWindowRect(left, top, left + menu[index].width, menu[index].numChoices * 2 + top + 1); - HandleDestroyMenuCursors(); + Menu_EraseWindowRect(left, top, left + menu[index].width, menu[index].numChoices * 2 + top + 1); + Menu_DestroyCursor(); } TaskFunc PartyMenuGetPopupMenuFunc(u8 menuIndex, const struct PartyPopupMenu *menus, const struct MenuAction2 *menuActions, u8 itemIndex) @@ -3797,7 +4154,7 @@ u8 sub_806E834(const u8 *message, u8 arg1) gUnknown_0202E8F6 = 1; - MenuDrawTextWindow(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); + Menu_DrawStdWindowFrame(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); MenuPrintMessage(message, WINDOW_LEFT + 1, 15); taskId = CreateTask(sub_806E884, 1); @@ -3808,11 +4165,11 @@ u8 sub_806E834(const u8 *message, u8 arg1) static void sub_806E884(u8 taskId) { - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) { gUnknown_0202E8F6 = 0; if (gTasks[taskId].data[0] == 0) - MenuZeroFillWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); + Menu_EraseWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); DestroyTask(taskId); } } @@ -3902,13 +4259,13 @@ void party_menu_link_mon_held_item_object(u8 taskId) void PartyMenuTryGiveMonHeldItem_806EACC(u8 taskId) { - s8 selection = ProcessMenuInputNoWrap_(); + s8 selection = Menu_ProcessInputNoWrap_(); if (selection == 0) { u16 currentItem; - MenuZeroFillWindowRect(23, 8, 29, 13); + Menu_EraseWindowRect(23, 8, 29, 13); currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); RemoveBagItem(ewram1C000.unk6, 1); if (AddBagItem(currentItem, 1) == TRUE) @@ -3937,7 +4294,7 @@ void PartyMenuTryGiveMonHeldItem_806EACC(u8 taskId) return; if (selection == -1) PlaySE(SE_SELECT); - MenuZeroFillWindowRect(23, 8, 29, 13); + Menu_EraseWindowRect(23, 8, 29, 13); } gTasks[taskId].func = party_menu_link_mon_held_item_object; } @@ -4039,7 +4396,7 @@ void DoTakeMail(u8 taskId, TaskFunc func) void Task_LoseMailMessage(u8 taskId) { - s8 selection = ProcessMenuInputNoWrap_(); + s8 selection = Menu_ProcessInputNoWrap_(); if (selection == 0) { @@ -4052,7 +4409,7 @@ void Task_LoseMailMessage(u8 taskId) { sub_806E834(gOtherText_BagFullCannotRemoveItem, 0); } - MenuZeroFillWindowRect(23, 8, 29, 13); + Menu_EraseWindowRect(23, 8, 29, 13); gTasks[taskId].func = party_menu_link_mon_held_item_object; } else @@ -4061,8 +4418,8 @@ void Task_LoseMailMessage(u8 taskId) return; if (selection == -1) PlaySE(SE_SELECT); - MenuZeroFillWindowRect(23, 8, 29, 13); - MenuZeroFillWindowRect(0, 14, 29, 19); + Menu_EraseWindowRect(23, 8, 29, 13); + Menu_EraseWindowRect(0, 14, 29, 19); gTasks[taskId].func = party_menu_link_mon_held_item_object; } } @@ -4078,11 +4435,11 @@ void Task_ConfirmLoseMailMessage(u8 taskId) void Task_TakeHeldMail(u8 taskId) { - s8 selection = ProcessMenuInputNoWrap_(); + s8 selection = Menu_ProcessInputNoWrap_(); if (selection == 0) { - MenuZeroFillWindowRect(23, 8, 29, 13); + Menu_EraseWindowRect(23, 8, 29, 13); if (TakeMailFromMon2(ewram1C000.pokemon) != 0xFF) sub_806E834(gOtherText_MailWasSent, 0); else @@ -4095,7 +4452,7 @@ void Task_TakeHeldMail(u8 taskId) return; if (selection == -1) PlaySE(SE_SELECT); - MenuZeroFillWindowRect(23, 8, 29, 13); + Menu_EraseWindowRect(23, 8, 29, 13); sub_806E834(gOtherText_MailRemovedMessageLost, 1); gTasks[taskId].func = Task_ConfirmLoseMailMessage; } @@ -4112,7 +4469,7 @@ void Task_ConfirmTakeHeldMail(u8 taskId) u16 ItemIdToBattleMoveId(u16 item) { - u16 machineNumber = item - ITEM_TM01; + u16 machineNumber = item - ITEM_TM01_FOCUS_PUNCH; return TMHMMoves[machineNumber]; } @@ -4136,6 +4493,10 @@ void TeachMonTMMove(u8 taskId, u16 move, TaskFunc func) CreateTask(Task_TeamMonTMMove, 5); } +#if DEBUG +extern u8 gUnknown_020297ED; +#endif + void Task_TeamMonTMMove(u8 taskId) { GetMonNickname(ewram1C000.pokemon, gStringVar1); @@ -4150,7 +4511,11 @@ void Task_TeamMonTMMove(u8 taskId) } else { - if (!CanMonLearnTMHM(ewram1C000.pokemon, ewram1C000.unk6 - 33)) + if ( +#if DEBUG + !gUnknown_020297ED && +#endif + !CanMonLearnTMHM(ewram1C000.pokemon, ewram1C000.unk6 - 33)) { StringExpandPlaceholders(gStringVar4, gOtherText_NotCompatible); sub_806E834(gStringVar4, 1); @@ -4240,11 +4605,11 @@ void sub_806F358(u8 taskId) void sub_806F390(u8 taskId) { - s8 selection = ProcessMenuInputNoWrap_(); + s8 selection = Menu_ProcessInputNoWrap_(); if (selection == 0) { - MenuZeroFillWindowRect(23, 8, 29, 13); + Menu_EraseWindowRect(23, 8, 29, 13); sub_806E834(gOtherText_WhichMoveToForget2, 1); gTasks[taskId].func = sub_806F44C; } @@ -4320,7 +4685,7 @@ void StopTryingToTeachMove_806F588(u8 taskId) void StopTryingToTeachMove_806F614(u8 taskId) { - MenuZeroFillWindowRect(23, 8, 29, 13); + Menu_EraseWindowRect(23, 8, 29, 13); StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); StringExpandPlaceholders(gStringVar4, gOtherText_StopTryingTo); sub_806E834(gStringVar4, 1); @@ -4338,11 +4703,11 @@ void StopTryingToTeachMove_806F67C(u8 taskId) void StopTryingToTeachMove_806F6B4(u8 taskId) { - s8 selection = ProcessMenuInputNoWrap_(); + s8 selection = Menu_ProcessInputNoWrap_(); if (selection == 0) { - MenuZeroFillWindowRect(23, 8, 29, 13); + Menu_EraseWindowRect(23, 8, 29, 13); GetMonNickname(ewram1C000.pokemon, gStringVar1); StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); StringExpandPlaceholders(gStringVar4, gOtherText_DidNotLearnMove2); @@ -4355,7 +4720,7 @@ void StopTryingToTeachMove_806F6B4(u8 taskId) return; if (selection == -1) PlaySE(SE_SELECT); - MenuZeroFillWindowRect(23, 8, 29, 13); + Menu_EraseWindowRect(23, 8, 29, 13); GetMonNickname(ewram1C000.pokemon, gStringVar1); StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn); @@ -4706,7 +5071,7 @@ void sub_8070088(u8 taskId) else { gUnknown_0202E8F4 = 1; - MenuZeroFillWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); + Menu_EraseWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); PlaySE(SE_KAIFUKU); PartyMenuUpdateLevelOrStatus(ewram1C000.pokemon, ewram1C000.unk5); task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.unk5 * 2], 9); @@ -4763,12 +5128,12 @@ void CreateItemUseMoveMenu(u8 partyMonIndex) u8 i; r6 = 0; - MenuDrawTextWindow(19, 10, 29, 19); + Menu_DrawStdWindowFrame(19, 10, 29, 19); for (i = 0; i < 4; i++) { u16 move = GetMonData(&gPlayerParty[partyMonIndex], MON_DATA_MOVE1 + i); - MenuPrint(gMoveNames[move], 20, i * 2 + 11); + Menu_PrintText(gMoveNames[move], 20, i * 2 + 11); if (move != 0) r6++; } @@ -4780,12 +5145,12 @@ void Task_HandleItemUseMoveMenuInput(u8 taskId) if (gMain.newKeys & DPAD_UP) { PlaySE(SE_SELECT); - MoveMenuCursor(-1); + Menu_MoveCursor(-1); } else if (gMain.newKeys & DPAD_DOWN) { PlaySE(SE_SELECT); - MoveMenuCursor(1); + Menu_MoveCursor(1); } else if (gMain.newKeys & A_BUTTON) { @@ -4827,17 +5192,17 @@ void DoPPRecoveryItemEffect(u8 taskId, u16 item, TaskFunc c) void ItemUseMoveMenu_HandleMoveSelection(u8 taskId) { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(19, 10, 29, 19); + Menu_DestroyCursor(); + Menu_EraseWindowRect(19, 10, 29, 19); sub_806D5A4(); - gTasks[taskId].data[11] = GetMenuCursorPos(); + gTasks[taskId].data[11] = Menu_GetCursorPos(); DoRecoverPP(taskId); } void ItemUseMoveMenu_HandleCancel(u8 taskId) { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(19, 10, 29, 19); + Menu_DestroyCursor(); + Menu_EraseWindowRect(19, 10, 29, 19); if (gMain.inBattle) gTasks[ewram1C000.unk4].func = HandleBattlePartyMenu; else @@ -4880,7 +5245,8 @@ void DoPPUpItemEffect(u8 taskId, u16 b, TaskFunc c) gMain.newKeys = 0; } -static const u8 *const StatNames[] = { +static const u8 *const StatNames[] = +{ gOtherText_HP, gOtherText_Attack, gOtherText_Defense, @@ -4889,7 +5255,8 @@ static const u8 *const StatNames[] = { gOtherText_Speed, }; -static const u8 StatDataTypes[] = { +static const u8 StatDataTypes[] = +{ MON_DATA_MAX_HP, MON_DATA_ATK, MON_DATA_DEF, @@ -4897,6 +5264,17 @@ static const u8 StatDataTypes[] = { MON_DATA_SPDEF, MON_DATA_SPEED, }; + +#if DEBUG + +const u8 gUnknown_Debug_839B6CE[] = {0x40, 0, 0, 0, 0x44, 0, 0xFF, 0, 0, 0}; + +const u8 gUnknown_Debug_839B6D8[] = _( + "{STR_VAR_1}かい じっこう\n" + "{STR_VAR_2}たんいじかん しょうひ"); + +#endif + void DoRareCandyItemEffect(u8 taskId, u16 b, TaskFunc c) { u8 i; @@ -4966,7 +5344,7 @@ void PrintStatGrowthsInLevelUpWindow(u8 taskId) { u8 i; - MenuDrawTextWindow(11, 0, 29, 7); + Menu_DrawStdWindowFrame(11, 0, 29, 7); for (i = 0; i < NUM_STATS; i++) { @@ -4982,12 +5360,12 @@ void PrintStatGrowthsInLevelUpWindow(u8 taskId) x = (i / 3) * 9 + 11; y = ((i % 3) << 1) + 1; - MenuPrint_PixelCoords(StatNames[i], (x + 1) * 8, y * 8, 1); + Menu_PrintTextPixelCoords(StatNames[i], (x + 1) * 8, y * 8, 1); if (i == 2) - MenuPrint_PixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 0); + Menu_PrintTextPixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 0); else - MenuPrint_PixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 1); + Menu_PrintTextPixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 1); gStringVar1[0] = EXT_CTRL_CODE_BEGIN; gStringVar1[1] = 0x14; @@ -4995,7 +5373,7 @@ void PrintStatGrowthsInLevelUpWindow(u8 taskId) ConvertIntToDecimalStringN(gStringVar1 + 3, ewram1B000.statGrowths[i], 1, 2); - MenuPrint_PixelCoords(gStringVar1, (x + 6) * 8 + 12, y * 8, 0); + Menu_PrintTextPixelCoords(gStringVar1, (x + 6) * 8 + 12, y * 8, 0); } } #elif GERMAN @@ -5011,7 +5389,7 @@ void PrintStatGrowthsInLevelUpWindow(u8 taskId) { movs r1, 0\n\ movs r2, 0x1D\n\ movs r3, 0x7\n\ - bl MenuDrawTextWindow\n\ + bl Menu_DrawStdWindowFrame\n\ movs r7, 0\n\ ldr r0, _0807092C @ =gStringVar1\n\ mov r10, r0\n\ @@ -5095,7 +5473,7 @@ _0807086C:\n\ mov r0, r10\n\ adds r1, r4, 0\n\ adds r2, r5, 0\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ adds r0, r7, 0x1\n\ lsls r0, 24\n\ lsrs r7, r0, 24\n\ @@ -5142,7 +5520,7 @@ void PrintNewStatsInLevelUpWindow(u8 taskId) gStringVar1[2] = 0x06; ConvertIntToDecimalStringN(gStringVar1 + 3, ewram1B000.statGrowths[newStatIndex], 1, 3); - MenuPrint_PixelCoords(gStringVar1, (x + 6) * 8 + 6, y * 8, 0); + Menu_PrintTextPixelCoords(gStringVar1, (x + 6) * 8 + 6, y * 8, 0); } } @@ -5184,7 +5562,7 @@ void Task_RareCandy3(u8 taskId) u16 learnedMove; u16 evolutionSpecies; - MenuZeroFillWindowRect(11, 0, 29, 7); + Menu_EraseWindowRect(11, 0, 29, 7); learnedMove = MonTryLearningNewMove(ewram1C000.pokemon, TRUE); ewram1B000.unk282 = 1; @@ -5628,9 +6006,13 @@ _08070F8A:\n\ } #endif // NONMATCHING + +// Maybe this goes in start_menu.c +#if !DEBUG void unref_sub_8070F90(void) { FlagSet(FLAG_SYS_POKEDEX_GET); FlagSet(FLAG_SYS_POKEMON_GET); FlagSet(FLAG_SYS_POKENAV_GET); } +#endif diff --git a/src/field/pc_screen_effect.c b/src/field/pc_screen_effect.c index 364fca0aa..dcc3bc9c9 100644 --- a/src/field/pc_screen_effect.c +++ b/src/field/pc_screen_effect.c @@ -2,18 +2,7 @@ #include "main.h" #include "palette.h" #include "sprite.h" - -struct UnkStruct -{ - /*0x00*/ u16 tileTag; - /*0x02*/ u16 paletteTag; - /*0x04*/ u16 unk04; - /*0x06*/ u16 unk06; - /*0x08*/ u16 unk08; - /*0x0A*/ u16 unk0A; - /*0x0C*/ s16 unk0C; - /*0x10*/ u32 selectedPalettes; -}; +#include "pc_screen_effect.h" void sub_80C603C(void); void sub_80C6078(void); @@ -30,7 +19,7 @@ extern const u16 gUnknownPal_083D18EC[16]; extern const u8 gUnknownGfx_083D190C[128]; -extern struct UnkStruct *gUnknown_020387EC; +EWRAM_DATA struct PCScreenEffectStruct *gUnknown_020387EC = NULL; const struct SpriteSheet gUnknown_083D1898 = { gUnknownGfx_083D190C, sizeof(gUnknownGfx_083D190C), 0 }; @@ -58,7 +47,7 @@ const struct SpriteTemplate gSpriteTemplate_83D18C0 = sub_80C6130, }; -void sub_80C5CD4(struct UnkStruct *unkStruct) +void sub_80C5CD4(struct PCScreenEffectStruct *unkStruct) { u16 i; diff --git a/src/field/player_pc.c b/src/field/player_pc.c index 4fef09386..27427ecaa 100644 --- a/src/field/player_pc.c +++ b/src/field/player_pc.c @@ -29,9 +29,9 @@ extern void DestroyVerticalScrollIndicator(u8); extern void PauseVerticalScrollIndicator(u8); extern void LoadScrollIndicatorPalette(void); extern void ClearMailStruct(struct MailStruct *); -extern u8 sub_807D770(void); +extern u8 IsWeatherNotFadingIn(void); extern void sub_808B020(void); -extern void sub_80F944C(void); +extern void ClearVerticalScrollIndicatorPalettes(void); static EWRAM_DATA const u8 *gPcItemMenuOptionOrder = NULL; @@ -217,8 +217,8 @@ void PlayerPC(void) static void InitPlayerPCMenu(u8 taskId) { - MenuDrawTextWindow(0, 0, 10, gPcItemMenuOptionsNum * 2 + 1); - PrintMenuItemsReordered(1, 1, gPcItemMenuOptionsNum, sPlayerPCMenuActions, gPcItemMenuOptionOrder); + Menu_DrawStdWindowFrame(0, 0, 10, gPcItemMenuOptionsNum * 2 + 1); + Menu_PrintItemsReordered(1, 1, gPcItemMenuOptionsNum, sPlayerPCMenuActions, gPcItemMenuOptionOrder); InitMenu(0, 1, 1, gPcItemMenuOptionsNum, 0, 9); TASK.FUNC = PlayerPCProcessMenuInput; } @@ -228,22 +228,22 @@ static void PlayerPCProcessMenuInput(u8 taskId) if (gMain.newAndRepeatedKeys & DPAD_UP) { PlaySE(SE_SELECT); - MoveMenuCursor(-1); + Menu_MoveCursor(-1); } else if (gMain.newAndRepeatedKeys & DPAD_DOWN) { PlaySE(SE_SELECT); - MoveMenuCursor(1); + Menu_MoveCursor(1); } else if (gMain.newKeys & A_BUTTON) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); PlaySE(SE_SELECT); - sPlayerPCMenuActions[gPcItemMenuOptionOrder[GetMenuCursorPos()]].func(taskId); + sPlayerPCMenuActions[gPcItemMenuOptionOrder[Menu_GetCursorPos()]].func(taskId); } else if (gMain.newKeys & B_BUTTON) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); PlaySE(SE_SELECT); sPlayerPCMenuActions[gPcItemMenuOptionsNum[gPcItemMenuOptionOrder - 1]].func(taskId); // run EXIT. } @@ -262,7 +262,7 @@ static void PlayerPC_ItemStorage(u8 taskId) static void PlayerPC_Mailbox(u8 taskId) { - MenuZeroFillWindowRect(0, 0, 10, 9); + Menu_EraseWindowRect(0, 0, 10, 9); eMailboxInfo.count = GetMailboxMailCount(); if (eMailboxInfo.count == 0) @@ -280,7 +280,7 @@ static void PlayerPC_Mailbox(u8 taskId) static void PlayerPC_Decoration(u8 var) { - MenuZeroFillWindowRect(0, 0, 10, 9); + Menu_EraseWindowRect(0, 0, 10, 9); DoPlayerPCDecoration(var); } @@ -288,7 +288,7 @@ static void PlayerPC_TurnOff(u8 taskId) { if (gPcItemMenuOptionsNum == 4) // if the option count is 4, we are at the bedroom PC and not player PC, so do gender specific handling. { - MenuZeroFillWindowRect(0, 0, 0x1D, 0x13); + Menu_EraseWindowRect(0, 0, 0x1D, 0x13); if (gSaveBlock2.playerGender == MALE) ScriptContext1_SetupScript(gBrendanHouse_TurnPCOff); @@ -297,7 +297,7 @@ static void PlayerPC_TurnOff(u8 taskId) } else { - MenuZeroFillWindowRect(0, 0, 10, 9); + Menu_EraseWindowRect(0, 0, 10, 9); EnableBothScriptContexts(); } DestroyTask(taskId); @@ -305,17 +305,17 @@ static void PlayerPC_TurnOff(u8 taskId) static void InitItemStorageMenu(u8 var) { - MenuZeroFillWindowRect(0, 0, 10, 9); - MenuDrawTextWindow(0, 0, 11, 9); - PrintMenuItems(1, 1, 4, (struct MenuAction *)gPCText_ItemPCOptionsText); + Menu_EraseWindowRect(0, 0, 10, 9); + Menu_DrawStdWindowFrame(0, 0, 11, 9); + Menu_PrintItems(1, 1, 4, (struct MenuAction *)gPCText_ItemPCOptionsText); InitMenu(0, 1, 1, 4, var, 10); ItemStorageMenuPrint(gPCText_OptionDescList[var]); } static void ItemStorageMenuPrint(const u8 *textPtr) { - MenuFillWindowRectWithBlankTile(2, 15, 27, 18); - MenuPrint(textPtr, 2, 15); + Menu_BlankWindowRect(2, 15, 27, 18); + Menu_PrintText(textPtr, 2, 15); } static void ItemStorageMenuProcessInput(u8 var) @@ -323,23 +323,23 @@ static void ItemStorageMenuProcessInput(u8 var) if (gMain.newAndRepeatedKeys & DPAD_UP) { PlaySE(SE_SELECT); - MoveMenuCursor(-1); - ItemStorageMenuPrint(gPCText_OptionDescList[GetMenuCursorPos()]); + Menu_MoveCursor(-1); + ItemStorageMenuPrint(gPCText_OptionDescList[Menu_GetCursorPos()]); } else if (gMain.newAndRepeatedKeys & DPAD_DOWN) { PlaySE(SE_SELECT); - MoveMenuCursor(1); - ItemStorageMenuPrint(gPCText_OptionDescList[GetMenuCursorPos()]); + Menu_MoveCursor(1); + ItemStorageMenuPrint(gPCText_OptionDescList[Menu_GetCursorPos()]); } else if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); - gPCText_ItemPCOptionsText[GetMenuCursorPos()].func(var); + gPCText_ItemPCOptionsText[Menu_GetCursorPos()].func(var); } else if (gMain.newKeys & B_BUTTON) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); PlaySE(SE_SELECT); gPCText_ItemPCOptionsText[ITEMPC_MENU_EXIT].func(var); } @@ -357,18 +357,18 @@ static void Task_ItemStorage_Deposit(u8 taskId) static void ItemStorage_Deposit(u8 taskId) { TASK.FUNC = Task_ItemStorage_Deposit; - fade_screen(1, 0); + FadeScreen(1, 0); } static void ItemStorage_HandleReturnToProcessInput(u8 taskId) { - if (sub_807D770() == TRUE) + if (IsWeatherNotFadingIn() == TRUE) TASK.FUNC = ItemStorageMenuProcessInput; } void ItemStorage_ReturnToMenuAfterDeposit(void) { - MenuDisplayMessageBox(); + Menu_DisplayDialogueFrame(); InitItemStorageMenu(ITEMPC_MENU_DEPOSIT); CreateTask(ItemStorage_HandleReturnToProcessInput, 0); pal_fill_black(); @@ -378,13 +378,13 @@ static void ItemStorage_Withdraw(u8 taskId) { s16 *data = TASK.data; - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 11, 9); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 11, 9); NUM_ITEMS = CountUsedPCItemSlots(); if (NUM_ITEMS != 0) { - MenuZeroFillWindowRect(0, 14, 29, 19); + Menu_EraseWindowRect(0, 14, 29, 19); CURRENT_ITEM_STORAGE_MENU = ITEMPC_MENU_WITHDRAW; PAGE_INDEX = 0; ITEMS_ABOVE_TOP = 0; @@ -400,13 +400,13 @@ static void ItemStorage_Toss(u8 taskId) { s16 *data = TASK.data; - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 11, 9); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 11, 9); NUM_ITEMS = CountUsedPCItemSlots(); if (NUM_ITEMS) { - MenuZeroFillWindowRect(0, 14, 29, 19); + Menu_EraseWindowRect(0, 14, 29, 19); CURRENT_ITEM_STORAGE_MENU = ITEMPC_MENU_TOSS; PAGE_INDEX = 0; ITEMS_ABOVE_TOP = 0; @@ -420,8 +420,8 @@ static void ItemStorage_Toss(u8 taskId) static void ItemStorage_Exit(u8 var) { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 11, 9); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 11, 9); ReshowPlayerPC(var); } @@ -450,7 +450,7 @@ static void ItemStorage_ProcessInput(u8 taskId) if(PAGE_INDEX != 0) // did the cursor move physically upwards? { PlaySE(SE_SELECT); - PAGE_INDEX = MoveMenuCursor(-1); + PAGE_INDEX = Menu_MoveCursor(-1); trueIndex = ITEMS_ABOVE_TOP + PAGE_INDEX; if (SWITCH_MODE_ACTIVE == FALSE) // are we not currently switching items? { @@ -474,7 +474,7 @@ static void ItemStorage_ProcessInput(u8 taskId) ItemStorage_DrawBothListAndDescription(taskId); if (SWITCH_MODE_ACTIVE != FALSE) - MoveMenuCursor(0); // don't move the cursor. it's at the top of the page index, but not the true index. + Menu_MoveCursor(0); // don't move the cursor. it's at the top of the page index, but not the true index. } } else if(gMain.newAndRepeatedKeys & DPAD_DOWN) // _0813A306 @@ -482,7 +482,7 @@ static void ItemStorage_ProcessInput(u8 taskId) if(PAGE_INDEX != NUM_PAGE_ITEMS - 1) { PlaySE(SE_SELECT); - PAGE_INDEX = MoveMenuCursor(1); + PAGE_INDEX = Menu_MoveCursor(1); trueIndex = ITEMS_ABOVE_TOP + PAGE_INDEX; if(SWITCH_MODE_ACTIVE != FALSE) @@ -500,7 +500,7 @@ static void ItemStorage_ProcessInput(u8 taskId) ItemStorage_DrawBothListAndDescription(taskId); if (SWITCH_MODE_ACTIVE != FALSE) - MoveMenuCursor(0); + Menu_MoveCursor(0); } } else if(gMain.newKeys & SELECT_BUTTON) // _0813A3A0 @@ -549,7 +549,7 @@ static void ItemStorage_ProcessInput(u8 taskId) PlaySE(SE_SELECT); if(SWITCH_MODE_ACTIVE == FALSE) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); ItemStorage_GoBackToPlayerPCMenu(taskId); } else @@ -563,10 +563,10 @@ static void ItemStorage_ProcessInput(u8 taskId) static void ItemStorage_GoBackToPlayerPCMenu(u8 taskId) { BuyMenuFreeMemory(); - DestroyVerticalScrollIndicator(0); - DestroyVerticalScrollIndicator(1); - MenuZeroFillWindowRect(0, 0, 29, 19); - MenuDisplayMessageBox(); + DestroyVerticalScrollIndicator(TOP_ARROW); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); + Menu_EraseWindowRect(0, 0, 29, 19); + Menu_DisplayDialogueFrame(); InitItemStorageMenu(TASK.CURRENT_ITEM_STORAGE_MENU); TASK.FUNC = ItemStorageMenuProcessInput; } @@ -576,8 +576,8 @@ static void ItemStorage_DoItemAction(u8 taskId) s16 *data = TASK.data; u8 trueIndex = PAGE_INDEX + ITEMS_ABOVE_TOP; - PauseVerticalScrollIndicator(0); - PauseVerticalScrollIndicator(1); // PauseVerticalScrollIndicator + PauseVerticalScrollIndicator(TOP_ARROW); + PauseVerticalScrollIndicator(BOTTOM_ARROW); if(CURRENT_ITEM_STORAGE_MENU == ITEMPC_MENU_WITHDRAW) { @@ -603,7 +603,7 @@ static void ItemStorage_DoItemAction(u8 taskId) ItemStorage_PrintItemPcResponse(ITEMPC_HOW_MANY_TO_TOSS); } NUM_QUANTITY_ROLLER = 1; - MenuDrawTextWindow(6, 8, 13, 11); + Menu_DrawStdWindowFrame(6, 8, 13, 11); sub_80A418C(NUM_QUANTITY_ROLLER, STR_CONV_MODE_RIGHT_ALIGN, 8, 9, 3); TASK.FUNC = ItemStorage_HandleQuantityRolling; } @@ -652,7 +652,7 @@ static void ItemStorage_HandleQuantityRolling(u8 taskId) else if(gMain.newKeys & A_BUTTON) // confirm quantity. { PlaySE(SE_SELECT); - MenuZeroFillWindowRect(6, 6, 0xD, 0xB); + Menu_EraseWindowRect(6, 6, 0xD, 0xB); if(CURRENT_ITEM_STORAGE_MENU == ITEMPC_MENU_WITHDRAW) ItemStorage_DoItemWithdraw(taskId); @@ -662,9 +662,9 @@ static void ItemStorage_HandleQuantityRolling(u8 taskId) else if(gMain.newKeys & B_BUTTON) // cancel quantity. { PlaySE(SE_SELECT); - MenuZeroFillWindowRect(6, 6, 0xD, 0xB); - StartVerticalScrollIndicators(0); - StartVerticalScrollIndicators(1); + Menu_EraseWindowRect(6, 6, 0xD, 0xB); + StartVerticalScrollIndicators(TOP_ARROW); + StartVerticalScrollIndicators(BOTTOM_ARROW); ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[ITEMS_ABOVE_TOP + PAGE_INDEX].itemId); // why not use trueIndex? TASK.FUNC = ItemStorage_ProcessInput; } @@ -713,7 +713,7 @@ static void ItemStorage_DoItemToss(u8 taskId) static void ItemStorage_ResumeInputFromYesToss(u8 taskId) { - MenuZeroFillWindowRect(0x6, 0x6, 0xD, 0xB); + Menu_EraseWindowRect(0x6, 0x6, 0xD, 0xB); ItemStorage_PrintItemPcResponse(ITEMPC_THREW_AWAY_ITEM); TASK.FUNC = ItemStorage_HandleRemoveItem; } @@ -722,10 +722,10 @@ static void ItemStorage_ResumeInputFromNoToss(u8 taskId) { s16 *data = TASK.data; - MenuZeroFillWindowRect(0x6, 0x6, 0xD, 0xB); + Menu_EraseWindowRect(0x6, 0x6, 0xD, 0xB); InitMenu(0, 16, 2, NUM_PAGE_ITEMS, PAGE_INDEX, 0xD); - StartVerticalScrollIndicators(0); - StartVerticalScrollIndicators(1); + StartVerticalScrollIndicators(TOP_ARROW); + StartVerticalScrollIndicators(BOTTOM_ARROW); ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[ITEMS_ABOVE_TOP + PAGE_INDEX].itemId); TASK.FUNC = ItemStorage_ProcessInput; } @@ -757,17 +757,17 @@ static void ItemStorage_WaitPressHandleResumeProcessInput(u8 taskId) if(gMain.newKeys & A_BUTTON || gMain.newKeys == B_BUTTON) { ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[ITEMS_ABOVE_TOP + PAGE_INDEX].itemId); - StartVerticalScrollIndicators(0); - StartVerticalScrollIndicators(1); + StartVerticalScrollIndicators(TOP_ARROW); + StartVerticalScrollIndicators(BOTTOM_ARROW); TASK.FUNC = ItemStorage_ProcessInput; } } static void ItemStorage_HandleResumeProcessInput(u8 taskId) { - MenuZeroFillWindowRect(0x6, 0x6, 0xD, 0xB); - StartVerticalScrollIndicators(0); - StartVerticalScrollIndicators(1); + Menu_EraseWindowRect(0x6, 0x6, 0xD, 0xB); + StartVerticalScrollIndicators(TOP_ARROW); + StartVerticalScrollIndicators(BOTTOM_ARROW); ItemStorage_DrawBothListAndDescription(taskId); TASK.FUNC = ItemStorage_ProcessInput; } @@ -817,14 +817,14 @@ static void ItemStorage_DrawItemQuantity(u16 arg1, enum StringConvertMode arg2, sub_80A4164(gStringVar1, arg1, arg2, arg4); if(isSwapSelected != FALSE) - MenuPrint(gSelectedItemQuantityFormatText, 0x1A, arg3); + Menu_PrintText(gSelectedItemQuantityFormatText, 0x1A, arg3); else - MenuPrint(gNonSelectedItemQuantityFormatText, 0x1A, arg3); + Menu_PrintText(gNonSelectedItemQuantityFormatText, 0x1A, arg3); } static void ItemStorage_DrawItemVoidQuantity(u8 var) { - MenuPrint(gUnknown_08406330, 0x19, var); + Menu_PrintText(gUnknown_08406330, 0x19, var); } static void ItemStorage_DrawItemName(struct ItemSlot *itemSlot, u8 var, int isSwapSelected) @@ -832,9 +832,9 @@ static void ItemStorage_DrawItemName(struct ItemSlot *itemSlot, u8 var, int isSw CopyItemName(itemSlot->itemId, gStringVar1); if(isSwapSelected != FALSE) - MenuPrint(gSelectedItemFormattedText, 16, var); + Menu_PrintText(gSelectedItemFormattedText, 16, var); else - MenuPrint(gNonSelectedItemFormattedText, 16, var); + Menu_PrintText(gNonSelectedItemFormattedText, 16, var); } static void ItemStorage_DrawNormalItemEntry(struct ItemSlot *itemSlot, u8 var, int var2) @@ -853,7 +853,7 @@ static void ItemStorage_DrawTMHMEntry(struct ItemSlot *itemSlot, u8 var, int var { ItemStorage_DrawItemName(itemSlot, var, var2); - if(itemSlot->itemId < ITEM_HM01) + if(itemSlot->itemId < ITEM_HM01_CUT) ItemStorage_DrawItemQuantity(itemSlot->quantity, STR_CONV_MODE_RIGHT_ALIGN, var, 3, var2); else ItemStorage_DrawItemVoidQuantity(var); // HMs do not have a quantity. @@ -866,61 +866,51 @@ static void ItemStorage_DrawItemList(u8 taskId) u16 i; u16 yCoord = 0; - // r5 is i and is unsigned 16-bit. - - for(i = ITEMS_ABOVE_TOP; i < ITEMS_ABOVE_TOP + NUM_PAGE_ITEMS; i++) + for (i = ITEMS_ABOVE_TOP; i < ITEMS_ABOVE_TOP + NUM_PAGE_ITEMS; i++) { yCoord = (i - ITEMS_ABOVE_TOP) * 2; - if(i != NUM_ITEMS) + if (i == NUM_ITEMS) + { + sub_8072A18(gOtherText_CancelNoTerminator, 0x80, (yCoord + 2) * 8, 0x68, 1); + break; + } + else { tempArg = 0; - if(SWITCH_MODE_ACTIVE != FALSE && i == SWAP_ITEM_INDEX) + if (SWITCH_MODE_ACTIVE != FALSE && i == SWAP_ITEM_INDEX) tempArg = 1; - switch(GetPocketByItemId(gSaveBlock1.pcItems[i].itemId) - 1) + switch (GetPocketByItemId(gSaveBlock1.pcItems[i].itemId) - 1) { - case 0: - case 1: - case 3: - ItemStorage_DrawNormalItemEntry((struct ItemSlot *)&gSaveBlock1.pcItems[i], yCoord + 2, tempArg); - break; - case 4: - ItemStorage_DrawKeyItemEntry((struct ItemSlot *)&gSaveBlock1.pcItems[i], yCoord + 2, tempArg); - break; - case 2: - ItemStorage_DrawTMHMEntry((struct ItemSlot *)&gSaveBlock1.pcItems[i], yCoord + 2, tempArg); - break; + case 0: + case 1: + case 3: + ItemStorage_DrawNormalItemEntry((struct ItemSlot *)&gSaveBlock1.pcItems[i], yCoord + 2, tempArg); + break; + case 4: + ItemStorage_DrawKeyItemEntry((struct ItemSlot *)&gSaveBlock1.pcItems[i], yCoord + 2, tempArg); + break; + case 2: + ItemStorage_DrawTMHMEntry((struct ItemSlot *)&gSaveBlock1.pcItems[i], yCoord + 2, tempArg); + break; } } - else - { - goto weirdCase; // what??? - } } -beforeLabel: - if(i - ITEMS_ABOVE_TOP < 8) - MenuFillWindowRectWithBlankTile(16, yCoord + 4, 0x1C, 0x12); + if (i - ITEMS_ABOVE_TOP < 8) + Menu_BlankWindowRect(16, yCoord + 4, 0x1C, 0x12); - switch(ITEMS_ABOVE_TOP) - { - default: - CreateVerticalScrollIndicators(0, 0xB8, 8); - break; -weirdCase: - sub_8072A18(gOtherText_CancelNoTerminator, 0x80, (yCoord + 2) * 8, 0x68, 1); - goto beforeLabel; - case 0: - DestroyVerticalScrollIndicator(0); - break; - } + if (ITEMS_ABOVE_TOP != 0) + CreateVerticalScrollIndicators(TOP_ARROW, 0xB8, 8); + else + DestroyVerticalScrollIndicator(TOP_ARROW); - if(ITEMS_ABOVE_TOP + NUM_PAGE_ITEMS <= NUM_ITEMS) - CreateVerticalScrollIndicators(1, 0xB8, 0x98); + if (ITEMS_ABOVE_TOP + NUM_PAGE_ITEMS <= NUM_ITEMS) + CreateVerticalScrollIndicators(BOTTOM_ARROW, 0xB8, 0x98); else - DestroyVerticalScrollIndicator(1); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); } static void ItemStorage_PrintItemPcResponse(u16 itemId) @@ -984,14 +974,14 @@ static void ItemStorage_GoBackToItemPCMenu(u8 taskId, u8 var) { s16 *data = TASK.data; - sub_80F944C(); + ClearVerticalScrollIndicatorPalettes(); LoadScrollIndicatorPalette(); ItemStorage_LoadPalette(); - MenuDrawTextWindow(0xF, 0, 0x1D, 0x13); - MenuDrawTextWindow(0, 0xC, 0xE, 0x13); - MenuDrawTextWindow(0, 0, 0xB, 3); + Menu_DrawStdWindowFrame(0xF, 0, 0x1D, 0x13); + Menu_DrawStdWindowFrame(0, 0xC, 0xE, 0x13); + Menu_DrawStdWindowFrame(0, 0, 0xB, 3); ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[0].itemId); - MenuPrint(gPCText_ItemPCOptionsText[var].text, 1, 1); + Menu_PrintText(gPCText_ItemPCOptionsText[var].text, 1, 1); ItemStorage_DrawItemList(taskId); InitMenu(0, 0x10, 2, NUM_PAGE_ITEMS, PAGE_INDEX, 0xD); } @@ -1039,68 +1029,50 @@ static void Mailbox_UpdateMailList(void) } } -// WWHHHHHYYYYYYYY SOMEBODY PLEASE FIX THIS static void Mailbox_DrawMailList(u8 taskId) // taskId is unused { u16 yCoord = 0; - u16 i = eMailboxInfo.itemsAbove; - register struct MailboxStruct *tempMailbox asm("r1") = &eMailboxInfo; - register struct MailboxStruct *mailbox asm("r6"); + u16 i; - if(i < i + tempMailbox->pageItems) + for (i = eMailboxInfo.itemsAbove; i < eMailboxInfo.itemsAbove + eMailboxInfo.pageItems; i++) { - mailbox = tempMailbox; - goto forJump; - for(; i < mailbox->itemsAbove + mailbox->pageItems; i++) - { - forJump: - yCoord = (i - mailbox->itemsAbove) * 2; - MenuFillWindowRectWithBlankTile(0x15, yCoord + 2, 0x1C, yCoord + 3); - - if(i != mailbox->count) + yCoord = (i - eMailboxInfo.itemsAbove) * 2; + Menu_BlankWindowRect(0x15, yCoord + 2, 0x1C, yCoord + 3); + if (i == eMailboxInfo.count) { - StringCopy(gStringVar1, gSaveBlock1.mail[i + 6].playerName); - SanitizeNameString(gStringVar1); - MenuPrint(gStringVar1, 0x15, yCoord + 2); + Menu_PrintText(gOtherText_CancelNoTerminator, 0x15, yCoord + 2); + break; } else { - goto weirdCase; // again, what??? + StringCopy(gStringVar1, gSaveBlock1.mail[i + 6].playerName); + SanitizeNameString(gStringVar1); + Menu_PrintText(gStringVar1, 0x15, yCoord + 2); } } - } -beforeLabel: - if(i - eMailboxInfo.itemsAbove != 8) - MenuFillWindowRectWithBlankTile(0x15, yCoord + 4, 0x1C, 0x12); + if (i - eMailboxInfo.itemsAbove != 8) + Menu_BlankWindowRect(0x15, yCoord + 4, 0x1C, 0x12); - switch(eMailboxInfo.itemsAbove) - { - default: - CreateVerticalScrollIndicators(0, 0xC8, 8); - break; -weirdCase: - MenuPrint(gOtherText_CancelNoTerminator, 0x15, yCoord + 2); - goto beforeLabel; - case 0: - DestroyVerticalScrollIndicator(0); - break; - } + if (eMailboxInfo.itemsAbove != 0) + CreateVerticalScrollIndicators(TOP_ARROW, 0xC8, 8); + else + DestroyVerticalScrollIndicator(TOP_ARROW); - if(eMailboxInfo.itemsAbove + eMailboxInfo.pageItems <= eMailboxInfo.count) - CreateVerticalScrollIndicators(1, 0xC8, 0x98); + if (eMailboxInfo.itemsAbove + eMailboxInfo.pageItems <= eMailboxInfo.count) + CreateVerticalScrollIndicators(BOTTOM_ARROW, 0xC8, 0x98); else - DestroyVerticalScrollIndicator(1); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); } static void Mailbox_DrawMailboxMenu(u8 taskId) { - sub_80F944C(); + ClearVerticalScrollIndicatorPalettes(); LoadScrollIndicatorPalette(); - MenuZeroFillWindowRect(0, 0, 0x1D, 0x13); - MenuDrawTextWindow(0, 0, 0x8, 0x3); - MenuPrint(gPCText_Mailbox, 1, 1); - MenuDrawTextWindow(0x14, 0, 0x1D, 0x13); + Menu_EraseWindowRect(0, 0, 0x1D, 0x13); + Menu_DrawStdWindowFrame(0, 0, 0x8, 0x3); + Menu_PrintText(gPCText_Mailbox, 1, 1); + Menu_DrawStdWindowFrame(0x14, 0, 0x1D, 0x13); Mailbox_DrawMailList(taskId); InitMenu(0, 0x15, 2, eMailboxInfo.pageItems, eMailboxInfo.cursorPos, 8); } @@ -1115,7 +1087,7 @@ static void Mailbox_ProcessInput(u8 taskId) if(eMailboxInfo.cursorPos != 0) { PlaySE(SE_SELECT); - eMailboxInfo.cursorPos = MoveMenuCursor(-1); + eMailboxInfo.cursorPos = Menu_MoveCursor(-1); } else if(eMailboxInfo.itemsAbove != 0) { @@ -1129,7 +1101,7 @@ static void Mailbox_ProcessInput(u8 taskId) if(eMailboxInfo.cursorPos != eMailboxInfo.pageItems - 1) { PlaySE(SE_SELECT); - eMailboxInfo.cursorPos = MoveMenuCursor(1); + eMailboxInfo.cursorPos = Menu_MoveCursor(1); } else if(eMailboxInfo.itemsAbove + eMailboxInfo.cursorPos != eMailboxInfo.count) { @@ -1140,7 +1112,7 @@ static void Mailbox_ProcessInput(u8 taskId) } else if(gMain.newKeys & A_BUTTON) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); PlaySE(SE_SELECT); if(eMailboxInfo.itemsAbove + eMailboxInfo.cursorPos == eMailboxInfo.count) @@ -1155,7 +1127,7 @@ static void Mailbox_ProcessInput(u8 taskId) } else if(gMain.newKeys & B_BUTTON) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); PlaySE(SE_SELECT); Mailbox_TurnOff(taskId); } @@ -1165,13 +1137,13 @@ static void Mailbox_ProcessInput(u8 taskId) static void Mailbox_CloseScrollIndicators(void) { BuyMenuFreeMemory(); - DestroyVerticalScrollIndicator(0); - DestroyVerticalScrollIndicator(1); + DestroyVerticalScrollIndicator(TOP_ARROW); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); } static void Mailbox_PrintWhatToDoWithPlayerMailText(u8 taskId) { - MenuZeroFillWindowRect(0, 0, 0x1D, 0x13); + Menu_EraseWindowRect(0, 0, 0x1D, 0x13); StringCopy(gStringVar1, gSaveBlock1.mail[eMailboxInfo.itemsAbove + 6 + eMailboxInfo.cursorPos].playerName); SanitizeNameString(gStringVar1); StringExpandPlaceholders(gStringVar4, gOtherText_WhatWillYouDoMail); @@ -1180,7 +1152,7 @@ static void Mailbox_PrintWhatToDoWithPlayerMailText(u8 taskId) static void Mailbox_ReturnToPlayerPC(u8 taskId) { - MenuZeroFillWindowRect(0, 0, 0x1D, 0x13); + Menu_EraseWindowRect(0, 0, 0x1D, 0x13); ReshowPlayerPC(taskId); } @@ -1192,8 +1164,8 @@ static void Mailbox_TurnOff(u8 taskId) static void Mailbox_PrintMailOptions(u8 taskId) // Mailbox_PrintMailOptions { - MenuDrawTextWindow(0, 0, 0xC, 0x9); - PrintMenuItems(1, 1, 4, (struct MenuAction *)gMailboxMailOptions); + Menu_DrawStdWindowFrame(0, 0, 0xC, 0x9); + Menu_PrintItems(1, 1, 4, (struct MenuAction *)gMailboxMailOptions); InitMenu(0, 1, 1, 4, 0, 0xB); TASK.FUNC = Mailbox_MailOptionsProcessInput; } @@ -1203,17 +1175,17 @@ static void Mailbox_MailOptionsProcessInput(u8 taskId) if(gMain.newAndRepeatedKeys & DPAD_UP) { PlaySE(SE_SELECT); - MoveMenuCursor(-1); + Menu_MoveCursor(-1); } else if(gMain.newAndRepeatedKeys & DPAD_DOWN) { PlaySE(SE_SELECT); - MoveMenuCursor(1); + Menu_MoveCursor(1); } else if(gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); - gMailboxMailOptions[GetMenuCursorPos()].func(taskId); + gMailboxMailOptions[Menu_GetCursorPos()].func(taskId); } else if(gMain.newKeys & B_BUTTON) { @@ -1224,7 +1196,7 @@ static void Mailbox_MailOptionsProcessInput(u8 taskId) static void Mailbox_DoMailRead(u8 taskId) { - fade_screen(1, 0); + FadeScreen(1, 0); TASK.FUNC = Mailbox_FadeAndReadMail; } @@ -1239,7 +1211,7 @@ static void Mailbox_FadeAndReadMail(u8 taskId) static void Mailbox_HandleReturnToProcessInput(u8 taskId) // Mailbox_HandleReturnToProcessInput { - if(sub_807D770() == TRUE) // is black fade finished? why not gPaletteFade.active? + if (IsWeatherNotFadingIn() == TRUE) // is black fade finished? why not gPaletteFade.active? TASK.FUNC = Mailbox_ProcessInput; } @@ -1259,9 +1231,9 @@ static const u8 gHighlightedMoveToBagFormatText[] = _("{COLOR RED}{STR_VAR_1}"); static void Mailbox_MoveToBag(u8 taskId) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); StringCopy(gStringVar1, gOtherText_MoveToBag); - MenuPrint(gHighlightedMoveToBagFormatText, 1, 3); // gHighlightedMoveToBagFormatText + Menu_PrintText(gHighlightedMoveToBagFormatText, 1, 3); // gHighlightedMoveToBagFormatText DisplayItemMessageOnField(taskId, gOtherText_MessageWillBeLost, Mailbox_DrawYesNoBeforeMove, 0); } @@ -1275,7 +1247,7 @@ static void Mailbox_DoMailMoveToBag(u8 taskId) { struct MailStruct *mail = &gSaveBlock1.mail[eMailboxInfo.itemsAbove + 6 + eMailboxInfo.cursorPos]; - MenuZeroFillWindowRect(0x14, 8, 0x1A, 0xD); + Menu_EraseWindowRect(0x14, 8, 0x1A, 0xD); if(AddBagItem(mail->itemId, 1) == FALSE) { @@ -1298,7 +1270,7 @@ static void Mailbox_DoMailMoveToBag(u8 taskId) static void Mailbox_ReturnToInputAfterNo(u8 taskId) // Mailbox_ReturnToInputAfterNo { - MenuZeroFillWindowRect(0x14, 0x8, 0x1A, 0xD); + Menu_EraseWindowRect(0x14, 0x8, 0x1A, 0xD); Mailbox_DrawMailMenuAndDoProcessInput(taskId); } @@ -1308,7 +1280,7 @@ static void Mailbox_Give(u8 taskId) Mailbox_NoPokemonForMail(taskId); // cannot be reached normally else { - fade_screen(1, 0); + FadeScreen(1, 0); TASK.FUNC = Mailbox_DoGiveMailPokeMenu; } } @@ -1353,8 +1325,8 @@ static void Mailbox_NoPokemonForMail(u8 taskId) static void Mailbox_Cancel(u8 taskId) { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 0xC, 0x9); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 0xC, 0x9); Mailbox_DrawMailMenuAndDoProcessInput(taskId); } diff --git a/src/field/pokeblock.c b/src/field/pokeblock.c index 640d4731f..b4be44aa2 100644 --- a/src/field/pokeblock.c +++ b/src/field/pokeblock.c @@ -1,14 +1,10 @@ -// - -// - #include "global.h" #include "overworld.h" #include "sprite.h" #include "script.h" #include "strings.h" #include "task.h" -#include "unknown_task.h" +#include "scanline_effect.h" #include "text.h" #include "main.h" #include "menu.h" @@ -95,7 +91,8 @@ static const u8 *gUnknown_03000758; #define GFX_TAG_POKEBLOCK_CASE 14800 -const s8 gPokeblockFlavorCompatibilityTable[] = { +const s8 gPokeblockFlavorCompatibilityTable[] = +{ // Cool, Beauty, Cute, Smart, Tough 0, 0, 0, 0, 0, // Hardy 1, 0, 0, 0, -1, // Lonely @@ -124,14 +121,16 @@ const s8 gPokeblockFlavorCompatibilityTable[] = { 0, 0, 0, 0, 0 // Quirky }; -void (*const gUnknown_083F7EA8[])(void) = { +void (*const gUnknown_083F7EA8[])(void) = +{ sub_80A5B40, c2_exit_to_overworld_2_switch, sub_802E424, c2_exit_to_overworld_2_switch }; -const u8 *const gPokeblockNames[] = { +const u8 *const gPokeblockNames[] = +{ NULL, ContestStatsText_RedPokeBlock, ContestStatsText_BluePokeBlock, @@ -149,7 +148,8 @@ const u8 *const gPokeblockNames[] = { ContestStatsText_GoldPokeBlock }; -const struct MenuAction2 gUnknown_083F7EF4[] = { +const struct MenuAction2 gUnknown_083F7EF4[] = +{ {OtherText_Use, sub_810C508}, {OtherText_Toss, sub_810C5C0}, {gOtherText_CancelNoTerminator, sub_810C748}, @@ -165,21 +165,25 @@ const struct YesNoFuncTable gUnknown_083F7F24 = {sub_810C610, sub_810C668}; const u8 UnreferencedData_083F7F2C[] = {0x16, 0x17, 0x18, 0x21, 0x2f}; -const struct OamData gOamData_83F7F34 = { +const struct OamData gOamData_83F7F34 = +{ .size = 3, .priority = 2 }; -const union AnimCmd gSpriteAnim_83F7F3C[] = { +const union AnimCmd gSpriteAnim_83F7F3C[] = +{ ANIMCMD_FRAME(.imageValue = 0, .duration = 0), ANIMCMD_END }; -const union AnimCmd *const gSpriteAnimTable_83F7F44[] = { +const union AnimCmd *const gSpriteAnimTable_83F7F44[] = +{ gSpriteAnim_83F7F3C }; -const union AffineAnimCmd gSpriteAffineAnim_83F7F48[] = { +const union AffineAnimCmd gSpriteAffineAnim_83F7F48[] = +{ AFFINEANIMCMD_FRAME(0, 0, -2, 2), AFFINEANIMCMD_FRAME(0, 0, 2, 4), AFFINEANIMCMD_FRAME(0, 0, -2, 4), @@ -187,22 +191,26 @@ const union AffineAnimCmd gSpriteAffineAnim_83F7F48[] = { AFFINEANIMCMD_END }; -const union AffineAnimCmd *const gSpriteAffineAnimTable_83F7F70[] = { +const union AffineAnimCmd *const gSpriteAffineAnimTable_83F7F70[] = +{ gSpriteAffineAnim_83F7F48 }; -const struct CompressedSpriteSheet gUnknown_083F7F74 = { +const struct CompressedSpriteSheet gUnknown_083F7F74 = +{ gMenuPokeblockDevice_Gfx, 0x800, GFX_TAG_POKEBLOCK_CASE }; -const struct CompressedSpritePalette gUnknown_083F7F7C = { +const struct CompressedSpritePalette gUnknown_083F7F7C = +{ gMenuPokeblockDevice_Pal, GFX_TAG_POKEBLOCK_CASE }; -const struct SpriteTemplate gSpriteTemplate_83F7F84 = { +const struct SpriteTemplate gSpriteTemplate_83F7F84 = +{ GFX_TAG_POKEBLOCK_CASE, GFX_TAG_POKEBLOCK_CASE, &gOamData_83F7F34, @@ -212,12 +220,25 @@ const struct SpriteTemplate gSpriteTemplate_83F7F84 = { SpriteCallbackDummy }; -const struct Pokeblock gUnknown_083F7F9C[] = { - { PBLOCK_CLR_RED, 20, 0, 0, 0, 0, 20}, - { PBLOCK_CLR_BLUE, 0, 20, 0, 0, 0, 20}, - { PBLOCK_CLR_PINK, 0, 0, 20, 0, 0, 20}, - { PBLOCK_CLR_GREEN, 0, 0, 0, 20, 0, 20}, - { PBLOCK_CLR_YELLOW, 0, 0, 0, 0, 20, 20} +const struct Pokeblock gUnknown_083F7F9C[] = +{ + { PBLOCK_CLR_RED, 20, 0, 0, 0, 0, 20 }, + { PBLOCK_CLR_BLUE, 0, 20, 0, 0, 0, 20 }, + { PBLOCK_CLR_PINK, 0, 0, 20, 0, 0, 20 }, + { PBLOCK_CLR_GREEN, 0, 0, 0, 20, 0, 20 }, + { PBLOCK_CLR_YELLOW, 0, 0, 0, 0, 20, 20 }, +#if DEBUG + { PBLOCK_CLR_PURPLE, 20, 0, 20, 0, 0, 20 }, + { PBLOCK_CLR_INDIGO, 0, 20, 0, 20, 0, 20 }, + { PBLOCK_CLR_BROWN, 0, 0, 20, 0, 20, 20 }, + { PBLOCK_CLR_LITEBLUE, 20, 0, 0, 20, 0, 20 }, + { PBLOCK_CLR_OLIVE, 0, 20, 0, 0, 20, 20 }, + { PBLOCK_CLR_GRAY, 0, 2, 0, 2, 2, 0 }, + { PBLOCK_CLR_BLACK, 3, 3, 3, 4, 3, 0 }, + { PBLOCK_CLR_WHITE, 1, 1, 1, 1, 1, 1 }, + { PBLOCK_CLR_GOLD, 20, 0, 0, 0, 0, 20 }, + { 0 }, +#endif }; // text @@ -232,14 +253,10 @@ static void sub_810B674(void) static void sub_810B68C(void) { - u16 *src; - vu16 *dest; LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); - src = gBGTilemapBuffers[2]; - dest = (vu16 *)(VRAM + 0x7800); - DmaCopy16(3, src, dest, sizeof gBGTilemapBuffers[2]); + DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(VRAM + 0x7800), sizeof gBGTilemapBuffers[2]); } static bool8 sub_810B6C0(void) @@ -248,14 +265,14 @@ static bool8 sub_810B6C0(void) switch (gMain.state) { case 0: - sub_80F9438(); + ClearVideoCallbacks(); sub_80F9368(); REG_BG2CNT = BGCNT_SCREENBASE(15) | BGCNT_CHARBASE(2) | BGCNT_PRIORITY(2); REG_BLDCNT = 0; gMain.state++; break; case 1: - remove_some_task(); + ScanlineEffect_Stop(); gMain.state++; break; case 2: @@ -275,15 +292,15 @@ static bool8 sub_810B6C0(void) gMain.state++; break; case 5: - SetUpWindowConfig(&gWindowConfig_81E6E34); + Text_LoadWindowTemplate(&gWindowTemplate_81E6E34); gMain.state++; break; case 6: - SetUpWindowConfig(&gWindowConfig_81E6E50); + Text_LoadWindowTemplate(&gWindowTemplate_81E6E50); gMain.state++; break; case 7: - MultistepInitMenuWindowBegin(&gWindowConfig_81E6E34); + MultistepInitMenuWindowBegin(&gWindowTemplate_81E6E34); gMain.state++; break; case 8: @@ -293,7 +310,7 @@ static bool8 sub_810B6C0(void) } break; case 9: - MultistepInitMenuWindowBegin(&gWindowConfig_81E6E50); + MultistepInitMenuWindowBegin(&gWindowTemplate_81E6E50); gMain.state++; break; case 10: @@ -310,10 +327,10 @@ static bool8 sub_810B6C0(void) } break; case 12: - sub_80F944C(); + ClearVerticalScrollIndicatorPalettes(); LoadScrollIndicatorPalette(); - CreateVerticalScrollIndicators(0, 0xb0, 0x08); - CreateVerticalScrollIndicators(1, 0xb0, 0x98); + CreateVerticalScrollIndicators(TOP_ARROW, 0xb0, 0x08); + CreateVerticalScrollIndicators(BOTTOM_ARROW, 0xb0, 0x98); gMain.state++; break; case 13: @@ -432,31 +449,30 @@ void OpenPokeblockCaseOnFeeder(void) SetMainCallback2(sub_810B96C); } -#ifdef DEBUG +#if DEBUG void debug_sub_8120F98(void) { u8 i; - for (i=0; i<40 && gUnknown_083F7F9C[i].color != 0; i++) - { + + for (i = 0; i < 40 && gUnknown_083F7F9C[i].color != 0; i++) gSaveBlock1.pokeblocks[i] = gUnknown_083F7F9C[i]; - } } #endif static void sub_810BB0C(void) { - BasicInitMenuWindow(&gWindowConfig_81E6E34); + BasicInitMenuWindow(&gWindowTemplate_81E6E34); sub_8072BD8(ItemId_GetItem(ITEM_POKEBLOCK_CASE)->name, 2, 1, 0x48); } static void sub_810BB30(void) { - BasicInitMenuWindow(&gWindowConfig_81E6E34); - MenuPrint(gContestStatsText_Spicy, 2, 13); - MenuPrint(gContestStatsText_Dry, 2, 15); - MenuPrint(gContestStatsText_Sweet, 2, 17); - MenuPrint(gContestStatsText_Bitter, 8, 13); - MenuPrint(gContestStatsText_Sour, 8, 15); + BasicInitMenuWindow(&gWindowTemplate_81E6E34); + Menu_PrintText(gContestStatsText_Spicy, 2, 13); + Menu_PrintText(gContestStatsText_Dry, 2, 15); + Menu_PrintText(gContestStatsText_Sweet, 2, 17); + Menu_PrintText(gContestStatsText_Bitter, 8, 13); + Menu_PrintText(gContestStatsText_Sour, 8, 15); } static void sub_810BB88(u8 a0) @@ -464,17 +480,17 @@ static void sub_810BB88(u8 a0) u8 i; u8 y; u8 *buf; - BasicInitMenuWindow(&gWindowConfig_81E6E34); + BasicInitMenuWindow(&gWindowTemplate_81E6E34); for (i=a0; i<=a0+8; i++) { y = (i - a0) << 1; if (i == gUnknown_02039248.unk2) { buf = sub_8072C74(gStringVar1, gContestStatsText_StowCase, 0x78, 0); - MenuPrint(gStringVar1, 15, y + 1); + Menu_PrintText(gStringVar1, 15, y + 1); if (i != a0 + 8) { - MenuZeroFillWindowRect(15, y + 3, 29, 18); + Menu_EraseWindowRect(15, y + 3, 29, 18); } break; } @@ -484,7 +500,7 @@ static void sub_810BB88(u8 a0) buf[2] = 0x06; buf += 3; ConvertIntToDecimalStringN(buf, sub_810C9B0(&gSaveBlock1.pokeblocks[i]), STR_CONV_MODE_RIGHT_ALIGN, 3); - MenuPrint(gStringVar1, 15, y + 1); + Menu_PrintText(gStringVar1, 15, y + 1); } } @@ -560,19 +576,19 @@ static void sub_810BDAC(bool8 flag) } if (gUnknown_02039248.unk1) { - sub_80F979C(0, 0); + SetVerticalScrollIndicators(TOP_ARROW, VISIBLE); } else { - sub_80F979C(0, 1); + SetVerticalScrollIndicators(TOP_ARROW, INVISIBLE); } if (gUnknown_02039248.unk2 > gUnknown_02039248.unk3 && gUnknown_02039248.unk1 + gUnknown_02039248.unk3 != gUnknown_02039248.unk2) { - sub_80F979C(1, 0); + SetVerticalScrollIndicators(BOTTOM_ARROW, VISIBLE); } else { - sub_80F979C(1, 1); + SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE); } for (i=0; i<5; i++) { @@ -596,15 +612,15 @@ static void sub_810BDAC(bool8 flag) gBGTilemapBuffers[2][v0 + 32] = 15; } } - BasicInitMenuWindow(&gWindowConfig_81E6E34); + BasicInitMenuWindow(&gWindowTemplate_81E6E34); if (gUnknown_02039248.unk0 + gUnknown_02039248.unk1 != gUnknown_02039248.unk2) { sub_8072C14(gStringVar1, sub_810C9E8(&gSaveBlock1.pokeblocks[gUnknown_02039248.unk0 + gUnknown_02039248.unk1]), 16, 1); - MenuPrint(gStringVar1, 11, 17); + Menu_PrintText(gStringVar1, 11, 17); } else { - MenuZeroFillWindowRect(11, 17, 12, 18); + Menu_EraseWindowRect(11, 17, 12, 18); } } @@ -776,8 +792,8 @@ static void sub_810C23C(u8 taskId) static void sub_810C2B0(void) { - DestroyVerticalScrollIndicator(0); - DestroyVerticalScrollIndicator(1); + DestroyVerticalScrollIndicator(TOP_ARROW); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); BuyMenuFreeMemory(); } @@ -810,11 +826,11 @@ static void sub_810C368(u8 taskId) int v0 = 0; if (gUnknown_02039244 > 1) v0 = 2; - sub_80F98A4(0); - sub_80F98A4(1); - BasicInitMenuWindow(&gWindowConfig_81E6E50); - MenuDrawTextWindow(7, v0 + 4, 13, 11); - PrintMenuItemsReordered(8, v0 + 5, gUnknown_0203924C, gUnknown_083F7EF4, gUnknown_03000758); + StopVerticalScrollIndicators(TOP_ARROW); + StopVerticalScrollIndicators(BOTTOM_ARROW); + BasicInitMenuWindow(&gWindowTemplate_81E6E50); + Menu_DrawStdWindowFrame(7, v0 + 4, 13, 11); + Menu_PrintItemsReordered(8, v0 + 5, gUnknown_0203924C, gUnknown_083F7EF4, gUnknown_03000758); InitMenu(0, 8, v0 + 5, gUnknown_0203924C, 0, 5); gSpecialVar_ItemId = gUnknown_02039248.unk0 + gUnknown_02039248.unk1; gTasks[taskId].func = sub_810C40C; @@ -824,24 +840,24 @@ static void sub_810C40C(u8 taskId) { if (gMain.newAndRepeatedKeys & DPAD_UP) { - if (GetMenuCursorPos()) + if (Menu_GetCursorPos()) { PlaySE(SE_SELECT); - MoveMenuCursor(-1); + Menu_MoveCursor(-1); } } else if (gMain.newAndRepeatedKeys & DPAD_DOWN) { - if (GetMenuCursorPos() != gUnknown_0203924C - 1) + if (Menu_GetCursorPos() != gUnknown_0203924C - 1) { PlaySE(SE_SELECT); - MoveMenuCursor(+1); + Menu_MoveCursor(+1); } } else if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); - gUnknown_083F7EF4[gUnknown_03000758[GetMenuCursorPos()]].func(taskId); + gUnknown_083F7EF4[gUnknown_03000758[Menu_GetCursorPos()]].func(taskId); } else if (gMain.newKeys & B_BUTTON) { @@ -868,9 +884,9 @@ static void sub_810C508(u8 taskId) static void sub_810C540(u8 taskId) { - BasicInitMenuWindow(&gWindowConfig_81E6E50); - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(7, 4, 13, 11); + BasicInitMenuWindow(&gWindowTemplate_81E6E50); + Menu_DestroyCursor(); + Menu_EraseWindowRect(7, 4, 13, 11); StringCopy(gStringVar1, gPokeblockNames[gSaveBlock1.pokeblocks[gUnknown_02039248.unk0 + gUnknown_02039248.unk1].color]); StringExpandPlaceholders(gStringVar4, gContestStatsText_ThrowAwayPrompt); DisplayItemMessageOnField(taskId, gStringVar4, sub_810C5EC, 0); @@ -878,7 +894,7 @@ static void sub_810C540(u8 taskId) static void sub_810C5C0(u8 taskId) { - sub_80F979C(1, 1); + SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE); gTasks[taskId].func = sub_810C540; } @@ -890,7 +906,7 @@ static void sub_810C5EC(u8 taskId) static void sub_810C610(u8 taskId) { - MenuZeroFillWindowRect(7, 6, 13, 11); + Menu_EraseWindowRect(7, 6, 13, 11); PokeblockClearIfExists((gUnknown_02039248.unk0 + gUnknown_02039248.unk1)); StringExpandPlaceholders(gStringVar4, gContestStatsText_WasThrownAway); DisplayItemMessageOnField(taskId, gStringVar4, sub_810C704, 0); @@ -900,15 +916,15 @@ static void sub_810C610(u8 taskId) static void sub_810C668(u8 taskId) { - StartVerticalScrollIndicators(0); - StartVerticalScrollIndicators(1); + StartVerticalScrollIndicators(TOP_ARROW); + StartVerticalScrollIndicators(BOTTOM_ARROW); if (gUnknown_02039248.unk2 > gUnknown_02039248.unk3 && gUnknown_02039248.unk1 + gUnknown_02039248.unk3 != gUnknown_02039248.unk2) { - sub_80F979C(1, 0); + SetVerticalScrollIndicators(BOTTOM_ARROW, VISIBLE); } - BasicInitMenuWindow(&gWindowConfig_81E6E50); - MenuZeroFillWindowRect(7, 6, 13, 11); - MenuZeroFillWindowRect(0, 14, 29, 19); + BasicInitMenuWindow(&gWindowTemplate_81E6E50); + Menu_EraseWindowRect(7, 6, 13, 11); + Menu_EraseWindowRect(0, 14, 29, 19); gTasks[taskId].func = sub_810BF7C; } @@ -922,18 +938,18 @@ static void sub_810C6DC(u8 taskId) static void sub_810C704(u8 taskId) { - BasicInitMenuWindow(&gWindowConfig_81E6E34); + BasicInitMenuWindow(&gWindowTemplate_81E6E34); sub_810BC84(gUnknown_02039248.unk1); - sub_80F979C(1, 1); + SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE); gTasks[taskId].func = sub_810C6DC; } static void sub_810C748(u8 taskId) { - StartVerticalScrollIndicators(0); - StartVerticalScrollIndicators(1); - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(7, 4, 13, 11); + StartVerticalScrollIndicators(TOP_ARROW); + StartVerticalScrollIndicators(BOTTOM_ARROW); + Menu_DestroyCursor(); + Menu_EraseWindowRect(7, 4, 13, 11); gTasks[taskId].func = sub_810BF7C; } diff --git a/src/field/pokedex_area_screen.c b/src/field/pokedex_area_screen.c new file mode 100644 index 000000000..67ca276c4 --- /dev/null +++ b/src/field/pokedex_area_screen.c @@ -0,0 +1,20 @@ + +// Includes +#include "global.h" + +// Static type declarations + +// Static RAM declarations + +EWRAM_DATA u16 gUnknown_02039260 = 0; +EWRAM_DATA u16 gUnknown_02039262 = 0; +EWRAM_DATA u16 gUnknown_02039264 = 0; +EWRAM_DATA u16 gUnknown_02039266 = 0; +EWRAM_DATA u16 gUnknown_02039268 = 0; +EWRAM_DATA u16 gUnknown_0203926A = 0; + +// Static ROM declarations + +// .rodata + +// .text diff --git a/src/field/pokenav.c b/src/field/pokenav.c new file mode 100644 index 000000000..f57a98df6 --- /dev/null +++ b/src/field/pokenav.c @@ -0,0 +1,16 @@ + +// Includes +#include "global.h" + +// Static type declarations + +// Static RAM declarations + +EWRAM_DATA u8 gUnknown_020388B0[4] = {}; +EWRAM_DATA u16 gUnknown_020388B4 = 0; + +// Static ROM declarations + +// .rodata + +// .text diff --git a/src/field/region_map.c b/src/field/region_map.c index 07e77e389..7bfda1a81 100644 --- a/src/field/region_map.c +++ b/src/field/region_map.c @@ -280,7 +280,7 @@ static u16 sub_80FB9C0(u16); static void sub_80FBA18(void); static bool8 sub_80FBAA0(u16); void CreateRegionMapCursor(u16, u16); -static void sub_80FBCA0(void); +void sub_80FBCA0(void); static void sub_80FBDF8(void); static void sub_80FBE24(void); static void SpriteCB_PlayerIconZoomedOut(struct Sprite *); @@ -288,8 +288,8 @@ static void UpdateIconBlink(struct Sprite *); static void SpriteCB_PlayerIconZoomedIn(struct Sprite *); const u8 *GetMapSectionName(u8 *, u16, u16); static void VBlankCB_FlyRegionMap(void); -static void CB2_FlyRegionMap(void); -static void sub_80FC244(void (*func)(void)); +void CB2_FlyRegionMap(void); +void sub_80FC244(void (*func)(void)); static void PrintFlyTargetName(void); static void CreateFlyTargetGraphics(void); static void CreateCityTownFlyTargetIcons(void); @@ -297,7 +297,7 @@ static void CreateSpecialAreaFlyTargetIcons(void); static void SpriteCB_FlyTargetIcons(struct Sprite *); static void sub_80FC5B4(void); static void sub_80FC600(void); -static void sub_80FC69C(void); +void sub_80FC69C(void); void InitRegionMap(struct RegionMap *regionMap, bool8 zoomed) { @@ -1127,7 +1127,7 @@ void CreateRegionMapCursor(u16 tileTag, u16 paletteTag) } } -static void sub_80FBCA0(void) +void sub_80FBCA0(void) { if (gRegionMap->cursorSprite != NULL) { @@ -1420,7 +1420,7 @@ struct UnknownStruct4 static const u8 *const sEverGrandeCityAreaNames[] = {OtherText_PokeLeague, OtherText_PokeCenter}; -static const struct UnknownStruct4 sUnknown_083E79C0[1] = +const struct UnknownStruct4 gUnknown_083E79C0[1] = { {sEverGrandeCityAreaNames, MAPSEC_EVER_GRANDE_CITY, FLAG_SYS_POKEMON_LEAGUE_FLY}, }; @@ -1540,11 +1540,11 @@ void CB2_InitFlyRegionMap(void) FreeAllSpritePalettes(); break; case 1: - SetUpWindowConfig(&gWindowConfig_81E7224); + Text_LoadWindowTemplate(&gWindowTemplate_81E7224); break; case 2: - InitMenuWindow(&gWindowConfig_81E7224); - MenuZeroFillScreen(); + InitMenuWindow(&gWindowTemplate_81E7224); + Menu_EraseScreen(); break; case 3: InitRegionMap(&ewram0_3.regionMap, 0); @@ -1562,7 +1562,7 @@ void CB2_InitFlyRegionMap(void) break; case 6: LoadPalette(sFlyRegionMapFrame_Pal, 16, 32); - MenuPrint_PixelCoords(gOtherText_FlyToWhere, 1, 0x90, 1); + Menu_PrintTextPixelCoords(gOtherText_FlyToWhere, 1, 0x90, 1); break; case 7: CreateFlyTargetGraphics(); @@ -1591,14 +1591,14 @@ static void VBlankCB_FlyRegionMap(void) TransferPlttBuffer(); } -static void CB2_FlyRegionMap(void) +void CB2_FlyRegionMap(void) { ewram0_3.unk0(); AnimateSprites(); BuildOamBuffer(); } -static void sub_80FC244(void (*func)(void)) +void sub_80FC244(void (*func)(void)) { ewram0_3.unk0 = func; ewram0_3.unk4 = 0; @@ -1608,39 +1608,38 @@ static void PrintFlyTargetName(void) { if (ewram0_3.regionMap.unk16 == 2 || ewram0_3.regionMap.unk16 == 4) { - u16 i = 0; - int zero; + u16 i; + bool32 drawFrameDisabled = FALSE; - for (i = 0; i < ARRAY_COUNT(sUnknown_083E79C0); i++) + for (i = 0; i < ARRAY_COUNT(gUnknown_083E79C0); i++) { - const struct UnknownStruct4 *r4 = &sUnknown_083E79C0[i]; + const struct UnknownStruct4 *r4 = &gUnknown_083E79C0[i]; if (ewram0_3.regionMap.mapSectionId == r4->mapSectionId) { if (FlagGet(r4->flag)) { - MenuDrawTextWindow(16, 14, 29, 19); - MenuPrint(ewram0_3.regionMap.mapSectionName, 17, 15); + Menu_DrawStdWindowFrame(16, 14, 29, 19); + Menu_PrintText(ewram0_3.regionMap.mapSectionName, 17, 15); MenuPrint_RightAligned(r4->unk0[ewram0_3.regionMap.everGrandeCityArea], 29, 17); return; } break; } } - // This check is always true, but somehow the compiler still performed it. - asm("mov %0, #0\n":"=r"(zero)); // zero = 0 - if (zero == 0) + + if (!drawFrameDisabled) { - MenuDrawTextWindow(16, 16, 29, 19); - MenuPrint(ewram0_3.regionMap.mapSectionName, 17, 17); - MenuZeroFillWindowRect(16, 14, 29, 15); + Menu_DrawStdWindowFrame(16, 16, 29, 19); + Menu_PrintText(ewram0_3.regionMap.mapSectionName, 17, 17); + Menu_EraseWindowRect(16, 14, 29, 15); } } else { - MenuDrawTextWindow(16, 16, 29, 19); - MenuPrint(ewramBlankMapName, 17, 17); - MenuZeroFillWindowRect(16, 14, 29, 15); + Menu_DrawStdWindowFrame(16, 16, 29, 19); + Menu_PrintText(ewramBlankMapName, 17, 17); + Menu_EraseWindowRect(16, 14, 29, 15); } } @@ -1796,7 +1795,7 @@ static void sub_80FC600(void) } } -static void sub_80FC69C(void) +void sub_80FC69C(void) { switch (ewram0_3.unk4) { diff --git a/src/field/roamer.c b/src/field/roamer.c index 2eb26ef9d..6ed5b6c89 100644 --- a/src/field/roamer.c +++ b/src/field/roamer.c @@ -1,7 +1,9 @@ #include "global.h" +#include "debug.h" #include "roamer.h" #include "pokemon.h" #include "random.h" +#include "region_map.h" #include "constants/species.h" #ifdef SAPPHIRE @@ -224,3 +226,20 @@ void GetRoamerLocation(u8 *mapGroup, u8 *mapNum) *mapGroup = sRoamerLocation[MAP_GRP]; *mapNum = sRoamerLocation[MAP_NUM]; } + +#if DEBUG +void debug_sub_814A714(void) +{ + if (gSaveBlock1.location.mapGroup == 0) + { + CreateInitialRoamerMon(); + sRoamerLocation[0] = 0; + sRoamerLocation[1] = gSaveBlock1.location.mapNum; + } +} + +void debug_sub_814A73C(u8* str) +{ + GetMapSectionName(str, sRoamerLocation[1], 0); +} +#endif diff --git a/src/field/safari_zone.c b/src/field/safari_zone.c index e9ca3a9f9..f371b08b3 100644 --- a/src/field/safari_zone.c +++ b/src/field/safari_zone.c @@ -26,7 +26,7 @@ static void DecrementFeederStepCounters(void); extern u8 gBattleOutcome; EWRAM_DATA u8 gNumSafariBalls = 0; -EWRAM_DATA static u16 gSafariZoneStepCounter = 0; +EWRAM_DATA u16 gSafariZoneStepCounter = 0; EWRAM_DATA static struct PokeblockFeeder gPokeblockFeeders[NUM_POKEBLOCK_FEEDERS] = {0}; extern void (*gFieldCallback)(void); @@ -56,7 +56,7 @@ void ResetSafariZoneFlag(void) void EnterSafariMode(void) { - IncrementGameStat(0x11); + IncrementGameStat(GAME_STAT_ENTERED_SAFARI_ZONE); SetSafariZoneFlag(); ClearAllPokeblockFeeders(); gNumSafariBalls = 30; diff --git a/src/field/scrcmd.c b/src/field/scrcmd.c index 05a909e81..bc5cd0b1d 100644 --- a/src/field/scrcmd.c +++ b/src/field/scrcmd.c @@ -626,7 +626,7 @@ bool8 IsPaletteNotActive(void) bool8 ScrCmd_fadescreen(struct ScriptContext *ctx) { - fade_screen(ScriptReadByte(ctx), 0); + FadeScreen(ScriptReadByte(ctx), 0); SetupNativeScript(ctx, IsPaletteNotActive); return TRUE; } @@ -636,7 +636,7 @@ bool8 ScrCmd_fadescreenspeed(struct ScriptContext *ctx) u8 duration = ScriptReadByte(ctx); u8 delay = ScriptReadByte(ctx); - fade_screen(duration, delay); + FadeScreen(duration, delay); SetupNativeScript(ctx, IsPaletteNotActive); return TRUE; } @@ -1333,7 +1333,7 @@ bool8 ScrCmd_drawbox(struct ScriptContext *ctx) u8 right = ScriptReadByte(ctx); u8 bottom = ScriptReadByte(ctx); - MenuDrawTextWindow(left, top, right, bottom); + Menu_DrawStdWindowFrame(left, top, right, bottom); return FALSE; } @@ -1363,7 +1363,7 @@ bool8 ScrCmd_erasebox(struct ScriptContext *ctx) u8 right = ScriptReadByte(ctx); u8 bottom = ScriptReadByte(ctx); - MenuZeroFillWindowRect(left, top, right, bottom); + Menu_EraseWindowRect(left, top, right, bottom); return FALSE; } @@ -1428,8 +1428,8 @@ bool8 ScrCmd_braillemessage(struct ScriptContext *ctx) u8 v6 = ptr[4]; u8 v7 = ptr[5]; StringBraille(gStringVar4, ptr + 6); - MenuDrawTextWindow(v2, v3, v4, v5); - MenuPrint(gStringVar4, v6, v7); + Menu_DrawStdWindowFrame(v2, v3, v4, v5); + Menu_PrintText(gStringVar4, v6, v7); return FALSE; } @@ -1755,7 +1755,7 @@ bool8 ScrCmd_pokemart(struct ScriptContext *ctx) { void *ptr = (void *)ScriptReadWord(ctx); - CreatePokemartMenu(ptr); + Shop_CreatePokemartMenu(ptr); ScriptContext1_Stop(); return TRUE; } @@ -1764,7 +1764,7 @@ bool8 ScrCmd_pokemartdecoration(struct ScriptContext *ctx) { void *ptr = (void *)ScriptReadWord(ctx); - CreateDecorationShop1Menu(ptr); + Shop_CreateDecorationShop1Menu(ptr); ScriptContext1_Stop(); return TRUE; } @@ -1773,7 +1773,7 @@ bool8 ScrCmd_pokemartdecoration2(struct ScriptContext *ctx) { void *ptr = (void *)ScriptReadWord(ctx); - CreateDecorationShop2Menu(ptr); + Shop_CreateDecorationShop2Menu(ptr); ScriptContext1_Stop(); return TRUE; } diff --git a/src/field/script_menu.c b/src/field/script_menu.c index 9f3ab75cc..9d901a03c 100644 --- a/src/field/script_menu.c +++ b/src/field/script_menu.c @@ -622,7 +622,7 @@ bool8 ScriptMenu_MultichoiceWithDefault(u8 left, u8 top, u8 multichoiceId, u8 ig static u16 GetStringWidthInTilesForScriptMenu(const u8 *str) { // each tile on screen is 8x8, so it needs the number of tiles and not pixels, hence the division by 8. - return (GetStringWidthGivenWindowConfig((struct WindowConfig *)&gWindowConfig_81E6CE4, str) + 7) / 8; + return (Text_GetStringWidthFromWindowTemplate((struct WindowTemplate *)&gWindowTemplate_81E6CE4, str) + 7) / 8; } static void DrawMultichoiceMenu(u8 left, u8 top, u8 count, const struct MenuAction *list, u8 ignoreBPress, u8 cursorPos) @@ -651,8 +651,8 @@ static void DrawMultichoiceMenu(u8 left, u8 top, u8 count, const struct MenuActi bottom = top + (2 * count + 1); - MenuDrawTextWindow(left, top, right, bottom); - PrintMenuItems(left + 1, top + 1, count, list); + Menu_DrawStdWindowFrame(left, top, right, bottom); + Menu_PrintItems(left + 1, top + 1, count, list); InitMenu(0, left + 1, top + 1, count, cursorPos, right - left - 1); StartScriptMenuTask(left, top, right, bottom, ignoreBPress, count); } @@ -687,9 +687,9 @@ static void Task_HandleMultichoiceInput(u8 taskId) if (!gPaletteFade.active) { if (!gTasks[taskId].tDoWrap) - selection = ProcessMenuInputNoWrap(); + selection = Menu_ProcessInputNoWrap(); else - selection = ProcessMenuInput(); + selection = Menu_ProcessInput(); if (selection != -2) { @@ -704,8 +704,8 @@ static void Task_HandleMultichoiceInput(u8 taskId) { gSpecialVar_Result = selection; } - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(gTasks[taskId].tLeft, gTasks[taskId].tTop, gTasks[taskId].tRight, gTasks[taskId].tBottom); + Menu_DestroyCursor(); + Menu_EraseWindowRect(gTasks[taskId].tLeft, gTasks[taskId].tTop, gTasks[taskId].tRight, gTasks[taskId].tBottom); DestroyTask(taskId); EnableBothScriptContexts(); } @@ -745,7 +745,7 @@ static void sub_80B53B4(u8 left, u8 top, u8 count, const struct MenuAction *list right = (right + left) + 2; bottom = top + (2 * count + 1); - PrintMenuItems(left, top, count, list); + Menu_PrintItems(left, top, count, list); InitMenu(0, left, top, count, 0, right - left - 1); StartScriptMenuTask(left, top, right, bottom, ignoreBPress, count); } @@ -788,7 +788,7 @@ static void Task_HandleYesNoInput(u8 taskId) return; } - switch (ProcessMenuInputNoWrap()) + switch (Menu_ProcessInputNoWrap()) { case -2: return; @@ -805,7 +805,7 @@ static void Task_HandleYesNoInput(u8 taskId) left = gTasks[taskId].tLeft; top = gTasks[taskId].tTop; - MenuZeroFillWindowRect(left, top, left + 6, top + 5); + Menu_EraseWindowRect(left, top, left + 6, top + 5); DestroyTask(taskId); EnableBothScriptContexts(); } @@ -839,7 +839,7 @@ bool8 ScriptMenu_MultichoiceGrid(u8 left, u8 top, u8 multichoiceId, u8 ignoreBPr bottom = (2 * (gMultichoiceLists[multichoiceId].count / columnCount)) + 3 + top; } - width = sub_807288C(columnCount); + width = Menu_GetColumnXCoord(columnCount); gTasks[taskId].tLeft = left; gTasks[taskId].tTop = top; gTasks[taskId].tRight = width + left + 2; @@ -851,7 +851,7 @@ bool8 ScriptMenu_MultichoiceGrid(u8 left, u8 top, u8 multichoiceId, u8 ignoreBPr static void Task_HandleMultichoiceGridInput(u8 taskId) { - s8 selection = sub_80727CC(); + s8 selection = Menu_ProcessInputGridLayout(); if (selection != -2) { @@ -866,8 +866,8 @@ static void Task_HandleMultichoiceGridInput(u8 taskId) { gSpecialVar_Result = selection; } - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(gTasks[taskId].tLeft, gTasks[taskId].tTop, gTasks[taskId].tRight, gTasks[taskId].tBottom); + Menu_DestroyCursor(); + Menu_EraseWindowRect(gTasks[taskId].tLeft, gTasks[taskId].tTop, gTasks[taskId].tRight, gTasks[taskId].tBottom); DestroyTask(taskId); EnableBothScriptContexts(); } @@ -909,23 +909,23 @@ void ScriptMenu_CreatePCMenu(void) if (FlagGet(FLAG_SYS_GAME_CLEAR)) // player has cleared game? { numChoices = 4; - MenuDrawTextWindow(0, 0, width + 2, 9); - MenuPrint(gPCText_HallOfFame, 1, 5); - MenuPrint(gPCText_LogOff, 1, 7); + Menu_DrawStdWindowFrame(0, 0, width + 2, 9); + Menu_PrintText(gPCText_HallOfFame, 1, 5); + Menu_PrintText(gPCText_LogOff, 1, 7); } else { numChoices = 3; - MenuDrawTextWindow(0, 0, width + 2, 7); - MenuPrint(gPCText_LogOff, 1, 5); + Menu_DrawStdWindowFrame(0, 0, width + 2, 7); + Menu_PrintText(gPCText_LogOff, 1, 5); } if (FlagGet(FLAG_SYS_PC_LANETTE)) // player met lanette? - MenuPrint(gPCText_LanettesPC, 1, 1); + Menu_PrintText(gPCText_LanettesPC, 1, 1); else - MenuPrint(gPCText_SomeonesPC, 1, 1); + Menu_PrintText(gPCText_SomeonesPC, 1, 1); - MenuPrint(gPCText_PlayersPC, 1, 3); + Menu_PrintText(gPCText_PlayersPC, 1, 3); InitMenu(0, 1, 1, numChoices, 0, width + 1); StartScriptMenuTask(0, 0, width + 2, 2 * numChoices + 1, 0, numChoices); } @@ -1008,15 +1008,15 @@ _080B57B4:\n\ movs r0, 0\n\ movs r1, 0\n\ movs r3, 0x9\n\ - bl MenuDrawTextWindow\n\ + bl Menu_DrawStdWindowFrame\n\ ldr r0, _080B57F8 @ =gPCText_HallOfFame\n\ movs r1, 0x1\n\ movs r2, 0x5\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ ldr r0, _080B57F0 @ =gPCText_LogOff\n\ movs r1, 0x1\n\ movs r2, 0x7\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ b _080B5818\n\ .align 2, 0\n\ _080B57E8: .4byte gPCText_SomeonesPC\n\ @@ -1032,11 +1032,11 @@ _080B57FC:\n\ movs r0, 0\n\ movs r1, 0\n\ movs r3, 0x7\n\ - bl MenuDrawTextWindow\n\ + bl Menu_DrawStdWindowFrame\n\ ldr r0, _080B5834 @ =gPCText_LogOff\n\ movs r1, 0x1\n\ movs r2, 0x5\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ _080B5818:\n\ adds r6, r4, 0\n\ ldr r0, _080B5838 @ =0x0000084b\n\ @@ -1047,7 +1047,7 @@ _080B5818:\n\ ldr r0, _080B583C @ =gPCText_LanettesPC\n\ movs r1, 0x1\n\ movs r2, 0x1\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ b _080B584A\n\ .align 2, 0\n\ _080B5834: .4byte gPCText_LogOff\n\ @@ -1057,12 +1057,12 @@ _080B5840:\n\ ldr r0, _080B5888 @ =gPCText_SomeonesPC\n\ movs r1, 0x1\n\ movs r2, 0x1\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ _080B584A:\n\ ldr r0, _080B588C @ =gPCText_PlayersPC\n\ movs r1, 0x1\n\ movs r2, 0x3\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ movs r4, 0\n\ str r4, [sp]\n\ adds r0, r5, 0x1\n\ @@ -1096,8 +1096,8 @@ _080B588C: .4byte gPCText_PlayersPC\n\ void ScriptMenu_DisplayPCStartupPrompt(void) { - MenuDisplayMessageBox(); - MenuPrint(gPCText_WhichPCShouldBeAccessed, 2, 15); + Menu_DisplayDialogueFrame(); + Menu_PrintText(gPCText_WhichPCShouldBeAccessed, 2, 15); } #define tState data[0] @@ -1122,7 +1122,7 @@ static void Task_PokemonPicWindow(u8 taskId) task->tState++; break; case 3: - MenuZeroFillWindowRect(task->tWindowX, task->tWindowY, task->tWindowX + 9, task->tWindowY + 10); + Menu_EraseWindowRect(task->tWindowX, task->tWindowY, task->tWindowX + 9, task->tWindowY + 10); DestroyTask(taskId); break; } @@ -1139,7 +1139,7 @@ bool8 ScriptMenu_ShowPokemonPic(u16 species, u8 x, u8 y) } else { - MenuDrawTextWindow(x, y, x + 9, y + 10); + Menu_DrawStdWindowFrame(x, y, x + 9, y + 10); taskId = CreateTask(Task_PokemonPicWindow, 0x50); gTasks[taskId].tState = 0; gTasks[taskId].tMonSpecies = species; diff --git a/src/field/secret_base.c b/src/field/secret_base.c index 2e4138a3b..8b67a2cd9 100644 --- a/src/field/secret_base.c +++ b/src/field/secret_base.c @@ -51,7 +51,7 @@ static void Task_SecretBasePC_Registry(u8 taskId); extern u8 gUnknown_0815F399[]; extern u8 gUnknown_0815F49A[]; -extern u8 gUnknown_020387DC; +EWRAM_DATA u8 gUnknown_020387DC = 0; const struct { @@ -348,7 +348,7 @@ void sub_80BBA48(u8 taskid) void sub_80BBAF0(void) { CreateTask(sub_80BBA48, 0); - fade_screen(1, 0); + FadeScreen(1, 0); saved_warp2_set(0, gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1); } @@ -362,7 +362,7 @@ bool8 sub_80BBB24(void) void sub_80BBB50(u8 taskid) { FieldObjectTurn(&(gMapObjects[gPlayerAvatar.mapObjectId]), 2); - if (sub_807D770() == 1) { + if (IsWeatherNotFadingIn() == 1) { EnableBothScriptContexts(); DestroyTask(taskid); } @@ -397,7 +397,7 @@ void sub_80BBC78(void) { u8 taskid = CreateTask(sub_80BBBEC, 0); gTasks[taskid].data[0] = 0; - fade_screen(1, 0); + FadeScreen(1, 0); } bool8 CurrentMapIsSecretBase(void) @@ -534,7 +534,7 @@ void sub_80BC074(u8 taskid) void sub_80BC0F8(void) { CreateTask(sub_80BC074, 0); - fade_screen(1, 0); + FadeScreen(1, 0); } void sub_80BC114(void) { @@ -895,7 +895,7 @@ void Task_SecretBasePC_Registry(u8 taskId) s16 *taskData; ScriptContext2_Enable(); - sub_80F944C(); + ClearVerticalScrollIndicatorPalettes(); LoadScrollIndicatorPalette(); taskData = gTasks[taskId].data; @@ -913,7 +913,7 @@ void Task_SecretBasePC_Registry(u8 taskId) taskData[1] = 0; taskData[2] = 0; - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_EraseWindowRect(0, 0, 29, 19); sub_80BC7D8(taskId); gTasks[taskId].func = sub_80BC824; @@ -948,8 +948,8 @@ void sub_80BC6B0(u8 taskId) if (sub_80BC268(i) == TRUE) { sub_80BC190(gStringVar1, i); - MenuFillWindowRectWithBlankTile(18, 2 * n + 2, 28, 2 * n + 3); - MenuPrint(gStringVar1, 18, 2 * n + 2); + Menu_BlankWindowRect(18, 2 * n + 2, 28, 2 * n + 3); + Menu_PrintText(gStringVar1, 18, 2 * n + 2); if (++n == 8) break; } @@ -957,25 +957,25 @@ void sub_80BC6B0(u8 taskId) if (n < 8) { - MenuFillWindowRectWithBlankTile(18, 2 * n + 2, 28, 2 * n + 3); - MenuPrint(gUnknownText_Exit, 18, 2 * n + 2); - DestroyVerticalScrollIndicator(1); + Menu_BlankWindowRect(18, 2 * n + 2, 28, 2 * n + 3); + Menu_PrintText(gUnknownText_Exit, 18, 2 * n + 2); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); if (n != 7) - MenuFillWindowRectWithBlankTile(18, ((n << 25) + (1 << 26)) >> 24, 28, 18); // the shifts are needed to match + Menu_BlankWindowRect(18, ((n << 25) + (1 << 26)) >> 24, 28, 18); // the shifts are needed to match } else - CreateVerticalScrollIndicators(1, 0xbc, 0x98); + CreateVerticalScrollIndicators(BOTTOM_ARROW, 0xbc, 0x98); if (taskData[2] == 0) - DestroyVerticalScrollIndicator(0); + DestroyVerticalScrollIndicator(TOP_ARROW); else - CreateVerticalScrollIndicators(0, 0xbc, 0x08); + CreateVerticalScrollIndicators(TOP_ARROW, 0xbc, 0x08); } void sub_80BC7D8(u8 taskId) { u16 *taskData = gTasks[taskId].data; - MenuDrawTextWindow(17, 0, 29, 19); + Menu_DrawStdWindowFrame(17, 0, 29, 19); InitMenu(0, 18, 2, taskData[3] + 1, taskData[1], 11); sub_80BC6B0(taskId); @@ -990,7 +990,7 @@ void sub_80BC824(u8 taskId) if (taskData[1]) { PlaySE(5); - taskData[1] = MoveMenuCursor(-1); + taskData[1] = Menu_MoveCursor(-1); } else if (taskData[2]) { @@ -1013,7 +1013,7 @@ void sub_80BC824(u8 taskId) else { PlaySE(5); - taskData[1] = MoveMenuCursor(1); + taskData[1] = Menu_MoveCursor(1); } } else if (gMain.newKeys & A_BUTTON) @@ -1021,13 +1021,13 @@ void sub_80BC824(u8 taskId) PlaySE(5); if (taskData[1] + taskData[2] == taskData[0]) { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 29, 19); sub_80BCC54(taskId); } else { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); taskData[4] = sub_80BC948(taskData[1] + taskData[2]); sub_80BC980(taskId); } @@ -1035,8 +1035,8 @@ void sub_80BC824(u8 taskId) else if (gMain.newKeys & B_BUTTON) { PlaySE(5); - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 29, 19); sub_80BCC54(taskId); } } @@ -1064,10 +1064,10 @@ u8 sub_80BC948(u8 a) void sub_80BC980(u8 taskId) { - PauseVerticalScrollIndicator(0); - PauseVerticalScrollIndicator(1); - MenuDrawTextWindow(1, 0, 12, 5); - PrintMenuItems(2, 1, 2, (const struct MenuAction *)gUnknown_083D13D4); + PauseVerticalScrollIndicator(TOP_ARROW); + PauseVerticalScrollIndicator(BOTTOM_ARROW); + Menu_DrawStdWindowFrame(1, 0, 12, 5); + Menu_PrintItems(2, 1, 2, (const struct MenuAction *)gUnknown_083D13D4); InitMenu(0, 2, 1, 2, 0, 10); gTasks[taskId].func = sub_80BC9E4; } @@ -1076,24 +1076,24 @@ void sub_80BC9E4(u8 taskId) { if (gMain.newAndRepeatedKeys & DPAD_UP) { - if (GetMenuCursorPos()) + if (Menu_GetCursorPos()) { PlaySE(5); - MoveMenuCursor(-1); + Menu_MoveCursor(-1); } } else if (gMain.newAndRepeatedKeys & DPAD_DOWN) { - if (GetMenuCursorPos() != 1) + if (Menu_GetCursorPos() != 1) { PlaySE(5); - MoveMenuCursor(1); + Menu_MoveCursor(1); } } else if (gMain.newKeys & A_BUTTON) { PlaySE(5); - gUnknown_083D13D4[GetMenuCursorPos()].func(taskId); + gUnknown_083D13D4[Menu_GetCursorPos()].func(taskId); } else if (gMain.newKeys & B_BUTTON) { @@ -1106,10 +1106,10 @@ void sub_80BCA84(u8 taskId) { s16 *taskData = gTasks[taskId].data; - DestroyVerticalScrollIndicator(0); - DestroyVerticalScrollIndicator(1); - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 29, 19); + DestroyVerticalScrollIndicator(TOP_ARROW); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 29, 19); sub_80BC190(gStringVar1, taskData[4]); StringExpandPlaceholders(gStringVar4, gOtherText_OkayToDeleteFromRegistry); @@ -1126,7 +1126,7 @@ void sub_80BCB10(u8 taskId) { s16 *taskData = gTasks[taskId].data; - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_EraseWindowRect(0, 0, 29, 19); gSaveBlock1.secretBases[taskData[4]].sbr_field_1_6 = 0; taskData[0]--; @@ -1147,13 +1147,13 @@ void sub_80BCB10(u8 taskId) void sub_80BCB90(u8 taskId) { - MenuZeroFillWindowRect(20, 8, 26, 13); + Menu_EraseWindowRect(20, 8, 26, 13); DisplayItemMessageOnField(taskId, gOtherText_RegisteredDataDeleted, sub_80BCB10, 0); } void sub_80BCBC0(u8 taskId) { - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_EraseWindowRect(0, 0, 29, 19); sub_80BC7D8(taskId); gTasks[taskId].func = sub_80BC824; @@ -1164,9 +1164,9 @@ void sub_80BCBF8(u8 taskId) s16 *taskData = gTasks[taskId].data; InitMenu(0, 18, 2, taskData[3] + 1, taskData[1], 11); - MenuZeroFillWindowRect(1, 0, 12, 5); - StartVerticalScrollIndicators(0); - StartVerticalScrollIndicators(1); + Menu_EraseWindowRect(1, 0, 12, 5); + StartVerticalScrollIndicators(TOP_ARROW); + StartVerticalScrollIndicators(BOTTOM_ARROW); gTasks[taskId].func = sub_80BC824; } @@ -1176,8 +1176,8 @@ void sub_80BCC54(u8 taskId) u16 curBaseIndex = VarGet(VAR_CURRENT_SECRET_BASE); BuyMenuFreeMemory(); - DestroyVerticalScrollIndicator(0); - DestroyVerticalScrollIndicator(1); + DestroyVerticalScrollIndicator(TOP_ARROW); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); if (curBaseIndex == 0) { @@ -1648,6 +1648,178 @@ void sub_80BD610(struct SecretBaseRecord *basesA, struct SecretBaseRecord *bases sub_80BD328(basesC, 0); } +#if DEBUG +__attribute__((naked)) +void sub_80BD674(void *playerRecords, u32 size, u8 c) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + add r6, r0, #0\n\ + add r5, r1, #0\n\ + lsl r2, r2, #0x18\n\ + lsr r7, r2, #0x18\n\ + ldr r0, ._503 @ gUnknown_020297ED\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + bne ._498 @cond_branch\n\ + mov r0, #0x60\n\ + bl FlagGet\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._498 @cond_branch\n\ + b ._520\n\ +._498:\n\ + bl GetLinkPlayerCount\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x2\n\ + beq ._500 @cond_branch\n\ + cmp r0, #0x3\n\ + beq ._501 @cond_branch\n\ + b ._505\n\ +._504:\n\ + .align 2, 0\n\ +._503:\n\ + .word gUnknown_020297ED\n\ +._500:\n\ + lsl r4, r5, #0x1\n\ + add r0, r6, r4\n\ + mov r1, #0x0\n\ + add r2, r5, #0\n\ + bl memset\n\ + add r4, r4, r5\n\ + add r4, r6, r4\n\ + add r0, r4, #0\n\ + mov r1, #0x0\n\ + add r2, r5, #0\n\ + bl memset\n\ + b ._505\n\ +._501:\n\ + lsl r0, r5, #0x1\n\ + add r0, r0, r5\n\ + add r0, r6, r0\n\ + mov r1, #0x0\n\ + add r2, r5, #0\n\ + bl memset\n\ +._505:\n\ + cmp r7, #0x1\n\ + beq ._506 @cond_branch\n\ + cmp r7, #0x1\n\ + bgt ._507 @cond_branch\n\ + cmp r7, #0\n\ + beq ._508 @cond_branch\n\ + b ._515\n\ +._507:\n\ + cmp r7, #0x2\n\ + beq ._510 @cond_branch\n\ + cmp r7, #0x3\n\ + beq ._511 @cond_branch\n\ + b ._515\n\ +._508:\n\ + add r0, r6, r5\n\ + lsl r2, r5, #0x1\n\ + add r1, r6, r2\n\ + add r2, r2, r5\n\ + add r2, r6, r2\n\ + bl sub_80BD610\n\ + b ._515\n\ +._506:\n\ + lsl r1, r5, #0x1\n\ + add r0, r6, r1\n\ + add r1, r1, r5\n\ + add r1, r6, r1\n\ + add r2, r6, #0\n\ + bl sub_80BD610\n\ + b ._515\n\ +._510:\n\ + lsl r0, r5, #0x1\n\ + add r0, r0, r5\n\ + add r0, r6, r0\n\ + add r2, r6, r5\n\ + add r1, r6, #0\n\ + bl sub_80BD610\n\ + b ._515\n\ +._511:\n\ + add r1, r6, r5\n\ + lsl r2, r5, #0x1\n\ + add r2, r6, r2\n\ + add r0, r6, #0\n\ + bl sub_80BD610\n\ +._515:\n\ + mov r3, #0x1\n\ + ldr r6, ._521 @ gSaveBlock1\n\ + mov r5, #0x10\n\ + neg r5, r5\n\ + ldr r4, ._521 + 4 @ 0x1a09\n\ +._517:\n\ + lsl r0, r3, #0x2\n\ + add r0, r0, r3\n\ + lsl r0, r0, #0x5\n\ + add r0, r0, r6\n\ + add r2, r0, r4\n\ + ldrb r1, [r2]\n\ + lsl r0, r1, #0x1c\n\ + lsr r0, r0, #0x1c\n\ + cmp r0, #0x1\n\ + bne ._516 @cond_branch\n\ + mov r0, #0x3f\n\ + and r0, r0, r1\n\ + mov r1, #0x40\n\ + orr r0, r0, r1\n\ + and r0, r0, r5\n\ + strb r0, [r2]\n\ +._516:\n\ + add r0, r3, #1\n\ + lsl r0, r0, #0x10\n\ + lsr r3, r0, #0x10\n\ + cmp r3, #0x13\n\ + bls ._517 @cond_branch\n\ + bl sub_80BD280\n\ + mov r3, #0x1\n\ + ldr r4, ._521 @ gSaveBlock1\n\ + ldr r6, ._521 + 4 @ 0x1a09\n\ + add r7, r4, #0\n\ + mov r5, #0x3f\n\ +._519:\n\ + lsl r0, r3, #0x2\n\ + add r0, r0, r3\n\ + lsl r0, r0, #0x5\n\ + add r0, r0, r4\n\ + add r2, r0, r6\n\ + ldrb r1, [r2]\n\ + lsr r0, r1, #0x6\n\ + cmp r0, #0x2\n\ + bne ._518 @cond_branch\n\ + add r0, r5, #0\n\ + and r0, r0, r1\n\ + strb r0, [r2]\n\ +._518:\n\ + add r0, r3, #1\n\ + lsl r0, r0, #0x10\n\ + lsr r3, r0, #0x10\n\ + cmp r3, #0x13\n\ + bls ._519 @cond_branch\n\ + ldr r0, ._521 + 8 @ 0x1a16\n\ + add r2, r7, r0\n\ + ldrh r1, [r2]\n\ + ldr r0, ._521 + 12 @ 0xffff\n\ + cmp r1, r0\n\ + beq ._520 @cond_branch\n\ + add r0, r1, #1\n\ + strh r0, [r2]\n\ +._520:\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._522:\n\ + .align 2, 0\n\ +._521:\n\ + .word gSaveBlock1\n\ + .word 0x1a09\n\ + .word 0x1a16\n\ + .word 0xffff"); +} +#else void sub_80BD674(void *playerRecords, u32 size, u8 c) { if (FlagGet(FLAG_RECEIVED_SECRET_POWER)) @@ -1706,3 +1878,4 @@ void sub_80BD674(void *playerRecords, u32 size, u8 c) } } } +#endif diff --git a/src/field/shop.c b/src/field/shop.c index 23d668fc7..fdee31178 100644 --- a/src/field/shop.c +++ b/src/field/shop.c @@ -15,7 +15,7 @@ #include "strings.h" #include "task.h" #include "tv.h" -#include "unknown_task.h" +#include "scanline_effect.h" #include "field_map_obj.h" #include "field_player_avatar.h" #include "fieldmap.h" @@ -28,54 +28,66 @@ #include "field_camera.h" #include "ewram.h" -extern bool8 sub_80A52C4(u8, u8); +extern bool8 SellMenu_QuantityRoller(u8, u8); extern u8 gBuyMenuFrame_Gfx[]; extern u16 gBuyMenuFrame_Tilemap[]; extern u16 gMenuMoneyPal[16]; -void sub_80B39D0(int var1, int var2, bool32 hasControlCode); -void sub_80B3A70(void); -void sub_80B4378(u8); -void sub_80B43F0(u8); -void Task_ExitBuyMenu(u8); -void sub_80B4470(u8); -void sub_80B2EFC(u8 taskId); -void sub_80B2F30(u8 taskId); -void HandleShopMenuQuit(u8 taskId); -void sub_80B3BF4(u8 taskId); -void sub_80B3D7C(u8 taskId); +static void Shop_DisplayPriceInList(int firstItemId, int lastItemId, bool32 hasControlCode); +static void Shop_PrintItemDescText(void); +static void Task_ReturnToBuyMenu(u8); +static void Task_ExitBuyMenu(u8); +static void Task_ExitBuyMenuDoFade(u8); +static void Task_UpdatePurchaseHistory(u8); +static void Task_HandleShopMenuBuy(u8 taskId); +static void Task_HandleShopMenuSell(u8 taskId); +static void Task_HandleShopMenuQuit(u8 taskId); +static void Task_DoItemPurchase(u8 taskId); +static void Task_CancelItemPurchase(u8 taskId); +static void Task_DoBuySellMenu(u8); +static void Shop_FadeAndRunBuySellCallback(u8); +static void BuyMenuDrawGraphics(void); +static void sub_80B3240(void); +static void DrawFirstMartScrollIndicators(void); +static void Shop_DrawViewport(void); +static void Shop_InitMenus(int, int); +static void Shop_PrintItemDesc(void); +static void Shop_DoCursorAction(u8); +static void Shop_LoadViewportObjects(void); +static void Shop_AnimViewportObjects(void); // iwram static struct MartInfo gMartInfo; // ewram EWRAM_DATA u32 gMartTotalCost = 0; -EWRAM_DATA s16 gUnknown_020386A4[16][4] = {0}; -EWRAM_DATA struct ItemSlot gUnknown_02038724[3] = {0}; // tv.c uses this, so it cant be static -EWRAM_DATA u8 gUnknown_02038730 = 0; -EWRAM_DATA u8 gUnknown_02038731 = 0; +EWRAM_DATA s16 gMartViewportObjects[16][4] = {0}; +EWRAM_DATA struct ItemSlot gMartPurchaseHistory[3] = {0}; +EWRAM_DATA u8 gMartPurchaseHistoryId = 0; + +EWRAM_DATA u8 gUnknown_02038731 = 0; // This really should be in fldeff_escalator, but being in a new file aligns the ewram, which doesnt match the ROM. // rodata static const struct MenuAction2 sBuySellQuitMenuActions[] = { - { MartText_Buy, sub_80B2EFC }, - { MartText_Sell, sub_80B2F30 }, - { MartText_Quit2, HandleShopMenuQuit }, + { MartText_Buy, Task_HandleShopMenuBuy }, + { MartText_Sell, Task_HandleShopMenuSell }, + { MartText_Quit2, Task_HandleShopMenuQuit }, }; -static const u8 gUnknown_083CC6E8[] = {0, 1, 2}; // BUY SELL EXIT -static const u8 gUnknown_083CC6EB[] = {0, 2}; // BUY EXIT +static const u8 gMartBuySellOptionList[] = {SHOP_BUY, SHOP_SELL, SHOP_EXIT}; +static const u8 gMartBuyNoSellOptionList[] = {SHOP_BUY, SHOP_EXIT}; static const u16 gUnusedMartArray[] = {0x2, 0x3, 0x4, 0xD, 0x121, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0x0, 0x0}; -static const struct YesNoFuncTable gUnknown_083CC708[] = +static const struct YesNoFuncTable sShopPurchaseYesNoFuncs[] = { - sub_80B3BF4, - sub_80B3D7C + Task_DoItemPurchase, + Task_CancelItemPurchase }; -u8 CreateShopMenu(u8 martType) +static u8 CreateShopMenu(u8 martType) { ScriptContext2_Enable(); gMartInfo.martType = martType; @@ -84,26 +96,26 @@ u8 CreateShopMenu(u8 martType) if (martType == MART_TYPE_0) { gMartInfo.numChoices = 2; - MenuDrawTextWindow(0, 0, 10, 7); - PrintMenuItemsReordered(1, 1, 3, sBuySellQuitMenuActions, gUnknown_083CC6E8); + Menu_DrawStdWindowFrame(0, 0, 10, 7); + Menu_PrintItemsReordered(1, 1, 3, sBuySellQuitMenuActions, gMartBuySellOptionList); } else { gMartInfo.numChoices = 1; - MenuDrawTextWindow(0, 0, 10, 5); - PrintMenuItemsReordered(1, 1, 2, sBuySellQuitMenuActions, gUnknown_083CC6EB); + Menu_DrawStdWindowFrame(0, 0, 10, 5); + Menu_PrintItemsReordered(1, 1, 2, sBuySellQuitMenuActions, gMartBuyNoSellOptionList); } InitMenu(0, 1, 1, gMartInfo.numChoices + 1, 0, 9); // add 1 for cancel - return CreateTask(sub_80B2E38, 8); + return CreateTask(Task_DoBuySellMenu, 8); } -void SetShopMenuCallback(void *callbackPtr) +static void SetShopMenuCallback(void *callbackPtr) { gMartInfo.callback = callbackPtr; } -void SetShopItemsForSale(u16 *items) +static void SetShopItemsForSale(u16 *items) { u16 i = 0; @@ -117,16 +129,16 @@ void SetShopItemsForSale(u16 *items) } } -void sub_80B2E38(u8 var) +static void Task_DoBuySellMenu(u8 taskId) { - const u8 local = var; + const u8 taskIdConst = taskId; // why is a local const needed to match? if (gMain.newAndRepeatedKeys & DPAD_UP) { if (gMartInfo.cursor) // can move cursor up? { PlaySE(SE_SELECT); - gMartInfo.cursor = MoveMenuCursor(-1); + gMartInfo.cursor = Menu_MoveCursor(-1); } } else if (gMain.newAndRepeatedKeys & DPAD_DOWN) @@ -134,7 +146,7 @@ void sub_80B2E38(u8 var) if (gMartInfo.cursor != gMartInfo.numChoices) // can move cursor down? { PlaySE(SE_SELECT); - gMartInfo.cursor = MoveMenuCursor(1); + gMartInfo.cursor = Menu_MoveCursor(1); } } else if (gMain.newKeys & A_BUTTON) @@ -142,40 +154,40 @@ void sub_80B2E38(u8 var) PlaySE(SE_SELECT); if (gMartInfo.martType == MART_TYPE_0) { - sBuySellQuitMenuActions[gUnknown_083CC6E8[gMartInfo.cursor]].func(local); + sBuySellQuitMenuActions[gMartBuySellOptionList[gMartInfo.cursor]].func(taskIdConst); } else { - sBuySellQuitMenuActions[gUnknown_083CC6EB[gMartInfo.cursor]].func(local); + sBuySellQuitMenuActions[gMartBuyNoSellOptionList[gMartInfo.cursor]].func(taskIdConst); } } else if (gMain.newKeys & B_BUTTON) { PlaySE(SE_SELECT); - HandleShopMenuQuit(local); + Task_HandleShopMenuQuit(taskIdConst); } } -void sub_80B2EFC(u8 taskId) +static void Task_HandleShopMenuBuy(u8 taskId) { gTasks[taskId].data[8] = (u32)BuyMenuDrawGraphics >> 16; gTasks[taskId].data[9] = (u32)BuyMenuDrawGraphics; - gTasks[taskId].func = sub_80B2FA0; - fade_screen(1, 0); + gTasks[taskId].func = Shop_FadeAndRunBuySellCallback; + FadeScreen(1, 0); } -void sub_80B2F30(u8 taskId) +static void Task_HandleShopMenuSell(u8 taskId) { - gTasks[taskId].data[8] = (u32)sub_80A6300 >> 16; - gTasks[taskId].data[9] = (u32)sub_80A6300; - gTasks[taskId].func = sub_80B2FA0; - fade_screen(1, 0); + gTasks[taskId].data[8] = (u32)ItemMenu_LoadSellMenu >> 16; + gTasks[taskId].data[9] = (u32)ItemMenu_LoadSellMenu; + gTasks[taskId].func = Shop_FadeAndRunBuySellCallback; + FadeScreen(1, 0); } -void HandleShopMenuQuit(u8 taskId) +static void Task_HandleShopMenuQuit(u8 taskId) { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 11, 8); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 11, 8); sub_80BE3BC(); ScriptContext2_Disable(); DestroyTask(taskId); @@ -184,7 +196,7 @@ void HandleShopMenuQuit(u8 taskId) gMartInfo.callback(); // run the callback if it exists. } -void sub_80B2FA0(u8 taskId) +static void Shop_FadeAndRunBuySellCallback(u8 taskId) { if (!gPaletteFade.active) { @@ -193,15 +205,15 @@ void sub_80B2FA0(u8 taskId) } } -void ReturnToShopMenuAfterExitingSellMenu(u8 taskId) +static void ReturnToShopMenuAfterExitingSellMenu(u8 taskId) { CreateShopMenu(gMartInfo.martType); DestroyTask(taskId); } -void Task_ExitSellMenu(u8 taskId) +static void Task_ReturnToMartMenu(u8 taskId) { - if (sub_807D770() == 1) + if (IsWeatherNotFadingIn() == 1) { if (gMartInfo.martType == MART_TYPE_2) DisplayItemMessageOnField(taskId, gOtherText_CanIHelpYou, ReturnToShopMenuAfterExitingSellMenu, 0); @@ -210,23 +222,24 @@ void Task_ExitSellMenu(u8 taskId) } } -void sub_80B3050(void) +void Shop_FadeReturnToMartMenu(void) { pal_fill_black(); - CreateTask(Task_ExitSellMenu, 0x8); + CreateTask(Task_ReturnToMartMenu, 0x8); } -void sub_80B3068(u8 taskId) +void Shop_RunExitSellMenuTask(u8 taskId) { - Task_ExitSellMenu(taskId); + Task_ReturnToMartMenu(taskId); } -void unref_sub_80B3078(u8 taskId) +// unused +void Shop_LoadExitSellMenuTask(u8 taskId) { - gTasks[taskId].func = Task_ExitSellMenu; + gTasks[taskId].func = Task_ReturnToMartMenu; } -void sub_80B3094(void) +static void MainCB2(void) { AnimateSprites(); BuildOamBuffer(); @@ -234,50 +247,43 @@ void sub_80B3094(void) UpdatePaletteFade(); } -void sub_80B30AC(void) +static void VBlankCB(void) { - void *addr; - void *addr2; - void *addr3; - u16 *tempArr; - u16 *tempArr2; - u16 *tempArr3; - LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); - - // temp vars needed to match for some dumb reason - tempArr = gBGTilemapBuffers[1]; - addr = (void *)(VRAM + 0xE800); - DmaCopy16(3, tempArr, addr, 0x800); - tempArr2 = gBGTilemapBuffers[2]; - addr2 = (void *)(VRAM + 0xE000); - DmaCopy16(3, tempArr2, addr2, 0x800); - tempArr3 = gBGTilemapBuffers[3]; - addr3 = (void *)(VRAM + 0xF000); - DmaCopy16(3, tempArr3, addr3, 0x800); + DmaCopy16Defvars(3, gBGTilemapBuffers[1], (void *)(VRAM + 0xE800), 0x800); + DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(VRAM + 0xE000), 0x800); + DmaCopy16Defvars(3, gBGTilemapBuffers[3], (void *)(VRAM + 0xF000), 0x800); } -// this function is fugly. pls fix -void BuyMenuDrawGraphics(void) +static void BuyMenuDrawGraphics(void) { - void *addr; - register u16 zero2 asm("r5"); - - sub_80F9438(); - remove_some_task(); - REG_BG1HOFS = (zero2 = 0); - REG_BG1VOFS = zero2; - REG_BG2HOFS = zero2; - REG_BG2VOFS = zero2; - REG_BG3HOFS = zero2; - REG_BG3VOFS = zero2; + ClearVideoCallbacks(); + ScanlineEffect_Stop(); + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; gPaletteFade.bufferTransferDisabled = 1; - addr = (void*)OAM; - { - register const u32 zero asm("r6") = 0; - DmaFill32(3, zero, addr, OAM_SIZE); + + /* + THEORY: This seemingly useless loop is required in order to match this + function without hacks. The reason is because it alters the 0 optimization + of a later assignment into using 2 different 0s instead of the same register. + It is speculated that at some point Game Freak insert an artificial + breakpoint here in order to look at the contents of OAM before it is cleared, + possibly because a programmer made a mistake in shop.c which corrupted its + contents. There may have been a macro here which at one point idled on the + while(1) but was changed to 0 for release due to a define somewhere. A + while(0) also matches, but it is more correct to use do {} while(0) as it + was a fix to prevent compiler warnings on older compilers. + */ + do {} while(0); + + DmaFill32Defvars(3, 0, (void*)OAM, OAM_SIZE); LZDecompressVram(gBuyMenuFrame_Gfx, (void*)(VRAM + 0x7C00)); LZDecompressWram(gBuyMenuFrame_Tilemap, ewram18000_2); LoadCompressedPalette(gMenuMoneyPal, 0xC0, sizeof(gMenuMoneyPal)); @@ -285,74 +291,74 @@ void BuyMenuDrawGraphics(void) ResetPaletteFade(); ResetSpriteData(); ResetTasks(); - SetUpWindowConfig(&gWindowConfig_81E6DFC); - InitMenuWindow(&gWindowConfig_81E6DFC); - BuyMenuDrawMapGraphics(); - gMartInfo.cursor = zero; - gMartInfo.choicesAbove = zero2; - MenuZeroFillWindowRect(0, 0, 0x20, 0x20); + Text_LoadWindowTemplate(&gWindowTemplate_81E6DFC); + InitMenuWindow(&gWindowTemplate_81E6DFC); + Shop_DrawViewport(); + gMartInfo.cursor = 0; + gMartInfo.choicesAbove = 0; + Menu_EraseWindowRect(0, 0, 0x20, 0x20); OpenMoneyWindow(gSaveBlock1.money, 0, 0); - sub_80B3764(0, 7); - sub_80B37EC(); - sub_80B3270(); - CreateTask(sub_80B40E8, 0x8); + Shop_InitMenus(0, 7); + Shop_PrintItemDesc(); + DrawFirstMartScrollIndicators(); + CreateTask(Shop_DoCursorAction, 0x8); sub_80B3240(); - asm("":::"r4"); // what?? - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, zero); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); gPaletteFade.bufferTransferDisabled = 0; - SetVBlankCallback(sub_80B30AC); - SetMainCallback2(sub_80B3094); - } + SetVBlankCallback(VBlankCB); + SetMainCallback2(MainCB2); } -void sub_80B3240(void) +static void sub_80B3240(void) { - u16 tempArr[2] = {0x41EE, 0x7FFF}; + u16 colors[2] = {RGB(14, 15, 16), RGB_WHITE}; - LoadPalette(&tempArr[1], 0xD1, 2); - LoadPalette(&tempArr[0], 0xD8, 2); + LoadPalette(&colors[1], 0xD1, sizeof colors[1]); + LoadPalette(&colors[0], 0xD8, sizeof colors[0]); } -void sub_80B3270(void) +static void DrawFirstMartScrollIndicators(void) { - sub_80F944C(); + ClearVerticalScrollIndicatorPalettes(); if (gMartInfo.itemCount > 7) { - CreateVerticalScrollIndicators(0, 172, 12); - CreateVerticalScrollIndicators(1, 172, 148); - sub_80F979C(0, 1); + CreateVerticalScrollIndicators(TOP_ARROW, 172, 12); + CreateVerticalScrollIndicators(BOTTOM_ARROW, 172, 148); + SetVerticalScrollIndicators(TOP_ARROW, INVISIBLE); } } -void sub_80B32A4(void) +static void Shop_TryDrawVerticalScrollIndicators(void) { if (gMartInfo.choicesAbove == 0) - sub_80F979C(0, 1); + SetVerticalScrollIndicators(TOP_ARROW, INVISIBLE); else - sub_80F979C(0, 0); + SetVerticalScrollIndicators(TOP_ARROW, VISIBLE); if (gMartInfo.choicesAbove + 7 >= gMartInfo.itemCount) - sub_80F979C(1, 1); + SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE); else - sub_80F979C(1, 0); + SetVerticalScrollIndicators(BOTTOM_ARROW, VISIBLE); } -void sub_80B32EC(u16 *array, s16 offset1, s16 offset2) +// what is the point of this function? the tiles always get overwritten by BuyMenuDrawTextboxBG. +static void BuyMenuDrawTextboxBG_Old(u16 *array, s16 offset1, s16 offset2) { array[offset1 + offset2] = 0xC3E1; array[offset1 + offset2 + 1] = 0xC3E1; } -void BuyMenuDrawMapMetatileLayer(u16 *array, s16 offset1, s16 offset2, u16 *array2) +static void BuyMenuDrawMapMetatileLayer(u16 *array, s16 offset1, s16 offset2, u16 *array2) { - array[offset1 + offset2] = array2[0]; - array[offset1 + offset2 + 1] = array2[1]; - array[offset1 + offset2 + 32] = array2[2]; - array[offset1 + offset2 + 33] = array2[3]; + // This function draws a whole 2x2 metatile. + array[offset1 + offset2] = array2[0]; // top left + array[offset1 + offset2 + 1] = array2[1]; // top right + array[offset1 + offset2 + 32] = array2[2]; // bottom left + array[offset1 + offset2 + 33] = array2[3]; // bottom right } -void BuyMenuDrawMapMetatile(int var1, int var2, u16 *var3, s32 var4) +static void BuyMenuDrawMapMetatile(int var1, int var2, u16 *var3, s32 var4) { u8 tempVar4 = var4; s16 offset1 = var1 * 2; @@ -375,7 +381,8 @@ void BuyMenuDrawMapMetatile(int var1, int var2, u16 *var3, s32 var4) } } -void sub_80B33D0(s16 var1, int var2, u16 *var3) +// used to draw the border tiles around the viewport. +static void BuyMenuDrawMapPartialMetatile(s16 var1, int var2, u16 *var3) { s16 offset1 = var1 * 2; s16 offset2 = (var2 * 0x40) + 0x40; @@ -384,7 +391,7 @@ void sub_80B33D0(s16 var1, int var2, u16 *var3) BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[2], offset1, offset2, var3 + 4); } -void sub_80B3420(void) +static void Shop_DrawViewportTiles(void) { s16 facingX; s16 facingY; @@ -413,26 +420,26 @@ void sub_80B3420(void) else { if (metatileId < 512) - sub_80B33D0(x, y, (u16 *)gMapHeader.mapData->primaryTileset->metatiles + metatileId * 8); + BuyMenuDrawMapPartialMetatile(x, y, (u16 *)gMapHeader.mapData->primaryTileset->metatiles + metatileId * 8); else - sub_80B33D0(x, y, (u16 *)gMapHeader.mapData->secondaryTileset->metatiles + (metatileId - 512) * 8); + BuyMenuDrawMapPartialMetatile(x, y, (u16 *)gMapHeader.mapData->secondaryTileset->metatiles + (metatileId - 512) * 8); } if (y == 0 && x != 0 && x != 6) - sub_80B32EC(gBGTilemapBuffers[1], x * 2, 64); + BuyMenuDrawTextboxBG_Old(gBGTilemapBuffers[1], x * 2, 64); } } } -void BuyMenuDrawMapGraphics(void) +static void Shop_DrawViewport(void) { - sub_80F9020(); - sub_80B356C(); - sub_80B368C(); - sub_80B3420(); + ClearBGTilemapBuffers(); + Shop_LoadViewportObjects(); + Shop_AnimViewportObjects(); + Shop_DrawViewportTiles(); } -void sub_80B356C(void) +static void Shop_LoadViewportObjects(void) { s16 facingX; s16 facingY; @@ -444,7 +451,7 @@ void sub_80B356C(void) GetXYCoordsOneStepInFrontOfPlayer(&facingX, &facingY); playerHeight = PlayerGetZCoord(); for (y = 0; y < 16; y++) - gUnknown_020386A4[y][MAP_OBJ_ID] = 16; + gMartViewportObjects[y][MAP_OBJ_ID] = 16; for (y = 0; y < 5; y++) { for (x = 0; x < 7; x++) @@ -453,43 +460,43 @@ void sub_80B356C(void) if (mapObjId != 16) { - gUnknown_020386A4[r8][MAP_OBJ_ID] = mapObjId; - gUnknown_020386A4[r8][X_COORD] = x; - gUnknown_020386A4[r8][Y_COORD] = y; + gMartViewportObjects[r8][MAP_OBJ_ID] = mapObjId; + gMartViewportObjects[r8][X_COORD] = x; + gMartViewportObjects[r8][Y_COORD] = y; if (gMapObjects[mapObjId].mapobj_unk_18 == 1) - gUnknown_020386A4[r8][ANIM_NUM] = 0; + gMartViewportObjects[r8][ANIM_NUM] = 0; if (gMapObjects[mapObjId].mapobj_unk_18 == 2) - gUnknown_020386A4[r8][ANIM_NUM] = 1; + gMartViewportObjects[r8][ANIM_NUM] = 1; if (gMapObjects[mapObjId].mapobj_unk_18 == 3) - gUnknown_020386A4[r8][ANIM_NUM] = 2; + gMartViewportObjects[r8][ANIM_NUM] = 2; if (gMapObjects[mapObjId].mapobj_unk_18 == 4) - gUnknown_020386A4[r8][ANIM_NUM] = 3; + gMartViewportObjects[r8][ANIM_NUM] = 3; r8++; } } } } -void sub_80B368C(void) +static void Shop_AnimViewportObjects(void) { u8 i; for (i = 0; i < 16; i++) // max objects? { - if (gUnknown_020386A4[i][MAP_OBJ_ID] == 16) + if (gMartViewportObjects[i][MAP_OBJ_ID] == 16) continue; StartSpriteAnim(&gSprites[AddPseudoFieldObject( - gMapObjects[gUnknown_020386A4[i][MAP_OBJ_ID]].graphicsId, + gMapObjects[gMartViewportObjects[i][MAP_OBJ_ID]].graphicsId, SpriteCallbackDummy, - (u16)gUnknown_020386A4[i][X_COORD] * 16 + 8, - (u16)gUnknown_020386A4[i][Y_COORD] * 16 + 32, + (u16)gMartViewportObjects[i][X_COORD] * 16 + 8, + (u16)gMartViewportObjects[i][Y_COORD] * 16 + 32, 2)], - gUnknown_020386A4[i][ANIM_NUM]); + gMartViewportObjects[i][ANIM_NUM]); } } -void sub_80B3720(void) +static void BuyMenuDrawTextboxBG(void) { s16 i; @@ -500,14 +507,15 @@ void sub_80B3720(void) } } -void sub_80B3764(int var1, int var2) +static void Shop_InitMenus(int firstItemId, int lastItemId) { - sub_80B3720(); - sub_80B39D0(var1, var2, 0); + BuyMenuDrawTextboxBG(); + Shop_DisplayPriceInList(firstItemId, lastItemId, 0); InitMenu(0, 0xE, 0x2, 0x8, gMartInfo.cursor, 0xF); } -void sub_80B379C(void) +// after printing the item quantity and price, restore the textbox tiles before the Yes/No prompt. +static void BuyMenuDrawTextboxBG_Restore(void) { u16 i, j; @@ -516,27 +524,29 @@ void sub_80B379C(void) gBGTilemapBuffers[1][32 * (i + 12) + j] = ewram18300[32 * i + j] + 0xC3E0; } -void sub_80B37EC(void) +static void Shop_PrintItemDesc(void) { - sub_80B3A70(); + Shop_PrintItemDescText(); } -void sub_80B37F8(u8 taskId) +#define tItemCount data[1] + +static void Shop_DisplayPriceInCheckoutWindow(u8 taskId) { u16 itemListIndex = gMartInfo.choicesAbove + gMartInfo.cursor; u16 itemId = gMartInfo.itemList[itemListIndex]; u32 price = (ItemId_GetPrice(itemId) >> GetPriceReduction(1)); - PrintMoneyAmount(gTasks[taskId].data[1] * price, 6, 6, 11); + PrintMoneyAmount(gTasks[taskId].tItemCount * price, 6, 6, 11); gStringVar1[0] = EXT_CTRL_CODE_BEGIN; gStringVar1[1] = 0x14; gStringVar1[2] = 0x6; - ConvertIntToDecimalStringN(&gStringVar1[3], gTasks[taskId].data[1], 1, 2); - MenuPrint(gOtherText_xString1, 1, 11); + ConvertIntToDecimalStringN(&gStringVar1[3], gTasks[taskId].tItemCount, 1, 2); + Menu_PrintText(gOtherText_xString1, 1, 11); sub_80A3FA0(gBGTilemapBuffers[1], 1, 11, 12, 2, 0xC3E1); } -void sub_80B389C(u16 itemId, u8 var2, bool32 hasControlCode) +static void Shop_DisplayNormalPriceInList(u16 itemId, u8 var2, bool32 hasControlCode) { u8 *stringPtr = gStringVar1; @@ -557,10 +567,10 @@ void sub_80B389C(u16 itemId, u8 var2, bool32 hasControlCode) stringPtr = &gStringVar1[3]; GetMoneyAmountText(stringPtr, (ItemId_GetPrice(itemId) >> GetPriceReduction(1)), 0x4); - MenuPrint_PixelCoords(&gStringVar1[0], 0xCA, var2 << 3, 1); + Menu_PrintTextPixelCoords(&gStringVar1[0], 0xCA, var2 << 3, 1); } -void sub_80B3930(u16 itemId, u8 var2, bool32 hasControlCode) +static void Shop_DisplayDecorationPriceInList(u16 itemId, u8 var2, bool32 hasControlCode) { u8 *stringPtr = gStringVar1; @@ -579,37 +589,40 @@ void sub_80B3930(u16 itemId, u8 var2, bool32 hasControlCode) if (hasControlCode != FALSE) stringPtr = &gStringVar1[3]; + // some names are the maximum string length for a shop item. Because there is no room for + // a 6 character price (including the currency), a sprite is instead used for anything that + // is the maximum decoration price in order to fit it on screen. if (gDecorations[itemId].price == 10000) { - sub_80B7B34(0x19, var2, hasControlCode); // huh??? + Draw10000Sprite(0x19, var2, hasControlCode); } else { GetMoneyAmountText(stringPtr, gDecorations[itemId].price, 0x4); - MenuPrint_PixelCoords(&gStringVar1[0], 0xCA, var2 << 3, 0x1); + Menu_PrintTextPixelCoords(&gStringVar1[0], 0xCA, var2 << 3, 0x1); } } -void sub_80B39D0(int var1, int var2, bool32 hasControlCode) +static void Shop_DisplayPriceInList(int firstItemId, int lastItemId, bool32 hasControlCode) { u8 i; - for (i = var1; i <= var2 && gMartInfo.choicesAbove + i < gMartInfo.itemCount; i++) + for (i = firstItemId; i <= lastItemId && gMartInfo.choicesAbove + i < gMartInfo.itemCount; i++) { if (gMartInfo.martType == MART_TYPE_0) - sub_80B389C(gMartInfo.itemList[gMartInfo.choicesAbove + i], (i << 1) + 2, hasControlCode); + Shop_DisplayNormalPriceInList(gMartInfo.itemList[gMartInfo.choicesAbove + i], (i << 1) + 2, hasControlCode); else - sub_80B3930(gMartInfo.itemList[gMartInfo.choicesAbove + i], (i << 1) + 2, hasControlCode); + Shop_DisplayDecorationPriceInList(gMartInfo.itemList[gMartInfo.choicesAbove + i], (i << 1) + 2, hasControlCode); } if (i != 8 && gMartInfo.choicesAbove + i == gMartInfo.itemCount) { - MenuFillWindowRectWithBlankTile(0xE, (i << 1) + 2, 0x1C, (i << 1) + 3); - MenuPrint(gOtherText_CancelNoTerminator, 0xE, (i << 1) + 2); + Menu_BlankWindowRect(0xE, (i << 1) + 2, 0x1C, (i << 1) + 3); + Menu_PrintText(gOtherText_CancelNoTerminator, 0xE, (i << 1) + 2); } } -void sub_80B3A70(void) +static void Shop_PrintItemDescText(void) { if (gMartInfo.choicesAbove + gMartInfo.cursor != gMartInfo.itemCount) { @@ -628,121 +641,122 @@ void sub_80B3A70(void) } } -void sub_80B3AEC(u8 taskId) +static void Shop_DoPremierBallCheck(u8 taskId) { if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) { - sub_80B39D0(gMartInfo.cursor, gMartInfo.cursor, 0); // huh??? + Shop_DisplayPriceInList(gMartInfo.cursor, gMartInfo.cursor, 0); PlaySE(SE_SELECT); - if (gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor] == ITEM_POKE_BALL && gTasks[taskId].data[1] >= 10 && AddBagItem(ITEM_PREMIER_BALL, 1) == TRUE) - DisplayItemMessageOnField(taskId, gOtherText_FreePremierBall, sub_80B4378, 0xC3E1); + if (gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor] == ITEM_POKE_BALL && gTasks[taskId].tItemCount >= 10 && AddBagItem(ITEM_PREMIER_BALL, 1) == TRUE) + DisplayItemMessageOnField(taskId, gOtherText_FreePremierBall, Task_ReturnToBuyMenu, 0xC3E1); else - sub_80B4378(taskId); + Task_ReturnToBuyMenu(taskId); } } -void sub_80B3B80(u8 taskId) +static void Shop_DoItemTransaction(u8 taskId) { - IncrementGameStat(0x26); + IncrementGameStat(GAME_STAT_SHOPPED); RemoveMoney(&gSaveBlock1.money, gMartTotalCost); PlaySE(SE_REGI); UpdateMoneyWindow(gSaveBlock1.money, 0, 0); - gTasks[taskId].func = sub_80B3AEC; + gTasks[taskId].func = Shop_DoPremierBallCheck; } -void sub_80B3BD0(u8 taskId) +static void Shop_DoPricePrintAndReturnToBuyMenu(u8 taskId) { - sub_80B39D0(gMartInfo.cursor, gMartInfo.cursor, 0); // same thing as above? - sub_80B4378(taskId); + Shop_DisplayPriceInList(gMartInfo.cursor, gMartInfo.cursor, 0); + Task_ReturnToBuyMenu(taskId); } -void sub_80B3BF4(u8 taskId) +static void Task_DoItemPurchase(u8 taskId) { - MenuZeroFillWindowRect(0x7, 0x8, 0xD, 0xD); + Menu_EraseWindowRect(0x7, 0x8, 0xD, 0xD); sub_80A3FA0(gBGTilemapBuffers[1], 8, 9, 4, 4, 0); - sub_80B379C(); - sub_80B3420(); + BuyMenuDrawTextboxBG_Restore(); + Shop_DrawViewportTiles(); if (IsEnoughMoney(gSaveBlock1.money, gMartTotalCost)) { if (gMartInfo.martType == MART_TYPE_0) { - if (AddBagItem(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor], gTasks[taskId].data[1])) + if (AddBagItem(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor], gTasks[taskId].tItemCount)) { - DisplayItemMessageOnField(taskId, gOtherText_HereYouGo, sub_80B3B80, 0xC3E1); - sub_80B4470(taskId); + DisplayItemMessageOnField(taskId, gOtherText_HereYouGo, Shop_DoItemTransaction, 0xC3E1); + Task_UpdatePurchaseHistory(taskId); } else - DisplayItemMessageOnField(taskId, gOtherText_NoRoomFor, sub_80B3BD0, 0xC3E1); + DisplayItemMessageOnField(taskId, gOtherText_NoRoomFor, Shop_DoPricePrintAndReturnToBuyMenu, 0xC3E1); } else // a normal mart is only type 0, so types 1 and 2 are decoration marts. { if (IsThereStorageSpaceForDecoration(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor])) { if (gMartInfo.martType == MART_TYPE_1) - DisplayItemMessageOnField(taskId, gOtherText_HereYouGo2, sub_80B3B80, 0xC3E1); + DisplayItemMessageOnField(taskId, gOtherText_HereYouGo2, Shop_DoItemTransaction, 0xC3E1); else - DisplayItemMessageOnField(taskId, gOtherText_HereYouGo3, sub_80B3B80, 0xC3E1); + DisplayItemMessageOnField(taskId, gOtherText_HereYouGo3, Shop_DoItemTransaction, 0xC3E1); } else { StringExpandPlaceholders(gStringVar4, gOtherText_SpaceForIsFull); - DisplayItemMessageOnField(taskId, gStringVar4, sub_80B3BD0, 0xC3E1); + DisplayItemMessageOnField(taskId, gStringVar4, Shop_DoPricePrintAndReturnToBuyMenu, 0xC3E1); } } } else - DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, sub_80B3BD0, 0xC3E1); + DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, Shop_DoPricePrintAndReturnToBuyMenu, 0xC3E1); } -void sub_80B3D38(u8 taskId) +static void Shop_DoYesNoPurchase(u8 taskId) { DisplayYesNoMenu(7, 8, 1); sub_80A3FA0(gBGTilemapBuffers[1], 8, 9, 4, 4, 0xC3E1); - DoYesNoFuncWithChoice(taskId, gUnknown_083CC708); + DoYesNoFuncWithChoice(taskId, sShopPurchaseYesNoFuncs); } -void sub_80B3D7C(u8 taskId) +static void Task_CancelItemPurchase(u8 taskId) { - sub_80B39D0(gMartInfo.cursor, gMartInfo.cursor, 0); - MenuZeroFillWindowRect(0x7, 0x8, 0xD, 0xD); + Shop_DisplayPriceInList(gMartInfo.cursor, gMartInfo.cursor, 0); + Menu_EraseWindowRect(0x7, 0x8, 0xD, 0xD); sub_80A3FA0(gBGTilemapBuffers[1], 0x8, 0x9, 0x4, 0x4, 0); - sub_80B4378(taskId); + Task_ReturnToBuyMenu(taskId); } -void sub_80B3DC8(u8 taskId) +static void Shop_PrintPrice(u8 taskId) { - if (sub_80A52C4(taskId, gMartInfo.curItemCount) == TRUE) - sub_80B37F8(taskId); + if (SellMenu_QuantityRoller(taskId, gMartInfo.curItemCount) == TRUE) + Shop_DisplayPriceInCheckoutWindow(taskId); if (gMain.newKeys & A_BUTTON) { - gMartTotalCost = (ItemId_GetPrice(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]) >> GetPriceReduction(1)) * gTasks[taskId].data[1]; // set total cost of your purchase. - MenuZeroFillWindowRect(0, 0xA, 0xD, 0xD); + gMartTotalCost = (ItemId_GetPrice(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]) >> GetPriceReduction(1)) * gTasks[taskId].tItemCount; // set total cost of your purchase. + Menu_EraseWindowRect(0, 0xA, 0xD, 0xD); sub_80A3FA0(gBGTilemapBuffers[1], 0x1, 0xB, 0xC, 0x2, 0); - sub_80B379C(); - sub_80B3420(); + BuyMenuDrawTextboxBG_Restore(); + Shop_DrawViewportTiles(); CopyItemName(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor], gStringVar1); - ConvertIntToDecimalStringN(gStringVar2, gTasks[taskId].data[1], 0, 0x2); + ConvertIntToDecimalStringN(gStringVar2, gTasks[taskId].tItemCount, 0, 0x2); ConvertIntToDecimalStringN(gStringVar3, gMartTotalCost, 0, 0x8); StringExpandPlaceholders(gStringVar4, gOtherText_ThatWillBe); - DisplayItemMessageOnField(taskId, gStringVar4, sub_80B3D38, 0xC3E1); + DisplayItemMessageOnField(taskId, gStringVar4, Shop_DoYesNoPurchase, 0xC3E1); } else if (gMain.newKeys & B_BUTTON) { - sub_80B39D0(gMartInfo.cursor, gMartInfo.cursor, 0); - sub_80B4378(taskId); + Shop_DisplayPriceInList(gMartInfo.cursor, gMartInfo.cursor, 0); + Task_ReturnToBuyMenu(taskId); } } -void sub_80B3EFC(u8 taskId) +// set the item count in the mart info to the maximum allowed by the player's budget. +static void Shop_UpdateCurItemCountToMax(u8 taskId) { u16 var; - gTasks[taskId].data[1] = 1; - MenuDrawTextWindow(0, 0xA, 0xD, 0xD); - sub_80B37F8(taskId); + gTasks[taskId].tItemCount = 1; + Menu_DrawStdWindowFrame(0, 0xA, 0xD, 0xD); + Shop_DisplayPriceInCheckoutWindow(taskId); var = gSaveBlock1.money / (ItemId_GetPrice(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]) >> GetPriceReduction(1)); if (var > 99) @@ -750,11 +764,11 @@ void sub_80B3EFC(u8 taskId) else gMartInfo.curItemCount = var; - gTasks[taskId].func = sub_80B3DC8; + gTasks[taskId].func = Shop_PrintPrice; } #ifdef NONMATCHING -void sub_80B3F88(void) +static void Shop_MoveItemListUp(void) { u16 *r1; u16 *r2; @@ -796,7 +810,7 @@ void sub_80B3F88(void) } #else __attribute__((naked)) -void sub_80B3F88(void) +static void Shop_MoveItemListUp(void) { asm(".syntax unified\n\ push {r4-r7,lr}\n\ @@ -891,7 +905,7 @@ _080B4038: .4byte 0xfffffc40\n\ #endif #ifdef NONMATCHING -void sub_80B403C(void) +static void Shop_MoveItemListDown(void) { u16 *r1; u16 *r2; @@ -935,7 +949,7 @@ void sub_80B403C(void) } #else __attribute__((naked)) -void sub_80B403C(void) +static void Shop_MoveItemListDown(void) { asm(".syntax unified\n\ push {r4-r7,lr}\n\ @@ -1028,7 +1042,7 @@ _080B40E4: .4byte 0x800000f0\n\ } #endif -void sub_80B40E8(u8 taskId) // Mart_DoCursorAction +static void Shop_DoCursorAction(u8 taskId) { if (!gPaletteFade.active) { @@ -1041,16 +1055,16 @@ void sub_80B40E8(u8 taskId) // Mart_DoCursorAction PlaySE(SE_SELECT); gMartInfo.choicesAbove--; // since cursor is at the top and there are choices above the top, scroll the menu up by updating choicesAbove. - sub_80B3F88(); - sub_80B39D0(0, 0, 0); - sub_80B3A70(); - sub_80B32A4(); + Shop_MoveItemListUp(); + Shop_DisplayPriceInList(0, 0, 0); + Shop_PrintItemDescText(); + Shop_TryDrawVerticalScrollIndicators(); } else // if the cursor is not 0, choicesAbove cannot be updated yet since the cursor is at the top of the menu, so update cursor. { PlaySE(SE_SELECT); - gMartInfo.cursor = MoveMenuCursor(-1); // move cursor up - sub_80B3A70(); + gMartInfo.cursor = Menu_MoveCursor(-1); // move cursor up + Shop_PrintItemDescText(); } } else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) // only down can be pressed @@ -1062,16 +1076,16 @@ void sub_80B40E8(u8 taskId) // Mart_DoCursorAction PlaySE(SE_SELECT); gMartInfo.choicesAbove++; - sub_80B403C(); - sub_80B39D0(7, 7, 0); - sub_80B3A70(); - sub_80B32A4(); + Shop_MoveItemListDown(); + Shop_DisplayPriceInList(7, 7, 0); + Shop_PrintItemDescText(); + Shop_TryDrawVerticalScrollIndicators(); } else if (gMartInfo.cursor != gMartInfo.itemCount) { PlaySE(SE_SELECT); - gMartInfo.cursor = MoveMenuCursor(1); - sub_80B3A70(); + gMartInfo.cursor = Menu_MoveCursor(1); + Shop_PrintItemDescText(); } } else if (gMain.newKeys & A_BUTTON) @@ -1080,25 +1094,25 @@ void sub_80B40E8(u8 taskId) // Mart_DoCursorAction if (gMartInfo.choicesAbove + gMartInfo.cursor != gMartInfo.itemCount) // did you not hit CANCEL? { - PauseVerticalScrollIndicator(0); - PauseVerticalScrollIndicator(1); - sub_80F979C(1, 1); - sub_80B39D0(gMartInfo.cursor, gMartInfo.cursor, 1); - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0xC, 0xD, 0x13); + PauseVerticalScrollIndicator(TOP_ARROW); + PauseVerticalScrollIndicator(BOTTOM_ARROW); + SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE); + Shop_DisplayPriceInList(gMartInfo.cursor, gMartInfo.cursor, 1); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0xC, 0xD, 0x13); if (gMartInfo.martType == MART_TYPE_0) { gMartTotalCost = (ItemId_GetPrice(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]) >> GetPriceReduction(1)); // set 1x price if (!IsEnoughMoney(gSaveBlock1.money, gMartTotalCost)) { - DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, sub_80B3BD0, 0xC3E1); // tail merge + DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, Shop_DoPricePrintAndReturnToBuyMenu, 0xC3E1); // tail merge } else // _080B42BA { CopyItemName(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor], gStringVar1); StringExpandPlaceholders(gStringVar4, gOtherText_HowManyYouWant); - DisplayItemMessageOnField(taskId, gStringVar4, sub_80B3EFC, 0xC3E1); + DisplayItemMessageOnField(taskId, gStringVar4, Shop_UpdateCurItemCountToMax, 0xC3E1); } } else // _080B428C @@ -1107,7 +1121,7 @@ void sub_80B40E8(u8 taskId) // Mart_DoCursorAction if (!IsEnoughMoney(gSaveBlock1.money, gMartTotalCost)) { - DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, sub_80B3BD0, 0xC3E1); // tail merge + DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, Shop_DoPricePrintAndReturnToBuyMenu, 0xC3E1); // tail merge } else { @@ -1122,43 +1136,43 @@ void sub_80B40E8(u8 taskId) // Mart_DoCursorAction { StringExpandPlaceholders(gStringVar4, gOtherText_ThatWillBe3); } - DisplayItemMessageOnField(taskId, gStringVar4, sub_80B3D38, 0xC3E1); + DisplayItemMessageOnField(taskId, gStringVar4, Shop_DoYesNoPurchase, 0xC3E1); } } } else - sub_80B43F0(taskId); + Task_ExitBuyMenu(taskId); } else if (gMain.newKeys & B_BUTTON) // go back to buy/sell/exit menu { PlaySE(SE_SELECT); - sub_80B43F0(taskId); + Task_ExitBuyMenu(taskId); } } } -void sub_80B4378(u8 taskId) +static void Task_ReturnToBuyMenu(u8 taskId) { - MenuZeroFillWindowRect(0, 0xE, 0x1D, 0x13); - MenuZeroFillWindowRect(0, 0xA, 0xD, 0xD); + Menu_EraseWindowRect(0, 0xE, 0x1D, 0x13); + Menu_EraseWindowRect(0, 0xA, 0xD, 0xD); sub_80A3FA0(gBGTilemapBuffers[1], 0x1, 0xB, 0xC, 0x2, 0); - sub_80B3420(); - sub_80B3764(6, 7); - sub_80B37EC(); - StartVerticalScrollIndicators(0); - StartVerticalScrollIndicators(1); - sub_80B32A4(); - gTasks[taskId].func = sub_80B40E8; + Shop_DrawViewportTiles(); + Shop_InitMenus(6, 7); + Shop_PrintItemDesc(); + StartVerticalScrollIndicators(TOP_ARROW); + StartVerticalScrollIndicators(BOTTOM_ARROW); + Shop_TryDrawVerticalScrollIndicators(); + gTasks[taskId].func = Shop_DoCursorAction; } -void sub_80B43F0(u8 taskId) +static void Task_ExitBuyMenu(u8 taskId) { - gFieldCallback = sub_80B3050; + gFieldCallback = Shop_FadeReturnToMartMenu; BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskId].func = Task_ExitBuyMenu; + gTasks[taskId].func = Task_ExitBuyMenuDoFade; } -void Task_ExitBuyMenu(u8 taskId) +static void Task_ExitBuyMenuDoFade(u8 taskId) { if (!gPaletteFade.active) { @@ -1169,38 +1183,41 @@ void Task_ExitBuyMenu(u8 taskId) } } -void sub_80B4470(u8 taskId) +// Task_UpdatePurchaseHistory +static void Task_UpdatePurchaseHistory(u8 taskId) { u16 i; for (i = 0; i < 3; i++) { - if (gUnknown_02038724[i].itemId == gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor] - && gUnknown_02038724[i].quantity != 0) + if (gMartPurchaseHistory[i].itemId == gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor] + && gMartPurchaseHistory[i].quantity != 0) { - if (gUnknown_02038724[i].quantity + gTasks[taskId].data[1] > 255) - gUnknown_02038724[i].quantity = 255; + if (gMartPurchaseHistory[i].quantity + gTasks[taskId].tItemCount > 255) + gMartPurchaseHistory[i].quantity = 255; else - gUnknown_02038724[i].quantity += gTasks[taskId].data[1]; + gMartPurchaseHistory[i].quantity += gTasks[taskId].tItemCount; return; } } - if (gUnknown_02038730 < 3) + if (gMartPurchaseHistoryId < 3) { - gUnknown_02038724[gUnknown_02038730].itemId = gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]; - gUnknown_02038724[gUnknown_02038730].quantity = gTasks[taskId].data[1]; - gUnknown_02038730++; + gMartPurchaseHistory[gMartPurchaseHistoryId].itemId = gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]; + gMartPurchaseHistory[gMartPurchaseHistoryId].quantity = gTasks[taskId].tItemCount; + gMartPurchaseHistoryId++; } } -void ClearItemPurchases(void) +#undef tItemCount + +static void ClearItemPurchases(void) { - gUnknown_02038730 = 0; - ClearItemSlots(gUnknown_02038724, 3); + gMartPurchaseHistoryId = 0; + ClearItemSlots(gMartPurchaseHistory, 3); } -void CreatePokemartMenu(u16 *itemList) +void Shop_CreatePokemartMenu(u16 *itemList) { CreateShopMenu(MART_TYPE_0); SetShopItemsForSale(itemList); @@ -1208,141 +1225,37 @@ void CreatePokemartMenu(u16 *itemList) SetShopMenuCallback(EnableBothScriptContexts); } -void CreateDecorationShop1Menu(u16 *itemList) +void Shop_CreateDecorationShop1Menu(u16 *itemList) { CreateShopMenu(MART_TYPE_1); SetShopItemsForSale(itemList); SetShopMenuCallback(EnableBothScriptContexts); } -void CreateDecorationShop2Menu(u16 *itemList) +void Shop_CreateDecorationShop2Menu(u16 *itemList) { CreateShopMenu(MART_TYPE_2); SetShopItemsForSale(itemList); SetShopMenuCallback(EnableBothScriptContexts); } -void sub_80B45B4(u8 taskId, const s16 *list, u16 c) -{ - s16 r5 = gTasks[taskId].data[4] - 1; - s16 r3 = gTasks[taskId].data[5] - 1; - s16 r4 = gTasks[taskId].data[1]; - s16 y; - s16 x; - - if (gTasks[taskId].data[2] == 0) - { - for (y = 0; y < 3; y++) - { - for (x = 0; x < 3; x++) - { - s16 metatileId = MapGridGetMetatileIdAt(r5 + x, r3 + y); - - if (list[r4] == metatileId) - { - if (r4 != 2) - MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[r4 + 1]); - else - MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[0]); - } - } - } - } - else - { - for (y = 0; y < 3; y++) - { - for (x = 0; x < 3; x++) - { - s16 metatileId = MapGridGetMetatileIdAt(r5 + x, r3 + y); - - if (list[2 - r4] == metatileId) - { - if (r4 != 2) - MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[1 - r4]); - else - MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[2]); - } - } - } - } -} - -static const u16 gUnknown_083CC714[] = {0x284, 0x282, 0x280}; -static const u16 gUnknown_083CC71A[] = {0x285, 0x283, 0x281}; -static const u16 gUnknown_083CC720[] = {0x28C, 0x28A, 0x288}; -static const u16 gUnknown_083CC726[] = {0x28D, 0x28B, 0x289}; -static const u16 gUnknown_083CC72C[] = {0x2A0, 0x2A2, 0x2A4}; -static const u16 gUnknown_083CC732[] = {0x2A1, 0x2A3, 0x2A5}; -static const u16 gUnknown_083CC738[] = {0x2A8, 0x2AA, 0x2AC}; - -void sub_80B4710(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - data[3] = 1; - - switch (data[0]) - { - case 0: - sub_80B45B4(taskId, gUnknown_083CC714, 0); - break; - case 1: - sub_80B45B4(taskId, gUnknown_083CC71A, 0); - break; - case 2: - sub_80B45B4(taskId, gUnknown_083CC720, 0xC00); - break; - case 3: - sub_80B45B4(taskId, gUnknown_083CC726, 0); - break; - case 4: - sub_80B45B4(taskId, gUnknown_083CC72C, 0xC00); - break; - case 5: - sub_80B45B4(taskId, gUnknown_083CC732, 0); - break; - case 6: - sub_80B45B4(taskId, gUnknown_083CC738, 0); - break; - } - - data[0] = (data[0] + 1) & 7; - if (!data[0]) - { - DrawWholeMapView(); - data[1] = (data[1] + 1) % 3; - data[3] = 0; - } -} - -u8 sub_80B47D8(u16 var) -{ - u8 taskId = CreateTask(sub_80B4710, 0); - s16 *data = gTasks[taskId].data; - - PlayerGetDestCoords(&data[4], &data[5]); - data[0] = 0; - data[1] = 0; - data[2] = var; - sub_80B4710(taskId); - return taskId; -} - -void sub_80B4824(u8 var) -{ - gUnknown_02038731 = sub_80B47D8(var); -} - -void sub_80B483C(void) -{ - DestroyTask(gUnknown_02038731); -} - -bool8 sub_80B4850(void) -{ - if (gTasks[gUnknown_02038731].data[3] == 0 && gTasks[gUnknown_02038731].data[1] == 2) - return FALSE; - else - return TRUE; +#if DEBUG +__attribute__((naked)) +void debug_sub_80C2818(void) +{ + asm("\ + push {lr}\n\ + mov r0, #0x0\n\ + bl CreateShopMenu\n\ + ldr r0, ._290 @ gMartBuyNoSellOptionList\n\ + bl SetShopItemsForSale\n\ + mov r0, #0x0\n\ + bl SetShopMenuCallback\n\ + pop {r0}\n\ + bx r0\n\ +._291:\n\ + .align 2, 0\n\ +._290:\n\ + .word gMartBuyNoSellOptionList+0x3"); } +#endif diff --git a/src/field/slot_machine.c b/src/field/slot_machine.c index 89ec68b0a..2c97c146d 100644 --- a/src/field/slot_machine.c +++ b/src/field/slot_machine.c @@ -1,49 +1,4036 @@ #include "global.h" +#include "constants/songs.h" +#include "strings2.h" +#include "overworld.h" +#include "menu_cursor.h" +#include "field_effect.h" +#include "random.h" +#include "sound.h" +#include "main.h" #include "slot_machine.h" #include "decompress.h" +#include "trig.h" +#include "graphics.h" #include "palette.h" -#include "task.h" +#include "util.h" +#include "text.h" +#include "menu.h" #include "ewram.h" -struct UnkStruct2000000 { - /*0x00*/ u8 filler00[61]; - /*0x3D*/ u8 unk3D; -}; - -struct UnkStruct1 { +struct UnkStruct1 +{ /*0x00*/ u8 unk00; /*0x01*/ u8 unk01; /*0x02*/ s16 unk02; }; -extern struct UnkStruct1 *gUnknown_083ED048[]; -extern const u16 gPalette_83EDE24[]; - -extern const u8 gSlotMachine_Gfx[]; #if ENGLISH #define SLOTMACHINE_GFX_TILES 233 #elif GERMAN #define SLOTMACHINE_GFX_TILES 236 #endif -extern const u16 gUnknown_08E95A18[]; +// TODO: figure out which functions are static and which are not. +#define static + +static void CB2_SlotMachineSetup(void); +static void CB2_SlotMachineLoop(void); +static void PlaySlotMachine_Internal(u8 arg0, MainCallback cb); +static void SlotMachineDummyTask(u8 taskId); +static void SlotMachineSetup_0_0(void); +static void SlotMachineSetup_6_2(void); +static void SlotMachineSetup_1_0(void); +static void SlotMachineSetup_2_0(void); +static void SlotMachineSetup_2_1(void); +static void SlotMachineSetup_0_1(void); +static void SlotMachineSetup_3_0(void); +static void SlotMachineSetup_4_0(void); +static void SlotMachineSetup_5_0(void); +static void SlotMachineSetup_6_0(void); +static void SlotMachineSetup_6_1(void); +static void sub_8101D04(void); +static void sub_8101D24(u8 taskId); +static bool8 sub_8101D5C(struct Task *task); +static bool8 sub_8101D8C(struct Task *task); +static bool8 sub_8101DB0(struct Task *task); +static bool8 sub_8101DF4(struct Task *task); +static bool8 sub_8101E10(struct Task *task); +static bool8 sub_8101E3C(struct Task *task); +static bool8 sub_8101F44(struct Task *task); +static bool8 sub_8101F60(struct Task *task); +static bool8 sub_8101F88(struct Task *task); +static bool8 sub_8101FA4(struct Task *task); +static bool8 sub_8102008(struct Task *task); +static bool8 sub_8102034(struct Task *task); +static bool8 sub_8102058(struct Task *task); +static bool8 sub_8102090(struct Task *task); +bool8 sub_81020C8(struct Task *task); +static bool8 sub_81021E0(struct Task *task); +static bool8 sub_81021FC(struct Task *task); +static bool8 sub_8102264(struct Task *task); +static bool8 sub_81022A0(struct Task *task); +static bool8 sub_81022CC(struct Task *task); +static bool8 sub_81022F0(struct Task *task); +static bool8 sub_8102318(struct Task *task); +static bool8 sub_8102344(struct Task *task); +static bool8 sub_810239C(struct Task *task); +static bool8 sub_81023B8(struct Task *task); +static bool8 sub_81023E0(struct Task *task); +static bool8 sub_81023FC(struct Task *task); +static bool8 sub_8102424(struct Task *task); +static bool8 sub_8102460(struct Task *task); +static bool8 debug_sub_8116E74(struct Task *); +static void sub_8102484(void); +static void sub_81024F0(void); +static bool8 sub_8102540(void); +static u8 sub_8102578(void); +static u16 dp15_jump_random_unknown(void); +static u8 sub_81025BC(void); +static void CheckMatch(void); +static void CheckMatch_CenterRow(void); +static void CheckMatch_TopAndBottom(void); +static void CheckMatch_Diagonals(void); +static u8 GetMatchFromSymbolsInRow(u8 c1, u8 c2, u8 c3); +static void sub_8102A24(void); +static void sub_8102A64(u8 taskId); +static bool8 sub_8102A44(void); +static bool8 sub_8102A9C(struct Task *task); +static bool8 sub_8102AD0(struct Task *task); +static bool8 sub_8102B80(struct Task *task); +static u8 GetTagOfReelSymbolOnScreenAtPos(u8 x, s16 y); +static void sub_8102DA8(void); +static void sub_8102DEC(u8 a0); +static void sub_8102E1C(u8 a0); +static bool8 sub_8102E40(u8 a0); +static void sub_8102E68(u8 taskId); +static bool8 sub_8102EA0(struct Task *task); +static bool8 sub_8102EA4(struct Task *task); +static bool8 sub_8102EC0(struct Task *task); +static bool8 sub_8102F4C(struct Task *task); +static bool8 sub_8103008(struct Task *task); +static bool8 sub_810305C(void); +static bool8 sub_8103154(u8 a0, u8 a1); +static bool8 sub_81031B4(u8 a0, u8 a1); +static bool8 sub_81032C0(void); +static bool8 sub_81032E8(void); +static bool8 sub_810333C(void); +static bool8 sub_81033DC(void); +static bool8 sub_810341C(u8 a0); +static bool8 sub_810347C(u8 a0); +static void sub_81034F4(void); +static void sub_8103540(void); +static void sub_8103564(void); +static void j5_08111E84(void); +static void sub_8103668(void); +static void sub_810380C(void); +static void sub_8103830(void); +static void sub_8103910(void); +static void sub_8103A78(void); +static void sub_8103C14(u8 a0); +static void sub_8103C48(u8 taskId); +static void sub_8103D50(u8 a0); +static void sub_8103C78(struct Task *task, u8 taskId); +static void sub_8103CAC(struct Task *task, u8 taskId); +static void sub_8103CC8(struct Task *task, u8 taskId); +static void sub_8103D8C(u8 a0); +static void sub_8103DC8(void); +static void sub_8103E04(u8 a0); +static bool8 sub_8103E38(void); +static bool8 sub_8103E7C(void); +static bool8 sub_8103EAC(u8 spriteId); +static void sub_8103EE4(struct Sprite *sprite); +static void sub_8103F70(void); +static bool8 sub_8103FA0(void); +static void sub_8103FE8(u8 taskId); +static void sub_8104048(void); +static void sub_8104064(u8 pikaPower); +static bool8 sub_81040C8(void); +static void sub_81040E8(u8 taskId); +static void nullsub_68(struct Task *task); +static void sub_810411C(struct Task *task); +static void sub_8104144(struct Task *task); +static void sub_81041AC(struct Task *task); +static void sub_810421C(struct Task *task); +static void sub_810423C(u8 pikaPower); +static void sub_810430C(void); +static bool8 sub_810432C(void); +static void sub_810434C(u8 taskId); +static void sub_810437C(struct Task *task); +static void sub_81043EC(struct Task *task); +static void sub_8104468(struct Task *task); +static void sub_8104498(struct Task *task); +static void sub_8104548(struct Task *task); +static void sub_8104598(struct Task *task); +static void sub_81045CC(struct Task *task); +static void sub_810463C(struct Task *task); +static void sub_81046C0(struct Task *task); +static void sub_8104764(struct Task *task); +static void sub_8104794(struct Task *task); +static void sub_81047EC(struct Task *task); +static void sub_8104860(struct Task *task); +static void sub_81048A8(struct Task *task); +static void sub_81048CC(struct Task *task); +static void sub_8104940(struct Task *task); +static void sub_81049C8(struct Task *task); +static void sub_81049F8(struct Task *task); +static void sub_8104A40(s16 a0, s16 a1); +static void sub_8104A88(s16 a0); +static void sub_8104AB8(u8 a0); +static bool8 sub_8104AEC(void); +static void sub_8104B0C(u8 taskId); +static void sub_8104B3C(struct Task *task); +static void sub_8104B60(struct Task *task); +static void sub_8104B80(struct Task *task); +static void sub_8104BC8(struct Task *task); +static void sub_8104BFC(struct Task *task); +static void sub_8104C44(struct Task *task); +static void sub_8104C5C(void); +static void sub_8104CAC(u8 arg0); +static bool8 sub_8104E18(void); +static void nullsub_69(struct Task *task); +static void sub_8104E74(u8 taskId); +static void sub_8104EA8(void); +static void sub_8104F8C(void); +static void sub_8104FF4(s16 x, s16 y, u8 a2, s16 a3); +static void sub_81050C4(void); +static void sub_8105100(void); +static void sub_810514C(void); +static void sub_81051C0(void); +static void sub_8105284(void); +static void sub_81052EC(void); +static void sub_81053A0(void); +static void sub_810545C(void); +static void sub_81054B8(void); +static void sub_8105524(void); +static void sub_8105554(void); +static void sub_8105578(void); +static void sub_8105688(s16 a0); +static void sub_81056C0(void); +static void sub_81056F0(void); +static void sub_81057E8(s16 a0); +static void sub_8105804(void); +static void sub_8105854(void); +static void sub_81058A0(void); +static void sub_81058C4(void); +static void sub_81059B8(void); +static void sub_81059E8(void); +static bool8 sub_8105ACC(void); +static void sub_8105AEC(void); +static u8 sub_8105B1C(s16 x, s16 y); +static void sub_8105B88(u8 spriteId); +static u8 sub_8105BF8(u8 templateIdx, SpriteCallback callback, s16 x, s16 y, s16 a4); +static void sub_81063C0(void); +static void sub_8106404(void); +static void sub_8106448(void); +static void sub_81064B8(void); +static void sub_81065A8(s16 arg0, u16 arg1, u16 arg2, u16 arg3, u16 arg4); +static void sub_81065DC(void); + +#if DEBUG +__attribute__((section(".bss"))) u8 unk_debug_bss_1_0 = 0; +__attribute__((section(".bss"))) u8 unk_debug_bss_1_1 = 0; +__attribute__((section(".bss"))) u8 unk_debug_bss_1_2 = 0; +__attribute__((section(".bss"))) u8 unk_debug_bss_1_3 = 0; +__attribute__((section(".bss"))) u8 unk_debug_bss_1_4 = 0; +__attribute__((section(".bss"))) u32 unk_debug_bss_1_8 = 0; +#endif + +static const struct UnkStruct1 *const gUnknown_083ED048[]; +static const u16 gPalette_83EDE24[]; +static const u8 gUnknown_083ECD04[][3]; +static const u8 gUnknown_083ECE3A[]; +static const u16 gUnknown_083ECE42[]; +static const u16 gUnknown_083ECE48[]; + +void PlaySlotMachine(u8 arg0, MainCallback cb) +{ +#if DEBUG + unk_debug_bss_1_1 = 0; +#endif + PlaySlotMachine_Internal(arg0, cb); + SetMainCallback2(CB2_SlotMachineSetup); +} + +#if DEBUG +void debug_sub_811609C(u8 a, void (*func)(void)) +{ + unk_debug_bss_1_1 = 1; + PlaySlotMachine_Internal(a, func); + SetMainCallback2(CB2_SlotMachineSetup); +} +#endif + +static void CB2_SlotMachineSetup(void) +{ + switch (gMain.state) + { + case 0: + SlotMachineSetup_0_0(); + SlotMachineSetup_0_1(); + gMain.state++; + break; + case 1: + SlotMachineSetup_1_0(); + gMain.state++; + break; + case 2: + SlotMachineSetup_2_0(); + SlotMachineSetup_2_1(); + gMain.state++; + break; + case 3: + SlotMachineSetup_3_0(); + gMain.state++; + break; + case 4: + SlotMachineSetup_4_0(); + gMain.state++; + break; + case 5: + SlotMachineSetup_5_0(); + gMain.state++; + break; + case 6: + SlotMachineSetup_6_0(); + SlotMachineSetup_6_1(); + SlotMachineSetup_6_2(); + SetMainCallback2(CB2_SlotMachineLoop); + break; + } +} + +static void CB2_SlotMachineLoop(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void SlotMachine_VBlankCallback(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + REG_WIN0H = eSlotMachine->win0h; + REG_WIN0V = eSlotMachine->win0v; + REG_WININ = eSlotMachine->winIn; + REG_WINOUT = eSlotMachine->winOut; +} + +static void PlaySlotMachine_Internal(u8 arg0, MainCallback cb) +{ + struct Task *task = gTasks + CreateTask(SlotMachineDummyTask, 0xFF); + task->data[0] = arg0; + StoreWordInTwoHalfwords(task->data + 1, (intptr_t)cb); +} + +static void sub_81019EC(void) +{ + struct Task *task = gTasks + FindTaskIdByFunc(SlotMachineDummyTask); + eSlotMachine->unk01 = task->data[0]; + LoadWordFromTwoHalfwords((u16 *)(task->data + 1), (u32 *)&eSlotMachine->prevMainCb); +} + +static void SlotMachineDummyTask(u8 taskId) +{ +} + +static void SlotMachineSetup_0_0(void) +{ + SetVBlankCallback(NULL); + SetHBlankCallback(NULL); + REG_DISPCNT = 0; +} + +static void SlotMachineSetup_6_2(void) +{ + u16 imeBak; + SetVBlankCallback(SlotMachine_VBlankCallback); + imeBak = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = imeBak; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON; +} + +static void SlotMachineSetup_1_0(void) +{ + DmaClearLarge16(3, (u16 *)(BG_VRAM), BG_VRAM_SIZE, 0x1000); +} + +static void SlotMachineSetup_2_0(void) +{ + DmaClear16(3, (u16 *)OAM, OAM_SIZE); +} + +static void SlotMachineSetup_2_1(void) +{ + REG_BG0CNT = 0; + REG_BG1CNT = 0; + REG_BG2CNT = 0; + REG_BG3CNT = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_SCREENBASE(31) | BGCNT_CHARBASE(2); + REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(28); + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(29); + REG_BG3CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(30); + REG_WININ = 0x3f; + REG_WINOUT = 0x3f; + REG_BLDCNT = BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_OBJ; + REG_BLDALPHA = 0x809; +} + +static const s16 gUnknown_083ECCF8[][2]; + +#if DEBUG +__attribute__((naked)) +static void SlotMachineSetup_0_1(void) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + mov r7, sl\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5, r6, r7}\n\ + bl sub_81019EC\n\ + ldr r5, ._43 @ \n\ + mov r4, #0x0\n\ + strb r4, [r5]\n\ + strb r4, [r5, #0x2]\n\ + bl Random\n\ + mov r1, #0x1\n\ + and r1, r1, r0\n\ + strb r1, [r5, #0x3]\n\ + strb r4, [r5, #0x4]\n\ + mov r0, #0x0\n\ + strh r4, [r5, #0x8]\n\ + strb r0, [r5, #0xa]\n\ + strb r0, [r5, #0xb]\n\ + ldr r0, ._43 + 4 @ \n\ + ldr r1, ._43 + 8 @ \n\ + add r0, r0, r1\n\ + ldrh r0, [r0]\n\ + strh r0, [r5, #0xc]\n\ + strh r4, [r5, #0xe]\n\ + strh r4, [r5, #0x10]\n\ + strh r4, [r5, #0x12]\n\ + strh r4, [r5, #0x18]\n\ + mov r0, #0x8\n\ + strh r0, [r5, #0x1a]\n\ + add r1, r5, #0\n\ + add r1, r1, #0x58\n\ + mov r0, #0xf0\n\ + strh r0, [r1]\n\ + add r1, r1, #0x2\n\ + mov r0, #0xa0\n\ + strh r0, [r1]\n\ + add r0, r5, #0\n\ + add r0, r0, #0x5c\n\ + mov r1, #0x3f\n\ + strh r1, [r0]\n\ + add r0, r0, #0x2\n\ + strh r1, [r0]\n\ + bl GetCurrentMapMusic\n\ + add r1, r5, #0\n\ + add r1, r1, #0x60\n\ + strh r0, [r1]\n\ + mov r7, #0x0\n\ + add r6, r5, #0\n\ + ldr r2, ._43 + 12 @ \n\ + mov sl, r2\n\ + mov r0, #0x1c\n\ + add r0, r0, r6\n\ + mov r9, r0\n\ +._41:\n\ + lsl r5, r7, #0x1\n\ + mov r1, #0x22\n\ + add r1, r1, r6\n\ + mov r8, r1\n\ + add r1, r5, r1\n\ + mov r0, #0x0\n\ + strh r0, [r1]\n\ + add r4, r6, #0\n\ + add r4, r4, #0x28\n\ + add r4, r5, r4\n\ + ldrb r0, [r6, #0x3]\n\ + lsl r0, r0, #0x1\n\ + lsl r1, r7, #0x2\n\ + add r0, r0, r1\n\ + add r0, r0, sl\n\ + mov r2, #0x0\n\ + ldsh r0, [r0, r2]\n\ + mov r1, #0x15\n\ + bl __modsi3\n\ + strh r0, [r4]\n\ + add r5, r5, r9\n\ + mov r1, #0x0\n\ + ldsh r0, [r4, r1]\n\ + lsl r1, r0, #0x1\n\ + add r1, r1, r0\n\ + lsl r1, r1, #0x3\n\ + mov r2, #0xfc\n\ + lsl r2, r2, #0x1\n\ + add r0, r2, #0\n\ + sub r0, r0, r1\n\ + strh r0, [r5]\n\ + mov r1, #0x0\n\ + ldsh r0, [r5, r1]\n\ + add r1, r2, #0\n\ + bl __modsi3\n\ + strh r0, [r5]\n\ + add r0, r7, #1\n\ + lsl r0, r0, #0x18\n\ + lsr r7, r0, #0x18\n\ + cmp r7, #0x2\n\ + bls ._41 @cond_branch\n\ + bl debug_sub_811B5D0\n\ + ldr r0, ._43 + 16 @ \n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._42 @cond_branch\n\ + mov r1, r8\n\ + sub r1, r1, #0x22\n\ + mov r0, #0xfa\n\ + lsl r0, r0, #0x2\n\ + strh r0, [r1, #0xc]\n\ +._42:\n\ + pop {r3, r4, r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov sl, r5\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._44:\n\ + .align 2, 0\n\ +._43:\n\ + .word +0x2000000\n\ + .word gSaveBlock1\n\ + .word 0x494\n\ + .word gUnknown_083ECCF8\n\ + .word unk_debug_bss_1_1"); +} +#else +static void SlotMachineSetup_0_1(void) +{ + u8 i; + + sub_81019EC(); + eSlotMachine->state = 0; + eSlotMachine->pikaPower = 0; + eSlotMachine->unk03 = Random() & 1; + eSlotMachine->unk04 = 0; + eSlotMachine->matchedSymbols = 0; + eSlotMachine->unk0A = 0; + eSlotMachine->unk0B = 0; + eSlotMachine->coins = gSaveBlock1.coins; + eSlotMachine->payout = 0; + eSlotMachine->unk10 = 0; + eSlotMachine->bet = 0; + eSlotMachine->unk18 = 0; + eSlotMachine->unk1A = 8; + eSlotMachine->win0h = 0xf0; + eSlotMachine->win0v = 0xa0; + eSlotMachine->winIn = 0x3f; + eSlotMachine->winOut = 0x3f; + eSlotMachine->backupMapMusic = GetCurrentMapMusic(); + for (i = 0; i < 3; i++) + { + eSlotMachine->unk22[i] = 0; + eSlotMachine->reelPositions[i] = gUnknown_083ECCF8[i][eSlotMachine->unk03] % 21; + eSlotMachine->unk1C[i] = 0x1f8 - eSlotMachine->reelPositions[i] * 24; + eSlotMachine->unk1C[i] %= 0x1f8; + } +} +#endif + +static void SlotMachineSetup_3_0(void) +{ + Text_LoadWindowTemplate(&gWindowTemplate_81E7128); + InitMenuWindow(&gWindowTemplate_81E7128); +} + +static void SlotMachineSetup_4_0(void) +{ + ResetPaletteFade(); + ResetSpriteData(); + gOamLimit = 128; + FreeAllSpritePalettes(); + ResetTasks(); +} + +static void SlotMachineSetup_5_0(void) +{ + sub_8106448(); + sub_81064B8(); + sub_81063C0(); +} + +static void SlotMachineSetup_6_0(void) +{ + sub_8104EA8(); + sub_8104F8C(); + sub_8103DC8(); + sub_81050C4(); +} + +static void SlotMachineSetup_6_1(void) +{ + sub_8104048(); + sub_8102DA8(); + sub_8104C5C(); + sub_8101D04(); +} + +static void sub_8101D04(void) +{ + sub_8101D24(CreateTask(sub_8101D24, 0)); +} + +static bool8 (*const gUnknown_083ECAAC[])(struct Task *task) = +{ + sub_8101D5C, + sub_8101D8C, + sub_8101DB0, + sub_8101DF4, + sub_8101E10, + sub_8101E3C, + sub_8101F44, + sub_8101F60, + sub_8101F88, + sub_8101FA4, + sub_8102008, + sub_8102034, + sub_8102058, + sub_8102090, + sub_81020C8, + sub_81021E0, + sub_81021FC, + sub_8102264, + sub_81022A0, + sub_81022CC, + sub_81022F0, + sub_8102318, + sub_8102344, + sub_810239C, + sub_81023B8, + sub_81023E0, + sub_81023FC, + sub_8102424, + sub_8102460, +#if DEBUG + debug_sub_8116E74, +#endif +}; + +static void sub_8101D24(u8 taskId) +{ + while (gUnknown_083ECAAC[eSlotMachine->state](gTasks + taskId)); +} + +static bool8 sub_8101D5C(struct Task *task) +{ + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + sub_810423C(eSlotMachine->pikaPower); + eSlotMachine->state++; + return FALSE; +} + +static bool8 sub_8101D8C(struct Task *task) +{ + if (!gPaletteFade.active) + { + eSlotMachine->state++; + } + return FALSE; +} + +static bool8 sub_8101DB0(struct Task *task) +{ + eSlotMachine->payout = 0; + eSlotMachine->bet = 0; + eSlotMachine->unk18 = 0; + eSlotMachine->unk04 &= 0xc0; + eSlotMachine->state = 4; + if (eSlotMachine->coins <= 0) + { + eSlotMachine->state = 25; + } + else if (eSlotMachine->unk0A) + { + eSlotMachine->state = 3; + sub_8104CAC(4); + } + return TRUE; +} + +static bool8 sub_8101DF4(struct Task *task) +{ + if (sub_8104E18()) + { + eSlotMachine->state = 4; + } + return FALSE; +} + +#if DEBUG +__attribute__((naked)) +static bool8 sub_8101E10(struct Task *task) +{ + asm("\ + push {lr}\n\ + mov r0, #0x0\n\ + bl sub_8104CAC\n\ + ldr r2, ._70 @ \n\ + mov r0, #0x5\n\ + strb r0, [r2]\n\ + ldr r0, ._70 + 4 @ \n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._67 @cond_branch\n\ + ldr r0, ._70 + 8 @ \n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + bne ._69 @cond_branch\n\ +._67:\n\ + mov r0, #0xc\n\ + ldsh r1, [r2, r0]\n\ + ldr r0, ._70 + 12 @ \n\ + cmp r1, r0\n\ + ble ._69 @cond_branch\n\ + mov r0, #0x17\n\ + strb r0, [r2]\n\ +._69:\n\ + mov r0, #0x1\n\ + pop {r1}\n\ + bx r1\n\ +._71:\n\ + .align 2, 0\n\ +._70:\n\ + .word +0x2000000\n\ + .word unk_debug_bss_1_1\n\ + .word unk_debug_bss_1_4\n\ + .word 0x270e"); +} +#else +static bool8 sub_8101E10(struct Task *task) +{ + sub_8104CAC(0); + eSlotMachine->state = 5; + if (eSlotMachine->coins >= 9999) + { + eSlotMachine->state = 23; + } + return TRUE; +} +#endif + +#if DEBUG +__attribute__((naked)) +static bool8 sub_8101E3C(struct Task *task) +{ + asm("\ + push {r4, r5, lr}\n\ + ldr r0, ._77 @ unk_debug_bss_1_1\n\ + ldrb r1, [r0]\n\ + add r3, r0, #0\n\ + ldr r5, ._77 + 4 @ gMain\n\ + cmp r1, #0\n\ + beq ._76 @cond_branch\n\ + ldr r2, ._77 + 8 @ unk_debug_bss_1_4\n\ + ldrb r0, [r2]\n\ + cmp r0, #0\n\ + beq ._76 @cond_branch\n\ + ldr r4, ._77 + 12 @ \n\ + mov r1, #0xc\n\ + ldsh r0, [r4, r1]\n\ + cmp r0, #0x3\n\ + ble ._74 @cond_branch\n\ + ldrh r1, [r5, #0x2c]\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._75 @cond_branch\n\ +._74:\n\ + mov r0, #0x0\n\ + strb r0, [r2]\n\ + b ._76\n\ +._78:\n\ + .align 2, 0\n\ +._77:\n\ + .word unk_debug_bss_1_1\n\ + .word gMain\n\ + .word unk_debug_bss_1_4\n\ + .word +0x2000000\n\ +._75:\n\ + mov r0, #0x0\n\ + bl sub_8103D50\n\ + mov r0, #0x1\n\ + bl sub_8103D50\n\ + mov r0, #0x2\n\ + bl sub_8103D50\n\ + ldrh r0, [r4, #0xc]\n\ + sub r0, r0, #0x3\n\ + strh r0, [r4, #0xc]\n\ + mov r0, #0x3\n\ + strh r0, [r4, #0x12]\n\ + mov r0, #0x9\n\ + strb r0, [r4]\n\ + b ._102\n\ +._76:\n\ + ldrb r0, [r3]\n\ + cmp r0, #0\n\ + beq ._81 @cond_branch\n\ + ldrh r1, [r5, #0x2e]\n\ + mov r0, #0x8\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._81 @cond_branch\n\ + bl debug_sub_811B620\n\ + ldr r1, ._83 @ \n\ + mov r0, #0x1d\n\ + strb r0, [r1]\n\ + b ._102\n\ +._84:\n\ + .align 2, 0\n\ +._83:\n\ + .word +0x2000000\n\ +._81:\n\ + ldrh r1, [r5, #0x2e]\n\ + mov r0, #0x4\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._85 @cond_branch\n\ + mov r0, #0x0\n\ + bl sub_8104AB8\n\ + ldr r1, ._87 @ \n\ + mov r0, #0x8\n\ + strb r0, [r1]\n\ + b ._102\n\ +._88:\n\ + .align 2, 0\n\ +._87:\n\ + .word +0x2000000\n\ +._85:\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._89 @cond_branch\n\ + ldr r2, ._94 @ \n\ + mov r3, #0xc\n\ + ldsh r0, [r2, r3]\n\ + sub r0, r0, #0x3\n\ + mov r3, #0x12\n\ + ldsh r1, [r2, r3]\n\ + add r0, r0, r1\n\ + cmp r0, #0\n\ + blt ._90 @cond_branch\n\ + ldrh r4, [r2, #0x12]\n\ + add r0, r1, #0\n\ + cmp r0, #0x2\n\ + bgt ._91 @cond_branch\n\ +._92:\n\ + lsl r0, r4, #0x18\n\ + lsr r0, r0, #0x18\n\ + bl sub_8103D50\n\ + lsl r0, r4, #0x10\n\ + mov r2, #0x80\n\ + lsl r2, r2, #0x9\n\ + add r0, r0, r2\n\ + lsr r4, r0, #0x10\n\ + asr r0, r0, #0x10\n\ + cmp r0, #0x2\n\ + ble ._92 @cond_branch\n\ +._91:\n\ + ldr r1, ._94 @ \n\ + ldrh r0, [r1, #0xc]\n\ + sub r0, r0, #0x3\n\ + ldrh r3, [r1, #0x12]\n\ + add r0, r0, r3\n\ + strh r0, [r1, #0xc]\n\ + mov r0, #0x3\n\ + strh r0, [r1, #0x12]\n\ + mov r0, #0x9\n\ + strb r0, [r1]\n\ + mov r0, #0x5f\n\ + bl PlaySE\n\ + b ._102\n\ +._95:\n\ + .align 2, 0\n\ +._94:\n\ + .word +0x2000000\n\ +._90:\n\ + mov r0, #0x6\n\ + b ._96\n\ +._89:\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._98 @cond_branch\n\ + ldr r4, ._103 @ \n\ + mov r1, #0xc\n\ + ldsh r0, [r4, r1]\n\ + cmp r0, #0\n\ + beq ._98 @cond_branch\n\ + mov r0, #0x5f\n\ + bl PlaySE\n\ + ldrb r0, [r4, #0x12]\n\ + bl sub_8103D50\n\ + ldrh r0, [r4, #0xc]\n\ + sub r0, r0, #0x1\n\ + strh r0, [r4, #0xc]\n\ + ldrh r0, [r4, #0x12]\n\ + add r0, r0, #0x1\n\ + strh r0, [r4, #0x12]\n\ +._98:\n\ + ldr r0, ._103 @ \n\ + mov r2, #0x12\n\ + ldsh r1, [r0, r2]\n\ + add r2, r0, #0\n\ + ldr r5, ._103 + 4 @ \n\ + cmp r1, #0x2\n\ + bgt ._99 @cond_branch\n\ + cmp r1, #0\n\ + beq ._101 @cond_branch\n\ + ldrh r1, [r5, #0x2e]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._101 @cond_branch\n\ +._99:\n\ + mov r0, #0x9\n\ + strb r0, [r2]\n\ +._101:\n\ + ldrh r1, [r5, #0x2e]\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._102 @cond_branch\n\ + mov r0, #0x15\n\ +._96:\n\ + strb r0, [r2]\n\ +._102:\n\ + mov r0, #0x0\n\ + pop {r4, r5}\n\ + pop {r1}\n\ + bx r1\n\ +._104:\n\ + .align 2, 0\n\ +._103:\n\ + .word +0x2000000\n\ + .word gMain"); +} +#else +static bool8 sub_8101E3C(struct Task *task) +{ + s16 i; + + if (gMain.newKeys & SELECT_BUTTON) + { + sub_8104AB8(0); + eSlotMachine->state = 8; + } + else if (gMain.newKeys & R_BUTTON) + { + if (eSlotMachine->coins - (3 - eSlotMachine->bet) >= 0) + { + for (i = eSlotMachine->bet; i < 3; i++) + { + sub_8103D50(i); + } + eSlotMachine->coins -= (3 - eSlotMachine->bet); + eSlotMachine->bet = 3; + eSlotMachine->state = 9; + PlaySE(SE_REGI); + } + else + { + eSlotMachine->state = 6; + } + } + else + { + if (gMain.newKeys & DPAD_DOWN && eSlotMachine->coins != 0) + { + PlaySE(SE_REGI); + sub_8103D50(eSlotMachine->bet); + eSlotMachine->coins--; + eSlotMachine->bet++; + } + if (eSlotMachine->bet >= 3 || (eSlotMachine->bet != 0 && gMain.newKeys & A_BUTTON)) + { + eSlotMachine->state = 9; + } + if (gMain.newKeys & B_BUTTON) + { + eSlotMachine->state = 21; + } + } + return FALSE; +} +#endif + +static void sub_8101F2C(const u8 *str) +{ + Menu_DisplayDialogueFrame(); + Menu_PrintText(str, 2, 15); +} + +static bool8 sub_8101F44(struct Task *task) +{ + sub_8101F2C(gOtherText_DontHaveThreeCoins); + eSlotMachine->state = 7; + return FALSE; +} + +static bool8 sub_8101F60(struct Task *task) +{ + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + Menu_EraseScreen(); + eSlotMachine->state = 5; + } + return FALSE; +} + +static bool8 sub_8101F88(struct Task *task) +{ + if (sub_8104AEC()) + { + eSlotMachine->state = 5; + } + return FALSE; +} + +#if DEBUG +__attribute__((naked)) +static bool8 sub_8101FA4(struct Task *task) +{ + asm("\ + push {r4, lr}\n\ + add r4, r0, #0\n\ + bl sub_8102484\n\ + bl sub_8104DA4\n\ + mov r0, #0x0\n\ + bl sub_8102DEC\n\ + mov r0, #0x1\n\ + bl sub_8102DEC\n\ + mov r0, #0x2\n\ + bl sub_8102DEC\n\ + mov r0, #0x0\n\ + strh r0, [r4, #0x8]\n\ + ldr r4, ._115 @ \n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x20\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._113 @cond_branch\n\ + bl sub_810430C\n\ + mov r0, #0xa\n\ + b ._114\n\ +._116:\n\ + .align 2, 0\n\ +._115:\n\ + .word +0x2000000\n\ +._113:\n\ + mov r0, #0x1\n\ + bl sub_8104CAC\n\ + mov r0, #0xb\n\ +._114:\n\ + strb r0, [r4]\n\ + ldr r4, ._119 @ \n\ + mov r0, #0x8\n\ + strh r0, [r4, #0x1a]\n\ + ldrb r0, [r4, #0xa]\n\ + cmp r0, #0\n\ + beq ._117 @cond_branch\n\ + bl dp15_jump_random_unknown\n\ + strh r0, [r4, #0x1a]\n\ +._117:\n\ + ldr r0, ._119 + 4 @ \n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._118 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x68\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._118:\n\ + mov r0, #0x0\n\ + pop {r4}\n\ + pop {r1}\n\ + bx r1\n\ +._120:\n\ + .align 2, 0\n\ +._119:\n\ + .word +0x2000000\n\ + .word unk_debug_bss_1_1"); +} +#else +static bool8 sub_8101FA4(struct Task *task) +{ + sub_8102484(); + sub_8104DA4(); + sub_8102DEC(0); + sub_8102DEC(1); + sub_8102DEC(2); + task->data[0] = 0; + if (eSlotMachine->unk04 & 0x20) + { + sub_810430C(); + eSlotMachine->state = 10; + } + else + { + sub_8104CAC(1); + eSlotMachine->state = 11; + } + eSlotMachine->unk1A = 8; + if (eSlotMachine->unk0A) + { + eSlotMachine->unk1A = dp15_jump_random_unknown(); + } + return FALSE; +} +#endif + +static bool8 sub_8102008(struct Task *task) +{ + if (sub_810432C()) + { + sub_8104CAC(1); + eSlotMachine->unk04 &= 0xDF; + eSlotMachine->state = 11; + } + return FALSE; +} + +#if DEBUG +__attribute__((naked)) +static bool8 sub_8102034(struct Task *task) +{ + asm("\ + push {r4, lr}\n\ + ldrh r1, [r0, #0x8]\n\ + add r1, r1, #0x1\n\ + strh r1, [r0, #0x8]\n\ + lsl r1, r1, #0x10\n\ + asr r1, r1, #0x10\n\ + cmp r1, #0x1d\n\ + ble ._124 @cond_branch\n\ + ldr r0, ._127 @ unk_debug_bss_1_1\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._126 @cond_branch\n\ + ldr r0, ._127 + 4 @ unk_debug_bss_1_4\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._126 @cond_branch\n\ + ldr r4, ._127 + 8 @ unk_debug_bss_1_8\n\ + bl Random\n\ + mov r1, #0x1f\n\ + and r1, r1, r0\n\ + add r1, r1, #0x1\n\ + str r1, [r4]\n\ +._126:\n\ + bl sub_81024F0\n\ + ldr r1, ._127 + 12 @ \n\ + mov r0, #0xc\n\ + strb r0, [r1]\n\ +._124:\n\ + mov r0, #0x0\n\ + pop {r4}\n\ + pop {r1}\n\ + bx r1\n\ +._128:\n\ + .align 2, 0\n\ +._127:\n\ + .word unk_debug_bss_1_1\n\ + .word unk_debug_bss_1_4\n\ + .word unk_debug_bss_1_8\n\ + .word +0x2000000"); +} +#else +static bool8 sub_8102034(struct Task *task) +{ + if (++task->data[0] >= 30) + { + sub_81024F0(); + eSlotMachine->state = 12; + } + return FALSE; +} +#endif + +#if DEBUG +__attribute__((naked)) +static bool8 sub_8102058(struct Task *task) +{ + asm("\ + push {r4, r5, lr}\n\ + ldr r0, ._133 @ unk_debug_bss_1_1\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._130 @cond_branch\n\ + ldr r0, ._133 + 4 @ unk_debug_bss_1_4\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._130 @cond_branch\n\ + ldr r5, ._133 + 8 @ unk_debug_bss_1_8\n\ + ldr r0, [r5]\n\ + sub r0, r0, #0x1\n\ + str r0, [r5]\n\ + cmp r0, #0\n\ + bne ._135 @cond_branch\n\ + mov r0, #0x18\n\ + bl PlaySE\n\ + ldr r4, ._133 + 12 @ \n\ + ldrb r0, [r4, #0x18]\n\ + bl sub_8102E1C\n\ + ldrb r0, [r4, #0x18]\n\ + bl sub_8103C14\n\ + bl Random\n\ + mov r1, #0x1f\n\ + and r1, r1, r0\n\ + add r1, r1, #0x1\n\ + str r1, [r5]\n\ + b ._132\n\ +._134:\n\ + .align 2, 0\n\ +._133:\n\ + .word unk_debug_bss_1_1\n\ + .word unk_debug_bss_1_4\n\ + .word unk_debug_bss_1_8\n\ + .word +0x2000000\n\ +._130:\n\ + ldr r0, ._136 @ gMain\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._135 @cond_branch\n\ + mov r0, #0x18\n\ + bl PlaySE\n\ + ldr r4, ._136 + 4 @ \n\ + ldrb r0, [r4, #0x18]\n\ + bl sub_8102E1C\n\ + ldrb r0, [r4, #0x18]\n\ + bl sub_8103C14\n\ +._132:\n\ + mov r0, #0xd\n\ + strb r0, [r4]\n\ +._135:\n\ + mov r0, #0x0\n\ + pop {r4, r5}\n\ + pop {r1}\n\ + bx r1\n\ +._137:\n\ + .align 2, 0\n\ +._136:\n\ + .word gMain\n\ + .word +0x2000000"); +} +#else +static bool8 sub_8102058(struct Task *task) +{ + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_JYUNI); + sub_8102E1C(eSlotMachine->unk18); + sub_8103C14(eSlotMachine->unk18); + eSlotMachine->state = 13; + } + return FALSE; +} +#endif + +#if DEBUG +__attribute__((naked)) +static bool8 sub_8102090(struct Task *task) +{ + asm("\ + push {r4, lr}\n\ + ldr r4, ._146 @ \n\ + ldrb r0, [r4, #0x18]\n\ + bl sub_8102E40\n\ + lsl r0, r0, #0x18\n\ + lsr r2, r0, #0x18\n\ + cmp r2, #0\n\ + bne ._138 @cond_branch\n\ + ldrh r0, [r4, #0x18]\n\ + add r0, r0, #0x1\n\ + strh r0, [r4, #0x18]\n\ + mov r1, #0xc\n\ + strb r1, [r4]\n\ + lsl r0, r0, #0x10\n\ + asr r0, r0, #0x10\n\ + cmp r0, #0x2\n\ + ble ._161 @cond_branch\n\ + mov r0, #0xe\n\ + strb r0, [r4]\n\ + ldr r0, ._146 + 4 @ \n\ + ldrb r0, [r0]\n\ + cmp r0, #0x8\n\ + beq ._140 @cond_branch\n\ + cmp r0, #0x8\n\ + bgt ._141 @cond_branch\n\ + cmp r0, #0x2\n\ + beq ._142 @cond_branch\n\ + cmp r0, #0x2\n\ + bgt ._143 @cond_branch\n\ + cmp r0, #0x1\n\ + beq ._144 @cond_branch\n\ + b ._161\n\ +._147:\n\ + .align 2, 0\n\ +._146:\n\ + .word +0x2000000\n\ + .word unk_debug_bss_1_0\n\ +._143:\n\ + cmp r0, #0x4\n\ + beq ._148 @cond_branch\n\ + b ._161\n\ +._141:\n\ + cmp r0, #0x40\n\ + beq ._150 @cond_branch\n\ + cmp r0, #0x40\n\ + bgt ._151 @cond_branch\n\ + cmp r0, #0x10\n\ + beq ._152 @cond_branch\n\ + b ._161\n\ +._151:\n\ + cmp r0, #0x80\n\ + beq ._154 @cond_branch\n\ + b ._161\n\ +._142:\n\ + mov r0, #0x14\n\ + strh r0, [r4, #0x28]\n\ + strh r0, [r4, #0x2a]\n\ + mov r0, #0x12\n\ + b ._160\n\ +._144:\n\ + mov r0, #0x14\n\ + strh r0, [r4, #0x28]\n\ + strh r0, [r4, #0x2a]\n\ + mov r0, #0x12\n\ + b ._160\n\ +._148:\n\ + mov r0, #0x3\n\ + strh r0, [r4, #0x28]\n\ + mov r0, #0x1\n\ + strh r0, [r4, #0x2a]\n\ + mov r0, #0x2\n\ + b ._160\n\ +._140:\n\ + strh r2, [r4, #0x28]\n\ + mov r0, #0x2\n\ + strh r0, [r4, #0x2a]\n\ + mov r0, #0x3\n\ + b ._160\n\ +._152:\n\ + mov r0, #0x2\n\ + strh r0, [r4, #0x28]\n\ + mov r0, #0x5\n\ + strh r0, [r4, #0x2a]\n\ + mov r0, #0x14\n\ + b ._160\n\ +._150:\n\ + mov r0, #0x13\n\ + strh r0, [r4, #0x28]\n\ + strh r0, [r4, #0x2a]\n\ + strh r2, [r4, #0x2c]\n\ + b ._161\n\ +._154:\n\ + mov r0, #0x13\n\ + strh r0, [r4, #0x28]\n\ + strh r0, [r4, #0x2a]\n\ +._160:\n\ + strh r0, [r4, #0x2c]\n\ +._161:\n\ + mov r0, #0x1\n\ + b ._162\n\ +._138:\n\ + mov r0, #0x0\n\ +._162:\n\ + pop {r4}\n\ + pop {r1}\n\ + bx r1"); +} +#else +static bool8 sub_8102090(struct Task *task) +{ + if (!sub_8102E40(eSlotMachine->unk18)) + { + eSlotMachine->unk18++; + eSlotMachine->state = 12; + if (eSlotMachine->unk18 > 2) + { + eSlotMachine->state = 14; + } + return TRUE; + } + return FALSE; +} +#endif + +#if DEBUG +__attribute__((naked)) +bool8 sub_81020C8(struct Task *task) +{ + asm("\ + push {r4, lr}\n\ + ldr r4, ._165 @ \n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0xc0\n\ + and r0, r0, r1\n\ + strb r0, [r4, #0x4]\n\ + bl CheckMatch\n\ + ldrb r0, [r4, #0xa]\n\ + cmp r0, #0\n\ + beq ._163 @cond_branch\n\ + sub r0, r0, #0x1\n\ + strb r0, [r4, #0xa]\n\ + ldrb r0, [r4, #0xb]\n\ + add r0, r0, #0x1\n\ + strb r0, [r4, #0xb]\n\ + b ._164\n\ +._166:\n\ + .align 2, 0\n\ +._165:\n\ + .word +0x2000000\n\ +._163:\n\ + bl debug_sub_811B894\n\ +._164:\n\ + ldr r4, ._171 @ \n\ + ldrh r0, [r4, #0x8]\n\ + cmp r0, #0\n\ + beq ._167 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x6c\n\ + mov r2, #0xe\n\ + ldsh r1, [r4, r2]\n\ + bl debug_sub_811B5B4\n\ + mov r0, #0xf\n\ + strb r0, [r4]\n\ + bl sub_8102A24\n\ + bl sub_8103F70\n\ + ldrh r0, [r4, #0x10]\n\ + ldrh r1, [r4, #0xe]\n\ + sub r0, r0, r1\n\ + strh r0, [r4, #0x10]\n\ + lsl r0, r0, #0x10\n\ + cmp r0, #0\n\ + bge ._168 @cond_branch\n\ + mov r0, #0x0\n\ + strh r0, [r4, #0x10]\n\ +._168:\n\ + ldrh r1, [r4, #0x8]\n\ + mov r0, #0xc0\n\ + lsl r0, r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._169 @cond_branch\n\ + ldr r0, ._171 + 4 @ \n\ + bl PlayFanfare\n\ + mov r0, #0x6\n\ + bl sub_8104CAC\n\ + b ._174\n\ +._172:\n\ + .align 2, 0\n\ +._171:\n\ + .word +0x2000000\n\ + .word 0x185\n\ +._169:\n\ + mov r0, #0x40\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._173 @cond_branch\n\ + ldr r0, ._175 @ 0x185\n\ + bl PlayFanfare\n\ + mov r0, #0x5\n\ + bl sub_8104CAC\n\ + b ._174\n\ +._176:\n\ + .align 2, 0\n\ +._175:\n\ + .word 0x185\n\ +._173:\n\ + mov r0, #0xc3\n\ + lsl r0, r0, #0x1\n\ + bl PlayFanfare\n\ + mov r0, #0x2\n\ + bl sub_8104CAC\n\ +._174:\n\ + ldr r1, ._183 @ \n\ + ldrh r3, [r1, #0x8]\n\ + mov r0, #0xe0\n\ + lsl r0, r0, #0x1\n\ + and r0, r0, r3\n\ + add r2, r1, #0\n\ + cmp r0, #0\n\ + beq ._179 @cond_branch\n\ + ldrb r1, [r2, #0x4]\n\ + mov r0, #0x3f\n\ + and r0, r0, r1\n\ + mov r1, #0x0\n\ + strb r0, [r2, #0x4]\n\ + mov r0, #0xc0\n\ + lsl r0, r0, #0x1\n\ + and r0, r0, r3\n\ + cmp r0, #0\n\ + beq ._179 @cond_branch\n\ + strb r1, [r2, #0xa]\n\ + strb r1, [r2, #0xb]\n\ + strb r1, [r2, #0x3]\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x1\n\ + and r0, r0, r3\n\ + cmp r0, #0\n\ + beq ._179 @cond_branch\n\ + mov r0, #0x1\n\ + strb r0, [r2, #0x3]\n\ +._179:\n\ + ldrh r1, [r2, #0x8]\n\ + mov r0, #0x20\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._185 @cond_branch\n\ + ldrb r0, [r2, #0x2]\n\ + cmp r0, #0xf\n\ + bhi ._185 @cond_branch\n\ + add r0, r0, #0x1\n\ + strb r0, [r2, #0x2]\n\ + ldrb r0, [r2, #0x2]\n\ + bl sub_8104064\n\ + b ._185\n\ +._184:\n\ + .align 2, 0\n\ +._183:\n\ + .word +0x2000000\n\ +._167:\n\ + mov r0, #0x3\n\ + bl sub_8104CAC\n\ + mov r0, #0x14\n\ + strb r0, [r4]\n\ + ldrh r0, [r4, #0x12]\n\ + ldrh r1, [r4, #0x10]\n\ + add r0, r0, r1\n\ + strh r0, [r4, #0x10]\n\ + lsl r0, r0, #0x10\n\ + asr r0, r0, #0x10\n\ + ldr r1, ._186 @ 0x270f\n\ + cmp r0, r1\n\ + ble ._185 @cond_branch\n\ + strh r1, [r4, #0x10]\n\ +._185:\n\ + mov r0, #0x0\n\ + pop {r4}\n\ + pop {r1}\n\ + bx r1\n\ +._187:\n\ + .align 2, 0\n\ +._186:\n\ + .word 0x270f"); +} +#else +bool8 sub_81020C8(struct Task *task) +{ + eSlotMachine->unk04 &= 0xc0; + CheckMatch(); + if (eSlotMachine->unk0A) + { + eSlotMachine->unk0A--; + eSlotMachine->unk0B++; + } + if (eSlotMachine->matchedSymbols) + { + eSlotMachine->state = 15; + sub_8102A24(); + sub_8103F70(); + if ((eSlotMachine->unk10 -= eSlotMachine->payout) < 0) + { + eSlotMachine->unk10 = 0; + } + if (eSlotMachine->matchedSymbols & ((1 << SLOT_MACHINE_MATCHED_777_BLUE) | (1 << SLOT_MACHINE_MATCHED_777_RED))) + { + PlayFanfare(BGM_ME_B_BIG); + sub_8104CAC(6); + } + else if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_777_MIXED)) + { + PlayFanfare(BGM_ME_B_BIG); + sub_8104CAC(5); + } + else + { + PlayFanfare(BGM_ME_B_SMALL); + sub_8104CAC(2); + } + if (eSlotMachine->matchedSymbols & ((1 << SLOT_MACHINE_MATCHED_777_MIXED) | (1 << SLOT_MACHINE_MATCHED_777_BLUE) | (1 << SLOT_MACHINE_MATCHED_777_RED))) + { + eSlotMachine->unk04 &= 0x3f; + if (eSlotMachine->matchedSymbols & ((1 << SLOT_MACHINE_MATCHED_777_BLUE) | (1 << SLOT_MACHINE_MATCHED_777_RED))) + { + eSlotMachine->unk0A = 0; + eSlotMachine->unk0B = 0; + eSlotMachine->unk03 = 0; + if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_777_BLUE)) + { + eSlotMachine->unk03 = 1; + } + } + } + if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_POWER) && eSlotMachine->pikaPower < 16) + { + eSlotMachine->pikaPower++; + sub_8104064(eSlotMachine->pikaPower); + } + } + else + { + sub_8104CAC(3); + eSlotMachine->state = 20; + if ((eSlotMachine->unk10 += eSlotMachine->bet) > 9999) + { + eSlotMachine->unk10 = 9999; + } + } + return FALSE; +} +#endif + +static bool8 sub_81021E0(struct Task *task) +{ + if (sub_8102A44()) + { + eSlotMachine->state = 16; + } + return FALSE; +} + +static bool8 sub_81021FC(struct Task *task) +{ + if (sub_8103FA0()) + { + eSlotMachine->state = 19; + if (eSlotMachine->matchedSymbols & ((1 << SLOT_MACHINE_MATCHED_777_RED) | (1 << SLOT_MACHINE_MATCHED_777_BLUE))) + { + IncrementGameStat(GAME_STAT_SLOT_JACKPOTS); + } + if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_REPLAY)) + { + eSlotMachine->unk18 = 0; + eSlotMachine->state = 9; + } + if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_POWER)) + { + eSlotMachine->state = 17; + } + if (eSlotMachine->unk0A && eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_REPLAY)) + { + sub_8104CAC(4); + eSlotMachine->state = 18; + } + } + return FALSE; +} + +static bool8 sub_8102264(struct Task *task) +{ + if (!sub_81040C8()) + { + eSlotMachine->state = 19; + if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_REPLAY)) + { + eSlotMachine->state = 9; + if (eSlotMachine->unk0A) + { + sub_8104CAC(4); + eSlotMachine->state = 18; + } + } + } + return FALSE; +} + +static bool8 sub_81022A0(struct Task *task) +{ + if (sub_8104E18()) + { + eSlotMachine->state = 19; + if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_REPLAY)) + { + eSlotMachine->state = 9; + } + } + return FALSE; +} + +static bool8 sub_81022CC(struct Task *task) +{ + sub_8103D8C(0); + sub_8103D8C(1); + sub_8103D8C(2); + eSlotMachine->state = 2; + return FALSE; +} + +static bool8 sub_81022F0(struct Task *task) +{ + if (++task->data[1] > 64) + { + task->data[1] = 0; + eSlotMachine->state = 19; + } + return FALSE; +} + +static bool8 sub_8102318(struct Task *task) +{ + sub_8101F2C(gOtherText_QuitGamePrompt); + DisplayYesNoMenu(21, 7, 1); + sub_814AB84(); + eSlotMachine->state = 22; + return FALSE; +} + +static bool8 sub_8102344(struct Task *task) +{ + s8 input = Menu_ProcessInputNoWrap_(); + if (input == 0) + { + Menu_EraseScreen(); + sub_8103D8C(0); + sub_8103D8C(1); + sub_8103D8C(2); + eSlotMachine->coins += eSlotMachine->bet; + eSlotMachine->state = 27; + } + else if (input == 1 || input == -1) + { + Menu_EraseScreen(); + eSlotMachine->state = 5; + } + return FALSE; +} + +static bool8 sub_810239C(struct Task *task) +{ + sub_8101F2C(gOtherText_MaxCoins); + eSlotMachine->state = 24; + return FALSE; +} + +static bool8 sub_81023B8(struct Task *task) +{ + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + Menu_EraseScreen(); + eSlotMachine->state = 5; + } + return FALSE; +} + +static bool8 sub_81023E0(struct Task *task) +{ + sub_8101F2C(gOtherText_OutOfCoins); + eSlotMachine->state = 26; + return FALSE; +} + +static bool8 sub_81023FC(struct Task *task) +{ + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + Menu_EraseScreen(); + eSlotMachine->state = 27; + } + return FALSE; +} + +#if DEBUG +__attribute__((naked)) +static bool8 sub_8102424(struct Task *task) +{ + asm("\ + push {lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r0, ._234 @ unk_debug_bss_1_1\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + bne ._233 @cond_branch\n\ + ldr r0, ._234 + 4 @ gSaveBlock1\n\ + ldr r1, ._234 + 8 @ \n\ + ldrh r1, [r1, #0xc]\n\ + ldr r2, ._234 + 12 @ \n\ + add r0, r0, r2\n\ + strh r1, [r0]\n\ +._233:\n\ + mov r0, #0x1\n\ + neg r0, r0\n\ + mov r1, #0x0\n\ + str r1, [sp]\n\ + mov r2, #0x0\n\ + mov r3, #0x10\n\ + bl BeginNormalPaletteFade\n\ + ldr r1, ._234 + 8 @ \n\ + ldrb r0, [r1]\n\ + add r0, r0, #0x1\n\ + strb r0, [r1]\n\ + mov r0, #0x0\n\ + add sp, sp, #0x4\n\ + pop {r1}\n\ + bx r1\n\ +._235:\n\ + .align 2, 0\n\ +._234:\n\ + .word unk_debug_bss_1_1\n\ + .word gSaveBlock1\n\ + .word +0x2000000\n\ + .word 0x494"); +} +#else +static bool8 sub_8102424(struct Task *task) +{ + gSaveBlock1.coins = eSlotMachine->coins; + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + eSlotMachine->state++; + return FALSE; +} +#endif + +static bool8 sub_8102460(struct Task *task) +{ + if (!gPaletteFade.active) + { + SetMainCallback2(eSlotMachine->prevMainCb); + } + return FALSE; +} + +#if DEBUG +__attribute__((naked)) +static bool8 debug_sub_8116E74(struct Task *task) +{ + asm("\ + push {lr}\n\ + bl debug_sub_811B634\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._239 @cond_branch\n\ + ldr r1, ._240 @ \n\ + mov r0, #0x5\n\ + strb r0, [r1]\n\ +._239:\n\ + mov r0, #0x0\n\ + pop {r1}\n\ + bx r1\n\ +._241:\n\ + .align 2, 0\n\ +._240:\n\ + .word +0x2000000"); +} +#endif + +#if DEBUG +__attribute__((naked)) +static void sub_8102484(void) +{ + asm("\ + push {r4, r5, r6, lr}\n\ + ldr r0, ._256 @ \n\ + ldrb r2, [r0, #0xa]\n\ + add r4, r0, #0\n\ + cmp r2, #0\n\ + beq ._242 @cond_branch\n\ + b ._270\n\ +._242:\n\ + ldr r0, ._256 + 4 @ \n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._245 @cond_branch\n\ + ldr r3, ._256 + 8 @ \n\ + ldrb r0, [r3]\n\ + cmp r0, #0\n\ + beq ._245 @cond_branch\n\ + ldr r0, ._256 + 12 @ \n\ + ldrb r1, [r0]\n\ + strb r1, [r4, #0x4]\n\ + strb r2, [r3]\n\ + strb r2, [r0]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._246 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x88\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._246:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x40\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._247 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x84\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._247:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x20\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._248 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x8c\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._248:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x10\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._249 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x80\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._249:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x8\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._250 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x7c\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._250:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x4\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._251 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x78\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._251:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._252 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x74\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._252:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._253 @cond_branch\n\ + b ._270\n\ +._253:\n\ + add r0, r4, #0\n\ + add r0, r0, #0x70\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ + b ._270\n\ +._257:\n\ + .align 2, 0\n\ +._256:\n\ + .word +0x2000000\n\ + .word unk_debug_bss_1_1\n\ + .word unk_debug_bss_1_2\n\ + .word unk_debug_bss_1_3\n\ +._245:\n\ + add r5, r4, #0\n\ + ldrb r1, [r5, #0x4]\n\ + mov r0, #0xc0\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._270 @cond_branch\n\ + bl sub_8102540\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._260 @cond_branch\n\ + bl sub_8102578\n\ + lsl r0, r0, #0x18\n\ + lsr r6, r0, #0x18\n\ + cmp r6, #0x3\n\ + beq ._260 @cond_branch\n\ + ldr r1, ._271 @ gUnknown_083ECE42\n\ + lsl r0, r6, #0x1\n\ + add r0, r0, r1\n\ + ldrb r1, [r0]\n\ + ldrb r0, [r5, #0x4]\n\ + orr r0, r0, r1\n\ + strb r0, [r5, #0x4]\n\ + mov r1, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._261 @cond_branch\n\ + add r0, r5, #0\n\ + add r0, r0, #0x88\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._261:\n\ + ldrb r1, [r5, #0x4]\n\ + mov r0, #0x40\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._262 @cond_branch\n\ + add r0, r5, #0\n\ + add r0, r0, #0x84\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._262:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x20\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._263 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x8c\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._263:\n\ + cmp r6, #0x1\n\ + bne ._270 @cond_branch\n\ +._260:\n\ + bl sub_81025BC\n\ + lsl r0, r0, #0x18\n\ + lsr r6, r0, #0x18\n\ + cmp r6, #0x5\n\ + beq ._270 @cond_branch\n\ + ldr r4, ._271 + 4 @ \n\ + ldr r1, ._271 + 8 @ \n\ + lsl r0, r6, #0x1\n\ + add r0, r0, r1\n\ + ldrb r1, [r0]\n\ + ldrb r0, [r4, #0x4]\n\ + orr r0, r0, r1\n\ + strb r0, [r4, #0x4]\n\ + mov r1, #0x10\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._266 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x80\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._266:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x8\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._267 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x7c\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._267:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x4\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._268 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x78\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._268:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._269 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x74\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._269:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._270 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x70\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._270:\n\ + pop {r4, r5, r6}\n\ + pop {r0}\n\ + bx r0\n\ +._272:\n\ + .align 2, 0\n\ +._271:\n\ + .word gUnknown_083ECE42\n\ + .word +0x2000000\n\ + .word gUnknown_083ECE48"); +} +#else +static void sub_8102484(void) +{ + u8 r3; + + if (eSlotMachine->unk0A == 0 && !(eSlotMachine->unk04 & 0xc0)) + { + if (sub_8102540()) + { + r3 = sub_8102578(); + if (r3 != 3) + { + eSlotMachine->unk04 |= gUnknown_083ECE42[r3]; + if (r3 != 1) + { + return; + } + } + } + r3 = sub_81025BC(); + if (r3 != 5) + { + eSlotMachine->unk04 |= gUnknown_083ECE48[r3]; + } + } +} +#endif + +static void sub_81024F0(void) +{ + eSlotMachine->unk06 = 0; + if (eSlotMachine->unk04) + { + eSlotMachine->unk06 = 1; + } +} + +static u8 sub_810250C(u8 a0) +{ + u8 i; + + for (i = 0; i < 8; i++) + { + if (a0 & 1) + { + return gUnknown_083ECE3A[i]; + } + a0 >>= 1; + } + return 0; +} + +static bool8 sub_8102540(void) +{ + u8 rval = Random(); + if (gUnknown_083ECD04[eSlotMachine->unk01][eSlotMachine->bet - 1] > rval) + { + return TRUE; + } + return FALSE; +} + +static const u8 gUnknown_083ECD16[][6]; + +static u8 sub_8102578(void) +{ + s16 i; + + for (i = 0; i < 3; i++) + { + s16 rval = Random() & 0xff; + s16 value = gUnknown_083ECD16[i][eSlotMachine->unk01]; + if (value > rval) + { + break; + } + } + return i; +} + +static const u8 gUnknown_083ECD28[][6]; + +static u8 sub_81025BC(void) +{ + s16 i; + + for (i = 0; i < 5; i++) + { + s16 rval = Random() & 0xff; + s16 r3 = gUnknown_083ECD28[i][eSlotMachine->unk01]; + if (i == 0 && eSlotMachine->unk03 == 1) + { + r3 += 10; + if (r3 > 0x100) + { + r3 = 0x100; + } + } + else if (i == 4 && eSlotMachine->unk03 == 1) + { + r3 -= 10; + if (r3 < 0) + { + r3 = 0; + } + } + if (r3 > rval) + { + break; + } + } + return i; +} + +static const u8 gUnknown_083ECD46[][17]; +static const u8 gUnknown_083ECDAC[][17]; + +static u8 sub_810264C(u8 a0) +{ + if (eSlotMachine->unk03 == 0) + { + return gUnknown_083ECD46[a0][eSlotMachine->pikaPower]; + } + return gUnknown_083ECDAC[a0][eSlotMachine->pikaPower]; +} + +static void sub_8102680(void) +{ + u8 rval; + s16 i; + + eSlotMachine->unk05 = 0; + rval = Random(); + if (rval < sub_810264C(0)) + { + return; + } + for (i = 5; i > 0; i--) + { + rval = Random(); + if (rval < sub_810264C(i)) + { + break; + } + } + eSlotMachine->unk05 = i; +} + +static const u16 gUnknown_083ECE12[]; + +static bool8 sub_81026DC(u16 a0) +{ + u16 rval = Random() & 0xff; + if (rval < gUnknown_083ECE12[a0]) + { + return TRUE; + } + return FALSE; +} + +static const u16 gUnknown_083ECE1C[][2]; +static const u16 gUnknown_083ECE30[]; + +static u16 dp15_jump_random_unknown(void) +{ + u8 r4 = 0; + u8 rval; + u8 value; + if (eSlotMachine->unk10 >= 300) + { + r4 = 4; + } + else if (eSlotMachine->unk10 >= 250) + { + r4 = 3; + } + else if (eSlotMachine->unk10 >= 200) + { + r4 = 2; + } + else if (eSlotMachine->unk10 >= 150) + { + r4 = 1; + } + rval = Random() % 100; + value = gUnknown_083ECE1C[r4][0]; + if (rval < value) + { + return 4; + } + rval = Random() % 100; + value = gUnknown_083ECE1C[r4][1] + gUnknown_083ECE30[eSlotMachine->unk0B]; + if (rval < value) + { + return 2; + } + return 8; +} + +static void CheckMatch(void) +{ + eSlotMachine->matchedSymbols = 0; + CheckMatch_CenterRow(); + if (eSlotMachine->bet > 1) + { + CheckMatch_TopAndBottom(); + } + if (eSlotMachine->bet > 2) + { + CheckMatch_Diagonals(); + } +} + +static const u16 sSlotMatchFlags[]; +static const u16 sSlotPayouts[]; + +static void CheckMatch_CenterRow(void) +{ + u8 c1, c2, c3, match; + + c1 = GetTagOfReelSymbolOnScreenAtPos(0, 2); + c2 = GetTagOfReelSymbolOnScreenAtPos(1, 2); + c3 = GetTagOfReelSymbolOnScreenAtPos(2, 2); + match = GetMatchFromSymbolsInRow(c1, c2, c3); + if (match != SLOT_MACHINE_MATCHED_NONE) + { + eSlotMachine->payout += sSlotPayouts[match]; + eSlotMachine->matchedSymbols |= sSlotMatchFlags[match]; + sub_8103E04(0); + } +} + +static void CheckMatch_TopAndBottom(void) +{ + u8 c1, c2, c3, match; + + c1 = GetTagOfReelSymbolOnScreenAtPos(0, 1); + c2 = GetTagOfReelSymbolOnScreenAtPos(1, 1); + c3 = GetTagOfReelSymbolOnScreenAtPos(2, 1); + match = GetMatchFromSymbolsInRow(c1, c2, c3); + if (match != SLOT_MACHINE_MATCHED_NONE) + { + if (match == SLOT_MACHINE_MATCHED_1CHERRY) + { + match = SLOT_MACHINE_MATCHED_2CHERRY; + } + eSlotMachine->payout += sSlotPayouts[match]; + eSlotMachine->matchedSymbols |= sSlotMatchFlags[match]; + sub_8103E04(1); + } + c1 = GetTagOfReelSymbolOnScreenAtPos(0, 3); + c2 = GetTagOfReelSymbolOnScreenAtPos(1, 3); + c3 = GetTagOfReelSymbolOnScreenAtPos(2, 3); + match = GetMatchFromSymbolsInRow(c1, c2, c3); + if (match != SLOT_MACHINE_MATCHED_NONE) + { + if (match == SLOT_MACHINE_MATCHED_1CHERRY) + { + match = SLOT_MACHINE_MATCHED_2CHERRY; + } + eSlotMachine->payout += sSlotPayouts[match]; + eSlotMachine->matchedSymbols |= sSlotMatchFlags[match]; + sub_8103E04(2); + } +} + +static void CheckMatch_Diagonals(void) +{ + u8 c1, c2, c3, match; + + c1 = GetTagOfReelSymbolOnScreenAtPos(0, 1); + c2 = GetTagOfReelSymbolOnScreenAtPos(1, 2); + c3 = GetTagOfReelSymbolOnScreenAtPos(2, 3); + match = GetMatchFromSymbolsInRow(c1, c2, c3); + if (match != SLOT_MACHINE_MATCHED_NONE) + { + if (match != SLOT_MACHINE_MATCHED_1CHERRY) + { + eSlotMachine->payout += sSlotPayouts[match]; + eSlotMachine->matchedSymbols |= sSlotMatchFlags[match]; + } + sub_8103E04(3); + } + c1 = GetTagOfReelSymbolOnScreenAtPos(0, 3); + c2 = GetTagOfReelSymbolOnScreenAtPos(1, 2); + c3 = GetTagOfReelSymbolOnScreenAtPos(2, 1); + match = GetMatchFromSymbolsInRow(c1, c2, c3); + if (match != SLOT_MACHINE_MATCHED_NONE) + { + if (match != SLOT_MACHINE_MATCHED_1CHERRY) + { + eSlotMachine->payout += sSlotPayouts[match]; + eSlotMachine->matchedSymbols |= sSlotMatchFlags[match]; + } + sub_8103E04(4); + } +} + +static const u8 sSym2Match[]; + +static u8 GetMatchFromSymbolsInRow(u8 c1, u8 c2, u8 c3) +{ + if (c1 == c2 && c1 == c3) + { + return sSym2Match[c1]; + } + if (c1 == SLOT_MACHINE_TAG_7_RED && c2 == SLOT_MACHINE_TAG_7_RED && c3 == SLOT_MACHINE_TAG_7_BLUE) + { + return SLOT_MACHINE_MATCHED_777_MIXED; + } + if (c1 == SLOT_MACHINE_TAG_7_BLUE && c2 == SLOT_MACHINE_TAG_7_BLUE && c3 == SLOT_MACHINE_TAG_7_RED) + { + return SLOT_MACHINE_MATCHED_777_MIXED; + } + if (c1 == SLOT_MACHINE_TAG_CHERRY) + { + return SLOT_MACHINE_MATCHED_1CHERRY; + } + return SLOT_MACHINE_MATCHED_NONE; +} + +static void sub_8102A24(void) +{ + sub_8102A64(CreateTask(sub_8102A64, 4)); +} + +static bool8 sub_8102A44(void) +{ + if (FindTaskIdByFunc(sub_8102A64) == 0xff) + { + return TRUE; + } + return FALSE; +} + +static bool8 (*const gUnknown_083ECB20[])(struct Task *task) = { + sub_8102A9C, + sub_8102AD0, + sub_8102B80 +}; + +static void sub_8102A64(u8 taskId) +{ + while (gUnknown_083ECB20[gTasks[taskId].data[0]](gTasks + taskId)); +} + +static bool8 sub_8102A9C(struct Task *task) +{ + if (sub_8103E38()) + { + task->data[0]++; + if (eSlotMachine->payout == 0) + { + task->data[0] = 2; + return TRUE; + } + } + return FALSE; +} + +static bool8 sub_8102AD0(struct Task *task) +{ + if (!task->data[1]--) + { + if (IsFanfareTaskInactive()) + { + PlaySE(SE_PIN); + } + eSlotMachine->payout--; + if (eSlotMachine->coins < 9999) + { + eSlotMachine->coins++; + } + task->data[1] = 8; + if (gMain.heldKeys & A_BUTTON) + { + task->data[1] = 4; + } + } + if (IsFanfareTaskInactive() && gMain.newKeys & START_BUTTON) + { + PlaySE(SE_PIN); + eSlotMachine->coins += eSlotMachine->payout; + if (eSlotMachine->coins > 9999) + { + eSlotMachine->coins = 9999; + } + eSlotMachine->payout = 0; + } + if (eSlotMachine->payout == 0) + { + task->data[0]++; + } + return FALSE; +} + +static bool8 sub_8102B80(struct Task *task) +{ + if (sub_8103E7C()) + { + DestroyTask(FindTaskIdByFunc(sub_8102A64)); + } + return FALSE; +} + +static const u8 sReelSymbols[][21]; + +static u8 GetTagOfReelSymbolOnScreenAtPos(u8 x, s16 y) +{ + s16 offset = (eSlotMachine->reelPositions[x] + y) % 21; + if (offset < 0) + { + offset += 21; + } + return sReelSymbols[x][offset]; +} + +static u8 GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(u8 x, s16 y) +{ + s16 r6 = 0; + if ((eSlotMachine->unk1C[x]) % 24) + r6 = -1; + return GetTagOfReelSymbolOnScreenAtPos(x, y + r6); +} + +static const u8 gUnknown_083ECCF1[]; + +static u8 sub_8102C48(s16 a0) +{ + s16 r1 = (eSlotMachine->unk16 + a0) % 6; + if (r1 < 0) + r1 += 6; + return gUnknown_083ECCF1[r1]; +} + +static void sub_8102C84(u8 a0, s16 a1) +{ + eSlotMachine->unk1C[a0] += a1; + eSlotMachine->unk1C[a0] %= 504; + eSlotMachine->reelPositions[a0] = 21 - eSlotMachine->unk1C[a0] / 24; +} + +static s16 sub_8102CCC(u8 a0, s16 a1) +{ + s16 r1 = eSlotMachine->unk1C[a0] % 24; + if (r1 != 0) + { + if (r1 < a1) + a1 = r1; + sub_8102C84(a0, a1); + r1 = eSlotMachine->unk1C[a0] % 24; + } + return r1; +} + +static void sub_8102D28(s16 a0) +{ + eSlotMachine->unk14 += a0; + eSlotMachine->unk14 %= 120; + eSlotMachine->unk16 = 6 - eSlotMachine->unk14 / 20; +} + +static s16 sub_8102D5C(s16 a0) +{ + s16 r1 = eSlotMachine->unk14 % 20; + if (r1 != 0) + { + if (r1 < a0) + a0 = r1; + sub_8102D28(a0); + r1 = eSlotMachine->unk14 % 20; + } + return r1; +} + +static void sub_8102DA8(void) +{ + u8 i; + for (i = 0; i < 3; i++) + { + u8 taskId = CreateTask(sub_8102E68, 2); + gTasks[taskId].data[15] = i; + eSlotMachine->reelTasks[i] = taskId; + sub_8102E68(taskId); + } +} + +static void sub_8102DEC(u8 a0) +{ + gTasks[eSlotMachine->reelTasks[a0]].data[0] = 1; + gTasks[eSlotMachine->reelTasks[a0]].data[14] = 1; +} + +static void sub_8102E1C(u8 a0) +{ + gTasks[eSlotMachine->reelTasks[a0]].data[0] = 2; +} + +static bool8 sub_8102E40(u8 a0) +{ + return gTasks[eSlotMachine->reelTasks[a0]].data[14]; +} + +static bool8 (*const gUnknown_083ECB2C[])(struct Task *task) = { + sub_8102EA0, + sub_8102EA4, + sub_8102EC0, + sub_8102F4C, + sub_8103008 +}; + +static void sub_8102E68(u8 taskId) +{ + while (gUnknown_083ECB2C[gTasks[taskId].data[0]](gTasks + taskId)); +} + +static bool8 sub_8102EA0(struct Task *task) +{ + return FALSE; +} + +static bool8 sub_8102EA4(struct Task *task) +{ + sub_8102C84(task->data[15], eSlotMachine->unk1A); + return FALSE; +} + +static bool8 (*const gUnknown_083ECB40[])(void) = { + sub_810305C, + sub_81032C0, + sub_81033DC +}; +static void (*const gUnknown_083ECB4C[])(void) = { + sub_81034F4, + sub_8103540, + sub_810380C +}; + +static bool8 sub_8102EC0(struct Task *task) +{ + task->data[0]++; + eSlotMachine->unk34[task->data[15]] = 0; + eSlotMachine->unk2E[task->data[15]] = 0; + if (eSlotMachine->unk0A == 0 && (eSlotMachine->unk04 == 0 || eSlotMachine->unk06 == 0 || !gUnknown_083ECB40[task->data[15]]())) + { + eSlotMachine->unk06 = 0; + gUnknown_083ECB4C[task->data[15]](); + } + task->data[1] = eSlotMachine->unk2E[task->data[15]]; + return TRUE; +} + +static bool8 sub_8102F4C(struct Task *task) +{ + u16 sp[] = {2, 4, 4, 4, 8}; + s16 r2 = eSlotMachine->unk1C[task->data[15]] % 24; + if (r2 != 0) + { + r2 = sub_8102CCC(task->data[15], eSlotMachine->unk1A); + } + else if (eSlotMachine->unk2E[task->data[15]]) + { + eSlotMachine->unk2E[task->data[15]]--; + sub_8102C84(task->data[15], eSlotMachine->unk1A); + r2 = eSlotMachine->unk1C[task->data[15]] % 24; + } + if (r2 == 0 && eSlotMachine->unk2E[task->data[15]] == 0) + { + task->data[0]++; + task->data[1] = sp[task->data[1]]; + task->data[2] = 0; + } + return FALSE; +} + +static bool8 sub_8103008(struct Task *task) +{ + eSlotMachine->unk22[task->data[15]] = task->data[1]; + task->data[1] = -task->data[1]; + task->data[2]++; + if ((task->data[2] & 0x3) == 0) + { + task->data[1] >>= 1; + } + if (task->data[1] == 0) + { + task->data[0] = 0; + task->data[14] = 0; + eSlotMachine->unk22[task->data[15]] = 0; + } + return FALSE; +} + +static bool8 (*const gUnknown_083ECB64[])(u8 a0, u8 a1) = { + sub_8103154, + sub_81031B4, + sub_81031B4 +}; + +static bool8 sub_810305C(void) +{ + u8 r3 = sub_810250C(eSlotMachine->unk04); + u8 r5 = r3; + if (eSlotMachine->unk04 & 0xc0) + { + r5 = 0; + r3 = 1; + } + return gUnknown_083ECB64[eSlotMachine->bet - 1](r5, r3); +} + +static bool8 sub_81030A4(s16 y, u8 tag1, u8 tag2) +{ + u8 tag = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, y); + if (tag == tag1 || tag == tag2) + { + eSlotMachine->unk07 = tag; + return TRUE; + } + return FALSE; +} + +static bool8 sub_81030E0(s16 y) +{ + if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 1 - y) == 4 || GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 2 - y) == 4 || GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 3 - y) == 4) + { + return TRUE; + } + return FALSE; +} + +static bool8 sub_8103134(void) +{ + if (eSlotMachine->unk04 & 0xc2) + { + return TRUE; + } + return FALSE; +} + +static bool8 sub_8103154(u8 a0, u8 a1) +{ + s16 i; + + for (i = 0; i < 5; i++) + { + if (sub_81030A4(2 - i, a0, a1)) + { + eSlotMachine->unk34[0] = 2; + eSlotMachine->unk2E[0] = i; + return TRUE; + } + } + return FALSE; +} + +static bool8 sub_81031B4(u8 tag1, u8 tag2) +{ + s16 i; + bool8 r6 = sub_8103134(); + if (r6 || !sub_81030E0(0)) + { + for (i = 1; i < 4; i++) + { + if (sub_81030A4(i, tag1, tag2)) + { + eSlotMachine->unk34[0] = i; + eSlotMachine->unk2E[0] = 0; + return TRUE; + } + } + } + for (i = 1; i < 5; i++) + { + bool8 r7 = r6; + if (r7 || !sub_81030E0(i)) + { + if (sub_81030A4(1 - i, tag1, tag2)) + { + if (i == 1 && (r7 || !sub_81030E0(3))) + { + eSlotMachine->unk34[0] = 3; + eSlotMachine->unk2E[0] = 3; + return TRUE; + } + if (i < 4 && (r7 || !sub_81030E0(i + 1))) + { + eSlotMachine->unk34[0] = 2; + eSlotMachine->unk2E[0] = i + 1; + return TRUE; + } + eSlotMachine->unk34[0] = 1; + eSlotMachine->unk2E[0] = i; + return TRUE; + } + } + } + return FALSE; +} + +static bool8 (*const gUnknown_083ECB70[])(void) = { + sub_81032E8, + sub_81032E8, + sub_810333C +}; + +static bool8 sub_81032C0(void) +{ + return gUnknown_083ECB70[eSlotMachine->bet - 1](); +} + +static bool8 sub_81032E8(void) +{ + s16 i; + s16 unk34_0 = eSlotMachine->unk34[0]; + + for (i = 0; i < 5; i++) + { + if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, unk34_0 - i) == eSlotMachine->unk07) + { + eSlotMachine->unk34[1] = unk34_0; + eSlotMachine->unk2E[1] = i; + return TRUE; + } + } + return FALSE; +} + +static bool8 sub_810333C(void) +{ + s16 i; + if (sub_81032E8()) + { + if (eSlotMachine->unk34[0] != 2 && eSlotMachine->unk2E[1] > 1 && eSlotMachine->unk2E[1] != 4) + { + for (i = 0; i < 5; i++) + { + if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - i) == eSlotMachine->unk07) + { + eSlotMachine->unk34[1] = 2; + eSlotMachine->unk2E[1] = i; + break; + } + } + } + return TRUE; + } + if (eSlotMachine->unk34[0] != 2) + { + for (i = 0; i < 5; i++) + { + if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - i) == eSlotMachine->unk07) + { + eSlotMachine->unk34[1] = 2; + eSlotMachine->unk2E[1] = i; + return TRUE; + } + } + } + return FALSE; +} + +static bool8 (*const gUnknown_083ECB7C[])(u8 a0) = { + sub_810341C, + sub_810341C, + sub_810347C +}; + +static bool8 sub_81033DC(void) +{ + u8 r3 = eSlotMachine->unk07; + if (eSlotMachine->unk04 & 0x40) + { + r3 = 0; + if (eSlotMachine->unk07 == 0) + { + r3 = 1; + } + } + return gUnknown_083ECB7C[eSlotMachine->bet - 1](r3); +} + +static bool8 sub_810341C(u8 a0) +{ + s16 i; + s16 unk34_1 = eSlotMachine->unk34[1]; + + for (i = 0; i < 5; i++) + { + if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, unk34_1 - i) == a0) + { + eSlotMachine->unk34[2] = unk34_1; + eSlotMachine->unk2E[2] = i; + return TRUE; + } + } + return FALSE; +} + +static bool8 sub_810347C(u8 a0) +{ + s16 i; + s16 r8; + if (eSlotMachine->unk34[0] == eSlotMachine->unk34[1]) + { + return sub_810341C(a0); + } + r8 = 1; + if (eSlotMachine->unk34[0] == 1) + { + r8 = 3; + } + for (i = 0; i < 5; i++) + { + if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, r8 - i) == a0) + { + eSlotMachine->unk2E[2] = i; + eSlotMachine->unk34[2] = r8; + return TRUE; + } + } + return FALSE; +} + +static void sub_81034F4(void) +{ + s16 i; + for (i = 0; sub_81030E0(i); i++); + eSlotMachine->unk2E[0] = i; +} + +static bool8 sub_8103520(u8 *a0) +{ + if (*a0 == 0) + { + *a0 = 1; + return TRUE; + } + if (*a0 == 1) + { + *a0 = 0; + return TRUE; + } + return FALSE; +} + +static void (*const gUnknown_083ECB88[])(void) = { + sub_8103564, + j5_08111E84, + sub_8103668 +}; + +static void sub_8103540(void) +{ + gUnknown_083ECB88[eSlotMachine->bet - 1](); +} + +static void sub_8103564(void) +{ + if (eSlotMachine->unk34[0] != 0 && eSlotMachine->unk04 & 0x80) + { + u8 sp0 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 2 - eSlotMachine->unk2E[0]); + if (sub_8103520(&sp0)) + { + s16 i; + for (i = 0; i < 5; i++) + { + if (sp0 == GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - i)) + { + eSlotMachine->unk34[1] = 2; + eSlotMachine->unk2E[1] = i; + break; + } + } + } + } +} + +static void j5_08111E84(void) +{ + if (eSlotMachine->unk34[0] != 0 && eSlotMachine->unk04 & 0x80) + { + u8 sp0 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, eSlotMachine->unk34[0] - eSlotMachine->unk2E[0]); + if (sub_8103520(&sp0)) + { + s16 i; + for (i = 0; i < 5; i++) + { + if (sp0 == GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, eSlotMachine->unk34[0] - i)) + { + eSlotMachine->unk34[1] = eSlotMachine->unk34[0]; + eSlotMachine->unk2E[1] = i; + break; + } + } + } + } +} + +static void sub_8103668(void) +{ + s16 i; + s16 j; + if (eSlotMachine->unk34[0] != 0 && eSlotMachine->unk04 & 0x80) + { + if (eSlotMachine->unk34[0] == 2) + { + j5_08111E84(); + } + else + { + u8 sp0 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, eSlotMachine->unk34[0] - eSlotMachine->unk2E[0]); + if (sub_8103520(&sp0)) + { + j = 2; + if (eSlotMachine->unk34[0] == 3) + j = 3; + for (i = 0; i < 2; i++, j--) + { + if (sp0 == GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, j)) + { + eSlotMachine->unk34[1] = j; + eSlotMachine->unk2E[1] = 0; + return; + } + } + for (j = 1; j < 5; j++) + { + if (sp0 == GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, eSlotMachine->unk34[0] - j)) + { + if (eSlotMachine->unk34[0] == 1) + { + if (j < 3) + { + eSlotMachine->unk34[1] = 2; + eSlotMachine->unk2E[1] = j + 1; + } + else + { + eSlotMachine->unk34[1] = 1; + eSlotMachine->unk2E[1] = j; + } + } + else + { + if (j < 3) + { + eSlotMachine->unk34[1] = 3; + eSlotMachine->unk2E[1] = j; + } + else + { + eSlotMachine->unk34[1] = 2; + eSlotMachine->unk2E[1] = j - 1; + } + } + return; + } + } + } + } + } +} + +static bool8 sub_8103764(u8 a0, u8 a1) +{ + if ((a0 == 0 && a1 == 1) || (a0 == 1 && a1 == 0)) + { + return TRUE; + } + return FALSE; +} + +static bool8 sub_810378C(u8 a0, u8 a1, u8 a2) +{ + if ((a0 == 0 && a1 == 1 && a2 == 0) || (a0 == 1 && a1 == 0 && a2 == 1)) + { + return TRUE; + } + return FALSE; +} + +static bool8 sub_81037BC(u8 a0, u8 a1, u8 a2) +{ + if ((a0 == 0 && a1 == 1 && a2 == 0) || + (a0 == 1 && a1 == 0 && a2 == 1) || + (a0 == 0 && a1 == 0 && a2 == 1) || + (a0 == 1 && a1 == 1 && a2 == 0) || + (a0 == a1 && a0 == a2)) + { + return FALSE; + } + return TRUE; +} + +static void (*const gUnknown_083ECB94[])(void) = { + sub_8103830, + sub_8103910, + sub_8103A78 +}; + +static void sub_810380C(void) +{ + gUnknown_083ECB94[eSlotMachine->bet - 1](); +} + +static void sub_8103830(void) +{ + s16 i = 0; + u8 r5 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 2 - eSlotMachine->unk2E[0]); + u8 r1 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - eSlotMachine->unk2E[1]); + if (r5 == r1) + { + while (1) + { + u8 r0; + if (!(r5 == (r0 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 2 - i)) || (r5 == 0 && r0 == 1) || (r5 == 1 && r0 == 0))) + { + break; + } + i++; + } + } + else if (sub_8103764(r5, r1)) + { + if (eSlotMachine->unk04 & 0x80) + { + for (i = 0; i < 5; i++) + { + if (r5 == GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 2 - i)) + { + eSlotMachine->unk2E[2] = i; + return; + } + } + } + i = 0; + while (1) + { + if (r5 != GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 2 - i)) + { + break; + } + i++; + } + } + eSlotMachine->unk2E[2] = i; +} -extern u16 gUnknown_08E95AB8[]; -extern u16 gUnknown_08E95FB8[]; +static void sub_8103910(void) +{ + s16 sp0 = 0; + s16 i; + u8 r7; + u8 r6; + u8 r4; + + if (eSlotMachine->unk34[1] != 0 && eSlotMachine->unk34[0] == eSlotMachine->unk34[1] && eSlotMachine->unk04 & 0x80) + { + r7 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, eSlotMachine->unk34[0] - eSlotMachine->unk2E[0]); + r6 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, eSlotMachine->unk34[1] - eSlotMachine->unk2E[1]); + if (sub_8103764(r7, r6)) + { + for (i = 0; i < 5; i++) + { + r4 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, eSlotMachine->unk34[1] - i); + if (r7 == r4) + { + sp0 = i; + break; + } + } + } + } + while (1) + { + s16 r8; + for (i = 1, r8 = 0; i < 4; i++) + { + r7 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, i - eSlotMachine->unk2E[0]); + r6 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, i - eSlotMachine->unk2E[1]); + r4 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, i - sp0); + if (!sub_81037BC(r7, r6, r4) && (!sub_810378C(r7, r6, r4) || !(eSlotMachine->unk04 & 0x80))) + { + r8++; + break; + } + } + if (r8 == 0) + { + break; + } + sp0++; + } + eSlotMachine->unk2E[2] = sp0; +} + +static void sub_8103A78(void) +{ + u8 r6; + u8 r5; + u8 r4; + s16 r8; + s16 i; + + sub_8103910(); + if (eSlotMachine->unk34[1] != 0 && eSlotMachine->unk34[0] != eSlotMachine->unk34[1] && eSlotMachine->unk04 & 0x80) + { + r6 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, eSlotMachine->unk34[0] - eSlotMachine->unk2E[0]); + r5 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, eSlotMachine->unk34[1] - eSlotMachine->unk2E[1]); + if (sub_8103764(r6, r5)) + { + r8 = 1; + if (eSlotMachine->unk34[0] == 1) + r8 = 3; + for (i = 0; i < 5; i++) + { + r4 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, r8 - (eSlotMachine->unk2E[2] + i)); + if (r6 == r4) + { + eSlotMachine->unk2E[2] += i; + break; + } + } + } + } + while (1) + { + r6 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 1 - eSlotMachine->unk2E[0]); + r5 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - eSlotMachine->unk2E[1]); + r4 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 3 - eSlotMachine->unk2E[2]); + if (sub_81037BC(r6, r5, r4) || (sub_810378C(r6, r5, r4) && eSlotMachine->unk04 & 0x80)) + break; + eSlotMachine->unk2E[2]++; + } + while (1) + { + r6 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 3 - eSlotMachine->unk2E[0]); + r5 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - eSlotMachine->unk2E[1]); + r4 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 1 - eSlotMachine->unk2E[2]); + if (sub_81037BC(r6, r5, r4) || (sub_810378C(r6, r5, r4) && eSlotMachine->unk04 & 0x80)) + break; + eSlotMachine->unk2E[2]++; + } +} + +static void sub_8103C14(u8 a0) +{ + u8 taskId = CreateTask(sub_8103C48, 5); + gTasks[taskId].data[15] = a0; + sub_8103C48(taskId); +} + +static void (*const gUnknown_083ECBA0[])(struct Task *task, u8 taskId) = { + sub_8103C78, + sub_8103CAC, + sub_8103CC8 +}; + +static void sub_8103C48(u8 taskId) +{ + gUnknown_083ECBA0[gTasks[taskId].data[0]](gTasks + taskId, taskId); +} + +static const s16 gUnknown_083ECBAC[] = {5, 10, 15}; + +static void sub_8103C78(struct Task *task, u8 taskId) +{ + sub_81065A8(gUnknown_083ECBAC[task->data[15]], 0x62, 0x63, 0x72, 0x73); + task->data[0]++; +} + +static void sub_8103CAC(struct Task *task, u8 taskId) +{ + if (++task->data[1] > 11) + task->data[0]++; +} + +static void sub_8103CC8(struct Task *task, u8 taskId) +{ + sub_81065A8(gUnknown_083ECBAC[task->data[15]], 0x42, 0x43, 0x52, 0x53); + DestroyTask(taskId); +} + +static const u16 *const gUnknown_083EDD08[]; +static const u16 *const gUnknown_083EDD1C[]; +static const u8 gUnknown_083EDD30[]; + +static void sub_8103D00(u8 a0) +{ + LoadPalette(gUnknown_083EDD08[a0], gUnknown_083EDD30[a0], 2); +} + +static void sub_8103D28(u8 a0) +{ + LoadPalette(gUnknown_083EDD1C[a0], gUnknown_083EDD30[a0], 2); +} + +static const u8 gUnknown_083EDD35[][2]; +static const u8 gUnknown_083EDD3B[]; + +static void sub_8103D50(u8 a0) +{ + u8 i; + for (i = 0; i < gUnknown_083EDD3B[a0]; i++) + { + sub_8103D00(gUnknown_083EDD35[a0][i]); + } +} + +static void sub_8103D8C(u8 a0) +{ + u8 i; + for (i = 0; i < gUnknown_083EDD3B[a0]; i++) + { + sub_8103D28(gUnknown_083EDD35[a0][i]); + } +} + +static void sub_8103DC8(void) +{ + u8 i; + for (i = 0; i < 5; i++) + { + u8 spriteId = CreateInvisibleSprite(sub_8103EE4); + gSprites[spriteId].data[0] = i; + eSlotMachine->unk44[i] = spriteId; + } +} + +static void sub_8103E04(u8 a0) +{ + struct Sprite *sprite = gSprites + eSlotMachine->unk44[a0]; + sprite->data[1] = 1; + sprite->data[2] = 4; + sprite->data[3] = 0; + sprite->data[4] = 0; + sprite->data[5] = 2; + sprite->data[7] = 0; +} + +static bool8 sub_8103E38(void) +{ + u8 i; + for (i = 0; i < 5; i++) + { + struct Sprite *sprite = gSprites + eSlotMachine->unk44[i]; + if (sprite->data[1] && sprite->data[2]) + return FALSE; + } + return TRUE; +} + +static bool8 sub_8103E7C(void) +{ + u8 i; + for (i = 0; i < 5; i++) + { + if (!sub_8103EAC(eSlotMachine->unk44[i])) + return FALSE; + } + return TRUE; +} + +static bool8 sub_8103EAC(u8 spriteId) +{ + struct Sprite *sprite = gSprites + spriteId; + if (!sprite->data[1]) + return TRUE; + if (sprite->data[7]) + sprite->data[1] = 0; + return sprite->data[7]; +} + +static void sub_8103EE4(struct Sprite *sprite) +{ + s16 r4; + if (sprite->data[1]) + { + if (!sprite->data[3]--) + { + sprite->data[7] = 0; + sprite->data[3] = 1; + sprite->data[4] += sprite->data[5]; + r4 = 4; + if (sprite->data[2]) + r4 = 8; + if (sprite->data[4] <= 0) + { + sprite->data[7] = 1; + sprite->data[5] = -sprite->data[5]; + if (sprite->data[2]) + sprite->data[2]--; + } + else if (sprite->data[4] >= r4) + sprite->data[5] = -sprite->data[5]; + if (sprite->data[2]) + sprite->data[3] <<= 1; + } + MultiplyPaletteRGBComponents(gUnknown_083EDD30[sprite->data[0]], sprite->data[4], sprite->data[4], sprite->data[4]); + } +} + +static void sub_8103F70(void) +{ + u8 taskId = CreateTask(sub_8103FE8, 6); + gTasks[taskId].data[3] = 1; + sub_8103FE8(taskId); +} + +static const u16 *const gUnknown_083EDDA0[]; +static const u16 *const gUnknown_083EDDAC; + +static bool8 sub_8103FA0(void) +{ + u8 taskId = FindTaskIdByFunc(sub_8103FE8); + if (!gTasks[taskId].data[2]) + { + DestroyTask(taskId); + LoadPalette(gUnknown_083EDDAC, 0x10, 0x20); + return TRUE; + } + return FALSE; +} + +static void sub_8103FE8(u8 taskId) +{ + struct Task *task = gTasks + taskId; + if (!task->data[1]--) + { + task->data[1] = 4; + task->data[2] += task->data[3]; + if (task->data[2] == 0 || task->data[2] == 2) + { + task->data[3] = -task->data[3]; + } + } + LoadPalette(gUnknown_083EDDA0[task->data[2]], 0x10, 0x20); +} + +static void sub_8104048(void) +{ + eSlotMachine->unk3E = CreateTask(sub_81040E8, 8); +} + +static void sub_8104064(u8 pikaPower) +{ + struct Task *task = gTasks + eSlotMachine->unk3E; + sub_810421C(task); + task->data[0] = 1; + task->data[1]++; + task->data[15] = 1; +} + +static void sub_8104098(void) +{ + struct Task *task = gTasks + eSlotMachine->unk3E; + sub_810421C(task); + task->data[0] = 3; + task->data[15] = 1; +} + +static bool8 sub_81040C8(void) +{ + return gTasks[eSlotMachine->unk3E].data[15]; +} + +static void (*const gUnknown_083ECBB4[])(struct Task *task) = { + nullsub_68, + sub_810411C, + sub_8104144, + sub_81041AC +}; + +static void sub_81040E8(u8 taskId) +{ + gUnknown_083ECBB4[gTasks[taskId].data[0]](gTasks + taskId); +} + +static void nullsub_68(struct Task *task) +{ + +} + +static void sub_810411C(struct Task *task) +{ + task->data[2] = sub_8105B1C((task->data[1] << 3) + 20, 20); + task->data[0]++; +} + +static const u16 gUnknown_083ECBC4[][2] = { + {0x9e, 0x6e}, + {0x9f, 0x6f}, + {0xaf, 0x7f} +}; + +static void sub_8104144(struct Task *task) +{ + u16 *vaddr = (u16 *)BG_SCREEN_ADDR(29); + if (gSprites[task->data[2]].data[7]) + { + s16 r2 = task->data[1] + 2; + u8 r0 = 0; + if (task->data[1] == 1) + r0 = 1; + else if (task->data[1] == 16) + r0 = 2; + vaddr[r2 + 0x40] = gUnknown_083ECBC4[r0][0]; + sub_8105B88(task->data[2]); + task->data[0] = 0; + task->data[15] = 0; + } +} + +static void sub_81041AC(struct Task *task) +{ + u16 *vaddr = (u16 *)BG_SCREEN_ADDR(29); + s16 r4 = task->data[1] + 2; + u8 r2 = 0; + if (task->data[1] == 1) + r2 = 1; + else if (task->data[1] == 16) + r2 = 2; + if (task->data[2] == 0) + { + vaddr[r4 + 0x40] = gUnknown_083ECBC4[r2][1]; + task->data[1]--; + } + if (++task->data[2] >= 20) + task->data[2] = 0; + if (task->data[1] == 0) + { + task->data[0] = 0; + task->data[15] = 0; + } +} + +static void sub_810421C(struct Task *task) +{ + u8 i; + + for (i = 2; i < 16; i++) + task->data[i] = 0; +} + +static void sub_810423C(u8 pikaPower) +{ + s16 i; + u8 r3; + s16 r2 = 3; + u16 *vaddr = (u16 *)BG_SCREEN_ADDR(29); + for (i = 0; i < pikaPower; i++, r2++) + { + r3 = 0; + if (i == 0) + r3 = 1; + else if (i == 15) + r3 = 2; + vaddr[r2 + 0x40] = gUnknown_083ECBC4[r3][0]; + } + for (; i < 16; i++, r2++) + { + r3 = 0; + if (i == 0) + r3 = 1; + else if (i == 15) + r3 = 2; + vaddr[r2 + 0x40] = gUnknown_083ECBC4[r3][1]; + } + gTasks[eSlotMachine->unk3E].data[1] = pikaPower; +} + +static void sub_810430C(void) +{ + u8 taskId = CreateTask(sub_810434C, 7); + sub_810434C(taskId); +} + +static bool8 sub_810432C(void) +{ + if (FindTaskIdByFunc(sub_810434C) == 0xFF) + return TRUE; + return FALSE; +} + +static void (*const gUnknown_083ECBD0[])(struct Task *task) = { + sub_810437C, + sub_81043EC, + sub_8104468, + sub_8104498, + sub_8104548, + sub_8104598, + sub_81045CC, + sub_810463C, + sub_81046C0, + sub_8104764, + sub_8104794, + sub_81047EC, + sub_8104860, + sub_81048A8, + sub_81048CC, + sub_8104940, + sub_81049C8, + sub_8104794, + sub_81049F8 +}; + +static void sub_810434C(u8 taskId) +{ + gUnknown_083ECBD0[gTasks[taskId].data[0]](gTasks + taskId); +} + +static void sub_810437C(struct Task *task) +{ + eSlotMachine->unk0A = 0; + eSlotMachine->unk14 = 0; + eSlotMachine->unk16 = 0; + task->data[0]++; + task->data[1] = 0; + task->data[2] = 30; + task->data[4] = 1280; + gSpriteCoordOffsetX = 0; + gSpriteCoordOffsetY = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + sub_8104A40(30, 0); + sub_81051C0(); + sub_8105100(); + sub_81052EC(); + sub_81053A0(); + sub_810545C(); + sub_8102680(); + StopMapMusic(); + PlayNewMapMusic(BGM_BD_TIME); +} + +static void sub_81043EC(struct Task *task) +{ + s16 r3; + gSpriteCoordOffsetX -= 8; + task->data[1] += 8; + r3 = ((task->data[1] + 240) & 0xff) >> 3; + REG_BG1HOFS = task->data[1] & 0x1ff; + if (r3 != task->data[2] && task->data[3] <= 18) + { + task->data[2] = r3; + task->data[3] = task->data[1] >> 3; + sub_8104A40(r3, task->data[3]); + } + if (task->data[1] >= 200) + { + task->data[0]++; + task->data[3] = 0; + } + sub_8102D28(task->data[4] >> 8); +} + +static void sub_8104468(struct Task *task) +{ + sub_8102D28(task->data[4] >> 8); + if (++task->data[5] >= 60) + { + task->data[0]++; + sub_8105578(); + sub_81056F0(); + } +} + +static void sub_8104498(struct Task *task) +{ + int r5; + u8 sp0[] = {1, 1, 2, 2}; + s16 sp4[] = {0x40, 0x30, 0x18, 0x08}; + s16 spC[] = {10, 8, 6, 4}; + + sub_8102D28(task->data[4] >> 8); + task->data[4] -= 4; + r5 = 4 - (task->data[4] >> 8); + sub_8105688(sp4[r5]); + sub_81057E8(spC[r5]); + StartSpriteAnimIfDifferent(gSprites + eSlotMachine->unk3F, sp0[r5]); + if (task->data[4] <= 0x100) + { + task->data[0]++; + task->data[4] = 0x100; + task->data[5] = 0; + } +} + +static void sub_8104548(struct Task *task) +{ + sub_8102D28(task->data[4] >> 8); + if (++task->data[5] >= 80) + { + task->data[0]++; + task->data[5] = 0; + sub_81057E8(2); + StartSpriteAnimIfDifferent(gSprites + eSlotMachine->unk3F, 3); + } +} + +static void sub_8104598(struct Task *task) +{ + sub_8102D28(task->data[4] >> 8); + task->data[4] = (u8)task->data[4] + 0x80; + if (++task->data[5] >= 80) + { + task->data[0]++; + task->data[5] = 0; + } +} + +static void sub_81045CC(struct Task *task) +{ + sub_8102D28(task->data[4] >> 8); + task->data[4] = (u8)task->data[4] + 0x40; + if (++task->data[5] >= 40) + { + task->data[5] = 0; + if (eSlotMachine->unk05) + { + if (eSlotMachine->unk0A <= task->data[6]) + { + task->data[0]++; + } + } + else if (task->data[6] > 3) + { + task->data[0]++; + } + else if (sub_81026DC(task->data[6])) + { + task->data[0] = 14; + } + task->data[6]++; + } +} + +static void sub_810463C(struct Task *task) +{ + s16 r5 = eSlotMachine->unk14 % 20; + if (r5) + { + r5 = sub_8102D5C(task->data[4] >> 8); + task->data[4] = (u8)task->data[4] + 0x40; + } + else if (sub_8102C48(1) != eSlotMachine->unk05) + { + sub_8102D28(task->data[4] >> 8); + r5 = eSlotMachine->unk14 % 20; + task->data[4] = (u8)task->data[4] + 0x40; + } + if (r5 == 0 && sub_8102C48(1) == eSlotMachine->unk05) + { + task->data[4] = 0; + task->data[0]++; + } +} + +static void sub_81046C0(struct Task *task) +{ + if (++task->data[4] >= 60) + { + StopMapMusic(); + sub_81056C0(); + sub_8105804(); + task->data[0]++; + if(eSlotMachine->unk05 == 0) + { + task->data[4] = 0xa0; + StartSpriteAnimIfDifferent(gSprites + eSlotMachine->unk3F, 5); + PlayFanfare(BGM_ME_ZANNEN); + } + else + { + task->data[4] = 0xc0; + StartSpriteAnimIfDifferent(gSprites + eSlotMachine->unk3F, 4); + gSprites[eSlotMachine->unk3F].animCmdIndex = 0; + if (eSlotMachine->pikaPower) + { + sub_8104098(); + eSlotMachine->pikaPower = 0; + } + PlayFanfare(BGM_ME_B_SMALL); + } + } +} + +static void sub_8104764(struct Task *task) +{ + if ((task->data[4] == 0 || --task->data[4] == 0) && !sub_81040C8()) + { + task->data[0]++; + } +} + +static void sub_8104794(struct Task *task) +{ + s16 r4; + gSpriteCoordOffsetX -= 8; + task->data[1] += 8; + task->data[3] += 8; + r4 = ((task->data[1] - 8) & 0xff) >> 3; + REG_BG1HOFS = task->data[1] & 0x1ff; + if (task->data[3] >> 3 <= 25) + { + sub_8104A88(r4); + } + else + { + task->data[0]++; + } +} + +static void sub_81047EC(struct Task *task) +{ + eSlotMachine->unk0B = 0; + eSlotMachine->unk0A = eSlotMachine->unk05; + gSpriteCoordOffsetX = 0; + REG_BG1HOFS = 0; + eSlotMachine->unk1A = 8; + sub_810514C(); + sub_81054B8(); + sub_8105524(); + PlayNewMapMusic(eSlotMachine->backupMapMusic); + if (eSlotMachine->unk0A == 0) + { + DestroyTask(FindTaskIdByFunc(sub_810434C)); + } + else + { + sub_8104CAC(4); + task->data[1] = dp15_jump_random_unknown(); + task->data[2] = 0; + task->data[3] = 0; + task->data[0]++; + } +} + +static void sub_8104860(struct Task *task) +{ + if (eSlotMachine->unk1A == task->data[1]) + { + task->data[0]++; + } + else if (eSlotMachine->unk1C[0] % 24 == 0 && (++task->data[2]& 0x07) == 0) + { + eSlotMachine->unk1A >>= 1; + } +} + +static void sub_81048A8(struct Task *task) +{ + if (sub_8104E18()) + { + DestroyTask(FindTaskIdByFunc(sub_810434C)); + } +} + +static void sub_81048CC(struct Task *task) +{ + sub_81054B8(); + sub_81056C0(); + sub_8105804(); + sub_8105854(); + gSprites[eSlotMachine->unk4E[0]].invisible = TRUE; + StartSpriteAnimIfDifferent(gSprites + eSlotMachine->unk3F, 5); + task->data[0]++; + task->data[4] = 4; + task->data[5] = 0; + StopMapMusic(); + PlayFanfare(BGM_ME_ZANNEN); + PlaySE(SE_W153); +} + +static void sub_8104940(struct Task *task) +{ + gSpriteCoordOffsetY = task->data[4]; + REG_BG1VOFS = task->data[4]; + if (task->data[5] & 0x01) + task->data[4] = -task->data[4]; + if ((++task->data[5] & 0x1f) == 0) + task->data[4] >>= 1; + if (task->data[4] == 0) + { + sub_81058A0(); + sub_81058C4(); + sub_8105284(); + sub_81059E8(); + gSprites[eSlotMachine->unk4E[0]].invisible = FALSE; + task->data[0]++; + task->data[5] = 0; + } +} + +static void sub_81049C8(struct Task *task) +{ + gSpriteCoordOffsetY = 0; + REG_BG1VOFS = 0; + if (sub_8105ACC()) + { + task->data[0]++; + sub_8105AEC(); + } +} + +static void sub_81049F8(struct Task *task) +{ + gSpriteCoordOffsetX = 0; + REG_BG1HOFS = 0; + PlayNewMapMusic(eSlotMachine->backupMapMusic); + sub_810514C(); + sub_8105554(); + sub_8105524(); + sub_81059B8(); + DestroyTask(FindTaskIdByFunc(sub_810434C)); +} + +static const u16 sReelTimeWindowTilemap[]; + +static void sub_8104A40(s16 a0, s16 a1) +{ + s16 i; + + for (i = 4; i < 15; i++) + { + u16 tile = sReelTimeWindowTilemap[a1 + (i - 4) * 20]; + ((u16 *)BG_SCREEN_ADDR(28))[32 * i + a0] = tile; + } +} + +static void sub_8104A88(s16 a0) +{ + s16 i; + + for (i = 4; i < 15; i++) + { + ((u16 *)BG_SCREEN_ADDR(28))[32 * i + a0] = 0; + } +} + +static void sub_8104AB8(u8 a0) +{ + u8 taskId = CreateTask(sub_8104B0C, 1); + gTasks[taskId].data[1] = a0; + sub_8104B0C(taskId); +} + +static bool8 sub_8104AEC(void) +{ + if (FindTaskIdByFunc(sub_8104B0C) == 0xFF) + return TRUE; + return FALSE; +} + +static void (*const gUnknown_083ECC30[])(struct Task *task) = { + sub_8104B3C, + sub_8104B60, + sub_8104B80, + sub_8104B60, + sub_8104BC8, + sub_8104B60, + sub_8104BFC, + sub_8104B60, + sub_8104C44 +}; + +static void sub_8104B0C(u8 taskId) +{ + gUnknown_083ECC30[gTasks[taskId].data[0]](gTasks + taskId); +} + +static void sub_8104B3C(struct Task *task) +{ + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + task->data[0]++; +} + +static void sub_8104B60(struct Task *task) +{ + if (!gPaletteFade.active) + { + task->data[0]++; + } +} + +static void sub_8104B80(struct Task *task) +{ + sub_8104DA4(); + sub_81065DC(); + BasicInitMenuWindow(&gWindowTemplate_81E7144); + Menu_PrintTextPixelCoords(gOtherText_ReelTime, 10, 32, 1); + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + task->data[0]++; +} + +static void sub_8104BC8(struct Task *task) +{ + if (gMain.newKeys & (B_BUTTON | SELECT_BUTTON)) + { + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + task->data[0]++; + } +} + +static void sub_8104BFC(struct Task *task) +{ + Menu_EraseScreen(); + BasicInitMenuWindow(&gWindowTemplate_81E7128); + sub_81064B8(); + sub_8104CAC(task->data[1]); + sub_810423C(eSlotMachine->pikaPower); + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + task->data[0]++; +} + +static void sub_8104C44(struct Task *task) +{ + DestroyTask(FindTaskIdByFunc(sub_8104B0C)); +} + +static void sub_8104C5C(void) +{ + u8 i; + struct Task *task; + i = CreateTask(sub_8104E74, 3); + eSlotMachine->unk3D = i; + task = gTasks + i; + task->data[1] = -1; + for (i = 4; i < 16; i++) + { + task->data[i] = MAX_SPRITES; + } +} static void LoadSlotMachineWheelOverlay(void); -void sub_8104CAC(u8 arg0) { +static void sub_8104CAC(u8 arg0) +{ u8 i; struct Task *task; sub_8104DA4(); - task = &gTasks[ewram0_8->unk3D]; + task = gTasks + eSlotMachine->unk3D; task->data[1] = arg0; - i = 0; - while (gUnknown_083ED048[arg0][i].unk00 != 0xFF) + for (i = 0; gUnknown_083ED048[arg0][i].unk00 != 0xFF; i++) { u8 spriteId; spriteId = sub_8105BB4( @@ -55,44 +4042,1039 @@ void sub_8104CAC(u8 arg0) { #ifdef GERMAN if (arg0 == 5 && i <= 2) - { gSprites[spriteId].invisible = TRUE; - } #endif + } +} + +static void sub_8104D30(u8 a0, SpriteCallback a1, s16 a2, s16 a3, s16 a4) +{ + u8 i; + struct Task *task = gTasks + eSlotMachine->unk3D; + for (i = 4; i < 16; i++) + { + if (task->data[i] == MAX_SPRITES) + { + task->data[i] = sub_8105BF8(a0, a1, a2, a3, a4); + break; + } + } +} + +static void (*const gUnknown_083ED064[])(void); + +void sub_8104DA4(void) +{ + u8 i; + struct Task *task = gTasks + eSlotMachine->unk3D; + if ((u16)task->data[1] != 0xFFFF) + gUnknown_083ED064[task->data[1]](); + for (i = 4; i < 16; i++) + { + if (task->data[i] != MAX_SPRITES) + { + DestroySprite(gSprites + task->data[i]); + task->data[i] = MAX_SPRITES; + } + } +} + +static bool8 sub_8104E18(void) +{ + u8 i; + struct Task *task = gTasks + eSlotMachine->unk3D; + for (i = 4; i < 16; i++) + { + if (task->data[i] != MAX_SPRITES) + { + if (gSprites[task->data[i]].data[7]) + return FALSE; + } + } + return TRUE; +} + +static void (*const gUnknown_083ECC54[])(struct Task *task) = { + nullsub_69 +}; + +static void sub_8104E74(u8 taskId) +{ + gUnknown_083ECC54[gTasks[taskId].data[0]](gTasks + taskId); +} + +static void nullsub_69(struct Task *task) +{ + +} + +static const struct SpriteTemplate gSpriteTemplate_83ED414; + +static void sub_8104EA8(void) +{ + s16 i; + s16 j; + s16 x; + for (i = 0, x = 0x30; i < 3; i++, x += 0x28) + { + for (j = 0; j < 120; j += 24) + { + struct Sprite *sprite = gSprites + CreateSprite(&gSpriteTemplate_83ED414, x, 0, 14); + sprite->oam.priority = 3; + sprite->data[0] = i; + sprite->data[1] = j; + sprite->data[3] = -1; + } + } +} + +static void sub_8104F18(struct Sprite *sprite) +{ + sprite->data[2] = eSlotMachine->unk1C[sprite->data[0]] + sprite->data[1]; + sprite->data[2] %= 120; + sprite->pos1.y = eSlotMachine->unk22[sprite->data[0]] + 28 + sprite->data[2]; + sprite->sheetTileStart = GetSpriteTileStartByTag(GetTagOfReelSymbolOnScreenAtPos(sprite->data[0], sprite->data[2] / 24)); + SetSpriteSheetFrameTileNum(sprite); +} + +static void sub_8104F8C(void) +{ + s16 i; + s16 x; + for (x = 203, i = 1; i < 10000; i *= 10, x -= 7) + { + sub_8104FF4(x, 23, 0, i); + } + for (x = 235, i = 1; i < 10000; i *= 10, x -= 7) + { + sub_8104FF4(x, 23, 1, i); + } +} + +static const struct SpriteTemplate gSpriteTemplate_83ED42C; - i += 1; +static void sub_8104FF4(s16 x, s16 y, u8 a2, s16 a3) +{ + struct Sprite *sprite = gSprites + CreateSprite(&gSpriteTemplate_83ED42C, x, y, 13); + sprite->oam.priority = 2; + sprite->data[0] = a2; + sprite->data[1] = a3; + sprite->data[2] = a3 * 10; + sprite->data[3] = -1; +} + +static void sub_810506C(struct Sprite *sprite) +{ + u16 tag = eSlotMachine->coins; + if (sprite->data[0]) + tag = eSlotMachine->payout; + if (sprite->data[3] != tag) + { + sprite->data[3] = tag; + tag %= (u16)sprite->data[2]; + tag /= (u16)sprite->data[1]; + tag += 7; + sprite->sheetTileStart = GetSpriteTileStartByTag(tag); + SetSpriteSheetFrameTileNum(sprite); } } -asm(".section .text_b"); +static const struct SpriteTemplate gSpriteTemplate_83ED444; +static const struct SubspriteTable gSubspriteTables_83ED704[]; -void sub_8106448(void) { - u32 offsetRead, offsetWrite; - u32 size; +static void sub_81050C4(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED444, 0x58, 0x48, 15); + gSprites[spriteId].oam.priority = 3; + SetSubspriteTables(gSprites + spriteId, gSubspriteTables_83ED704); +} - LZDecompressWram(gSlotMachine_Gfx, ewram10000_2); +static const struct SpriteTemplate gSpriteTemplate_83ED45C; - offsetRead = (u32)ewram10000_2; - offsetWrite = BG_VRAM; - size = SLOTMACHINE_GFX_TILES * 32; - while (TRUE) +static void sub_8105100(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED45C, 0x118, 0x50, 1); + gSprites[spriteId].oam.priority = 1; + gSprites[spriteId].coordOffsetEnabled = TRUE; + eSlotMachine->unk3F = spriteId; +} + +static void sub_810514C(void) +{ + DestroySprite(gSprites + eSlotMachine->unk3F); +} + +static void sub_8105170(struct Sprite *sprite) +{ + sprite->pos2.y = sprite->pos2.x = 0; + if (sprite->animNum == 4) { - DmaCopy16(3, offsetRead, (void *) (offsetWrite), 0x1000); - offsetRead += 0x1000; - offsetWrite += 0x1000; - size -= 0x1000; - if (size <= 0x1000) + sprite->pos2.y = sprite->pos2.x = 8; + if ((sprite->animCmdIndex != 0 && sprite->animDelayCounter != 0) || (sprite->animCmdIndex == 0 && sprite->animDelayCounter == 0)) { - DmaCopy16(3, offsetRead, (void *) (offsetWrite), size); + sprite->pos2.y = -8; + } + } +} + +static const struct SpriteTemplate gSpriteTemplate_83ED474; +static const struct SpriteTemplate gSpriteTemplate_83ED48C; +static const struct SubspriteTable gSubspriteTables_83ED73C[]; +static const struct SubspriteTable gSubspriteTables_83ED75C[]; + +static void sub_81051C0(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED474, 0x170, 0x34, 7); + struct Sprite *sprite = gSprites + spriteId; + sprite->oam.priority = 1; + sprite->coordOffsetEnabled = TRUE; + SetSubspriteTables(sprite, gSubspriteTables_83ED73C); + eSlotMachine->unk49[0] = spriteId; + + spriteId = CreateSprite(&gSpriteTemplate_83ED48C, 0x170, 0x54, 7); + sprite = gSprites + spriteId; + sprite->oam.priority = 1; + sprite->coordOffsetEnabled = TRUE; + SetSubspriteTables(sprite, gSubspriteTables_83ED75C); + eSlotMachine->unk49[1] = spriteId; +} + +static const struct SpriteTemplate gSpriteTemplate_83ED4A4; +static const struct SubspriteTable gSubspriteTables_83ED78C[]; + +static void sub_8105284(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4A4, 0xa8 - gSpriteCoordOffsetX, 0x50, 7); + struct Sprite *sprite = gSprites + spriteId; + sprite->oam.priority = 1; + sprite->coordOffsetEnabled = TRUE; + SetSubspriteTables(sprite, gSubspriteTables_83ED78C); + eSlotMachine->unk42 = spriteId; +} + +static const struct SpriteTemplate gSpriteTemplate_83ED4BC; + +static void sub_81052EC(void) +{ + u8 i; + s16 r5; + for (i = 0, r5 = 0; i < 3; i++, r5 += 20) + { + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4BC, 0x170, 0x00, 10); + struct Sprite *sprite = gSprites + spriteId; + sprite->oam.priority = 1; + sprite->coordOffsetEnabled = TRUE; + sprite->data[7] = r5; + eSlotMachine->unk4B[i] = spriteId; + } +} + +static void sub_810535C(struct Sprite *sprite) +{ + s16 r0 = (u16)(eSlotMachine->unk14 + sprite->data[7]); + r0 %= 40; + sprite->pos1.y = r0 + 59; + StartSpriteAnimIfDifferent(sprite, sub_8102C48(r0 / 20)); +} + +static const struct SpriteTemplate gSpriteTemplate_83ED4D4; +static const struct SubspriteTable gSubspriteTables_83ED7B4[]; + +static void sub_81053A0(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4D4, 0x170, 0x64, 9); + struct Sprite *sprite = gSprites + spriteId; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = 1; + SetSubspriteTables(sprite, gSubspriteTables_83ED7B4); + eSlotMachine->unk4E[0] = spriteId; + + spriteId = CreateSprite(&gSpriteTemplate_83ED4D4, 0x120, 0x68, 4); + sprite = gSprites + spriteId; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = 1; + SetSubspriteTables(sprite, gSubspriteTables_83ED7B4); + eSlotMachine->unk4E[1] = spriteId; +} + +static const struct SpriteTemplate gSpriteTemplate_83ED4EC; +static const struct SubspriteTable gSubspriteTables_83ED7D4[]; + +static void sub_810545C(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4EC, 0x170, 0x4c, 11); + struct Sprite *sprite = gSprites + spriteId; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = 1; + SetSubspriteTables(sprite, gSubspriteTables_83ED7D4); + eSlotMachine->unk40 = spriteId; +} + +static void sub_81054B8(void) +{ + u8 i; + + DestroySprite(gSprites + eSlotMachine->unk40); + for (i = 0; i < 2; i++) + { + DestroySprite(gSprites + eSlotMachine->unk49[i]); + } + for (i = 0; i < 3; i++) + { + DestroySprite(gSprites + eSlotMachine->unk4B[i]); + } +} + +static void sub_8105524(void) +{ + u8 i; + for (i = 0; i < 2; i++) + { + DestroySprite(gSprites + eSlotMachine->unk4E[i]); + } +} + +static void sub_8105554(void) +{ + DestroySprite(gSprites + eSlotMachine->unk42); +} + +static const struct SpriteTemplate gSpriteTemplate_83ED504; + +static void sub_8105578(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED504, 0x98, 0x20, 5); + struct Sprite *sprite = gSprites + spriteId; + sprite->oam.priority = 1; + sprite->hFlip = TRUE; + eSlotMachine->unk50[0] = spriteId; + sprite->data[0] = 8; + sprite->data[1] = -1; + sprite->data[2] = -1; + sprite->data[7] = 0x20; + + spriteId = CreateSprite(&gSpriteTemplate_83ED504, 0xb8, 0x20, 5); + sprite = gSprites + spriteId; + sprite->oam.priority = 1; + eSlotMachine->unk50[1] = spriteId; + sprite->data[1] = 1; + sprite->data[2] = -1; + sprite->data[7] = 0x20; +} + +static void sub_810562C(struct Sprite *sprite) +{ + if (sprite->data[0] != 0) + { + sprite->data[0]--; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + sprite->invisible = TRUE; + } + else + { + sprite->invisible = FALSE; + sprite->pos2.x += sprite->data[1]; + sprite->pos2.y += sprite->data[2]; + if (++sprite->data[3] >= 8) + { + sprite->data[0] = sprite->data[7]; + sprite->data[3] = 0; + } + } +} + +static void sub_8105688(s16 a0) +{ + gSprites[eSlotMachine->unk50[0]].data[7] = a0; + gSprites[eSlotMachine->unk50[1]].data[7] = a0; +} + +static void sub_81056C0(void) +{ + u8 i; + + for (i = 0; i < 2; i++) + { + DestroySprite(gSprites + eSlotMachine->unk50[i]); + } +} + +static const struct SpriteTemplate gSpriteTemplate_83ED51C; + +static void sub_81056F0(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED51C, 0x48, 0x50, 3); + gSprites[spriteId].oam.priority = 1; + gSprites[spriteId].data[0] = 1; + gSprites[spriteId].data[5] = 0; + gSprites[spriteId].data[6] = 16; + gSprites[spriteId].data[7] = 8; + eSlotMachine->unk52[0] = spriteId; + + spriteId = CreateSprite(&gSpriteTemplate_83ED51C, 0x68, 0x50, 3); + gSprites[spriteId].oam.priority = 1; + gSprites[spriteId].hFlip = TRUE; + eSlotMachine->unk52[1] = spriteId; +} + +static const u8 gUnknown_083ECC58[2]; // don't remove this until decompiled through gUnknown_083ECCF8 + +static void sub_8105784(struct Sprite *sprite) +{ + u8 sp[] = {16, 0}; + if (sprite->data[0] && --sprite->data[6] <= 0) + { + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(7) << 4) + 0x103, sp[sprite->data[5]], sp[sprite->data[5]], sp[sprite->data[5]]); + ++sprite->data[5]; + sprite->data[5] &= 1; + sprite->data[6] = sprite->data[7]; + } +} + +static void sub_81057E8(s16 a0) +{ + gSprites[eSlotMachine->unk52[0]].data[7] = a0; +} + +static void sub_8105804(void) +{ + u8 i; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(7) << 4) + 0x103, 0, 0, 0); + for (i = 0; i < 2; i++) + { + DestroySprite(gSprites + eSlotMachine->unk52[i]); + } +} + +static const struct SpriteTemplate gSpriteTemplate_83ED534; + +static void sub_8105854(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED534, 0xa8, 0x50, 6); + gSprites[spriteId].oam.priority = 1; + eSlotMachine->unk41 = spriteId; +} + +static void sub_8105894(struct Sprite *sprite) +{ + sprite->pos2.y = gSpriteCoordOffsetY; +} + +static void sub_81058A0(void) +{ + DestroySprite(gSprites + eSlotMachine->unk41); +} + +static const struct SpriteTemplate gSpriteTemplate_83ED54C; + +static void sub_81058C4(void) +{ + u8 i; + u16 sp[] = {0x0, 0x40, 0x80, 0xC0}; + for (i = 0; i < 4; i++) + { + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED54C, 0x50 - gSpriteCoordOffsetX, 0x44, 0); + struct Sprite *sprite = gSprites + spriteId; + sprite->oam.priority = 1; + sprite->coordOffsetEnabled = TRUE; + sprite->data[0] = sp[i]; + eSlotMachine->unk54[i] = spriteId; + } +} + +static void sub_810594C(struct Sprite *sprite) +{ + sprite->data[0] -= 2; + sprite->data[0] &= 0xff; + sprite->pos2.x = Cos(sprite->data[0], 20); + sprite->pos2.y = Sin(sprite->data[0], 6); + sprite->subpriority = 0; + if (sprite->data[0] >= 0x80) + { + sprite->subpriority = 2; + } + if (++sprite->data[1] >= 16) + { + sprite->hFlip ^= 1; + sprite->data[1] = 0; + } +} + +static void sub_81059B8(void) +{ + u8 i; + for (i = 0; i < 4; i++) + { + DestroySprite(gSprites + eSlotMachine->unk54[i]); + } +} + +static const struct SpriteTemplate gSpriteTemplate_83ED564; + +static void sub_81059E8(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED564, 0xa8, 0x3c, 8); + struct Sprite *sprite = gSprites + spriteId; + sprite->oam.priority = 1; + sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE; + InitSpriteAffineAnim(sprite); + eSlotMachine->unk43 = spriteId; +} + +static void sub_8105A38(struct Sprite *sprite) +{ + if (sprite->data[0] == 0) + { + if (sprite->affineAnimEnded) + sprite->data[0]++; + } + else if (sprite->data[0] == 1) + { + sprite->invisible ^= 1; + if (++sprite->data[2] >= 24) + { + sprite->data[0]++; + sprite->data[2] = 0; + } + } + else + { + sprite->invisible = TRUE; + if (++sprite->data[2] >= 16) + sprite->data[7] = 1; + } + sprite->data[1] &= 0xff; + sprite->data[1] += 16; + sprite->pos2.y -= (sprite->data[1] >> 8); +} + +u8 sub_8105ACC(void) +{ + return gSprites[eSlotMachine->unk43].data[7]; +} + +static void sub_8105AEC(void) +{ + struct Sprite *sprite = gSprites + eSlotMachine->unk43; + FreeOamMatrix(sprite->oam.matrixNum); + DestroySprite(sprite); +} + +static const struct SpriteTemplate gSpriteTemplate_83ED6CC; + +static u8 sub_8105B1C(s16 x, s16 y) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED6CC, x, y, 12); + struct Sprite *sprite = gSprites + spriteId; + sprite->oam.priority = 2; + sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE; + InitSpriteAffineAnim(sprite); + return spriteId; +} + +static void sub_8105B70(struct Sprite *sprite) +{ + if (sprite->affineAnimEnded) + sprite->data[7] = 1; +} + +static void sub_8105B88(u8 spriteId) +{ + struct Sprite *sprite = gSprites + spriteId; + FreeOamMatrix(sprite->oam.matrixNum); + DestroySprite(sprite); +} + +static const s16 gUnknown_083ECE7E[][2]; +static const SpriteCallback gUnknown_083ECF0C[]; + +u8 sub_8105BB4(u8 templateIdx, u8 cbAndCoordsIdx, s16 a2) +{ + return sub_8105BF8(templateIdx, gUnknown_083ECF0C[cbAndCoordsIdx], gUnknown_083ECE7E[cbAndCoordsIdx][0], gUnknown_083ECE7E[cbAndCoordsIdx][1], a2); +} + +static const struct SpriteTemplate *const gUnknown_083EDB5C[]; +static const struct SubspriteTable *const gUnknown_083EDBC4[]; + +static u8 sub_8105BF8(u8 templateIdx, SpriteCallback callback, s16 x, s16 y, s16 a4) +{ + u8 spriteId = CreateSprite(gUnknown_083EDB5C[templateIdx], x, y, 16); + struct Sprite *sprite = gSprites + spriteId; + sprite->oam.priority = 3; + sprite->callback = callback; + sprite->data[6] = a4; + sprite->data[7] = 1; + if (gUnknown_083EDBC4[templateIdx]) + SetSubspriteTables(sprite, gUnknown_083EDBC4[templateIdx]); + return spriteId; +} + +static void sub_8105C64(struct Sprite *sprite) +{ + sprite->data[7] = 0; +} + +static void sub_8105C6C(struct Sprite *sprite) +{ + s16 sp0[] = {4, -4, 4, -4}; + s16 sp8[] = {4, 4, -4, -4}; + + if (sprite->data[1]++ >= 16) + { + sprite->subspriteTableNum ^= 1; + sprite->data[1] = 0; + } + sprite->pos2.x = 0; + sprite->pos2.y = 0; + if (sprite->subspriteTableNum != 0) + { + sprite->pos2.x = sp0[sprite->data[6]]; + sprite->pos2.y = sp8[sprite->data[6]]; + } +} + +static void sub_8105CF0(struct Sprite *sprite) +{ + sprite->hFlip = TRUE; + sub_8105C6C(sprite); +} + +static void sub_8105D08(struct Sprite *sprite) +{ + sprite->vFlip = TRUE; + sub_8105C6C(sprite); +} + +static void sub_8105D20(struct Sprite *sprite) +{ + sprite->hFlip = TRUE; + sprite->vFlip = TRUE; + sub_8105C6C(sprite); +} + +static void sub_8105D3C(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->pos1.x += 4; + if (sprite->pos1.x >= 0xd0) + { + sprite->pos1.x = 0xd0; + sprite->data[0]++; + } + break; + case 1: + if (++sprite->data[1] > 90) + { + sprite->data[0]++; + } + break; + case 2: + sprite->pos1.x += 4; + if (sprite->pos1.x >= 0x110) + { + sprite->data[0]++; + } + break; + case 3: + sprite->data[7] = 0; + break; + } +} + +static void sub_8105DA4(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->pos1.x -= 4; + if (sprite->pos1.x <= 0xd0) + { + sprite->pos1.x = 0xd0; + sprite->data[0]++; + } + break; + case 1: + if (++sprite->data[1] > 90) + { + sprite->data[0]++; + } + break; + case 2: + sprite->pos1.x -= 4; + if (sprite->pos1.x <= 0x90) + { + sprite->data[0]++; + } + break; + case 3: + sprite->data[7] = 0; + break; + } +} + +static void sub_8105E08(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + StartSpriteAnim(sprite, eSlotMachine->unk0A - 1); + sprite->data[0]++; + // fallthrough + case 1: + if (++sprite->data[1] >= 4) + { + sprite->data[0]++; + sprite->data[1] = 0; + } + break; + case 2: + sprite->pos1.x += 4; + if (sprite->pos1.x >= 0xd0) + { + sprite->pos1.x = 0xd0; + sprite->data[0]++; + } + break; + case 3: + if (++sprite->data[1] > 90) + { + sprite->data[0]++; + } + break; + case 4: + sprite->pos1.x += 4; + if (sprite->pos1.x >= 0xf8) + { + sprite->data[0]++; + } + break; + case 5: + sprite->data[7] = 0; + break; + } +} + +static void sub_8105EB4(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->animPaused = TRUE; + sprite->data[0]++; + // fallthrough + case 1: + sprite->pos1.y += 8; + if (sprite->pos1.y >= 0x70) + { + sprite->pos1.y = 0x70; + sprite->data[1] = 16; + sprite->data[0]++; + } + break; + case 2: + if (sprite->data[2] == 0) + { + sprite->pos1.y -= sprite->data[1]; + sprite->data[1] = -sprite->data[1]; + if (++sprite->data[3] >= 2) + { + sprite->data[1] >>= 2; + sprite->data[3] = 0; + if (sprite->data[1] == 0) + { + sprite->data[0]++; + sprite->data[7] = 0; + sprite->animPaused = FALSE; + } + } + } + sprite->data[2]++; + sprite->data[2] &= 0x07; + break; + } +} + +static void sub_8105F54(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + if (++sprite->data[1] > 8) + { + sprite->data[0]++; + } + break; + case 1: + sprite->pos1.y += 2; + if (sprite->pos1.y >= 0x30) + { + sprite->pos1.y = 0x30; + sprite->data[0]++; + sprite->data[7] = 0; + } + break; + } +} + +static void sub_8105F9C(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->invisible = TRUE; + if (++sprite->data[1] > 0x20) + { + sprite->data[0]++; + sprite->data[1] = 5; + sprite->oam.mosaic = TRUE; + sprite->invisible = FALSE; + StartSpriteAnim(sprite, 1); + REG_MOSAIC = ((sprite->data[1] << 4) | sprite->data[1]) << 8; + } + break; + case 1: + sprite->data[1] -= (sprite->data[2] >> 8); + if (sprite->data[1] < 0) + { + sprite->data[1] = 0; + } + REG_MOSAIC = ((sprite->data[1] << 4) | sprite->data[1]) << 8; + sprite->data[2] &= 0xff; + sprite->data[2] += 0x80; + if (sprite->data[1] == 0) + { + sprite->data[0]++; + sprite->data[7] = 0; + sprite->oam.mosaic = FALSE; + StartSpriteAnim(sprite, 0); + } break; + } +} + +static const u16 *const gUnknown_083EDE10[]; + +static void sub_8106058(struct Sprite *sprite) +{ + if (sprite->data[1] < 3) + { + LoadPalette(gUnknown_083EDE10[sprite->data[1]], (IndexOfSpritePaletteTag(6) << 4) + 0x100, 0x20); + if (++sprite->data[2] >= 4) + { + sprite->data[1]++; + sprite->data[2] = 0; } } + else + { + LoadPalette(gUnknown_083EDE10[sprite->data[1]], (IndexOfSpritePaletteTag(6) << 4) + 0x100, 0x20); + if (++sprite->data[2] >= 25) + { + sprite->data[1] = 0; + sprite->data[2] = 0; + } + } + StartSpriteAnimIfDifferent(sprite, 1); + sprite->data[7] = 0; +} + +static void sub_81060FC(struct Sprite *sprite) +{ + s16 sp00[] = {0, -40, 0, 0, 48, 0, 24, 0}; + s16 sp10[] = {-32, 0, -32, -48, 0, -48, 0, -48}; + s16 sp20[] = {16, 12, 16, 0, 0, 4, 8, 8}; + + switch (sprite->data[0]) + { + case 0: + sprite->pos2.x = sp00[sprite->data[6]]; + sprite->pos2.y = sp10[sprite->data[6]]; + sprite->data[1] = sp20[sprite->data[6]]; + sprite->data[0]++; + // fallthrough + case 1: + if (sprite->data[1]-- == 0) + { + sprite->data[0]++; + } + break; + case 2: + if (sprite->pos2.x > 0) + { + sprite->pos2.x -= 4; + } + else if (sprite->pos2.x < 0) + { + sprite->pos2.x += 4; + } + if (sprite->pos2.y > 0) + { + sprite->pos2.y -= 4; + } + else if (sprite->pos2.y < 0) + { + sprite->pos2.y += 4; + } + if (sprite->pos2.x == 0 && sprite->pos2.y == 0) + { + sprite->data[0]++; + } + break; + } +} + +static void sub_81061C8(struct Sprite *sprite) +{ + s16 sp0[] = {160, 192, 224, 104, 80, 64, 48, 24}; + + if (sprite->data[0] == 0) + { + sprite->data[0]++; + sprite->data[1] = 12; + } + sprite->pos2.x = Cos(sp0[sprite->data[6]], sprite->data[1]); + sprite->pos2.y = Sin(sp0[sprite->data[6]], sprite->data[1]); + if (sprite->data[1]) + { + sprite->data[1]--; + } +} + +static void sub_8106230(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + eSlotMachine->winIn = 0x2f; + eSlotMachine->winOut = 0x3f; + eSlotMachine->win0v = 0x2088; + sprite->invisible = TRUE; + sprite->data[0]++; + // fallthrough + case 1: + sprite->data[1] += 2; + sprite->data[2] = sprite->data[1] + 0xb0; + sprite->data[3] = 0xf0 - sprite->data[1]; + if (sprite->data[2] > 0xd0) + { + sprite->data[2] = 0xd0; + } + if (sprite->data[3] < 0xd0) + { + sprite->data[3] = 0xd0; + } + eSlotMachine->win0h = (sprite->data[2] << 8) | sprite->data[3]; + if (sprite->data[1] > 0x33) + { + sprite->data[0]++; + eSlotMachine->winIn = 0x3f; + } + break; + case 2: + if (eSlotMachine->bet == 0) + { + break; + } + sub_8104D30(5, SpriteCallbackDummy, 0xd0, 0x74, 0); + eSlotMachine->win0h = 0xc0e0; + eSlotMachine->win0v = 0x6880; + eSlotMachine->winIn = 0x2f; + sprite->data[0]++; + sprite->data[1] = 0; + // fallthrough + case 3: + sprite->data[1] += 2; + sprite->data[2] = sprite->data[1] + 0xc0; + sprite->data[3] = 0xe0 - sprite->data[1]; + if (sprite->data[2] > 0xd0) + { + sprite->data[2] = 0xd0; + } + if (sprite->data[3] < 0xd0) + { + sprite->data[3] = 0xd0; + } + eSlotMachine->win0h = (sprite->data[2] << 8) | sprite->data[3]; + if (sprite->data[1] > 0x0f) + { + sprite->data[0]++; + eSlotMachine->winIn = 0x3f; + } + break; + } +} + +static void nullsub_70(void) +{ + +} + +static void sub_8106364(void) +{ + REG_MOSAIC = 0; +} + +static const u16 *const gUnknown_083EDE20; + +static void sub_8106370(void) +{ + LoadPalette(gUnknown_083EDE20, (IndexOfSpritePaletteTag(6) << 4) + 0x100, 0x20); +} + +static void sub_810639C(void) +{ + eSlotMachine->win0h = 0xf0; + eSlotMachine->win0v = 0xa0; + eSlotMachine->winIn = 0x3f; + eSlotMachine->winOut = 0x3f; +} + +static const u8 sReelTimeGfx[]; +static const struct SpriteSheet sSlotMachineSpriteSheets[]; +static const struct SpritePalette gSlotMachineSpritePalettes[]; + +static void sub_81063C0(void) +{ + sub_8106404(); + LZDecompressWram(gSlotMachineReelTimeLights_Gfx, eSlotMachineGfxBuffer); + LZDecompressWram(sReelTimeGfx, eSlotMachineReelTimeGfxBuffer); + LoadSpriteSheets(sSlotMachineSpriteSheets); + LoadSpritePalettes(gSlotMachineSpritePalettes); +} + +static const u8 *const gUnknown_083EDCE4; +static const struct SpriteSheet gUnknown_083EDCDC; + +static void sub_8106404(void) +{ + u8 *dest = eSlotMachineGfxBuffer; + u8 i = 0; + const struct SpriteSheet *sheet = &gUnknown_083EDCDC; + const u8 *src = gUnknown_083EDCE4; + for (i = 0; i < 0x40; i++) + { + u8 j; + for (j = 0; j < 0x20; j++, dest++) + { + *dest = src[j]; + } + } + LoadSpriteSheet(sheet); +} + +static void sub_8106448(void) { + LZDecompressWram(gSlotMachine_Gfx, eSlotMachineGfxBuffer); + + DmaCopyLarge16(3, eSlotMachineGfxBuffer, BG_VRAM, SLOTMACHINE_GFX_TILES * 32, 0x1000); LoadPalette(gUnknown_08E95A18, 0, 160); LoadPalette(gPalette_83EDE24, 208, 32); } -void sub_81064B8(void) { +static void sub_81064B8(void) { CpuCopy16(gUnknown_08E95AB8, BG_SCREEN_ADDR(29), 20 * 32 * 2); LoadSlotMachineWheelOverlay(); } @@ -123,7 +5105,7 @@ static void LoadSlotMachineWheelOverlay(void) { } } -void sub_81065A8(s16 arg0, u16 arg1, u16 arg2, u16 arg3, u16 arg4) { +static void sub_81065A8(s16 arg0, u16 arg1, u16 arg2, u16 arg3, u16 arg4) { u16 *vram = BG_SCREEN_ADDR(29); vram[15 * 32 + arg0] = arg1; @@ -132,7 +5114,8 @@ void sub_81065A8(s16 arg0, u16 arg1, u16 arg2, u16 arg3, u16 arg4) { vram[16 * 32 + 1 + arg0] = arg4; } -void sub_81065DC(void) { +static void sub_81065DC(void) +{ s16 y, x; u16 *screen; @@ -147,3 +5130,2699 @@ void sub_81065DC(void) { } } } + +#if DEBUG +__attribute__((naked)) +void debug_sub_811B1C4() +{ + asm( + " ldr r1, .__1_\n" + " ldrb r0, [r1]\n" + " mov r3, #0x2\n" + " orr r0, r0, r3\n" + " strb r0, [r1]\n" + " ldr r2, .__1_ + 4\n" + " ldrb r1, [r2]\n" + " mov r0, #0x2\n" + " eor r1, r1, r0\n" + " neg r0, r1\n" + " orr r0, r0, r1\n" + " asr r0, r0, #0x1f\n" + " and r0, r0, r3\n" + " strb r0, [r2]\n" + " bx lr\n" + ".__2_:\n" + " .align 2, 0\n" + ".__1_:\n" + " .word unk_debug_bss_1_3\n" + " .word unk_debug_bss_1_0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B1EC() +{ + asm( + " ldr r2, .__3\n" + " ldrb r0, [r2]\n" + " mov r1, #0x1\n" + " orr r0, r0, r1\n" + " strb r0, [r2]\n" + " ldr r2, .__3 + 4\n" + " ldrb r0, [r2]\n" + " mov r1, #0x1\n" + " eor r0, r0, r1\n" + " neg r0, r0\n" + " lsr r0, r0, #0x1f\n" + " strb r0, [r2]\n" + " bx lr\n" + ".__4:\n" + " .align 2, 0\n" + ".__3:\n" + " .word unk_debug_bss_1_3\n" + " .word unk_debug_bss_1_0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B210() +{ + asm( + " ldr r1, .__5\n" + " ldrb r0, [r1]\n" + " mov r3, #0x4\n" + " orr r0, r0, r3\n" + " strb r0, [r1]\n" + " ldr r2, .__5 + 4\n" + " ldrb r1, [r2]\n" + " mov r0, #0x4\n" + " eor r1, r1, r0\n" + " neg r0, r1\n" + " orr r0, r0, r1\n" + " asr r0, r0, #0x1f\n" + " and r0, r0, r3\n" + " strb r0, [r2]\n" + " bx lr\n" + ".__6:\n" + " .align 2, 0\n" + ".__5:\n" + " .word unk_debug_bss_1_3\n" + " .word unk_debug_bss_1_0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B238() +{ + asm( + " ldr r1, .__7\n" + " ldrb r0, [r1]\n" + " mov r3, #0x8\n" + " orr r0, r0, r3\n" + " strb r0, [r1]\n" + " ldr r2, .__7 + 4\n" + " ldrb r1, [r2]\n" + " mov r0, #0x8\n" + " eor r1, r1, r0\n" + " neg r0, r1\n" + " orr r0, r0, r1\n" + " asr r0, r0, #0x1f\n" + " and r0, r0, r3\n" + " strb r0, [r2]\n" + " bx lr\n" + ".__8:\n" + " .align 2, 0\n" + ".__7:\n" + " .word unk_debug_bss_1_3\n" + " .word unk_debug_bss_1_0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B260() +{ + asm( + " ldr r1, .__9\n" + " ldrb r0, [r1]\n" + " mov r3, #0x10\n" + " orr r0, r0, r3\n" + " strb r0, [r1]\n" + " ldr r2, .__9 + 4\n" + " ldrb r1, [r2]\n" + " mov r0, #0x10\n" + " eor r1, r1, r0\n" + " neg r0, r1\n" + " orr r0, r0, r1\n" + " asr r0, r0, #0x1f\n" + " and r0, r0, r3\n" + " strb r0, [r2]\n" + " bx lr\n" + ".__10:\n" + " .align 2, 0\n" + ".__9:\n" + " .word unk_debug_bss_1_3\n" + " .word unk_debug_bss_1_0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B288() +{ + asm( + " ldr r1, .__11\n" + " ldrb r0, [r1]\n" + " mov r3, #0x40\n" + " orr r0, r0, r3\n" + " strb r0, [r1]\n" + " ldr r2, .__11 + 4\n" + " ldrb r1, [r2]\n" + " mov r0, #0x40\n" + " eor r1, r1, r0\n" + " neg r0, r1\n" + " orr r0, r0, r1\n" + " asr r0, r0, #0x1f\n" + " and r0, r0, r3\n" + " strb r0, [r2]\n" + " bx lr\n" + ".__12:\n" + " .align 2, 0\n" + ".__11:\n" + " .word unk_debug_bss_1_3\n" + " .word unk_debug_bss_1_0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B2B0() +{ + asm( + " ldr r1, .__13\n" + " ldrb r0, [r1]\n" + " mov r3, #0x80\n" + " orr r0, r0, r3\n" + " strb r0, [r1]\n" + " ldr r2, .__13 + 4\n" + " ldrb r1, [r2]\n" + " mov r0, #0x80\n" + " eor r1, r1, r0\n" + " neg r0, r1\n" + " orr r0, r0, r1\n" + " asr r0, r0, #0x1f\n" + " and r0, r0, r3\n" + " strb r0, [r2]\n" + " bx lr\n" + ".__14:\n" + " .align 2, 0\n" + ".__13:\n" + " .word unk_debug_bss_1_3\n" + " .word unk_debug_bss_1_0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B2D8() +{ + asm( + " ldr r0, .__15\n" + " ldrb r1, [r0]\n" + " mov r2, #0x20\n" + " orr r1, r1, r2\n" + " strb r1, [r0]\n" + " bx lr\n" + ".__16:\n" + " .align 2, 0\n" + ".__15:\n" + " .word unk_debug_bss_1_3\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B2E8() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffffc\n" + " ldr r0, .__17\n" + " ldrb r1, [r0, #0x1]\n" + " add r1, r1, #0x1\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x1\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0x6\n" + " mov r2, #0x1\n" + " bl Menu_PrintText\n" + " add sp, sp, #0x4\n" + " pop {r0}\n" + " bx r0\n" + ".__18:\n" + " .align 2, 0\n" + ".__17:\n" + " .word +0x2000000\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B310() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffff8\n" + " ldr r0, .__21\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 4\n" + " mov r1, #0x1\n" + " mov r2, #0x3\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 8\n" + " mov r1, #0x1\n" + " mov r2, #0x5\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 12\n" + " mov r1, #0x1\n" + " mov r2, #0x7\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 16\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 20\n" + " mov r1, #0x1\n" + " mov r2, #0xb\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 24\n" + " mov r1, #0x1\n" + " mov r2, #0xd\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 28\n" + " mov r1, #0x1\n" + " mov r2, #0xf\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 32\n" + " mov r1, #0x1\n" + " mov r2, #0x11\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 36\n" + " mov r1, #0xf\n" + " mov r2, #0x1\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 40\n" + " mov r1, #0xf\n" + " mov r2, #0x3\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 44\n" + " mov r1, #0xf\n" + " mov r2, #0x5\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 48\n" + " mov r1, #0xf\n" + " mov r2, #0x7\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 52\n" + " mov r1, #0xf\n" + " mov r2, #0x9\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 56\n" + " mov r1, #0xf\n" + " mov r2, #0xb\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 60\n" + " mov r1, #0xf\n" + " mov r2, #0xd\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 64\n" + " mov r1, #0xf\n" + " mov r2, #0xf\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 68\n" + " mov r1, #0xf\n" + " mov r2, #0x11\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 72\n" + " ldrb r0, [r0, #0x3]\n" + " cmp r0, #0\n" + " bne .__19 @cond_branch\n" + " ldr r0, .__21 + 76\n" + " mov r1, #0xa\n" + " mov r2, #0x9\n" + " bl Menu_PrintText\n" + " b .__20\n" + ".__22:\n" + " .align 2, 0\n" + ".__21:\n" + " .word Str_841B1C4\n" + " .word Str_841B1CB\n" + " .word Str_841B1D4\n" + " .word Str_841B1DB\n" + " .word Str_841B1E2\n" + " .word Str_841B1E8\n" + " .word Str_841B1F3\n" + " .word Str_841B202\n" + " .word Str_841B24C\n" + " .word Str_841B211\n" + " .word Str_841B219\n" + " .word Str_841B220\n" + " .word Str_841B227\n" + " .word Str_841B22E\n" + " .word Str_841B235\n" + " .word Str_841B23B\n" + " .word Str_841B23F\n" + " .word Str_841B243\n" + " .word +0x2000000\n" + " .word Str_841B246\n" + ".__19:\n" + " ldr r0, .__30\n" + " mov r1, #0xa\n" + " mov r2, #0x9\n" + " bl Menu_PrintText\n" + ".__20:\n" + " ldr r4, .__30 + 4\n" + " ldr r1, [r4, #0x68]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0xa\n" + " mov r2, #0x3\n" + " bl Menu_PrintText\n" + " ldr r1, [r4, #0x6c]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0xa\n" + " mov r2, #0x5\n" + " bl Menu_PrintText\n" + " mov r0, #0x10\n" + " ldsh r1, [r4, r0]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0xa\n" + " mov r2, #0x7\n" + " bl Menu_PrintText\n" + " ldr r1, [r4, #0x70]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0x14\n" + " mov r2, #0x3\n" + " bl Menu_PrintText\n" + " ldr r1, [r4, #0x74]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0x14\n" + " mov r2, #0x5\n" + " bl Menu_PrintText\n" + " ldr r1, [r4, #0x78]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0x14\n" + " mov r2, #0x7\n" + " bl Menu_PrintText\n" + " ldr r1, [r4, #0x7c]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0x14\n" + " mov r2, #0x9\n" + " bl Menu_PrintText\n" + " add r0, r4, #0\n" + " add r0, r0, #0x80\n" + " ldr r1, [r0]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0x14\n" + " mov r2, #0xb\n" + " bl Menu_PrintText\n" + " add r0, r4, #0\n" + " add r0, r0, #0x84\n" + " ldr r1, [r0]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0x14\n" + " mov r2, #0xd\n" + " bl Menu_PrintText\n" + " add r0, r4, #0\n" + " add r0, r0, #0x88\n" + " ldr r1, [r0]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0x14\n" + " mov r2, #0xf\n" + " bl Menu_PrintText\n" + " add r0, r4, #0\n" + " add r0, r0, #0x8c\n" + " ldr r1, [r0]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0x14\n" + " mov r2, #0x11\n" + " bl Menu_PrintText\n" + " ldr r1, .__30 + 8\n" + " ldrb r0, [r1]\n" + " cmp r0, #0\n" + " beq .__23 @cond_branch\n" + " mov r2, #0x0\n" + " cmp r0, #0x8\n" + " beq .__24 @cond_branch\n" + " cmp r0, #0x8\n" + " bgt .__25 @cond_branch\n" + " cmp r0, #0x2\n" + " beq .__26 @cond_branch\n" + " cmp r0, #0x2\n" + " bgt .__27 @cond_branch\n" + " cmp r0, #0x1\n" + " beq .__28 @cond_branch\n" + " b .__45\n" + ".__31:\n" + " .align 2, 0\n" + ".__30:\n" + " .word Str_841B249\n" + " .word +0x2000000\n" + " .word unk_debug_bss_1_0\n" + ".__27:\n" + " cmp r0, #0x4\n" + " beq .__32 @cond_branch\n" + " b .__45\n" + ".__25:\n" + " cmp r0, #0x40\n" + " beq .__34 @cond_branch\n" + " cmp r0, #0x40\n" + " bgt .__35 @cond_branch\n" + " cmp r0, #0x10\n" + " beq .__36 @cond_branch\n" + " b .__45\n" + ".__35:\n" + " cmp r0, #0x80\n" + " beq .__38 @cond_branch\n" + " b .__45\n" + ".__26:\n" + " mov r2, #0x3\n" + " b .__45\n" + ".__28:\n" + " mov r2, #0x5\n" + " b .__45\n" + ".__32:\n" + " mov r2, #0x7\n" + " b .__45\n" + ".__24:\n" + " mov r2, #0x9\n" + " b .__45\n" + ".__36:\n" + " mov r2, #0xb\n" + " b .__45\n" + ".__34:\n" + " mov r2, #0xd\n" + " b .__45\n" + ".__38:\n" + " mov r2, #0xf\n" + ".__45:\n" + " ldr r0, .__46\n" + " mov r1, #0x17\n" + " bl Menu_PrintText\n" + ".__23:\n" + " bl debug_sub_811B2E8\n" + " add sp, sp, #0x8\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + ".__47:\n" + " .align 2, 0\n" + ".__46:\n" + " .word Str_841B26D\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B5B4() +{ + asm( + " push {lr}\n" + " add r2, r0, #0\n" + " ldr r0, [r2]\n" + " add r0, r0, r1\n" + " str r0, [r2]\n" + " ldr r1, .__49\n" + " cmp r0, r1\n" + " ble .__48 @cond_branch\n" + " str r1, [r2]\n" + ".__48:\n" + " pop {r0}\n" + " bx r0\n" + ".__50:\n" + " .align 2, 0\n" + ".__49:\n" + " .word 0x270f\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B5D0() +{ + asm( + " ldr r0, .__51\n" + " mov r1, #0x0\n" + " strb r1, [r0]\n" + " ldr r0, .__51 + 4\n" + " strb r1, [r0]\n" + " ldr r0, .__51 + 8\n" + " strb r1, [r0]\n" + " ldr r0, .__51 + 12\n" + " strb r1, [r0]\n" + " ldr r2, .__51 + 16\n" + " mov r0, #0x0\n" + " str r0, [r2, #0x68]\n" + " str r0, [r2, #0x6c]\n" + " str r0, [r2, #0x70]\n" + " str r0, [r2, #0x74]\n" + " str r0, [r2, #0x78]\n" + " str r0, [r2, #0x7c]\n" + " add r1, r2, #0\n" + " add r1, r1, #0x80\n" + " str r0, [r1]\n" + " add r1, r1, #0x4\n" + " str r0, [r1]\n" + " add r1, r1, #0x4\n" + " str r0, [r1]\n" + " add r1, r1, #0x4\n" + " str r0, [r1]\n" + " add r1, r1, #0x4\n" + " str r0, [r1]\n" + " bx lr\n" + ".__52:\n" + " .align 2, 0\n" + ".__51:\n" + " .word unk_debug_bss_1_0\n" + " .word unk_debug_bss_1_2\n" + " .word unk_debug_bss_1_3\n" + " .word unk_debug_bss_1_4\n" + " .word +0x2000000\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B620() +{ + asm( + " push {lr}\n" + " ldr r0, .__53\n" + " mov r1, #0x0\n" + " bl CreateTask\n" + " pop {r0}\n" + " bx r0\n" + ".__54:\n" + " .align 2, 0\n" + ".__53:\n" + " .word debug_sub_811B654+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B634() +{ + asm( + " push {lr}\n" + " ldr r0, .__57\n" + " bl FindTaskIdByFunc\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0xff\n" + " beq .__55 @cond_branch\n" + " mov r0, #0x0\n" + " b .__56\n" + ".__58:\n" + " .align 2, 0\n" + ".__57:\n" + " .word debug_sub_811B654+1\n" + ".__55:\n" + " mov r0, #0x1\n" + ".__56:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B654() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " add sp, sp, #0xfffffff8\n" + " lsl r0, r0, #0x18\n" + " lsr r6, r0, #0x18\n" + " lsl r0, r6, #0x2\n" + " add r0, r0, r6\n" + " lsl r0, r0, #0x3\n" + " ldr r1, .__63\n" + " add r5, r0, r1\n" + " mov r0, #0x8\n" + " ldsh r1, [r5, r0]\n" + " cmp r1, #0x1\n" + " beq .__59 @cond_branch\n" + " cmp r1, #0x1\n" + " bgt .__60 @cond_branch\n" + " cmp r1, #0\n" + " beq .__61 @cond_branch\n" + " b .__116\n" + ".__64:\n" + " .align 2, 0\n" + ".__63:\n" + " .word gTasks\n" + ".__60:\n" + " cmp r1, #0x2\n" + " bne .__65 @cond_branch\n" + " b .__66\n" + ".__65:\n" + " cmp r1, #0x3\n" + " bne .__67 @cond_branch\n" + " b .__68\n" + ".__67:\n" + " b .__116\n" + ".__61:\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x18\n" + " mov r3, #0x13\n" + " bl Menu_DrawStdWindowFrame\n" + " bl debug_sub_811B310\n" + " ldrh r0, [r5, #0x8]\n" + " add r0, r0, #0x1\n" + " strh r0, [r5, #0x8]\n" + " b .__116\n" + ".__59:\n" + " ldr r7, .__76\n" + " ldrh r2, [r7, #0x2e]\n" + " mov r0, #0x2\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq .__71 @cond_branch\n" + " b .__94\n" + ".__71:\n" + " mov r0, #0x20\n" + " and r0, r0, r2\n" + " lsl r0, r0, #0x10\n" + " lsr r3, r0, #0x10\n" + " cmp r3, #0\n" + " beq .__73 @cond_branch\n" + " ldr r1, .__76 + 4\n" + " ldrb r0, [r1, #0x1]\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1, #0x1]\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bge .__79 @cond_branch\n" + " mov r0, #0x5\n" + " strb r0, [r1, #0x1]\n" + " b .__79\n" + ".__77:\n" + " .align 2, 0\n" + ".__76:\n" + " .word gMain\n" + " .word +0x2000000\n" + ".__73:\n" + " mov r0, #0x10\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq .__78 @cond_branch\n" + " ldr r1, .__81\n" + " ldrb r0, [r1, #0x1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1, #0x1]\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x5\n" + " bls .__79 @cond_branch\n" + " strb r3, [r1, #0x1]\n" + ".__79:\n" + " bl debug_sub_811B2E8\n" + " b .__116\n" + ".__82:\n" + " .align 2, 0\n" + ".__81:\n" + " .word +0x2000000\n" + ".__78:\n" + " and r1, r1, r2\n" + " lsl r0, r1, #0x10\n" + " lsr r4, r0, #0x10\n" + " cmp r4, #0\n" + " beq .__83 @cond_branch\n" + " mov r0, #0x3\n" + " strh r0, [r5, #0x8]\n" + " bl Menu_EraseScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x9\n" + " mov r3, #0x5\n" + " bl Menu_DrawStdWindowFrame\n" + " ldr r0, .__85\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl Menu_PrintText\n" + " ldr r0, .__85 + 4\n" + " mov r1, #0x1\n" + " mov r2, #0x3\n" + " bl Menu_PrintText\n" + " b .__116\n" + ".__86:\n" + " .align 2, 0\n" + ".__85:\n" + " .word Str_841B25C\n" + " .word Str_841B264\n" + ".__83:\n" + " mov r0, #0x4\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq .__87 @cond_branch\n" + " ldr r0, .__91\n" + " strb r4, [r0]\n" + " ldr r0, .__91 + 4\n" + " strb r4, [r0]\n" + " bl Menu_EraseScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0xa\n" + " mov r3, #0x13\n" + " bl Menu_DrawStdWindowFrame\n" + " ldr r0, .__91 + 8\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl Menu_PrintText\n" + " ldr r3, .__91 + 12\n" + " mov r0, #0x2\n" + " mov r1, #0x3\n" + " mov r2, #0x8\n" + " bl Menu_PrintItems\n" + " str r4, [sp]\n" + " mov r0, #0x9\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x3\n" + " mov r3, #0x8\n" + " bl InitMenu\n" + " ldrh r0, [r5, #0x8]\n" + " add r0, r0, #0x1\n" + " strh r0, [r5, #0x8]\n" + ".__87:\n" + " ldrh r1, [r7, #0x2e]\n" + " mov r0, #0x8\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne .__88 @cond_branch\n" + " b .__116\n" + ".__88:\n" + " ldr r1, .__91 + 16\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " b .__94\n" + ".__92:\n" + " .align 2, 0\n" + ".__91:\n" + " .word unk_debug_bss_1_2\n" + " .word unk_debug_bss_1_3\n" + " .word Str_841B254\n" + " .word _841B270\n" + " .word unk_debug_bss_1_4\n" + ".__66:\n" + " bl Menu_ProcessInput\n" + " lsl r0, r0, #0x18\n" + " asr r2, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r2, r0\n" + " beq .__116 @cond_branch\n" + " add r0, r0, #0x1\n" + " cmp r2, r0\n" + " beq .__94 @cond_branch\n" + " ldr r1, .__96\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " ldr r0, .__96 + 4\n" + " lsl r1, r2, #0x3\n" + " add r0, r0, #0x4\n" + " add r1, r1, r0\n" + " ldr r0, [r1]\n" + " bl _call_via_r0\n" + ".__94:\n" + " bl Menu_EraseScreen\n" + " add r0, r6, #0\n" + " bl DestroyTask\n" + " b .__116\n" + ".__97:\n" + " .align 2, 0\n" + ".__96:\n" + " .word unk_debug_bss_1_2\n" + " .word _841B270\n" + ".__68:\n" + " ldr r2, .__100\n" + " ldrh r1, [r2, #0x30]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq .__98 @cond_branch\n" + " ldr r2, .__100 + 4\n" + " ldrh r0, [r2, #0xc]\n" + " add r0, r0, #0x64\n" + " b .__99\n" + ".__101:\n" + " .align 2, 0\n" + ".__100:\n" + " .word gMain\n" + " .word +0x2000000\n" + ".__98:\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq .__102 @cond_branch\n" + " ldr r1, .__104\n" + " ldrh r0, [r1, #0xc]\n" + " sub r0, r0, #0x64\n" + " b .__103\n" + ".__105:\n" + " .align 2, 0\n" + ".__104:\n" + " .word +0x2000000\n" + ".__102:\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq .__106 @cond_branch\n" + " ldr r1, .__109\n" + " ldr r2, .__109 + 4\n" + " add r0, r2, #0\n" + " ldrh r2, [r1, #0xc]\n" + " add r0, r0, r2\n" + ".__103:\n" + " strh r0, [r1, #0xc]\n" + " lsl r0, r0, #0x10\n" + " cmp r0, #0\n" + " bgt .__116 @cond_branch\n" + " ldr r0, .__109 + 8\n" + " strh r0, [r1, #0xc]\n" + " b .__116\n" + ".__110:\n" + " .align 2, 0\n" + ".__109:\n" + " .word +0x2000000\n" + " .word 0xfffffc18\n" + " .word 0x270f\n" + ".__106:\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq .__111 @cond_branch\n" + " ldr r2, .__114\n" + " mov r1, #0xfa\n" + " lsl r1, r1, #0x2\n" + " add r0, r1, #0\n" + " ldrh r1, [r2, #0xc]\n" + " add r0, r0, r1\n" + ".__99:\n" + " strh r0, [r2, #0xc]\n" + " lsl r0, r0, #0x10\n" + " asr r0, r0, #0x10\n" + " ldr r1, .__114 + 4\n" + " cmp r0, r1\n" + " ble .__116 @cond_branch\n" + " strh r1, [r2, #0xc]\n" + " b .__116\n" + ".__115:\n" + " .align 2, 0\n" + ".__114:\n" + " .word +0x2000000\n" + " .word 0x270f\n" + ".__111:\n" + " ldrh r1, [r2, #0x2e]\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq .__116 @cond_branch\n" + " bl Menu_EraseScreen\n" + " add r0, r6, #0\n" + " bl DestroyTask\n" + ".__116:\n" + " add sp, sp, #0x8\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B894() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " add sp, sp, #0xfffffffc\n" + " ldr r1, .__122\n" + " ldrh r2, [r1, #0x8]\n" + " mov r0, #0xc0\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r2\n" + " add r4, r1, #0\n" + " cmp r0, #0\n" + " beq .__117 @cond_branch\n" + " add r1, r1, #0x90\n" + " ldr r0, [r1]\n" + " add r0, r0, #0x1\n" + " str r0, [r1]\n" + " ldr r2, .__122 + 4\n" + " cmp r0, r2\n" + " ble .__118 @cond_branch\n" + " str r2, [r1]\n" + ".__118:\n" + " add r0, r4, #0\n" + " add r0, r0, #0x88\n" + " ldr r1, [r1]\n" + " ldr r0, [r0]\n" + " cmp r1, r0\n" + " beq .__119 @cond_branch\n" + " ldr r0, .__122 + 8\n" + " mov r1, #0x4\n" + " mov r2, #0xf\n" + " bl Menu_PrintText\n" + " ldr r1, .__122 + 12\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + ".__119:\n" + " ldrb r1, [r4, #0x4]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " cmp r4, #0\n" + " bne .__126 @cond_branch\n" + " ldr r0, .__122 + 16\n" + " mov r1, #0x4\n" + " mov r2, #0x11\n" + " b .__121\n" + ".__123:\n" + " .align 2, 0\n" + ".__122:\n" + " .word +0x2000000\n" + " .word 0x270f\n" + " .word Str_841B2B0\n" + " .word unk_debug_bss_1_4\n" + " .word Str_841B2D3\n" + ".__117:\n" + " lsl r0, r2, #0x10\n" + " cmp r0, #0\n" + " beq .__127 @cond_branch\n" + " ldrb r1, [r4, #0x4]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq .__126 @cond_branch\n" + " mov r4, #0x3\n" + " and r4, r4, r2\n" + " cmp r4, #0\n" + " bne .__126 @cond_branch\n" + " ldr r0, .__163\n" + " mov r1, #0x4\n" + " mov r2, #0x2\n" + ".__121:\n" + " bl Menu_PrintText\n" + " ldr r0, .__163 + 4\n" + " strb r4, [r0]\n" + ".__126:\n" + " ldr r0, .__163 + 8\n" + " ldrh r1, [r0, #0x8]\n" + " add r4, r0, #0\n" + " cmp r1, #0\n" + " beq .__127 @cond_branch\n" + " b .__162\n" + ".__127:\n" + " mov r1, #0x12\n" + " ldsh r0, [r4, r1]\n" + " cmp r0, #0x3\n" + " beq .__129 @cond_branch\n" + " b .__162\n" + ".__129:\n" + " ldrb r1, [r4, #0x4]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq .__131 @cond_branch\n" + " b .__162\n" + ".__131:\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " bl GetTagOfReelSymbolOnScreenAtPos\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + " mov r0, #0x0\n" + " mov r1, #0x2\n" + " bl GetTagOfReelSymbolOnScreenAtPos\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " str r0, [sp]\n" + " mov r0, #0x0\n" + " mov r1, #0x3\n" + " bl GetTagOfReelSymbolOnScreenAtPos\n" + " lsl r0, r0, #0x18\n" + " lsr r6, r0, #0x18\n" + " mov r0, #0x1\n" + " mov r1, #0x1\n" + " bl GetTagOfReelSymbolOnScreenAtPos\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r9, r0\n" + " mov r0, #0x1\n" + " mov r1, #0x2\n" + " bl GetTagOfReelSymbolOnScreenAtPos\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " mov r0, #0x1\n" + " mov r1, #0x3\n" + " bl GetTagOfReelSymbolOnScreenAtPos\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov sl, r0\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " bl GetTagOfReelSymbolOnScreenAtPos\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " mov r0, #0x2\n" + " mov r1, #0x2\n" + " bl GetTagOfReelSymbolOnScreenAtPos\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r8, r0\n" + " mov r0, #0x2\n" + " mov r1, #0x3\n" + " bl GetTagOfReelSymbolOnScreenAtPos\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r7, #0\n" + " bne .__134 @cond_branch\n" + " mov r1, r9\n" + " cmp r1, #0x1\n" + " bne .__134 @cond_branch\n" + " cmp r5, #0\n" + " beq .__159 @cond_branch\n" + ".__134:\n" + " ldr r1, [sp]\n" + " cmp r1, #0\n" + " bne .__137 @cond_branch\n" + " cmp r4, #0x1\n" + " bne .__137 @cond_branch\n" + " mov r1, r8\n" + " cmp r1, #0\n" + " beq .__159 @cond_branch\n" + ".__137:\n" + " cmp r6, #0\n" + " bne .__140 @cond_branch\n" + " mov r1, sl\n" + " cmp r1, #0x1\n" + " bne .__140 @cond_branch\n" + " cmp r0, #0\n" + " beq .__159 @cond_branch\n" + ".__140:\n" + " cmp r7, #0\n" + " bne .__143 @cond_branch\n" + " cmp r4, #0x1\n" + " bne .__143 @cond_branch\n" + " cmp r0, #0\n" + " beq .__159 @cond_branch\n" + ".__143:\n" + " cmp r6, #0\n" + " bne .__146 @cond_branch\n" + " cmp r4, #0x1\n" + " bne .__146 @cond_branch\n" + " cmp r5, #0\n" + " beq .__159 @cond_branch\n" + ".__146:\n" + " cmp r7, #0x1\n" + " bne .__149 @cond_branch\n" + " mov r1, r9\n" + " cmp r1, #0\n" + " bne .__149 @cond_branch\n" + " cmp r5, #0x1\n" + " beq .__159 @cond_branch\n" + ".__149:\n" + " ldr r1, [sp]\n" + " cmp r1, #0x1\n" + " bne .__152 @cond_branch\n" + " cmp r4, #0\n" + " bne .__152 @cond_branch\n" + " mov r1, r8\n" + " cmp r1, #0x1\n" + " beq .__159 @cond_branch\n" + ".__152:\n" + " cmp r6, #0x1\n" + " bne .__155 @cond_branch\n" + " mov r1, sl\n" + " cmp r1, #0\n" + " bne .__155 @cond_branch\n" + " cmp r0, #0x1\n" + " beq .__159 @cond_branch\n" + ".__155:\n" + " cmp r7, #0x1\n" + " bne .__158 @cond_branch\n" + " cmp r4, #0\n" + " bne .__158 @cond_branch\n" + " cmp r0, #0x1\n" + " beq .__159 @cond_branch\n" + ".__158:\n" + " cmp r6, #0x1\n" + " bne .__162 @cond_branch\n" + " cmp r4, #0\n" + " bne .__162 @cond_branch\n" + " cmp r5, #0x1\n" + " bne .__162 @cond_branch\n" + ".__159:\n" + " ldr r0, .__163 + 12\n" + " mov r1, #0x4\n" + " mov r2, #0x0\n" + " bl Menu_PrintText\n" + " ldr r1, .__163 + 4\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + ".__162:\n" + " add sp, sp, #0x4\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + ".__164:\n" + " .align 2, 0\n" + ".__163:\n" + " .word Str_841B2E4\n" + " .word unk_debug_bss_1_4\n" + " .word +0x2000000\n" + " .word Str_841B2BF\n" + "\n" + ); +} +#endif + +static const u8 sReelSymbols[][21] = +{ + { + SLOT_MACHINE_TAG_7_RED, + SLOT_MACHINE_TAG_CHERRY, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_7_BLUE, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_CHERRY, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_7_RED, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_7_BLUE, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_REPLAY + }, { + SLOT_MACHINE_TAG_7_RED, + SLOT_MACHINE_TAG_CHERRY, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_CHERRY, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_7_BLUE, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_CHERRY, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_CHERRY, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_CHERRY + }, { + SLOT_MACHINE_TAG_7_RED, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_7_BLUE, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_CHERRY + } +}; + +static const u8 gUnknown_083ECCF1[] = { + 1, 0, 5, 4, 3, 2 +}; + +static const s16 gUnknown_083ECCF8[][2] = { + {0, 6}, + {0, 10}, + {0, 2} +}; + +static const u8 gUnknown_083ECD04[][3] = { + {1, 1, 12}, + {1, 1, 14}, + {2, 2, 14}, + {2, 2, 14}, + {2, 3, 16}, + {3, 3, 16} +}; + +static const u8 gUnknown_083ECD16[][6] = { + {25, 25, 30, 40, 40, 50}, + {25, 25, 30, 30, 35, 35}, + {25, 25, 30, 25, 25, 30} +}; + +static const u8 gUnknown_083ECD28[][6] = { + {20, 25, 25, 20, 25, 25}, + {12, 15, 15, 18, 19, 22}, + {25, 25, 25, 30, 30, 40}, + {25, 25, 20, 20, 15, 15}, + {40, 40, 35, 35, 40, 40} +}; + +static const u8 gUnknown_083ECD46[][17] = { + {243, 243, 243, 80, 80, 80, 80, 40, 40, 40, 40, 40, 40, 5, 5, 5, 5}, + { 5, 5, 5, 150, 150, 150, 150, 130, 130, 130, 130, 130, 130, 100, 100, 100, 5}, + { 4, 4, 4, 20, 20, 20, 20, 80, 80, 80, 80, 80, 80, 100, 100, 100, 40}, + { 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 45, 45, 45, 100}, + { 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 100}, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6} +}; + +static const u8 gUnknown_083ECDAC[][17] = { + { 243, 243, 243, 200, 200, 200, 200, 160, 160, 160, 160, 160, 160, 70, 70, 70, 5}, + { 5, 5, 5, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 2, 2, 2, 6}, + { 4, 4, 4, 25, 25, 25, 25, 30, 30, 30, 30, 30, 30, 40, 40, 40, 35}, + { 2, 2, 2, 3, 3, 3, 3, 30, 30, 30, 30, 30, 30, 100, 100, 100, 50}, + { 1, 1, 1, 2, 2, 2, 2, 30, 30, 30, 30, 30, 30, 40, 40, 40, 100}, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 60} +}; + +static const u16 gUnknown_083ECE12[] = { + 0x80, 0xaf, 0xc8, 0xe1, 0x100 +}; + +static const u16 gUnknown_083ECE1C[][2] = { + {10, 5}, + {10, 10}, + {10, 15}, + {10, 25}, + {10, 35} +}; + +static const u16 gUnknown_083ECE30[] = { + 0, 5, 10, 15, 20 +}; + + +static const u8 gUnknown_083ECE3A[] = { + 6, 4, 3, 2, 5, 0, 0, 0 +}; + +static const u16 gUnknown_083ECE42[] = { + 0x80, 0x20, 0x40 +}; + +static const u16 gUnknown_083ECE48[] = { + 0x10, 0x08, 0x04, 0x02, 0x01 +}; + +static const u8 sSym2Match[] = { + SLOT_MACHINE_MATCHED_777_RED, + SLOT_MACHINE_MATCHED_777_BLUE, + SLOT_MACHINE_MATCHED_AZURILL, + SLOT_MACHINE_MATCHED_LOTAD, + SLOT_MACHINE_MATCHED_1CHERRY, + SLOT_MACHINE_MATCHED_POWER, + SLOT_MACHINE_MATCHED_REPLAY +}; + +static const u16 sSlotMatchFlags[] = { + 1 << SLOT_MACHINE_MATCHED_1CHERRY, + 1 << SLOT_MACHINE_MATCHED_2CHERRY, + 1 << SLOT_MACHINE_MATCHED_REPLAY, + 1 << SLOT_MACHINE_MATCHED_LOTAD, + 1 << SLOT_MACHINE_MATCHED_AZURILL, + 1 << SLOT_MACHINE_MATCHED_POWER, + 1 << SLOT_MACHINE_MATCHED_777_MIXED, + 1 << SLOT_MACHINE_MATCHED_777_RED, + 1 << SLOT_MACHINE_MATCHED_777_BLUE +}; + +static const u16 sSlotPayouts[] = { + 2, 4, 0, 6, 12, 3, 90, 300, 300 +}; + +static const s16 gUnknown_083ECE7E[][2] = { + { 0xd0, 0x38}, + { 0xb8, 0x00}, + { 0xc8, 0x08}, + { 0xd8, 0x10}, + { 0xe8, 0x18}, + { 0xd0, 0x48}, + { 0xd0, 0x08}, + { 0xd0, 0x40}, + { 0xd0, 0x38}, + { 0xc0, 0x58}, + { 0xe0, 0x58}, + { 0xc0, 0x78}, + { 0xe0, 0x78}, + { 0x90, 0x38}, + {0x110, 0x58}, + { 0xa8, 0x70}, + { 0xd0, 0x54}, + { 0xd0, 0x70}, + { 0xbc, 0x34}, + { 0xd0, 0x34}, + { 0xe4, 0x34}, + { 0xb8, 0x48}, + { 0xc4, 0x48}, + { 0xd0, 0x48}, + { 0xdc, 0x48}, + { 0xe8, 0x48}, + { 0xbc, 0x34}, + { 0xd0, 0x34}, + { 0xe4, 0x34}, + { 0xb8, 0x48}, + { 0xc4, 0x48}, + { 0xd0, 0x48}, + { 0xdc, 0x48}, + { 0xe8, 0x48}, + { 0x00, 0x00} +}; + +static const SpriteCallback gUnknown_083ECF0C[] = { + sub_8105C64, + sub_8105F54, + sub_8105F54, + sub_8105F54, + sub_8105F54, + sub_8105F9C, + sub_8105EB4, + sub_8105C64, + sub_8105C64, + sub_8105C6C, + sub_8105CF0, + sub_8105D08, + sub_8105D20, + sub_8105D3C, + sub_8105DA4, + sub_8105E08, + sub_8105C64, + sub_8106058, + sub_81060FC, + sub_81060FC, + sub_81060FC, + sub_81060FC, + sub_81060FC, + sub_81060FC, + sub_81060FC, + sub_81060FC, + sub_81061C8, + sub_81061C8, + sub_81061C8, + sub_81061C8, + sub_81061C8, + sub_81061C8, + sub_81061C8, + sub_81061C8, + sub_8106230 +}; + +static const struct UnkStruct1 Unknown_83ECF98[] = { + {25, 34, 0}, + {2, 0, 0}, + {9, 16, 0}, + {255, 0, 0} +}; + +static const struct UnkStruct1 Unknown_83ECFA8[] = { + {10, 1, 0}, + {11, 2, 0}, + {12, 3, 0}, + {13, 4, 0}, + {5, 5, 0}, + {8, 6, 0}, + {255, 0, 0} +}; + +static const struct UnkStruct1 Unknown_83ECFC4[] = { + {3, 7, 0}, + {8, 17, 0}, + {255, 0, 0} +}; + +static const struct UnkStruct1 Unknown_83ECFD0[] = { + {4, 8, 0}, + {6, 9, 0}, + {6, 10, 1}, + {6, 11, 2}, + {6, 12, 3}, + {255, 0, 0} +}; + +static const struct UnkStruct1 Unknown_83ECFE8[] = { + {0, 13, 0}, + {1, 14, 0}, + {7, 15, 0}, + {255, 0, 0} +}; + +static const struct UnkStruct1 Unknown_83ECFF8[] = { + {19, 26, 0}, + {20, 27, 1}, + {21, 28, 2}, + {14, 29, 3}, + {15, 30, 4}, + {16, 31, 5}, + {17, 32, 6}, + {18, 33, 7}, + {8, 17, 0}, + {255, 0, 0} +}; + +static const struct UnkStruct1 Unknown_83ED020[] = { + {22, 18, 0}, + {23, 19, 1}, + {24, 20, 2}, + {14, 21, 3}, + {15, 22, 4}, + {16, 23, 5}, + {17, 24, 6}, + {18, 25, 7}, + {8, 17, 0}, + {255, 0, 0} +}; + +static const struct UnkStruct1 *const gUnknown_083ED048[] = { + Unknown_83ECF98, + Unknown_83ECFA8, + Unknown_83ECFC4, + Unknown_83ECFD0, + Unknown_83ECFE8, + Unknown_83ED020, + Unknown_83ECFF8 +}; + +static void (*const gUnknown_083ED064[])(void) = { + sub_810639C, + sub_8106364, + sub_8106370, + nullsub_70, + nullsub_70, + sub_8106370, + sub_8106370 +}; + + +static const struct OamData gOamData_83ED080 = { + .y = 0x0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_SQUARE, + .x = 0x0, + .matrixNum = 0, + .size = 0, + .tileNum = 0x0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct OamData gOamData_83ED088 = { + .y = 0x0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_V_RECTANGLE, + .x = 0x0, + .matrixNum = 0, + .size = 0, + .tileNum = 0x0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct OamData gOamData_83ED090 = { + .y = 0x0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_SQUARE, + .x = 0x0, + .matrixNum = 0, + .size = 1, + .tileNum = 0x0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct OamData gOamData_83ED098 = { + .y = 0x0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_V_RECTANGLE, + .x = 0x0, + .matrixNum = 0, + .size = 2, + .tileNum = 0x0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct OamData gOamData_83ED0A0 = { + .y = 0x0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_SQUARE, + .x = 0x0, + .matrixNum = 0, + .size = 2, + .tileNum = 0x0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct OamData gOamData_83ED0A8 = { + .y = 0x0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_V_RECTANGLE, + .x = 0x0, + .matrixNum = 0, + .size = 3, + .tileNum = 0x0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct OamData gOamData_83ED0B0 = { + .y = 0x0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_H_RECTANGLE, + .x = 0x0, + .matrixNum = 0, + .size = 3, + .tileNum = 0x0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct OamData gOamData_83ED0B8 = { + .y = 0x0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_SQUARE, + .x = 0x0, + .matrixNum = 0, + .size = 3, + .tileNum = 0x0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED0C0[] = { + {eSlotMachineReelTimeGfxBuffer + 0x0000, 0x800}, + {eSlotMachineReelTimeGfxBuffer + 0x0800, 0x800}, + {eSlotMachineReelTimeGfxBuffer + 0x1000, 0x800}, + {eSlotMachineReelTimeGfxBuffer + 0x1800, 0x800}, + {eSlotMachineReelTimeGfxBuffer + 0x2000, 0x800} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED0E8[] = { + {eSlotMachineReelTimeGfxBuffer + 0x2800, 0x300} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED0F0[] = { + {eSlotMachineReelTimeGfxBuffer + 0x2B00, 0x500} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED0F8[] = { + {eSlotMachineReelTimeGfxBuffer + 0x3000, 0x600} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED100[] = { + {gSpriteImage_8E988E8, 0x80}, + {gSpriteImage_8E98968, 0x80}, + {gSpriteImage_8E989E8, 0x80}, + {gSpriteImage_8E98A68, 0x80}, + {gSpriteImage_8E98AE8, 0x80}, + {gSpriteImage_8E98B68, 0x80} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED130[] = { + {gSpriteImage_8E991E8, 0x200} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED138[] = { + {gSpriteImage_8E99808, 0x40} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED140[] = { + {gSpriteImage_8E98BE8, 0x100}, + {gSpriteImage_8E98CE8, 0x100} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED150[] = { + {gSpriteImage_8E993E8, 0x400} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED158[] = { + {gSpriteImage_8E98DE8, 0x200}, + {gSpriteImage_8E98FE8, 0x200} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED168[] = { + {gSpriteImage_8E98848, 0x20} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED170[] = { + {gSpriteImage_8E98868, 0x80} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED178[] = { + {eSlotMachineGfxBuffer + 0x0000, 0x600} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED180[] = { + {eSlotMachineGfxBuffer + 0x0600, 0x200} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED188[] = { + {eSlotMachineGfxBuffer + 0x0800, 0x200} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED190[] = { + {eSlotMachineGfxBuffer + 0x0A00, 0x200} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED198[] = { + {eSlotMachineGfxBuffer + 0x0C00, 0x300} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED1A0[] = { + {eSlotMachineGfxBuffer + 0x1000, 0x400} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED1A8[] = { + {eSlotMachineGfxBuffer + 0x1400, 0x200} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED1B0[] = { + {eSlotMachineGfxBuffer + 0x1600, 0x300} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED1B8[] = { + {eSlotMachineGfxBuffer + 0x1900, 0x300} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED1C0[] = { + {eSlotMachineGfxBuffer + 0x1C00, 0x200}, + {eSlotMachineGfxBuffer + 0x1E00, 0x200}, + {eSlotMachineGfxBuffer + 0x1E00, 0x200} // is this a typo? +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED1D8[] = { + {eSlotMachineGfxBuffer + 0x2000, 0x280} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED1E0[] = { + {eSlotMachineGfxBuffer + 0x2280, 0x80}, + {eSlotMachineGfxBuffer + 0x2300, 0x80}, + {eSlotMachineGfxBuffer + 0x2380, 0x80}, + {eSlotMachineGfxBuffer + 0x2400, 0x80}, + {eSlotMachineGfxBuffer + 0x2480, 0x80} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED208[] = { + {eSlotMachineGfxBuffer + 0x2600, 0x480}, + {eSlotMachineGfxBuffer + 0x2A80, 0x480} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED218[] = { + {eSlotMachineGfxBuffer + 0x2F00, 0x180}, + {eSlotMachineGfxBuffer + 0x3080, 0x180} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED228[] = { + {gSpriteImage_8E98828, 0x20} +}; + +static const union AnimCmd gSpriteAnim_83ED230[] = { + ANIMCMD_FRAME(0, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED238[] = { + ANIMCMD_FRAME(0, 1), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gSpriteAnim_83ED240[] = { + ANIMCMD_FRAME(0, 16), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED248[] = { + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gSpriteAnim_83ED254[] = { + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gSpriteAnim_83ED260[] = { + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gSpriteAnim_83ED26C[] = { + ANIMCMD_FRAME(2, 32), + ANIMCMD_FRAME(3, 32), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gSpriteAnim_83ED278[] = { + ANIMCMD_FRAME(4, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED280[] = { + ANIMCMD_FRAME(0, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED288[] = { + ANIMCMD_FRAME(1, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED290[] = { + ANIMCMD_FRAME(2, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED298[] = { + ANIMCMD_FRAME(3, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED2A0[] = { + ANIMCMD_FRAME(4, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED2A8[] = { + ANIMCMD_FRAME(5, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED2B0[] = { + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gSpriteAnim_83ED2BC[] = { + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gSpriteAnim_83ED2C8[] = { + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gSpriteAnim_83ED2D4[] = { + ANIMCMD_FRAME(1, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED2DC[] = { + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gSpriteAnim_83ED2E8[] = { + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16, .hFlip = TRUE), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gSpriteAnim_83ED2FC[] = { + ANIMCMD_FRAME(0, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED304[] = { + ANIMCMD_FRAME(0, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED30C[] = { + ANIMCMD_FRAME(1, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED314[] = { + ANIMCMD_FRAME(2, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED31C[] = { + ANIMCMD_FRAME(3, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED324[] = { + ANIMCMD_FRAME(4, 1), + ANIMCMD_END +}; + +static const union AnimCmd *const gSpriteAnimTable_83ED32C[] = { + gSpriteAnim_83ED230 +}; + +static const union AnimCmd *const gSpriteAnimTable_83ED330[] = { + gSpriteAnim_83ED238 +}; + +static const union AnimCmd *const gSpriteAnimTable_83ED334[] = { + gSpriteAnim_83ED240, + gSpriteAnim_83ED248, + gSpriteAnim_83ED254, + gSpriteAnim_83ED260, + gSpriteAnim_83ED26C, + gSpriteAnim_83ED278 +}; + +static const union AnimCmd *const gSpriteAnimTable_83ED34C[] = { + gSpriteAnim_83ED280, + gSpriteAnim_83ED288, + gSpriteAnim_83ED290, + gSpriteAnim_83ED298, + gSpriteAnim_83ED2A0, + gSpriteAnim_83ED2A8 +}; + +static const union AnimCmd *const gSpriteAnimTable_83ED364[] = { + gSpriteAnim_83ED2B0 +}; + +static const union AnimCmd *const gSpriteAnimTable_83ED368[] = { + gSpriteAnim_83ED2BC +}; + +static const union AnimCmd *const gSpriteAnimTable_83ED36C[] = { + gSpriteAnim_83ED2C8, + gSpriteAnim_83ED2D4 +}; + +static const union AnimCmd *const gSpriteAnimTable_83ED374[] = { + gSpriteAnim_83ED2DC +}; + +static const union AnimCmd *const gSpriteAnimTable_83ED378[] = { + gSpriteAnim_83ED2E8, + gSpriteAnim_83ED2FC +}; + +static const union AnimCmd *const gSpriteAnimTable_83ED380[] = { + gSpriteAnim_83ED304, + gSpriteAnim_83ED30C, + gSpriteAnim_83ED314, + gSpriteAnim_83ED31C, + gSpriteAnim_83ED324 +}; + +static const union AffineAnimCmd gSpriteAffineAnim_83ED394[] = { + AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0), + AFFINEANIMCMD_LOOP(0), + AFFINEANIMCMD_FRAME(0x1, 0x1, 0, 1), + AFFINEANIMCMD_LOOP(255), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd *const gSpriteAffineAnimTable_83ED3BC[] = { + gSpriteAffineAnim_83ED394 +}; + +static const union AffineAnimCmd gSpriteAffineAnim_83ED3C0[] = { + AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 32), + AFFINEANIMCMD_FRAME(0x0, 0x0, 6, 32), + AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 16), + AFFINEANIMCMD_FRAME(0x0, 0x0, 12, 2), + AFFINEANIMCMD_FRAME(0x0, 0x0, -12, 4), + AFFINEANIMCMD_FRAME(0x0, 0x0, 12, 2), + AFFINEANIMCMD_FRAME(0x0, 0x0, 12, 2), + AFFINEANIMCMD_FRAME(0x0, 0x0, -12, 4), + AFFINEANIMCMD_FRAME(0x0, 0x0, 12, 2), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd *const gSpriteAffineAnimTable_83ED410[] = { + gSpriteAffineAnim_83ED3C0 +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED414 = { + 0, 0, &gOamData_83ED0A0, gSpriteAnimTable_83ED32C, NULL, gDummySpriteAffineAnimTable, sub_8104F18 +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED42C = { + 7, 4, &gOamData_83ED088, gSpriteAnimTable_83ED32C, NULL, gDummySpriteAffineAnimTable, sub_810506C +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED444 = { + 17, 0, &gOamData_83ED0B8, gSpriteAnimTable_83ED32C, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED45C = { + 0xFFFF, 1, &gOamData_83ED0B8, gSpriteAnimTable_83ED334, gSpriteImageTable_83ED0C0, gDummySpriteAffineAnimTable, sub_8105170 +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED474 = { + 0xFFFF, 2, &gOamData_83ED088, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED0E8, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED48C = { + 0xFFFF, 3, &gOamData_83ED088, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED0F0, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED4A4 = { + 0xFFFF, 3, &gOamData_83ED088, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED0F8, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED4BC = { + 0xFFFF, 4, &gOamData_83ED090, gSpriteAnimTable_83ED34C, gSpriteImageTable_83ED100, gDummySpriteAffineAnimTable, sub_810535C +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED4D4 = { + 0xFFFF, 4, &gOamData_83ED090, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED130, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED4EC = { + 0xFFFF, 4, &gOamData_83ED090, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED138, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED504 = { + 0xFFFF, 4, &gOamData_83ED098, gSpriteAnimTable_83ED364, gSpriteImageTable_83ED140, gDummySpriteAffineAnimTable, sub_810562C +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED51C = { + 0xFFFF, 7, &gOamData_83ED0A8, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED150, gDummySpriteAffineAnimTable, sub_8105784 +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED534 = { + 0xFFFF, 5, &gOamData_83ED0A0, gSpriteAnimTable_83ED368, gSpriteImageTable_83ED158, gDummySpriteAffineAnimTable, sub_8105894 +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED54C = { + 0xFFFF, 4, &gOamData_83ED080, gSpriteAnimTable_83ED330, gSpriteImageTable_83ED168, gDummySpriteAffineAnimTable, sub_810594C +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED564 = { + 0xFFFF, 4, &gOamData_83ED090, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED170, gSpriteAffineAnimTable_83ED3BC, sub_8105A38 +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED57C = { + 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED178, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED594 = { + 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED180, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED5AC = { + 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED188, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED5C4 = { + 18, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED190, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED5DC = { + 0xFFFF, 6, &gOamData_83ED0B0, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED198, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED5F4 = { + 0xFFFF, 6, &gOamData_83ED0B0, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED1A0, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED60C = { + 19, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED1A8, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED624 = { + 20, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED1B0, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED63C = { + 21, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED1B8, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED654 = { + 0xFFFF, 6, &gOamData_83ED0A0, gSpriteAnimTable_83ED36C, gSpriteImageTable_83ED1C0, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED66C = { + 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED1D8, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED684 = { + 0xFFFF, 6, &gOamData_83ED090, gSpriteAnimTable_83ED380, gSpriteImageTable_83ED1E0, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED69C = { + 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED378, gSpriteImageTable_83ED208, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED6B4 = { + 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED374, gSpriteImageTable_83ED218, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED6CC = { + 0xFFFF, 4, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED228, gSpriteAffineAnimTable_83ED410, sub_8105B70 +}; + +static const struct Subsprite gSubspriteTable_83ED6E4[] = { + {-64, -64, ST_OAM_SQUARE, 3, 0x0, 3}, + {0, -64, ST_OAM_SQUARE, 3, 0x0, 3}, + {-64, 0, ST_OAM_SQUARE, 3, 0x0, 3}, + {0, 0, ST_OAM_SQUARE, 3, 0x0, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED704[] = { + {4, gSubspriteTable_83ED6E4} +}; + +static const struct Subsprite gSubspriteTable_83ED70C[] = { + {-32, -12, ST_OAM_H_RECTANGLE, 1, 0x0, 1}, + {0, -12, ST_OAM_H_RECTANGLE, 1, 0x4, 1}, + {-32, -4, ST_OAM_H_RECTANGLE, 1, 0x8, 1}, + {0, -4, ST_OAM_H_RECTANGLE, 1, 0xc, 1}, + {-32, 4, ST_OAM_H_RECTANGLE, 1, 0x10, 1}, + {0, 4, ST_OAM_H_RECTANGLE, 1, 0x14, 1} +}; + +static const struct SubspriteTable gSubspriteTables_83ED73C[] = { + {6, gSubspriteTable_83ED70C} +}; + +static const struct Subsprite gSubspriteTable_83ED744[] = { + {-32, -20, ST_OAM_H_RECTANGLE, 3, 0x0, 1}, + {-32, 12, ST_OAM_H_RECTANGLE, 1, 0x20, 1}, + {0, 12, ST_OAM_H_RECTANGLE, 1, 0x24, 1} +}; + +static const struct SubspriteTable gSubspriteTables_83ED75C[] = { + {3, gSubspriteTable_83ED744} +}; + +static const struct Subsprite gSubspriteTable_83ED764[] = { + {-32, -24, ST_OAM_H_RECTANGLE, 3, 0x0, 1}, + {-32, 8, ST_OAM_H_RECTANGLE, 1, 0x20, 1}, + {0, 8, ST_OAM_H_RECTANGLE, 1, 0x24, 1}, + {-32, 16, ST_OAM_H_RECTANGLE, 1, 0x28, 1}, + {0, 16, ST_OAM_H_RECTANGLE, 1, 0x2c, 1} +}; + +static const struct SubspriteTable gSubspriteTables_83ED78C[] = { + {5, gSubspriteTable_83ED764} +}; + +static const struct Subsprite gSubspriteTable_83ED794[] = { + {-32, -8, ST_OAM_H_RECTANGLE, 1, 0x0, 1}, + {0, -8, ST_OAM_H_RECTANGLE, 1, 0x4, 1}, + {-32, 0, ST_OAM_H_RECTANGLE, 1, 0x8, 1}, + {0, 0, ST_OAM_H_RECTANGLE, 1, 0xc, 1} +}; + +static const struct SubspriteTable gSubspriteTables_83ED7B4[] = { + {4, gSubspriteTable_83ED794} +}; + +static const struct Subsprite gSubspriteTable_83ED7BC[] = { + {-8, -12, ST_OAM_H_RECTANGLE, 0, 0x0, 1}, + {-8, -4, ST_OAM_H_RECTANGLE, 0, 0x0, 1}, + {-8, 4, ST_OAM_H_RECTANGLE, 0, 0x0, 1} +}; + +static const struct SubspriteTable gSubspriteTables_83ED7D4[] = { + {3, gSubspriteTable_83ED7BC} +}; + +static const struct Subsprite gSubspriteTable_83ED7DC[] = { + {-32, -24, ST_OAM_H_RECTANGLE, 3, 0x0, 3}, + {-32, 8, ST_OAM_H_RECTANGLE, 1, 0x20, 3}, + {0, 8, ST_OAM_H_RECTANGLE, 1, 0x24, 3}, + {-32, 16, ST_OAM_H_RECTANGLE, 1, 0x28, 3}, + {0, 16, ST_OAM_H_RECTANGLE, 1, 0x2c, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED804[] = { + {5, gSubspriteTable_83ED7DC} +}; + +static const struct Subsprite gSubspriteTable_83ED80C[] = { + {-32, -8, ST_OAM_H_RECTANGLE, 1, 0x0, 3}, + {0, -8, ST_OAM_H_RECTANGLE, 1, 0x4, 3}, + {-32, 0, ST_OAM_H_RECTANGLE, 1, 0x8, 3}, + {0, 0, ST_OAM_H_RECTANGLE, 1, 0xc, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED82C[] = { + {4, gSubspriteTable_83ED80C} +}; + +static const struct Subsprite gSubspriteTable_83ED834[] = { + {-32, -8, ST_OAM_H_RECTANGLE, 1, 0x0, 3}, + {0, -8, ST_OAM_H_RECTANGLE, 1, 0x4, 3}, + {-32, 0, ST_OAM_H_RECTANGLE, 1, 0x8, 3}, + {0, 0, ST_OAM_H_RECTANGLE, 1, 0xc, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED854[] = { + {4, gSubspriteTable_83ED834} +}; + +static const struct Subsprite gSubspriteTable_83ED85C[] = { + {-32, -8, ST_OAM_H_RECTANGLE, 1, 0x0, 3}, + {0, -8, ST_OAM_H_RECTANGLE, 1, 0x4, 3}, + {-32, 0, ST_OAM_H_RECTANGLE, 1, 0x8, 3}, + {0, 0, ST_OAM_H_RECTANGLE, 1, 0xc, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED87C[] = { + {4, gSubspriteTable_83ED85C} +}; + +static const struct Subsprite gSubspriteTable_83ED884[] = { + {-32, -12, ST_OAM_H_RECTANGLE, 1, 0x0, 3}, + {0, -12, ST_OAM_H_RECTANGLE, 1, 0x4, 3}, + {-32, -4, ST_OAM_H_RECTANGLE, 1, 0x8, 3}, + {0, -4, ST_OAM_H_RECTANGLE, 1, 0xc, 3}, + {-32, 4, ST_OAM_H_RECTANGLE, 1, 0x10, 3}, + {0, 4, ST_OAM_H_RECTANGLE, 1, 0x14, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED8B4[] = { + {6, gSubspriteTable_83ED884} +}; + +static const struct Subsprite gSubspriteTable_83ED8BC[] = { + {-16, -16, ST_OAM_SQUARE, 2, 0x0, 3} +}; + +static const struct Subsprite gSubspriteTable_83ED8C4[] = { + {-8, -8, ST_OAM_SQUARE, 1, 0x10, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED8CC[] = { + {1, gSubspriteTable_83ED8BC}, + {1, gSubspriteTable_83ED8C4} +}; + +static const struct Subsprite gSubspriteTable_83ED8DC[] = { + {-24, -24, ST_OAM_H_RECTANGLE, 1, 0x0, 3}, + {8, -24, ST_OAM_H_RECTANGLE, 0, 0x4, 3}, + {-24, -16, ST_OAM_H_RECTANGLE, 1, 0x6, 3}, + {8, -16, ST_OAM_H_RECTANGLE, 0, 0xa, 3}, + {-24, -8, ST_OAM_H_RECTANGLE, 1, 0xc, 3}, + {8, -8, ST_OAM_H_RECTANGLE, 0, 0x10, 3}, + {-24, 0, ST_OAM_H_RECTANGLE, 1, 0x12, 3}, + {8, 0, ST_OAM_H_RECTANGLE, 0, 0x16, 3}, + {-24, 8, ST_OAM_H_RECTANGLE, 1, 0x18, 3}, + {8, 8, ST_OAM_H_RECTANGLE, 0, 0x1c, 3}, + {-24, 16, ST_OAM_H_RECTANGLE, 1, 0x1e, 3}, + {8, 16, ST_OAM_H_RECTANGLE, 0, 0x22, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED93C[] = { + 12, gSubspriteTable_83ED8DC +}; + +static const struct Subsprite gSubspriteTable_83ED944[] = { + {-16, -12, ST_OAM_H_RECTANGLE, 2, 0x0, 3}, + {-16, 4, ST_OAM_H_RECTANGLE, 0, 0x8, 3}, + {0, 4, ST_OAM_H_RECTANGLE, 0, 0xa, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED95C[] = { + {3, gSubspriteTable_83ED944} +}; + +static const struct Subsprite gSubspriteTable_83ED964[] = { + {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x0, 3}, + {-8, 0, ST_OAM_H_RECTANGLE, 0, 0x8, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED974[] = { + {2, gSubspriteTable_83ED964} +}; + +static const struct Subsprite gSubspriteTable_83ED97C[] = { + {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x2, 3}, + {-8, 0, ST_OAM_H_RECTANGLE, 0, 0xa, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED98C[] = { + {2, gSubspriteTable_83ED97C} +}; + +static const struct Subsprite gSubspriteTable_83ED994[] = { + {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x4, 3}, + {-8, 0, ST_OAM_H_RECTANGLE, 0, 0xc, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED9A4[] = { + {2, gSubspriteTable_83ED994} +}; + +static const struct Subsprite gSubspriteTable_83ED9AC[] = { + {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x6, 3}, + {-8, 0, ST_OAM_H_RECTANGLE, 0, 0xe, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED9BC[] = { + {2, gSubspriteTable_83ED9AC} +}; + +static const struct Subsprite gSubspriteTable_83ED9C4[] = { + {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x0, 3}, + {-8, 0, ST_OAM_H_RECTANGLE, 0, 0x8, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED9D4[] = { + {2, gSubspriteTable_83ED9C4} +}; + +static const struct Subsprite gSubspriteTable_83ED9DC[] = { + {-4, -8, ST_OAM_SQUARE, 0, 0x2, 3}, + {-4, 0, ST_OAM_SQUARE, 0, 0xa, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED9EC[] = { + {2, gSubspriteTable_83ED9DC} +}; + +static const struct Subsprite gSubspriteTable_83ED9F4[] = { + {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x3, 3}, + {-8, 0, ST_OAM_H_RECTANGLE, 0, 0xb, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83EDA04[] = { + {2, gSubspriteTable_83ED9F4} +}; + +static const struct Subsprite gSubspriteTable_83EDA0C[] = { + {-4, -8, ST_OAM_SQUARE, 0, 0x5, 3}, + {-4, 0, ST_OAM_SQUARE, 0, 0xd, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83EDA1C[] = { + {2, gSubspriteTable_83EDA0C} +}; + +static const struct Subsprite gSubspriteTable_83EDA24[] = { + {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x6, 3}, + {-8, 0, ST_OAM_H_RECTANGLE, 0, 0xe, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83EDA34[] = { + {2, gSubspriteTable_83EDA24} +}; + +static const struct Subsprite gSubspriteTable_83EDA3C[] = { + {-12, -12, ST_OAM_H_RECTANGLE, 0, 0x0, 3}, + {4, -12, ST_OAM_SQUARE, 0, 0x2, 3}, + {-12, -4, ST_OAM_H_RECTANGLE, 0, 0x8, 3}, + {4, -4, ST_OAM_SQUARE, 0, 0xa, 3}, + {-12, 4, ST_OAM_H_RECTANGLE, 0, 0x10, 3}, + {4, 4, ST_OAM_SQUARE, 0, 0x12, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83EDA6C[] = { + {6, gSubspriteTable_83EDA3C} +}; + +static const struct Subsprite gSubspriteTable_83EDA74[] = { + {-8, -12, ST_OAM_H_RECTANGLE, 0, 0x3, 3}, + {-8, -4, ST_OAM_H_RECTANGLE, 0, 0xb, 3}, + {-8, 4, ST_OAM_H_RECTANGLE, 0, 0x13, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83EDA8C[] = { + {3, gSubspriteTable_83EDA74} +}; + +static const struct Subsprite gSubspriteTable_83EDA94[] = { + {-12, -12, ST_OAM_H_RECTANGLE, 0, 0x5, 3}, + {4, -12, ST_OAM_SQUARE, 0, 0x7, 3}, + {-12, -4, ST_OAM_H_RECTANGLE, 0, 0xd, 3}, + {4, -4, ST_OAM_SQUARE, 0, 0xf, 3}, + {-12, 4, ST_OAM_H_RECTANGLE, 0, 0x15, 3}, + {4, 4, ST_OAM_SQUARE, 0, 0x17, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83EDAC4[] = { + {6, gSubspriteTable_83EDA94} +}; + +static const struct Subsprite gSubspriteTable_83EDACC[] = { + {-12, -12, ST_OAM_H_RECTANGLE, 0, 0x0, 3}, + {4, -12, ST_OAM_SQUARE, 0, 0x2, 3}, + {-12, -4, ST_OAM_H_RECTANGLE, 0, 0x8, 3}, + {4, -4, ST_OAM_SQUARE, 0, 0xa, 3}, + {-12, 4, ST_OAM_H_RECTANGLE, 0, 0x10, 3}, + {4, 4, ST_OAM_SQUARE, 0, 0x12, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83EDAFC[] = { + {6, gSubspriteTable_83EDACC} +}; + +static const struct Subsprite gSubspriteTable_83EDB04[] = { + {-8, -12, ST_OAM_H_RECTANGLE, 0, 0x3, 3}, + {-8, -4, ST_OAM_H_RECTANGLE, 0, 0xb, 3}, + {-8, 4, ST_OAM_H_RECTANGLE, 0, 0x13, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83EDB1C[] = { + {3, gSubspriteTable_83EDB04} +}; + +static const struct Subsprite gSubspriteTable_83EDB24[] = { + {-12, -12, ST_OAM_H_RECTANGLE, 0, 0x5, 3}, + {4, -12, ST_OAM_SQUARE, 0, 0x7, 3}, + {-12, -4, ST_OAM_H_RECTANGLE, 0, 0xd, 3}, + {4, -4, ST_OAM_SQUARE, 0, 0xf, 3}, + {-12, 4, ST_OAM_H_RECTANGLE, 0, 0x15, 3}, + {4, 4, ST_OAM_SQUARE, 0, 0x17, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83EDB54[] = { + {6, gSubspriteTable_83EDB24} +}; + +static const struct SpriteTemplate *const gUnknown_083EDB5C[] = { + &gSpriteTemplate_83ED57C, + &gSpriteTemplate_83ED594, + &gSpriteTemplate_83ED5AC, + &gSpriteTemplate_83ED5DC, + &gSpriteTemplate_83ED5F4, + &gSpriteTemplate_83ED654, + &gSpriteTemplate_83ED66C, + &gSpriteTemplate_83ED684, + &gSpriteTemplate_83ED69C, + &gSpriteTemplate_83ED6B4, + &gSpriteTemplate_83ED5C4, + &gSpriteTemplate_83ED5C4, + &gSpriteTemplate_83ED5C4, + &gSpriteTemplate_83ED5C4, + &gSpriteTemplate_83ED60C, + &gSpriteTemplate_83ED60C, + &gSpriteTemplate_83ED60C, + &gSpriteTemplate_83ED60C, + &gSpriteTemplate_83ED60C, + &gSpriteTemplate_83ED624, + &gSpriteTemplate_83ED624, + &gSpriteTemplate_83ED624, + &gSpriteTemplate_83ED63C, + &gSpriteTemplate_83ED63C, + &gSpriteTemplate_83ED63C, + &gDummySpriteTemplate +}; + +static const struct SubspriteTable *const gUnknown_083EDBC4[] = { + gSubspriteTables_83ED804, + gSubspriteTables_83ED82C, + gSubspriteTables_83ED854, + gSubspriteTables_83ED8B4, + NULL, + NULL, + gSubspriteTables_83ED8CC, + NULL, + gSubspriteTables_83ED93C, + gSubspriteTables_83ED95C, + gSubspriteTables_83ED974, + gSubspriteTables_83ED98C, + gSubspriteTables_83ED9A4, + gSubspriteTables_83ED9BC, + gSubspriteTables_83ED9D4, + gSubspriteTables_83ED9EC, + gSubspriteTables_83EDA04, + gSubspriteTables_83EDA1C, + gSubspriteTables_83EDA34, + gSubspriteTables_83EDA6C, + gSubspriteTables_83EDA8C, + gSubspriteTables_83EDAC4, + gSubspriteTables_83EDAFC, + gSubspriteTables_83EDB1C, + gSubspriteTables_83EDB54, + NULL +}; + +static const struct SpriteSheet sSlotMachineSpriteSheets[] = { + {gSlotMachineReelSymbol1Tiles, 0x200, 0}, + {gSlotMachineReelSymbol2Tiles, 0x200, 1}, + {gSlotMachineReelSymbol3Tiles, 0x200, 2}, + {gSlotMachineReelSymbol4Tiles, 0x200, 3}, + {gSlotMachineReelSymbol5Tiles, 0x200, 4}, + {gSlotMachineReelSymbol6Tiles, 0x200, 5}, + {gSlotMachineReelSymbol7Tiles, 0x200, 6}, + {gSlotMachineNumber0Tiles, 0x40, 7}, + {gSlotMachineNumber1Tiles, 0x40, 8}, + {gSlotMachineNumber2Tiles, 0x40, 9}, + {gSlotMachineNumber3Tiles, 0x40, 10}, + {gSlotMachineNumber4Tiles, 0x40, 11}, + {gSlotMachineNumber5Tiles, 0x40, 12}, + {gSlotMachineNumber6Tiles, 0x40, 13}, + {gSlotMachineNumber7Tiles, 0x40, 14}, + {gSlotMachineNumber8Tiles, 0x40, 15}, + {gSlotMachineNumber9Tiles, 0x40, 16}, + {eSlotMachineGfxBuffer + 0x0A00, 0x200, 18}, + {eSlotMachineGfxBuffer + 0x1400, 0x200, 19}, + {eSlotMachineGfxBuffer + 0x1600, 0x300, 20}, + {eSlotMachineGfxBuffer + 0x1900, 0x300, 21}, + {} +}; + +static const struct SpriteSheet gUnknown_083EDCDC = { + eSlotMachineGfxBuffer + 0x0000, 0x800, 17 +}; + +static const u8 *const gUnknown_083EDCE4 = gUnknownPalette_08E997E8; + +#ifdef SAPPHIRE +static const u16 UnknownPalette_83EDCE8[] = INCBIN_U16("graphics/unknown/sapphire_83EDD40.gbapal"); +#elif defined(RUBY) +static const u16 UnknownPalette_83EDCE8[] = INCBIN_U16("graphics/unknown/ruby_83EDCE8.gbapal"); +#endif // RS + +static const u16 *const gUnknown_083EDD08[] = { + UnknownPalette_83EDCE8 + 10, + UnknownPalette_83EDCE8 + 11, + UnknownPalette_83EDCE8 + 12, + UnknownPalette_83EDCE8 + 13, + UnknownPalette_83EDCE8 + 14 +}; + +static const u16 *const gUnknown_083EDD1C[] = { + gUnknown_08E95A18 + 74, + gUnknown_08E95A18 + 75, + gUnknown_08E95A18 + 76, + gUnknown_08E95A18 + 77, + gUnknown_08E95A18 + 78 +}; + +static const u8 gUnknown_083EDD30[] = { + 0x4a, 0x4b, 0x4c, 0x4e, 0x4d +}; + +static const u8 gUnknown_083EDD35[][2] = { + {0, 0}, + {1, 2}, + {3, 4} +}; +static const u8 gUnknown_083EDD3B[] = {1, 2, 2}; + +#ifdef SAPPHIRE +static const u16 Unknown_83EDD3E[] = INCBIN_U16("graphics/unknown/sapphire_83EDD96.gbapal"); +static const u16 Unknown_83EDD5E[] = INCBIN_U16("graphics/unknown/sapphire_83EDDB6.gbapal"); +static const u16 Unknown_83EDD7E[] = INCBIN_U16("graphics/unknown/sapphire_83EDDD6.gbapal"); +#elif defined (RUBY) +static const u16 Unknown_83EDD3E[] = INCBIN_U16("graphics/unknown/ruby_83EDD3E.gbapal"); +static const u16 Unknown_83EDD5E[] = INCBIN_U16("graphics/unknown/ruby_83EDD5E.gbapal"); +static const u16 Unknown_83EDD7E[] = INCBIN_U16("graphics/unknown/ruby_83EDD7E.gbapal"); +#endif // RS + +static const u16 *const gUnknown_083EDDA0[] = { + Unknown_83EDD3E, + Unknown_83EDD5E, + Unknown_83EDD7E +}; + +static const u16 *const gUnknown_083EDDAC = gUnknown_08E95A18 + 16; + +static const u16 Palette_83EDDB0[] = INCBIN_U16("graphics/slot_machine/83EDDB0.gbapal"); +static const u16 Palette_83EDDD0[] = INCBIN_U16("graphics/slot_machine/83EDDD0.gbapal"); +static const u16 Palette_83EDDF0[] = INCBIN_U16("graphics/slot_machine/83EDDF0.gbapal"); + +static const u16 *const gUnknown_083EDE10[] = { + Palette_83EDDB0, + Palette_83EDDD0, + Palette_83EDDF0, + gSlotMachineSpritePalette6 +}; + +static const u16 *const gUnknown_083EDE20 = gSlotMachineSpritePalette6; + +static const u16 gPalette_83EDE24[] = INCBIN_U16("graphics/slot_machine/83EDE24_pal.bin"); + +static const struct SpritePalette gSlotMachineSpritePalettes[] = { + {gSlotMachineSpritePalette0, 0}, + {gSlotMachineSpritePalette1, 1}, + {gSlotMachineSpritePalette2, 2}, + {gSlotMachineSpritePalette3, 3}, + {gSlotMachineSpritePalette4, 4}, + {gSlotMachineSpritePalette5, 5}, + {gSlotMachineSpritePalette6, 6}, + {gSlotMachineSpritePalette4, 7}, + {} +}; + +static const u8 sReelTimeGfx[] = INCBIN_U8("graphics/slot_machine/reel_time.4bpp.lz"); + +static const u16 sReelTimeWindowTilemap[] = INCBIN_U16("graphics/slot_machine/reel_time_window_map.bin"); + +#if DEBUG + +const u8 Str_841B1C4[] = _("SETTEI"); +const u8 Str_841B1CB[] = _("MAWASITA"); +const u8 Str_841B1D4[] = _("MODOSI"); +const u8 Str_841B1DB[] = _("NOMARE"); +const u8 Str_841B1E2[] = _("MAE 7"); +const u8 Str_841B1E8[] = _("LR HENKOU"); +const u8 Str_841B1F3[] = _("START JIDOUSU"); +const u8 Str_841B202[] = _("SELECT SETTEI"); +const u8 Str_841B211[] = _("TYUHSEN"); +const u8 Str_841B219[] = _("CHERRY"); +const u8 Str_841B220[] = _("REPLAY"); +const u8 Str_841B227[] = _("HASUBO"); +const u8 Str_841B22E[] = _("RURIRI"); +const u8 Str_841B235[] = _("INAZU"); +const u8 Str_841B23B[] = _("REG"); +const u8 Str_841B23F[] = _("BIG"); +const u8 Str_841B243[] = _("BD"); +const u8 Str_841B246[] = _("R7"); +const u8 Str_841B249[] = _("B7"); +const u8 Str_841B24C[] = _("A COIN"); +const u8 Str_841B254[] = _("TYUHSEN"); +const u8 Str_841B25C[] = _("UD 100"); +const u8 Str_841B264[] = _("LR 1000"); +const u8 Str_841B26D[] = _("×"); + +// Is this MenuAction2? I'm not sure. +const struct {const u8 *text; void (*func)();} _841B270[] = +{ + {Str_841B219, debug_sub_811B1C4}, + {Str_841B220, debug_sub_811B1EC}, + {Str_841B227, debug_sub_811B210}, + {Str_841B22E, debug_sub_811B238}, + {Str_841B235, debug_sub_811B260}, + {Str_841B23B, debug_sub_811B288}, + {Str_841B23F, debug_sub_811B2B0}, + {Str_841B243, debug_sub_811B2D8}, +}; + +const u8 Str_841B2B0[] = _("·カウントエラーがおきました"); +const u8 Str_841B2BF[] = _("·リールそうさで エラーが おきました"); +const u8 Str_841B2D3[] = _("·フラグオフエラーが おきました"); +const u8 Str_841B2E4[] = _("·ボーナスこやくの エラーが おきました"); + +#endif diff --git a/src/field/start_menu.c b/src/field/start_menu.c index dccf1714e..4904f4a80 100644 --- a/src/field/start_menu.c +++ b/src/field/start_menu.c @@ -28,7 +28,7 @@ #include "strings2.h" #include "task.h" #include "trainer_card.h" -#include "unknown_task.h" +#include "scanline_effect.h" //Menu actions enum { @@ -44,6 +44,11 @@ enum { MENU_ACTION_PLAYER_LINK }; +#if DEBUG +static u32 _debugStartMenu_0 __attribute__((unused)); +static u32 _debugStartMenu_1 __attribute__((unused)); +#endif + static u8 (*saveDialogCallback)(void); static u8 saveDialogTimer; //Number of frames to keep the window on screen after save was completed static bool8 savingComplete; @@ -54,7 +59,7 @@ extern u16 gSpecialVar_Result; extern u8 gUnknown_03004860; -u8 (*gCallback_03004AE8)(void); +u8 (*gMenuCallback)(void); EWRAM_DATA static u8 sStartMenuCursorPos = 0; EWRAM_DATA static u8 sNumStartMenuActions = 0; @@ -132,6 +137,304 @@ static bool32 sub_80719FC(u8 *ptr); static void sub_8071B54(void); static void Task_8071B64(u8 taskId); +#if DEBUG +__attribute__((naked)) +void debug_sub_8075C30() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " bl debug_sub_8075D9C\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8075C40() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " lsl r0, r4, #0x2\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x3\n" + " ldr r1, ._5 @ gTasks\n" + " add r5, r0, r1\n" + " mov r1, #0x0\n" + " ldsh r0, [r5, r1]\n" + " cmp r0, #0x1\n" + " beq ._1 @cond_branch\n" + " cmp r0, #0x1\n" + " bgt ._2 @cond_branch\n" + " cmp r0, #0\n" + " beq ._3 @cond_branch\n" + " b ._18\n" + "._6:\n" + " .align 2, 0\n" + "._5:\n" + " .word gTasks+0x8\n" + "._2:\n" + " cmp r0, #0x2\n" + " beq ._7 @cond_branch\n" + " cmp r0, #0x3\n" + " beq ._8 @cond_branch\n" + " b ._18\n" + "._3:\n" + " bl m4aSoundVSyncOff\n" + " b ._12\n" + "._1:\n" + " ldr r1, ._13 @ 0x4000208\n" + " ldrh r0, [r1]\n" + " mov sl, r0\n" + " mov r0, #0x0\n" + " strh r0, [r1]\n" + " ldr r1, ._13 + 4 @ 0x4000108\n" + " strh r0, [r1]\n" + " mov r0, #0x83\n" + " lsl r0, r0, #0x10\n" + " str r0, [r1]\n" + " ldr r4, ._13 + 8 @ 0xc34f\n" + " mov r9, r4\n" + " ldr r2, ._13 + 12 @ 0x40000b0\n" + " ldr r0, ._13 + 16 @ gScanlineEffectRegBuffers\n" + " mov ip, r0\n" + " ldr r1, ._13 + 20 @ 0xc5ff\n" + " mov r8, r1\n" + " ldr r7, ._13 + 24 @ 0x7fff\n" + " mov r3, r9\n" + " add r3, r3, #0x1\n" + " ldr r6, ._13 + 28 @ 0x4000040\n" + " ldr r4, ._13 + 32 @ 0xa2600001\n" + "._11:\n" + " mov r0, ip\n" + " str r0, [r2]\n" + " str r6, [r2, #0x4]\n" + " str r4, [r2, #0x8]\n" + " ldr r0, [r2, #0x8]\n" + " ldrh r1, [r2, #0xa]\n" + " mov r0, r8\n" + " and r0, r0, r1\n" + " strh r0, [r2, #0xa]\n" + " ldrh r1, [r2, #0xa]\n" + " add r0, r7, #0\n" + " and r0, r0, r1\n" + " strh r0, [r2, #0xa]\n" + " ldrh r0, [r2, #0xa]\n" + " sub r3, r3, #0x1\n" + " cmp r3, #0\n" + " bne ._11 @cond_branch\n" + " mov r3, r9\n" + " add r3, r3, #0x1\n" + " ldr r0, ._13 + 36 @ 0x400010a\n" + " mov r2, #0x0\n" + " strh r2, [r0]\n" + " ldr r1, ._13 + 4 @ 0x4000108\n" + " ldrh r0, [r1]\n" + " ldr r4, ._13 + 40 @ _debugStartMenu_0\n" + " str r0, [r4]\n" + " strh r2, [r1]\n" + " ldr r0, ._13 @ 0x4000208\n" + " mov r1, sl\n" + " strh r1, [r0]\n" + " ldr r4, ._13 + 44 @ _debugStartMenu_1\n" + " str r3, [r4]\n" + " bl m4aSoundVSyncOn\n" + " b ._12\n" + "._14:\n" + " .align 2, 0\n" + "._13:\n" + " .word 0x4000208\n" + " .word 0x4000108\n" + " .word 0xc34f\n" + " .word 0x40000b0\n" + " .word gScanlineEffectRegBuffers\n" + " .word 0xc5ff\n" + " .word 0x7fff\n" + " .word 0x4000040\n" + " .word 0xa2600001\n" + " .word 0x400010a\n" + " .word _debugStartMenu_0\n" + " .word _debugStartMenu_1\n" + "._7:\n" + " mov r0, #0x15\n" + " bl PlaySE\n" + " ldr r0, ._16 @ gStringVar1\n" + " ldr r1, ._16 + 4 @ _debugStartMenu_1\n" + " ldr r1, [r1]\n" + " mov r2, #0x1\n" + " mov r3, #0x8\n" + " bl ConvertIntToDecimalStringN\n" + " ldr r0, ._16 + 8 @ gStringVar2\n" + " ldr r1, ._16 + 12 @ _debugStartMenu_0\n" + " ldr r1, [r1]\n" + " mov r2, #0x1\n" + " mov r3, #0x8\n" + " bl ConvertIntToDecimalStringN\n" + " bl Menu_DisplayDialogueFrame\n" + " ldr r0, ._16 + 16 @ gUnknown_Debug_839B6D8\n" + " mov r1, #0x2\n" + " mov r2, #0xf\n" + " bl Menu_PrintText\n" + "._12:\n" + " ldrh r0, [r5]\n" + " add r0, r0, #0x1\n" + " strh r0, [r5]\n" + " b ._18\n" + "._17:\n" + " .align 2, 0\n" + "._16:\n" + " .word gStringVar1\n" + " .word _debugStartMenu_1\n" + " .word gStringVar2\n" + " .word _debugStartMenu_0\n" + " .word gUnknown_Debug_839B6D8\n" + "._8:\n" + " ldr r0, ._19 @ gMain\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._18 @cond_branch\n" + " bl Menu_EraseScreen\n" + " bl ScriptContext2_Disable\n" + " add r0, r4, #0\n" + " bl DestroyTask\n" + "._18:\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._20:\n" + " .align 2, 0\n" + "._19:\n" + " .word gMain\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8075D9C() +{ + asm( + " push {lr}\n" + " ldr r0, ._21 @ debug_sub_8075C40\n" + " mov r1, #0xa\n" + " bl CreateTask\n" + " bl ScriptContext2_Enable\n" + " pop {r0}\n" + " bx r0\n" + "._22:\n" + " .align 2, 0\n" + "._21:\n" + " .word debug_sub_8075C40+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8075DB4() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add r6, r0, #0\n" + " add r5, r1, #0\n" + " add r4, r2, #0\n" + " add r0, r4, #0\n" + " mov r1, #0x4d\n" + " bl __umodsi3\n" + " strb r0, [r6, #0x1]\n" + " add r1, r6, #0\n" + " add r1, r1, #0xc\n" + " add r0, r4, #0\n" + " bl write_word_to_mem\n" + " add r0, r6, #4\n" + " add r1, r5, #0\n" + " bl StringCopy8\n" + " mov r3, #0x7\n" + " mov r4, #0x0\n" + " ldr r0, ._25 @ gSaveBlock1\n" + " ldr r1, ._25 + 4 @ 0x2b28\n" + " add r5, r0, r1\n" + " add r2, r6, #0\n" + " add r2, r2, #0x10\n" + " add r1, r6, #0\n" + " add r1, r1, #0x1c\n" + "._23:\n" + " ldrh r0, [r5]\n" + " strh r0, [r2]\n" + " strh r3, [r1]\n" + " add r0, r3, #6\n" + " strh r0, [r1, #0xc]\n" + " add r3, r3, #0x1\n" + " add r5, r5, #0x2\n" + " add r2, r2, #0x2\n" + " add r1, r1, #0x2\n" + " add r4, r4, #0x1\n" + " cmp r4, #0x5\n" + " ble ._23 @cond_branch\n" + " mov r4, #0x0\n" + "._24:\n" + " mov r0, #0x64\n" + " mul r0, r0, r4\n" + " ldr r1, ._25 + 8 @ gPlayerParty\n" + " add r0, r0, r1\n" + " mov r1, #0x2c\n" + " mul r1, r1, r4\n" + " add r1, r1, #0x34\n" + " add r1, r6, r1\n" + " bl sub_803AF78\n" + " add r4, r4, #0x1\n" + " cmp r4, #0x2\n" + " ble ._24 @cond_branch\n" + " add r0, r6, #0\n" + " bl SetEReaderTrainerChecksum\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._26:\n" + " .align 2, 0\n" + "._25:\n" + " .word gSaveBlock1\n" + " .word 0x2b28\n" + " .word gPlayerParty\n" + "\n" + ); +} + +__attribute__((naked)) +void unref_sub_8070F90() +{ + asm( + " push {lr}\n" + " ldr r0, ._27 @ 0x801\n" + " bl FlagSet\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x4\n" + " bl FlagSet\n" + " ldr r0, ._27 + 4 @ 0x802\n" + " bl FlagSet\n" + " pop {r0}\n" + " bx r0\n" + "._28:\n" + " .align 2, 0\n" + "._27:\n" + " .word 0x801\n" + " .word 0x802\n" + "\n" + ); +} +#endif static void BuildStartMenuActions(void) { @@ -193,8 +496,8 @@ static void BuildStartMenuActions_Link(void) static void DisplaySafariBallsWindow(void) { sub_8072C44(gStringVar1, gNumSafariBalls, 12, 1); - MenuDrawTextWindow(0, 0, 10, 5); - MenuPrint(gOtherText_SafariStock, 1, 1); + Menu_DrawStdWindowFrame(0, 0, 10, 5); + Menu_PrintText(gOtherText_SafariStock, 1, 1); } //Prints n menu items starting at *index @@ -204,7 +507,7 @@ static bool32 PrintStartMenuItemsMultistep(s16 *index, u32 n) do { - MenuPrint(sStartMenuItems[sCurrentStartMenuActions[_index]].text, 23, 2 + _index * 2); + Menu_PrintText(sStartMenuItems[sCurrentStartMenuActions[_index]].text, 23, 2 + _index * 2); _index++; if (_index >= sNumStartMenuActions) { @@ -226,7 +529,7 @@ static bool32 InitStartMenuMultistep(s16 *step, s16 *index) (*step)++; break; case 2: - MenuDrawTextWindow(22, 0, 29, sNumStartMenuActions * 2 + 3); + Menu_DrawStdWindowFrame(22, 0, 29, sNumStartMenuActions * 2 + 3); *index = 0; (*step)++; break; @@ -271,7 +574,7 @@ void CreateStartMenuTask(void (*func)(u8)) { u8 taskId; - InitMenuWindow(&gWindowConfig_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); taskId = CreateTask(Task_StartMenu, 0x50); SetTaskFuncWithFollowupFunc(taskId, Task_StartMenu, func); } @@ -283,11 +586,11 @@ void sub_80712B4(u8 taskId) switch (task->data[0]) { case 0: - gCallback_03004AE8 = StartMenu_InputProcessCallback; + gMenuCallback = StartMenu_InputProcessCallback; task->data[0]++; break; case 1: - if (gCallback_03004AE8() == 1) + if (gMenuCallback() == 1) DestroyTask(taskId); break; } @@ -310,12 +613,12 @@ static u8 StartMenu_InputProcessCallback(void) if (gMain.newKeys & DPAD_UP) { PlaySE(SE_SELECT); - sStartMenuCursorPos = MoveMenuCursor(-1); + sStartMenuCursorPos = Menu_MoveCursor(-1); } if (gMain.newKeys & DPAD_DOWN) { PlaySE(SE_SELECT); - sStartMenuCursorPos = MoveMenuCursor(1); + sStartMenuCursorPos = Menu_MoveCursor(1); } if (gMain.newKeys & A_BUTTON) { @@ -325,11 +628,11 @@ static u8 StartMenu_InputProcessCallback(void) if (GetNationalPokedexCount(0) == 0) return 0; } - gCallback_03004AE8 = sStartMenuItems[sCurrentStartMenuActions[sStartMenuCursorPos]].func; - if (gCallback_03004AE8 != StartMenu_SaveCallback && - gCallback_03004AE8 != StartMenu_ExitCallback && - gCallback_03004AE8 != StartMenu_RetireCallback) - fade_screen(1, 0); + gMenuCallback = sStartMenuItems[sCurrentStartMenuActions[sStartMenuCursorPos]].func; + if (gMenuCallback != StartMenu_SaveCallback && + gMenuCallback != StartMenu_ExitCallback && + gMenuCallback != StartMenu_RetireCallback) + FadeScreen(1, 0); return 0; } if (gMain.newKeys & (START_BUTTON | B_BUTTON)) @@ -345,7 +648,7 @@ static u8 StartMenu_PokedexCallback(void) { if (!gPaletteFade.active) { - IncrementGameStat(0x29); + IncrementGameStat(GAME_STAT_CHECKED_POKEDEX); PlayRainSoundEffect(); SetMainCallback2(CB2_InitPokedex); return 1; @@ -395,7 +698,7 @@ static u8 StartMenu_PlayerCallback(void) if (!gPaletteFade.active) { PlayRainSoundEffect(); - sub_8093110(sub_805469C); + TrainerCard_ShowPlayerCard(sub_805469C); return 1; } return 0; @@ -404,8 +707,8 @@ static u8 StartMenu_PlayerCallback(void) //When player selects SAVE static u8 StartMenu_SaveCallback(void) { - HandleDestroyMenuCursors(); - gCallback_03004AE8 = SaveCallback1; + Menu_DestroyCursor(); + gMenuCallback = SaveCallback1; return 0; } @@ -443,7 +746,7 @@ static u8 StartMenu_PlayerLinkCallback(void) if (!gPaletteFade.active) { PlayRainSoundEffect(); - sub_8093130(gUnknown_03004860, sub_805469C); + TrainerCard_ShowLinkCard(gUnknown_03004860, sub_805469C); return 1; } return 0; @@ -461,7 +764,7 @@ enum static u8 SaveCallback1(void) { sub_807160C(); - gCallback_03004AE8 = SaveCallback2; + gMenuCallback = SaveCallback2; return FALSE; } @@ -473,13 +776,13 @@ static u8 SaveCallback2(void) return FALSE; case SAVE_CANCELED: //Go back to start menu - MenuZeroFillScreen(); + Menu_EraseScreen(); InitStartMenu(); - gCallback_03004AE8 = StartMenu_InputProcessCallback; + gMenuCallback = StartMenu_InputProcessCallback; return FALSE; case SAVE_SUCCESS: case SAVE_ERROR: - MenuZeroFillScreen(); + Menu_EraseScreen(); sub_8064E2C(); ScriptContext2_Disable(); return TRUE; @@ -498,7 +801,7 @@ static u8 RunSaveDialogCallback(void) { if (savingComplete) { - if (!MenuUpdateWindowText()) + if (!Menu_UpdateWindowText()) return 0; } savingComplete = FALSE; @@ -514,7 +817,7 @@ void ScrSpecial_DoSaveDialog(void) static void DisplaySaveMessageWithCallback(const u8 *ptr, u8 (*func)(void)) { StringExpandPlaceholders(gStringVar4, ptr); - MenuDisplayMessageBox(); + Menu_DisplayDialogueFrame(); MenuPrintMessageDefaultCoords(gStringVar4); savingComplete = TRUE; saveDialogCallback = func; @@ -547,7 +850,7 @@ static void sub_8071700(void) static void HideSaveDialog(void) { - MenuZeroFillWindowRect(20, 8, 26, 13); + Menu_EraseWindowRect(20, 8, 26, 13); } static void SaveDialogStartTimeout(void) @@ -579,7 +882,7 @@ static bool8 SaveDialogCheckForTimeoutAndKeypress(void) static u8 SaveDialogCB_DisplayConfirmMessage(void) { - MenuZeroFillScreen(); + Menu_EraseScreen(); HandleDrawSaveWindowInfo(0, 0); DisplaySaveMessageWithCallback(gSaveText_WouldYouLikeToSave, SaveDialogCB_DisplayConfirmYesNoMenu); return SAVE_IN_PROGRESS; @@ -594,7 +897,7 @@ static u8 SaveDialogCB_DisplayConfirmYesNoMenu(void) static u8 SaveDialogCB_ProcessConfirmYesNoMenu(void) { - switch (ProcessMenuInputNoWrap_()) + switch (Menu_ProcessInputNoWrap_()) { case 0: //YES HideSaveDialog(); @@ -640,7 +943,7 @@ static u8 SaveDialogCB_DisplayOverwriteYesNoMenu(void) static u8 SaveDialogCB_ProcessOverwriteYesNoMenu(void) { - switch (ProcessMenuInputNoWrap_()) + switch (Menu_ProcessInputNoWrap_()) { case 0: //YES HideSaveDialog(); @@ -664,20 +967,20 @@ static u8 SaveDialogCB_DisplaySavingMessage(void) static u8 SaveDialogCB_DoSave(void) { - bool8 saveSucceeded; + u8 saveStatus; - IncrementGameStat(0); + IncrementGameStat(GAME_STAT_SAVED_GAME); if (gDifferentSaveFile == TRUE) { - saveSucceeded = TrySavingData(DIFFERENT_FILE_SAVE); + saveStatus = Save_WriteData(SAVE_OVERWRITE_DIFFERENT_FILE); gDifferentSaveFile = FALSE; } else { - saveSucceeded = TrySavingData(NORMAL_SAVE); + saveStatus = Save_WriteData(SAVE_NORMAL); } - if (saveSucceeded == TRUE) + if (saveStatus == SAVE_STATUS_OK) { //"(Player) saved the game." DisplaySaveMessageWithCallback(gSaveText_PlayerSavedTheGame, SaveDialogCB_SaveSuccess); @@ -694,7 +997,7 @@ static u8 SaveDialogCB_DoSave(void) static u8 SaveDialogCB_SaveSuccess(void) { - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) { PlaySE(SE_SAVE); saveDialogCallback = SaveDialogCB_ReturnSuccess; @@ -715,7 +1018,7 @@ static u8 SaveDialogCB_ReturnSuccess(void) static u8 SaveDialogCB_SaveError(void) { - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) { PlaySE(SE_BOO); saveDialogCallback = SaveDialogCB_ReturnError; @@ -744,38 +1047,21 @@ static bool32 sub_80719FC(u8 *step) switch (*step) { case 0: - { - u8 *addr; - u32 size; - REG_DISPCNT = 0; SetVBlankCallback(NULL); - remove_some_task(); + ScanlineEffect_Stop(); DmaClear16(3, PLTT, PLTT_SIZE); - addr = (void *)VRAM; - size = 0x18000; - while (1) - { - DmaFill16(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill16(3, 0, addr, size); - break; - } - } + DmaFill16Large(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000); break; - } case 1: ResetSpriteData(); ResetTasks(); ResetPaletteFade(); - dp12_8087EA4(); + ScanlineEffect_Clear(); break; case 2: - SetUpWindowConfig(&gWindowConfig_81E6CE4); - InitMenuWindow(&gWindowConfig_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_BG0_ON; break; case 3: @@ -821,8 +1107,8 @@ static void Task_8071B64(u8 taskId) switch (*step) { case 0: - MenuDisplayMessageBox(); - MenuPrint(gSystemText_Saving, 2, 15); + Menu_DisplayDialogueFrame(); + Menu_PrintText(gSystemText_Saving, 2, 15); BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); (*step)++; break; diff --git a/src/field/starter_choose.c b/src/field/starter_choose.c index 701d4087a..418488774 100644 --- a/src/field/starter_choose.c +++ b/src/field/starter_choose.c @@ -14,7 +14,7 @@ #include "strings.h" #include "task.h" #include "trig.h" -#include "unknown_task.h" +#include "scanline_effect.h" extern u16 gSpecialVar_Result; extern struct SpriteTemplate gUnknown_02024E8C; @@ -285,7 +285,7 @@ void CB2_ChooseStarter(void) LZ77UnCompVram(&gBirchHelpGfx, (void *)VRAM); LZ77UnCompVram(&gBirchBagTilemap, (void *)(VRAM + 0x3000)); LZ77UnCompVram(&gBirchGrassTilemap, (void *)(VRAM + 0x3800)); - remove_some_task(); + ScanlineEffect_Stop(); ResetTasks(); ResetSpriteData(); ResetPaletteFade(); @@ -294,8 +294,8 @@ void CB2_ChooseStarter(void) LoadCompressedObjectPic(&gUnknown_083F7794[0]); LoadCompressedObjectPic(&gUnknown_083F77A4[0]); LoadSpritePalettes(gUnknown_083F77B4); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow(&gWindowTemplate_81E6CE4); BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); savedIme = REG_IME; @@ -355,8 +355,8 @@ static void MainCallback2(void) static void Task_StarterChoose1(u8 taskId) { CreateStarterPokemonLabel(0xFF, gTasks[taskId].tStarterSelection); - MenuDrawTextWindow(2, 14, 27, 19); - MenuPrint(gOtherText_BirchInTrouble, 3, 15); + Menu_DrawStdWindowFrame(2, 14, 27, 19); + Menu_PrintText(gOtherText_BirchInTrouble, 3, 15); gTasks[taskId].func = Task_StarterChoose2; } @@ -368,7 +368,7 @@ static void Task_StarterChoose2(u8 taskId) { u8 spriteId; - MenuZeroFillWindowRect( + Menu_EraseWindowRect( gStarterChoose_LabelCoords[selection][0], gStarterChoose_LabelCoords[selection][1], gStarterChoose_LabelCoords[selection][0] + 13, @@ -424,9 +424,9 @@ static void Task_StarterChoose3(u8 taskId) static void Task_StarterChoose4(u8 taskId) { PlayCry1(GetStarterPokemon(gTasks[taskId].tStarterSelection), 0); - MenuDrawTextWindow(2, 14, 27, 19); + Menu_DrawStdWindowFrame(2, 14, 27, 19); //"Do you choose this POKEMON?" - MenuPrint(gOtherText_DoYouChoosePoke, 3, 15); + Menu_PrintText(gOtherText_DoYouChoosePoke, 3, 15); DisplayYesNoMenu(21, 7, 1); gTasks[taskId].func = Task_StarterChoose5; } @@ -435,7 +435,7 @@ static void Task_StarterChoose5(u8 taskId) { u8 spriteId; - switch (ProcessMenuInputNoWrap_()) + switch (Menu_ProcessInputNoWrap_()) { case 0: // YES //Return the starter choice and exit. @@ -445,7 +445,7 @@ static void Task_StarterChoose5(u8 taskId) case 1: // NO case -1: // B button PlaySE(SE_SELECT); - MenuZeroFillWindowRect(21, 7, 27, 12); + Menu_EraseWindowRect(21, 7, 27, 12); spriteId = gTasks[taskId].tPkmnSpriteId; FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(gSprites[spriteId].oam.paletteNum)); @@ -498,7 +498,7 @@ static void CreateStarterPokemonLabel(u8 prevSelection, u8 selection) if (prevSelection != 0xFF) { //Remove the old Pokemon label - MenuZeroFillWindowRect( + Menu_EraseWindowRect( gStarterChoose_LabelCoords[prevSelection][0], gStarterChoose_LabelCoords[prevSelection][1], gStarterChoose_LabelCoords[prevSelection][0] + 13, @@ -527,7 +527,7 @@ static void CreateStarterPokemonLabel(u8 prevSelection, u8 selection) //Copy POKEMON string to label StringCopy(labelText + dstIndex, gOtherText_Poke); - MenuPrint( + Menu_PrintText( labelText, gStarterChoose_LabelCoords[selection][0], gStarterChoose_LabelCoords[selection][1]); @@ -535,7 +535,7 @@ static void CreateStarterPokemonLabel(u8 prevSelection, u8 selection) //Copy Pokemon name to label sub_8072C74(labelText + 5, gSpeciesNames[species], 0x6B, 1); - MenuPrint( + Menu_PrintText( labelText, gStarterChoose_LabelCoords[selection][0], gStarterChoose_LabelCoords[selection][1] + 2); @@ -574,7 +574,7 @@ static void CreateStarterPokemonLabel(u8 prevSelection, u8 selection) adds r3, r1, 0x3\n\ lsls r3, 24\n\ lsrs r3, 24\n\ - bl MenuZeroFillWindowRect\n\ + bl Menu_EraseWindowRect\n\ ldr r0, _0810A964 @ =0x04000040\n\ movs r1, 0\n\ strh r1, [r0]\n\ @@ -649,7 +649,7 @@ _0810A8CA:\n\ mov r0, sp\n\ adds r1, r4, 0\n\ adds r2, r5, 0\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ mov r0, sp\n\ movs r1, 0\n\ movs r2, 0xF\n\ @@ -669,7 +669,7 @@ _0810A8CA:\n\ lsrs r2, 24\n\ mov r0, sp\n\ adds r1, r4, 0\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ lsls r0, r4, 3\n\ adds r0, 0x4\n\ lsls r0, 24\n\ diff --git a/src/field/trader.c b/src/field/trader.c index 61cb0b4a2..885557d5a 100644 --- a/src/field/trader.c +++ b/src/field/trader.c @@ -100,7 +100,7 @@ void CreateAvailableDecorationsMenu(u8 taskId) } } - MenuDrawTextWindow(0, 1, 12, numChoices * 2 + 2); + Menu_DrawStdWindowFrame(0, 1, 12, numChoices * 2 + 2); for (i = 0; i < 4; i++) { @@ -108,18 +108,18 @@ void CreateAvailableDecorationsMenu(u8 taskId) { if (trader->unk1[i] > DECOR_REGISTEEL_DOLL) { - MenuPrint(gOtherText_FiveQuestionsAndSlash, 1, numDecorations * 2 + 2); + Menu_PrintText(gOtherText_FiveQuestions, 1, numDecorations * 2 + 2); } else { - MenuPrint(gDecorations[trader->unk1[i]].name, 1, numDecorations * 2 + 2); + Menu_PrintText(gDecorations[trader->unk1[i]].name, 1, numDecorations * 2 + 2); } numDecorations++; } } - MenuPrint(gOtherText_CancelNoTerminator, 1, numDecorations * 2 + 2); + Menu_PrintText(gOtherText_CancelNoTerminator, 1, numDecorations * 2 + 2); InitMenu(0, 1, 2, numChoices, 0, 11); gTasks[taskId].data[1] = numDecorations; } @@ -135,8 +135,8 @@ void sub_8109B34(u8 taskId, u8 decorationId) gSpecialVar_0x8004 = decorationId; } - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 1, 12, 12); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 1, 12, 12); DestroyTask(taskId); EnableBothScriptContexts(); } @@ -148,17 +148,17 @@ void Task_HandleGetDecorationMenuInput(u8 taskId) if (gMain.newKeys & DPAD_UP) { PlaySE(SE_SELECT); - MoveMenuCursor(-1); + Menu_MoveCursor(-1); } else if (gMain.newKeys & DPAD_DOWN) { PlaySE(SE_SELECT); - MoveMenuCursor(1); + Menu_MoveCursor(1); } else if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); - gSpecialVar_0x8005 = GetMenuCursorPos(); + gSpecialVar_0x8005 = Menu_GetCursorPos(); if (gTasks[taskId].data[1] == gSpecialVar_0x8005) { sub_8109B34(taskId, 0); @@ -215,10 +215,10 @@ void ScrSpecial_TraderMenuGiveDecoration(void) void sub_8109D04(u8 taskId) { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 29, 19); - DestroyVerticalScrollIndicator(0); - DestroyVerticalScrollIndicator(1); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 29, 19); + DestroyVerticalScrollIndicator(TOP_ARROW); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); sub_80F9520(gUnknown_020388F7, 8); BuyMenuFreeMemory(); if (sub_80FEFA4() == TRUE) @@ -237,8 +237,8 @@ void sub_8109D04(u8 taskId) void sub_8109DAC(u8 taskId) { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 29, 19); gSpecialVar_0x8006 = 0; DestroyTask(taskId); EnableBothScriptContexts(); diff --git a/src/field/tv.c b/src/field/tv.c index d7a75a709..8bd36bb9c 100644 --- a/src/field/tv.c +++ b/src/field/tv.c @@ -47,8 +47,6 @@ struct UnkTvStruct s8 var0; }; -extern u8 gUnknown_0300430A[11]; - struct OutbreakPokemon { /*0x00*/ u16 species; @@ -64,7 +62,7 @@ struct TVSaleItem { extern u8 gUnknown_02038694; -extern struct TVSaleItem gUnknown_02038724[3]; +extern struct TVSaleItem gMartPurchaseHistory[3]; struct UnkTvStruct gUnknown_03005D38; @@ -811,7 +809,7 @@ u8 sub_80BDEAC(u8 *a0) return lang; } -void sub_80BDEC8(void) +void PutPokemonTodayCaughtOnAir(void) { u8 i; u16 total; @@ -864,7 +862,7 @@ void sub_80BDEC8(void) sub_80BE138((TVShow *)pokemonToday); pokemonToday->language = GAME_LANGUAGE; pokemonToday->language2 = sub_80BDEAC(pokemonToday->nickname); - StripExtCtrlCodes(pokemonToday->nickname); + Text_StripExtCtrlCodes(pokemonToday->nickname); } } } @@ -966,7 +964,7 @@ void InterviewAfter_BravoTrainerPokemonProfile(void) sub_80BE160((TVShow *)bravoTrainerNew); bravoTrainerNew->language = GAME_LANGUAGE; bravoTrainerNew->var1f = sub_80BDEAC(bravoTrainerNew->pokemonNickname); - StripExtCtrlCodes(bravoTrainerNew->pokemonNickname); + Text_StripExtCtrlCodes(bravoTrainerNew->pokemonNickname); } } @@ -1032,7 +1030,7 @@ void sub_80BE3BC(void) if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_SMART_SHOPPER) != 1) { sub_80BF20C(); - if (gUnknown_02038724[0].item_amount >= 20) + if (gMartPurchaseHistory[0].item_amount >= 20) { struct TVShowSmartShopper *smartShopper = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].smartshopperShow; @@ -1041,8 +1039,8 @@ void sub_80BE3BC(void) smartShopper->shopLocation = gMapHeader.regionMapSectionId; for (i=0; i<3; i++) { - smartShopper->itemIds[i] = gUnknown_02038724[i].item_id; - smartShopper->itemAmounts[i] = gUnknown_02038724[i].item_amount; + smartShopper->itemIds[i] = gMartPurchaseHistory[i].item_id; + smartShopper->itemAmounts[i] = gMartPurchaseHistory[i].item_amount; } smartShopper->priceReduced = GetPriceReduction(1); StringCopy(smartShopper->playerName, gSaveBlock2.playerName); @@ -1075,7 +1073,7 @@ void sub_80BE478(void) sub_80BE160((TVShow *)nameRaterShow); nameRaterShow->language = GAME_LANGUAGE; nameRaterShow->pokemonNameLanguage = sub_80BDEAC(nameRaterShow->pokemonName); - StripExtCtrlCodes(nameRaterShow->pokemonName); + Text_StripExtCtrlCodes(nameRaterShow->pokemonName); } } @@ -1138,7 +1136,7 @@ void InterviewAfter_PkmnFanClubOpinions(void) sub_80BE160((TVShow *)fanclubOpinions); fanclubOpinions->language = GAME_LANGUAGE; fanclubOpinions->var0E = sub_80BDEAC(fanclubOpinions->var10); - StripExtCtrlCodes(fanclubOpinions->var10); + Text_StripExtCtrlCodes(fanclubOpinions->var10); } void InterviewAfter_DummyShow4(void) @@ -1646,14 +1644,14 @@ void sub_80BF20C(void) { for (j = i + 1; j < 3; j++) { - if (gUnknown_02038724[i].item_amount < gUnknown_02038724[j].item_amount) + if (gMartPurchaseHistory[i].item_amount < gMartPurchaseHistory[j].item_amount) { - tmpId = gUnknown_02038724[i].item_id; - tmpAmount = gUnknown_02038724[i].item_amount; - gUnknown_02038724[i].item_id = gUnknown_02038724[j].item_id; - gUnknown_02038724[i].item_amount = gUnknown_02038724[j].item_amount; - gUnknown_02038724[j].item_id = tmpId; - gUnknown_02038724[j].item_amount = tmpAmount; + tmpId = gMartPurchaseHistory[i].item_id; + tmpAmount = gMartPurchaseHistory[i].item_amount; + gMartPurchaseHistory[i].item_id = gMartPurchaseHistory[j].item_id; + gMartPurchaseHistory[i].item_amount = gMartPurchaseHistory[j].item_amount; + gMartPurchaseHistory[j].item_id = tmpId; + gMartPurchaseHistory[j].item_amount = tmpAmount; } } } diff --git a/src/field/use_pokeblock.c b/src/field/use_pokeblock.c index 7253ac901..8ea93aab8 100644 --- a/src/field/use_pokeblock.c +++ b/src/field/use_pokeblock.c @@ -104,7 +104,6 @@ static EWRAM_DATA struct Pokeblock *gUnknown_0203930C = NULL; EWRAM_DATA u8 gPokeblockMonID = 0; EWRAM_DATA s16 gPokeblockGain = 0; -extern u16 gKeyRepeatStartDelay; extern u16 gSpecialVar_ItemId; // FIXME: remove after merge of #349 Pokeblock static void launch_c3_walk_stairs_and_run_once(void (*const)(void)); @@ -117,7 +116,7 @@ static void sub_81365A0(void); static void sub_81365C8(void); static void sub_8136638(void); static void sub_81368A4(void); -void sub_8089668(void); +void ScanlineEffect_InitHBlankDmaTransfer(void); static void sub_8136B44(void); static u8 sub_81370E4(u8); static void sub_8136BB8(void); @@ -194,7 +193,7 @@ static void sub_8136264(void) ProcessSpriteCopyRequests(); TransferPlttBuffer(); sub_80F5CDC(6); - sub_8089668(); + ScanlineEffect_InitHBlankDmaTransfer(); } static void launch_c3_walk_stairs_and_run_once(void (*const func)(void)) @@ -228,11 +227,11 @@ static void sub_8136294(void) gUnknown_02039304->unk50++; break; case 3: - SetUpWindowConfig(&gWindowConfig_81E7080); + Text_LoadWindowTemplate(&gWindowTemplate_81E7080); gUnknown_02039304->unk50++; break; case 4: - MultistepInitMenuWindowBegin(&gWindowConfig_81E7080); + MultistepInitMenuWindowBegin(&gWindowTemplate_81E7080); gUnknown_02039304->unk50++; break; case 5: @@ -610,28 +609,28 @@ static void sub_8136BB8(void) GetMonData(&gPlayerParty[sub_81370A4(gUnknown_083DFEC4->unk87DC)], MON_DATA_NICKNAME, gUnknown_02039304->stringBuffer); StringGetEnd10(gUnknown_02039304->stringBuffer); StringAppend(gUnknown_02039304->stringBuffer, gOtherText_GetsAPokeBlock); - BasicInitMenuWindow(&gWindowConfig_81E709C); - MenuDrawTextWindow(0, 16, 29, 19); - MenuPrint(gUnknown_02039304->stringBuffer, 1, 17); + BasicInitMenuWindow(&gWindowTemplate_81E709C); + Menu_DrawStdWindowFrame(0, 16, 29, 19); + Menu_PrintText(gUnknown_02039304->stringBuffer, 1, 17); DisplayYesNoMenu(23, 10, 1); - MoveMenuCursor(0); + Menu_MoveCursor(0); } static s8 sub_8136C40(void) { - s8 retval = ProcessMenuInputNoWrap(); + s8 retval = Menu_ProcessInputNoWrap(); if ((u8)(retval + 1) < 3) { - MenuZeroFillScreen(); - BasicInitMenuWindow(&gWindowConfig_81E7080); + Menu_EraseScreen(); + BasicInitMenuWindow(&gWindowTemplate_81E7080); } return retval; } static void sub_8136C6C(void) { - BasicInitMenuWindow(&gWindowConfig_81E709C); - MenuDrawTextWindow(0, 16, 29, 19); + BasicInitMenuWindow(&gWindowTemplate_81E709C); + Menu_DrawStdWindowFrame(0, 16, 29, 19); for (gUnknown_02039304->unk53 = 0; gUnknown_02039304->unk53 < 5 && gUnknown_02039304->unk61[gUnknown_02039304->unk53] == 0; gUnknown_02039304->unk53++); if (gUnknown_02039304->unk53 < 5) { @@ -667,21 +666,21 @@ static bool8 sub_8136D00(void) static void sub_8136D60(void) { - BasicInitMenuWindow(&gWindowConfig_81E709C); - MenuDrawTextWindow(0, 16, 29, 19); - MenuPrint(gOtherText_WontEat, 1, 17); + BasicInitMenuWindow(&gWindowTemplate_81E709C); + Menu_DrawStdWindowFrame(0, 16, 29, 19); + Menu_PrintText(gOtherText_WontEat, 1, 17); } static void sub_8136D8C(void) { - MenuZeroFillScreen(); - BasicInitMenuWindow(&gWindowConfig_81E7080); + Menu_EraseScreen(); + BasicInitMenuWindow(&gWindowTemplate_81E7080); } static void Pokeblock_MenuWindowTextPrint(const u8 *message) { - MenuDrawTextWindow(0, 16, 29, 19); - MenuPrint(message, 1, 17); + Menu_DrawStdWindowFrame(0, 16, 29, 19); + Menu_PrintText(message, 1, 17); } #ifdef NONMATCHING diff --git a/src/field/wallclock.c b/src/field/wallclock.c index 2892d09f9..1f743a61a 100644 --- a/src/field/wallclock.c +++ b/src/field/wallclock.c @@ -10,7 +10,7 @@ #include "strings2.h" #include "task.h" #include "trig.h" -#include "unknown_task.h" +#include "scanline_effect.h" extern u16 gSpecialVar_0x8004; extern u8 gMiscClock_Gfx[]; @@ -190,10 +190,7 @@ static void WallClockVblankCallback(void) static void LoadWallClockGraphics(void) { - u8 *addr; - u32 size; - - SetVBlankCallback(0); + SetVBlankCallback(NULL); REG_DISPCNT = 0; REG_BG3CNT = 0; REG_BG2CNT = 0; @@ -208,19 +205,7 @@ static void LoadWallClockGraphics(void) REG_BG0HOFS = 0; REG_BG0VOFS = 0; - addr = (void *)VRAM; - size = 0x18000; - while (1) - { - DmaFill16(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill16(3, 0, addr, size); - break; - } - } + DmaFill16Large(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000); DmaClear32(3, OAM, OAM_SIZE); DmaClear16(3, PLTT, PLTT_SIZE); @@ -229,15 +214,15 @@ static void LoadWallClockGraphics(void) LoadPalette(gMiscClockMale_Pal, 0, 32); else LoadPalette(gMiscClockFemale_Pal, 0, 32); - remove_some_task(); + ScanlineEffect_Stop(); ResetTasks(); ResetSpriteData(); ResetPaletteFade(); FreeAllSpritePalettes(); LoadCompressedObjectPic(&gUnknown_083F7A90[0]); LoadSpritePalettes(gUnknown_083F7AA0); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow(&gWindowTemplate_81E6CE4); } static void WallClockInit(void) @@ -414,10 +399,10 @@ static void Task_SetClock2(u8 taskId) //Ask player "Is this the correct time?" static void Task_SetClock3(u8 taskId) { - MenuDrawTextWindow(2, 16, 27, 19); - MenuPrint(gOtherText_CorrectTimePrompt, 3, 17); - MenuDrawTextWindow(23, 8, 29, 13); - PrintMenuItems(24, 9, 2, gMenuYesNoItems); + Menu_DrawStdWindowFrame(2, 16, 27, 19); + Menu_PrintText(gOtherText_CorrectTimePrompt, 3, 17); + Menu_DrawStdWindowFrame(23, 8, 29, 13); + Menu_PrintItems(24, 9, 2, gMenuYesNoItems); InitMenu(0, 24, 9, 2, 1, 5); gTasks[taskId].func = Task_SetClock4; } @@ -425,7 +410,7 @@ static void Task_SetClock3(u8 taskId) //Get menu selection static void Task_SetClock4(u8 taskId) { - switch (ProcessMenuInputNoWrap_()) + switch (Menu_ProcessInputNoWrap_()) { case 0: //YES PlaySE(SE_SELECT); @@ -433,10 +418,10 @@ static void Task_SetClock4(u8 taskId) return; case -1: //B button case 1: //NO - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); PlaySE(SE_SELECT); - MenuZeroFillWindowRect(23, 8, 29, 13); - MenuZeroFillWindowRect(2, 16, 27, 19); + Menu_EraseWindowRect(23, 8, 29, 13); + Menu_EraseWindowRect(2, 16, 27, 19); gTasks[taskId].func = Task_SetClock2; //Go back and let player adjust clock } } diff --git a/src/field/wild_encounter.c b/src/field/wild_encounter.c index 4bf83cad8..19778e29b 100644 --- a/src/field/wild_encounter.c +++ b/src/field/wild_encounter.c @@ -3698,13 +3698,13 @@ const u16 gRoute119WaterTileData[] = extern u16 gSpecialVar_Result; extern u8 S_RepelWoreOff[]; -EWRAM_DATA static u8 sWildEncountersDisabled = 0; +EWRAM_DATA u8 sWildEncountersDisabled = 0; EWRAM_DATA static u32 sFeebasRngValue = 0; #define NUM_FEEBAS_SPOTS 6 -static u16 FeebasRandom(void); -static void FeebasSeedRng(u16 seed); +u16 FeebasRandom(void); +void FeebasSeedRng(u16 seed); static bool8 IsWildLevelAllowedByRepel(u8 level); static void ApplyFluteEncounterRateMod(u32 *encRate); @@ -3791,17 +3791,30 @@ static bool8 CheckFeebas(void) return FALSE; } -static u16 FeebasRandom(void) +u16 FeebasRandom(void) { sFeebasRngValue = 12345 + 0x41C64E6D * sFeebasRngValue; return sFeebasRngValue >> 16; } -static void FeebasSeedRng(u16 seed) +void FeebasSeedRng(u16 seed) { sFeebasRngValue = seed; } +#if DEBUG +u16 debug_sub_8092344(u8 arg0) +{ + if (arg0 == 0) + return 131; + if (arg0 == 1) + return 167; + if (arg0 == 2) + return 149; + return 0; +} +#endif + static u8 ChooseWildMonIndex_Land(void) { u8 rand = Random() % 100; @@ -4042,6 +4055,24 @@ static bool8 DoWildEncounterRateDiceRoll(u16 encounterRate) return FALSE; } +#if DEBUG +u16 debug_sub_809283C(u16 attempts) +{ + u16 retval = 0; + u16 i = 0; + + while (i < attempts) + { + if (DoWildEncounterRateDiceRoll(320) == TRUE) + retval++; + + i++; + } + + return retval; +} +#endif + static bool8 DoWildEncounterTest(u32 encounterRate, bool8 ignoreAbility) { encounterRate *= 16; @@ -4254,7 +4285,7 @@ void FishingWildEncounter(u8 rod) gWildMonHeaders[GetCurrentMapWildMonHeader()].fishingMonsInfo, rod); } - IncrementGameStat(12); + IncrementGameStat(GAME_STAT_FISHING_CAPTURES); sub_80BEA50(species); BattleSetup_StartWildBattle(); } diff --git a/src/libs/libagbsyscall.s b/src/libs/libagbsyscall.s new file mode 100644 index 000000000..cdf6ca905 --- /dev/null +++ b/src/libs/libagbsyscall.s @@ -0,0 +1,91 @@ + .include "include/macros.inc" + .syntax unified + + .text + + thumb_func_start ArcTan2 +ArcTan2: @ 81E07E0 + swi 0xA + bx lr + thumb_func_end ArcTan2 + + thumb_func_start BgAffineSet +BgAffineSet: @ 81E07E4 + swi 0xE + bx lr + thumb_func_end BgAffineSet + + thumb_func_start CpuFastSet +CpuFastSet: @ 81E07E8 + swi 0xC + bx lr + thumb_func_end CpuFastSet + + thumb_func_start CpuSet +CpuSet: @ 81E07EC + swi 0xB + bx lr + thumb_func_end CpuSet + + thumb_func_start LZ77UnCompVram +LZ77UnCompVram: @ 81E07F4 + swi 0x12 + bx lr + thumb_func_end LZ77UnCompVram + + thumb_func_start LZ77UnCompWram +LZ77UnCompWram: @ 81E07F8 + swi 0x11 + bx lr + thumb_func_end LZ77UnCompWram + + thumb_func_start ObjAffineSet +ObjAffineSet: @ 81E0804 + swi 0xF + bx lr + thumb_func_end ObjAffineSet + + thumb_func_start RLUnCompVram +RLUnCompVram: @ 81E0808 + swi 0x15 + bx lr + thumb_func_end RLUnCompVram + + thumb_func_start RLUnCompWram +RLUnCompWram: @ 81E080C + swi 0x14 + bx lr + thumb_func_end RLUnCompWram + + thumb_func_start RegisterRamReset +RegisterRamReset: @ 81E0810 + swi 0x1 + bx lr + thumb_func_end RegisterRamReset + + thumb_func_start SoftReset +SoftReset: @ 81E0814 + ldr r3, =0x04000208 + movs r2, 0 + strb r2, [r3] + ldr r1, =0x03007f00 @ User Stack + mov sp, r1 + swi 0x1 + swi 0 + .pool + thumb_func_end SoftReset + + thumb_func_start Sqrt +Sqrt: @ 81E082C + swi 0x8 + bx lr + thumb_func_end Sqrt + + thumb_func_start VBlankIntrWait +VBlankIntrWait: @ 81E0830 + movs r2, 0 + swi 0x5 + bx lr + thumb_func_end VBlankIntrWait + + .align 2, 0 @ Don't pad with nop. diff --git a/src/libs/libc.c b/src/libs/libc.c deleted file mode 100644 index 920673e3e..000000000 --- a/src/libs/libc.c +++ /dev/null @@ -1,143 +0,0 @@ -#include "global.h" -#include <stddef.h> - -#define LBLOCKSIZE (sizeof(long)) - -// Nonzero if (long)X contains a NULL byte. -#define CONTAINSNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080) - -// Nonzero if X is not aligned on a "long" boundary. -#define UNALIGNED(X) ((long)X & (LBLOCKSIZE - 1)) - -void *memcpy(void *dst0, const void *src0, size_t len0) -{ - char *dst = dst0; - const char *src = src0; - long *aligned_dst; - const long *aligned_src; - unsigned int len = len0; - - // If the size is small, or either src or dst is unaligned, - // then go to the byte copy loop. This should be rare. - if (len >= 16 && !(UNALIGNED(src) | UNALIGNED(dst))) - { - aligned_dst = (long *)dst; - aligned_src = (long *)src; - - // Copy 4X long words at a time if possible. - while (len >= 16) - { - *aligned_dst++ = *aligned_src++; - *aligned_dst++ = *aligned_src++; - *aligned_dst++ = *aligned_src++; - *aligned_dst++ = *aligned_src++; - len -= 16; - } - - // Copy one long word at a time if possible - while (len >= 4) - { - *aligned_dst++ = *aligned_src++; - len -= 4; - } - - dst = (char *)aligned_dst; - src = (char *)aligned_src; - } - - // Pick up any remaining bytes with a byte copier. - while (len--) - *dst++ = *src++; - - return dst0; -} - -void *memset(void *m, int c, size_t n) -{ - char *s = (char *)m; - int count, i; - unsigned long buffer; - unsigned long *aligned_addr; - unsigned char *unaligned_addr; - - // If the size is small or m is unaligned, - // then go to the byte copy loop. This should be rare. - if (n >= LBLOCKSIZE && !UNALIGNED(m)) - { - // We know that n is large and m is word-aligned. - aligned_addr = (unsigned long *)m; - - // Store C into each char sized location in buffer so that - // we can set large blocks quickly. - c &= 0xFF; - if (LBLOCKSIZE == 4) - { - buffer = (c << 8) | c; - buffer |= (buffer << 16); - } - else - { - buffer = 0; - for (i = 0; i < LBLOCKSIZE; i++) - buffer = (buffer << 8) | c; - } - - while (n >= LBLOCKSIZE * 4) - { - *aligned_addr++ = buffer; - *aligned_addr++ = buffer; - *aligned_addr++ = buffer; - *aligned_addr++ = buffer; - n -= LBLOCKSIZE * 4; - } - while (n >= LBLOCKSIZE) - { - *aligned_addr++ = buffer; - n -= LBLOCKSIZE; - } - - s = (char *)aligned_addr; - } - - // Pick up the remainder with a bytewise loop. - while (n--) - *s++ = (char)c; - - return m; -} - -int strcmp(const char *s1, const char *s2) -{ - unsigned long *a1; - unsigned long *a2; - - // If s1 or s2 are unaligned, then skip this and compare bytes. - if (!(UNALIGNED(s1) | UNALIGNED(s2))) - { - // Compare them a word at a time. - a1 = (unsigned long *)s1; - a2 = (unsigned long *)s2; - while (*a1 == *a2) - { - // If *a1 == *a2, and we find a null in *a1, - // then the strings must be equal, so return zero. - if (CONTAINSNULL(*a1)) - return 0; - - a1++; - a2++; - } - - s1 = (char *)a1; - s2 = (char *)a2; - } - - // Check the remaining few bytes. - while (*s1 != '\0' && *s1 == *s2) - { - s1++; - s2++; - } - - return (*(unsigned char *) s1) - (*(unsigned char *) s2); -} diff --git a/src/libs/libgcnmultiboot.s b/src/libs/libgcnmultiboot.s new file mode 100644 index 000000000..8c8b94998 --- /dev/null +++ b/src/libs/libgcnmultiboot.s @@ -0,0 +1,641 @@ +@ 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 "include/macros.inc" + .include "constants/constants.inc" + + .equiv GCMB_STRUCT_COUNTER1, 0x00 + .equiv GCMB_STRUCT_COUNTER2, 0x01 + .equiv GCMB_STRUCT_MBPROGRESS, 0x02 + .equiv GCMB_STRUCT_SAVEDVCOUNT, 0x03 + .equiv GCMB_STRUCT_KEYA, 0x04 + .equiv GCMB_STRUCT_KEYB, 0x08 + .equiv GCMB_STRUCT_KEYC, 0x0C + .equiv GCMB_STRUCT_BOOT_KEY, 0x10 + .equiv GCMB_STRUCT_IMAGE_SIZE, 0x12 + .equiv GCMB_STRUCT_SESSION_KEY, 0x14 + .equiv GCMB_STRUCT_HASH_VAL, 0x18 + .equiv GCMB_STRUCT_KEYC_DERIVATION, 0x1C + .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, 0x04 + .equiv ROM_HEADER_NINTENDO_LOGO_LENGTH, 0x98 + .equiv ROM_HEADER_NINTENDO_LOGO_END, 0xA0 + + .equiv MBPROGRESS_NONE, 0x00 + .equiv MBPROGRESS_LOGO_CORRECT, 0x01 + .equiv MBPROGRESS_READY_TO_BOOT, 0x02 + + .equiv GCMB_MAGIC_BOOTKEY_HASHVAL, 0xBB + .equiv GCMB_MAGIC_BOOTKEY, 0xBB + .equiv GCMB_MAGIC_COUNTER2, 0xCC + .equiv GCMB_MAGIC_KEYA, 0xDD + .equiv GCMB_MAGIC_KEYB, 0xEE + .equiv GCMB_MAGIC_KEYCDERIVATION, 0xFF + + .syntax unified + + .text + + thumb_func_start GameCubeMultiBoot_Hash +GameCubeMultiBoot_Hash: @ 81DCB38 + 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: @ 81DCB4C + @ If there is no interrupt handler, skip counter manipulation + ldr r1, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER] + cmp r1, 0 + beq GameCubeMultiBoot_Main_SkipCounters + @ Increment the second counter + ldrb r1, [r0, GCMB_STRUCT_COUNTER2] + adds r1, 0x1 + strb r1, [r0, GCMB_STRUCT_COUNTER2] + @ If there is nothing more to do, bail out + ldrb r1, [r0, GCMB_STRUCT_MBPROGRESS] + cmp r1, MBPROGRESS_READY_TO_BOOT + beq GameCubeMultiBoot_Main_Return + @ Save current interrupt master register value + ldr r3, pool_InterruptRegs + ldrh r2, [r3, OFFSET_REG_IME - 0x200] + @ Disable all interrupts + movs r1, 0 + strh r1, [r3, OFFSET_REG_IME - 0x200] + @ Increment the first counter, if it's less than or equal to 10. + ldrb r1, [r0, GCMB_STRUCT_COUNTER1] + cmp r1, 0xA + bgt GameCubeMultiBoot_Main_SkipCounter1Inc + adds r1, 0x1 + strb r1, [r0, GCMB_STRUCT_COUNTER1] +GameCubeMultiBoot_Main_SkipCounter1Inc: + @ Load the saved interrupt master register value (re-enables interrupts if they were enabled before) + strh r2, [r3, OFFSET_REG_IME - 0x200] +GameCubeMultiBoot_Main_SkipCounters: + @ Initialise multiboot structures if required + bcs GameCubeMultiBoot_Init + @ Skip this section (check Nintendo logo) if the check has already passed + ldrb r1, [r0, GCMB_STRUCT_MBPROGRESS] + cmp r1, MBPROGRESS_NONE + bne GameCubeMultiBoot_Main_SkipLogoCheck + @ Bail out if no multiboot image data has been transferred yet + ldr r1, [r0, GCMB_STRUCT_CUR_DEST_PTR] + ldr r2, [r0, GCMB_STRUCT_BASE_DEST_PTR] + subs r1, r2 + beq GameCubeMultiBoot_Main_Return2 + @ Also bail out if not enough data has been transferred + cmp r1, ROM_HEADER_NINTENDO_LOGO_END + bcc GameCubeMultiBoot_Main_Return2 + @ Compare the Nintendo logo of the transferred multiboot image header, with the one in the ROM image of the inserted cart + push {r4-r6} + movs r1, ROM_HEADER_NINTENDO_LOGO_LENGTH + adds r2, ROM_HEADER_NINTENDO_LOGO_OFFSET + ldr r4, pool_NintendoLogo +GameCubeMultiBoot_Main_LogoCmpLoop: + ldm r2!, {r5} + ldm r4!, {r6} + cmp r5, r6 + bne GameCubeMultiBoot_Main_LogoCmpEnd + subs r1, 0x4 + bne GameCubeMultiBoot_Main_LogoCmpLoop + ldm r2!, {r5} + ldm r4!, {r6} + eors r5, r6 + lsrs r5, 8 + str r2, [r0, GCMB_STRUCT_BASE_DEST_PTR] +GameCubeMultiBoot_Main_LogoCmpEnd: + pop {r4-r6} + @ Throw everything away if the logo data didn't match + bne GameCubeMultiBoot_Init + @ Logo matched, set the relevent multiboot progress bit + movs r1, MBPROGRESS_LOGO_CORRECT + strb r1, [r0, GCMB_STRUCT_MBPROGRESS] + @ XOR together KeyA and KeyB to get the initial multiboot image checksum value + ldr r1, [r0, GCMB_STRUCT_KEYA] + ldr r2, [r0, GCMB_STRUCT_KEYB] + eors r1, r2 + str r1, [r0, GCMB_STRUCT_HASH_VAL] + @ ...also use it as the initial value for the image encryption session key. Algorithm is the same as the GBA BIOS multiboot: sessionkey = (initialvalue * 0x6177614b) + 1 + ldr r2, pool_Kawa + muls r1, r2 + adds r1, 0x1 + str r1, [r0, GCMB_STRUCT_SESSION_KEY] +GameCubeMultiBoot_Main_Return: + bx lr +GameCubeMultiBoot_Main_SkipLogoCheck: + @ If this code is executed, then the logo check has passed, and the data being transferred in is encrypted. + @ Set up registers. + ldr r1, [r0, GCMB_STRUCT_CUR_DEST_PTR] + mov r12, r1 + ldr r3, [r0, GCMB_STRUCT_HASH_VAL] + push {r4-r7} + ldr r4, [r0, GCMB_STRUCT_BASE_DEST_PTR] + ldr r5, pool_Kawa + ldr r6, [r0, GCMB_STRUCT_SESSION_KEY] + ldr r7, pool_HashVal +GameCubeMultiBoot_Main_ImageDecryptHashLoop: + @ If there's no more data, break out of the loop + cmp r4, r12 + bcs GameCubeMultiBoot_Main_ImageDecryptHashEnd + @ Get the next uint32 + ldr r1, [r4] + @ Decrypt the ciphertext: plaintext = (ciphertext ^ sessionkey) + hashval + eors r1, r6 + adds r1, r3 + @ Save the current uint32 of plaintext and advance the pointer + stm r4!, {r1} + @ Advance the hashval with this uint32 of plaintext -- this is the same code as GameCubeMultiBoot_Hash. + eors r3, r1 + movs r2, 0x20 +GameCubeMultiBoot_Main_HashLoop: + lsrs r3, 1 + bcc GameCubeMultiBoot_Main_HashSkipEor + eors r3, r7 +GameCubeMultiBoot_Main_HashSkipEor: + subs r2, 0x1 + bne GameCubeMultiBoot_Main_HashLoop + @ Advance the sessionkey with the usual algorithm: sessionkey = (sessionkey * 0x6177614b) + 1 + muls r6, r5 + adds r6, 0x1 + b GameCubeMultiBoot_Main_ImageDecryptHashLoop +GameCubeMultiBoot_Main_ImageDecryptHashEnd: + @ Save the new pointer, sessionkey, hashval + str r4, [r0, GCMB_STRUCT_BASE_DEST_PTR] + str r6, [r0, GCMB_STRUCT_SESSION_KEY] + pop {r4-r7} + str r3, [r0, GCMB_STRUCT_HASH_VAL] + @ Bail out if the image size is unknown + ldrh r1, [r0, GCMB_STRUCT_IMAGE_SIZE] + cmp r1, 0 + bne GameCubeMultiBoot_Main_Return2 + @ Bail out if no image data has been transferred + ldr r1, [r0, GCMB_STRUCT_CUR_DEST_PTR] + ldr r2, [r0, GCMB_STRUCT_BASE_DEST_PTR] + cmp r1, r2 + bne GameCubeMultiBoot_Main_Return2 + @ If KeyC hasn't been generated yet, go generate it + ldr r1, [r0, GCMB_STRUCT_KEYC] + cmp r1, 0 + beq GameCubeMultiBoot_Main_GenerateKeyC + @ If the other side hasn't sent its boot key yet, bail out + ldrh r1, [r0, GCMB_STRUCT_BOOT_KEY] + cmp r1, 0 + beq GameCubeMultiBoot_Main_Return + @ Save off LR so it doesn't get clobbered by the upcoming function call + mov r12, lr + @ Generate the real boot key, which is the checksum of a hardcoded value and KeyC + movs r1, GCMB_MAGIC_BOOTKEY_HASHVAL + ldr r3, [r0, GCMB_STRUCT_KEYC] + bl GameCubeMultiBoot_Hash + ldrh r1, [r0, GCMB_STRUCT_BOOT_KEY] + @ Restore the saved LR value + mov lr, r12 + @ Compare the two boot keys (real and passed in), if they don't match then throw everything away + subs r1, r3 + bne GameCubeMultiBoot_Init + @ The two boot keys matched, tell the caller that the image is ready to boot + movs r1, MBPROGRESS_READY_TO_BOOT + strb r1, [r0, GCMB_STRUCT_MBPROGRESS] + @ Nothing more to do, return. + bx lr +GameCubeMultiBoot_Main_GenerateKeyC: + @ Save off LR so it doesn't get clobbered by the upcoming function call + mov r12, lr + @ KeyC = (SavedVCount << 24) - 1 + ldrb r1, [r0, GCMB_STRUCT_SAVEDVCOUNT] + lsls r1, 24 + subs r1, 0x1 + str r1, [r0, GCMB_STRUCT_KEYC] + @ Hash the KeyC with the multiboot image checksum to generate the KeyC derivation material to be sent to the other side of the link + bl GameCubeMultiBoot_Hash + @ Make sure the sent KeyC derivation material contains a magic value so that the other side can detect it + lsls r3, 8 + adds r3, GCMB_MAGIC_KEYCDERIVATION + @ Save off the KeyC derivation material and return to caller + str r3, [r0, GCMB_STRUCT_KEYC_DERIVATION] + bx r12 +GameCubeMultiBoot_Main_Return2: + 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: @ 81DCC4C + @ If there's no multiboot image ready, just return to caller + ldrb r1, [r0, GCMB_STRUCT_MBPROGRESS] + cmp r1, MBPROGRESS_READY_TO_BOOT + bne GameCubeMultiBoot_ExecuteProgram_Fail + @ Disable interrupts + ldr r3, pool_InterruptRegs + movs r1, 0 + strh r1, [r3, OFFSET_REG_IME - 0x200] + @ Jump to the real entry point of the multiboot image (past the image header), in ARM mode + 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: @ 81DCC60 + 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: @ 81DCCAA + 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: + @ Throw away anything that got sent + ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120] + @ Send the game code, the other side of the link must send back the same game code + ldr r1, pool_RubyUSAGameCode + str r1, [r3, OFFSET_REG_JOY_TRANS - 0x120] + movs r1, 0x10 + strh r1, [r3, OFFSET_REG_JOYSTAT - 0x120] + @ Use the saved VCount value to provide 8 bits of entropy for KeyB + ldrb r1, [r0, GCMB_STRUCT_SAVEDVCOUNT] + strb r1, [r0, GCMB_STRUCT_KEYB + 1] + @ If a multiboot image has been transferred at least enough such that the Nintendo logo check has passed, stop everything. + ldrb r1, [r0, GCMB_STRUCT_MBPROGRESS] + cmp r1, 0 + bne GcMbIntrHandler_Stop + @ Set the image destination pointers. + ldr r1, pool_MultiBootLoadAddr + str r1, [r0, GCMB_STRUCT_BASE_DEST_PTR] + str r1, [r0, GCMB_STRUCT_CUR_DEST_PTR] + @ Set the new interrupt handler. + adr r2, GcMbIntrHandler_CheckGameCodeSent + b GameCubeMultiBoot_SetInterruptHandler + + .align 2, 0 + +GcMbIntrHandler_CheckGameCodeSent: @ 81DCCEC + 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: @ 81DCCF8 + 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 + @ Use the saved VCount value to provide another 8 bits of entropy for KeyB. + ldrb r1, [r0, GCMB_STRUCT_SAVEDVCOUNT] + strb r1, [r0, GCMB_STRUCT_KEYB + 3] + adr r2, GcMbIntrHandler_ReceiveKeyA + b GameCubeMultiBoot_SetInterruptHandler + + .align 2, 0 + +GcMbIntrHandler_ReceiveKeyA: @ 81DCD0C + lsrs r1, 1 @ is receive complete? + bcc GcMbIntrHandler_Stop @ branch if not + ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120] + @ make sure top 8 bits of the received value is the KeyA magic number, stop if KeyA is invalid + lsrs r2, r1, 24 + cmp r2, GCMB_MAGIC_KEYA + bne GcMbIntrHandler_Stop + @ save received KeyA + str r1, [r0, GCMB_STRUCT_KEYA] + @ use the second GameCubeMultiBoot_Main() counter as another 8 bits of entropy for KeyB + ldrb r1, [r0, GCMB_STRUCT_COUNTER2] + strb r1, [r0, GCMB_STRUCT_KEYB + 2] + movs r2, 0 + movs r3, 0 + ldr r1, [r0, GCMB_STRUCT_KEYB] + lsrs r1, 8 + @ make sure KeyB is valid (other side of the link is supposed to check KeyB too), if it's not then change the byte that was just set so it is +GameCubeMultiBoot_KeyBCheckLoop: + lsrs r1, 1 + adcs r2, r3 + cmp r1, 0 + bne GameCubeMultiBoot_KeyBCheckLoop + cmp r2, 0xE + bgt GameCubeMultiBoot_KeyBSaveNewByte + cmp r2, 0x7 + bge GameCubeMultiBoot_KeyBCheckEnd + movs r1, 0xFF +GameCubeMultiBoot_KeyBSaveNewByte: + strb r1, [r0, GCMB_STRUCT_KEYB + 2] +GameCubeMultiBoot_KeyBCheckEnd: + @ add in the KeyB magic number and send off KeyB + ldr r1, [r0, GCMB_STRUCT_KEYB] + adds r1, GCMB_MAGIC_KEYB + ldr r3, pool_SerialRegs + str r1, [r3, OFFSET_REG_JOY_TRANS - 0x120] + movs r1, 0x30 + strh r1, [r3, OFFSET_REG_JOYSTAT - 0x120] + @ set new interrupt handler + adr r2, GcMbIntrHandler_CheckKeyBSent + b GameCubeMultiBoot_SetInterruptHandler + + .align 2, 0 + +GcMbIntrHandler_CheckKeyBSent: @ 81DCD4C + lsls r1, 31 + bcc GcMbIntrHandler_Stop @ stop if send failed + bmi GameCubeMultiBoot_CheckImageSizeResponse @ branch if receive is complete + adr r2, GcMbIntrHandler_CheckImageSizeResponse + b GameCubeMultiBoot_SetInterruptHandler + + .align 2, 0 + +GcMbIntrHandler_CheckImageSizeResponse: @ 81DCD58 + lsrs r1, 1 @ is receive complete? + bcc GcMbIntrHandler_Stop @ branch if not +GameCubeMultiBoot_CheckImageSizeResponse: + ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120] + ldr r2, GameCubeMultiBoot_MaximumImageSizeUInt32s + cmp r1, r2 + bhs GcMbIntrHandler_Stop + adds r1, 0x1 + adds r1, r1 + strh r1, [r0, GCMB_STRUCT_IMAGE_SIZE] + ldrb r1, [r0, GCMB_STRUCT_MBPROGRESS] + cmp r1, 0 +GcMbIntrHandler_StopIfNotEqual: + 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_CheckImageResponse + b GameCubeMultiBoot_SetInterruptHandler + + .align 2, 0 + +GcMbIntrHandler_CheckImageResponse: @ 81DCD7C + 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] + @ get the recieved uint32 + ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120] + @ put it in the current destination pointer and advance that pointer + stm r2!, {r1} + @ save off the advanced pointer + str r2, [r0, GCMB_STRUCT_CUR_DEST_PTR] + @ decrease the image size (in uint32s) + ldrh r1, [r0, GCMB_STRUCT_IMAGE_SIZE] + subs r1, 0x1 + strh r1, [r0, GCMB_STRUCT_IMAGE_SIZE] + @ branch away if the transfer is not yet complete + bne GameCubeMultiBoot_ReadVCount + +GcMbIntrHandler_SendCounter2: + @ send counter2 with magic number + ldrb r1, [r0, GCMB_STRUCT_COUNTER2] + lsls r1, 8 + adds r1, GCMB_MAGIC_COUNTER2 + str r1, [r3, OFFSET_REG_JOY_TRANS - 0x120] + adr r2, GcMbIntrHandler_CheckCounter2Sent + b GameCubeMultiBoot_SetInterruptHandler + + .align 2, 0 + +GcMbIntrHandler_CheckCounter2Sent: + lsls r1, 31 + +GcMbIntrHandler_StopIfSendFailed: + bcc GcMbIntrHandler_Stop @ stop if send failed + @ if KeyC derivation value has not yet been generated, send Counter2 again, otherwise, send KeyC derivation + ldr r1, [r0, GCMB_STRUCT_KEYC_DERIVATION] + cmp r1, 0 + beq GcMbIntrHandler_SendCounter2 + str r1, [r3, OFFSET_REG_JOY_TRANS - 0x120] + adr r2, GcMbIntrHandler_CheckKeyCDerivationSent + b GameCubeMultiBoot_SetInterruptHandler + + .align 2, 0 + +GcMbIntrHandler_CheckKeyCDerivationSent: @ 81DCDB8 + lsls r1, 31 + bcc GcMbIntrHandler_StopIfSendFailed @ branch if send failed + bmi GameCubeMultiBoot_CheckBootKeyResponse @ branch if receive is complete + adr r2, GcMbIntrHandler_CheckBootKeyResponse + b GameCubeMultiBoot_SetInterruptHandler + + .align 2, 0 + +GcMbIntrHandler_CheckBootKeyResponse: @ 81DCDC4 + lsrs r1, 1 @ is receive complete? + bcc GcMbIntrHandler_StopIfSendFailed @ branch if not + +GameCubeMultiBoot_CheckBootKeyResponse: + ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120] + @ make sure received boot key contains expected magic number, stop if not + lsrs r2, r1, 24 + cmp r2, GCMB_MAGIC_BOOTKEY + bne GcMbIntrHandler_StopIfNotEqual + @ save received bootkey to be checked in GameCubeMultiBoot_Main() + strh r1, [r0, GCMB_STRUCT_BOOT_KEY] + @ stop if anything more gets sent + adr r2, GcMbIntrHandler_StopUnconditionally + b GameCubeMultiBoot_SetInterruptHandler + + .align 2, 0 + +GcMbIntrHandler_StopUnconditionally: @ 81DCDD8 + b GcMbIntrHandler_Stop + + thumb_func_end GameCubeMultiBoot_HandleSerialInterrupt + + non_word_aligned_thumb_func_start GameCubeMultiBoot_Quit +@ void GameCubeMultiBoot_Quit()@ +GameCubeMultiBoot_Quit: @ 81DCDDA + 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 + +GameCubeMultiBoot_MaximumImageSizeUInt32s: .4byte 0x00004000 + +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/libs/libisagbprn.c b/src/libs/libisagbprn.c new file mode 100644 index 000000000..e0e979e95 --- /dev/null +++ b/src/libs/libisagbprn.c @@ -0,0 +1,177 @@ +#include <stdarg.h> +#include <stdio.h> +#include "gba/gba.h" +#include "config.h" + +#define AGB_PRINT_FLUSH_ADDR 0x9FE209D +#define AGB_PRINT_STRUCT_ADDR 0x9FE20F8 +#define AGB_PRINT_PROTECT_ADDR 0x9FE2FFE +#define WSCNT_DATA (WAITCNT_PHI_OUT_16MHZ | WAITCNT_WS0_S_2 | WAITCNT_WS0_N_4) + +// originally for auto no$gba support, the string "no$gba" should be at this address, +// the user needs to read this string out as the memory viewer won't show it. +#define NOCASHGBAIDADDR 0x4FFFA00 +#define NOCASHGBAPRINTADDR1 0x4FFFA10 // automatically adds a newline after the string has finished +#define NOCASHGBAPRINTADDR2 0x4FFFA14 // does not automatically add the newline. by default, NOCASHGBAPRINTADDR2 is used. this is used to keep strings consistent between no$gba and VBA-RR, but a user can choose to forgo this. + +struct AGBPrintStruct +{ + u16 m_nRequest; + u16 m_nBank; + u16 m_nGet; + u16 m_nPut; +}; + +typedef void (*LPFN_PRINT_FLUSH)(void); + +#ifndef NDEBUG + +void AGBPrintFlush1Block(void); + +void AGBPrintInit(void) +{ + volatile struct AGBPrintStruct *pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR; + u16 *pWSCNT = (u16 *)REG_ADDR_WAITCNT; + u16 *pProtect = (u16 *)AGB_PRINT_PROTECT_ADDR; + u16 nOldWSCNT = *pWSCNT; + *pWSCNT = WSCNT_DATA; + *pProtect = 0x20; + pPrint->m_nRequest = pPrint->m_nGet = pPrint->m_nPut = 0; + pPrint->m_nBank = 0xFD; + *pProtect = 0; + *pWSCNT = nOldWSCNT; +} + +static void AGBPutcInternal(const char cChr) +{ + volatile struct AGBPrintStruct *pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR; + u16 *pPrintBuf = (u16 *)(0x8000000 + (pPrint->m_nBank << 16)); + u16 *pProtect = (u16 *)AGB_PRINT_PROTECT_ADDR; + u16 nData = pPrintBuf[pPrint->m_nPut / 2]; + *pProtect = 0x20; + nData = (pPrint->m_nPut & 1) ? (nData & 0xFF) | (cChr << 8) : (nData & 0xFF00) | cChr; + pPrintBuf[pPrint->m_nPut / 2] = nData; + pPrint->m_nPut++; + *pProtect = 0; +} + +void AGBPutc(const char cChr) +{ + u16 *pWSCNT = (u16 *)REG_ADDR_WAITCNT; + u16 nOldWSCNT = *pWSCNT; + volatile struct AGBPrintStruct *pPrint; + *pWSCNT = WSCNT_DATA; + AGBPutcInternal(cChr); + *pWSCNT = nOldWSCNT; + pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR; + if (pPrint->m_nPut == ((pPrint->m_nGet - 1) & 0xFFFF)) + AGBPrintFlush1Block(); +} + +void AGBPrint(const char *pBuf) +{ + volatile struct AGBPrintStruct *pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR; + u16 *pWSCNT = (u16 *)REG_ADDR_WAITCNT; + u16 nOldWSCNT = *pWSCNT; + *pWSCNT = WSCNT_DATA; + while (*pBuf) + { + AGBPutc(*pBuf); + pBuf++; + } + *pWSCNT = nOldWSCNT; +} + +void AGBPrintf(const char *pBuf, ...) +{ + char bufPrint[0x100]; + va_list vArgv; + va_start(vArgv, pBuf); + vsprintf(bufPrint, pBuf, vArgv); + va_end(vArgv); + AGBPrint(bufPrint); +} + +static void AGBPrintTransferDataInternal(u32 bAllData) +{ + LPFN_PRINT_FLUSH lpfnFuncFlush; + u16 *pIME; + u16 nIME; + u16 *pWSCNT; + u16 nOldWSCNT; + u16 *pProtect; + volatile struct AGBPrintStruct *pPrint; + + pProtect = (u16 *)AGB_PRINT_PROTECT_ADDR; + pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR; + lpfnFuncFlush = (LPFN_PRINT_FLUSH)AGB_PRINT_FLUSH_ADDR; + pIME = (u16 *)REG_ADDR_IME; + nIME = *pIME; + pWSCNT = (u16 *)REG_ADDR_WAITCNT; + nOldWSCNT = *pWSCNT; + *pIME = nIME & ~1; + *pWSCNT = WSCNT_DATA; + + if (bAllData) + { + while (pPrint->m_nPut != pPrint->m_nGet) + { + *pProtect = 0x20; + lpfnFuncFlush(); + *pProtect = 0; + } + } + else if (pPrint->m_nPut != pPrint->m_nGet) + { + *pProtect = 0x20; + lpfnFuncFlush(); + *pProtect = 0; + } + + *pWSCNT = nOldWSCNT; + *pIME = nIME; +} + +void AGBPrintFlush1Block(void) +{ + AGBPrintTransferDataInternal(FALSE); +} + +void AGBPrintFlush(void) +{ + AGBPrintTransferDataInternal(TRUE); +} + +void AGBAssert(const char *pFile, int nLine, const char *pExpression, int nStopProgram) +{ + if (nStopProgram) + { + AGBPrintf("ASSERTION FAILED FILE=[%s] LINE=[%d] EXP=[%s] \n", pFile, nLine, pExpression); + AGBPrintFlush(); + asm(".hword 0xEFFF"); + } + else + { + AGBPrintf("WARING FILE=[%s] LINE=[%d] EXP=[%s] \n", pFile, nLine, pExpression); + } +} + +// no$gba print functions, uncomment to use +/* +void NoCashGBAPrint(const char *pBuf) +{ + *(volatile u32*)NOCASHGBAPRINTADDR2 = (u32)pBuf; +} + +void NoCashGBAPrintf(const char *pBuf, ...) +{ + char bufPrint[0x100]; + va_list vArgv; + va_start(vArgv, pBuf); + vsprintf(bufPrint, pBuf, vArgv); + va_end(vArgv); + NoCashGBAPrint(bufPrint); +} +*/ + +#endif diff --git a/src/libs/m4a_1.s b/src/libs/m4a_1.s new file mode 100644 index 000000000..8dbcf7efd --- /dev/null +++ b/src/libs/m4a_1.s @@ -0,0 +1,1915 @@ + .include "include/macros.inc" + .include "constants/gba_constants.inc" + .include "constants/m4a_constants.inc" + + .syntax unified + + .bss + + .global gUnknown_030007B8 +gUnknown_030007B8: + .space 0x770 + + .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_81DD264 + 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_81DD264 +sub_81DD264: + 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_81DD520 + mov r0, r1 + add r3, r3, 0x1 + bl sub_81DD520 + 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_81DD520 + mov r0, r1 +_081DD364: + add r3, r3, 0x1 + bl sub_81DD520 + 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_81DD520 + mov r0, r1 + sub r3, r3, 0x1 + bl sub_81DD520 + 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_81DD520 + mov r0, r1 +_081DD434: + sub r3, r3, 0x1 + bl sub_81DD520 + 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_81DD264 + + arm_func_start sub_81DD520 +sub_81DD520: + 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_030007B8 + 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_030007B8 + and r0, r3, 0x3F + ldrsb r1, [r5, r0] + pop {r0,r2,r5-r7,pc} + .pool + arm_func_end sub_81DD520 + + 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. diff --git a/src/pokemon/learn_move.c b/src/pokemon/learn_move.c index ef1d66349..356a31b00 100644 --- a/src/pokemon/learn_move.c +++ b/src/pokemon/learn_move.c @@ -25,8 +25,8 @@ extern u16 gSpecialVar_0x8004; extern u16 gSpecialVar_0x8005; extern u8 gTileBuffer[]; -extern const struct WindowConfig gWindowConfig_81E6CE4; -extern const struct WindowConfig gWindowConfig_81E7240; +extern const struct WindowTemplate gWindowTemplate_81E6CE4; +extern const struct WindowTemplate gWindowTemplate_81E7240; extern const u8 *const gContestEffectStrings[]; extern const u8 *const gMoveDescriptions[]; extern const u8 gTypeNames[][7]; @@ -268,13 +268,13 @@ void CB2_InitLearnMove(void) sub_8133558(); SetVBlankCallback(VBlankCB_LearnMove); - SetUpWindowConfig(&gWindowConfig_81E7240); - InitMenuWindow(&gWindowConfig_81E7240); - MenuZeroFillScreen(); + Text_LoadWindowTemplate(&gWindowTemplate_81E7240); + InitMenuWindow(&gWindowTemplate_81E7240); + Menu_EraseScreen(); - SetUpWindowConfig(&gWindowConfig_81E6CE4); - InitMenuWindow(&gWindowConfig_81E6CE4); - MenuZeroFillScreen(); + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); + Menu_EraseScreen(); REG_BG0VOFS = 0; REG_BG0VOFS = 0; // huh? @@ -302,13 +302,13 @@ void sub_81327A4(void) sLearnMoveStruct->unk2C6 = gSpecialVar_0x8005; SetVBlankCallback(VBlankCB_LearnMove); - SetUpWindowConfig(&gWindowConfig_81E7240); - InitMenuWindow(&gWindowConfig_81E7240); - MenuZeroFillScreen(); + Text_LoadWindowTemplate(&gWindowTemplate_81E7240); + InitMenuWindow(&gWindowTemplate_81E7240); + Menu_EraseScreen(); - SetUpWindowConfig(&gWindowConfig_81E6CE4); - InitMenuWindow(&gWindowConfig_81E6CE4); - MenuZeroFillScreen(); + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); + Menu_EraseScreen(); REG_DISPCNT = 0x1340; REG_BG0VOFS = 0; @@ -333,7 +333,7 @@ void CB2_LearnMove(void) if (sLearnMoveStruct->unk1D) { sLearnMoveStruct->unk1D = FALSE; - sub_814AD7C(0x58, (sLearnMoveStruct->unk18 * 2 + 1) * 8); + MenuCursor_SetPos814AD7C(0x58, (sLearnMoveStruct->unk18 * 2 + 1) * 8); } if (sLearnMoveStruct->unk1E != 0) { @@ -401,7 +401,7 @@ void LearnMoveMain(void) sub_813362C(); break; case 8: - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) { DisplayYesNoMenu(21, 7, 1); sLearnMoveStruct->state++; @@ -409,7 +409,7 @@ void LearnMoveMain(void) break; case 9: { - s8 selection = ProcessMenuInputNoWrap_(); + s8 selection = Menu_ProcessInputNoWrap_(); if (selection == 0) { @@ -436,7 +436,7 @@ void LearnMoveMain(void) } break; case 12: - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) { DisplayYesNoMenu(21, 7, 1); sLearnMoveStruct->state++; @@ -444,7 +444,7 @@ void LearnMoveMain(void) break; case 13: { - s8 selection = ProcessMenuInputNoWrap_(); + s8 selection = Menu_ProcessInputNoWrap_(); if (selection == 0) { @@ -467,7 +467,7 @@ void LearnMoveMain(void) sLearnMoveStruct->state++; break; case 17: - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) { DisplayYesNoMenu(21, 7, 1); sLearnMoveStruct->state = 18; @@ -475,7 +475,7 @@ void LearnMoveMain(void) break; case 18: { - s8 var = ProcessMenuInputNoWrap_(); + s8 var = Menu_ProcessInputNoWrap_(); if (var == 0) { @@ -495,7 +495,7 @@ void LearnMoveMain(void) sLearnMoveStruct->state++; break; case 25: - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) { sLearnMoveStruct->state = 26; DisplayYesNoMenu(21, 7, 1); @@ -503,7 +503,7 @@ void LearnMoveMain(void) break; case 26: { - s8 var = ProcessMenuInputNoWrap_(); + s8 var = Menu_ProcessInputNoWrap_(); if (var == 0) { @@ -524,7 +524,7 @@ void LearnMoveMain(void) } break; case 27: - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) { if (sLearnMoveStruct->showContestInfo == FALSE) sLearnMoveStruct->state = 3; @@ -533,7 +533,7 @@ void LearnMoveMain(void) } break; case 19: - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) { sLearnMoveStruct->state = 20; BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); @@ -547,7 +547,7 @@ void LearnMoveMain(void) } break; case 21: - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) sLearnMoveStruct->state = 14; break; case 22: @@ -597,7 +597,7 @@ void LearnMoveMain(void) } break; case 30: - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) { #ifdef ENGLISH sub_81328E8(gOtherText_ForgotOrDidNotLearnMove); @@ -609,7 +609,7 @@ void LearnMoveMain(void) } break; case 31: - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) { PlayFanfare(BGM_FANFA1); sLearnMoveStruct->state = 32; @@ -633,16 +633,16 @@ void DrawLearnMoveMenuWindow(void) { u32 i; - BasicInitMenuWindow(&gWindowConfig_81E7240); + BasicInitMenuWindow(&gWindowTemplate_81E7240); for (i = 0; i < 4; i++) { - MenuDrawTextWindow( + Menu_DrawStdWindowFrame( gUnknown_08402CF8[i][0], gUnknown_08402CF8[i][1], gUnknown_08402CF8[i][2], gUnknown_08402CF8[i][3]); } - BasicInitMenuWindow(&gWindowConfig_81E6CE4); + BasicInitMenuWindow(&gWindowTemplate_81E6CE4); } void sub_8133030(bool8 a) @@ -658,7 +658,7 @@ void sub_8133030(bool8 a) for (i = 0; gUnknown_08402D08[0][i].unk0 != NULL; i++) { sub_8072C74(gTileBuffer, gUnknown_08402D08[0][i].unk0, 64, 2); - MenuPrint(gTileBuffer, gUnknown_08402D08[0][i].unk4, gUnknown_08402D08[0][i].unk5); + Menu_PrintText(gTileBuffer, gUnknown_08402D08[0][i].unk4, gUnknown_08402D08[0][i].unk5); } if (!a) @@ -696,10 +696,10 @@ void sub_8133140(bool8 a) for (i = 0; gUnknown_08402D08[0][i].unk0 != NULL; i++) { sub_8072C74(gTileBuffer, gUnknown_08402D08[1][i].unk0, 64, 2); - MenuPrint(gTileBuffer, gUnknown_08402D08[1][i].unk4, gUnknown_08402D08[1][i].unk5); + Menu_PrintText(gTileBuffer, gUnknown_08402D08[1][i].unk4, gUnknown_08402D08[1][i].unk5); if (i != 0) { - MenuZeroFillWindowRect( + Menu_EraseWindowRect( gUnknown_08402D08[1][i].unk4, gUnknown_08402D08[1][i].unk5 + 2, gUnknown_08402D08[1][i].unk4 + 7, @@ -938,7 +938,7 @@ void sub_8133800(void) r6++; } *str = EOS; - MenuPrint(gTileBuffer, 11, 1); + Menu_PrintText(gTileBuffer, 11, 1); sub_813360C(0); } @@ -972,17 +972,17 @@ void PrintMoveInfo(u16 moveId, const u8 *b) sub_8072C74(str, gOtherText_ThreeDashes2, 32, 2); else sub_8072C14(str, gBattleMoves[moveId].power, 32, 2); - MenuPrint(str, b[0], b[1]); + Menu_PrintText(str, b[0], b[1]); break; case 4: if (gBattleMoves[moveId].accuracy == 0) sub_8072C74(str, gOtherText_ThreeDashes2, 32, 2); else sub_8072C14(str, gBattleMoves[moveId].accuracy, 32, 2); - MenuPrint(str, b[0], b[1]); + Menu_PrintText(str, b[0], b[1]); break; case 6: - MenuZeroFillWindowRect(b[0], b[1], b[0], b[1] + 1); + Menu_EraseWindowRect(b[0], b[1], b[0], b[1] + 1); numHearts = gContestEffects[gContestMoves[moveId].effect].appeal / 10; if (numHearts == 255) numHearts = 0; @@ -995,7 +995,7 @@ void PrintMoveInfo(u16 moveId, const u8 *b) } break; case 7: - MenuZeroFillWindowRect(b[0], b[1], b[0], b[1] + 1); + Menu_EraseWindowRect(b[0], b[1], b[0], b[1] + 1); numHearts = gContestEffects[gContestMoves[moveId].effect].jam / 10; if (numHearts == 255) numHearts = 0; @@ -1037,7 +1037,7 @@ void sub_8133AEC(bool8 contestInfo, int unused) { u8 r1 = var * 2 + 9; - MenuFillWindowRectWithBlankTile(11, r1, 28, 12); + Menu_BlankWindowRect(11, r1, 28, 12); } } } @@ -1045,22 +1045,22 @@ void sub_8133AEC(bool8 contestInfo, int unused) { if (contestInfo) { - MenuZeroFillWindowRect(gUnknown_08402E24[5][0], gUnknown_08402E24[5][1], gUnknown_08402E24[5][0], gUnknown_08402E24[5][1] + 1); - MenuZeroFillWindowRect(gUnknown_08402E24[6][0], gUnknown_08402E24[6][1], gUnknown_08402E24[6][0], gUnknown_08402E24[6][1] + 1); + Menu_EraseWindowRect(gUnknown_08402E24[5][0], gUnknown_08402E24[5][1], gUnknown_08402E24[5][0], gUnknown_08402E24[5][1] + 1); + Menu_EraseWindowRect(gUnknown_08402E24[6][0], gUnknown_08402E24[6][1], gUnknown_08402E24[6][0], gUnknown_08402E24[6][1] + 1); for (i = 0; i < 16; i++) gSprites[sLearnMoveStruct->spriteIDs[i + 4]].invisible = TRUE; } else { - MenuZeroFillWindowRect(gUnknown_08402E24[1][0], gUnknown_08402E24[1][1], gUnknown_08402E24[1][0] + 3, gUnknown_08402E24[1][1] + 1); - MenuZeroFillWindowRect(gUnknown_08402E24[3][0], gUnknown_08402E24[3][1], gUnknown_08402E24[3][0] + 3, gUnknown_08402E24[3][1] + 1); + Menu_EraseWindowRect(gUnknown_08402E24[1][0], gUnknown_08402E24[1][1], gUnknown_08402E24[1][0] + 3, gUnknown_08402E24[1][1] + 1); + Menu_EraseWindowRect(gUnknown_08402E24[3][0], gUnknown_08402E24[3][1], gUnknown_08402E24[3][0] + 3, gUnknown_08402E24[3][1] + 1); } - MenuZeroFillWindowRect(11, 9, 28, 12); + Menu_EraseWindowRect(11, 9, 28, 12); } } void sub_8133CA4(void) { - MenuZeroFillWindowRect(21, 7, 27, 12); + Menu_EraseWindowRect(21, 7, 27, 12); sub_8133AEC(sLearnMoveStruct->showContestInfo, 0); } diff --git a/src/pokemon/mail.c b/src/pokemon/mail.c index 2ab05ca2b..4497c98fb 100644 --- a/src/pokemon/mail.c +++ b/src/pokemon/mail.c @@ -1,7 +1,10 @@ #include "global.h" #include "mail.h" +#include "data2.h" #include "easy_chat.h" #include "constants/items.h" +#include "constants/species.h" +#include "field_fadetransition.h" #include "graphics.h" #include "mail_data.h" #include "menu.h" @@ -10,14 +13,17 @@ #include "palette.h" #include "pokemon_icon.h" #include "overworld.h" +#include "script.h" #include "sprite.h" #include "string_util.h" #include "strings2.h" #include "task.h" #include "text.h" -#include "unknown_task.h" +#include "scanline_effect.h" #include "ewram.h" +extern u8 (*gMenuCallback)(void); + struct UnkMailStruct { u8 unk_0_0:2; @@ -234,6 +240,56 @@ const struct MailLayout gUnknown_083E57A4[] = {5, 15, 15, 4, 3, Unknown_3E5790}, }; +#if DEBUG + +const u8 Str_8411540[] = _("レイアウトを にほんごで ひょうじ?"); // Display using Japanese layout? +const u8 Str_8411553[] = _("にほんご "); // Japanese +const u8 Str_8411559[] = _("かいがい "); // Overseas + +const u8 *const _8411560[] = +{ + Str_8411553, + Str_8411559, +}; + +const u8 Str_8411568[] = _("イメージ タイプを えらんでね"); // Choose an image type +const u8 Str_8411578[] = _("{STR_VAR_1}"); +const u8 Str_841157B[] = _("オレンジ "); // Orange +const u8 Str_8411581[] = _("ハーバー "); // Harbor +const u8 Str_8411587[] = _("キラキラ "); // Glitter +const u8 Str_841158D[] = _("メカニカル"); // Mech +const u8 Str_8411593[] = _("ウッディー"); // Wood +const u8 Str_8411599[] = _("クロス "); // Wave +const u8 Str_841159F[] = _("トレジャー"); // Bead +const u8 Str_84115A5[] = _("シャドウ "); // Shadow +const u8 Str_84115AB[] = _("トロピカル"); // Tropic +const u8 Str_84115B1[] = _("ドリーム "); // Dream +const u8 Str_84115B7[] = _("ミラクル "); // Fab +const u8 Str_84115BD[] = _("レトロ "); // Retro + +const u8 *const _84115C4[] = +{ + Str_841157B, + Str_8411581, + Str_8411587, + Str_841158D, + Str_8411593, + Str_8411599, + Str_841159F, + Str_84115A5, + Str_84115AB, + Str_84115B1, + Str_84115B7, + Str_84115BD, +}; + +const u8 Str_84115F4[] = _("メールをみる"); // View Mail +const u8 Str_84115FB[] = _("メールとうろく"); // Register Mail +const u8 Str_8411603[] = _("もたせる"); // Give to Pokémon +const u8 Str_8411608[] = _("メールをけす"); // Delete Mail + +#endif + // XXX: what is this? static u8 *const sSharedMemPtr = gSharedMem; @@ -247,26 +303,44 @@ static void sub_80F8F58(void); static void sub_80F8F78(void); static void sub_80F8FB4(void); +extern u16 gSpecialVar_0x8004; +extern u16 gSpecialVar_0x8005; +extern u16 gSpecialVar_0x8006; + +#if DEBUG +static u8 gUnknown_Debug_0300079C; +#endif + void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2) { - u16 mailDesign; u16 buffer[2]; + u16 species; - ewram0_4.varFF = GAME_LANGUAGE; - ewram0_4.var100 = 1; - ewram0_4.var104 = (MainCallback)EasyChat_GetWordText; - ewram0_4.var108 = (MainCallback)ConvertEasyChatWordsToString; - - mailDesign = arg0->itemId - ITEM_ORANGE_MAIL; - - if (mailDesign <= 11) +#if DEBUG + if (gUnknown_Debug_0300079C != 0) { - ewram0_4.varFA = arg0->itemId - ITEM_ORANGE_MAIL; + ewram0_4.varFF = GAME_LANGUAGE; + ewram0_4.var100 = gSpecialVar_0x8004; + ewram0_4.var104 = (MainCallback)EasyChat_GetWordText; + ewram0_4.var108 = (MainCallback)ConvertEasyChatWordsToString; + ewram0_4.varFA = gSpecialVar_0x8006; } else +#endif { - ewram0_4.varFA = 0; - arg2 = FALSE; + ewram0_4.varFF = GAME_LANGUAGE; + ewram0_4.var100 = 1; + ewram0_4.var104 = (MainCallback)EasyChat_GetWordText; + ewram0_4.var108 = (MainCallback)ConvertEasyChatWordsToString; + if (IS_ITEM_MAIL(arg0->itemId)) + { + ewram0_4.varFA = arg0->itemId - 0x79; + } + else + { + ewram0_4.varFA = 0; + arg2 = FALSE; + } } switch (ewram0_4.var100) @@ -275,24 +349,22 @@ void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2) default: ewram0_4.var10C = &gUnknown_083E5730[ewram0_4.varFA]; break; - case 1: ewram0_4.var10C = &gUnknown_083E57A4[ewram0_4.varFA]; break; } - if (((MailSpeciesToSpecies(arg0->species, buffer) << 16) + 0xFFFF0000) <= (410 << 16)) + species = MailSpeciesToSpecies(arg0->species, buffer); + if (species >= 1 && species <= 411) { switch (ewram0_4.varFA) { case 6: ewram0_4.varFB = 1; break; - case 9: ewram0_4.varFB = 2; break; - default: ewram0_4.varFB = 0; break; @@ -303,7 +375,6 @@ void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2) ewram0_4.varFB = 0; } - ewram0_4.varF4 = arg0; ewram0_4.varEC = arg1; ewram0_4.varF8 = arg2; @@ -320,7 +391,7 @@ static u8 sub_80F8A28(void) { case 0: SetVBlankCallback(NULL); - remove_some_task(); + ScanlineEffect_Stop(); REG_DISPCNT = 0; RETURN_UP_STATE; @@ -354,11 +425,11 @@ static u8 sub_80F8A28(void) RETURN_UP_STATE; case 6: - SetUpWindowConfig(&gWindowConfig_81E6DFC); + Text_LoadWindowTemplate(&gWindowTemplate_81E6DFC); RETURN_UP_STATE; case 7: - MultistepInitMenuWindowBegin(&gWindowConfig_81E6DFC); + MultistepInitMenuWindowBegin(&gWindowTemplate_81E6DFC); RETURN_UP_STATE; case 8: @@ -369,7 +440,7 @@ static u8 sub_80F8A28(void) RETURN_UP_STATE; case 9: - MenuZeroFillScreen(); + Menu_EraseScreen(); RETURN_UP_STATE; case 10: CpuFill16(1, (void *)(VRAM + 0x4800), 0x800); @@ -528,11 +599,11 @@ static void sub_80F8E80(void) x = ewram0_4.var10C->var4[pos].unk_0_4; y += ewram0_4.var10C->var4[pos].unk_0_0; - MenuPrint(ewram0_4.words[pos], ewram0_4.var10C->var3_4 + x, ewram0_4.var10C->var3_0 + y); + Menu_PrintText(ewram0_4.words[pos], ewram0_4.var10C->var3_4 + x, ewram0_4.var10C->var3_0 + y); y += 2; } - MenuPrint(ewram0_4.varD8, ewram0_4.varF9, ewram0_4.var10C->var1); + Menu_PrintText(ewram0_4.varD8, ewram0_4.varF9, ewram0_4.var10C->var1); } static void sub_80F8F18(void) @@ -575,25 +646,514 @@ static void sub_80F8F78(void) static void sub_80F8FB4(void) { - u16 local1; + if (!UpdatePaletteFade()) + { + SetMainCallback2(ewram0_4.varEC); + switch (ewram0_4.varFB) + { + case 2: + case 1: + sub_809D608(sub_809D4A8(ewram0_4.varF4->species)); + sub_809D510(&gSprites[ewram0_4.varFC]); + break; + } +#if !DEBUG + memset(&ewram0_4, 0, 0x110); +#endif + ResetPaletteFade(); + } +} + +#if DEBUG + +void debug_sub_810CA7C(u8); +void debug_sub_810CE1C(u8); +void debug_sub_810D388(void); +void debug_sub_810D340(void); + +void debug_sub_810C910(u8 taskId) +{ + if (!gPaletteFade.active) + { + gUnknown_Debug_0300079C = 1; + Menu_EraseScreen(); + DestroyTask(taskId); + if (gSaveBlock1.mail[gSpecialVar_0x8005].itemId == 0) + HandleReadMail(&gSaveBlock1.mail[gSpecialVar_0x8005], debug_sub_810D388, 0); + else + HandleReadMail(&gSaveBlock1.mail[gSpecialVar_0x8005], debug_sub_810D388, 1); + } +} + +void debug_sub_810C990(u8 taskId) +{ + if (gMain.newKeys & (DPAD_LEFT | DPAD_DOWN)) + { + gSpecialVar_0x8006 = (gSpecialVar_0x8006 + 11) % 12; + Menu_DrawStdWindowFrame(1, 1, 10, 4); + Menu_PrintText(_84115C4[gSpecialVar_0x8006], 2, 2); + } + else if (gMain.newKeys & (DPAD_UP | DPAD_RIGHT)) + { + gSpecialVar_0x8006 = (gSpecialVar_0x8006 + 1) % 12; + Menu_DrawStdWindowFrame(1, 1, 10, 4); + Menu_PrintText(_84115C4[gSpecialVar_0x8006], 2, 2); + } + else if (gMain.newKeys & A_BUTTON) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = debug_sub_810C910; + } + else if (gMain.newKeys & B_BUTTON) + { + Menu_DisplayDialogueFrame(); + Menu_PrintText(Str_8411540, 4, 15); + Menu_PrintText(_8411560[gSpecialVar_0x8004], 2, 2); + gTasks[taskId].func = debug_sub_810CA7C; + } +} - if (UpdatePaletteFade()) +void debug_sub_810CA7C(u8 taskId) +{ + if (gMain.newKeys & 0xF0) + { + gSpecialVar_0x8004 ^= 1; + Menu_PrintText(_8411560[gSpecialVar_0x8004], 2, 2); + } + else if (gMain.newKeys & A_BUTTON) { + if (gMain.watchedKeysPressed) + { + gMain.watchedKeysPressed = FALSE; + Menu_DisplayDialogueFrame(); + Menu_PrintText(Str_8411540, 4, 15); + Menu_DrawStdWindowFrame(1, 1, 10, 4); + Menu_PrintText(_8411560[gSpecialVar_0x8004], 2, 2); + } + else + { + Menu_DisplayDialogueFrame(); + Menu_PrintText(Str_8411568, 4, 15); + Menu_DrawStdWindowFrame(1, 1, 10, 4); + Menu_PrintText(_84115C4[gSpecialVar_0x8006], 2, 2); + gTasks[taskId].func = debug_sub_810C990; + } + } +} + +void debug_sub_810CB50(u8 taskId) +{ + u8 sp0[] = _("{STR_VAR_1} {STR_VAR_2}"); + u8 sp8[] = _("メール{STR_VAR_1} {STR_VAR_2}"); + bool8 r2 = FALSE; + + if (gMain.newKeys & A_BUTTON) + { + ConvertIntToDecimalStringN(gStringVar1, gSpecialVar_0x8005, 2, 1); + StringCopy(gStringVar2, gSpeciesNames[gTasks[taskId].data[0]]); + gSaveBlock1.mail[gSpecialVar_0x8005].species = gTasks[taskId].data[0]; + StringExpandPlaceholders(gStringVar4, sp8); + Menu_DisplayDialogueFrame(); + Menu_PrintText(gStringVar4, 4, 15); + DestroyTask(taskId); + CreateTask(debug_sub_810CE1C, 0); + debug_sub_810D340(); return; } + else if (gMain.newKeys & B_BUTTON) + { + DestroyTask(taskId); + Menu_EraseScreen(); + CreateTask(debug_sub_810CE1C, 0); + debug_sub_810D340(); + return; + } + else if (gMain.newKeys & (DPAD_LEFT | DPAD_DOWN)) + { + gTasks[taskId].data[0] = (gTasks[taskId].data[0] + 0x19B) % 0x19C; + r2 = TRUE; + } + else if (gMain.newKeys & (DPAD_UP | DPAD_RIGHT)) + { + gTasks[taskId].data[0] = (gTasks[taskId].data[0] + 1) % 0x19C; + r2 = TRUE; + } + + if (r2) + { + ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[0], 2, 3); + StringCopy(gStringVar2, gSpeciesNames[gTasks[taskId].data[0]]); + StringExpandPlaceholders(gStringVar4, sp0); + Menu_DrawStdWindowFrame(0, 0, 12, 3); + Menu_PrintText(gStringVar4, 1, 1); + } +} + +void debug_sub_810CCEC(u8 taskId) +{ + u8 string1[] = _("メール{STR_VAR_1}を だれに もたせる?"); + u8 string2[] = _("000 {STR_VAR_1}"); + + ConvertIntToDecimalStringN(gStringVar1, gSpecialVar_0x8005, 1, 1); + StringExpandPlaceholders(gStringVar4, string1); + Menu_DisplayDialogueFrame(); + Menu_PrintText(gStringVar4, 4, 15); + + StringCopy(gStringVar1, gSpeciesNames[0]); + StringExpandPlaceholders(gStringVar4, string2); + Menu_DrawStdWindowFrame(0, 0, 12, 3); + Menu_PrintText(string2, 1, 1); // This probably should have been gStringVar4 + + gTasks[taskId].func = debug_sub_810CB50; +} + +u8 debug_sub_810CD9C(void) +{ + CloseMenu(); + ScriptContext1_Stop(); + ScriptContext2_Enable(); + gUnknown_Debug_0300079C = 0; + gSpecialVar_0x8004 = gSpecialVar_0x8005 = gSpecialVar_0x8006 = 0; + SetMainCallback2(debug_sub_810D388); + return 1; +} + +void debug_sub_810CDE0(void) +{ + UpdatePaletteFade(); + RunTasks(); +} + +void debug_sub_810CDF0(void) +{ + gMain.watchedKeysPressed = 0; + gMain.watchedKeysMask = 0; + gFieldCallback = mapldr_default; + SetMainCallback2(c2_exit_to_overworld_2_switch); +} + +void debug_sub_810CE1C(u8 taskId) +{ + if (gMenuCallback() == TRUE) + { + CloseMenu(); + DestroyTask(taskId); + } +} + +u8 debug_sub_810CE48(void) +{ + s8 input = Menu_ProcessInput(); + + switch (input) + { + case -1: + Menu_EraseScreen(); + debug_sub_810D340(); + return 0; + case -2: + return 0; + default: + gSpecialVar_0x8005 = input; + gSpecialVar_0x8006 %= 12; + CreateTask(debug_sub_810CA7C, 0); + gMain.watchedKeysPressed = TRUE; // huh? + gMain.watchedKeysMask = 0; + return 1; + } +} + +u8 debug_sub_810CEA4(void) +{ + if (!gPaletteFade.active) + { + gSpecialVar_0x8004 = 4; + sub_80E60D8(); + return 1; + } + return 0; +} + +u8 debug_sub_810CED0(void) +{ + u8 text[] = _("せいきの データが とうろくずみ です\n" + "しんき とうろく できません"); + s8 input = Menu_ProcessInput(); + + switch (input) + { + case -1: + Menu_EraseScreen(); + break; + case -2: + return 0; + default: + gSpecialVar_0x8005 = input; + if (IS_ITEM_MAIL(gSaveBlock1.mail[input].itemId)) + { + Menu_EraseScreen(); + Menu_DisplayDialogueFrame(); + Menu_PrintText(text, 4, 15); + } + else + { + gSaveBlock1.mail[gSpecialVar_0x8005].itemId = 0xFFFF; + StringCopy(gSaveBlock1.mail[gSpecialVar_0x8005].playerName, gSaveBlock2.playerName); + *(u32 *)gSaveBlock1.mail[gSpecialVar_0x8005].trainerId = *(u32 *)gSaveBlock2.playerTrainerId; + gMenuCallback = debug_sub_810CEA4; + return 0; + } + break; + } + debug_sub_810D340(); + return 0; +} - SetMainCallback2(ewram0_4.varEC); - switch (ewram0_4.varFB) +u8 debug_sub_810CFA4(void) +{ + u8 text[] = _("せいきに とうろくされたメールデータは\n" + "へんこう できません"); + s8 input = Menu_ProcessInput(); + + switch (input) { + case -1: + Menu_EraseScreen(); + debug_sub_810D340(); + return 0; + case -2: + return 0; + default: + gSpecialVar_0x8005 = input; + if (IS_ITEM_MAIL(gSaveBlock1.mail[input].itemId)) + { + Menu_EraseScreen(); + Menu_DisplayDialogueFrame(); + Menu_PrintText(text, 4, 15); + debug_sub_810D340(); + return 0; + } + else + { + CreateTask(debug_sub_810CCEC, 0); + return 1; + } + } +} + +u8 debug_sub_810D030(void) +{ + const u8 text1[] = _("メール{STR_VAR_1} とうろく かいじょ"); + const u8 text2[] = _("デバッグメニューから とうろくした\n" + "メール いがいは けせません"); + s8 input = Menu_ProcessInput(); + + switch (input) + { + case -1: + Menu_EraseScreen(); + debug_sub_810D340(); + return 0; + case -2: + return 0; + default: + gSpecialVar_0x8005 = input; + if (gSaveBlock1.mail[gSpecialVar_0x8005].itemId != 0xFFFF + && gSaveBlock1.mail[gSpecialVar_0x8005].itemId != 0) + { + Menu_EraseScreen(); + Menu_DisplayDialogueFrame(); + Menu_PrintText(text2, 4, 15); + debug_sub_810D340(); + return 0; + } + else + { + s8 i; + + gSaveBlock1.mail[gSpecialVar_0x8005].itemId = 0; + gSaveBlock1.mail[gSpecialVar_0x8005].species = 0; + gSaveBlock1.mail[gSpecialVar_0x8005].playerName[0] = EOS; + *(u32 *)gSaveBlock1.mail[gSpecialVar_0x8005].trainerId = 0; + for (i = 0; i < 9; i++) + gSaveBlock1.mail[gSpecialVar_0x8005].words[i] = 0xFFFF; + ConvertIntToDecimalStringN(gStringVar1, gSpecialVar_0x8005, 1, 1); + StringExpandPlaceholders(gStringVar4, text1); + Menu_EraseScreen(); + Menu_DisplayDialogueFrame(); + Menu_PrintText(gStringVar4, 4, 15); + debug_sub_810D340(); + return 0; + } + } +} + +void debug_sub_810D174(u8 a) +{ + u8 string[] = _("メール{STR_VAR_1} {STR_VAR_2} {STR_VAR_3}"); + u8 buffer[9][20]; + struct MenuAction menuActions[9]; + u8 i; + + for (i = 0; i < 9; i++) + { + ConvertIntToDecimalStringN(gStringVar1, i, 1, 1); + if (gSaveBlock1.mail[i].itemId == 0xFFFF) + { + ConvertIntToDecimalStringN(gStringVar2, 1, 1, 1); + } + else if (IS_ITEM_MAIL(gSaveBlock1.mail[i].itemId)) + { + ConvertIntToDecimalStringN(gStringVar2, 2, 1, 1); + } + else + { + ConvertIntToDecimalStringN(gStringVar2, 0, 1, 1); + gSaveBlock1.mail[i].itemId = 0; + } + StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1.mail[i].species]); + StringExpandPlaceholders(buffer[i], string); + menuActions[i].text = buffer[i]; + menuActions[i].func = NULL; + } + Menu_DrawStdWindowFrame(0, 0, 16, 19); + Menu_PrintItems(2, 1, 9, menuActions); + InitMenu(0, 1, 1, 9, 0, 15); + switch (a) + { + case 0: + gMenuCallback = debug_sub_810CE48; + break; + case 1: + gMenuCallback = debug_sub_810CED0; + break; case 2: + gMenuCallback = debug_sub_810CFA4; + break; + case 3: + gMenuCallback = debug_sub_810D030; + break; + } +} + +u8 debug_sub_810D2F4(void) +{ + s8 input = Menu_ProcessInput(); + + switch (input) + { + case -1: + SetMainCallback2(debug_sub_810CDF0); + return 1; + case -2: + return 0; + } + + switch (input) + { + case 0: + debug_sub_810D174(input); + return 0; case 1: - local1 = sub_809D4A8(ewram0_4.varF4->species); - sub_809D608(local1); + debug_sub_810D174(input); + return 0; + case 2: + debug_sub_810D174(input); + return 0; + case 3: + debug_sub_810D174(input); + return 0; + } + + return 1; +} + +const struct MenuAction _84116BC[] = +{ + {Str_84115F4, NULL}, + {Str_84115FB, NULL}, + {Str_8411603, NULL}, + {Str_8411608, NULL}, +}; + +void debug_sub_810D340(void) +{ + Menu_DrawStdWindowFrame(0, 0, 9, 9); + Menu_PrintItems(2, 1, 4, _84116BC); + InitMenu(0, 1, 1, 4, 0, 8); + gMenuCallback = debug_sub_810D2F4; +} - sub_809D510(&gSprites[ewram0_4.varFC]); +void debug_sub_810D388(void) +{ + switch (gMain.state) + { + case 0: + if (gUnknown_Debug_0300079C != 0) + { + gMain.state = 2; + gUnknown_Debug_0300079C = 0; + return; + } + else + { + ScanlineEffect_Stop(); + ResetPaletteFade(); + SetVBlankCallback(sub_80F8F18); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + } + break; + case 1: + if (UpdatePaletteFade()) + return; + break; + case 2: + SetVBlankCallback(NULL); + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2VOFS = 0; + REG_BG2HOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + break; + case 3: + ResetSpriteData(); + ResetTasks(); + FreeAllSpritePalettes(); + break; + case 4: + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); + Menu_EraseScreen(); + break; + case 5: + LoadPalette(gMailGraphicsTable[0].palette, 0, 32); + LZ77UnCompVram(gMailGraphicsTable[0].tiles, (void *)VRAM); + DmaFill16(3, 1, (void *)(VRAM + 0x4000), 0x500); + break; + case 6: + REG_BG0CNT = 0x9F08; + REG_BG1CNT = 0x0801; + REG_BLDCNT = 0; + REG_DISPCNT = 0x0340; + debug_sub_810D340(); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + SetVBlankCallback(sub_80F8F18); + break; + case 7: + if (!UpdatePaletteFade()) + return; + break; + case 8: + CreateTask(debug_sub_810CE1C, 0); + SetMainCallback2(debug_sub_810CDE0); break; + default: + return; } - - memset(&ewram0_4, 0, 0x110); - ResetPaletteFade(); + gMain.state++; } + +#endif diff --git a/src/pokemon/mon_markings.c b/src/pokemon/mon_markings.c index b4144ea34..dcdc54434 100644 --- a/src/pokemon/mon_markings.c +++ b/src/pokemon/mon_markings.c @@ -5,6 +5,7 @@ #include "constants/songs.h" #include "sound.h" #include "sprite.h" +#include "mon_markings.h" #ifdef GERMAN #define MENU_TEXT_SPRITE_X_OFFSET 24 @@ -12,25 +13,6 @@ #define MENU_TEXT_SPRITE_X_OFFSET 32 #endif -struct PokemonMarkMenu -{ - /*0x0000*/ u16 baseTileTag; - /*0x0002*/ u16 basePaletteTag; - /*0x0004*/ u8 markings; // bit flags - /*0x0005*/ s8 cursorPos; - /*0x0006*/ bool8 markingsArray[4]; - /*0x000A*/ u8 cursorBaseY; - /*0x000B*/ bool8 spriteSheetLoadRequired; - /*0x000C*/ struct Sprite *menuWindowSprites[2]; // upper and lower halves of menu window - /*0x0014*/ struct Sprite *menuMarkingSprites[4]; - /*0x0024*/ struct Sprite *menuTextSprite; - /*0x0028*/ const u8 *frameTiles; - /*0x002C*/ const u16 *framePalette; - /*0x0030*/ u8 menuWindowSpriteTiles[0x1000]; - /*0x1030*/ u8 filler1030[0x80]; - /*0x10B0*/ u8 tileLoadState; -}; - extern u8 gPokenavConditionMenuMisc_Gfx[]; extern u16 gUnknown_08E966B8[]; @@ -312,7 +294,7 @@ void sub_80F727C(struct PokemonMarkMenu *ptr) void sub_80F728C(void) { - const struct FrameGraphics *frame = GetTextWindowFrameGraphics(gSaveBlock2.optionsWindowFrameType); + const struct FrameGraphics *frame = TextWindow_GetFrameGraphics(gSaveBlock2.optionsWindowFrameType); sMenu->frameTiles = frame->tiles; sMenu->framePalette = frame->palette; sMenu->tileLoadState = 0; @@ -566,8 +548,8 @@ void sub_80F761C(s16 x, s16 y, u16 baseTileTag, u16 basePaletteTag) } sMenu->cursorBaseY = y + 8; - sub_814A5C0(0, basePaletteTag + 1, 15, 0, 0x30); - sub_814A880(x + 8, sMenu->cursorBaseY); + MenuCursor_Create814A5C0(0, basePaletteTag + 1, 15, 0, 0x30); + MenuCursor_SetPos814A880(x + 8, sMenu->cursorBaseY); sub_814AABC(sub_80F7908); } @@ -631,6 +613,5 @@ struct Sprite *sub_80F7960(u16 tileTag, u16 paletteTag, const u16 *palette, u16 void sub_80F7A10(u8 markings, void *dest) { - const void *src = gUnknown_083E4A14 + markings * 0x80; - DmaCopy16(3, src, dest, 0x80); + DmaCopy16Defvars(3, gUnknown_083E4A14 + markings * 0x80, dest, 0x80); } diff --git a/src/pokemon/pokeblock_feed.c b/src/pokemon/pokeblock_feed.c index 8e3adda12..2f2ce2f8f 100644 --- a/src/pokemon/pokeblock_feed.c +++ b/src/pokemon/pokeblock_feed.c @@ -511,7 +511,7 @@ static bool8 TransitionToPokeblockFeedScene(void) switch (gMain.state) { case 0: - sub_80F9438(); + ClearVideoCallbacks(); sub_80F9368(); sub_8147B04(); gMain.state++; @@ -530,11 +530,11 @@ static bool8 TransitionToPokeblockFeedScene(void) gMain.state++; break; case 4: - SetUpWindowConfig(&gWindowConfig_81E6E50); + Text_LoadWindowTemplate(&gWindowTemplate_81E6E50); gMain.state++; break; case 5: - MultistepInitMenuWindowBegin(&gWindowConfig_81E6E50); + MultistepInitMenuWindowBegin(&gWindowTemplate_81E6E50); gMain.state++; break; case 6: @@ -559,7 +559,7 @@ static bool8 TransitionToPokeblockFeedScene(void) gMain.state++; break; case 10: - MenuDrawTextWindow(0, 14, 29, 19); + Menu_DrawStdWindowFrame(0, 14, 29, 19); gMain.state++; break; case 11: @@ -715,7 +715,7 @@ static void LaunchPokeblockFeedTask(u8 a0) static void Task_WaitForAtePokeblockText(u8 taskID) { - if (MenuUpdateWindowText() == 1) + if (Menu_UpdateWindowText() == 1) gTasks[taskID].func = Task_PaletteFadeToReturn; } diff --git a/src/pokemon/pokedex.c b/src/pokemon/pokedex.c index 1c1c71454..090873f9d 100644 --- a/src/pokemon/pokedex.c +++ b/src/pokemon/pokedex.c @@ -23,7 +23,7 @@ #include "strings.h" #include "task.h" #include "trig.h" -#include "unknown_task.h" +#include "scanline_effect.h" #include "ewram.h" #define NATIONAL_DEX_COUNT 386 @@ -1273,7 +1273,7 @@ static u8 sub_8091260(u16 num, u8, u8, u8); static void sub_8091304(const u8 *name, u8, u8); static void sub_8091458(u16 height, u8 i, u8 i1); static void sub_8091564(u16 weight, u8 i, u8 i1); -static void sub_8091738(u16, u16, u16); +void sub_8091738(u16, u16, u16); static void sub_80917CC(u16 i, u16 i1); static u16 sub_8091818(u8, u16, u16, u16); u16 sub_80918EC(u16 a, s16 b, s16 c, u16 d); @@ -1394,39 +1394,22 @@ void CB2_InitPokedex(void) { case 0: default: - { - u8 *addr; - u32 size; - - SetVBlankCallback(NULL); - sub_8091060(0); - addr = (u8 *)VRAM; - size = VRAM_SIZE; - while (1) - { - DmaFill16(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill16(3, 0, addr, size); - break; - } - } - DmaClear32(3, OAM, OAM_SIZE); - DmaClear16(3, PLTT, PLTT_SIZE); - gMain.state = 1; - } + SetVBlankCallback(NULL); + sub_8091060(0); + DmaFill16Large(3, 0, (void *)(VRAM + 0x0), VRAM_SIZE, 0x1000); + DmaClear32(3, OAM, OAM_SIZE); + DmaClear16(3, PLTT, PLTT_SIZE); + gMain.state = 1; break; case 1: - remove_some_task(); + ScanlineEffect_Stop(); ResetTasks(); ResetSpriteData(); ResetPaletteFade(); FreeAllSpritePalettes(); gReservedSpritePaletteCount = 8; - SetUpWindowConfig(&gWindowConfig_81E7048); - InitMenuWindow(&gWindowConfig_81E7048); + Text_LoadWindowTemplate(&gWindowTemplate_81E7048); + InitMenuWindow(&gWindowTemplate_81E7048); gMain.state++; break; case 2: @@ -1494,7 +1477,7 @@ u8 unref_sub_808C540(void (*func)(u8)) SetVBlankCallback(NULL); sub_8091060(0x200); - remove_some_task(); + ScanlineEffect_Stop(); ResetTasks(); ResetPaletteFade(); savedIme = REG_IME; @@ -1937,8 +1920,8 @@ static bool8 sub_808D344(u8 a) gMain.state++; break; case 2: - SetUpWindowConfig(&gWindowConfig_81E7048); - InitMenuWindow(&gWindowConfig_81E7048); + Text_LoadWindowTemplate(&gWindowTemplate_81E7048); + InitMenuWindow(&gWindowTemplate_81E7048); LZ77UnCompVram(gUnknown_0839FA7C, (void *)(VRAM + 0xFF80)); gMain.state++; break; @@ -2241,7 +2224,7 @@ static void sub_808DEB0(u16 a, u8 b, u8 c, u16 d) text[3] = EOS; *(u16 *)(VRAM + d * 0x800 + c * 0x40 + b * 2) = unk[0]; *(u16 *)(VRAM + d * 0x800 + (c + 1) * 0x40 + b * 2) = unk[1]; - MenuPrint(text, b - 15, c); + Menu_PrintText(text, b - 15, c); } static void sub_808DF88(u16 a, u8 b, u8 c, u16 d) @@ -2283,7 +2266,7 @@ static u8 sub_808DFE4(u16 num, u8 b, u8 c) text[i] = CHAR_HYPHEN; break; } - MenuPrint_PixelCoords(text, (b - 0x11) * 8 + 0xFC, c * 8, 0); + Menu_PrintTextPixelCoords(text, (b - 0x11) * 8 + 0xFC, c * 8, 0); return i; } @@ -2951,8 +2934,8 @@ static void Task_InitPageScreenMultistep(u8 taskId) gMain.state++; break; case 3: - SetUpWindowConfig(&gWindowConfig_81E7064); - InitMenuWindow(&gWindowConfig_81E7064); + Text_LoadWindowTemplate(&gWindowTemplate_81E7064); + InitMenuWindow(&gWindowTemplate_81E7064); gMain.state++; break; case 4: @@ -2961,20 +2944,20 @@ static void Task_InitPageScreenMultistep(u8 taskId) else sub_8091154(gUnknown_0202FFBC->dexNum, 0xD, 3); sub_80911C8(gUnknown_0202FFBC->dexNum, 0x10, 3); - MenuPrint(gDexText_UnknownPoke, CATEGORY_LEFT, 5); - MenuPrint(gDexText_UnknownHeight, 16, 7); - MenuPrint(gDexText_UnknownWeight, 16, 9); + Menu_PrintText(gDexText_UnknownPoke, CATEGORY_LEFT, 5); + Menu_PrintText(gDexText_UnknownHeight, 16, 7); + Menu_PrintText(gDexText_UnknownWeight, 16, 9); if (gUnknown_0202FFBC->owned) { sub_8091304(gPokedexEntries[gUnknown_0202FFBC->dexNum].categoryName, CATEGORY_LEFT, 5); sub_8091458(gPokedexEntries[gUnknown_0202FFBC->dexNum].height, 16, 7); sub_8091564(gPokedexEntries[gUnknown_0202FFBC->dexNum].weight, 16, 9); - MenuPrint(gPokedexEntries[gUnknown_0202FFBC->dexNum].descriptionPage1, 2, 13); + Menu_PrintText(gPokedexEntries[gUnknown_0202FFBC->dexNum].descriptionPage1, 2, 13); sub_80917CC(14, 0x3FC); } else { - MenuPrint(gUnknown_083A05F8, 2, 13); + Menu_PrintText(gUnknown_083A05F8, 2, 13); LoadPalette(gPlttBufferUnfaded + 1, 0x31, 0x1E); } gMain.state++; @@ -3205,13 +3188,13 @@ static void Task_InitCryScreenMultistep(u8 taskId) gMain.state++; break; case 3: - SetUpWindowConfig(&gWindowConfig_81E702C); - InitMenuWindow(&gWindowConfig_81E702C); + Text_LoadWindowTemplate(&gWindowTemplate_81E702C); + InitMenuWindow(&gWindowTemplate_81E702C); ResetPaletteFade(); gMain.state++; break; case 4: - MenuPrint(gDexText_CryOf, 10, 4); + Menu_PrintText(gDexText_CryOf, 10, 4); sub_8091260(gUnknown_0202FFBC->dexNum, 10, 6, 2); gMain.state++; break; @@ -3394,8 +3377,8 @@ static void Task_InitSizeScreenMultistep(u8 taskId) { u8 string[40]; //I hope this is the correct size - SetUpWindowConfig(&gWindowConfig_81E702C); - InitMenuWindow(&gWindowConfig_81E702C); + Text_LoadWindowTemplate(&gWindowTemplate_81E702C); + InitMenuWindow(&gWindowTemplate_81E702C); string[0] = EOS; StringAppend(string, gDexText_SizeComparedTo); StringAppend(string, gSaveBlock2.playerName); @@ -3841,8 +3824,8 @@ static void sub_8090750(u8 taskId) gTasks[taskId].data[0]++; break; case 2: - SetUpWindowConfig(&gWindowConfig_81E7064); - InitMenuWindow(&gWindowConfig_81E7064); + Text_LoadWindowTemplate(&gWindowTemplate_81E7064); + InitMenuWindow(&gWindowTemplate_81E7064); DmaClear16(3, (void *)(VRAM + 0xC000), 0x200); gTasks[taskId].data[0]++; break; @@ -3853,13 +3836,13 @@ static void sub_8090750(u8 taskId) else sub_8091154(dexNum, 13, 3); sub_80911C8(dexNum, 16, 3); - MenuPrint(gDexText_UnknownPoke, CATEGORY_LEFT, 5); - MenuPrint(gDexText_UnknownHeight, 16, 7); - MenuPrint(gDexText_UnknownWeight, 16, 9); + Menu_PrintText(gDexText_UnknownPoke, CATEGORY_LEFT, 5); + Menu_PrintText(gDexText_UnknownHeight, 16, 7); + Menu_PrintText(gDexText_UnknownWeight, 16, 9); sub_8091304(gPokedexEntries[dexNum].categoryName, CATEGORY_LEFT, 5); sub_8091458(gPokedexEntries[dexNum].height, 16, 7); sub_8091564(gPokedexEntries[dexNum].weight, 16, 9); - MenuPrint(gPokedexEntries[dexNum].descriptionPage1, 2, 13); + Menu_PrintText(gPokedexEntries[dexNum].descriptionPage1, 2, 13); sub_80917CC(14, 0x3FC); gTasks[taskId].data[0]++; break; @@ -3906,8 +3889,8 @@ static void sub_8090A3C(u8 taskId) { u16 r4 = gTasks[taskId].data[1]; - MenuZeroFillWindowRect(2, 13, 27, 19); - MenuPrint(gPokedexEntries[r4].descriptionPage2, 2, 13); + Menu_EraseWindowRect(2, 13, 27, 19); + Menu_PrintText(gPokedexEntries[r4].descriptionPage2, 2, 13); (*(u16 *)(VRAM + 0x7ACA))++; (*(u16 *)(VRAM + 0x7B0A))++; gTasks[taskId].data[4] = 1; @@ -3970,8 +3953,8 @@ static void sub_8090C68(void) { if (gPokedexView->descriptionPageNum == 0) { - MenuZeroFillWindowRect(2, 13, 27, 19); - MenuPrint(gPokedexEntries[gUnknown_0202FFBC->dexNum].descriptionPage2, 2, 13); + Menu_EraseWindowRect(2, 13, 27, 19); + Menu_PrintText(gPokedexEntries[gUnknown_0202FFBC->dexNum].descriptionPage2, 2, 13); gPokedexView->descriptionPageNum = 1; (*(u16 *)(VRAM + 0x7ACA))++; (*(u16 *)(VRAM + 0x7B0A))++; @@ -3979,8 +3962,8 @@ static void sub_8090C68(void) } else { - MenuZeroFillWindowRect(2, 13, 27, 19); - MenuPrint(gPokedexEntries[gUnknown_0202FFBC->dexNum].descriptionPage1, 2, 13); + Menu_EraseWindowRect(2, 13, 27, 19); + Menu_PrintText(gPokedexEntries[gUnknown_0202FFBC->dexNum].descriptionPage1, 2, 13); gPokedexView->descriptionPageNum = 0; (*(u16 *)(VRAM + 0x7ACA))--; (*(u16 *)(VRAM + 0x7B0A))--; @@ -4121,26 +4104,35 @@ bool8 CompletedHoennPokedex(void) return TRUE; } -u16 sub_8090FF4(void) +bool16 CompletedNationalPokedex(void) { u16 i; + // BUG: This function indexes pokemon checks by 0, but adds + // 1 before passing to GetSetPokedexFlag. Normally, this is + // fine, because GetSetPokedexFlag subtracts by 1 to get the + // array index value, but since the array is 0 indexed + // starting with Bulbasaur, values passed actually means that + // dex entries 152 (Chikorita) and 252 (Treecko) are skipped. + // Because an earlier Hoenn Dex check prevented Treecko from + // being skippable, it means that Chikorita is not required + // to obtain the National Diploma. This was fixed in Emerald. for (i = 0; i < 150; i++) { if (GetSetPokedexFlag(i + 1, 1) == 0) - return 0; + return FALSE; } for (i = 152; i < 250; i++) { if (GetSetPokedexFlag(i + 1, 1) == 0) - return 0; + return FALSE; } for (i = 252; i < 384; i++) { if (GetSetPokedexFlag(i + 1, 1) == 0) - return 0; + return FALSE; } - return 1; + return TRUE; } static void sub_8091060(u16 a) @@ -4190,7 +4182,7 @@ static void sub_8091154(u16 order, u8 b, u8 c) str[1] = CHAR_0 + (order % 100) / 10; str[2] = CHAR_0 + (order % 100) % 10; str[3] = EOS; - MenuPrint(str, b, c); + Menu_PrintText(str, b, c); } static u8 sub_80911C8(u16 num, u8 b, u8 c) @@ -4212,7 +4204,7 @@ static u8 sub_80911C8(u16 num, u8 b, u8 c) str[i] = 0xAE; break; } - MenuPrint(str, b, c); + Menu_PrintText(str, b, c); return i; } @@ -4237,7 +4229,7 @@ static u8 sub_8091260(u16 num, u8 b, u8 c, u8 d) break; } end[i] = EOS; - MenuPrint(str, b, c); + Menu_PrintText(str, b, c); return i; } @@ -4297,7 +4289,7 @@ void unref_sub_80913A4(u16 a, u8 left, u8 top) str[3] = CHAR_PERIOD; str[4] = CHAR_0 + ((a % 1000) % 100) % 10; str[5] = EOS; - MenuPrint(str, left, top); + Menu_PrintText(str, left, top); } #elif GERMAN void unref_sub_80913A4(u16 arg0, u8 left, u8 top) { @@ -4341,7 +4333,7 @@ void unref_sub_80913A4(u16 arg0, u8 left, u8 top) { buffer[r6++] = EOS; buffer[2] = offset; - MenuPrint(buffer, left, top); + Menu_PrintText(buffer, left, top); } #endif @@ -4378,7 +4370,7 @@ static void sub_8091458(u16 height, u8 left, u8 top) buffer[i++] = (inches % 10) + CHAR_0; buffer[i++] = CHAR_DOUBLE_PRIME; buffer[i++] = EOS; - MenuPrint(buffer, left, top); + Menu_PrintText(buffer, left, top); } #else static void sub_8091458(u16 height, u8 left, u8 top) @@ -4448,7 +4440,7 @@ static void sub_8091564(u16 weight, u8 left, u8 top) buffer[i++] = CHAR_s; buffer[i++] = CHAR_PERIOD; buffer[i++] = EOS; - MenuPrint(buffer, left, top); + Menu_PrintText(buffer, left, top); } #else static void sub_8091564(u16 arg0, u8 left, u8 top) @@ -4457,7 +4449,7 @@ static void sub_8091564(u16 arg0, u8 left, u8 top) } #endif -static void sub_8091738(u16 num, u16 b, u16 c) +void sub_8091738(u16 num, u16 b, u16 c) { u8 arr[0x80]; u16 i; @@ -4770,8 +4762,8 @@ static void sub_8091E54(u8 taskId) } break; case 1: - SetUpWindowConfig(&gWindowConfig_81E7064); - InitMenuWindow(&gWindowConfig_81E7064); + Text_LoadWindowTemplate(&gWindowTemplate_81E7064); + InitMenuWindow(&gWindowTemplate_81E7064); LoadCompressedObjectPic(&gUnknown_083A05CC[0]); LoadSpritePalettes(gUnknown_083A05DC); sub_809308C(taskId); @@ -4997,7 +4989,7 @@ static void sub_8092508(u8 taskId) static void sub_80925B4(u16 a, int unused) { - sub_814AD7C(0x90, (a * 2 + 1) * 8); + MenuCursor_SetPos814AD7C(0x90, (a * 2 + 1) * 8); } static void sub_80925CC(u8 taskId) @@ -5036,7 +5028,7 @@ static void sub_8092644(u8 taskId) { sub_814ADC8(); PlaySE(SE_PIN); - MenuZeroFillWindowRect(18, 1, 28, 12); + Menu_EraseWindowRect(18, 1, 28, 12); sub_8092C8C(1); gTasks[taskId].func = sub_809217C; return; @@ -5045,7 +5037,7 @@ static void sub_8092644(u8 taskId) { sub_814ADC8(); PlaySE(SE_BOWA); - MenuZeroFillWindowRect(18, 1, 28, 12); + Menu_EraseWindowRect(18, 1, 28, 12); sub_8092C8C(1); *p1 = gTasks[taskId].data[14]; *p2 = gTasks[taskId].data[15]; @@ -5305,29 +5297,29 @@ static void sub_8092B68(u8 taskId) var = gTasks[taskId].data[6] + gTasks[taskId].data[7]; StringCopy(gStringVar1, gUnknown_083B5910[var].text2); - MenuPrint_PixelCoords(gUnknown_083B5AB2, 45, 16, 1); + Menu_PrintTextPixelCoords(gUnknown_083B5AB2, 45, 16, 1); var = gTasks[taskId].data[8] + gTasks[taskId].data[9]; StringCopy(gStringVar1, gUnknown_083B5968[var].text2); - MenuPrint_PixelCoords(gUnknown_083B5AB2, 45, 32, 1); + Menu_PrintTextPixelCoords(gUnknown_083B5AB2, 45, 32, 1); var = gTasks[taskId].data[10] + gTasks[taskId].data[11]; StringCopy(gStringVar1, gUnknown_083B59C8[var].text2); - MenuPrint_PixelCoords(gUnknown_083B5AAC, 45, 48, 1); + Menu_PrintTextPixelCoords(gUnknown_083B5AAC, 45, 48, 1); var = gTasks[taskId].data[12] + gTasks[taskId].data[13]; StringCopy(gStringVar1, gUnknown_083B59C8[var].text2); - MenuPrint_PixelCoords(gUnknown_083B5AAC, 93, 48, 1); + Menu_PrintTextPixelCoords(gUnknown_083B5AAC, 93, 48, 1); var = gTasks[taskId].data[4] + gTasks[taskId].data[5]; StringCopy(gStringVar1, gUnknown_083B58D8[var].text2); - MenuPrint_PixelCoords(gUnknown_083B5AB2, 45, 64, 1); + Menu_PrintTextPixelCoords(gUnknown_083B5AB2, 45, 64, 1); if (IsNationalPokedexEnabled()) { var = gTasks[taskId].data[2] + gTasks[taskId].data[3]; StringCopy(gStringVar1, gUnknown_083B58C0[var].text2); - MenuPrint_PixelCoords(gUnknown_083B5AB2, 45, 80, 1); + Menu_PrintTextPixelCoords(gUnknown_083B5AB2, 45, 80, 1); } } @@ -5374,13 +5366,13 @@ static void sub_8092D78(u8 taskId) u16 i; u16 j; - MenuZeroFillWindowRect(18, 1, 28, 12); + Menu_EraseWindowRect(18, 1, 28, 12); for (i = 0, j = *r7; i < 6 && r6[j].text2 != NULL; i++, j++) { #ifndef NONMATCHING j += 0; // Useless statement needed to match #endif - MenuPrint(r6[j].text2, 18, i * 2 + 1); + Menu_PrintText(r6[j].text2, 18, i * 2 + 1); } sub_8091E20(r6[*r8 + *r7].text1); } diff --git a/src/pokemon/pokemon_1.c b/src/pokemon/pokemon_1.c index f4d227f7f..80d245b52 100644 --- a/src/pokemon/pokemon_1.c +++ b/src/pokemon/pokemon_1.c @@ -1,13 +1,16 @@ #include "global.h" #include "data2.h" +#include "constants/abilities.h" #include "constants/items.h" +#include "constants/moves.h" +#include "constants/species.h" #include "main.h" #include "pokemon.h" #include "random.h" #include "overworld.h" -#include "constants/species.h" #include "sprite.h" #include "string_util.h" +#include "trainer.h" #include "text.h" #include "ewram.h" @@ -26,6 +29,59 @@ struct Pokemon gPlayerParty[6]; u8 gEnemyPartyCount; struct Pokemon gEnemyParty[6]; +const u16 gSpeciesToHoennPokedexNum[] = {203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 156, 157, 112, 113, 227, 228, 229, 230, 231, 232, 233, 234, 153, 154, 138, 139, 63, 64, 88, 89, 90, 235, 236, 237, 238, 239, 240, 241, 242, 158, 159, 243, 244, 245, 246, 247, 248, 249, 39, 40, 41, 73, 74, 75, 250, 251, 252, 66, 67, 57, 58, 59, 253, 254, 255, 256, 82, 83, 257, 92, 93, 258, 259, 106, 107, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 84, 85, 270, 271, 272, 273, 274, 275, 276, 108, 109, 169, 170, 277, 278, 279, 184, 185, 50, 51, 143, 144, 280, 281, 282, 283, 284, 167, 285, 52, 53, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 65, 181, 182, 155, 324, 137, 325, 326, 162, 163, 327, 328, 329, 91, 55, 56, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 161, 164, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 168, 357, 358, 359, 103, 104, 360, 361, 180, 362, 363, 364, 365, 115, 366, 367, 186, 165, 166, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 42, 43, 44, 25, 26, 34, 35, 114, 27, 28, 32, 33, 99, 100, 61, 62, 145, 131, 132, 60, 105, 68, 127, 128, 183, 129, 130, 140, 141, 97, 98, 116, 117, 118, 48, 49, 78, 79, 101, 102, 173, 174, 175, 119, 120, 171, 172, 125, 126, 54, 110, 111, 80, 81, 69, 76, 77, 121, 122, 160, 148, 149, 94, 36, 37, 38, 95, 96, 150, 45, 46, 47, 176, 177, 178, 152, 146, 147, 124, 123, 179, 70, 71, 72, 142, 86, 87, 133, 134, 135, 136, 29, 30, 31, 187, 188, 189, 190, 191, 192, 193, 194, 195, 198, 199, 200, 196, 197, 201, 202, 151}; +const u16 gSpeciesToNationalPokedexNum[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 290, 291, 292, 276, 277, 285, 286, 327, 278, 279, 283, 284, 320, 321, 300, 301, 352, 343, 344, 299, 324, 302, 339, 340, 370, 341, 342, 349, 350, 318, 319, 328, 329, 330, 296, 297, 309, 310, 322, 323, 363, 364, 365, 331, 332, 361, 362, 337, 338, 298, 325, 326, 311, 312, 303, 307, 308, 333, 334, 360, 355, 356, 315, 287, 288, 289, 316, 317, 357, 293, 294, 295, 366, 367, 368, 359, 353, 354, 336, 335, 369, 304, 305, 306, 351, 313, 314, 345, 346, 347, 348, 280, 281, 282, 371, 372, 373, 374, 375, 376, 377, 378, 379, 382, 383, 384, 380, 381, 385, 386, 358}; +const u16 gHoennToNationalOrder[] = {252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 63, 64, 65, 290, 291, 292, 293, 294, 295, 296, 297, 118, 119, 129, 130, 298, 183, 184, 74, 75, 76, 299, 300, 301, 41, 42, 169, 72, 73, 302, 303, 304, 305, 306, 66, 67, 68, 307, 308, 309, 310, 311, 312, 81, 82, 100, 101, 313, 314, 43, 44, 45, 182, 84, 85, 315, 316, 317, 318, 319, 320, 321, 322, 323, 218, 219, 324, 88, 89, 109, 110, 325, 326, 27, 28, 327, 227, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 174, 39, 40, 349, 350, 351, 120, 121, 352, 353, 354, 355, 356, 357, 358, 359, 37, 38, 172, 25, 26, 54, 55, 360, 202, 177, 178, 203, 231, 232, 127, 214, 111, 112, 361, 362, 363, 364, 365, 366, 367, 368, 369, 222, 170, 171, 370, 116, 117, 230, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 29, 30, 31, 32, 33, 34, 35, 36, 46, 47, 48, 49, 50, 51, 52, 53, 56, 57, 58, 59, 60, 61, 62, 69, 70, 71, 77, 78, 79, 80, 83, 86, 87, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 102, 103, 104, 105, 106, 107, 108, 113, 114, 115, 122, 123, 124, 125, 126, 128, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 173, 175, 176, 179, 180, 181, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, 220, 221, 223, 224, 225, 226, 228, 229, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411}; + +const struct SpindaSpot gSpindaSpotGraphics[] = +{ + {16, 14, INCBIN_U16("graphics/spinda_spots/spot_0.bin")}, + {40, 15, INCBIN_U16("graphics/spinda_spots/spot_1.bin")}, + {22, 32, INCBIN_U16("graphics/spinda_spots/spot_2.bin")}, + {34, 33, INCBIN_U16("graphics/spinda_spots/spot_3.bin")} +}; + +#include "../data/pokemon/item_effects.h" + +const s8 gNatureStatTable[][5] = +{ + // Atk Def Spd Sp.Atk Sp.Def + { 0, 0, 0, 0, 0}, // Hardy + { +1, -1, 0, 0, 0}, // Lonely + { +1, 0, -1, 0, 0}, // Brave + { +1, 0, 0, -1, 0}, // Adamant + { +1, 0, 0, 0, -1}, // Naughty + { -1, +1, 0, 0, 0}, // Bold + { 0, 0, 0, 0, 0}, // Docile + { 0, +1, -1, 0, 0}, // Relaxed + { 0, +1, 0, -1, 0}, // Impish + { 0, +1, 0, 0, -1}, // Lax + { -1, 0, +1, 0, 0}, // Timid + { 0, -1, +1, 0, 0}, // Hasty + { 0, 0, 0, 0, 0}, // Serious + { 0, 0, +1, -1, 0}, // Jolly + { 0, 0, +1, 0, -1}, // Naive + { -1, 0, 0, +1, 0}, // Modest + { 0, -1, 0, +1, 0}, // Mild + { 0, 0, -1, +1, 0}, // Quiet + { 0, 0, 0, 0, 0}, // Bashful + { 0, 0, 0, +1, -1}, // Rash + { -1, 0, 0, 0, +1}, // Calm + { 0, -1, 0, 0, +1}, // Gentle + { 0, 0, -1, 0, +1}, // Sassy + { 0, 0, 0, -1, +1}, // Careful + { 0, 0, 0, 0, 0} // Quirky +}; + +#include "../data/pokemon/tmhm_learnsets.h" +#include "../data/pokemon/trainer_class_lookups.h" +#include "../data/pokemon/cry_ids.h" +#include "../data/pokemon/experience_tables.h" +#include "../data/pokemon/base_stats.h" +#include "../data/pokemon/level_up_learnsets.h" +#include "../data/pokemon/evolution.h" +#include "../data/pokemon/level_up_learnset_pointers.h" + void ZeroBoxMonData(struct BoxPokemon *boxMon) { u8 *raw = (u8 *)boxMon; @@ -308,7 +364,7 @@ void sub_803ADE8(struct Pokemon *mon, struct UnknownPokemonStruct *src) language = GAME_LANGUAGE; SetMonData(mon, MON_DATA_LANGUAGE, &language); - StripExtCtrlCodes(nickname); + Text_StripExtCtrlCodes(nickname); SetMonData(mon, MON_DATA_NICKNAME, nickname); SetMonData(mon, MON_DATA_FRIENDSHIP, &src->friendship); SetMonData(mon, MON_DATA_HP_EV, &src->hpEV); @@ -401,7 +457,7 @@ u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon) s32 n = (((2 * baseStat + iv + ev / 4) * level) / 100) + 5; \ u8 nature = GetNature(mon); \ n = nature_stat_mod(nature, n, statIndex); \ - SetMonData(mon, field, &n); \ + SetMonData(mon, field, &n); \ } void CalculateMonStats(struct Pokemon *mon) @@ -468,7 +524,54 @@ void CalculateMonStats(struct Pokemon *mon) SetMonData(mon, MON_DATA_HP, ¤tHP); } -void sub_803B4B4(const struct BoxPokemon *src, struct Pokemon *dest) +#if DEBUG +void debug_sub_803F55C(struct Pokemon *mon) +{ + s32 currentHP = GetMonData(mon, MON_DATA_HP, NULL); + s32 hpIV = GetMonData(mon, MON_DATA_HP_IV, NULL); + s32 hpEV = GetMonData(mon, MON_DATA_HP_EV, NULL); + s32 attackIV = GetMonData(mon, MON_DATA_ATK_IV, NULL); + s32 attackEV = GetMonData(mon, MON_DATA_ATK_EV, NULL); + s32 defenseIV = GetMonData(mon, MON_DATA_DEF_IV, NULL); + s32 defenseEV = GetMonData(mon, MON_DATA_DEF_EV, NULL); + s32 speedIV = GetMonData(mon, MON_DATA_SPEED_IV, NULL); + s32 speedEV = GetMonData(mon, MON_DATA_SPEED_EV, NULL); + s32 spAttackIV = GetMonData(mon, MON_DATA_SPATK_IV, NULL); + s32 spAttackEV = GetMonData(mon, MON_DATA_SPATK_EV, NULL); + s32 spDefenseIV = GetMonData(mon, MON_DATA_SPDEF_IV, NULL); + s32 spDefenseEV = GetMonData(mon, MON_DATA_SPDEF_EV, NULL); + u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); + s32 level = GetLevelFromMonExp(mon); + s32 newMaxHP; + + SetMonData(mon, MON_DATA_LEVEL, &level); + + if (species == SPECIES_SHEDINJA) + { + newMaxHP = 1; + } + else + { + s32 n = 2 * gBaseStats[species].baseHP + hpIV; + newMaxHP = (((n + hpEV / 4) * level) / 100) + level + 10; + } + + SetMonData(mon, MON_DATA_MAX_HP, &newMaxHP); + + CALC_STAT(baseAttack, attackIV, attackEV, 1, MON_DATA_ATK) + CALC_STAT(baseDefense, defenseIV, defenseEV, 2, MON_DATA_DEF) + CALC_STAT(baseSpeed, speedIV, speedEV, 3, MON_DATA_SPEED) + CALC_STAT(baseSpAttack, spAttackIV, spAttackEV, 4, MON_DATA_SPATK) + CALC_STAT(baseSpDefense, spDefenseIV, spDefenseEV, 5, MON_DATA_SPDEF) + + if (newMaxHP < currentHP) + currentHP = newMaxHP; + + SetMonData(mon, MON_DATA_HP, ¤tHP); +} +#endif + +void ExpandBoxMon(const struct BoxPokemon *src, struct Pokemon *dest) { u32 value = 0; dest->box = *src; diff --git a/src/pokemon/pokemon_2.c b/src/pokemon/pokemon_2.c index 37bc2e0ad..7fd1aa7b2 100644 --- a/src/pokemon/pokemon_2.c +++ b/src/pokemon/pokemon_2.c @@ -1,5 +1,8 @@ #include "global.h" +#include "constants/hold_effects.h" +#include "constants/moves.h" #include "battle.h" +#include "battle_util.h" #include "data2.h" #include "event_data.h" #include "main.h" @@ -11,6 +14,7 @@ #include "string_util.h" #include "strings2.h" #include "text.h" +#include "trainer.h" #include "util.h" #include "ewram.h" @@ -39,11 +43,12 @@ extern const struct SpriteTemplate gSpriteTemplate_8208288[]; //array of pointers to arrays of pointers to union AnimCmd (We probably need to typedef this.) extern u8 gTrainerClassToPicIndex[]; extern u8 gTrainerClassToNameIndex[]; -extern u8 gSecretBaseTrainerClasses[][5]; -extern u8 gUnknown_08208238[]; -extern u8 gUnknown_0820823C[]; -extern u8 gStatStageRatios[][2]; -extern u8 gHoldEffectToType[][2]; + +extern const u8 gUnknown_08208238[]; +extern const u8 gUnknown_0820823C[]; + +extern void sub_80105A0(struct Sprite *); +extern void oac_poke_opponent(struct Sprite *); u8 CountAliveMons(u8 a1) { @@ -84,7 +89,7 @@ u8 sub_803C434(u8 a1) status ^= 1; if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - return GetBankByPlayerAI(status); + return GetBankByIdentity(status); if (CountAliveMons(0) > 1) { u8 val; @@ -93,14 +98,14 @@ u8 sub_803C434(u8 a1) val = status ^ 2; else val = status; - return GetBankByPlayerAI(val); + return GetBankByIdentity(val); } else { if ((gAbsentBankFlags & gBitTable[status])) - return GetBankByPlayerAI(status ^ 2); + return GetBankByIdentity(status ^ 2); else - return GetBankByPlayerAI(status); + return GetBankByIdentity(status); } } @@ -144,6 +149,14 @@ u8 GetGenderFromSpeciesAndPersonality(u16 species, u32 personality) return MON_MALE; } +const struct SpriteTemplate gSpriteTemplate_8208288[] = +{ + {0xFFFF, 0, &gOamData_81F96F0, NULL, gSpriteImageTable_81E7A10, gSpriteAffineAnimTable_81E7B70, sub_80105A0}, + {0xFFFF, 0, &gOamData_81F96E8, NULL, gSpriteImageTable_81E7A30, gSpriteAffineAnimTable_81E7BEC, oac_poke_opponent}, + {0xFFFF, 0, &gOamData_81F96F0, NULL, gSpriteImageTable_81E7A50, gSpriteAffineAnimTable_81E7B70, sub_80105A0}, + {0xFFFF, 0, &gOamData_81F96E8, NULL, gSpriteImageTable_81E7A70, gSpriteAffineAnimTable_81E7BEC, oac_poke_opponent}, +}; + void GetMonSpriteTemplate_803C56C(u16 species, u8 a2) { gUnknown_02024E8C = gSpriteTemplate_8208288[a2]; @@ -557,7 +570,7 @@ u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data) u16 *moves = (u16 *)data; s32 i = 0; - while (moves[i] != 355) + while (moves[i] != NUM_MOVES) { u16 move = moves[i]; if (substruct1->moves[0] == move @@ -1093,6 +1106,13 @@ void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord) gTrainerBattleOpponent = 1024; } +const u8 gSecretBaseTrainerClasses[][5] = { + // male + {FACILITY_CLASS_YOUNGSTER, FACILITY_CLASS_BUG_CATCHER, FACILITY_CLASS_RICH_BOY, FACILITY_CLASS_CAMPER, FACILITY_CLASS_COOL_TRAINER_M}, + // female + {FACILITY_CLASS_LASS, FACILITY_CLASS_SCHOOL_KID_F, FACILITY_CLASS_LADY, FACILITY_CLASS_PICNICKER, FACILITY_CLASS_COOL_TRAINER_F} +}; + u8 GetSecretBaseTrainerPicIndex(void) { u8 trainerClass = gSecretBaseTrainerClasses[eSecretBaseRecord->gender][eSecretBaseRecord->trainerId[0] % 5]; diff --git a/src/pokemon/pokemon_3.c b/src/pokemon/pokemon_3.c index d659ed680..9346031a6 100644 --- a/src/pokemon/pokemon_3.c +++ b/src/pokemon/pokemon_3.c @@ -1,11 +1,12 @@ #include "global.h" +#include "constants/hold_effects.h" +#include "constants/items.h" +#include "constants/moves.h" #include "battle.h" #include "battle_message.h" #include "data2.h" #include "event_data.h" -#include "constants/hold_effects.h" #include "item.h" -#include "constants/items.h" #include "link.h" #include "m4a.h" #include "main.h" @@ -42,20 +43,16 @@ extern u8 gStringBank; extern u8 gBankInMenu; extern struct SpindaSpot gSpindaSpotGraphics[]; extern s8 gNatureStatTable[][5]; -extern s8 gUnknown_082082FE[][3]; extern u16 gTrainerBattleOpponent; extern u16 gBattleTypeFlags; extern u32 gTMHMLearnsets[][2]; extern u8 gBattleMonForms[]; extern const u8 BattleText_Wally[]; -extern const u16 gHMMoves[]; extern s8 gPokeblockFlavorCompatibilityTable[]; extern u8 gLastUsedAbility; extern const u8 BattleText_PreventedSwitch[]; extern u16 gBattlePartyID[]; -extern u8 gJapaneseNidoranNames[][11]; -extern u8 gUnknown_082082F8[]; extern u8 BattleText_Rose[]; extern u8 BattleText_UnknownString3[]; extern u8 BattleText_MistShroud[]; @@ -193,6 +190,8 @@ u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit) return offset; } +const u8 gUnknown_082082F8[] = {1, 1, 3, 2, 4, 6}; + void sub_803F324(int stat) { gBankTarget = gBankInMenu; @@ -290,56 +289,56 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem) for (i = 0; i < 5; i++) { - switch (gEvolutionTable[species].evolutions[i].method) + switch (gEvolutionTable[species][i].method) { case EVO_FRIENDSHIP: if (friendship >= 220) - targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; + targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_FRIENDSHIP_DAY: RtcCalcLocalTime(); if (gLocalTime.hours >= 12 && gLocalTime.hours < 24 && friendship >= 220) - targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; + targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_FRIENDSHIP_NIGHT: RtcCalcLocalTime(); if (gLocalTime.hours >= 0 && gLocalTime.hours < 12 && friendship >= 220) - targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; + targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_LEVEL: - if (gEvolutionTable[species].evolutions[i].param <= level) - targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; + if (gEvolutionTable[species][i].param <= level) + targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_LEVEL_ATK_GT_DEF: - if (gEvolutionTable[species].evolutions[i].param <= level) + if (gEvolutionTable[species][i].param <= level) if (GetMonData(mon, MON_DATA_ATK, 0) > GetMonData(mon, MON_DATA_DEF, 0)) - targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; + targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_LEVEL_ATK_EQ_DEF: - if (gEvolutionTable[species].evolutions[i].param <= level) + if (gEvolutionTable[species][i].param <= level) if (GetMonData(mon, MON_DATA_ATK, 0) == GetMonData(mon, MON_DATA_DEF, 0)) - targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; + targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_LEVEL_ATK_LT_DEF: - if (gEvolutionTable[species].evolutions[i].param <= level) + if (gEvolutionTable[species][i].param <= level) if (GetMonData(mon, MON_DATA_ATK, 0) < GetMonData(mon, MON_DATA_DEF, 0)) - targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; + targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_LEVEL_SILCOON: - if (gEvolutionTable[species].evolutions[i].param <= level && (upperPersonality % 10) <= 4) - targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; + if (gEvolutionTable[species][i].param <= level && (upperPersonality % 10) <= 4) + targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_LEVEL_CASCOON: - if (gEvolutionTable[species].evolutions[i].param <= level && (upperPersonality % 10) > 4) - targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; + if (gEvolutionTable[species][i].param <= level && (upperPersonality % 10) > 4) + targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_LEVEL_NINJASK: - if (gEvolutionTable[species].evolutions[i].param <= level) - targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; + if (gEvolutionTable[species][i].param <= level) + targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_BEAUTY: - if (gEvolutionTable[species].evolutions[i].param <= beauty) - targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; + if (gEvolutionTable[species][i].param <= beauty) + targetSpecies = gEvolutionTable[species][i].targetSpecies; break; } } @@ -347,17 +346,17 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem) case 1: for (i = 0; i < 5; i++) { - switch (gEvolutionTable[species].evolutions[i].method) + switch (gEvolutionTable[species][i].method) { case EVO_TRADE: - targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; + targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_TRADE_ITEM: - if (gEvolutionTable[species].evolutions[i].param == heldItem) + if (gEvolutionTable[species][i].param == heldItem) { heldItem = 0; SetMonData(mon, MON_DATA_HELD_ITEM, &heldItem); - targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; + targetSpecies = gEvolutionTable[species][i].targetSpecies; } break; } @@ -367,10 +366,10 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem) case 3: for (i = 0; i < 5; i++) { - if (gEvolutionTable[species].evolutions[i].method == EVO_ITEM - && gEvolutionTable[species].evolutions[i].param == evolutionItem) + if (gEvolutionTable[species][i].method == EVO_ITEM + && gEvolutionTable[species][i].param == evolutionItem) { - targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; + targetSpecies = gEvolutionTable[species][i].targetSpecies; break; } } @@ -644,6 +643,20 @@ u16 nature_stat_mod(u8 nature, u16 n, u8 statIndex) return n; } +const s8 gUnknown_082082FE[][3] = +{ + // Happiness deltas + { 5, 3, 2}, + { 5, 3, 2}, + { 1, 1, 0}, + { 3, 2, 1}, + { 1, 1, 0}, + { 1, 1, 1}, + {-1, -1, -1}, + {-5, -5, -10}, + {-5, -5, -10} +}; + void AdjustFriendship(struct Pokemon *mon, u8 event) { u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); @@ -653,13 +666,9 @@ void AdjustFriendship(struct Pokemon *mon, u8 event) if (heldItem == ITEM_ENIGMA_BERRY) { if (gMain.inBattle) - { holdEffect = gEnigmaBerries[0].holdEffect; - } else - { holdEffect = gSaveBlock1.enigmaBerry.holdEffect; - } } else { @@ -758,13 +767,9 @@ void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies) if (heldItem == ITEM_ENIGMA_BERRY) { if (gMain.inBattle) - { holdEffect = gEnigmaBerries[0].holdEffect; - } else - { holdEffect = gSaveBlock1.enigmaBerry.holdEffect; - } } else { @@ -1198,6 +1203,19 @@ const struct CompressedSpritePalette *GetMonSpritePalStructFromOtIdPersonality(u return &gMonPaletteTable[species]; } +const u16 gHMMoves[] = +{ + MOVE_CUT, + MOVE_FLY, + MOVE_SURF, + MOVE_STRENGTH, + MOVE_FLASH, + MOVE_ROCK_SMASH, + MOVE_WATERFALL, + MOVE_DIVE, + 0xffff +}; + bool32 IsHMMove2(u16 move) { int i = 0; @@ -1275,15 +1293,15 @@ void BoxMonRestorePP(struct BoxPokemon *boxMon) void sub_8040B8C(void) { - gLastUsedAbility = BATTLE_STRUCT->unk160C0;; + gLastUsedAbility = gBattleStruct->unk160C0;; gBattleTextBuff1[0] = 0xFD; gBattleTextBuff1[1] = 4; - gBattleTextBuff1[2] = BATTLE_STRUCT->unk16054; + gBattleTextBuff1[2] = gBattleStruct->unk16054; gBattleTextBuff1[4] = EOS; - if (!GetBankSide(BATTLE_STRUCT->unk16054)) - gBattleTextBuff1[3] = pokemon_order_func(gBattlePartyID[BATTLE_STRUCT->unk16054]); + if (!GetBankSide(gBattleStruct->unk16054)) + gBattleTextBuff1[3] = pokemon_order_func(gBattlePartyID[gBattleStruct->unk16054]); else - gBattleTextBuff1[3] = gBattlePartyID[BATTLE_STRUCT->unk16054]; + gBattleTextBuff1[3] = gBattlePartyID[gBattleStruct->unk16054]; gBattleTextBuff2[0] = 0xFD; gBattleTextBuff2[1] = 4; gBattleTextBuff2[2] = gBankInMenu; @@ -1338,12 +1356,14 @@ u8 *sub_8040D08(void) return gLinkPlayers[sub_803FC34(gLinkPlayers[id].lp_field_18 ^ 2)].name; } +const u8 gJapaneseNidoranNames[][11] = {_("ニドラン♂"), _("ニドラン♀")}; + bool32 ShouldHideGenderIconForLanguage(u16 species, u8 *name, u8 language) { bool32 retVal = FALSE; if (species == SPECIES_NIDORAN_M || species == SPECIES_NIDORAN_F) { - u8 *speciesName; + const u8 *speciesName; if (language == GAME_LANGUAGE) { speciesName = gSpeciesNames[species]; diff --git a/src/pokemon/pokemon_data.c b/src/pokemon/pokemon_data.c deleted file mode 100644 index 82e452158..000000000 --- a/src/pokemon/pokemon_data.c +++ /dev/null @@ -1,128 +0,0 @@ -#include "global.h" -#include "pokemon.h" -#include "constants/species.h" -#include "trainer.h" -#include "constants/abilities.h" -#include "constants/moves.h" -#include "constants/hold_effects.h" -#include "constants/items.h" -#include "sprite.h" -#include "data2.h" - -#include "../data/pokemon/dex_order.h" -#include "../data/pokemon/spinda_spots.h" -#include "../data/pokemon/item_effects.h" -#include "../data/pokemon/nature_stats.h" -#include "../data/pokemon/tmhm_learnsets.h" -#include "../data/pokemon/trainer_class_lookups.h" -#include "../data/pokemon/cry_ids.h" -#include "../data/pokemon/experience_tables.h" -#include "../data/pokemon/base_stats.h" -#include "../data/pokemon/level_up_learnsets.h" -#include "../data/pokemon/evolution.h" -#include "../data/pokemon/level_up_learnset_pointers.h" - -const u8 gUnknown_08208238[] = { // Masks for getting PP Up count, also PP Max values - 0x03, 0x0c, 0x30, 0xc0 -}; - -const u8 gUnknown_0820823C[] = { // Masks for setting PP Up count - 0xFC, 0xF3, 0xCF, 0x3F -}; - -const u8 gUnknown_08208240[] = { // Values added to PP Up count - 0x01, 0x04, 0x10, 0x40 -}; - -const u8 gStatStageRatios[][2] = { - {10, 40}, // -6 - {10, 35}, // -5 - {10, 30}, // -4 - {10, 25}, // -3 - {10, 20}, // -2 - {10, 15}, // -1 - {10, 10}, // 0 - {15, 10}, // 1 - {20, 10}, // 2 - {25, 10}, // 3 - {30, 10}, // 4 - {35, 10}, // 5 - {40, 10} // 6 -}; - -const u8 unknownGameFreakAbbrev_820825E[] = _("ゲーフリ"); - -const u8 gHoldEffectToType[][2] = { - {HOLD_EFFECT_BUG_POWER, TYPE_BUG}, - {HOLD_EFFECT_STEEL_POWER, TYPE_STEEL}, - {HOLD_EFFECT_GROUND_POWER, TYPE_GROUND}, - {HOLD_EFFECT_ROCK_POWER, TYPE_ROCK}, - {HOLD_EFFECT_GRASS_POWER, TYPE_GRASS}, - {HOLD_EFFECT_DARK_POWER, TYPE_DARK}, - {HOLD_EFFECT_FIGHTING_POWER, TYPE_FIGHTING}, - {HOLD_EFFECT_ELECTRIC_POWER, TYPE_ELECTRIC}, - {HOLD_EFFECT_WATER_POWER, TYPE_WATER}, - {HOLD_EFFECT_FLYING_POWER, TYPE_FLYING}, - {HOLD_EFFECT_POISON_POWER, TYPE_POISON}, - {HOLD_EFFECT_ICE_POWER, TYPE_ICE}, - {HOLD_EFFECT_GHOST_POWER, TYPE_GHOST}, - {HOLD_EFFECT_PSYCHIC_POWER, TYPE_PSYCHIC}, - {HOLD_EFFECT_FIRE_POWER, TYPE_FIRE}, - {HOLD_EFFECT_DRAGON_POWER, TYPE_DRAGON}, - {HOLD_EFFECT_NORMAL_POWER, TYPE_NORMAL} -}; - -extern void sub_80105A0(struct Sprite *); -extern void oac_poke_opponent(struct Sprite *); - -const struct SpriteTemplate gSpriteTemplate_8208288[] = { - {0xFFFF, 0, &gOamData_81F96F0, NULL, gSpriteImageTable_81E7A10, gSpriteAffineAnimTable_81E7B70, sub_80105A0}, - {0xFFFF, 0, &gOamData_81F96E8, NULL, gSpriteImageTable_81E7A30, gSpriteAffineAnimTable_81E7BEC, oac_poke_opponent}, - {0xFFFF, 0, &gOamData_81F96F0, NULL, gSpriteImageTable_81E7A50, gSpriteAffineAnimTable_81E7B70, sub_80105A0}, - {0xFFFF, 0, &gOamData_81F96E8, NULL, gSpriteImageTable_81E7A70, gSpriteAffineAnimTable_81E7BEC, oac_poke_opponent}, -}; - -const u8 gSecretBaseTrainerClasses[][5] = { - // male - {TRAINER_CLASS_YOUNGSTER, TRAINER_CLASS_BUG_CATCHER, TRAINER_CLASS_RICH_BOY, TRAINER_CLASS_CAMPER, TRAINER_CLASS_COOL_TRAINER_M}, - // female - {TRAINER_CLASS_LASS, TRAINER_CLASS_SCHOOL_KID_F, TRAINER_CLASS_LADY, TRAINER_CLASS_PICNICKER, TRAINER_CLASS_COOL_TRAINER_F} -}; - -const u8 gUnknown_082082F2[] = { - MON_DATA_HP_EV, - MON_DATA_ATK_EV, - MON_DATA_DEF_EV, - MON_DATA_SPEED_EV, - MON_DATA_SPDEF_EV, - MON_DATA_SPATK_EV -}; - -const u8 gUnknown_082082F8[] = {1, 1, 3, 2, 4, 6}; - -const s8 gUnknown_082082FE[][3] = { - // Happiness deltas - { 5, 3, 2}, - { 5, 3, 2}, - { 1, 1, 0}, - { 3, 2, 1}, - { 1, 1, 0}, - { 1, 1, 1}, - {-1, -1, -1}, - {-5, -5, -10}, - {-5, -5, -10} -}; - -const u16 gHMMoves[] = { - MOVE_CUT, - MOVE_FLY, - MOVE_SURF, - MOVE_STRENGTH, - MOVE_FLASH, - MOVE_ROCK_SMASH, - MOVE_WATERFALL, - MOVE_DIVE, - 0xffff -}; - -const u8 gJapaneseNidoranNames[][11] = {_("ニドラン♂"), _("ニドラン♀")}; diff --git a/src/pokemon/pokemon_item_effect.c b/src/pokemon/pokemon_item_effect.c new file mode 100644 index 000000000..4ebece3b3 --- /dev/null +++ b/src/pokemon/pokemon_item_effect.c @@ -0,0 +1,550 @@ +#include "global.h" +#include "constants/battle_constants.h" +#include "constants/hold_effects.h" +#include "constants/items.h" +#include "constants/species.h" +#include "battle.h" +#include "evolution_scene.h" +#include "ewram.h" +#include "item.h" +#include "main.h" +#include "overworld.h" +#include "pokemon.h" +#include "pokemon_item_effect.h" +#include "rom_8077ABC.h" +#include "rom_8094928.h" +#include "util.h" + +extern s32 gBattleMoveDamage; +extern u8 gAbsentBankFlags; +extern u8 gBankInMenu; +extern u8 gNoOfAllBanks; +extern u16 gBattlePartyID[]; +extern u8 gActiveBank; +extern u8 gStringBank; +extern struct BattlePokemon gBattleMons[]; +extern struct BattleEnigmaBerry gEnigmaBerries[]; + +static const u8 sGetMonDataEVConstants[] = +{ + MON_DATA_HP_EV, + MON_DATA_ATK_EV, + MON_DATA_DEF_EV, + MON_DATA_SPEED_EV, + MON_DATA_SPDEF_EV, + MON_DATA_SPATK_EV +}; + +extern u8 gUnknown_08208238[]; +extern u8 gUnknown_0820823C[]; +extern u8 gUnknown_08208240[]; + +bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 moveIndex, u8 e); + +bool8 ExecuteTableBasedItemEffect_(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 moveIndex) +{ + return PokemonUseItemEffects(pkmn, item, partyIndex, moveIndex, 0); +} + +bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 moveIndex, u8 e) +{ + u32 data; + s32 friendship; + s32 cmdIndex; + bool8 retVal = TRUE; + const u8 *itemEffect; + u8 sp24 = 6; + u32 sp28; + s8 sp2C = 0; + u8 holdEffect; + u8 sp34 = 4; + u16 heldItem; + u8 r10; + u32 r4; + + heldItem = GetMonData(pkmn, MON_DATA_HELD_ITEM, NULL); + if (heldItem == ITEM_ENIGMA_BERRY) + { + if (gMain.inBattle) + holdEffect = gEnigmaBerries[gBankInMenu].holdEffect; + else + holdEffect = gSaveBlock1.enigmaBerry.holdEffect; + } + else + { + holdEffect = ItemId_GetHoldEffect(heldItem); + } + + gStringBank = gBankInMenu; + if (gMain.inBattle) + { + gActiveBank = gBankInMenu; + cmdIndex = (GetBankSide(gActiveBank) != 0); + while (cmdIndex < gNoOfAllBanks) + { + if (gBattlePartyID[cmdIndex] == partyIndex) + { + sp34 = cmdIndex; + break; + } + cmdIndex += 2; + } + } + else + { + gActiveBank = 0; + sp34 = 4; + } + + if (!IS_POKEMON_ITEM(item)) + return TRUE; + if (gItemEffectTable[item - 13] == NULL && item != ITEM_ENIGMA_BERRY) + return TRUE; + + if (item == ITEM_ENIGMA_BERRY) + { + if (gMain.inBattle) + itemEffect = gEnigmaBerries[gActiveBank].itemEffect; + else + itemEffect = gSaveBlock1.enigmaBerry.itemEffect; + } + else + { + itemEffect = gItemEffectTable[item - 13]; + } + + for (cmdIndex = 0; cmdIndex < 6; cmdIndex++) + { + switch (cmdIndex) + { + // status healing effects + case 0: + if ((itemEffect[cmdIndex] & 0x80) + && gMain.inBattle && sp34 != 4 && (gBattleMons[sp34].status2 & STATUS2_INFATUATION)) + { + gBattleMons[sp34].status2 &= ~STATUS2_INFATUATION; + retVal = FALSE; + } + if ((itemEffect[cmdIndex] & 0x30) + && !(gBattleMons[gActiveBank].status2 & STATUS2_FOCUS_ENERGY)) + { + gBattleMons[gActiveBank].status2 |= STATUS2_FOCUS_ENERGY; + retVal = FALSE; + } + if ((itemEffect[cmdIndex] & 0xF) + && gBattleMons[gActiveBank].statStages[STAT_STAGE_ATK] < 12) + { + gBattleMons[gActiveBank].statStages[STAT_STAGE_ATK] += itemEffect[cmdIndex] & 0xF; + if (gBattleMons[gActiveBank].statStages[STAT_STAGE_ATK] > 12) + gBattleMons[gActiveBank].statStages[STAT_STAGE_ATK] = 12; + retVal = FALSE; + } + break; + // in-battle stat boosting effects? + case 1: + if ((itemEffect[cmdIndex] & 0xF0) + && gBattleMons[gActiveBank].statStages[STAT_STAGE_DEF] < 12) + { + gBattleMons[gActiveBank].statStages[STAT_STAGE_DEF] += (itemEffect[cmdIndex] & 0xF0) >> 4; + if (gBattleMons[gActiveBank].statStages[STAT_STAGE_DEF] > 12) + gBattleMons[gActiveBank].statStages[STAT_STAGE_DEF] = 12; + retVal = FALSE; + } + if ((itemEffect[cmdIndex] & 0xF) + && gBattleMons[gActiveBank].statStages[STAT_STAGE_SPEED] < 12) + { + gBattleMons[gActiveBank].statStages[STAT_STAGE_SPEED] += itemEffect[cmdIndex] & 0xF; + if (gBattleMons[gActiveBank].statStages[STAT_STAGE_SPEED] > 12) + gBattleMons[gActiveBank].statStages[STAT_STAGE_SPEED] = 12; + retVal = FALSE; + } + break; + // more stat boosting effects? + case 2: + if ((itemEffect[cmdIndex] & 0xF0) + && gBattleMons[gActiveBank].statStages[STAT_STAGE_ACC] < 12) + { + gBattleMons[gActiveBank].statStages[STAT_STAGE_ACC] += (itemEffect[cmdIndex] & 0xF0) >> 4; + if (gBattleMons[gActiveBank].statStages[STAT_STAGE_ACC] > 12) + gBattleMons[gActiveBank].statStages[STAT_STAGE_ACC] = 12; + retVal = FALSE; + } + if ((itemEffect[cmdIndex] & 0xF) + && gBattleMons[gActiveBank].statStages[STAT_STAGE_SPATK] < 12) + { + gBattleMons[gActiveBank].statStages[STAT_STAGE_SPATK] += itemEffect[cmdIndex] & 0xF; + if (gBattleMons[gActiveBank].statStages[STAT_STAGE_SPATK] > 12) + gBattleMons[gActiveBank].statStages[STAT_STAGE_SPATK] = 12; + retVal = FALSE; + } + break; + case 3: + if ((itemEffect[cmdIndex] & 0x80) + && gSideTimers[GetBankSide(gActiveBank)].mistTimer == 0) + { + gSideTimers[GetBankSide(gActiveBank)].mistTimer = 5; + retVal = FALSE; + } + if ((itemEffect[cmdIndex] & 0x40) // raise level + && GetMonData(pkmn, MON_DATA_LEVEL, NULL) != 100) + { + data = gExperienceTables[gBaseStats[GetMonData(pkmn, MON_DATA_SPECIES, NULL)].growthRate][GetMonData(pkmn, MON_DATA_LEVEL, NULL) + 1]; + SetMonData(pkmn, MON_DATA_EXP, &data); + CalculateMonStats(pkmn); + retVal = FALSE; + } + if ((itemEffect[cmdIndex] & 0x20) + && HealStatusConditions(pkmn, partyIndex, 7, sp34) == 0) + { + if (sp34 != 4) + gBattleMons[sp34].status2 &= ~STATUS2_NIGHTMARE; + retVal = FALSE; + } + if ((itemEffect[cmdIndex] & 0x10) && HealStatusConditions(pkmn, partyIndex, 0xF88, sp34) == 0) + retVal = FALSE; + if ((itemEffect[cmdIndex] & 8) && HealStatusConditions(pkmn, partyIndex, 16, sp34) == 0) + retVal = FALSE; + if ((itemEffect[cmdIndex] & 4) && HealStatusConditions(pkmn, partyIndex, 32, sp34) == 0) + retVal = FALSE; + if ((itemEffect[cmdIndex] & 2) && HealStatusConditions(pkmn, partyIndex, 64, sp34) == 0) + retVal = FALSE; + if ((itemEffect[cmdIndex] & 1) // heal confusion + && gMain.inBattle && sp34 != 4 && (gBattleMons[sp34].status2 & STATUS2_CONFUSION)) + { + gBattleMons[sp34].status2 &= ~STATUS2_CONFUSION; + retVal = FALSE; + } + break; + // EV, HP, and PP raising effects + case 4: + r10 = itemEffect[cmdIndex]; + if (r10 & 0x20) + { + r10 &= ~0x20; + data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_08208238[moveIndex]) >> (moveIndex * 2); + sp28 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex); + if (data <= 2 && sp28 > 4) + { + data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) + gUnknown_08208240[moveIndex]; + SetMonData(pkmn, MON_DATA_PP_BONUSES, &data); + + data = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - sp28; + data = GetMonData(pkmn, MON_DATA_PP1 + moveIndex, NULL) + data; + SetMonData(pkmn, MON_DATA_PP1 + moveIndex, &data); + retVal = FALSE; + } + } + sp28 = 0; + while (r10 != 0) + { + if (r10 & 1) + { + u16 evCount; + s32 r5; + + switch (sp28) + { + case 0: + case 1: + evCount = GetMonEVCount(pkmn); + if (evCount >= 510) + return TRUE; + data = GetMonData(pkmn, sGetMonDataEVConstants[sp28], NULL); + if (data < 100) + { + if (data + itemEffect[sp24] > 100) + r4 = 100 - (data + itemEffect[sp24]) + itemEffect[sp24]; + else + r4 = itemEffect[sp24]; + if (evCount + r4 > 510) + r4 += 510 - (evCount + r4); + data += r4; + SetMonData(pkmn, sGetMonDataEVConstants[sp28], &data); + CalculateMonStats(pkmn); + sp24++; + retVal = FALSE; + } + break; + case 2: + // revive? + if (r10 & 0x10) + { + if (GetMonData(pkmn, MON_DATA_HP, NULL) != 0) + { + sp24++; + break; + } + if (gMain.inBattle) + { + if (sp34 != 4) + { + gAbsentBankFlags &= ~gBitTable[sp34]; + CopyPlayerPartyMonToBattleData(sp34, pokemon_order_func(gBattlePartyID[sp34])); + if (GetBankSide(gActiveBank) == 0 && gBattleResults.unk4 < 255) + gBattleResults.unk4++; + } + else + { + gAbsentBankFlags &= ~gBitTable[gActiveBank ^ 2]; + if (GetBankSide(gActiveBank) == 0 && gBattleResults.unk4 < 255) + gBattleResults.unk4++; + } + } + } + else + { + if (GetMonData(pkmn, MON_DATA_HP, NULL) == 0) + { + sp24++; + break; + } + } + data = itemEffect[sp24++]; + switch (data) + { + case 0xFF: + data = GetMonData(pkmn, MON_DATA_MAX_HP, NULL) - GetMonData(pkmn, MON_DATA_HP, NULL); + break; + case 0xFE: + data = GetMonData(pkmn, MON_DATA_MAX_HP, NULL) / 2; + if (data == 0) + data = 1; + break; + case 0xFD: + data = eStatHp; + break; + } + if (GetMonData(pkmn, MON_DATA_MAX_HP, NULL) != GetMonData(pkmn, MON_DATA_HP, NULL)) + { + if (e == 0) + { + data = GetMonData(pkmn, MON_DATA_HP, NULL) + data; + if (data > GetMonData(pkmn, MON_DATA_MAX_HP, NULL)) + data = GetMonData(pkmn, MON_DATA_MAX_HP, NULL); + SetMonData(pkmn, MON_DATA_HP, &data); + if (gMain.inBattle && sp34 != 4) + { + gBattleMons[sp34].hp = data; + if (!(r10 & 0x10) && GetBankSide(gActiveBank) == 0) + { + if (gBattleResults.unk3 < 255) + gBattleResults.unk3++; + // I have to re-use this variable to match. + r5 = gActiveBank; + gActiveBank = sp34; + EmitGetAttributes(0, 0, 0); + MarkBufferBankForExecution(gActiveBank); + gActiveBank = r5; + } + } + } + else + { + gBattleMoveDamage = -data; + } + retVal = FALSE; + } + r10 &= 0xEF; + break; + case 3: + if (!(r10 & 2)) + { + for (r5 = 0; r5 < 4; r5++) + { + u16 r4; + + data = GetMonData(pkmn, MON_DATA_PP1 + r5, NULL); + r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL); + if (data != CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5)) + { + data += itemEffect[sp24]; + r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL); + if (data > CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5)) + { + r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL); + data = CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5); + } + SetMonData(pkmn, MON_DATA_PP1 + r5, &data); + if (gMain.inBattle + && sp34 != 4 && !(gBattleMons[sp34].status2 & 0x200000) + && !(gDisableStructs[sp34].unk18_b & gBitTable[r5])) + gBattleMons[sp34].pp[r5] = data; + retVal = FALSE; + } + } + sp24++; + } + else + { + u16 r4; + + data = GetMonData(pkmn, MON_DATA_PP1 + moveIndex, NULL); + r4 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL); + if (data != CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex)) + { + data += itemEffect[sp24++]; + r4 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL); + if (data > CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex)) + { + r4 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL); + data = CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex); + } + SetMonData(pkmn, MON_DATA_PP1 + moveIndex, &data); + if (gMain.inBattle + && sp34 != 4 && !(gBattleMons[sp34].status2 & 0x200000) + && !(gDisableStructs[sp34].unk18_b & gBitTable[moveIndex])) + gBattleMons[sp34].pp[moveIndex] = data; + retVal = FALSE; + } + } + break; + case 7: + { + u16 targetSpecies = GetEvolutionTargetSpecies(pkmn, 2, item); + + if (targetSpecies != SPECIES_NONE) + { + BeginEvolutionScene(pkmn, targetSpecies, 0, partyIndex); + return FALSE; + } + } + break; + } + } + sp28++; + r10 >>= 1; + } + break; + case 5: + r10 = itemEffect[cmdIndex]; + sp28 = 0; + while (r10 != 0) + { + if (r10 & 1) + { + u16 evCount; + + switch (sp28) + { + case 0: + case 1: + case 2: + case 3: + evCount = GetMonEVCount(pkmn); + if (evCount >= 510) + return TRUE; + data = GetMonData(pkmn, sGetMonDataEVConstants[sp28 + 2], NULL); + if (data < 100) + { + if (data + itemEffect[sp24] > 100) + r4 = 100 - (data + itemEffect[sp24]) + itemEffect[sp24]; + else + r4 = itemEffect[sp24]; + if (evCount + r4 > 510) + r4 += 510 - (evCount + r4); + data += r4; + SetMonData(pkmn, sGetMonDataEVConstants[sp28 + 2], &data); + CalculateMonStats(pkmn); + retVal = FALSE; + sp24++; + } + break; + case 4: + data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_08208238[moveIndex]) >> (moveIndex * 2); + if (data < 3) + { + r4 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex); + data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL); + data &= gUnknown_0820823C[moveIndex]; + data += gUnknown_08208240[moveIndex] * 3; + + SetMonData(pkmn, MON_DATA_PP_BONUSES, &data); + data = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - r4; + data = GetMonData(pkmn, MON_DATA_PP1 + moveIndex, NULL) + data; + SetMonData(pkmn, MON_DATA_PP1 + moveIndex, &data); + retVal = FALSE; + } + break; + case 5: + if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) < 100 && retVal == 0 && sp2C == 0) + { + sp2C = itemEffect[sp24]; + friendship = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL); + if (sp2C > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) + friendship += 150 * sp2C / 100; + else + friendship += sp2C; + if (sp2C > 0) + { + if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11) + friendship++; + if (GetMonData(pkmn, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name()) + friendship++; + } + if (friendship < 0) + friendship = 0; + if (friendship > 255) + friendship = 255; + SetMonData(pkmn, MON_DATA_FRIENDSHIP, &friendship); + } + sp24++; + break; + case 6: + if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) >= 100 && GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) < 200 + && retVal == 0 && sp2C == 0) + { + sp2C = itemEffect[sp24]; + friendship = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL); + if (sp2C > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) + friendship += 150 * sp2C / 100; + else + friendship += sp2C; + if (sp2C > 0) + { + if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11) + friendship++; + if (GetMonData(pkmn, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name()) + friendship++; + } + if (friendship < 0) + friendship = 0; + if (friendship > 255) + friendship = 255; + SetMonData(pkmn, MON_DATA_FRIENDSHIP, &friendship); + } + sp24++; + break; + case 7: + if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) >= 200 && retVal == 0 && sp2C == 0) + { + sp2C = itemEffect[sp24]; + friendship = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL); + if (sp2C > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) + friendship += 150 * sp2C / 100; + else + friendship += sp2C; + if (sp2C > 0) + { + if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11) + friendship++; + if (GetMonData(pkmn, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name()) + friendship++; + } + if (friendship < 0) + friendship = 0; + if (friendship > 255) + friendship = 255; + SetMonData(pkmn, MON_DATA_FRIENDSHIP, &friendship); + } + sp24++; + break; + } + } + sp28++; + r10 >>= 1; + } + break; + } + } + return retVal; +} diff --git a/src/pokemon/pokemon_menu.c b/src/pokemon/pokemon_menu.c index d2a5197a0..532340ce4 100644 --- a/src/pokemon/pokemon_menu.c +++ b/src/pokemon/pokemon_menu.c @@ -1,4 +1,5 @@ #include "global.h" +#include "easy_chat.h" #include "pokemon.h" #include "pokemon_menu.h" #include "party_menu.h" @@ -30,6 +31,7 @@ #include "item_menu.h" #include "player_pc.h" #include "ewram.h" +#include "script.h" /* Pokemon menu: @@ -44,16 +46,16 @@ struct PokeMenuFieldMoveFunc u8 field_1; }; +extern u8 gUnknown_020297ED; extern u8 gUnknown_020384F0; extern u8 gUnknown_0202E8F4; extern u8 gUnknown_0202E8F5; extern u8 gUnknown_0202E8F6; extern u8 gUnknown_02038561; extern u16 gUnknown_0202E8F8; -extern void (*gUnknown_03004AE4)(u8 taskID, u16 itemID, TaskFunc func); +extern void (*gPokemonItemUseCallback)(u8 taskID, u16 itemID, TaskFunc func); extern TaskFunc gUnknown_03005CF0; -void sub_80E62A0(u8 arg0, struct MailStruct* arg1, void* arg2, u8 arg3); void sub_808A520(void); void sub_80A61D0(void); void CB2_InitFlyRegionMap(void); @@ -229,8 +231,8 @@ static void sub_8089A8C(void) static void sub_8089BDC(u8 arg0, u8 arg1, u8 arg2, u8 noOfOptions, const struct MenuAction2 *menuActions, const u8 *order, u8 arg6) { PrintPartyMenuPromptText(5, arg6); - MenuDrawTextWindow(arg0, arg1, arg0 + arg2, (noOfOptions * 2) + arg1 + 1); - PrintMenuItemsReordered(arg0 + 1, arg1 + 1, noOfOptions, menuActions, order); + Menu_DrawStdWindowFrame(arg0, arg1, arg0 + arg2, (noOfOptions * 2) + arg1 + 1); + Menu_PrintItemsReordered(arg0 + 1, arg1 + 1, noOfOptions, menuActions, order); } void sub_8089C50(u8 arg0, u8 arg1, u8 arg2, u8 noOfOptions, const struct MenuAction2 *menuActions, const u8 *order) @@ -279,13 +281,13 @@ static void sub_8089D94(u8 taskID) if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP) { PlaySE(SE_SELECT); - sPokeMenuCursorPos = MoveMenuCursor(-1); + sPokeMenuCursorPos = Menu_MoveCursor(-1); sub_808B5B4(taskID); } else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) { PlaySE(SE_SELECT); - sPokeMenuCursorPos = MoveMenuCursor(1); + sPokeMenuCursorPos = Menu_MoveCursor(1); sub_808B5B4(taskID); } else if (gMain.newKeys & A_BUTTON) @@ -363,12 +365,12 @@ static void PokemonMenu_Summary(u8 taskID) void DoPokemonMenu_Switch(u8 taskID) { SetTaskFuncWithFollowupFunc(taskID, SetupDefaultPartyMenuSwitchPokemon, HandleDefaultPartyMenu); - MenuZeroFillWindowRect(19, 0, 29, 19); + Menu_EraseWindowRect(19, 0, 29, 19); } static void PokemonMenu_Switch(u8 taskID) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); ewram01000.unkC = sub_806CD5C; ewram01000.array[53553] = 1; DoPokemonMenu_Switch(taskID); @@ -378,12 +380,12 @@ static void sub_808A060(u8 taskID) { if (gMain.newKeys == DPAD_UP && sPokeMenuCursorPos != 0) { - sPokeMenuCursorPos = MoveMenuCursor(-1); + sPokeMenuCursorPos = Menu_MoveCursor(-1); PlaySE(SE_SELECT); } if (gMain.newKeys == DPAD_DOWN && sPokeMenuCursorPos != 2) { - sPokeMenuCursorPos = MoveMenuCursor(1); + sPokeMenuCursorPos = Menu_MoveCursor(1); PlaySE(SE_SELECT); } if (gMain.newKeys & A_BUTTON) @@ -407,9 +409,9 @@ static void sub_808A100(u8 taskID) static void PokemonMenu_Item(u8 taskID) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); sPokeMenuCursorPos = 0; - MenuZeroFillWindowRect(19, 0, 29, 19); + Menu_EraseWindowRect(19, 0, 29, 19); gTasks[taskID].func = sub_808A100; } @@ -419,7 +421,7 @@ static void sub_808A180(u8 taskID) { u8 mailID = GetMonData(&gPlayerParty[sub_806CA38(taskID)], MON_DATA_MAIL); DestroyTask(taskID); - sub_80E62A0(4, &gSaveBlock1.mail[mailID], sub_808A520, 3); + sub_80E62A0(4, gSaveBlock1.mail[mailID].words, sub_808A520, 3); } } @@ -442,7 +444,7 @@ static void sub_808A228(u8 taskID) } else { - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_EraseWindowRect(0, 0, 29, 19); PrintPartyMenuPromptText(0, 0); gTasks[taskID].func = HandleDefaultPartyMenu; } @@ -458,7 +460,7 @@ static void sub_808A2DC(u8 taskID) { u8 mailID = GetMonData(&gPlayerParty[sub_806CA38(taskID)], MON_DATA_MAIL); DestroyTask(taskID); - sub_80E62A0(4, &gSaveBlock1.mail[mailID], sub_808A520, 3); + sub_80E62A0(4, gSaveBlock1.mail[mailID].words, sub_808A520, 3); } static void sub_808A330(u8 taskID) @@ -600,25 +602,25 @@ static void sub_808A678(u8 taskID) static void PokemonMenu_TakeItem(u8 taskID) { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(19, 0, 29, 19); + Menu_DestroyCursor(); + Menu_EraseWindowRect(19, 0, 29, 19); sub_806D5A4(); PartyMenuTryGiveMonHeldItem_806ECE8(taskID, sub_808A678); } static void PokemonMenu_TakeMail(u8 taskID) { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(19, 0, 29, 19); + Menu_DestroyCursor(); + Menu_EraseWindowRect(19, 0, 29, 19); sub_806D5A4(); DoTakeMail(taskID, sub_808A678); } static void PokemonMenu_Mail(u8 taskID) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); sPokeMenuCursorPos = 0; - MenuZeroFillWindowRect(19, 0, 29, 19); + Menu_EraseWindowRect(19, 0, 29, 19); ShowPartyPopupMenu(0, &sUnknown_0839F584, (void*) sPokemonMenuActions, 0); gTasks[taskID].func = sub_808A73C; } @@ -629,17 +631,17 @@ static void sub_808A73C(u8 taskID) { PlaySE(SE_SELECT); if (sPokeMenuCursorPos == 0) - sPokeMenuCursorPos = MoveMenuCursor(sUnknown_0839F584.numChoices - 1); + sPokeMenuCursorPos = Menu_MoveCursor(sUnknown_0839F584.numChoices - 1); else - sPokeMenuCursorPos = MoveMenuCursor(-1); + sPokeMenuCursorPos = Menu_MoveCursor(-1); } if (gMain.newAndRepeatedKeys == DPAD_DOWN) { PlaySE(SE_SELECT); if (sPokeMenuCursorPos == sUnknown_0839F584.numChoices - 1) - sPokeMenuCursorPos = MoveMenuCursor(1 - sUnknown_0839F584.numChoices); + sPokeMenuCursorPos = Menu_MoveCursor(1 - sUnknown_0839F584.numChoices); else - sPokeMenuCursorPos = MoveMenuCursor(1); + sPokeMenuCursorPos = Menu_MoveCursor(1); } if (gMain.newKeys & A_BUTTON) { @@ -679,23 +681,23 @@ static void sub_808A8A8(void) static void sub_808A8D4(u8 taskID) { sPokeMenuCursorPos = 0; - MenuZeroFillWindowRect(19, 0, 29, 19); + Menu_EraseWindowRect(19, 0, 29, 19); PrintPartyMenuPromptText(0, 0); gTasks[taskID].func = HandleDefaultPartyMenu; } static void PokemonMenu_Cancel(u8 taskID) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); PlaySE(SE_SELECT); sub_808A8D4(taskID); } static void PokemonMenu_CancelSubmenu(u8 taskID) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); PlaySE(SE_SELECT); - MenuZeroFillWindowRect(19, 0, 29, 19); + Menu_EraseWindowRect(19, 0, 29, 19); sub_806D5A4(); sub_8089C7C(sPokeMenuCursorPos); gTasks[taskID].func = sub_8089D94; @@ -711,11 +713,11 @@ static void PokemonMenu_FieldMove(u8 taskID) { s16* data = gTasks[taskID].data; - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); tFieldMoveId = sPokeMenuOptionsOrder[sPokeMenuCursorPos] - POKEMENU_FIRST_FIELD_MOVE_ID; if (sub_80F9344() == TRUE) { - MenuZeroFillWindowRect(19, 0, 29, 19); + Menu_EraseWindowRect(19, 0, 29, 19); if (IS_SOFTBOILED_MILKDRINK(tFieldMoveId)) PrintPartyMenuPromptText(9, 0); else @@ -725,7 +727,7 @@ static void PokemonMenu_FieldMove(u8 taskID) else if (tFieldMoveId <= 7 && FlagGet(FLAG_BADGE01_GET + tFieldMoveId) != TRUE) { // can't use a field HM move without a proper badge - MenuZeroFillWindowRect(19, 0, 29, 19); + Menu_EraseWindowRect(19, 0, 29, 19); sub_806D5A4(); sub_806E834(gOtherText_CantBeUsedBadge, 1); gTasks[taskID].func = sub_808AAF0; @@ -745,7 +747,7 @@ static void PokemonMenu_FieldMove(u8 taskID) } else { - MenuZeroFillWindowRect(19, 0, 29, 19); + Menu_EraseWindowRect(19, 0, 29, 19); if (IS_SURF(tFieldMoveId) && TestPlayerAvatarFlags(8)) PrintPartyMenuPromptText(8, 0); else @@ -759,7 +761,7 @@ static void sub_808AAF0(u8 taskID) { if (gUnknown_0202E8F6 != 1 && (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON)) { - MenuZeroFillWindowRect(0, 14, 29, 19); + Menu_EraseWindowRect(0, 14, 29, 19); PokemonMenu_Cancel(taskID); } } @@ -786,7 +788,7 @@ void FieldCallback_Teleport(void) static void sub_808ABA8(u8 taskID) { - if (sub_807D770() == TRUE) + if (IsWeatherNotFadingIn() == TRUE) { gFieldEffectArguments[0] = GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_SPECIES); gUnknown_03005CE4(); @@ -798,7 +800,7 @@ static void sub_808ABF4(u8 taskID) { if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) { - MenuZeroFillWindowRect(1, 17, 28, 18); + Menu_EraseWindowRect(1, 17, 28, 18); PokemonMenu_Cancel(taskID); } } @@ -900,9 +902,10 @@ static void sub_808AE08(void) static bool8 SetUpFieldMove_Waterfall(void) { s16 x, y; + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); if (MetatileBehavior_IsWaterfall(MapGridGetMetatileBehaviorAt(x, y)) == TRUE - && IsPlayerSurfingNorth() == TRUE) + && IsPlayerSurfingNorth() == TRUE) { gFieldCallback = FieldCallback_Teleport; gUnknown_03005CE4 = sub_808AE08; @@ -912,6 +915,20 @@ static bool8 SetUpFieldMove_Waterfall(void) return FALSE; } +#if DEBUG +void debug_sub_80986AC(void) +{ + s16 x, y; + + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + if (MetatileBehavior_IsWaterfall(MapGridGetMetatileBehaviorAt(x, y)) == TRUE + && IsPlayerSurfingNorth() == TRUE) + sub_808AE08(); + else + ScriptContext2_Disable(); +} +#endif + static void sub_808AE8C(void) { u8 i; @@ -921,7 +938,11 @@ static void sub_808AE8C(void) if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES)) { sub_806D668(i); - if (GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) || !CanMonLearnTMHM(&gPlayerParty[i], arg)) + if ( +#if DEBUG + gUnknown_020297ED == 0 && +#endif + (GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) || !CanMonLearnTMHM(&gPlayerParty[i], arg))) sub_806BC3C(i, 0x9A); else if (pokemon_has_move(&gPlayerParty[i], ItemIdToBattleMoveId(gSpecialVar_ItemId))) sub_806BC3C(i, 0xA8); @@ -1013,7 +1034,7 @@ void sub_808B0C0(u8 taskID) { sub_806D5A4(); if (gUnknown_02038561 == 0) - gUnknown_03004AE4(taskID, gSpecialVar_ItemId, sub_808B224); + gPokemonItemUseCallback(taskID, gSpecialVar_ItemId, sub_808B224); if (gUnknown_02038561 == 1) { PlaySE(SE_SELECT); @@ -1042,7 +1063,7 @@ void sub_808B0C0(u8 taskID) static void sub_808B1EC(u8 taskID) { if (!gPaletteFade.active) - gUnknown_03004AE4(taskID, gSpecialVar_ItemId, sub_808B224); + gPokemonItemUseCallback(taskID, gSpecialVar_ItemId, sub_808B224); } static void sub_808B224(u8 taskID) @@ -1095,7 +1116,7 @@ static void sub_808B338(u8 taskID) gLastFieldPokeMenuOpened = sub_806CA38(taskID); mailID = GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_MAIL); DestroyTask(taskID); - sub_80E62A0(4, &gSaveBlock1.mail[mailID], sub_808B3EC, 3); + sub_80E62A0(4, gSaveBlock1.mail[mailID].words, sub_808B3EC, 3); } } diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c index 4a68b846a..1ea8bc205 100644 --- a/src/pokemon/pokemon_storage_system.c +++ b/src/pokemon/pokemon_storage_system.c @@ -1,93 +1,784 @@ #include "global.h" -#include "pokemon_storage_system.h" +#include "palette.h" +#include "constants/songs.h" +#include "sound.h" +#include "field_weather.h" +#include "overworld.h" +#include "field_fadetransition.h" #include "menu.h" +#include "main.h" +#include "strings.h" #include "string_util.h" -#include "ewram.h" +#include "event_data.h" +#include "script.h" +#include "pokemon_storage_system.h" + +void StorageSystemCreatePrimaryMenu(u8 whichMenu); +void sub_80963D0(u8 curBox); +void sub_809658C(void); +void sub_80965F8(void); +void sub_809662C(void); +void sub_809665C(void); +void sub_80966F4(const u8 *sourceString, u16 x, u16 y); +void sub_8096784(struct Sprite *sprite); + +EWRAM_DATA struct PokemonStorage gPokemonStorage = {0}; +EWRAM_DATA u8 gUnknown_02038470[3] = {}; +EWRAM_DATA u8 gUnknown_02038473 = 0; +EWRAM_DATA u8 gUnknown_02038474 = 0; +EWRAM_DATA struct UnkPSSStruct_2002370 *gUnknown_02038478 = NULL; -struct StorageAction { - u8 *text; - u8 format; +const struct PSS_MenuStringPtrs gUnknown_083B600C[] = { + {PCText_WithdrawPoke, PCText_MovePokeToParty}, + {PCText_DepositPoke, PCText_StorePokeInBox}, + {PCText_MovePoke, PCText_OrganizeBoxesParty}, + {PCText_SeeYa, PCText_ReturnToPrevMenu} }; -extern const struct StorageAction gUnknown_083B6DF4[]; +#if DEBUG +const u16 gUnknown_Debug_083E05F0[2] = {0}; +#endif -EWRAM_DATA struct PokemonStorage gPokemonStorage = {0}; +const union AnimCmd gSpriteAnim_83B602C[] = { + ANIMCMD_FRAME( 0, 5), + ANIMCMD_END +}; -void sub_8098898(u8 index) { - u8 *ptr; +const union AnimCmd gSpriteAnim_83B6034[] = { + ANIMCMD_FRAME( 4, 5), + ANIMCMD_END +}; - MenuDrawTextWindow(10, 16, 29, 19); +const union AnimCmd gSpriteAnim_83B603C[] = { + ANIMCMD_FRAME( 6, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_83B6044[] = { + ANIMCMD_FRAME(10, 5), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_83B604C[] = { + gSpriteAnim_83B602C, + gSpriteAnim_83B6034, + gSpriteAnim_83B603C, + gSpriteAnim_83B6044 +}; + +const union AffineAnimCmd gSpriteAffineAnim_83B605C[] = { + AFFINEANIMCMD_FRAME(0xe0, 0xe0, 0, 0), + AFFINEANIMCMD_END +}; - switch (gUnknown_083B6DF4[index].format) +const union AffineAnimCmd *const gSpriteAffineAnimTable_83B606C[] = { + gSpriteAffineAnim_83B605C +}; + +const u16 gBoxSelectionPopupPalette[] = INCBIN_U16("graphics/pokemon_storage/box_selection_popup.gbapal"); + +const u8 gBoxSelectionPopupCenterTiles[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_center.4bpp"); + +const u8 gBoxSelectionPopupSidesTiles[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_sides.4bpp"); + +u8 CountPokemonInBoxN(u8 boxId) +{ + u16 i; + u16 count; + + for (i = 0, count = 0; i < 30; i++) { + if (GetBoxMonData(gPokemonStorage.boxes[boxId] + i, MON_DATA_SPECIES) != 0) + count++; + } + return count; +} + +s16 GetIndexOfFirstEmptySpaceInBoxN(u8 boxId) +{ + u16 i; - case 2: - ptr = StringCopy(gUnk2002694, gUnknown_083B6DF4[index].text); - ptr = StringCopy(ptr, gUnk20011fa); - break; + for (i = 0; i < 30; i++) + { + if (GetBoxMonData(gPokemonStorage.boxes[boxId] + i, MON_DATA_SPECIES) == 0) + return i; + } + return -1; +} - case 5: - ptr = StringCopy(gUnk2002694, gUnknown_083B6DF4[index].text); - ptr = StringCopy(ptr, gUnk20026e4); - break; +u8 GetNumValidDaycarePartyMons(void) +{ + u16 i; + u16 count; - case 1: - // {var} + " is selected." - ptr = StringCopy(gUnk2002694, gUnk20011fa); - ptr = StringCopy(ptr, gUnknown_083B6DF4[index].text); - break; + for (i = 0, count = 0; i < PARTY_SIZE; i++) + { + struct Pokemon *pokemon = gPlayerParty + i; + if (GetMonData(pokemon, MON_DATA_SPECIES) != 0 && !GetMonData(pokemon, MON_DATA_IS_EGG)) + count++; + } + return count; +} - case 4: - // {var} + " was released." - ptr = StringCopy(gUnk2002694, gUnk20026e4); -#if ENGLISH - ptr = StringCopy(ptr, gUnknown_083B6DF4[index].text); -#elif GERMAN - ptr = de_sub_8073174(gUnk2002694, gUnknown_083B6DF4[index].text); -#endif - break; +u8 CountAlivePartyMonsExceptOne(u8 toSkip) +{ + u16 i; + u16 count; - case 3: + for (i = 0, count = 0; i < PARTY_SIZE; i++) { - u8 *stringLength; - u8 *text; + if (i != toSkip) + { + struct Pokemon *pokemon = gPlayerParty + i; + if (GetMonData(pokemon, MON_DATA_SPECIES) != 0 && !GetMonData(pokemon, MON_DATA_IS_EGG) && GetMonData(pokemon, MON_DATA_HP) != 0) + count++; + } + } + return count; +} + +u8 CountAlivePartyMonsExceptSelectedOne(void) +{ + return CountAlivePartyMonsExceptOne(gSpecialVar_0x8004); +} + +u8 StorageSystemGetPartySize(void) +{ + u16 i; + u16 count; + + for (i = 0, count = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(gPlayerParty + i, MON_DATA_SPECIES) != 0) + count++; + } + return count; +} + +u8 *unref_sub_8095C60(u8 *dest, const u8 *src, u16 pad) +{ + u8 *_dest = StringCopy(dest, src); + while (_dest < dest + pad) + { + *_dest++ = CHAR_SPACE; + } + *_dest = EOS; + return _dest; +} + +void sub_8095C8C(u16 *dest, u16 dest_left, u16 dest_top, const u16 *src, u16 src_left, u16 src_top, u16 dest_width, u16 dest_height, u16 src_width) +{ + u16 i; + + dest_width *= 2; + dest += dest_top * 0x20 + dest_left; + src += src_top * src_width + src_left; + for (i = 0; i < dest_height; i++) + { + CpuCopy16(src, dest, dest_width); + dest += 0x20; + src += src_width; + } +} + +#define MAX_DMA_BLOCK_SIZE 0x1000 +#define Dma3FillLarge_(value, dest, size, bit) \ +{ \ + void *_dest = dest; \ + u32 _size = size; \ + while (1) \ + { \ + if (_size <= MAX_DMA_BLOCK_SIZE) \ + { \ + DmaFill##bit(3, value, _dest, _size); \ + break; \ + } \ + DmaFill##bit(3, value, _dest, MAX_DMA_BLOCK_SIZE); \ + _dest += MAX_DMA_BLOCK_SIZE; \ + _size -= MAX_DMA_BLOCK_SIZE; \ + } \ +} + +#define Dma3FillLarge16_(value, dest, size) Dma3FillLarge_(value, dest, size, 16) +#define Dma3FillLarge32_(value, dest, size) Dma3FillLarge_(value, dest, size, 32) + +void unref_sub_8095D08(u16 *dest, u16 dest_left, u16 dest_top, u16 width, u16 height) +{ + u16 i; + + dest += dest_top * 0x20 + dest_left; + width *= 2; + for (i = 0; i < height; dest += 0x20, i++) + Dma3FillLarge16_(0, dest, width); +} + +s16 StorageSystemGetNextMonIndex(struct BoxPokemon *box, s8 startIdx, u8 stopIdx, u8 mode) +{ + s16 i; + s16 direction; + if (mode == 0 || mode == 2) + { + direction = 1; + } + else + { + direction = -1; + } + if (mode == 2 || mode == 3) + { + for (i = startIdx + direction; i >= 0 && i <= stopIdx; i += direction) + { + if (GetBoxMonData(box + i, MON_DATA_SPECIES) != 0) + return i; + } + } + else + { + for (i = startIdx + direction; i >= 0 && i <= stopIdx; i += direction) + { + if (GetBoxMonData(box + i, MON_DATA_SPECIES) != 0 && !GetBoxMonData(box + i, MON_DATA_IS_EGG)) + return i; + } + } + return -1; +} - text = gUnknown_083B6DF4[index].text; - stringLength = &text[StringLength(text)] + 1; +void StorageSystemClearMessageWindow(void) +{ + Menu_BlankWindowRect(2, 15, 27, 18); +} - ptr = StringCopy(gUnk2002694, gUnknown_083B6DF4[index].text); - ptr = StringCopy(ptr, gUnk20011fa); - ptr = StringCopy(ptr, stringLength); +void Task_PokemonStorageSystem(u8 taskId) +{ + struct Task *task = gTasks + taskId; + switch (task->data[0]) + { + case 0: + StorageSystemCreatePrimaryMenu(task->data[1]); + Menu_DisplayDialogueFrame(); + Menu_PrintText(gUnknown_083B600C[task->data[1]].desc, 2, 15); + task->data[0]++; + break; + case 1: + if (IsWeatherNotFadingIn()) + { + task->data[0]++; + } + break; + case 2: + task->data[2] = Menu_ProcessInput(); + switch(task->data[2]) + { + case -2: + task->data[3] = task->data[1]; + if (gMain.newKeys & DPAD_UP && --task->data[3] < 0) + task->data[3] = 3; + + if (gMain.newKeys & DPAD_DOWN && ++task->data[3] > 3) + task->data[3] = 0; + if (task->data[1] != task->data[3]) + { + task->data[1] = task->data[3]; + StorageSystemClearMessageWindow(); + Menu_PrintText(gUnknown_083B600C[task->data[1]].desc, 2, 15); + } + break; + case -1: + case 3: + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 13, 9); + ScriptContext2_Disable(); + EnableBothScriptContexts(); + DestroyTask(taskId); + break; + default: + if (task->data[2] == 0 && StorageSystemGetPartySize() == PARTY_SIZE) + { + StorageSystemClearMessageWindow(); + Menu_PrintText(gPCText_PartyFull2, 2, 15); + task->data[0] = 3; + } + else if (task->data[2] == 1 && StorageSystemGetPartySize() == 1) + { + StorageSystemClearMessageWindow(); + Menu_PrintText(gPCText_OnlyOne, 2, 15); + task->data[0] = 3; + } + else + { + FadeScreen(1, 0); + task->data[0] = 4; + } + break; + } + break; + case 3: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + StorageSystemClearMessageWindow(); + Menu_PrintText(gUnknown_083B600C[task->data[1]].desc, 2, 15); + task->data[0] = 2; + } + else if (gMain.newKeys & DPAD_UP) + { + if (--task->data[1] < 0) + task->data[1] = 3; + Menu_MoveCursor(-1); + task->data[1] = Menu_GetCursorPos(); + StorageSystemClearMessageWindow(); + Menu_PrintText(gUnknown_083B600C[task->data[1]].desc, 2, 15); + task->data[0] = 2; + } + else if (gMain.newKeys & DPAD_DOWN) + { + if (++task->data[1] > 3) + task->data[1] = 0; + Menu_MoveCursor(1); + task->data[1] = Menu_GetCursorPos(); + StorageSystemClearMessageWindow(); + Menu_PrintText(gUnknown_083B600C[task->data[1]].desc, 2, 15); + task->data[0] = 2; + } + break; + case 4: + if (!gPaletteFade.active) + { + task_intro_29(task->data[2]); + DestroyTask(taskId); + } + break; } - break; +} + +void ShowPokemonStorageSystem(void) +{ + u8 taskId = CreateTask(Task_PokemonStorageSystem, 80); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = 0; + ScriptContext2_Enable(); +} + +void FieldCB_ReturnToOverworld(void) +{ + u8 taskId = CreateTask(Task_PokemonStorageSystem, 80); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = gUnknown_02038474; + pal_fill_black(); +} - case 6: - // "Bye-bye, ".substr(0, -1) + {var} + "Bye-bye, !".substr(-1, 1) +void StorageSystemCreatePrimaryMenu(u8 whichMenu) +{ + Menu_DrawStdWindowFrame(0, 0, 13, 9); + Menu_PrintItems(1, 1, 4, (const struct MenuAction *)gUnknown_083B600C); + InitMenu(0, 1, 1, 4, whichMenu, 12); +} + +void sub_80961A8(void) +{ + gUnknown_02038474 = gPokemonStorageSystemPtr->unk_0005; + gFieldCallback = FieldCB_ReturnToOverworld; + SetMainCallback2(c2_exit_to_overworld_2_switch); +} + +void ResetPokemonStorageSystem(void) +{ + u16 boxId; + u16 boxMon; + + gPokemonStorage.currentBox = 0; + for (boxId = 0; boxId < 14; boxId++) + { + for (boxMon = 0; boxMon < 30; boxMon++) + { + ZeroBoxMonData(gPokemonStorage.boxes[boxId] + boxMon); + } + } + for (boxId = 0; boxId < 14; boxId++) { - u8 *stringLength; - u8 *text; + u8 *dest = StringCopy(gPokemonStorage.boxNames[boxId], gPCText_BOX); + ConvertIntToDecimalStringN(dest, boxId + 1, STR_CONV_MODE_LEFT_ALIGN, 2); + } + for (boxId = 0; boxId < 14; boxId++) + { + gPokemonStorage.wallpaper[boxId] = boxId & 0x03; + } +} + +#if DEBUG +__attribute__((naked)) +void debug_sub_80A3904(void) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + mov r7, sl\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5, r6, r7}\n\ + add sp, sp, #0xffffffe4\n\ + mov r0, #0x0\n\ + mov r8, r0\n\ + mov r7, r8\n\ + mov r1, #0x14\n\ + str r1, [sp, #0x18]\n\ + mov r2, #0xff\n\ + mov r9, r2\n\ +._162:\n\ + mov r5, #0x0\n\ + cmp r7, #0\n\ + beq ._160 @cond_branch\n\ + mov r0, #0xe\n\ + mov r8, r0\n\ + b ._158\n\ +._160:\n\ + bl Random\n\ + lsl r0, r0, #0x10\n\ + lsr r0, r0, #0x10\n\ + str r0, [sp, #0x14]\n\ + mov r2, r8\n\ + lsl r1, r2, #0x2\n\ + add r1, r1, r8\n\ + lsl r3, r1, #0x4\n\ + sub r3, r3, r1\n\ + lsl r3, r3, #0x5\n\ + lsl r1, r5, #0x2\n\ + add r1, r1, r5\n\ + lsl r1, r1, #0x4\n\ + ldr r2, ._163 @ gPokemonStorage\n\ + add r1, r1, r2\n\ + add r6, r3, r1\n\ + ldr r2, ._163 + 4 @ gUnknown_Debug_083E05F0\n\ + lsl r1, r7, #0x1\n\ + add r1, r1, r2\n\ + ldrh r4, [r1]\n\ + add r5, r5, #0x1\n\ + lsl r2, r5, #0x18\n\ + lsr r2, r2, #0x18\n\ + mov r1, #0x0\n\ + str r1, [sp]\n\ + str r1, [sp, #0x4]\n\ + mov r1, #0x1\n\ + mov sl, r1\n\ + str r1, [sp, #0x8]\n\ + str r0, [sp, #0xc]\n\ + add r0, r6, #0\n\ + add r1, r4, #0\n\ + mov r3, #0x20\n\ + bl CreateBoxMon\n\ + cmp r4, #0\n\ + beq ._157 @cond_branch\n\ + cmp r4, #0xac\n\ + bne ._156 @cond_branch\n\ + add r0, sp, #0x10\n\ + mov r2, sl\n\ + strb r2, [r0]\n\ + add r0, r6, #0\n\ + mov r1, #0x2d\n\ + add r2, sp, #0x10\n\ + bl SetBoxMonData\n\ +._156:\n\ + bl Random\n\ + mov r1, r9\n\ + and r1, r1, r0\n\ + str r1, [sp, #0x14]\n\ + add r4, sp, #0x14\n\ + add r0, r6, #0\n\ + mov r1, #0x16\n\ + add r2, r4, #0\n\ + bl SetBoxMonData\n\ + bl Random\n\ + mov r1, r9\n\ + and r1, r1, r0\n\ + str r1, [sp, #0x14]\n\ + add r0, r6, #0\n\ + mov r1, #0x17\n\ + add r2, r4, #0\n\ + bl SetBoxMonData\n\ + bl Random\n\ + mov r1, r9\n\ + and r1, r1, r0\n\ + str r1, [sp, #0x14]\n\ + add r0, r6, #0\n\ + mov r1, #0x18\n\ + add r2, r4, #0\n\ + bl SetBoxMonData\n\ + bl Random\n\ + mov r1, r9\n\ + and r1, r1, r0\n\ + str r1, [sp, #0x14]\n\ + add r0, r6, #0\n\ + mov r1, #0x21\n\ + add r2, r4, #0\n\ + bl SetBoxMonData\n\ + bl Random\n\ + mov r1, r9\n\ + and r1, r1, r0\n\ + str r1, [sp, #0x14]\n\ + add r0, r6, #0\n\ + mov r1, #0x2f\n\ + add r2, r4, #0\n\ + bl SetBoxMonData\n\ + bl Random\n\ + mov r1, r9\n\ + and r1, r1, r0\n\ + str r1, [sp, #0x14]\n\ + add r0, r6, #0\n\ + mov r1, #0x30\n\ + add r2, r4, #0\n\ + bl SetBoxMonData\n\ + ldr r0, [sp, #0x18]\n\ + cmp r0, #0\n\ + beq ._157 @cond_branch\n\ + sub r0, r0, #0x1\n\ + lsl r0, r0, #0x10\n\ + lsr r0, r0, #0x10\n\ + str r0, [sp, #0x18]\n\ + mov r1, sl\n\ + str r1, [sp, #0x14]\n\ + add r0, r6, #0\n\ + mov r1, #0x32\n\ + add r2, r4, #0\n\ + bl SetBoxMonData\n\ +._157:\n\ + add r0, r7, #1\n\ + lsl r0, r0, #0x10\n\ + lsr r7, r0, #0x10\n\ + lsl r0, r5, #0x10\n\ + lsr r5, r0, #0x10\n\ + cmp r5, #0x1d\n\ + bhi ._158 @cond_branch\n\ + cmp r7, #0\n\ + bne ._159 @cond_branch\n\ + b ._160\n\ +._159:\n\ + mov r2, #0xe\n\ + mov r8, r2\n\ +._158:\n\ + mov r0, r8\n\ + add r0, r0, #0x1\n\ + lsl r0, r0, #0x10\n\ + lsr r0, r0, #0x10\n\ + mov r8, r0\n\ + cmp r0, #0xd\n\ + bhi ._161 @cond_branch\n\ + b ._162\n\ +._161:\n\ + add sp, sp, #0x1c\n\ + pop {r3, r4, r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov sl, r5\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._164:\n\ + .align 2, 0\n\ +._163:\n\ + .word gPokemonStorage+0x4\n\ + .word gUnknown_Debug_083E05F0"); +} +#endif + +void sub_8096264(struct UnkPSSStruct_2002370 *a0, u16 tileTag, u16 palTag, u8 a3) +{ + struct SpritePalette palette = { + gBoxSelectionPopupPalette, palTag + }; + struct SpriteSheet sheets[] = { + {gBoxSelectionPopupCenterTiles, 0x800, tileTag}, + {gBoxSelectionPopupSidesTiles, 0x180, tileTag + 1}, + {} + }; + LoadSpritePalette(&palette); + LoadSpriteSheets(sheets); + gUnknown_02038478 = a0; + a0->unk_0240 = tileTag; + a0->unk_0242 = palTag; + a0->unk_023e = a3; +} - text = gUnknown_083B6DF4[index].text; - stringLength = &text[StringLength(text)] - 1; +void sub_8096310(void) +{ + FreeSpritePaletteByTag(gUnknown_02038478->unk_0242); + FreeSpriteTilesByTag(gUnknown_02038478->unk_0240); + FreeSpriteTilesByTag(gUnknown_02038478->unk_0240 + 1); +} + +void sub_809634C(u8 curBox) +{ + sub_80963D0(curBox); +} + +void sub_809635C(void) +{ + sub_809658C(); +} - ptr = StringCopy(gUnk2002694, gUnknown_083B6DF4[index].text); - ptr = StringCopy(ptr - 1, gUnk20026e4); - ptr = StringCopy(ptr, stringLength); +u8 sub_8096368(void) +{ + if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + return 201; + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + return gUnknown_02038478->curBox; } - break; + if (gMain.newKeys & DPAD_LEFT) + { + PlaySE(SE_SELECT); + sub_809662C(); + } + else if (gMain.newKeys & DPAD_RIGHT) + { + PlaySE(SE_SELECT); + sub_80965F8(); + } + return 200; +} + +void sub_80963D0(u8 curBox) +{ + u16 i; + u8 spriteId; + struct SpriteTemplate template; + struct OamData oamData = {}; + oamData.size = 3; + oamData.paletteNum = 1; + template = (struct SpriteTemplate){ + 0, 0, &oamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy + }; + + gUnknown_02038478->curBox = curBox; + template.tileTag = gUnknown_02038478->unk_0240; + template.paletteTag = gUnknown_02038478->unk_0242; + + spriteId = CreateSprite(&template, 0xA0, 0x60, 0); + gUnknown_02038478->unk_0000 = gSprites + spriteId; - case 0: - default: - ptr = StringCopy(gUnk2002694, gUnknown_083B6DF4[index].text); - break; + oamData.shape = ST_OAM_V_RECTANGLE; + oamData.size = 1; + template.tileTag = gUnknown_02038478->unk_0240 + 1; + template.anims = gSpriteAnimTable_83B604C; + for (i = 0; i < 4; i++) + { + u16 r5; + spriteId = CreateSprite(&template, 0x7c, 0x50, gUnknown_02038478->unk_023e); + gUnknown_02038478->unk_0004[i] = gSprites + spriteId; + r5 = 0; + if (i & 2) + { + gUnknown_02038478->unk_0004[i]->pos1.x = 0xc4; + r5 = 2; + } + if (i & 1) + { + gUnknown_02038478->unk_0004[i]->pos1.y = 0x70; + gUnknown_02038478->unk_0004[i]->oam.size = 0; + r5++; + } + StartSpriteAnim(gUnknown_02038478->unk_0004[i], r5); + } + for (i = 0; i < 2; i++) + { + gUnknown_02038478->unk_0020[i] = sub_809A9A0(72 * i + 0x7c, 0x58, i, 0, gUnknown_02038478->unk_023e); + if (gUnknown_02038478->unk_0020[i]) + { + gUnknown_02038478->unk_0020[i]->data[0] = (i == 0 ? -1 : 1); + gUnknown_02038478->unk_0020[i]->callback = sub_8096784; + } } + sub_809665C(); +} - while (ptr < gUnk20026A6) +void sub_809658C(void) +{ + u16 i; + if (gUnknown_02038478->unk_0000) + { + DestroySprite(gUnknown_02038478->unk_0000); + gUnknown_02038478->unk_0000 = NULL; + } + for (i = 0; i < 4; i++) + { + if (gUnknown_02038478->unk_0004[i]) + { + DestroySprite(gUnknown_02038478->unk_0004[i]); + gUnknown_02038478->unk_0004[i] = NULL; + } + } + for (i = 0; i < 2; i++) { - ptr[0] = CHAR_SPACE; - ptr++; + if (gUnknown_02038478->unk_0020[i]) + DestroySprite(gUnknown_02038478->unk_0020[i]); } +} + +void sub_80965F8(void) +{ + if (++gUnknown_02038478->curBox > 13) + gUnknown_02038478->curBox = 0; + sub_809665C(); +} + +void sub_809662C(void) +{ + gUnknown_02038478->curBox = (gUnknown_02038478->curBox == 0 ? 13 : gUnknown_02038478->curBox - 1); + sub_809665C(); +} + +void sub_809665C(void) +{ + u8 nPokemonInBox = CountPokemonInBoxN(gUnknown_02038478->curBox); + u8 *stringVar = gStringVar1; + + stringVar[0] = EXT_CTRL_CODE_BEGIN; + stringVar[1] = 0x04; // EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW + stringVar[2] = 0x0F; // TEXT_COLOR_WHITE2 + stringVar[3] = 0x01; // TEXT_COLOR_DARK_GREY + stringVar[4] = 0x0E; // TEXT_COLOR_LIGHT_BLUE + stringVar += 5; + + stringVar = StringCopy(stringVar, gPokemonStorage.boxNames[gUnknown_02038478->curBox]); - ptr[0] = EOS; - MenuPrint(gUnk2002694, 11, 17); + stringVar[0] = CHAR_NEWLINE; + stringVar[1] = EXT_CTRL_CODE_BEGIN; + stringVar[2] = 0x11; // EXT_CTRL_CODE_CLEAR + if (nPokemonInBox < 10) + stringVar[3] = 0x28; + else + stringVar[3] = 0x22; + stringVar += 4; + + stringVar = ConvertIntToDecimalString(stringVar, nPokemonInBox); + + stringVar[0] = CHAR_SLASH; + stringVar[1] = CHAR_0 + 3; + stringVar[2] = CHAR_0 + 0; + stringVar[3] = EOS; + sub_80966F4(gStringVar1, 0, 1); +} + +void sub_80966F4(const u8 *sourceString, u16 x, u16 y) +{ + u16 *vdest = (u16 *)(BG_CHAR_ADDR(4) + (GetSpriteTileStartByTag(gUnknown_02038478->unk_0240) * 32) + y * 256 + x * 32); + u8 *tileBuff = gUnknown_083B6DB8; + DmaFill16(3, 0x1111, tileBuff, 0x400); + Text_InitWindow8004E3C(&gWindowTemplate_81E6D38, tileBuff, sourceString); + DmaCopy16(3, tileBuff, vdest, 0x400); +} + +void sub_8096784(struct Sprite *sprite) +{ + if (++sprite->data[1] > 3) + { + sprite->data[1] = 0; + sprite->pos2.x += sprite->data[0]; + if (++sprite->data[2] > 5) + { + sprite->data[2] = 0; + sprite->pos2.x = 0; + } + } } diff --git a/src/pokemon/pokemon_storage_system_2.c b/src/pokemon/pokemon_storage_system_2.c new file mode 100644 index 000000000..2f12b6bfa --- /dev/null +++ b/src/pokemon/pokemon_storage_system_2.c @@ -0,0 +1,3058 @@ + +// Includes +#include "global.h" +#include "decompress.h" +#include "constants/songs.h" +#include "constants/species.h" +#include "data2.h" +#include "sound.h" +#include "ewram.h" +#include "task.h" +#include "main.h" +#include "palette.h" +#include "menu.h" +#include "graphics.h" +#include "strings.h" +#include "string_util.h" +#include "pokemon_summary_screen.h" +#include "mail_data.h" +#include "naming_screen.h" +#include "pokemon_storage_system.h" + +// Static type declarations + +// Static RAM declarations + +EWRAM_DATA u8 gUnknown_0203847C = 0; +EWRAM_DATA u8 gUnknown_0203847D = 0; +EWRAM_DATA u8 gUnknown_0203847E = 0; +EWRAM_DATA u8 gUnknown_0203847F = 0; + +// Static ROM declarations + +void sub_8096884(void); +void sub_8096AFC(void); +void sub_8096B38(void); +void SetPSSCallback(void (*func)(void)); +void sub_8096BF0(void); +void sub_8096C68(void); +void sub_8096C84(void); +void sub_8096FC8(void); +void sub_8097004(void); +void sub_8097078(void); +void sub_80972A8(void); +void sub_80972FC(void); +void c3_0808DC50(void); +void sub_8097390(void); +void sub_809746C(void); +void sub_8097594(void); +void sub_8097788(void); +void sub_80977E4(void); +void sub_8097858(void); +void sub_809789C(void); +void sub_8097974(void); +void sub_8097A64(void); +void sub_8097B44(void); +void sub_8097BA0(void); +void sub_8097CC0(void); +void sub_8097DE0(void); +void sub_8097E44(void); +void sub_8097E70(void); +void sub_8097F58(void); +void sub_8097FB8(void); +void sub_809801C(void); +void BoxSetMosaic(void); +void sub_8098090(struct Sprite *sprite); +void sub_80980D4(void); +void sub_80981F0(u16 species, u32 pid); +void sub_80982B4(void); +void sub_8098350(void); +void sub_8098400(void); +void add_to_c3_somehow(void); +void sub_8098780(void); +void sub_8098690(bool8 flag); +bool8 sub_80985CC(void); +void sub_80986E8(void); +void sub_8098710(void); +void sub_8098734(void); +void sub_80987DC(void); +void sub_809880C(void); +bool8 sub_8098830(void); +void PrintStorageActionText(u8 index); +void sub_8098A38(s8); +void sub_8098A5C(void); +void sub_8098A80(void); +void sub_8098AA8(u8 a0); + +// .rodata + +const u16 gPokemonStorageScrollingBGPalette[] = INCBIN_U16("graphics/pokemon_storage/scrolling_bg.gbapal"); + +const u16 gPokemonStorageScrollingBGTile[] = INCBIN_U16("graphics/pokemon_storage/scrolling_bg.4bpp"); + +const u8 gPokemonStorageScrollingBGTilemap[] = INCBIN_U8("graphics/pokemon_storage/scrolling_bg_map.bin.lz"); + +const u16 sUnknownTilemap[] = { + 0x1281, + 0x1282, + 0x1283, + 0x1284, + 0x1285, + 0x1286, + 0x1287, + 0x1288, + 0x128C, + 0x128D, + 0x128E, + 0x128F, + 0x1290, + 0x1291, + 0x1292, + 0x1293, + 0x0281, + 0x0282, + 0x0283, + 0x0284, + 0x0285, + 0x0286, + 0x0287, + 0x0288, + 0x028C, + 0x028D, + 0x028E, + 0x028F, + 0x0290, + 0x0291, + 0x0292, + 0x0293, + 0x12AD, + 0x12AE, + 0x12A8, + 0x12A8 +}; + +const u16 WaveformPalette[] = INCBIN_U16("graphics/pokemon_storage/waveform.gbapal"); + +const u8 WaveformTiles[] = INCBIN_U8("graphics/pokemon_storage/waveform.4bpp"); + +const u16 gUnknown_083B6D74[] = INCBIN_U16("graphics/pokemon_storage/83B6D74.gbapal"); + +const u16 gUnknown_083B6D94[] = INCBIN_U16("graphics/pokemon_storage/83B6D94.gbapal"); + +struct PokemonStorageSystemData *const gPokemonStorageSystemPtr = &ePokemonStorageSystem; + +u8 *const gUnknown_083B6DB8 = gTileBuffer; + +const struct SpritePalette gWaveformSpritePalette = { + WaveformPalette, 0xdacd +}; + +// .text + +void task_intro_29(u8 whichMenu) +{ + gUnknown_0203847D = whichMenu; + gPokemonStorageSystemPtr->unk_0005 = whichMenu; + SetMainCallback2(sub_8096884); +} + +void sub_80967DC(void) +{ + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2VOFS = 0; + REG_BG2HOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; +} + +void sub_8096804(void) +{ + ResetPaletteFade(); + ResetSpriteData(); + FreeSpriteTileRanges(); + FreeAllSpritePalettes(); + ResetTasks(); + gReservedSpriteTileCount = 0x280; + sub_809CFDC(&gPokemonStorageSystemPtr->unk_0020, gPokemonStorageSystemPtr->unk_0028, 8); + gKeyRepeatStartDelay = 20; +} + +void sub_8096848(void) +{ + sub_809B0D4(); + gUnknown_0203847C = (gPokemonStorageSystemPtr->unk_0005 == 1 ? 1 : 0); + gUnknown_0203847E = 0; +} + +void sub_8096874(void) +{ + REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; +} + +#if DEBUG +__attribute__((naked)) +void sub_8096884(void) +{ + asm("\ + push {r4, lr}\n\ + ldr r0, ._223 @ gMain\n\ + ldr r1, ._223 + 4 @ 0x43c\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x9\n\ + bls ._221 @cond_branch\n\ + b ._222\n\ +._221:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._223 + 8 @ \n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._224:\n\ + .align 2, 0\n\ +._223:\n\ + .word gMain\n\ + .word 0x43c\n\ + .word ._225\n\ +._225:\n\ + .word ._226\n\ + .word ._227\n\ + .word ._228\n\ + .word ._229\n\ + .word ._230\n\ + .word ._231\n\ + .word ._232\n\ + .word ._233\n\ + .word ._234\n\ + .word ._235\n\ +._226:\n\ + mov r0, #0x0\n\ + bl SetVBlankCallback\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x13\n\ + mov r4, #0x0\n\ + strh r4, [r0]\n\ + bl sub_8096804\n\ + ldr r0, ._237 @ unk_2038790\n\ + strb r4, [r0]\n\ + b ._250\n\ +._238:\n\ + .align 2, 0\n\ +._237:\n\ + .word unk_2038790\n\ +._227:\n\ + ldr r0, ._240 @ gWindowTemplate_81E6D00\n\ + bl Text_LoadWindowTemplate\n\ + b ._250\n\ +._241:\n\ + .align 2, 0\n\ +._240:\n\ + .word gWindowTemplate_81E6D00\n\ +._228:\n\ + ldr r0, ._243 @ gWindowTemplate_81E6D00\n\ + bl InitMenuWindow\n\ + bl Menu_EraseScreen\n\ + b ._250\n\ +._244:\n\ + .align 2, 0\n\ +._243:\n\ + .word gWindowTemplate_81E6D00\n\ +._229:\n\ + bl sub_80967DC\n\ + bl sub_8096848\n\ + b ._250\n\ +._230:\n\ + bl ResetPSSMonIconSprites\n\ + bl sub_809AA24\n\ + b ._250\n\ +._231:\n\ + bl sub_8097DE0\n\ + b ._250\n\ +._232:\n\ + bl sub_8097E70\n\ + b ._250\n\ +._233:\n\ + bl sub_8098400\n\ + b ._250\n\ +._234:\n\ + ldr r0, ._251 @ gPokemonStorage\n\ + ldrb r0, [r0]\n\ + bl sub_8099BF8\n\ + ldr r2, ._251 + 4 @ 0x2000000\n\ + ldr r1, ._251 + 8 @ 0x12bc\n\ + add r0, r2, r1\n\ + mov r1, #0xa\n\ + strh r1, [r0]\n\ + ldr r1, ._251 + 12 @ 0x12be\n\ + add r2, r2, r1\n\ + ldr r1, ._251 + 16 @ 0xdacb\n\ + strh r1, [r2]\n\ + bl sub_80F727C\n\ + bl sub_80F7404\n\ + b ._250\n\ +._252:\n\ + .align 2, 0\n\ +._251:\n\ + .word gPokemonStorage\n\ + .word 0x2000000\n\ + .word 0x12bc\n\ + .word 0x12be\n\ + .word 0xdacb\n\ +._235:\n\ + bl sub_8096874\n\ + ldr r0, ._253 @ sub_8096BF0\n\ + bl SetPSSCallback\n\ + ldr r0, ._253 + 4 @ sub_8096B38\n\ + bl SetMainCallback2\n\ + ldr r0, ._253 + 8 @ sub_8096AFC\n\ + bl SetVBlankCallback\n\ +._250:\n\ + ldr r1, ._253 + 12 @ gMain\n\ + ldr r0, ._253 + 16 @ 0x43c\n\ + add r1, r1, r0\n\ + ldrb r0, [r1]\n\ + add r0, r0, #0x1\n\ + strb r0, [r1]\n\ +._222:\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ +._254:\n\ + .align 2, 0\n\ +._253:\n\ + .word sub_8096BF0+1\n\ + .word sub_8096B38+1\n\ + .word sub_8096AFC+1\n\ + .word gMain\n\ + .word 0x43c"); +} +#else +void sub_8096884(void) +{ + switch (gMain.state) + { + case 0: + SetVBlankCallback(NULL); + REG_DISPCNT = 0; + sub_8096804(); + gMain.state++; + break; + case 1: + Text_LoadWindowTemplate(&gWindowTemplate_81E6D00); + gMain.state++; + break; + case 2: + InitMenuWindow(&gWindowTemplate_81E6D00); + Menu_EraseScreen(); + gMain.state++; + break; + case 3: + sub_80967DC(); + sub_8096848(); + gMain.state++; + break; + case 4: + ResetPSSMonIconSprites(); + sub_809AA24(); + gMain.state++; + break; + case 5: + sub_8097DE0(); + gMain.state++; + break; + case 6: + sub_8097E70(); + gMain.state++; + break; + case 7: + sub_8098400(); + gMain.state++; + break; + case 8: + sub_8099BF8(gPokemonStorage.currentBox); + gPokemonStorageSystemPtr->unk_12bc.baseTileTag = 0x000a; + gPokemonStorageSystemPtr->unk_12bc.basePaletteTag = 0xdacb; + sub_80F727C(&gPokemonStorageSystemPtr->unk_12bc); + sub_80F7404(); + gMain.state++; + break; + case 9: + sub_8096874(); + SetPSSCallback(sub_8096BF0); + SetMainCallback2(sub_8096B38); + SetVBlankCallback(sub_8096AFC); + gMain.state++; + break; + } +} +#endif + +void sub_80969A0(void) +{ + switch (gMain.state) + { + case 0: + SetVBlankCallback(NULL); + REG_DISPCNT = 0x0000; + gPokemonStorageSystemPtr->unk_0005 = gUnknown_0203847D; + sub_8096804(); + if (gUnknown_0203847F == 1) + sub_809BBC0(); + if (gUnknown_0203847F == 0) + sub_809BD14(); + gMain.state++; + break; + case 1: + Text_LoadWindowTemplate(&gWindowTemplate_81E6D00); + gMain.state++; + break; + case 2: + InitMenuWindow(&gWindowTemplate_81E6D00); + Menu_EraseScreen(); + gMain.state++; + break; + case 3: + sub_80967DC(); + gMain.state++; + break; + case 4: + ResetPSSMonIconSprites(); + sub_809AA98(); + gMain.state++; + break; + case 5: + sub_8097DE0(); + gMain.state++; + break; + case 6: + sub_8097E70(); + gMain.state++; + break; + case 7: + sub_8098400(); + gMain.state++; + break; + case 8: + sub_8099BF8(gPokemonStorage.currentBox); + gPokemonStorageSystemPtr->unk_12bc.baseTileTag = 0x000a; + gPokemonStorageSystemPtr->unk_12bc.basePaletteTag = 0xdacb; + sub_80F727C(&gPokemonStorageSystemPtr->unk_12bc); + sub_80F7404(); + gMain.state++; + break; + case 9: + BeginNormalPaletteFade(0xffffffff, 0, 16, 0, 0); + SetVBlankCallback(sub_8096AFC); + gMain.state++; + break; + case 10: + sub_8096874(); + SetPSSCallback(sub_8096C68); + SetMainCallback2(sub_8096B38); + gMain.state++; + break; + } +} + +#if DEBUG +__attribute__((naked)) +void debug_sub_80A4300() +{ + asm("\ + push {lr}\n\ + ldr r1, ._296 @ gUnknown_0203847D\n\ + mov r0, #0x0\n\ + strb r0, [r1]\n\ + ldr r1, ._296 + 4 @ 0x2000000\n\ + mov r0, #0x0\n\ + strb r0, [r1, #0x5]\n\ + bl sub_8096884\n\ + ldr r0, ._296 + 8 @ gMain\n\ + ldr r1, [r0, #0x4]\n\ + ldr r0, ._296 + 12 @ sub_8096B38\n\ + cmp r1, r0\n\ + bne ._295 @cond_branch\n\ + ldr r1, ._296 + 16 @ unk_2038790\n\ + mov r0, #0x1\n\ + strb r0, [r1]\n\ +._295:\n\ + pop {r0}\n\ + bx r0\n\ +._297:\n\ + .align 2, 0\n\ +._296:\n\ + .word gUnknown_0203847D\n\ + .word 0x2000000\n\ + .word gMain\n\ + .word sub_8096B38+1\n\ + .word unk_2038790"); +} + +__attribute__((naked)) +void debug_sub_80A433C() +{ + asm("\ + push {lr}\n\ + ldr r2, ._298 @ unk_2038794\n\ + str r1, [r2]\n\ + ldr r1, ._298 + 4 @ unk_2038798\n\ + str r0, [r1]\n\ + ldr r0, ._298 + 8 @ debug_sub_80A4300\n\ + bl SetMainCallback2\n\ + pop {r0}\n\ + bx r0\n\ +._299:\n\ + .align 2, 0\n\ +._298:\n\ + .word unk_2038794\n\ + .word unk_2038798\n\ + .word debug_sub_80A4300+1"); +} + +__attribute__((naked)) +void debug_sub_80A435C() +{ + asm("\ + push {r4, r5, lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r5, ._303 @ 0x2000000\n\ + ldrb r4, [r5, #0x4]\n\ + cmp r4, #0\n\ + beq ._300 @cond_branch\n\ + cmp r4, #0x1\n\ + beq ._301 @cond_branch\n\ + b ._308\n\ +._304:\n\ + .align 2, 0\n\ +._303:\n\ + .word 0x2000000\n\ +._300:\n\ + ldr r0, ._306 @ unk_2038798\n\ + ldr r0, [r0]\n\ + bl unref_sub_809CB94\n\ + mov r0, #0x1\n\ + neg r0, r0\n\ + str r4, [sp]\n\ + mov r1, #0x0\n\ + mov r2, #0x0\n\ + mov r3, #0x10\n\ + bl BeginNormalPaletteFade\n\ + ldrb r0, [r5, #0x4]\n\ + add r0, r0, #0x1\n\ + strb r0, [r5, #0x4]\n\ + b ._308\n\ +._307:\n\ + .align 2, 0\n\ +._306:\n\ + .word unk_2038798\n\ +._301:\n\ + bl UpdatePaletteFade\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._308 @cond_branch\n\ + ldr r0, ._309 @ unk_2038794\n\ + ldr r0, [r0]\n\ + bl _call_via_r0\n\ +._308:\n\ + add sp, sp, #0x4\n\ + pop {r4, r5}\n\ + pop {r0}\n\ + bx r0\n\ +._310:\n\ + .align 2, 0\n\ +._309:\n\ + .word unk_2038794"); +} +#endif + +void sub_8096AFC(void) +{ + REG_BG2HOFS = gPokemonStorageSystemPtr->unk_08b4; + REG_BG3HOFS = gPokemonStorageSystemPtr->unk_000a; + REG_BG3VOFS = gPokemonStorageSystemPtr->unk_0008; + LoadOam(); + ProcessSpriteCopyRequests(); + sub_809CFF0(); + TransferPlttBuffer(); +} + +void sub_8096B38(void) +{ + gPokemonStorageSystemPtr->unk_0000(); + sub_8097E44(); + sub_8098734(); + AnimateSprites(); + BuildOamBuffer(); +} + +void sub_8096B5C(void) +{ + switch (gPokemonStorageSystemPtr->unk_0006) + { + case 0: + ShowPokemonSummaryScreen(gPokemonStorageSystemPtr->unk_2690.pokemon, gPokemonStorageSystemPtr->unk_268d, gPokemonStorageSystemPtr->unk_268c, sub_80969A0, gPokemonStorageSystemPtr->unk_268e); + break; + case 1: + DoNamingScreen(1, gPokemonStorage.boxNames[gPokemonStorage.currentBox], 0, 0, 0, sub_80969A0); + break; + } +} + +void SetPSSCallback(void (*func)(void)) +{ + gPokemonStorageSystemPtr->unk_0000 = func; + gPokemonStorageSystemPtr->unk_0004 = 0; +} + +void sub_8096BF0(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + BlendPalettes(0xffffffff, 16, 0); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + PlaySE(SE_PC_LOGON); + gPokemonStorageSystemPtr->unk_000c.tileTag = 14; + gPokemonStorageSystemPtr->unk_000c.paletteTag = 0xdad0; + gPokemonStorageSystemPtr->unk_000c.unk04 = 0; + gPokemonStorageSystemPtr->unk_000c.unk06 = 0; + sub_80C5CD4(&gPokemonStorageSystemPtr->unk_000c); + BlendPalettes(0xffffffff, 0, 0); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 2: + if (sub_80C5DCC()) + SetPSSCallback(sub_8096C84); + break; + } +} + +void sub_8096C68(void) +{ + if (!UpdatePaletteFade()) + SetPSSCallback(sub_8096C84); +} + +#if DEBUG +__attribute__((naked)) +void sub_8096C84(void) +{ + asm("\ + push {r4, lr}\n\ + ldr r0, ._347 @ 0x2000000\n\ + ldrb r0, [r0, #0x4]\n\ + cmp r0, #0x6\n\ + bls ._345 @cond_branch\n\ + b ._466\n\ +._345:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._347 + 4 @ \n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._348:\n\ + .align 2, 0\n\ +._347:\n\ + .word 0x2000000\n\ + .word ._349\n\ +._349:\n\ + .word ._350\n\ + .word ._351\n\ + .word ._352\n\ + .word ._353\n\ + .word ._354\n\ + .word ._355\n\ + .word ._356\n\ +._350:\n\ + bl sub_809CA40\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + sub r0, r0, #0x1\n\ + cmp r0, #0xf\n\ + bls ._357 @cond_branch\n\ + b ._466\n\ +._357:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._360 @ \n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._361:\n\ + .align 2, 0\n\ +._360:\n\ + .word ._359\n\ +._359:\n\ + .word ._362\n\ + .word ._466\n\ + .word ._466\n\ + .word ._365\n\ + .word ._366\n\ + .word ._367\n\ + .word ._368\n\ + .word ._369\n\ + .word ._370\n\ + .word ._371\n\ + .word ._372\n\ + .word ._373\n\ + .word ._374\n\ + .word ._375\n\ + .word ._376\n\ + .word ._377\n\ +._362:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldr r1, ._379 @ 0x2000000\n\ + mov r0, #0x1\n\ + strb r0, [r1, #0x4]\n\ + b ._466\n\ +._380:\n\ + .align 2, 0\n\ +._379:\n\ + .word 0x2000000\n\ +._366:\n\ + ldr r4, ._383 @ 0x2000000\n\ + ldrb r0, [r4, #0x5]\n\ + cmp r0, #0x2\n\ + beq ._381 @cond_branch\n\ + mov r0, #0x10\n\ + bl PrintStorageActionText\n\ + mov r0, #0x3\n\ + strb r0, [r4, #0x4]\n\ + b ._466\n\ +._384:\n\ + .align 2, 0\n\ +._383:\n\ + .word 0x2000000\n\ +._381:\n\ + bl sub_809B0D4\n\ + ldr r0, ._386 @ sub_8096FC8\n\ + bl SetPSSCallback\n\ + b ._466\n\ +._387:\n\ + .align 2, 0\n\ +._386:\n\ + .word sub_8096FC8+1\n\ +._367:\n\ + ldr r4, ._394 @ 0x2000000\n\ + ldrb r0, [r4, #0x5]\n\ + cmp r0, #0x2\n\ + beq ._388 @cond_branch\n\ + b ._466\n\ +._388:\n\ + bl sub_809BF20\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._391 @cond_branch\n\ + ldr r1, ._394 + 4 @ 0x11f2\n\ + add r0, r4, r1\n\ + ldrh r0, [r0]\n\ + bl ItemIsMail\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._391 @cond_branch\n\ + b ._392\n\ +._391:\n\ + ldr r0, ._394 + 8 @ sub_8097004\n\ + bl SetPSSCallback\n\ + b ._466\n\ +._395:\n\ + .align 2, 0\n\ +._394:\n\ + .word 0x2000000\n\ + .word 0x11f2\n\ + .word sub_8097004+1\n\ +._365:\n\ + ldr r0, ._399 @ unk_2038790\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._396 @cond_branch\n\ + b ._466\n\ +._396:\n\ + ldr r0, ._399 + 4 @ sub_8097BA0\n\ + bl SetPSSCallback\n\ + b ._466\n\ +._400:\n\ + .align 2, 0\n\ +._399:\n\ + .word unk_2038790\n\ + .word sub_8097BA0+1\n\ +._377:\n\ + ldr r0, ._404 @ unk_2038790\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._401 @cond_branch\n\ + b ._466\n\ +._401:\n\ + ldr r0, ._404 + 4 @ sub_8097CC0\n\ + bl SetPSSCallback\n\ + b ._466\n\ +._405:\n\ + .align 2, 0\n\ +._404:\n\ + .word unk_2038790\n\ + .word sub_8097CC0+1\n\ +._368:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldr r0, ._407 @ sub_809789C\n\ + bl SetPSSCallback\n\ + b ._466\n\ +._408:\n\ + .align 2, 0\n\ +._407:\n\ + .word sub_809789C+1\n\ +._369:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldr r0, ._410 @ sub_8097078\n\ + bl SetPSSCallback\n\ + b ._466\n\ +._411:\n\ + .align 2, 0\n\ +._410:\n\ + .word sub_8097078+1\n\ +._370:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldr r4, ._414 @ 0x2000000\n\ + ldr r0, ._414 + 4 @ gPokemonStorage\n\ + ldrb r0, [r0]\n\ + add r0, r0, #0x1\n\ + ldr r2, ._414 + 8 @ 0x8b2\n\ + add r1, r4, r2\n\ + strh r0, [r1]\n\ + cmp r0, #0xd\n\ + ble ._416 @cond_branch\n\ + mov r0, #0x0\n\ + b ._413\n\ +._415:\n\ + .align 2, 0\n\ +._414:\n\ + .word 0x2000000\n\ + .word gPokemonStorage\n\ + .word 0x8b2\n\ +._371:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldr r4, ._418 @ 0x2000000\n\ + ldr r0, ._418 + 4 @ gPokemonStorage\n\ + ldrb r0, [r0]\n\ + sub r0, r0, #0x1\n\ + ldr r2, ._418 + 8 @ 0x8b2\n\ + add r1, r4, r2\n\ + strh r0, [r1]\n\ + cmp r0, #0\n\ + bge ._416 @cond_branch\n\ + mov r0, #0xd\n\ +._413:\n\ + strh r0, [r1]\n\ +._416:\n\ + ldrb r0, [r1]\n\ + bl sub_8099C70\n\ + mov r0, #0x2\n\ + strb r0, [r4, #0x4]\n\ + b ._466\n\ +._419:\n\ + .align 2, 0\n\ +._418:\n\ + .word 0x2000000\n\ + .word gPokemonStorage\n\ + .word 0x8b2\n\ +._372:\n\ + bl sub_809BE80\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._428 @cond_branch\n\ + ldr r4, ._423 @ 0x2000000\n\ + ldr r1, ._423 + 4 @ 0x11f2\n\ + add r0, r4, r1\n\ + ldrh r0, [r0]\n\ + bl ItemIsMail\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._421 @cond_branch\n\ +._392:\n\ + mov r0, #0x5\n\ + strb r0, [r4, #0x4]\n\ + b ._466\n\ +._424:\n\ + .align 2, 0\n\ +._423:\n\ + .word 0x2000000\n\ + .word 0x11f2\n\ +._421:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldr r0, ._426 @ sub_809746C\n\ + bl SetPSSCallback\n\ + b ._466\n\ +._427:\n\ + .align 2, 0\n\ +._426:\n\ + .word sub_809746C+1\n\ +._374:\n\ + bl sub_809BE80\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._428 @cond_branch\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldr r0, ._430 @ sub_80972A8\n\ + bl SetPSSCallback\n\ + b ._466\n\ +._431:\n\ + .align 2, 0\n\ +._430:\n\ + .word sub_80972A8+1\n\ +._375:\n\ + bl sub_809BEBC\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._432 @cond_branch\n\ +._428:\n\ + ldr r1, ._434 @ 0x2000000\n\ + mov r0, #0x4\n\ + strb r0, [r1, #0x4]\n\ + b ._466\n\ +._435:\n\ + .align 2, 0\n\ +._434:\n\ + .word 0x2000000\n\ +._432:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldr r0, ._437 @ c3_0808DC50\n\ + bl SetPSSCallback\n\ + b ._466\n\ +._438:\n\ + .align 2, 0\n\ +._437:\n\ + .word c3_0808DC50+1\n\ +._373:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldr r0, ._440 @ sub_8097390\n\ + bl SetPSSCallback\n\ + b ._466\n\ +._441:\n\ + .align 2, 0\n\ +._440:\n\ + .word sub_8097390+1\n\ +._376:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldr r0, ._443 @ sub_80972FC\n\ + bl SetPSSCallback\n\ + b ._466\n\ +._444:\n\ + .align 2, 0\n\ +._443:\n\ + .word sub_80972FC+1\n\ +._351:\n\ + bl sub_809AC00\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._466 @cond_branch\n\ + bl sub_809BF48\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._446 @cond_branch\n\ + bl sub_80986E8\n\ + b ._447\n\ +._446:\n\ + bl sub_8098710\n\ +._447:\n\ + ldr r4, ._450 @ 0x2000000\n\ + ldr r2, ._450 + 4 @ 0x11f6\n\ + add r0, r4, r2\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._448 @cond_branch\n\ + bl BoxSetMosaic\n\ +._448:\n\ + mov r0, #0x0\n\ + strb r0, [r4, #0x4]\n\ + b ._466\n\ +._451:\n\ + .align 2, 0\n\ +._450:\n\ + .word 0x2000000\n\ + .word 0x11f6\n\ +._352:\n\ + bl sub_8099D34\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._466 @cond_branch\n\ + ldr r1, ._456 @ gPokemonStorage\n\ + ldr r0, ._456 + 4 @ 0x2000000\n\ + ldr r2, ._456 + 8 @ 0x8b2\n\ + add r0, r0, r2\n\ + ldrh r0, [r0]\n\ + strb r0, [r1]\n\ + ldr r0, ._456 + 12 @ gUnknown_0203847C\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + bne ._455 @cond_branch\n\ + bl sub_809BF20\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._455 @cond_branch\n\ + bl sub_809B440\n\ + bl BoxSetMosaic\n\ + b ._455\n\ +._457:\n\ + .align 2, 0\n\ +._456:\n\ + .word gPokemonStorage\n\ + .word 0x2000000\n\ + .word 0x8b2\n\ + .word gUnknown_0203847C\n\ +._353:\n\ + ldr r0, ._460 @ gMain\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0xf3\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._466 @cond_branch\n\ + bl sub_8098A5C\n\ +._455:\n\ + ldr r1, ._460 + 4 @ 0x2000000\n\ + mov r0, #0x0\n\ + strb r0, [r1, #0x4]\n\ + b ._466\n\ +._461:\n\ + .align 2, 0\n\ +._460:\n\ + .word gMain\n\ + .word 0x2000000\n\ +._354:\n\ + mov r0, #0x20\n\ + bl PlaySE\n\ + mov r0, #0xd\n\ + b ._462\n\ +._355:\n\ + mov r0, #0x20\n\ + bl PlaySE\n\ + mov r0, #0x16\n\ +._462:\n\ + bl PrintStorageActionText\n\ + ldr r1, ._464 @ 0x2000000\n\ + mov r0, #0x6\n\ + strb r0, [r1, #0x4]\n\ + b ._466\n\ +._465:\n\ + .align 2, 0\n\ +._464:\n\ + .word 0x2000000\n\ +._356:\n\ + ldr r0, ._467 @ gMain\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0xf3\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._466 @cond_branch\n\ + bl sub_8098A5C\n\ + ldr r0, ._467 + 4 @ sub_8096C84\n\ + bl SetPSSCallback\n\ +._466:\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ +._468:\n\ + .align 2, 0\n\ +._467:\n\ + .word gMain\n\ + .word sub_8096C84+1"); +} +#else +void sub_8096C84(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + switch (sub_809CA40()) + { + case 1: + PlaySE(SE_SELECT); + gPokemonStorageSystemPtr->unk_0004 = 1; + break; + case 5: + if (gPokemonStorageSystemPtr->unk_0005 != 2) + { + PrintStorageActionText(PC_TEXT_WHICH_ONE_WILL_TAKE); + gPokemonStorageSystemPtr->unk_0004 = 3; + } + else + { + sub_809B0D4(); + SetPSSCallback(sub_8096FC8); + } + break; + case 6: + if (gPokemonStorageSystemPtr->unk_0005 == 2) + { + if (sub_809BF20() && ItemIsMail(gPokemonStorageSystemPtr->unk_11f2)) + { + gPokemonStorageSystemPtr->unk_0004 = 5; + } + else + { + SetPSSCallback(sub_8097004); + } + } + break; + case 4: + SetPSSCallback(sub_8097BA0); + break; + case 16: + SetPSSCallback(sub_8097CC0); + break; + case 7: + PlaySE(SE_SELECT); + SetPSSCallback(sub_809789C); + break; + case 8: + PlaySE(SE_SELECT); + SetPSSCallback(sub_8097078); + break; + case 9: + PlaySE(SE_SELECT); + gPokemonStorageSystemPtr->unk_08b2 = gPokemonStorage.currentBox + 1; + if (gPokemonStorageSystemPtr->unk_08b2 > 13) + gPokemonStorageSystemPtr->unk_08b2 = 0; + sub_8099C70(gPokemonStorageSystemPtr->unk_08b2); + gPokemonStorageSystemPtr->unk_0004 = 2; + break; + case 10: + PlaySE(SE_SELECT); + gPokemonStorageSystemPtr->unk_08b2 = gPokemonStorage.currentBox - 1; + if (gPokemonStorageSystemPtr->unk_08b2 < 0) + gPokemonStorageSystemPtr->unk_08b2 = 13; + sub_8099C70(gPokemonStorageSystemPtr->unk_08b2); + gPokemonStorageSystemPtr->unk_0004 = 2; + break; + case 11: + if (!sub_809BE80()) + { + if (ItemIsMail(gPokemonStorageSystemPtr->unk_11f2)) + { + gPokemonStorageSystemPtr->unk_0004 = 5; + } + else + { + PlaySE(SE_SELECT); + SetPSSCallback(sub_809746C); + } + } + else + { + gPokemonStorageSystemPtr->unk_0004 = 4; + } + break; + case 13: + if (sub_809BE80()) + { + gPokemonStorageSystemPtr->unk_0004 = 4; + } + else + { + PlaySE(SE_SELECT); + SetPSSCallback(sub_80972A8); + } + break; + case 14: + if (!sub_809BEBC()) + { + gPokemonStorageSystemPtr->unk_0004 = 4; + } + else + { + PlaySE(SE_SELECT); + SetPSSCallback(c3_0808DC50); + } + break; + case 12: + PlaySE(SE_SELECT); + SetPSSCallback(sub_8097390); + break; + case 15: + PlaySE(SE_SELECT); + SetPSSCallback(sub_80972FC); + break; + } + break; + case 1: + if (!sub_809AC00()) + { + if (sub_809BF48()) + sub_80986E8(); + else + sub_8098710(); + if (gPokemonStorageSystemPtr->unk_11f6) + BoxSetMosaic(); + gPokemonStorageSystemPtr->unk_0004 = 0; + } + break; + case 2: + if (!sub_8099D34()) + { + gPokemonStorage.currentBox = gPokemonStorageSystemPtr->unk_08b2; + if (!gUnknown_0203847C && !sub_809BF20()) + { + sub_809B440(); + BoxSetMosaic(); + } + gPokemonStorageSystemPtr->unk_0004 = 0; + } + break; + case 3: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + sub_8098A5C(); + gPokemonStorageSystemPtr->unk_0004 = 0; + } + break; + case 4: + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_LAST_POKE); + gPokemonStorageSystemPtr->unk_0004 = 6; + break; + case 5: + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_PLEASE_REMOVE_MAIL); + gPokemonStorageSystemPtr->unk_0004 = 6; + break; + case 6: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + } + break; + } +} +#endif + +void sub_8096FC8(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + sub_809880C(); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!sub_8098830()) + SetPSSCallback(sub_8096C84); + break; + } +} + +void sub_8097004(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + PlaySE(SE_SELECT); + add_to_c3_somehow(); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!sub_80985CC()) + { + sub_809B0C0(sub_809B0F4()); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 2: + if (!sub_809AC00()) + { + if (gPokemonStorageSystemPtr->unk_11f6) + BoxSetMosaic(); + SetPSSCallback(sub_8096C84); + } + break; + } +} + +#if DEBUG +__attribute__((naked)) +void sub_8097078(void) +{ + asm("\ + push {r4, lr}\n\ + ldr r0, ._495 @ 0x2000000\n\ + ldrb r0, [r0, #0x4]\n\ + cmp r0, #0x5\n\ + bls ._493 @cond_branch\n\ + b ._597\n\ +._493:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._495 + 4 @ \n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._496:\n\ + .align 2, 0\n\ +._495:\n\ + .word 0x2000000\n\ + .word ._497\n\ +._497:\n\ + .word ._498\n\ + .word ._499\n\ + .word ._500\n\ + .word ._501\n\ + .word ._502\n\ + .word ._503\n\ +._498:\n\ + mov r0, #0x4\n\ + bl PrintStorageActionText\n\ + bl sub_809CE84\n\ + ldr r1, ._505 @ 0x2000000\n\ + mov r0, #0x1\n\ + strb r0, [r1, #0x4]\n\ + b ._597\n\ +._506:\n\ + .align 2, 0\n\ +._505:\n\ + .word 0x2000000\n\ +._499:\n\ + bl sub_809CF30\n\ + add r0, r0, #0x1\n\ + lsl r0, r0, #0x10\n\ + asr r0, r0, #0x10\n\ + cmp r0, #0x21\n\ + bls ._507 @cond_branch\n\ + b ._597\n\ +._507:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._510 @ \n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._511:\n\ + .align 2, 0\n\ +._510:\n\ + .word ._509\n\ +._509:\n\ + .word ._513\n\ + .word ._513\n\ + .word ._514\n\ + .word ._515\n\ + .word ._516\n\ + .word ._517\n\ + .word ._518\n\ + .word ._519\n\ + .word ._520\n\ + .word ._521\n\ + .word ._597\n\ + .word ._597\n\ + .word ._597\n\ + .word ._597\n\ + .word ._597\n\ + .word ._597\n\ + .word ._597\n\ + .word ._597\n\ + .word ._597\n\ + .word ._597\n\ + .word ._597\n\ + .word ._597\n\ + .word ._597\n\ + .word ._597\n\ + .word ._597\n\ + .word ._597\n\ + .word ._597\n\ + .word ._597\n\ + .word ._597\n\ + .word ._597\n\ + .word ._597\n\ + .word ._597\n\ + .word ._597\n\ + .word ._545\n\ +._513:\n\ + bl sub_8098A5C\n\ + ldr r0, ._547 @ sub_8096C84\n\ + bl SetPSSCallback\n\ + b ._597\n\ +._548:\n\ + .align 2, 0\n\ +._547:\n\ + .word sub_8096C84+1\n\ +._516:\n\ + bl sub_809BE80\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._563 @cond_branch\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + bl sub_8098A5C\n\ + ldr r0, ._551 @ sub_80972A8\n\ + bl SetPSSCallback\n\ + b ._597\n\ +._552:\n\ + .align 2, 0\n\ +._551:\n\ + .word sub_80972A8+1\n\ +._518:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + bl sub_8098A5C\n\ + ldr r0, ._554 @ sub_80972FC\n\ + bl SetPSSCallback\n\ + b ._597\n\ +._555:\n\ + .align 2, 0\n\ +._554:\n\ + .word sub_80972FC+1\n\ +._517:\n\ + bl sub_809BEBC\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._563 @cond_branch\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + bl sub_8098A5C\n\ + ldr r0, ._558 @ c3_0808DC50\n\ + bl SetPSSCallback\n\ + b ._597\n\ +._559:\n\ + .align 2, 0\n\ +._558:\n\ + .word c3_0808DC50+1\n\ +._515:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + bl sub_8098A5C\n\ + ldr r0, ._561 @ sub_8097390\n\ + bl SetPSSCallback\n\ + b ._597\n\ +._562:\n\ + .align 2, 0\n\ +._561:\n\ + .word sub_8097390+1\n\ +._514:\n\ + bl sub_809BE80\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._563 @cond_branch\n\ + ldr r4, ._566 @ 0x2000000\n\ + ldr r1, ._566 + 4 @ 0x11f2\n\ + add r0, r4, r1\n\ + ldrh r0, [r0]\n\ + bl ItemIsMail\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._564 @cond_branch\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + bl sub_8098A5C\n\ + ldr r0, ._566 + 8 @ sub_809746C\n\ + bl SetPSSCallback\n\ + b ._597\n\ +._567:\n\ + .align 2, 0\n\ +._566:\n\ + .word 0x2000000\n\ + .word 0x11f2\n\ + .word sub_809746C+1\n\ +._520:\n\ + bl sub_809BE80\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._568 @cond_branch\n\ +._563:\n\ + ldr r1, ._570 @ 0x2000000\n\ + mov r0, #0x2\n\ + strb r0, [r1, #0x4]\n\ + b ._597\n\ +._571:\n\ + .align 2, 0\n\ +._570:\n\ + .word 0x2000000\n\ +._568:\n\ + ldr r4, ._574 @ 0x2000000\n\ + ldr r1, ._574 + 4 @ 0x11f9\n\ + add r0, r4, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._572 @cond_branch\n\ + mov r0, #0x4\n\ + strb r0, [r4, #0x4]\n\ + b ._597\n\ +._575:\n\ + .align 2, 0\n\ +._574:\n\ + .word 0x2000000\n\ + .word 0x11f9\n\ +._572:\n\ + ldr r1, ._578 @ 0x11f2\n\ + add r0, r4, r1\n\ + ldrh r0, [r0]\n\ + bl ItemIsMail\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._576 @cond_branch\n\ +._564:\n\ + mov r0, #0x3\n\ + strb r0, [r4, #0x4]\n\ + b ._597\n\ +._579:\n\ + .align 2, 0\n\ +._578:\n\ + .word 0x11f2\n\ +._576:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldr r0, ._581 @ sub_8097594\n\ + bl SetPSSCallback\n\ + b ._597\n\ +._582:\n\ + .align 2, 0\n\ +._581:\n\ + .word sub_8097594+1\n\ +._519:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldr r0, ._584 @ sub_8097788\n\ + bl SetPSSCallback\n\ + b ._597\n\ +._585:\n\ + .align 2, 0\n\ +._584:\n\ + .word sub_8097788+1\n\ +._521:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldr r0, ._587 @ sub_80977E4\n\ + bl SetPSSCallback\n\ + b ._597\n\ +._588:\n\ + .align 2, 0\n\ +._587:\n\ + .word sub_80977E4+1\n\ +._545:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + bl sub_8098A5C\n\ + ldr r0, ._590 @ debug_sub_80A435C\n\ + bl SetPSSCallback\n\ + b ._597\n\ +._591:\n\ + .align 2, 0\n\ +._590:\n\ + .word debug_sub_80A435C+1\n\ +._500:\n\ + mov r0, #0x20\n\ + bl PlaySE\n\ + mov r0, #0xd\n\ + b ._593\n\ +._502:\n\ + mov r0, #0x20\n\ + bl PlaySE\n\ + mov r0, #0x11\n\ + b ._593\n\ +._501:\n\ + mov r0, #0x20\n\ + bl PlaySE\n\ + mov r0, #0x16\n\ +._593:\n\ + bl PrintStorageActionText\n\ + ldr r1, ._595 @ 0x2000000\n\ + mov r0, #0x5\n\ + strb r0, [r1, #0x4]\n\ + b ._597\n\ +._596:\n\ + .align 2, 0\n\ +._595:\n\ + .word 0x2000000\n\ +._503:\n\ + ldr r0, ._598 @ gMain\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0xf3\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._597 @cond_branch\n\ + bl sub_8098A5C\n\ + ldr r0, ._598 + 4 @ sub_8096C84\n\ + bl SetPSSCallback\n\ +._597:\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ +._599:\n\ + .align 2, 0\n\ +._598:\n\ + .word gMain\n\ + .word sub_8096C84+1"); +} +#else +void sub_8097078(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + PrintStorageActionText(PC_TEXT_IS_SELECTED); + sub_809CE84(); + gPokemonStorageSystemPtr->unk_0004 = 1; + break; + case 1: + switch (sub_809CF30()) + { + case -1: + case 0: + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + break; + case 3: + if (sub_809BE80()) + { + gPokemonStorageSystemPtr->unk_0004 = 2; + } + else + { + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(sub_80972A8); + } + break; + case 5: + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(sub_80972FC); + break; + case 4: + if (!sub_809BEBC()) + { + gPokemonStorageSystemPtr->unk_0004 = 2; + } + else + { + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(c3_0808DC50); + } + break; + case 2: + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(sub_8097390); + break; + case 1: + if (sub_809BE80()) + { + gPokemonStorageSystemPtr->unk_0004 = 2; + } + else if (ItemIsMail(gPokemonStorageSystemPtr->unk_11f2)) + { + gPokemonStorageSystemPtr->unk_0004 = 3; + } + else + { + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(sub_809746C); + } + break; + case 7: + if (sub_809BE80()) + { + gPokemonStorageSystemPtr->unk_0004 = 2; + } + else if (gPokemonStorageSystemPtr->unk_11f9) + { + gPokemonStorageSystemPtr->unk_0004 = 4; + } + else if (ItemIsMail(gPokemonStorageSystemPtr->unk_11f2)) + { + gPokemonStorageSystemPtr->unk_0004 = 3; + } + else + { + PlaySE(SE_SELECT); + SetPSSCallback(sub_8097594); + } + break; + case 6: + PlaySE(SE_SELECT); + SetPSSCallback(sub_8097788); + break; + case 8: + PlaySE(SE_SELECT); + SetPSSCallback(sub_80977E4); + break; + } + break; + case 2: + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_LAST_POKE); + gPokemonStorageSystemPtr->unk_0004 = 5; + break; + case 4: + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_CANT_RELEASE_EGG); + gPokemonStorageSystemPtr->unk_0004 = 5; + break; + case 3: + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_PLEASE_REMOVE_MAIL); + gPokemonStorageSystemPtr->unk_0004 = 5; + break; + case 5: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + } + break; + } +} +#endif + +void sub_80972A8(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + sub_809B100(0); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!sub_809B130()) + { + if (gUnknown_0203847C) + SetPSSCallback(sub_8097858); + else + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_80972FC(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + sub_809B100(1); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!sub_809B130()) + { + if (gUnknown_0203847C) + SetPSSCallback(sub_8097858); + else + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void c3_0808DC50(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + sub_809B100(2); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!sub_809B130()) + { + BoxSetMosaic(); + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_8097390(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + if (CalculatePlayerPartyCount() == 6) + { + PrintStorageActionText(PC_TEXT_PARTY_FULL); + gPokemonStorageSystemPtr->unk_0004 = 1; + } + else + { + sub_809B0E0(); + sub_809B100(0); + gPokemonStorageSystemPtr->unk_0004 = 2; + } + break; + case 1: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + } + break; + case 2: + if (!sub_809B130()) + { + sub_809880C(); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 3: + if (!sub_8098830()) + { + sub_809B100(1); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 4: + if (!sub_809B130()) + { + sub_80987DC(); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 5: + SetPSSCallback(sub_8097004); + break; + } +} + +void sub_809746C(void) +{ + u8 r4; + + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + PrintStorageActionText(PC_TEXT_DEPOSIT_IN_WHICH_BOX); + sub_8096264(&gPokemonStorageSystemPtr->unk_2370, 0x0007, 0xdaca, 3); + sub_809634C(gUnknown_0203847E); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + r4 = sub_8096368(); + if (r4 == 200); + else if (r4 == 201) + { + sub_8098A5C(); + sub_809635C(); + sub_8096310(); + SetPSSCallback(sub_8096C84); + } + else + { + if (sub_809B62C(r4)) + { + sub_8098A5C(); + sub_809635C(); + sub_8096310(); + gPokemonStorageSystemPtr->unk_0004 = 2; + } + else + { + PrintStorageActionText(PC_TEXT_BOX_IS_FULL); + gPokemonStorageSystemPtr->unk_0004 = 4; + } + gUnknown_0203847E = r4; + } + break; + case 2: + party_compaction(); + sub_8099310(); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 3: + if (sub_8099374() == 0) + { + sub_809B6BC(); + BoxSetMosaic(); + sub_80987DC(); + SetPSSCallback(sub_8096C84); + } + break; + case 4: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + PrintStorageActionText(PC_TEXT_DEPOSIT_IN_WHICH_BOX); + gPokemonStorageSystemPtr->unk_0004 = 1; + } + break; + } +} + +void sub_8097594(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + PrintStorageActionText(PC_TEXT_RELEASE_POKE); + sub_8098A38(1); + gPokemonStorageSystemPtr->unk_0004++; + // fallthrough + case 1: + switch (Menu_ProcessInputNoWrap()) + { + case -1: + case 1: + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + break; + case 0: + sub_8098A5C(); + sub_809B7D4(); + sub_809B6DC(); + gPokemonStorageSystemPtr->unk_0004++; + break; + } + break; + case 2: + sub_809B960(); + if (!sub_809B734()) + { + while (1) + { + s8 r0 = sub_809B960(); + if (r0 == 1) + { + gPokemonStorageSystemPtr->unk_0004++; + break; + } + if (r0 == 0) + { + gPokemonStorageSystemPtr->unk_0004 = 8; + break; + } + } + } + break; + case 3: + sub_809B760(); + sub_809801C(); + PrintStorageActionText(PC_TEXT_WAS_RELEASED); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 4: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + PrintStorageActionText(PC_TEXT_BYE_BYE); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 5: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + sub_8098A5C(); + if (gUnknown_0203847C) + { + party_compaction(); + sub_8099310(); + gPokemonStorageSystemPtr->unk_0004++; + } + else + { + gPokemonStorageSystemPtr->unk_0004 = 7; + } + } + break; + case 6: + if (sub_8099374() == 0) + { + sub_809B440(); + BoxSetMosaic(); + sub_80987DC(); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 7: + SetPSSCallback(sub_8096C84); + break; + case 8: + PrintStorageActionText(PC_TEXT_WAS_RELEASED); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 9: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + PrintStorageActionText(PC_TEXT_SURPRISE); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 10: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + sub_8098A5C(); + sub_8099958(); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 11: + if (!sub_8099990()) + { + sub_809B7AC(); + PrintStorageActionText(PC_TEXT_CAME_BACK); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 12: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + PrintStorageActionText(PC_TEXT_WORRIED); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 13: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_8097788(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + sub_809BC18(); + BeginNormalPaletteFade(0xffffffff, 0, 0, 16, 0); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!UpdatePaletteFade()) + { + gUnknown_0203847F = 0; + gPokemonStorageSystemPtr->unk_0006 = 0; + SetMainCallback2(sub_8096B5C); + } + break; + } +} + +void sub_80977E4(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + PrintStorageActionText(PC_TEXT_MARK_POKE); + gPokemonStorageSystemPtr->unk_12bc.markings = gPokemonStorageSystemPtr->unk_11f7; + sub_80F7418(gPokemonStorageSystemPtr->unk_11f7, 0xb0, 0x10); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!sub_80F7500()) + { + sub_80F7470(); + sub_8098A5C(); + sub_809BDD8(gPokemonStorageSystemPtr->unk_12bc.markings); + sub_809801C(); + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_8097858(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + party_compaction(); + sub_8099310(); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (sub_8099374() == 0) + { + sub_80987DC(); + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_809789C(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + PrintStorageActionText(PC_TEXT_WHAT_YOU_DO); + sub_809CE84(); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + switch (sub_809CF30()) + { + case -1: + case 0: + sub_809A860(TRUE); + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + break; + case 11: + PlaySE(SE_SELECT); + SetPSSCallback(sub_8097B44); + break; + case 10: + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(sub_8097974); + break; + case 9: + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(sub_8097A64); + break; + } + break; + } +} + +void sub_8097974(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + sub_8098A80(); + PrintStorageActionText(PC_TEXT_PICK_A_THEME); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + gPokemonStorageSystemPtr->unk_0d5e = sub_809CF30(); + switch (gPokemonStorageSystemPtr->unk_0d5e) + { + case -1: + sub_809A860(TRUE); + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + break; + case 12 ... 15: + PlaySE(SE_SELECT); + gPokemonStorageSystemPtr->unk_0d5e -= 12; + sub_8098AA8(gPokemonStorageSystemPtr->unk_0d5e); + PrintStorageActionText(PC_TEXT_PICK_A_WALLPAPER); + gPokemonStorageSystemPtr->unk_0004++; + break; + } + break; + case 2: + gPokemonStorageSystemPtr->unk_0d60 = sub_809CF30(); + switch (gPokemonStorageSystemPtr->unk_0d60) + { + case -1: + sub_8098A5C(); + gPokemonStorageSystemPtr->unk_0004 = 0; + break; + case -2: + break; + default: + PlaySE(SE_SELECT); + sub_8098A5C(); + gPokemonStorageSystemPtr->unk_0d60 -= 16; + sub_8099DCC(gPokemonStorageSystemPtr->unk_0d60); + gPokemonStorageSystemPtr->unk_0004++; + break; + } + break; + case 3: + if (!sub_8099E08()) + { + sub_809A860(TRUE); + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_8097A64(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + PrintStorageActionText(PC_TEXT_JUMP_TO_WHICH_BOX); + sub_8096264(&gPokemonStorageSystemPtr->unk_2370, 0x0007, 0xdaca, 3); + sub_809634C(gPokemonStorage.currentBox); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + gPokemonStorageSystemPtr->unk_08b2 = sub_8096368(); + switch (gPokemonStorageSystemPtr->unk_08b2) + { + case 200: + break; + default: + sub_8098A5C(); + sub_809635C(); + sub_8096310(); + if (gPokemonStorageSystemPtr->unk_08b2 == 201 || gPokemonStorageSystemPtr->unk_08b2 == gPokemonStorage.currentBox) + { + sub_809A860(TRUE); + SetPSSCallback(sub_8096C84); + } + else + { + gPokemonStorageSystemPtr->unk_0004++; + } + break; + } + break; + case 2: + sub_8099C70(gPokemonStorageSystemPtr->unk_08b2); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 3: + if (!sub_8099D34()) + { + gPokemonStorage.currentBox = gPokemonStorageSystemPtr->unk_08b2; + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_8097B44(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + sub_809BB90(); + BeginNormalPaletteFade(0xffffffff, 0, 0, 16, 0); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!UpdatePaletteFade()) + { + gUnknown_0203847F = 1; + gPokemonStorageSystemPtr->unk_0006 = 1; + SetMainCallback2(sub_8096B5C); + } + break; + } +} + +void sub_8097BA0(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + if (sub_809BF20()) + { + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_HOLDING_POKE); + gPokemonStorageSystemPtr->unk_0004 = 1; + } + else + { + PlaySE(SE_SELECT); + PrintStorageActionText(PC_TEXT_EXIT_BOX); + sub_8098A38(0); + gPokemonStorageSystemPtr->unk_0004 = 2; + } + break; + case 1: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + } + break; + case 2: + switch (Menu_ProcessInputNoWrap()) + { + case 1: + case -1: + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + break; + case 0: + PlaySE(SE_PC_OFF); + sub_8098A5C(); + gPokemonStorageSystemPtr->unk_0004++; + break; + } + break; + case 3: + gPokemonStorageSystemPtr->unk_000c.tileTag = 0x000e; + gPokemonStorageSystemPtr->unk_000c.paletteTag = 0xdad0; + gPokemonStorageSystemPtr->unk_000c.unk04 = 20; + gPokemonStorageSystemPtr->unk_000c.unk06 = 0; + sub_80C5E38(&gPokemonStorageSystemPtr->unk_000c); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 4: + if (sub_80C5F98()) + { + gPlayerPartyCount = CalculatePlayerPartyCount(); + SetMainCallback2(sub_80961A8); + } + break; + } +} + +void sub_8097CC0(void) { + switch (gPokemonStorageSystemPtr->unk_0004) { + case 0: + if (sub_809BF20()) { + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_HOLDING_POKE); + gPokemonStorageSystemPtr->unk_0004 = 1; + } + else { + PlaySE(SE_SELECT); + PrintStorageActionText(PC_TEXT_CONTINUE_BOX); + sub_8098A38(0); + gPokemonStorageSystemPtr->unk_0004 = 2; + } + break; + case 1: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) { + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + } + break; + case 2: + switch (Menu_ProcessInputNoWrap()) { + case 0: + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + break; + case -1: + case 1: + PlaySE(SE_PC_OFF); + sub_8098A5C(); + gPokemonStorageSystemPtr->unk_0004++; + break; + } + break; + case 3: + gPokemonStorageSystemPtr->unk_000c.tileTag = 0x000e; + gPokemonStorageSystemPtr->unk_000c.paletteTag = 0xdad0; + gPokemonStorageSystemPtr->unk_000c.unk04 = 20; + gPokemonStorageSystemPtr->unk_000c.unk06 = 0; + sub_80C5E38(&gPokemonStorageSystemPtr->unk_000c); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 4: + if (sub_80C5F98()) { + gPlayerPartyCount = CalculatePlayerPartyCount(); + SetMainCallback2(sub_80961A8); + } + break; + } +} + +void sub_8097DE0(void) +{ + gPokemonStorageSystemPtr->unk_0007 = 0; + gPokemonStorageSystemPtr->unk_0008 = 0; + gPokemonStorageSystemPtr->unk_000a = 0; + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(3) | BGCNT_SCREENBASE(30); + DmaCopy16Defvars(3, gPokemonStorageScrollingBGTile, BG_SCREEN_ADDR(28), sizeof gPokemonStorageScrollingBGTile); + LZ77UnCompVram(gPokemonStorageScrollingBGTilemap, BG_SCREEN_ADDR(30)); + LoadPalette(gPokemonStorageScrollingBGPalette, 0xd0, 0x10); +} + +void sub_8097E44(void) +{ + if (++gPokemonStorageSystemPtr->unk_0007 >= 2) + { + gPokemonStorageSystemPtr->unk_0007 = 0; + gPokemonStorageSystemPtr->unk_0008--; + gPokemonStorageSystemPtr->unk_000a++; + } +} + +void sub_8097E70(void) +{ + LZ77UnCompVram(gPSSMenuHeader_Gfx, BG_SCREEN_ADDR(10)); + LZ77UnCompWram(gPSSMenuHeader_Tilemap, gUnknown_02039760); + sub_809D034(BG_SCREEN_ADDR(15), 0, 0, gUnknown_02039760, 0, 0, 10, 20); + LoadPalette(gPSSMenu1_Pal, 0x10, 0x20); + LoadPalette(gPSSMenu2_Pal, 0x00, 0x20); + LoadPalette(gUnknown_083B6D74, 0xB0, 0x20); + LoadPalette(gUnknown_083B6D94, 0xC0, 0x20); + LoadPalette(gUnknownPalette_81E6692 + 1, 0xF1, 0x02); + LoadPalette(gUnknownPalette_81E6692 + 1, 0xF2, 0x02); + LoadPalette(gUnknownPalette_81E6692 + 5, 0xF3, 0x02); + LoadPalette(gUnknownPalette_81E6692 + 12, 0xF4, 0x04); + LoadPalette(gUnknownPalette_81E6692 + 10, 0xF6, 0x04); + LoadPalette(gUnknownPalette_81E6692 + 2, 0xFF, 0x02); + LoadSpritePalette(&gWaveformSpritePalette); + sub_80980D4(); + sub_8097F58(); + sub_8097FB8(); + sub_809801C(); +} + +void sub_8097F58(void) +{ + gPokemonStorageSystemPtr->unk_12ac = sub_80F7940(0x000d, 0xdace, 0); + gPokemonStorageSystemPtr->unk_12ac->oam.priority = 0; + gPokemonStorageSystemPtr->unk_12ac->subpriority = 1; + gPokemonStorageSystemPtr->unk_12ac->pos1.x = 0x28; + gPokemonStorageSystemPtr->unk_12ac->pos1.y = 0x95; + gPokemonStorageSystemPtr->unk_12b8 = BG_CHAR_ADDR(4) + 32 * GetSpriteTileStartByTag(0x000d); +} + +const struct SpriteTemplate gSpriteTemplate_83B6EFC; + +void sub_8097FB8(void) +{ + u16 i; + struct SpriteSheet sheet = {WaveformTiles, 0x1c0, 0x0005}; + + LoadSpriteSheet(&sheet); + for (i = 0; i < 2; i++) + { + u8 spriteId = CreateSprite(&gSpriteTemplate_83B6EFC, i * 63 + 8, 9, 2); + gPokemonStorageSystemPtr->unk_12b0[i] = gSprites + spriteId; + } +} + +void sub_809801C(void) +{ + sub_80981F0(gPokemonStorageSystemPtr->unk_11f0, gPokemonStorageSystemPtr->unk_11ec); + sub_80982B4(); + sub_8098350(); +} + +void BoxSetMosaic(void) +{ + sub_809801C(); + if (gPokemonStorageSystemPtr->unk_2700) + { + gPokemonStorageSystemPtr->unk_2700->oam.mosaic = TRUE; + gPokemonStorageSystemPtr->unk_2700->data[0] = 10; + gPokemonStorageSystemPtr->unk_2700->data[1] = 1; + gPokemonStorageSystemPtr->unk_2700->callback = sub_8098090; + REG_MOSAIC = (gPokemonStorageSystemPtr->unk_2700->data[0] << 12) | (gPokemonStorageSystemPtr->unk_2700->data[0] << 8); + } +} + +void sub_8098090(struct Sprite *sprite) +{ + sprite->data[0] -= sprite->data[1]; + if (sprite->data[0] < 0) + sprite->data[0] = 0; + REG_MOSAIC = (sprite->data[0] << 12) | (sprite->data[0] << 8); + if (sprite->data[0] == 0) + { + sprite->oam.mosaic = FALSE; + sprite->callback = SpriteCallbackDummy; + } +} + +// sub_80980D4 + +const struct OamData gOamData_83B6EAC; + +#ifdef NONMATCHING +void sub_80980D4(void) +{ + u16 i; + u16 tileStart; + u8 palSlot; + u8 spriteId; + struct SpriteSheet sheet = {gPokemonStorageSystemPtr->unk_2784, 0x800, 0x0002}; + struct SpritePalette palette = {gPokemonStorageSystemPtr->unk_2704, 0xdac7}; + struct SpriteTemplate template = { + 0x0002, 0xdac7, &gOamData_83B6EAC, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy + }; + + for (i = 0; i < 0x800; i++) + gPokemonStorageSystemPtr->unk_2784[i] = 0; + for (i = 0; i < 0x10; i++) + gPokemonStorageSystemPtr->unk_2704[i] = 0; + + gPokemonStorageSystemPtr->unk_2700 = NULL; + if ((tileStart = LoadSpriteSheet(&sheet)) != 0 + && (palSlot = LoadSpritePalette(&palette)) != 0xff + && (spriteId = CreateSprite(&template, 0x28, 0x30, 0)) != MAX_SPRITES) + { + // FIXME this gets compiled as a separate block between the palSlot check and the spriteId check + gPokemonStorageSystemPtr->unk_2700 = gSprites + spriteId; + gPokemonStorageSystemPtr->unk_26fa = palSlot * 16 + 0x100; + gPokemonStorageSystemPtr->unk_26fc = BG_CHAR_ADDR(4) + tileStart * 32; + } + + if (gPokemonStorageSystemPtr->unk_2700 == NULL) + { + FreeSpriteTilesByTag(0x0002); + FreeSpritePaletteByTag(0xdac7); + } +} +#else + +const struct SpriteSheet gUnknown_083B6DCC = {ePokemonStorageSystem.unk_2784, 0x800, 0x0002}; +const struct SpritePalette gUnknown_083B6DD4 = {ePokemonStorageSystem.unk_2704, 0xdac7}; +const struct SpriteTemplate gSpriteTemplate_83B6DDC = { + 0x0002, 0xdac7, &gOamData_83B6EAC, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +__attribute__((naked)) void sub_80980D4(void) +{ + asm_unified("\tpush {r4,r5,lr}\n" + "\tsub sp, 0x28\n" + "\tldr r0, _08098150 @ =gUnknown_083B6DCC\n" + "\tldr r1, [r0, 0x4]\n" + "\tldr r0, [r0]\n" + "\tstr r0, [sp, 0x18]\n" + "\tstr r1, [sp, 0x1C]\n" + "\tldr r0, _08098154 @ =gUnknown_083B6DD4\n" + "\tldr r1, [r0, 0x4]\n" + "\tldr r0, [r0]\n" + "\tstr r0, [sp, 0x20]\n" + "\tstr r1, [sp, 0x24]\n" + "\tmov r1, sp\n" + "\tldr r0, _08098158 @ =gSpriteTemplate_83B6DDC\n" + "\tldm r0!, {r2-r4}\n" + "\tstm r1!, {r2-r4}\n" + "\tldm r0!, {r2-r4}\n" + "\tstm r1!, {r2-r4}\n" + "\tmovs r1, 0\n" + "\tadd r5, sp, 0x18\n" + "\tldr r4, _0809815C @ =gSharedMem + 0x2784\n" + "\tmovs r3, 0\n" + "\tldr r2, _08098160 @ =0x000007ff\n" + "_08098102:\n" + "\tadds r0, r1, r4\n" + "\tstrb r3, [r0]\n" + "\tadds r0, r1, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r1, r0, 16\n" + "\tcmp r1, r2\n" + "\tbls _08098102\n" + "\tmovs r1, 0\n" + "\tldr r3, _08098164 @ =gSharedMem + 0x2704\n" + "\tmovs r2, 0\n" + "_08098116:\n" + "\tlsls r0, r1, 1\n" + "\tadds r0, r3\n" + "\tstrh r2, [r0]\n" + "\tadds r0, r1, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r1, r0, 16\n" + "\tcmp r1, 0xF\n" + "\tbls _08098116\n" + "\tldr r0, _08098168 @ =gSharedMem\n" + "\tmovs r1, 0x9C\n" + "\tlsls r1, 6\n" + "\tadds r0, r1\n" + "\tmovs r1, 0\n" + "\tstr r1, [r0]\n" + "\tadds r0, r5, 0\n" + "\tbl LoadSpriteSheet\n" + "\tlsls r0, 16\n" + "\tlsrs r5, r0, 16\n" + "\tcmp r5, 0\n" + "\tbeq _080981C4\n" + "\tadd r0, sp, 0x20\n" + "\tbl LoadSpritePalette\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "\tcmp r4, 0xFF\n" + "\tbeq _080981C4\n" + "\tb _080981B0\n" + "\t.align 2, 0\n" + "_08098150: .4byte gUnknown_083B6DCC\n" + "_08098154: .4byte gUnknown_083B6DD4\n" + "_08098158: .4byte gSpriteTemplate_83B6DDC\n" + "_0809815C: .4byte gSharedMem + 0x2784\n" + "_08098160: .4byte 0x000007ff\n" + "_08098164: .4byte gSharedMem + 0x2704\n" + "_08098168: .4byte gSharedMem\n" + "_0809816C:\n" + "\tldr r2, _0809819C @ =gSharedMem\n" + "\tmovs r0, 0x9C\n" + "\tlsls r0, 6\n" + "\tadds r3, r2, r0\n" + "\tlsls r0, r1, 4\n" + "\tadds r0, r1\n" + "\tlsls r0, 2\n" + "\tldr r1, _080981A0 @ =gSprites\n" + "\tadds r0, r1\n" + "\tstr r0, [r3]\n" + "\tlsls r0, r4, 4\n" + "\tmovs r1, 0x80\n" + "\tlsls r1, 1\n" + "\tadds r0, r1\n" + "\tldr r3, _080981A4 @ =0x000026fa\n" + "\tadds r1, r2, r3\n" + "\tstrh r0, [r1]\n" + "\tldr r4, _080981A8 @ =0x000026fc\n" + "\tadds r2, r4\n" + "\tlsls r0, r5, 5\n" + "\tldr r1, _080981AC @ =0x06010000\n" + "\tadds r0, r1\n" + "\tstr r0, [r2]\n" + "\tb _080981C4\n" + "\t.align 2, 0\n" + "_0809819C: .4byte gSharedMem\n" + "_080981A0: .4byte gSprites\n" + "_080981A4: .4byte 0x000026fa\n" + "_080981A8: .4byte 0x000026fc\n" + "_080981AC: .4byte 0x06010000\n" + "_080981B0:\n" + "\tmov r0, sp\n" + "\tmovs r1, 0x28\n" + "\tmovs r2, 0x30\n" + "\tmovs r3, 0\n" + "\tbl CreateSprite\n" + "\tlsls r0, 24\n" + "\tlsrs r1, r0, 24\n" + "\tcmp r1, 0x40\n" + "\tbne _0809816C\n" + "_080981C4:\n" + "\tldr r0, _080981E8 @ =gSharedMem\n" + "\tmovs r2, 0x9C\n" + "\tlsls r2, 6\n" + "\tadds r0, r2\n" + "\tldr r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbne _080981DE\n" + "\tmovs r0, 0x2\n" + "\tbl FreeSpriteTilesByTag\n" + "\tldr r0, _080981EC @ =0x0000dac7\n" + "\tbl FreeSpritePaletteByTag\n" + "_080981DE:\n" + "\tadd sp, 0x28\n" + "\tpop {r4,r5}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_080981E8: .4byte gSharedMem\n" + "_080981EC: .4byte 0x0000dac7"); +} +#endif + +void sub_80981F0(u16 species, u32 pid) +{ + if (gPokemonStorageSystemPtr->unk_2700) + { + if (species != SPECIES_NONE) + { + HandleLoadSpecialPokePic(gMonFrontPicTable + species, gMonFrontPicCoords[species].coords, 1, (intptr_t)gPokemonStorageSystemPtr->unk_4784, gPokemonStorageSystemPtr->unk_2784, species, pid); + LZ77UnCompWram(gPokemonStorageSystemPtr->unk_11e8, gPokemonStorageSystemPtr->unk_2704); + CpuCopy32(gPokemonStorageSystemPtr->unk_2784, gPokemonStorageSystemPtr->unk_26fc, 0x800); + LoadPalette(gPokemonStorageSystemPtr->unk_2704, gPokemonStorageSystemPtr->unk_26fa, 0x20); + gPokemonStorageSystemPtr->unk_2700->invisible = FALSE; + } + else + { + gPokemonStorageSystemPtr->unk_2700->invisible = TRUE; + } + } +} + +void sub_80982B4(void) +{ + if (gPokemonStorageSystemPtr->unk_11f0) + { + sub_80F7A10(gPokemonStorageSystemPtr->unk_11f7, gPokemonStorageSystemPtr->unk_12b8); + gPokemonStorageSystemPtr->unk_12ac->invisible = FALSE; + } + else + { + gPokemonStorageSystemPtr->unk_12ac->invisible = TRUE; + } + Menu_EraseWindowRect(0, 11, 9, 17); + Menu_PrintText(gPokemonStorageSystemPtr->unk_127a, 1, 16); + Menu_PrintText(gPokemonStorageSystemPtr->unk_120f, 1, 11); + Menu_PrintText(gPokemonStorageSystemPtr->unk_1234, 0, 13); + Menu_PrintText(gPokemonStorageSystemPtr->unk_1259, 1, 15); +} + +void sub_8098350(void) +{ + u16 i; + + if (gPokemonStorageSystemPtr->unk_11f0) + { + sub_809D034(BG_SCREEN_ADDR(15), 1, 0, gUnknown_02039760, 1, 0, 8, 2); + for (i = 0; i < 2; i++) + StartSpriteAnimIfDifferent(gPokemonStorageSystemPtr->unk_12b0[i], i * 2 + 1); + } + else + { + sub_809D034(BG_SCREEN_ADDR(15), 1, 0, gUnknown_02039760, 10, 0, 8, 2); + for (i = 0; i < 2; i++) + StartSpriteAnim(gPokemonStorageSystemPtr->unk_12b0[i], i * 2); + } +} + +void sub_8098400(void) +{ + REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(15); + LZ77UnCompVram(gPSSMenuMisc_Gfx, BG_SCREEN_ADDR(13)); + LZ77UnCompWram(gPSSMenuMisc_Tilemap, gPokemonStorageSystemPtr->unk_00a8); + LoadPalette(gPSSMenu3_Pal, 0x20, 0x20); + LoadPalette(gPSSMenu4_Pal, 0x30, 0x20); + DmaClear16(3, BG_SCREEN_ADDR(15), 0x800); + sub_8098780(); + if (gUnknown_0203847C) + { + sub_8098690(TRUE); + sub_8099200(TRUE); + sub_809D034(BG_SCREEN_ADDR(15), 10, 0, gPokemonStorageSystemPtr->unk_00a8, 0, 0, 12, 22); + } + else + { + sub_809D034(BG_SCREEN_ADDR(15), 10, 0, gPokemonStorageSystemPtr->unk_00a8, 0, 20, 12, 2); + sub_8098690(TRUE); + } + gPokemonStorageSystemPtr->unk_08af = 0; +} + +void sub_80984E8(void) +{ + gPokemonStorageSystemPtr->unk_08a8 = 20; + gPokemonStorageSystemPtr->unk_08aa = 2; + gPokemonStorageSystemPtr->unk_08ad = 0; + sub_8099200(FALSE); +} + +bool8 sub_8098520(void) +{ + if (gPokemonStorageSystemPtr->unk_08ad == 20) + return FALSE; + gPokemonStorageSystemPtr->unk_08a8--; + gPokemonStorageSystemPtr->unk_08aa++; + sub_809D034(BG_SCREEN_ADDR(15), 10, 0, gPokemonStorageSystemPtr->unk_00a8, 0, gPokemonStorageSystemPtr->unk_08a8, 12, gPokemonStorageSystemPtr->unk_08aa); + sub_80994A8(8); + if (++gPokemonStorageSystemPtr->unk_08ad == 20) + { + gUnknown_0203847C = 1; + return FALSE; + } + return TRUE; +} + +void add_to_c3_somehow(void) +{ + gPokemonStorageSystemPtr->unk_08a8 = 0; + gPokemonStorageSystemPtr->unk_08aa = 22; + gPokemonStorageSystemPtr->unk_08ad = 0; +} + +bool8 sub_80985CC(void) +{ + if (gPokemonStorageSystemPtr->unk_08ad == 20) + return FALSE; + gPokemonStorageSystemPtr->unk_08a8++; + gPokemonStorageSystemPtr->unk_08aa--; + sub_809D034(BG_SCREEN_ADDR(15), 10, 0, gPokemonStorageSystemPtr->unk_00a8, 0, gPokemonStorageSystemPtr->unk_08a8, 12, gPokemonStorageSystemPtr->unk_08aa); + sub_809D16C(BG_SCREEN_ADDR(15), 10, gPokemonStorageSystemPtr->unk_08aa, 12, 1); + sub_80994A8(-8); + if (++gPokemonStorageSystemPtr->unk_08ad == 20) + { + gUnknown_0203847C = 0; + sub_809954C(); + party_compaction(); + sub_809D034(BG_SCREEN_ADDR(15), 21, 0, gPokemonStorageSystemPtr->unk_00a8, 12, 0, 1, 2); + return FALSE; + } + return TRUE; +} + +void sub_8098690(bool8 flag) +{ + if (flag) + sub_809D034(BG_SCREEN_ADDR(15), 21, 0, gPokemonStorageSystemPtr->unk_00a8, 12, 0, 9, 2); + else + sub_809D034(BG_SCREEN_ADDR(15), 21, 0, gPokemonStorageSystemPtr->unk_00a8, 12, 2, 9, 2); +} + +void sub_80986E8(void) +{ + gPokemonStorageSystemPtr->unk_08af = 1; + gPokemonStorageSystemPtr->unk_08b0 = 30; + gPokemonStorageSystemPtr->unk_08b1 = 1; +} + +void sub_8098710(void) +{ + if (gPokemonStorageSystemPtr->unk_08af) + { + gPokemonStorageSystemPtr->unk_08af = 0; + sub_8098690(TRUE); + } +} + +void sub_8098734(void) +{ + if (gPokemonStorageSystemPtr->unk_08af && ++gPokemonStorageSystemPtr->unk_08b0 > 30) + { + gPokemonStorageSystemPtr->unk_08b0 = 0; + gPokemonStorageSystemPtr->unk_08b1 = gPokemonStorageSystemPtr->unk_08b1 ? FALSE : TRUE; + sub_8098690(gPokemonStorageSystemPtr->unk_08b1); + } +} + +void sub_8098780(void) +{ + int i; + + for (i = 1; i < PARTY_SIZE; i++) + { + u16 r1; + bool32 r0 = GetMonData(gPlayerParty + i, MON_DATA_SPECIES); + if (r0) + r0 = TRUE; + r1 = r0 ? 12 : 16; + sub_809D104(gPokemonStorageSystemPtr->unk_00a8, 7, (i - 1) * 3 + 1, gPokemonStorageSystemPtr->unk_00a8, r1, 4, 4, 3); + } +} + +void sub_80987DC(void) +{ + sub_8098780(); + sub_809D034(BG_SCREEN_ADDR(15), 10, 0, gPokemonStorageSystemPtr->unk_00a8, 0, 0, 12, 22); +} + +void sub_809880C(void) +{ + gPokemonStorageSystemPtr->unk_08ae = 0; + PlaySE(SE_WIN_OPEN); + sub_80984E8(); +} + +bool8 sub_8098830(void) +{ + switch (gPokemonStorageSystemPtr->unk_08ae) + { + case 0: + if (!sub_8098520()) + { + sub_809B068(); + gPokemonStorageSystemPtr->unk_08ae++; + } + break; + case 1: + if (!sub_809AC00()) + { + if (gPokemonStorageSystemPtr->unk_11f6) + BoxSetMosaic(); + gPokemonStorageSystemPtr->unk_08ae++; + } + break; + case 2: + return FALSE; + } + return TRUE; +} + +const struct StorageAction gPCStorageActionTexts[] = { + {PCText_ExitBox, 0}, + {PCText_WhatYouDo, 0}, + {PCText_PickATheme, 0}, + {PCText_PickAWallpaper, 0}, + {PCText_IsSelected, 1}, + {PCText_JumpToWhichBox, 0}, + {PCText_DepositInWhichBox, 0}, + {PCText_WasDeposited, 1}, + {PCText_BoxIsFull, 0}, + {PCText_ReleasePoke, 0}, + {PCText_WasReleased, 4}, + {PCText_ByeBye, 6}, + {PCText_MarkPoke, 0}, + {PCText_LastPoke, 0}, + {PCText_PartyFull, 0}, + {PCText_HoldingPoke, 0}, + {PCText_WhichOneWillTake, 0}, + {PCText_CantReleaseEgg, 0}, + {PCText_ContinueBox, 0}, + {PCText_CameBack, 1}, + {PCText_Worried, 0}, + {PCText_Surprise, 0}, + {PCText_PleaseRemoveMail, 0} +}; + +void PrintStorageActionText(u8 index) { + u8 *ptr; + + Menu_DrawStdWindowFrame(10, 16, 29, 19); + + switch (gPCStorageActionTexts[index].format) + { + + case PC_TEXT_FMT_UNK_02: + ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); + ptr = StringCopy(ptr, gPokemonStorageSystemPtr->unk_11fa); + break; + + case PC_TEXT_FMT_UNK_05: + ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); + ptr = StringCopy(ptr, gPokemonStorageSystemPtr->unk_26e4); + break; + + case PC_TEXT_FMT_MON_NAME: + // {var} + " is selected." + ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPokemonStorageSystemPtr->unk_11fa); + ptr = StringCopy(ptr, gPCStorageActionTexts[index].text); + break; + + case PC_TEXT_FMT_MON_NAME_2: + // {var} + " was released." + ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPokemonStorageSystemPtr->unk_26e4); +#if ENGLISH + ptr = StringCopy(ptr, gPCStorageActionTexts[index].text); +#elif GERMAN + ptr = de_sub_8073174(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); +#endif + break; + + case PC_TEXT_FMT_UNK_03: + { + const u8 *stringLength; + const u8 *text; + + text = gPCStorageActionTexts[index].text; + stringLength = &text[StringLength(text)] + 1; + + ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); + ptr = StringCopy(ptr, gPokemonStorageSystemPtr->unk_11fa); + ptr = StringCopy(ptr, stringLength); + } + break; + + case PC_TEXT_FMT_MON_NAME_AFTER_EXCL_MARK: + // "Bye-bye, ".substr(0, -1) + {var} + "Bye-bye, !".substr(-1, 1) + { + const u8 *stringLength; + const u8 *text; + + text = gPCStorageActionTexts[index].text; + stringLength = &text[StringLength(text)] - 1; + + ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); + ptr = StringCopy(ptr - 1, gPokemonStorageSystemPtr->unk_26e4); + ptr = StringCopy(ptr, stringLength); + } + break; + + case PC_TEXT_FMT_NORMAL: + default: + ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); + break; + } + + while (ptr < gPokemonStorageSystemPtr->unk_26a6) + { + ptr[0] = CHAR_SPACE; + ptr++; + } + + ptr[0] = EOS; + Menu_PrintText(gPokemonStorageSystemPtr->unk_2694, 11, 17); +} + +const struct OamData gOamData_83B6EAC = { + .size = 3 +}; + +const struct OamData gOamData_83B6EB4 = { + .shape = ST_OAM_H_RECTANGLE +}; + +const union AnimCmd gSpriteAnim_83B6EBC[] = { + ANIMCMD_FRAME(0, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_83B6EC4[] = { + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(4, 8), + ANIMCMD_FRAME(6, 8), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gSpriteAnim_83B6ED4[] = { + ANIMCMD_FRAME(8, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_83B6EDC[] = { + ANIMCMD_FRAME(10, 8), + ANIMCMD_FRAME( 4, 8), + ANIMCMD_FRAME(12, 8), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd *const gSpriteAnimTable_83B6EEC[] = { + gSpriteAnim_83B6EBC, + gSpriteAnim_83B6EC4, + gSpriteAnim_83B6ED4, + gSpriteAnim_83B6EDC +}; + +const struct SpriteTemplate gSpriteTemplate_83B6EFC = { + 0x0005, + 0xdacd, + &gOamData_83B6EB4, + gSpriteAnimTable_83B6EEC, + NULL, + gDummySpriteAffineAnimTable, + SpriteCallbackDummy +}; + +void sub_8098A38(s8 a0) +{ + DisplayYesNoMenu(23, 10, 0); + Menu_MoveCursor(a0); +} + +void sub_8098A5C(void) +{ + Menu_DestroyCursor(); + Menu_EraseWindowRect(10, 16, 29, 19); + Menu_EraseWindowRect(23, 10, 29, 15); +} + +void sub_8098A80(void) +{ + sub_809CDCC(); + sub_809CDEC(12); + sub_809CDEC(13); + sub_809CDEC(14); + sub_809CDEC(15); + sub_809CE84(); +} + +void sub_8098AA8(u8 a0) +{ + sub_809CDCC(); + switch (a0) + { + case 0: + sub_809CDEC(16); + sub_809CDEC(17); + sub_809CDEC(18); + sub_809CDEC(19); + break; + case 1: + sub_809CDEC(20); + sub_809CDEC(21); + sub_809CDEC(22); + sub_809CDEC(23); + break; + case 2: + sub_809CDEC(24); + sub_809CDEC(25); + sub_809CDEC(26); + sub_809CDEC(27); + break; + case 3: + sub_809CDEC(28); + sub_809CDEC(29); + sub_809CDEC(30); + sub_809CDEC(31); + break; + } + sub_809CE84(); +} diff --git a/src/pokemon/pokemon_storage_system_3.c b/src/pokemon/pokemon_storage_system_3.c new file mode 100644 index 000000000..da26c6fc5 --- /dev/null +++ b/src/pokemon/pokemon_storage_system_3.c @@ -0,0 +1,655 @@ + +// Includes +#include "global.h" +#include "constants/species.h" +#include "sprite.h" +#include "trig.h" +#include "pokemon_icon.h" +#include "pokemon_storage_system.h" + +// Static type declarations + +// Static RAM declarations + +// Static ROM declarations + +static void sub_8098E68(struct Sprite *sprite); +static void sub_8099388(struct Sprite *sprite, u16 a1); +static void sub_80993F4(struct Sprite *sprite); +static void sub_80999C4(struct Sprite *sprite); +static struct Sprite *PSS_SpawnMonIconSprite(u16 species, u32 personality, s16 x, s16 y, u8 priority, u8 subpriority); +static void PSS_DestroyMonIconSprite(struct Sprite *sprite); + +// .rodata + +const struct OamData gOamData_83B6F2C; + +// .text + +u8 get_preferred_box(void) +{ + return gPokemonStorage.currentBox; +} + +void ResetPSSMonIconSprites(void) +{ + u16 i; + + sub_809D51C(); + for (i = 0; i < 40; i++) + gPokemonStorageSystemPtr->unk_10d0[i] = 0; + for (i = 0; i < 40; i++) + gPokemonStorageSystemPtr->unk_1120[i] = 0; + for (i = 0; i < 6; i++) + gPokemonStorageSystemPtr->unk_1038[i] = NULL; + for (i = 0; i < 30; i++) + gPokemonStorageSystemPtr->unk_1050[i] = NULL; + gPokemonStorageSystemPtr->unk_1034 = NULL; + gPokemonStorageSystemPtr->unk_0d5c = 0; +} + +void sub_8098BF0(void) +{ + u32 personality = GetMonData(&gPokemonStorageSystemPtr->unk_25b4, MON_DATA_PERSONALITY); + gPokemonStorageSystemPtr->unk_1034 = PSS_SpawnMonIconSprite(GetMonData(&gPokemonStorageSystemPtr->unk_25b4, MON_DATA_SPECIES2), personality, 0, 0, 1, 7); + gPokemonStorageSystemPtr->unk_1034->callback = sub_80999C4; +} + +void SpawnBoxIconSprites(u8 boxId) +{ + struct BoxPokemon *box = gPokemonStorage.boxes[boxId]; + u16 i; + u16 k = 0; + for (i = 0; i < 5; i++) + { + u16 j; + for (j = 0; j < 6; j++) + { + u16 species = GetBoxMonData(box, MON_DATA_SPECIES2); + if (species != SPECIES_NONE) + gPokemonStorageSystemPtr->unk_1050[k] = PSS_SpawnMonIconSprite(species, GetBoxMonData(box, MON_DATA_PERSONALITY), 24 * j + 0x64, 24 * i + 0x2c, 2, 18 - j); + else + gPokemonStorageSystemPtr->unk_1050[k] = NULL; + box++; + k++; + } + } +} + +void sub_8098D20(u8 monId) +{ + struct BoxPokemon *mon = gPokemonStorage.boxes[get_preferred_box()] + monId; + u16 species = GetBoxMonData(mon, MON_DATA_SPECIES2); + if (species != SPECIES_NONE) + { + s16 x = 24 * (monId % 6) + 0x64; + s16 y = 24 * (monId / 6) + 0x2c; + gPokemonStorageSystemPtr->unk_1050[monId] = PSS_SpawnMonIconSprite(species, GetBoxMonData(mon, MON_DATA_PERSONALITY), x, y, 2, 18 - (monId % 6)); + } +} + +static void sub_8098DE0(s16 a0) +{ + u16 monId; + for (monId = 0; monId < 30; monId++) + { + if (gPokemonStorageSystemPtr->unk_1050[monId]) + { + gPokemonStorageSystemPtr->unk_1050[monId]->data[2] = a0; + gPokemonStorageSystemPtr->unk_1050[monId]->data[4] = 1; + gPokemonStorageSystemPtr->unk_1050[monId]->callback = sub_8098E68; + } + } +} + +static void sub_8098E24(struct Sprite *sprite) +{ + if (sprite->data[1] != 0) + { + sprite->data[1]--; + sprite->pos1.x += sprite->data[2]; + } + else + { + gPokemonStorageSystemPtr->unk_1178--; + sprite->pos1.x = sprite->data[3]; + sprite->callback = SpriteCallbackDummy; + } +} + +static void sub_8098E68(struct Sprite *sprite) +{ + if (sprite->data[4] != 0) + { + sprite->data[4]--; + } + else + { + sprite->pos1.x += sprite->data[2]; + sprite->data[5] = sprite->pos1.x + sprite->pos2.x; + if (sprite->data[5] < 0x45 || sprite->data[5] > 0xfb) + sprite->callback = SpriteCallbackDummy; + } +} + +static void sub_8098EA0(u8 col) +{ + u16 i; + + for (i = 0; i < 5; i++) + { + if (gPokemonStorageSystemPtr->unk_1050[col]) + { + PSS_DestroyMonIconSprite(gPokemonStorageSystemPtr->unk_1050[col]); + gPokemonStorageSystemPtr->unk_1050[col] = NULL; + } + col += 6; + } +} + +static u8 sub_8098EE0(u8 col, u16 a1, s16 a2) +{ + u16 i; + u16 x; + u16 y; + u8 count; + u8 x1; + u16 curX; + + y = 0x2c; + x = 24 * col + 0x64; + curX = x - (a1 + 1) * a2; + x1 = 18 - col; + count = 0; + + for (i = 0; i < 5; i++) + { + u16 species = GetBoxMonData(gPokemonStorage.boxes[gPokemonStorageSystemPtr->unk_117d] + col, MON_DATA_SPECIES2); + if (species != SPECIES_NONE) + { + gPokemonStorageSystemPtr->unk_1050[col] = PSS_SpawnMonIconSprite(species, GetBoxMonData(gPokemonStorage.boxes[gPokemonStorageSystemPtr->unk_117d] + col, MON_DATA_PERSONALITY), curX, y, 2, x1); + if (gPokemonStorageSystemPtr->unk_1050[col]) + { + gPokemonStorageSystemPtr->unk_1050[col]->data[1] = a1; + gPokemonStorageSystemPtr->unk_1050[col]->data[2] = a2; + gPokemonStorageSystemPtr->unk_1050[col]->data[3] = x; + gPokemonStorageSystemPtr->unk_1050[col]->callback = sub_8098E24; + count++; + } + } + col += 6; + y += 24; + } + return count; +} + +void sub_809900C(u8 a0, s8 a1) +{ + gPokemonStorageSystemPtr->unk_117c = 0; + gPokemonStorageSystemPtr->unk_117d = a0; + gPokemonStorageSystemPtr->unk_117b = a1; + gPokemonStorageSystemPtr->unk_1172 = 32; + gPokemonStorageSystemPtr->unk_1176 = -6 * a1; + gPokemonStorageSystemPtr->unk_1178 = 0; + if (a1 > 0) + gPokemonStorageSystemPtr->unk_117a = 0; + else + gPokemonStorageSystemPtr->unk_117a = 5; + gPokemonStorageSystemPtr->unk_1174 = 24 * gPokemonStorageSystemPtr->unk_117a + 0x64; + sub_8098DE0(gPokemonStorageSystemPtr->unk_1176); +} + +bool8 sub_80990AC(void) +{ + if (gPokemonStorageSystemPtr->unk_1172) + gPokemonStorageSystemPtr->unk_1172--; + switch (gPokemonStorageSystemPtr->unk_117c) + { + case 0: + gPokemonStorageSystemPtr->unk_1174 += gPokemonStorageSystemPtr->unk_1176; + if (gPokemonStorageSystemPtr->unk_1174 < 0x41 || gPokemonStorageSystemPtr->unk_1174 > 0xfb) + { + sub_8098EA0(gPokemonStorageSystemPtr->unk_117a); + gPokemonStorageSystemPtr->unk_1174 += 24 * gPokemonStorageSystemPtr->unk_117b; + gPokemonStorageSystemPtr->unk_117c++; + } + break; + case 1: + gPokemonStorageSystemPtr->unk_1174 += gPokemonStorageSystemPtr->unk_1176; + gPokemonStorageSystemPtr->unk_1178 += sub_8098EE0(gPokemonStorageSystemPtr->unk_117a, gPokemonStorageSystemPtr->unk_1172, gPokemonStorageSystemPtr->unk_1176); + if ((gPokemonStorageSystemPtr->unk_117b > 0 && gPokemonStorageSystemPtr->unk_117a == 5) || (gPokemonStorageSystemPtr->unk_117b < 0 && gPokemonStorageSystemPtr->unk_117a == 0)) + { + gPokemonStorageSystemPtr->unk_117c++; + } + else + { + gPokemonStorageSystemPtr->unk_117a += gPokemonStorageSystemPtr->unk_117b; + gPokemonStorageSystemPtr->unk_117c = 0; + } + break; + case 2: + if (gPokemonStorageSystemPtr->unk_1178 == 0) + { + gPokemonStorageSystemPtr->unk_1172++; + return FALSE; + } + break; + default: + return FALSE; + } + return TRUE; +} + +void sub_8099200(bool8 a0) +{ + u16 count; + u16 i; + u16 species = GetMonData(gPlayerParty + 0, MON_DATA_SPECIES2); + u32 personality = GetMonData(gPlayerParty + 0, MON_DATA_PERSONALITY); + gPokemonStorageSystemPtr->unk_1038[0] = PSS_SpawnMonIconSprite(species, personality, 0x68, 0x40, 1, 11); + count = 1; + for (i = 1; i < PARTY_SIZE; i++) + { + species = GetMonData(gPlayerParty + i, MON_DATA_SPECIES2); + if (species != SPECIES_NONE) + { + personality = GetMonData(gPlayerParty + i, MON_DATA_PERSONALITY); + gPokemonStorageSystemPtr->unk_1038[i] = PSS_SpawnMonIconSprite(species, personality, 0x98, (i - 1) * 24 + 0x10, 1, 11); + count++; + } + else + { + gPokemonStorageSystemPtr->unk_1038[i] = NULL; + } + } + if (!a0) + { + for (i = 0; i < count; i++) + { + // this routine assumes party_compaction has been called + gPokemonStorageSystemPtr->unk_1038[i]->pos1.y -= 0xa0; + gPokemonStorageSystemPtr->unk_1038[i]->invisible = TRUE; + } + } +} + +void sub_8099310(void) +{ + u16 i; + u16 count; + + gPokemonStorageSystemPtr->unk_1171 = 0; + for (i = 0, count = 0; i < PARTY_SIZE; i++) + { + if (gPokemonStorageSystemPtr->unk_1038[i]) + { + if (i != count) + { + sub_8099388(gPokemonStorageSystemPtr->unk_1038[i], count); + gPokemonStorageSystemPtr->unk_1038[i] = NULL; + gPokemonStorageSystemPtr->unk_1171++; + } + count++; + } + } +} + +u8 sub_8099374(void) +{ + return gPokemonStorageSystemPtr->unk_1171; +} + +static void sub_8099388(struct Sprite *sprite, u16 a1) +{ + s16 r3; + s16 r4; + + sprite->data[1] = a1; + if (a1 == 0) + { + r3 = 0x68; + r4 = 0x40; + } + else + { + r3 = 0x98; + r4 = 24 * (a1 - 1) + 0x10; + } + sprite->data[2] = sprite->pos1.x << 3; + sprite->data[3] = sprite->pos1.y << 3; + sprite->data[4] = (r3 * 8 - sprite->data[2]) / 8; + sprite->data[5] = (r4 * 8 - sprite->data[3]) / 8; + sprite->data[6] = 8; + sprite->callback = sub_80993F4; +} + +static void sub_80993F4(struct Sprite *sprite) +{ + if (sprite->data[6]) + { + sprite->data[2] += sprite->data[4]; + sprite->data[3] += sprite->data[5]; + sprite->pos1.x = sprite->data[2] >> 3; + sprite->pos1.y = sprite->data[3] >> 3; + sprite->data[6]--; + } + else + { + if (sprite->data[1] == 0) + { + sprite->pos1.x = 0x68; + sprite->pos1.y = 0x40; + } + else + { + sprite->pos1.x = 0x98; + sprite->pos1.y = (sprite->data[1] - 1) * 24 + 0x10; + } + sprite->callback = SpriteCallbackDummy; + gPokemonStorageSystemPtr->unk_1038[sprite->data[1]] = sprite; + gPokemonStorageSystemPtr->unk_1171--; + } +} + +void sub_8099480(void) +{ + if (gPokemonStorageSystemPtr->unk_1034) + { + PSS_DestroyMonIconSprite(gPokemonStorageSystemPtr->unk_1034); + gPokemonStorageSystemPtr->unk_1034 = NULL; + } +} + +void sub_80994A8(s16 y) +{ + u16 i; + + for (i = 0; i < PARTY_SIZE; i++) + { + if (gPokemonStorageSystemPtr->unk_1038[i]) + { + s16 yy; + gPokemonStorageSystemPtr->unk_1038[i]->pos1.y += y; + yy = gPokemonStorageSystemPtr->unk_1038[i]->pos1.y + gPokemonStorageSystemPtr->unk_1038[i]->pos2.y + gPokemonStorageSystemPtr->unk_1038[i]->centerToCornerVecY; + if (yy < -0x10 || yy > 0xb0) + gPokemonStorageSystemPtr->unk_1038[i]->invisible = TRUE; + else + gPokemonStorageSystemPtr->unk_1038[i]->invisible = FALSE; + } + } +} + +void sub_8099520(u8 a0) +{ + if (gPokemonStorageSystemPtr->unk_1038[a0]) + { + PSS_DestroyMonIconSprite(gPokemonStorageSystemPtr->unk_1038[a0]); + gPokemonStorageSystemPtr->unk_1038[a0] = NULL; + } +} + +void sub_809954C(void) +{ + u16 i; + + for (i = 0; i < PARTY_SIZE; i++) + { + if (gPokemonStorageSystemPtr->unk_1038[i]) + { + PSS_DestroyMonIconSprite(gPokemonStorageSystemPtr->unk_1038[i]); + gPokemonStorageSystemPtr->unk_1038[i] = NULL; + } + } +} + +void sub_8099584(u8 a0, u8 a1) +{ + if (a0 == 0) + { + gPokemonStorageSystemPtr->unk_1034 = gPokemonStorageSystemPtr->unk_1038[a1]; + gPokemonStorageSystemPtr->unk_1038[a1] = NULL; + } + else if (a0 == 1) + { + gPokemonStorageSystemPtr->unk_1034 = gPokemonStorageSystemPtr->unk_1050[a1]; + gPokemonStorageSystemPtr->unk_1050[a1] = NULL; + } + else + { + return; + } + gPokemonStorageSystemPtr->unk_1034->callback = sub_80999C4; + gPokemonStorageSystemPtr->unk_1034->oam.priority = 1; + gPokemonStorageSystemPtr->unk_1034->subpriority = 7; +} + +void sub_809960C(u8 a0, u8 a1) +{ + if (a0 == 14) + { + gPokemonStorageSystemPtr->unk_1038[a1] = gPokemonStorageSystemPtr->unk_1034; + gPokemonStorageSystemPtr->unk_1038[a1]->oam.priority = 1; + gPokemonStorageSystemPtr->unk_1038[a1]->subpriority = 11; + } + else + { + gPokemonStorageSystemPtr->unk_1050[a1] = gPokemonStorageSystemPtr->unk_1034; + gPokemonStorageSystemPtr->unk_1050[a1]->oam.priority = 2; + gPokemonStorageSystemPtr->unk_1050[a1]->subpriority = 18 - (a1 % 6); + } + gPokemonStorageSystemPtr->unk_1034->callback = SpriteCallbackDummy; + gPokemonStorageSystemPtr->unk_1034 = NULL; +} + +void sub_80996B0(u8 a0, u8 a1) +{ + if (a0 == 14) + gPokemonStorageSystemPtr->unk_10c8 = gPokemonStorageSystemPtr->unk_1038 + a1; + else + gPokemonStorageSystemPtr->unk_10c8 = gPokemonStorageSystemPtr->unk_1050 + a1; + gPokemonStorageSystemPtr->unk_1034->callback = SpriteCallbackDummy; + gPokemonStorageSystemPtr->unk_1170 = 0; +} + +bool8 sub_809971C(void) +{ + if (gPokemonStorageSystemPtr->unk_1170 == 16) + return FALSE; + gPokemonStorageSystemPtr->unk_1170++; + if (gPokemonStorageSystemPtr->unk_1170 & 1) + { + (*gPokemonStorageSystemPtr->unk_10c8)->pos1.y--; + gPokemonStorageSystemPtr->unk_1034->pos1.y++; + } + (*gPokemonStorageSystemPtr->unk_10c8)->pos2.x = gSineTable[gPokemonStorageSystemPtr->unk_1170 * 8] / 16; + gPokemonStorageSystemPtr->unk_1034->pos2.x = -(gSineTable[gPokemonStorageSystemPtr->unk_1170 * 8] / 16); + if (gPokemonStorageSystemPtr->unk_1170 == 8) + { + gPokemonStorageSystemPtr->unk_1034->oam.priority = (*gPokemonStorageSystemPtr->unk_10c8)->oam.priority; + gPokemonStorageSystemPtr->unk_1034->subpriority = (*gPokemonStorageSystemPtr->unk_10c8)->subpriority; + (*gPokemonStorageSystemPtr->unk_10c8)->oam.priority = 1; + (*gPokemonStorageSystemPtr->unk_10c8)->subpriority = 7; + } + if (gPokemonStorageSystemPtr->unk_1170 == 16) + { + struct Sprite *sprite = gPokemonStorageSystemPtr->unk_1034; + gPokemonStorageSystemPtr->unk_1034 = *(gPokemonStorageSystemPtr->unk_10c8); + (*gPokemonStorageSystemPtr->unk_10c8) = sprite; + gPokemonStorageSystemPtr->unk_1034->callback = sub_80999C4; + (*gPokemonStorageSystemPtr->unk_10c8)->callback = SpriteCallbackDummy; + } + return TRUE; +} + +const union AffineAnimCmd *const gSpriteAffineAnimTable_83B6F5C[]; + +void sub_809981C(u8 mode, u8 idx) +{ + switch (mode) + { + case 0: + gPokemonStorageSystemPtr->unk_10cc = gPokemonStorageSystemPtr->unk_1038 + idx; + break; + case 1: + gPokemonStorageSystemPtr->unk_10cc = gPokemonStorageSystemPtr->unk_1050 + idx; + break; + case 2: + gPokemonStorageSystemPtr->unk_10cc = &gPokemonStorageSystemPtr->unk_1034; + break; + default: + return; + } + if (*gPokemonStorageSystemPtr->unk_10cc) + { + InitSpriteAffineAnim(*gPokemonStorageSystemPtr->unk_10cc); + (*gPokemonStorageSystemPtr->unk_10cc)->oam.affineMode = ST_OAM_AFFINE_NORMAL; + (*gPokemonStorageSystemPtr->unk_10cc)->affineAnims = gSpriteAffineAnimTable_83B6F5C; + StartSpriteAffineAnim(*gPokemonStorageSystemPtr->unk_10cc, 0); + } +} + +bool8 sub_80998D8(void) +{ + if (*gPokemonStorageSystemPtr->unk_10cc == NULL || (*gPokemonStorageSystemPtr->unk_10cc)->invisible) + return FALSE; + if ((*gPokemonStorageSystemPtr->unk_10cc)->affineAnimEnded) + { + (*gPokemonStorageSystemPtr->unk_10cc)->invisible = TRUE; + } + return TRUE; +} + +void sub_8099920(void) +{ + if (*gPokemonStorageSystemPtr->unk_10cc) + { + FreeOamMatrix((*gPokemonStorageSystemPtr->unk_10cc)->oam.matrixNum); + PSS_DestroyMonIconSprite(*gPokemonStorageSystemPtr->unk_10cc); + *gPokemonStorageSystemPtr->unk_10cc = NULL; + } +} + +void sub_8099958(void) +{ + if (*gPokemonStorageSystemPtr->unk_10cc) + { + (*gPokemonStorageSystemPtr->unk_10cc)->invisible = FALSE; + StartSpriteAffineAnim(*gPokemonStorageSystemPtr->unk_10cc, 1); + } +} + +bool8 sub_8099990(void) +{ + if (gPokemonStorageSystemPtr->unk_10cc == NULL) + return FALSE; + if ((*gPokemonStorageSystemPtr->unk_10cc)->affineAnimEnded) + gPokemonStorageSystemPtr->unk_10cc = NULL; + return TRUE; +} + +static void sub_80999C4(struct Sprite *sprite) +{ + sprite->pos1.x = gPokemonStorageSystemPtr->unk_11c0->pos1.x; + sprite->pos1.y = gPokemonStorageSystemPtr->unk_11c0->pos1.y + gPokemonStorageSystemPtr->unk_11c0->pos2.y + 4; +} + +static u16 PSS_LoadSpeciesIconGfx(u16 a0) +{ + u16 i; + u16 retval; + + for (i = 0; i < 40; i++) + { + if (gPokemonStorageSystemPtr->unk_1120[i] == a0) + break; + } + if (i == 40) + { + for (i = 0; i < 40; i++) + { + if (gPokemonStorageSystemPtr->unk_1120[i] == 0) + break; + } + } + if (i != 40) + { + gPokemonStorageSystemPtr->unk_1120[i] = a0; + gPokemonStorageSystemPtr->unk_10d0[i]++; + retval = i * 16; + CpuCopy32(gMonIconTable[a0], BG_CHAR_ADDR(4) + 32 * retval, 0x200); + return retval; + } + return 0xFFFF; +} + +static void PSS_ForgetSpeciesIcon(u16 a0) +{ + u16 i; + + for (i = 0; i < 40; i++) + { + if (gPokemonStorageSystemPtr->unk_1120[i] == a0) + { + if (--gPokemonStorageSystemPtr->unk_10d0[i] == 0) + gPokemonStorageSystemPtr->unk_1120[i] = 0; + break; + } + } +} + +static struct Sprite *PSS_SpawnMonIconSprite(u16 species, u32 personality, s16 x, s16 y, u8 priority, u8 subpriority) +{ + struct SpriteTemplate template = { + 0x000f, + 0xdac0, + &gOamData_83B6F2C, + gDummySpriteAnimTable, + NULL, + gDummySpriteAffineAnimTable, + SpriteCallbackDummy + }; + u16 tileNum; + u8 spriteId; + + species = mon_icon_convert_unown_species_id(species, personality); + template.paletteTag = 0xdac0 + gMonIconPaletteIndices[species]; + tileNum = PSS_LoadSpeciesIconGfx(species); + if (tileNum == 0xFFFF) + return NULL; + spriteId = CreateSprite(&template, x, y, subpriority); + if (spriteId == MAX_SPRITES) + { + PSS_ForgetSpeciesIcon(species); + return NULL; + } + gSprites[spriteId].oam.tileNum = tileNum; + gSprites[spriteId].oam.priority = priority; + gSprites[spriteId].data[0] = species; + return gSprites + spriteId; +} + +static void PSS_DestroyMonIconSprite(struct Sprite *sprite) +{ + PSS_ForgetSpeciesIcon(sprite->data[0]); + DestroySprite(sprite); +} + +const struct OamData gOamData_83B6F2C = { + .size = 2 +}; + +const union AffineAnimCmd gSpriteAffineAnim_83B6F34[] = { + AFFINEANIMCMD_FRAME(-2, -2, 0, 120), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd gSpriteAffineAnim_83B6F44[] = { + AFFINEANIMCMD_FRAME(16, 16, 0, 0), + AFFINEANIMCMD_FRAME(16, 16, 0, 15), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_83B6F5C[] = { + gSpriteAffineAnim_83B6F34, + gSpriteAffineAnim_83B6F44 +}; diff --git a/src/pokemon/pokemon_storage_system_4.c b/src/pokemon/pokemon_storage_system_4.c new file mode 100644 index 000000000..19fddc0f7 --- /dev/null +++ b/src/pokemon/pokemon_storage_system_4.c @@ -0,0 +1,2849 @@ + +// Includes +#include "global.h" +#include "ewram.h" +#include "data2.h" +#include "constants/moves.h" +#include "constants/species.h" +#include "palette.h" +#include "string_util.h" +#include "text.h" +#include "menu.h" +#include "item.h" +#include "pokemon_summary_screen.h" +#include "pokemon_storage_system.h" + +// Static type declarations + +struct WallpaperTable { + const u8 *tiles; + u32 size; + const u8 *tileMap; + const u16 *palettes; +}; + +// Static RAM declarations + +EWRAM_DATA struct Pokemon gUnknown_02038480 = {}; +#if DEBUG +EWRAM_DATA u32 unk_2038790 = 0; +EWRAM_DATA u32 unk_2038794 = 0; +EWRAM_DATA u32 unk_2038798 = 0; +#endif +EWRAM_DATA s8 gUnknown_020384E4 = 0; +EWRAM_DATA s8 gUnknown_020384E5 = 0; +EWRAM_DATA bool8 gUnknown_020384E6 = FALSE; +EWRAM_DATA u8 gUnknown_020384E7 = 0; +EWRAM_DATA u8 gUnknown_020384E8 = 0; +EWRAM_DATA u8 gUnknown_020384E9 = 0; +EWRAM_DATA u8 gUnknown_020384EA = 0; + +// Static ROM declarations + +void sub_809900C(u8 boxId, s8 a1); +s8 sub_8099D90(u8 boxId); +void sub_8099EB0(u8 boxId, s8 a1); +void sub_8099F58(u16 *vdest, const u16 *src, s8 a2, u8 a3); +void sub_809A14C(u16 *vdest); +void sub_809A23C(u8 boxId); +void sub_809A3D0(u8 boxId, s8 a1); +void sub_809A598(void); +void sub_809A5E8(struct Sprite *sprite); +void sub_809A61C(struct Sprite *sprite); +void sub_809A654(void); +s16 sub_809A6D0(u8 width); +void sub_809A6DC(void); +void sub_809A774(s8 a0); +void sub_809A810(void); +void sub_809AFB8(void); +void sub_809A8C8(struct Sprite *sprite); +bool8 sub_809B150(void); +bool8 sub_809B1D8(void); +bool8 sub_809B24C(void); +bool8 sub_809B324(void); +bool8 sub_809B358(void); +void sub_809B384(void); +void sub_809B3E0(void); +void sub_809B44C(u8 a0, u8 a1); +void diegohint2(u8 a0, u8 a1); +void sub_809B548(u8 a0, u8 a1); +void diegohint1(u8 a0, u8 a1); +bool8 sub_809BF2C(void); +void sub_809BF74(void); +void sub_809C028(void); +void sub_809C04C(void *pokemon, u8 a1); +bool8 sub_809CAB0(void); +void sub_809CC04(void); +void sub_809CD88(void); +s8 sub_809CE4C(u8 a0); + +// .rodata + +const u16 gWallpaperPalettes_Forest[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_Forest_2[] = INCBIN_U16("graphics/pokemon_storage/forest_frame.gbapal"); +const u16 gWallpaperPalettes_Forest_2_3[] = INCBIN_U16("graphics/pokemon_storage/forest_bg.gbapal"); + +const u8 gWallpaperTiles_Forest[] = INCBIN_U8("graphics/pokemon_storage/forest.4bpp.lz"); + +const u8 gWallpaperTilemap_Forest[] = INCBIN_U8("graphics/pokemon_storage/forest.bin.lz"); + +const u16 gWallpaperPalettes_City[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_City_2[] = INCBIN_U16("graphics/pokemon_storage/city_frame.gbapal"); +const u16 gWallpaperPalettes_City_2_3[] = INCBIN_U16("graphics/pokemon_storage/city_bg.gbapal"); + +const u8 gWallpaperTiles_City[] = INCBIN_U8("graphics/pokemon_storage/city.4bpp.lz"); + +const u8 gWallpaperTilemap_City[] = INCBIN_U8("graphics/pokemon_storage/city.bin.lz"); + +const u16 gWallpaperPalettes_Desert[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_Desert_2[] = INCBIN_U16("graphics/pokemon_storage/desert_frame.gbapal"); +const u16 gWallpaperPalettes_Desert_2_3[] = INCBIN_U16("graphics/pokemon_storage/desert_bg.gbapal"); + +const u8 gWallpaperTiles_Desert[] = INCBIN_U8("graphics/pokemon_storage/desert.4bpp.lz"); + +const u8 gWallpaperTilemap_Desert[] = INCBIN_U8("graphics/pokemon_storage/desert.bin.lz"); + +const u16 gWallpaperPalettes_Savanna[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_Savanna_2[] = INCBIN_U16("graphics/pokemon_storage/savanna_frame.gbapal"); +const u16 gWallpaperPalettes_Savanna_2_3[] = INCBIN_U16("graphics/pokemon_storage/savanna_bg.gbapal"); + +const u8 gWallpaperTiles_Savanna[] = INCBIN_U8("graphics/pokemon_storage/savanna.4bpp.lz"); + +const u8 gWallpaperTilemap_Savanna[] = INCBIN_U8("graphics/pokemon_storage/savanna.bin.lz"); + +const u16 gWallpaperPalettes_Crag[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_Crag_2[] = INCBIN_U16("graphics/pokemon_storage/crag_frame.gbapal"); +const u16 gWallpaperPalettes_Crag_2_3[] = INCBIN_U16("graphics/pokemon_storage/crag_bg.gbapal"); + +const u8 gWallpaperTiles_Crag[] = INCBIN_U8("graphics/pokemon_storage/crag.4bpp.lz"); + +const u8 gWallpaperTilemap_Crag[] = INCBIN_U8("graphics/pokemon_storage/crag.bin.lz"); + +const u16 gWallpaperPalettes_Volcano[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_Volcano_2[] = INCBIN_U16("graphics/pokemon_storage/volcano_frame.gbapal"); +const u16 gWallpaperPalettes_Volcano_2_3[] = INCBIN_U16("graphics/pokemon_storage/volcano_bg.gbapal"); + +const u8 gWallpaperTiles_Volcano[] = INCBIN_U8("graphics/pokemon_storage/volcano.4bpp.lz"); +const u32 filler_83b871c = 0; // needed to match but otherwise garbage + +const u8 gWallpaperTilemap_Volcano[] = INCBIN_U8("graphics/pokemon_storage/volcano.bin.lz"); + +const u16 gWallpaperPalettes_Snow[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_Snow_2[] = INCBIN_U16("graphics/pokemon_storage/snow_frame.gbapal"); +const u16 gWallpaperPalettes_Snow_2_3[] = INCBIN_U16("graphics/pokemon_storage/snow_bg.gbapal"); + +const u8 gWallpaperTiles_Snow[] = INCBIN_U8("graphics/pokemon_storage/snow.4bpp.lz"); + +const u8 gWallpaperTilemap_Snow[] = INCBIN_U8("graphics/pokemon_storage/snow.bin.lz"); + +const u16 gWallpaperPalettes_Cave[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_Cave_2[] = INCBIN_U16("graphics/pokemon_storage/cave_frame.gbapal"); +const u16 gWallpaperPalettes_Cave_2_3[] = INCBIN_U16("graphics/pokemon_storage/cave_bg.gbapal"); + +const u8 gWallpaperTiles_Cave[] = INCBIN_U8("graphics/pokemon_storage/cave.4bpp.lz"); + +const u8 gWallpaperTilemap_Cave[] = INCBIN_U8("graphics/pokemon_storage/cave.bin.lz"); + +const u16 gWallpaperPalettes_Beach[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_Beach_2[] = INCBIN_U16("graphics/pokemon_storage/beach_frame.gbapal"); +const u16 gWallpaperPalettes_Beach_2_3[] = INCBIN_U16("graphics/pokemon_storage/beach_bg.gbapal"); + +const u8 gWallpaperTiles_Beach[] = INCBIN_U8("graphics/pokemon_storage/beach.4bpp.lz"); + +const u8 gWallpaperTilemap_Beach[] = INCBIN_U8("graphics/pokemon_storage/beach.bin.lz"); + +const u16 gWallpaperPalettes_Seafloor[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_Seafloor_2[] = INCBIN_U16("graphics/pokemon_storage/seafloor_frame.gbapal"); +const u16 gWallpaperPalettes_Seafloor_2_3[] = INCBIN_U16("graphics/pokemon_storage/seafloor_bg.gbapal"); + +const u8 gWallpaperTiles_Seafloor[] = INCBIN_U8("graphics/pokemon_storage/seafloor.4bpp.lz"); + +const u8 gWallpaperTilemap_Seafloor[] = INCBIN_U8("graphics/pokemon_storage/seafloor.bin.lz"); + +const u16 gWallpaperPalettes_River[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_River_2[] = INCBIN_U16("graphics/pokemon_storage/river_frame.gbapal"); +const u16 gWallpaperPalettes_River_2_3[] = INCBIN_U16("graphics/pokemon_storage/river_bg.gbapal"); + +const u8 gWallpaperTiles_River[] = INCBIN_U8("graphics/pokemon_storage/river.4bpp.lz"); + +const u8 gWallpaperTilemap_River[] = INCBIN_U8("graphics/pokemon_storage/river.bin.lz"); + +const u16 gWallpaperPalettes_Sky[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_Sky_2[] = INCBIN_U16("graphics/pokemon_storage/sky_frame.gbapal"); +const u16 gWallpaperPalettes_Sky_2_3[] = INCBIN_U16("graphics/pokemon_storage/sky_bg.gbapal"); + +const u8 gWallpaperTiles_Sky[] = INCBIN_U8("graphics/pokemon_storage/sky.4bpp.lz"); + +const u8 gWallpaperTilemap_Sky[] = INCBIN_U8("graphics/pokemon_storage/sky.bin.lz"); + +const u16 gWallpaperPalettes_Polkadot[] = INCBIN_U16("graphics/pokemon_storage/box_bg2.gbapal"); +const u16 gWallpaperPalettes_Polkadot_2[] = INCBIN_U16("graphics/pokemon_storage/polkadot_frame.gbapal"); +const u16 gWallpaperPalettes_Polkadot_2_3[] = INCBIN_U16("graphics/pokemon_storage/polkadot_bg.gbapal"); + +const u8 gWallpaperTiles_Polkadot[] = INCBIN_U8("graphics/pokemon_storage/polkadot.4bpp.lz"); + +const u8 gWallpaperTilemap_Polkadot[] = INCBIN_U8("graphics/pokemon_storage/polkadot.bin.lz"); + +const u16 gWallpaperPalettes_Pokecenter[] = INCBIN_U16("graphics/pokemon_storage/box_bg2.gbapal"); +const u16 gWallpaperPalettes_Pokecenter_2[] = INCBIN_U16("graphics/pokemon_storage/pokecenter_frame.gbapal"); +const u16 gWallpaperPalettes_Pokecenter_2_3[] = INCBIN_U16("graphics/pokemon_storage/pokecenter_bg.gbapal"); + +const u8 gWallpaperTiles_Pokecenter[] = INCBIN_U8("graphics/pokemon_storage/pokecenter.4bpp.lz"); + +const u8 gWallpaperTilemap_Pokecenter[] = INCBIN_U8("graphics/pokemon_storage/pokecenter.bin.lz"); + +const u16 gWallpaperPalettes_Machine[] = INCBIN_U16("graphics/pokemon_storage/box_bg3.gbapal"); +const u16 gWallpaperPalettes_Machine_2[] = INCBIN_U16("graphics/pokemon_storage/machine_frame.gbapal"); +const u16 gWallpaperPalettes_Machine_2_3[] = INCBIN_U16("graphics/pokemon_storage/machine_bg.gbapal"); + +const u8 gWallpaperTiles_Machine[] = INCBIN_U8("graphics/pokemon_storage/machine.4bpp.lz"); + +const u8 gWallpaperTilemap_Machine[] = INCBIN_U8("graphics/pokemon_storage/machine.bin.lz"); + +const u16 gWallpaperPalettes_Plain[] = INCBIN_U16("graphics/pokemon_storage/box_bg4.gbapal"); +const u16 gWallpaperPalettes_Plain_2[] = INCBIN_U16("graphics/pokemon_storage/plain_frame.gbapal"); +const u16 gWallpaperPalettes_Plain_2_3[] = INCBIN_U16("graphics/pokemon_storage/plain_bg.gbapal"); + +const u8 gWallpaperTiles_Plain[] = INCBIN_U8("graphics/pokemon_storage/plain.4bpp.lz"); + +const u8 gWallpaperTilemap_Plain[] = INCBIN_U8("graphics/pokemon_storage/plain.bin.lz"); + +const u16 gUnknown_083BAEF8[] = INCBIN_U16("graphics/unused/tilemap_3BAEF8.bin"); + +const u16 gUnknown_083BB0A8[][2] = { + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF} +}; + +const struct WallpaperTable gWallpaperTable[] = { + {gWallpaperTiles_Forest, 0x3D0, gWallpaperTilemap_Forest, gWallpaperPalettes_Forest}, // Forest + {gWallpaperTiles_City, 0x208, gWallpaperTilemap_City, gWallpaperPalettes_City}, // City + {gWallpaperTiles_Desert, 0x2EC, gWallpaperTilemap_Desert, gWallpaperPalettes_Desert}, // Desert + {gWallpaperTiles_Savanna, 0x220, gWallpaperTilemap_Savanna, gWallpaperPalettes_Savanna}, // Savanna + {gWallpaperTiles_Crag, 0x350, gWallpaperTilemap_Crag, gWallpaperPalettes_Crag}, // Crag + {gWallpaperTiles_Volcano, 0x334, gWallpaperTilemap_Volcano, gWallpaperPalettes_Volcano}, // Volcano + {gWallpaperTiles_Snow, 0x2B8, gWallpaperTilemap_Snow, gWallpaperPalettes_Snow}, // Snow + {gWallpaperTiles_Cave, 0x344, gWallpaperTilemap_Cave, gWallpaperPalettes_Cave}, // Cave + {gWallpaperTiles_Beach, 0x384, gWallpaperTilemap_Beach, gWallpaperPalettes_Beach}, // Beach + {gWallpaperTiles_Seafloor, 0x2B4, gWallpaperTilemap_Seafloor, gWallpaperPalettes_Seafloor}, // Seafloor + {gWallpaperTiles_River, 0x294, gWallpaperTilemap_River, gWallpaperPalettes_River}, // River + {gWallpaperTiles_Sky, 0x298, gWallpaperTilemap_Sky, gWallpaperPalettes_Sky}, // Sky + {gWallpaperTiles_Polkadot, 0x1FC, gWallpaperTilemap_Polkadot, gWallpaperPalettes_Polkadot}, // Polkadot + {gWallpaperTiles_Pokecenter, 0x3A4, gWallpaperTilemap_Pokecenter, gWallpaperPalettes_Pokecenter}, // Pokecenter + {gWallpaperTiles_Machine, 0x2F0, gWallpaperTilemap_Machine, gWallpaperPalettes_Machine}, // Machine + {gWallpaperTiles_Plain, 0xFC, gWallpaperTilemap_Plain, gWallpaperPalettes_Plain} // Plain +}; + +const u16 PCPal_Arrow[] = INCBIN_U16("graphics/pokemon_storage/arrow.gbapal"); +const u8 PCGfx_Arrow[] = INCBIN_U8("graphics/pokemon_storage/arrow.4bpp"); + +const struct SpriteSheet gUnknown_083BB288 = {PCGfx_Arrow, 0x80, 6}; +const struct SpritePalette gUnknown_083BB290 = {PCPal_Arrow, 0xdacf}; + +const struct OamData gOamData_83BB298 = { + .shape = ST_OAM_H_RECTANGLE, + .size = 2, + .priority = 2 +}; + +const union AnimCmd gSpriteAnim_83BB2A0[] = { + ANIMCMD_FRAME(0, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_83BB2A8[] = { + ANIMCMD_FRAME(8, 5), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_83BB2B0[] = { + gSpriteAnim_83BB2A0, + gSpriteAnim_83BB2A8 +}; + +const struct SpriteTemplate gSpriteTemplate_83BB2B8 = { + 3, + 0xdac8, + &gOamData_83BB298, + gSpriteAnimTable_83BB2B0, + NULL, + gDummySpriteAffineAnimTable, + SpriteCallbackDummy +}; + +const struct OamData gOamData_83BB2D0 = { + .shape = ST_OAM_V_RECTANGLE, + .priority = 2 +}; + +const union AnimCmd gSpriteAnim_83BB2D8[] = { + ANIMCMD_FRAME(0, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_83BB2E0[] = { + ANIMCMD_FRAME(2, 5), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_83BB2E8[] = { + gSpriteAnim_83BB2D8, + gSpriteAnim_83BB2E0 +}; + +const struct SpriteTemplate gSpriteTemplate_83BB2F0 = { + 6, + 0xdacf, + &gOamData_83BB2D0, + gSpriteAnimTable_83BB2E8, + NULL, + gDummySpriteAffineAnimTable, + sub_809A8C8 +}; + +const u16 HandCursorPalette[] = INCBIN_U16("graphics/pokemon_storage/hand_cursor_pal.bin"); +const u16 HandCursorAltPalette[] = INCBIN_U16("graphics/pokemon_storage/hand_cursor_alt_pal.bin"); +const u8 HandCursorTiles[] = INCBIN_U8("graphics/pokemon_storage/hand_cursor.4bpp"); +const u8 HandCursorShadowTiles[] = INCBIN_U8("graphics/pokemon_storage/hand_cursor_shadow.4bpp"); + +bool8 (*const gUnknown_083BBBC8[])(void) = { + sub_809B150, + sub_809B1D8, + sub_809B24C +}; +// .text + +void sub_8099BF8(u8 boxId) +{ + gPokemonStorageSystemPtr->unk_08ba = FALSE; + gPokemonStorageSystemPtr->unk_08b4 = 0; + DmaFill32(3, 0, BG_SCREEN_ADDR(26), 0x1000); + sub_8099EB0(boxId, 0); + sub_809A23C(boxId); + sub_809A6DC(); + SpawnBoxIconSprites(boxId); + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(26) | BGCNT_TXT512x256; +} + +void sub_8099C70(u8 whichBox) +{ + s8 r4 = sub_8099D90(whichBox); + sub_8099EB0(whichBox, r4); + gPokemonStorageSystemPtr->unk_08b6 = r4 * 6; + gPokemonStorageSystemPtr->unk_08b8 = 0x20; + gPokemonStorageSystemPtr->unk_08bb = whichBox; + gPokemonStorageSystemPtr->unk_08bc = r4 > 0 ? 0 : 5; + gPokemonStorageSystemPtr->unk_08be = r4; + gPokemonStorageSystemPtr->unk_08c0 = r4 > 0 ? 0x108 : 0x38; + gPokemonStorageSystemPtr->unk_08c2 = r4 > 0 ? 0 : 5; + gPokemonStorageSystemPtr->unk_08c4 = r4; + gPokemonStorageSystemPtr->unk_08c6 = 0; + gPokemonStorageSystemPtr->unk_08c8 = 2; + sub_809900C(whichBox, r4); + sub_809A3D0(whichBox, r4); + sub_809A774(r4); +} + +bool8 sub_8099D34(void) +{ + bool8 retVal = sub_80990AC(); + if (gPokemonStorageSystemPtr->unk_08b8 != 0) + { + gPokemonStorageSystemPtr->unk_08b4 += gPokemonStorageSystemPtr->unk_08b6; + gPokemonStorageSystemPtr->unk_08b4 &= 0x1ff; + if (--gPokemonStorageSystemPtr->unk_08b8 == 0) + { + sub_809A598(); + sub_809A810(); + } + return TRUE; + } + return retVal; +} + +s8 sub_8099D90(u8 boxId) +{ + u8 curBox = get_preferred_box(); + u8 i; + + for (i = 0; curBox != boxId; i++) + { + if (++curBox >= 14) + curBox = 0; + } + return i <= 6 ? 1 : -1; +} + +void sub_8099DCC(u8 wallpaperId) +{ + u8 curBox = get_preferred_box(); + gPokemonStorage.wallpaper[curBox] = wallpaperId; + gPokemonStorageSystemPtr->unk_1032 = 0; +} + +bool8 sub_8099E08(void) +{ + switch (gPokemonStorageSystemPtr->unk_1032) + { + case 0: + BeginNormalPaletteFade(gPokemonStorageSystemPtr->unk_0d08, 1, 0, 0x10, 0xffff); + gPokemonStorageSystemPtr->unk_1032++; + break; + case 1: + if (!UpdatePaletteFade()) + { + u8 curBox = get_preferred_box(); + sub_8099EB0(curBox, 0); + sub_809A654(); + BeginNormalPaletteFade(gPokemonStorageSystemPtr->unk_0d08, 1, 0x10, 0, 0xffff); + gPokemonStorageSystemPtr->unk_1032++; + } + break; + case 2: + if (!UpdatePaletteFade()) + gPokemonStorageSystemPtr->unk_1032++; + break; + case 3: + return FALSE; + } + return TRUE; +} + +void sub_8099EB0(u8 boxId, s8 a1) +{ + const struct WallpaperTable *wallpaperTable; + + if (a1) + { + gPokemonStorageSystemPtr->unk_08ba = gPokemonStorageSystemPtr->unk_08ba ? FALSE : TRUE; + sub_809A14C(BG_SCREEN_ADDR(26)); + } + wallpaperTable = gWallpaperTable +gPokemonStorage.wallpaper[boxId]; + LoadPalette(wallpaperTable->palettes, gPokemonStorageSystemPtr->unk_08ba * 0x30 + 0x40, 0x60); + LZ77UnCompWram(wallpaperTable->tileMap, gPokemonStorageSystemPtr->unk_0d62); + sub_8099F58(BG_SCREEN_ADDR(26), gPokemonStorageSystemPtr->unk_0d62, a1, gPokemonStorageSystemPtr->unk_08ba); + LZ77UnCompVram(wallpaperTable->tiles, BG_CHAR_ADDR(2) + (gPokemonStorageSystemPtr->unk_08ba << 13)); +} + +#ifdef NONMATCHING +void sub_8099F58(u16 *vdest, const u16 *src, s8 a2, u8 a3) +{ + s16 r6; + s16 r3; + u16 sp0 = a3 << 8; + u16 sp4 = (a3 * 3 + 4) << 12; + u16 *r4; + u16 *r7; + u16 i; + u16 j; + s16 sp8 = ((gPokemonStorageSystemPtr->unk_08b4 >> 3) + 10 + a2 * 24) & 0x3f; + if (sp8 < 13) + { + r6 = 20; + r3 = 0; + r4 = vdest + sp8 + 0x40; + r7 = NULL; + } + else if (sp8 < 32) + { + r6 = 32 - sp8; + r3 = 20 - r6; + r4 = vdest + sp8 + 0x40; + r7 = vdest + 0x440; + } + else if (sp8 < 45) + { + r6 = 20; + r3 = 0; + r4 = vdest + sp8 + 0x420; + r7 = NULL; + } + else + { + r6 = 64 - sp8; + r3 = 20 - r6; + r4 = vdest + sp8 + 0x420; + r7 = vdest + 0x40; + } + for (i = 0; i < 18; i++) + { + for (j = 0; j < r6; j++) + { + u16 tile = ((*src & 0xfff) + sp0) | ((*src & 0xf000) + sp4); + r4[j] = tile; + src++; + } + for (j = 0; j < r3; j++) + { + u16 tile = ((*src & 0xfff) + sp0) | ((*src & 0xf000) + sp4); + r7[j] = tile; + src++; + } + r4 += 0x20; + r7 += 0x20; + } + if (a2) + { + s16 r4_2; + u16 *r2; + if (a2 > 0) + r4_2 = (sp8 + 20) & 0x3f; + else + r4_2 = (sp8 - 4) & 0x3f; + r2 = r4_2 < 0x20 ? vdest + r4_2 + 0x40 : vdest + r4_2 + 0x420; + for (i = 0; i < 4; i++) + { + for (j = 0; j < 18; j++) + { + *r2 = 0; + r2 += 0x20; + } + r4_2++; + r4_2 &= 0x3f; + r2 = r4_2 < 0x20 ? vdest + r4_2 + 0x40 : vdest + r4_2 + 0x420; + } + } +} +#else +__attribute__((naked)) void sub_8099F58(u16 *vdest, const u16 *src, s8 a2, u8 a3) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tsub sp, 0x20\n" + "\tmov r9, r0\n" + "\tadds r5, r1, 0\n" + "\tlsls r2, 24\n" + "\tlsls r3, 24\n" + "\tlsrs r3, 24\n" + "\tlsls r0, r3, 8\n" + "\tstr r0, [sp]\n" + "\tlsls r0, r3, 1\n" + "\tadds r0, r3\n" + "\tadds r0, 0x4\n" + "\tlsls r0, 28\n" + "\tlsrs r0, 16\n" + "\tstr r0, [sp, 0x4]\n" + "\tldr r0, _08099FB8 @ =gPokemonStorageSystemPtr\n" + "\tldr r0, [r0]\n" + "\tldr r1, _08099FBC @ =0x000008b4\n" + "\tadds r0, r1\n" + "\tldrh r1, [r0]\n" + "\tlsrs r1, 3\n" + "\tadds r1, 0xA\n" + "\tlsrs r0, r2, 24\n" + "\tmov r8, r0\n" + "\tasrs r2, 24\n" + "\tlsls r0, r2, 1\n" + "\tadds r0, r2\n" + "\tlsls r0, 3\n" + "\tadds r1, r0\n" + "\tmovs r0, 0x3F\n" + "\tands r1, r0\n" + "\tstr r1, [sp, 0x8]\n" + "\tadds r2, r1, 0\n" + "\tcmp r2, 0xC\n" + "\tbgt _08099FC0\n" + "\tmovs r6, 0x14\n" + "\tmovs r3, 0\n" + "\tlsls r0, r2, 1\n" + "\tadds r0, 0x80\n" + "\tmov r1, r9\n" + "\tadds r4, r1, r0\n" + "\tmovs r7, 0\n" + "\tb _0809A020\n" + "\t.align 2, 0\n" + "_08099FB8: .4byte gPokemonStorageSystemPtr\n" + "_08099FBC: .4byte 0x000008b4\n" + "_08099FC0:\n" + "\tcmp r2, 0x1F\n" + "\tbgt _08099FE6\n" + "\tmovs r0, 0x20\n" + "\tsubs r0, r2\n" + "\tlsls r0, 16\n" + "\tmovs r1, 0x14\n" + "\tlsrs r6, r0, 16\n" + "\tasrs r0, 16\n" + "\tsubs r1, r0\n" + "\tlsls r1, 16\n" + "\tlsrs r3, r1, 16\n" + "\tlsls r0, r2, 1\n" + "\tadds r0, 0x80\n" + "\tmov r2, r9\n" + "\tadds r4, r2, r0\n" + "\tmovs r7, 0x88\n" + "\tlsls r7, 4\n" + "\tadd r7, r9\n" + "\tb _0809A020\n" + "_08099FE6:\n" + "\tcmp r2, 0x2C\n" + "\tbgt _08099FFE\n" + "\tmovs r6, 0x14\n" + "\tmovs r3, 0\n" + "\tlsls r0, r2, 1\n" + "\tmovs r1, 0x84\n" + "\tlsls r1, 4\n" + "\tadds r0, r1\n" + "\tmov r2, r9\n" + "\tadds r4, r2, r0\n" + "\tmovs r7, 0\n" + "\tb _0809A020\n" + "_08099FFE:\n" + "\tmovs r0, 0x40\n" + "\tsubs r0, r2\n" + "\tlsls r0, 16\n" + "\tmovs r1, 0x14\n" + "\tlsrs r6, r0, 16\n" + "\tasrs r0, 16\n" + "\tsubs r1, r0\n" + "\tlsls r1, 16\n" + "\tlsrs r3, r1, 16\n" + "\tlsls r0, r2, 1\n" + "\tmovs r1, 0x84\n" + "\tlsls r1, 4\n" + "\tadds r0, r1\n" + "\tmov r2, r9\n" + "\tadds r4, r2, r0\n" + "\tmov r7, r9\n" + "\tadds r7, 0x80\n" + "_0809A020:\n" + "\tmovs r1, 0\n" + "\tmov r0, r8\n" + "\tlsls r0, 24\n" + "\tstr r0, [sp, 0x14]\n" + "\tlsls r0, r6, 16\n" + "\tasrs r0, 16\n" + "\tmov r8, r0\n" + "\tlsls r3, 16\n" + "\tstr r3, [sp, 0xC]\n" + "\tasrs r2, r3, 16\n" + "\tstr r2, [sp, 0x10]\n" + "_0809A036:\n" + "\tmovs r3, 0\n" + "\tadds r0, r4, 0\n" + "\tadds r0, 0x40\n" + "\tstr r0, [sp, 0x18]\n" + "\tadds r2, r7, 0\n" + "\tadds r2, 0x40\n" + "\tstr r2, [sp, 0x1C]\n" + "\tadds r1, 0x1\n" + "\tmov r10, r1\n" + "\tcmp r3, r8\n" + "\tbge _0809A07A\n" + "\tldr r0, _0809A0D4 @ =0x00000fff\n" + "\tmov r12, r0\n" + "\tmovs r6, 0xF0\n" + "\tlsls r6, 8\n" + "_0809A054:\n" + "\tldrh r2, [r5]\n" + "\tmov r0, r12\n" + "\tands r0, r2\n" + "\tldr r1, [sp]\n" + "\tadds r0, r1, r0\n" + "\tadds r1, r6, 0\n" + "\tands r1, r2\n" + "\tldr r2, [sp, 0x4]\n" + "\tadds r1, r2, r1\n" + "\torrs r1, r0\n" + "\tlsls r0, r3, 1\n" + "\tadds r0, r4\n" + "\tstrh r1, [r0]\n" + "\tadds r5, 0x2\n" + "\tadds r0, r3, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r3, r0, 16\n" + "\tcmp r3, r8\n" + "\tblt _0809A054\n" + "_0809A07A:\n" + "\tmovs r3, 0\n" + "\tldr r0, [sp, 0x10]\n" + "\tcmp r3, r0\n" + "\tbge _0809A0B4\n" + "\tldr r1, _0809A0D4 @ =0x00000fff\n" + "\tmov r12, r1\n" + "\tmovs r6, 0xF0\n" + "\tlsls r6, 8\n" + "\tldr r2, [sp, 0xC]\n" + "\tasrs r4, r2, 16\n" + "_0809A08E:\n" + "\tldrh r2, [r5]\n" + "\tmov r0, r12\n" + "\tands r0, r2\n" + "\tldr r1, [sp]\n" + "\tadds r0, r1, r0\n" + "\tadds r1, r6, 0\n" + "\tands r1, r2\n" + "\tldr r2, [sp, 0x4]\n" + "\tadds r1, r2, r1\n" + "\torrs r1, r0\n" + "\tlsls r0, r3, 1\n" + "\tadds r0, r7\n" + "\tstrh r1, [r0]\n" + "\tadds r5, 0x2\n" + "\tadds r0, r3, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r3, r0, 16\n" + "\tcmp r3, r4\n" + "\tblt _0809A08E\n" + "_0809A0B4:\n" + "\tldr r4, [sp, 0x18]\n" + "\tldr r7, [sp, 0x1C]\n" + "\tmov r1, r10\n" + "\tlsls r0, r1, 16\n" + "\tlsrs r1, r0, 16\n" + "\tcmp r1, 0x11\n" + "\tbls _0809A036\n" + "\tldr r0, [sp, 0x14]\n" + "\tasrs r2, r0, 24\n" + "\tcmp r2, 0\n" + "\tbeq _0809A13A\n" + "\tcmp r2, 0\n" + "\tble _0809A0D8\n" + "\tldr r1, [sp, 0x8]\n" + "\tadds r1, 0x14\n" + "\tb _0809A0DC\n" + "\t.align 2, 0\n" + "_0809A0D4: .4byte 0x00000fff\n" + "_0809A0D8:\n" + "\tldr r1, [sp, 0x8]\n" + "\tsubs r1, 0x4\n" + "_0809A0DC:\n" + "\tmovs r0, 0x3F\n" + "\tands r1, r0\n" + "\tadds r4, r1, 0\n" + "\tadds r0, r4, 0\n" + "\tcmp r0, 0x1F\n" + "\tbgt _0809A0EE\n" + "\tlsls r0, 1\n" + "\tadds r0, 0x80\n" + "\tb _0809A0F6\n" + "_0809A0EE:\n" + "\tlsls r0, 1\n" + "\tmovs r2, 0x84\n" + "\tlsls r2, 4\n" + "\tadds r0, r2\n" + "_0809A0F6:\n" + "\tmov r1, r9\n" + "\tadds r2, r1, r0\n" + "\tmovs r3, 0\n" + "\tmovs r6, 0\n" + "_0809A0FE:\n" + "\tmovs r1, 0\n" + "\tadds r5, r3, 0x1\n" + "\tlsls r3, r4, 16\n" + "_0809A104:\n" + "\tstrh r6, [r2]\n" + "\tadds r2, 0x40\n" + "\tadds r0, r1, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r1, r0, 16\n" + "\tcmp r1, 0x11\n" + "\tbls _0809A104\n" + "\tasrs r0, r3, 16\n" + "\tadds r4, r0, 0x1\n" + "\tmovs r0, 0x3F\n" + "\tands r4, r0\n" + "\tadds r0, r4, 0\n" + "\tcmp r0, 0x1F\n" + "\tbgt _0809A126\n" + "\tlsls r0, 1\n" + "\tadds r0, 0x80\n" + "\tb _0809A12E\n" + "_0809A126:\n" + "\tlsls r0, 1\n" + "\tmovs r2, 0x84\n" + "\tlsls r2, 4\n" + "\tadds r0, r2\n" + "_0809A12E:\n" + "\tmov r1, r9\n" + "\tadds r2, r1, r0\n" + "\tlsls r0, r5, 16\n" + "\tlsrs r3, r0, 16\n" + "\tcmp r3, 0x3\n" + "\tbls _0809A0FE\n" + "_0809A13A:\n" + "\tadd sp, 0x20\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0"); +} +#endif + +#ifdef NONMATCHING +void sub_809A14C(u16 *vdest) +{ + u16 *r2; + u16 i; + int r3 = ((gPokemonStorageSystemPtr->unk_08b4 >> 3) + 30) & 0x3f; + r2 = vdest + (r3 < 0x20 ? r3 + 0x260 : r3 + 0x640); + for (i = 0; i < 0x2b; i++) + { + *r2++ = 0; + r3++; + r3 &= 0x3f; + if (r3 == 0) + r2 -= 0x420; + if (r3 == 0x20) + r2 += 0x3e0; + } +} +#else +__attribute__((naked)) void sub_809A14C(u16 *vdest) +{ + asm_unified("\tpush {r4-r6,lr}\n" + "\tadds r2, r0, 0\n" + "\tldr r0, _0809A174 @ =gPokemonStorageSystemPtr\n" + "\tldr r0, [r0]\n" + "\tldr r1, _0809A178 @ =0x000008b4\n" + "\tadds r0, r1\n" + "\tldrh r0, [r0]\n" + "\tlsrs r0, 3\n" + "\tadds r3, r0, 0\n" + "\tadds r3, 0x1E\n" + "\tmovs r0, 0x3F\n" + "\tands r3, r0\n" + "\tadds r0, r3, 0\n" + "\tcmp r0, 0x1F\n" + "\tbgt _0809A17C\n" + "\tlsls r0, 1\n" + "\tmovs r6, 0x98\n" + "\tlsls r6, 3\n" + "\tadds r0, r6\n" + "\tb _0809A184\n" + "\t.align 2, 0\n" + "_0809A174: .4byte gPokemonStorageSystemPtr\n" + "_0809A178: .4byte 0x000008b4\n" + "_0809A17C:\n" + "\tlsls r0, 1\n" + "\tmovs r1, 0xC8\n" + "\tlsls r1, 4\n" + "\tadds r0, r1\n" + "_0809A184:\n" + "\tadds r2, r0\n" + "\tmovs r0, 0\n" + "\tmovs r5, 0\n" + "\tmovs r4, 0x3F\n" + "_0809A18C:\n" + "\tstrh r5, [r2]\n" + "\tadds r2, 0x2\n" + "\tadds r3, 0x1\n" + "\tands r3, r4\n" + "\tadds r1, r3, 0\n" + "\tcmp r1, 0\n" + "\tbne _0809A19E\n" + "\tldr r6, _0809A1B8 @ =0xfffff7c0\n" + "\tadds r2, r6\n" + "_0809A19E:\n" + "\tcmp r1, 0x20\n" + "\tbne _0809A1A8\n" + "\tmovs r1, 0xF8\n" + "\tlsls r1, 3\n" + "\tadds r2, r1\n" + "_0809A1A8:\n" + "\tadds r0, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tcmp r0, 0x2B\n" + "\tbls _0809A18C\n" + "\tpop {r4-r6}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_0809A1B8: .4byte 0xfffff7c0"); +} +#endif + +void sub_809A1BC(const u8 *a0, const u8 *text) +{ + u8 *r5 = gUnknown_083B6DB8; + DmaClear16(3, r5, 0x200); + Text_InitWindow8004E3C(&gWindowTemplate_81E6D38, r5, text); + DmaCopy16(3, r5 + 0x000, a0 + 0x000, 0x80); + DmaCopy16(3, r5 + 0x100, a0 + 0x080, 0x80); + DmaCopy16(3, r5 + 0x080, a0 + 0x100, 0x80); + DmaCopy16(3, r5 + 0x180, a0 + 0x180, 0x80); +} + +const struct SpriteTemplate gSpriteTemplate_83BB2B8; + +void sub_809A23C(u8 boxId) +{ + u8 tagIdx; + s16 r6; + u16 i; + + struct SpriteSheet spriteSheet = {gPokemonStorageSystemPtr->unk_08ca, 0x200, 3}; + struct SpritePalette palettes[] = { + {gPokemonStorageSystemPtr->unk_0ccc, 0xdac8}, + {gPokemonStorageSystemPtr->unk_0ccc, 0xdac9}, + {} + }; + + u16 wallpaper = gPokemonStorage.wallpaper[boxId]; + gPokemonStorageSystemPtr->unk_0ccc[14] = gUnknown_083BB0A8[wallpaper][0]; + gPokemonStorageSystemPtr->unk_0ccc[15] = gUnknown_083BB0A8[wallpaper][1]; + LoadSpritePalettes(palettes); + gPokemonStorageSystemPtr->unk_0d08 = 0x3f0; + tagIdx = IndexOfSpritePaletteTag(0xdac8); + gPokemonStorageSystemPtr->unk_0cec = 0x10e + 16 * tagIdx; + gPokemonStorageSystemPtr->unk_0d08 |= 0x10000 << tagIdx; + tagIdx = IndexOfSpritePaletteTag(0xdac9); + gPokemonStorageSystemPtr->unk_0cee = 0x10e + 16 * tagIdx; + gPokemonStorageSystemPtr->unk_0d08 |= 0x10000 << tagIdx; + sub_809A1BC(gPokemonStorageSystemPtr->unk_08ca, gPokemonStorage.boxNames[boxId]); + LoadSpriteSheet(&spriteSheet); + r6 = sub_809A6D0(sub_8072CA4(gPokemonStorage.boxNames[boxId])); + for (i = 0; i < 2; i++) + { + u8 spriteId = CreateSprite(&gSpriteTemplate_83BB2B8, r6 + i * 32, 0x1c, 23); + gPokemonStorageSystemPtr->unk_0cf0[i] = gSprites + spriteId; + StartSpriteAnim(gPokemonStorageSystemPtr->unk_0cf0[i], i); + } + gPokemonStorageSystemPtr->unk_0cca = 0; +} + +void sub_809A3D0(u8 boxId, s8 a1) +{ + u16 r8; + s16 x; + s16 x2; + u16 i; + struct SpriteSheet spriteSheet = {gPokemonStorageSystemPtr->unk_08ca, 0x200, 3}; + struct SpriteTemplate template = gSpriteTemplate_83BB2B8; + + gPokemonStorageSystemPtr->unk_0cca = gPokemonStorageSystemPtr->unk_0cca ? FALSE : TRUE; + if (gPokemonStorageSystemPtr->unk_0cca == 0) + { + spriteSheet.tag = 3; + r8 = gPokemonStorageSystemPtr->unk_0cec; + } + else + { + spriteSheet.tag = 4; + r8 = gPokemonStorageSystemPtr->unk_0cec; + template.tileTag = 4; + template.paletteTag = 0xdac9; + } + sub_809A1BC(gPokemonStorageSystemPtr->unk_08ca, gPokemonStorage.boxNames[boxId]); + LoadSpriteSheet(&spriteSheet); + LoadPalette(gUnknown_083BB0A8[gPokemonStorage.wallpaper[boxId]], r8, 0x04); + x = sub_809A6D0(sub_8072CA4(gPokemonStorage.boxNames[boxId])); + x2 = x + a1 * 192; + for (i = 0; i < 2; i++) + { + u8 spriteId = CreateSprite(&template, i * 32 + x2, 0x1c, 23); + gPokemonStorageSystemPtr->unk_0cf8[i] = gSprites + spriteId; + gPokemonStorageSystemPtr->unk_0cf8[i]->data[0] = (-a1) * 6; + gPokemonStorageSystemPtr->unk_0cf8[i]->data[1] = i * 32 + x; + gPokemonStorageSystemPtr->unk_0cf8[i]->data[2] = 1; + gPokemonStorageSystemPtr->unk_0cf8[i]->callback = sub_809A5E8; + StartSpriteAnim(gPokemonStorageSystemPtr->unk_0cf8[i], i); + gPokemonStorageSystemPtr->unk_0cf0[i]->data[0] = (-a1) * 6; + gPokemonStorageSystemPtr->unk_0cf0[i]->data[1] = 1; + gPokemonStorageSystemPtr->unk_0cf0[i]->callback = sub_809A61C; + } +} + +void sub_809A598(void) +{ + if (gPokemonStorageSystemPtr->unk_0cca == 0) + FreeSpriteTilesByTag(4); + else + FreeSpriteTilesByTag(3); + gPokemonStorageSystemPtr->unk_0cf0[0] = gPokemonStorageSystemPtr->unk_0cf8[0]; + gPokemonStorageSystemPtr->unk_0cf0[1] = gPokemonStorageSystemPtr->unk_0cf8[1]; +} + +void sub_809A5E8(struct Sprite *sprite) +{ + if (sprite->data[2]) + sprite->data[2]--; + else if ((sprite->pos1.x += sprite->data[0]) == sprite->data[1]) + sprite->callback = SpriteCallbackDummy; +} + +void sub_809A61C(struct Sprite *sprite) +{ + if (sprite->data[1]) + sprite->data[1]--; + else + { + sprite->pos1.x += sprite->data[0]; + sprite->data[2] = sprite->pos1.x + sprite->pos2.x; + if (sprite->data[2] < 0x40 || sprite->data[2] > 0x100) + DestroySprite(sprite); + } +} + +void sub_809A654(void) +{ + u8 boxId = get_preferred_box(); + u8 wallpaperId = gPokemonStorage.wallpaper[boxId]; + if (gPokemonStorageSystemPtr->unk_0cca == 0) + CpuCopy16(gUnknown_083BB0A8[wallpaperId], gPlttBufferUnfaded + gPokemonStorageSystemPtr->unk_0cec, 4); + else + CpuCopy16(gUnknown_083BB0A8[wallpaperId], gPlttBufferUnfaded + gPokemonStorageSystemPtr->unk_0cee, 4); +} + +s16 sub_809A6D0(u8 width) +{ + return 0xb0 - width / 2; +} + +void sub_809A6DC(void) +{ + u16 i; + + LoadSpriteSheet(&gUnknown_083BB288); + LoadSpritePalette(&gUnknown_083BB290); + for (i = 0; i < 2; i++) + { + u8 spriteId = CreateSprite(&gSpriteTemplate_83BB2F0, 0x5c + i * 0x88, 0x1c, 21); + if (spriteId != MAX_SPRITES) + { + struct Sprite *sprite = gSprites + spriteId; + StartSpriteAnim(sprite, i); + sprite->data[3] = (i == 0) ? -1 : 1; + gPokemonStorageSystemPtr->unk_0d00[i] = sprite; + } + } + if (sub_809BF2C()) + sub_809A860(TRUE); +} + +void sub_809A774(s8 a0) +{ + u16 i; + + for (i = 0; i < 2; i++) + { + gPokemonStorageSystemPtr->unk_0d00[i]->pos2.x = 0; + gPokemonStorageSystemPtr->unk_0d00[i]->data[0] = 2; + } + if (a0 < 0) + { + gPokemonStorageSystemPtr->unk_0d00[0]->data[1] = 29; + gPokemonStorageSystemPtr->unk_0d00[1]->data[1] = 5; + gPokemonStorageSystemPtr->unk_0d00[0]->data[2] = 0x48; + gPokemonStorageSystemPtr->unk_0d00[1]->data[2] = 0x48; + } + else + { + gPokemonStorageSystemPtr->unk_0d00[0]->data[1] = 5; + gPokemonStorageSystemPtr->unk_0d00[1]->data[1] = 29; + gPokemonStorageSystemPtr->unk_0d00[0]->data[2] = 0xF8; + gPokemonStorageSystemPtr->unk_0d00[1]->data[2] = 0xF8; + } + gPokemonStorageSystemPtr->unk_0d00[0]->data[7] = 0; + gPokemonStorageSystemPtr->unk_0d00[1]->data[7] = 1; +} + +void sub_809A810(void) +{ + u16 i; + + for (i = 0; i < 2; i++) + { + gPokemonStorageSystemPtr->unk_0d00[i]->pos1.x = 0x88 * i + 0x5c; + gPokemonStorageSystemPtr->unk_0d00[i]->pos2.x = 0; + gPokemonStorageSystemPtr->unk_0d00[i]->invisible = FALSE; + } + sub_809A860(TRUE); +} + +void sub_809A860(bool8 a0) +{ + u16 i; + if (a0) + { + for (i = 0; i < 2; i++) + { + gPokemonStorageSystemPtr->unk_0d00[i]->data[0] = 1; + gPokemonStorageSystemPtr->unk_0d00[i]->data[1] = 0; + gPokemonStorageSystemPtr->unk_0d00[i]->data[2] = 0; + gPokemonStorageSystemPtr->unk_0d00[i]->data[4] = 0; + } + } + else + { + for (i = 0; i < 2; i++) + { + gPokemonStorageSystemPtr->unk_0d00[i]->data[0] = 0; + } + } +} + +void sub_809A8C8(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->pos2.x = 0; + break; + case 1: + if (++sprite->data[1] > 3) + { + sprite->data[1] = 0; + sprite->pos2.x += sprite->data[3]; + if (++sprite->data[2] > 5) + { + sprite->data[2] = 0; + sprite->pos2.x = 0; + } + } + break; + case 2: + sprite->data[0] = 3; + break; + case 3: + sprite->pos1.x -= gPokemonStorageSystemPtr->unk_08b6; + if (sprite->pos1.x < 0x49 || sprite->pos1.x > 0xf7) + sprite->invisible = TRUE; + if (--sprite->data[1] == 0) + { + sprite->pos1.x = sprite->data[2]; + sprite->invisible = FALSE; + sprite->data[0] = 4; + } + break; + case 4: + sprite->pos1.x -= gPokemonStorageSystemPtr->unk_08b6; + break; + } +} + +struct Sprite *sub_809A9A0(u16 x, u16 y, u8 animId, u8 priority, u8 subpriority) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83BB2F0, x, y, subpriority); + if (spriteId == MAX_SPRITES) + return NULL; + animId %= 2; + StartSpriteAnim(gSprites + spriteId, animId); + gSprites[spriteId].oam.priority = priority; + gSprites[spriteId].callback = SpriteCallbackDummy; + return gSprites + spriteId; +} + +void sub_809AA24(void) +{ + if (gPokemonStorageSystemPtr->unk_0005 != 1) + gUnknown_020384E4 = 0; + else + gUnknown_020384E4 = 1; + gUnknown_020384E5 = 0; + gUnknown_020384E6 = FALSE; + gUnknown_020384E7 = 0; + gUnknown_020384E8 = 0; + gUnknown_020384E9 = 0; + sub_809B0D4(); + sub_809CC04(); + gPokemonStorageSystemPtr->unk_11e2 = 1; + sub_809BF74(); +} + +void sub_809AA98(void) +{ + sub_809CC04(); + sub_809C028(); + gPokemonStorageSystemPtr->unk_11e2 = 1; + if (gUnknown_020384E6) + sub_8098BF0(); +} + +void sub_809AACC(u8 a0, u8 a1, u16 *a2, u16 *a3) +{ + switch (a0) + { + case 0: + *a2 = (a1 % 6) * 24 + 100; + *a3 = (a1 / 6) * 24 + 32; + break; + case 1: + if (a1 == 0) + { + *a2 = 0x68; + *a3 = 0x34; + } + else if (a1 == 6) + { + *a2 = 0x98; + *a3 = 0x84; + } + else + { + *a2 = 0x98; + *a3 = (a1 - 1) * 24 + 4; + } + break; + case 2: + *a2 = 0xa2; + *a3 = 0x0c; + break; + case 3: + *a3 = gUnknown_020384E6 ? 8 : 14; + *a2 = a1 * 0x58 + 0x78; + break; + case 4: + *a2 = 0xa0; + *a3 = 0x60; + break; + } +} + +u16 sub_809AB8C(void) +{ + switch (gUnknown_020384E4) + { + case 1: + return GetMonData(gPlayerParty + gUnknown_020384E5, MON_DATA_SPECIES); + case 0: + return GetBoxMonData(gPokemonStorage.boxes[get_preferred_box()] + gUnknown_020384E5, MON_DATA_SPECIES); + default: + return SPECIES_NONE; + } +} + +bool8 sub_809AC00(void) +{ + s16 tmp; + if (gPokemonStorageSystemPtr->unk_11dc == 0) + return FALSE; + if (--gPokemonStorageSystemPtr->unk_11dc) + { + gPokemonStorageSystemPtr->unk_11c8 += gPokemonStorageSystemPtr->unk_11d0; + gPokemonStorageSystemPtr->unk_11cc += gPokemonStorageSystemPtr->unk_11d4; + gPokemonStorageSystemPtr->unk_11c0->pos1.x = gPokemonStorageSystemPtr->unk_11c8 >> 8; + gPokemonStorageSystemPtr->unk_11c0->pos1.y = gPokemonStorageSystemPtr->unk_11cc >> 8; + if (gPokemonStorageSystemPtr->unk_11c0->pos1.x > 0x100) + { + tmp = gPokemonStorageSystemPtr->unk_11c0->pos1.x - 0x100; + gPokemonStorageSystemPtr->unk_11c0->pos1.x = tmp + 0x40; + } + if (gPokemonStorageSystemPtr->unk_11c0->pos1.x < 0x40) + { + tmp = 0x40 - gPokemonStorageSystemPtr->unk_11c0->pos1.x; + gPokemonStorageSystemPtr->unk_11c0->pos1.x = 0x100 - tmp; + } + if (gPokemonStorageSystemPtr->unk_11c0->pos1.y > 0xb0) + { + tmp = gPokemonStorageSystemPtr->unk_11c0->pos1.y - 0xb0; + gPokemonStorageSystemPtr->unk_11c0->pos1.y = tmp - 0x10; + } + if (gPokemonStorageSystemPtr->unk_11c0->pos1.y < -0x10) + { + tmp = -0x10 - gPokemonStorageSystemPtr->unk_11c0->pos1.y; + gPokemonStorageSystemPtr->unk_11c0->pos1.y = 0xb0 - tmp; + } + if (gPokemonStorageSystemPtr->unk_11e3 && --gPokemonStorageSystemPtr->unk_11e3 == 0) + gPokemonStorageSystemPtr->unk_11c0->vFlip = gPokemonStorageSystemPtr->unk_11c0->vFlip ? FALSE : TRUE; + } + else + { + gPokemonStorageSystemPtr->unk_11c0->pos1.x = gPokemonStorageSystemPtr->unk_11d8; + gPokemonStorageSystemPtr->unk_11c0->pos1.y = gPokemonStorageSystemPtr->unk_11da; + sub_809AFB8(); + } + return TRUE; +} + +void sub_809AD3C(u8 a0, u8 a1) +{ + u16 x; + u16 y; + + sub_809AACC(a0, a1, &x, &y); + gPokemonStorageSystemPtr->unk_11e0 = a0; + gPokemonStorageSystemPtr->unk_11e1 = a1; + gPokemonStorageSystemPtr->unk_11d8 = x; + gPokemonStorageSystemPtr->unk_11da = y; +} + +void sub_809AD94(void) +{ + int r7; + int r0; + + if (gPokemonStorageSystemPtr->unk_11de || gPokemonStorageSystemPtr->unk_11df) + gPokemonStorageSystemPtr->unk_11dc = 12; + else + gPokemonStorageSystemPtr->unk_11dc = 6; + if (gPokemonStorageSystemPtr->unk_11e3) + gPokemonStorageSystemPtr->unk_11e3 = gPokemonStorageSystemPtr->unk_11dc >> 1; + switch (gPokemonStorageSystemPtr->unk_11de) + { + default: + r7 = gPokemonStorageSystemPtr->unk_11da - gPokemonStorageSystemPtr->unk_11c0->pos1.y; + break; + case -1: + r7 = gPokemonStorageSystemPtr->unk_11da - 0xc0 - gPokemonStorageSystemPtr->unk_11c0->pos1.y; + break; + case 1: + r7 = gPokemonStorageSystemPtr->unk_11da + 0xc0 - gPokemonStorageSystemPtr->unk_11c0->pos1.y; + break; + } + switch (gPokemonStorageSystemPtr->unk_11df) + { + default: + r0 = gPokemonStorageSystemPtr->unk_11d8 - gPokemonStorageSystemPtr->unk_11c0->pos1.x; + break; + case -1: + r0 = gPokemonStorageSystemPtr->unk_11d8 - 0xc0 - gPokemonStorageSystemPtr->unk_11c0->pos1.x; + break; + case 1: + r0 = gPokemonStorageSystemPtr->unk_11d8 + 0xc0 - gPokemonStorageSystemPtr->unk_11c0->pos1.x; + break; + } + r7 <<= 8; + r0 <<= 8; + gPokemonStorageSystemPtr->unk_11d0 = r0 / gPokemonStorageSystemPtr->unk_11dc; + gPokemonStorageSystemPtr->unk_11d4 = r7 / gPokemonStorageSystemPtr->unk_11dc; + gPokemonStorageSystemPtr->unk_11c8 = gPokemonStorageSystemPtr->unk_11c0->pos1.x << 8; + gPokemonStorageSystemPtr->unk_11cc = gPokemonStorageSystemPtr->unk_11c0->pos1.y << 8; +} + +void sub_809AF18(u8 a0, u8 a1) +{ + sub_809AD3C(a0, a1); + sub_809AD94(); + if (!gUnknown_020384E6) + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 1); + if (a0 == 1 && gUnknown_020384E4 != 1) + { + gPokemonStorageSystemPtr->unk_11e2 = a0; + gPokemonStorageSystemPtr->unk_11c4->invisible = TRUE; + } + switch (a0) + { + case 0: + break; + case 1 ... 3: + gPokemonStorageSystemPtr->unk_11c4->invisible = TRUE; + gPokemonStorageSystemPtr->unk_11c4->oam.priority = 1; + break; + } +} + +void sub_809AFB8(void) +{ + gUnknown_020384E4 = gPokemonStorageSystemPtr->unk_11e0; + gUnknown_020384E5 = gPokemonStorageSystemPtr->unk_11e1; + if (!gUnknown_020384E6) + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 0); + sub_809BF74(); + switch (gUnknown_020384E4) + { + case 2: + sub_809A860(TRUE); + break; + case 1: + gPokemonStorageSystemPtr->unk_11c4->subpriority = 12; + break; + case 0: + gPokemonStorageSystemPtr->unk_11c4->oam.priority = 2; + gPokemonStorageSystemPtr->unk_11c4->subpriority = 20; + gPokemonStorageSystemPtr->unk_11c4->invisible = FALSE; + break; + } +} + +void sub_809B068(void) +{ + u8 partyCount; + if (!gUnknown_020384E6) + partyCount = 0; + else + { + partyCount = CalculatePlayerPartyCount(); + if (partyCount > PARTY_SIZE - 1) + partyCount = PARTY_SIZE - 1; + } + if (gPokemonStorageSystemPtr->unk_11c0->vFlip) + gPokemonStorageSystemPtr->unk_11e3 = 1; + sub_809AF18(1, partyCount); +} + +void sub_809B0C0(u8 a0) +{ + sub_809AF18(0, a0); +} + +void sub_809B0D4(void) +{ + gUnknown_020384EA = 0; +} + +void sub_809B0E0(void) +{ + gUnknown_020384EA = gUnknown_020384E5; +} + +u8 sub_809B0F4(void) +{ + return gUnknown_020384EA; +} + +void sub_809B100(u8 a0) +{ + gPokemonStorageSystemPtr->unk_12a4 = gUnknown_083BBBC8[a0]; + gPokemonStorageSystemPtr->unk_12a8 = 0; +} + +bool8 sub_809B130(void) +{ + return gPokemonStorageSystemPtr->unk_12a4(); +} + +bool8 sub_809B150(void) +{ + switch (gPokemonStorageSystemPtr->unk_12a8) + { + case 0: + if (gUnknown_020384E6) + return FALSE; + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 2); + gPokemonStorageSystemPtr->unk_12a8++; + break; + case 1: + if (!sub_809B324()) + { + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 3); + sub_809B384(); + gPokemonStorageSystemPtr->unk_12a8++; + } + break; + case 2: + if (!sub_809B358()) + gPokemonStorageSystemPtr->unk_12a8++; + break; + case 3: + return FALSE; + } + return TRUE; +} + +bool8 sub_809B1D8(void) +{ + switch (gPokemonStorageSystemPtr->unk_12a8) + { + case 0: + if (!sub_809B324()) + { + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 2); + sub_809B3E0(); + gPokemonStorageSystemPtr->unk_12a8++; + } + break; + case 1: + if (!sub_809B358()) + { + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 0); + gPokemonStorageSystemPtr->unk_12a8++; + } + break; + case 2: + return FALSE; + } + return TRUE; +} + +bool8 sub_809B24C(void) +{ + switch (gPokemonStorageSystemPtr->unk_12a8) + { + case 0: + switch (gUnknown_020384E4) + { + case 1: + gPokemonStorageSystemPtr->unk_12a9 = 14; + break; + case 0: + gPokemonStorageSystemPtr->unk_12a9 = get_preferred_box(); + break; + default: + return FALSE; + } + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 2); + sub_80996B0(gPokemonStorageSystemPtr->unk_12a9, gUnknown_020384E5); + gPokemonStorageSystemPtr->unk_12a8++; + break; + case 1: + if (!sub_809971C()) + { + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 3); + diegohint1(gPokemonStorageSystemPtr->unk_12a9, gUnknown_020384E5); + gPokemonStorageSystemPtr->unk_12a8++; + } + break; + case 2: + return FALSE; + } + return TRUE; +} + +bool8 sub_809B324(void) +{ + switch (gPokemonStorageSystemPtr->unk_11c0->pos2.y) + { + default: + gPokemonStorageSystemPtr->unk_11c0->pos2.y++; + break; + case 0: + gPokemonStorageSystemPtr->unk_11c0->pos2.y++; + break; + case 8: + return FALSE; + } + return TRUE; +} + +bool8 sub_809B358(void) +{ + switch (gPokemonStorageSystemPtr->unk_11c0->pos2.y) + { + case 0: + return FALSE; + default: + gPokemonStorageSystemPtr->unk_11c0->pos2.y--; + break; + } + return TRUE; +} + +void sub_809B384(void) +{ + switch (gUnknown_020384E4) + { + case 1: + sub_809B44C(14, gUnknown_020384E5); + sub_8099584(0, gUnknown_020384E5); + break; + case 0: + sub_809B44C(get_preferred_box(), gUnknown_020384E5); + sub_8099584(1, gUnknown_020384E5); + break; + default: + return; + } + gUnknown_020384E6 = TRUE; +} + +void sub_809B3E0(void) +{ + u8 boxId; + switch (gUnknown_020384E4) + { + case 1: + diegohint2(14, gUnknown_020384E5); + sub_809960C(14, gUnknown_020384E5); + break; + case 0: + boxId = get_preferred_box(); + diegohint2(boxId, gUnknown_020384E5); + sub_809960C(boxId, gUnknown_020384E5); + break; + default: + return; + } + gUnknown_020384E6 = FALSE; +} + +void sub_809B440(void) +{ + sub_809BF74(); +} + +void sub_809B44C(u8 a0, u8 a1) +{ + if (a0 == 14) + gPokemonStorageSystemPtr->unk_25b4 = gPlayerParty[gUnknown_020384E5]; + else + ExpandBoxMon(gPokemonStorage.boxes[a0] + a1, &gPokemonStorageSystemPtr->unk_25b4); + sub_809B548(a0, a1); + gUnknown_020384E7 = a0; + gUnknown_020384E8 = a1; +} + +void diegohint2(u8 a0, u8 a1) +{ + if (a0 == 14) + { + gPlayerParty[a1] = gPokemonStorageSystemPtr->unk_25b4; + } + else + { + BoxMonRestorePP(&gPokemonStorageSystemPtr->unk_25b4.box); + gPokemonStorage.boxes[a0][a1] = gPokemonStorageSystemPtr->unk_25b4.box; + } +} + +void sub_809B548(u8 a0, u8 a1) +{ + if (a0 == 14) + ZeroMonData(gPlayerParty + a1); + else + ZeroBoxMonData(gPokemonStorage.boxes[a0] + a1); +} + +void diegohint1(u8 a0, u8 a1) +{ + if (a0 == 14) + gPokemonStorageSystemPtr->unk_2618 = gPlayerParty[a1]; + else + ExpandBoxMon(gPokemonStorage.boxes[a0] + a1, &gPokemonStorageSystemPtr->unk_2618); + diegohint2(a0, a1); + gPokemonStorageSystemPtr->unk_25b4 = gPokemonStorageSystemPtr->unk_2618; + sub_809C04C(&gPokemonStorageSystemPtr->unk_25b4, 0); + gUnknown_020384E7 = a0; + gUnknown_020384E8 = a1; +} + +bool8 sub_809B62C(u8 boxId) +{ + s16 monIdx = GetIndexOfFirstEmptySpaceInBoxN(boxId); + if (monIdx == -1) + return FALSE; + if (gUnknown_020384E6) + { + diegohint2(boxId, monIdx); + sub_8099480(); + gUnknown_020384E6 = FALSE; + } + else + { + sub_809B44C(14, gUnknown_020384E5); + diegohint2(boxId, monIdx); + sub_8099520(gUnknown_020384E5); + } + if (boxId == get_preferred_box()) + sub_8098D20(monIdx); + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 1); + return TRUE; +} + +void sub_809B6BC(void) +{ + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 0); + sub_809BF74(); +} + +void sub_809B6DC(void) +{ + u8 mode; + + if (gUnknown_020384E6) + mode = 2; + else if (gUnknown_020384E4 == 1) + mode = 0; + else + mode = 1; + sub_809981C(mode, gUnknown_020384E5); + StringCopy(gPokemonStorageSystemPtr->unk_26e4, gPokemonStorageSystemPtr->unk_11fa); +} + +bool8 sub_809B734(void) +{ + if (!sub_80998D8()) + { + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 0); + return FALSE; + } + return TRUE; +} + +void sub_809B760(void) +{ + sub_8099920(); + if (gUnknown_020384E6) + gUnknown_020384E6 = FALSE; + else + { + u8 boxId; + if (gUnknown_020384E4 == 1) + boxId = 14; + else + boxId = get_preferred_box(); + sub_809B548(boxId, gUnknown_020384E5); + } + sub_809BF74(); +} + +void sub_809B7AC(void) +{ + if (gUnknown_020384E6) + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 3); +} + +void sub_809B7D4(void) +{ + u16 knownMoves; + if (gUnknown_020384E6) + { + gPokemonStorageSystemPtr->unk_2618 = gPokemonStorageSystemPtr->unk_25b4; + gPokemonStorageSystemPtr->unk_2682 = -1; + gPokemonStorageSystemPtr->unk_2683 = -1; + } + else + { + if (gUnknown_020384E4 == 1) + { + gPokemonStorageSystemPtr->unk_2618 = gPlayerParty[gUnknown_020384E5]; + gPokemonStorageSystemPtr->unk_2682 = 14; + } + else + { + ExpandBoxMon(gPokemonStorage.boxes[gPokemonStorage.currentBox] + gUnknown_020384E5, &gPokemonStorageSystemPtr->unk_2618); + gPokemonStorageSystemPtr->unk_2682 = gPokemonStorage.currentBox; + } + gPokemonStorageSystemPtr->unk_2683 = gUnknown_020384E5; + } + gPokemonStorageSystemPtr->unk_267e = 0; + gPokemonStorageSystemPtr->unk_267f = 0; + gPokemonStorageSystemPtr->unk_2686[0] = MOVE_SURF; + gPokemonStorageSystemPtr->unk_2686[1] = MOVE_DIVE; + gPokemonStorageSystemPtr->unk_2686[2] = NUM_MOVES; + knownMoves = GetMonData(&gPokemonStorageSystemPtr->unk_2618, MON_DATA_KNOWN_MOVES, gPokemonStorageSystemPtr->unk_2686); + gPokemonStorageSystemPtr->unk_267e = knownMoves & 1; + gPokemonStorageSystemPtr->unk_267f = (knownMoves >> 1) & 1; + if (gPokemonStorageSystemPtr->unk_267e || gPokemonStorageSystemPtr->unk_267f) + gPokemonStorageSystemPtr->unk_267d = 0; + else + { + gPokemonStorageSystemPtr->unk_267d = 1; + gPokemonStorageSystemPtr->unk_267c = 1; + } + gPokemonStorageSystemPtr->unk_2684 = 0; +} + +s8 sub_809B960(void) +{ + u16 i; + u16 knownMoves; + + if (gPokemonStorageSystemPtr->unk_267d) + return gPokemonStorageSystemPtr->unk_267c; + switch (gPokemonStorageSystemPtr->unk_2684) + { + case 0: + for (i = 0; i < PARTY_SIZE; i++) + { + if (gPokemonStorageSystemPtr->unk_2682 != 14 || gPokemonStorageSystemPtr->unk_2683 != i) + { + knownMoves = GetMonData(gPlayerParty + i, MON_DATA_KNOWN_MOVES, gPokemonStorageSystemPtr->unk_2686); + if (knownMoves & 1) + gPokemonStorageSystemPtr->unk_267e = 0; + if (knownMoves & 2) + gPokemonStorageSystemPtr->unk_267f = 0; + } + } + if (gPokemonStorageSystemPtr->unk_267e == 0 && gPokemonStorageSystemPtr->unk_267f == 0) + { + gPokemonStorageSystemPtr->unk_267d = 1; + gPokemonStorageSystemPtr->unk_267c = 1; + } + else + { + gPokemonStorageSystemPtr->unk_2680 = 0; + gPokemonStorageSystemPtr->unk_2681 = 0; + gPokemonStorageSystemPtr->unk_2684++; + } + break; + case 1: + for (i = 0; i < 5; i++) + { + knownMoves = GetBoxMonData(gPokemonStorage.boxes[gPokemonStorageSystemPtr->unk_2680] + gPokemonStorageSystemPtr->unk_2681, MON_DATA_KNOWN_MOVES, gPokemonStorageSystemPtr->unk_2686); + if (knownMoves && (gPokemonStorageSystemPtr->unk_2682 != gPokemonStorageSystemPtr->unk_2680 || gPokemonStorageSystemPtr->unk_2683 != gPokemonStorageSystemPtr->unk_2681)) + { + if (knownMoves & 1) + gPokemonStorageSystemPtr->unk_267e = 0; + if (knownMoves & 2) + gPokemonStorageSystemPtr->unk_267f = 0; + } + if (++gPokemonStorageSystemPtr->unk_2681 >= 30) + { + gPokemonStorageSystemPtr->unk_2681 = 0; + if (++gPokemonStorageSystemPtr->unk_2680 >= 14) + { + gPokemonStorageSystemPtr->unk_267d = 1; + gPokemonStorageSystemPtr->unk_267c = 0; + break; + } + } + } + if (gPokemonStorageSystemPtr->unk_267e == 0 && gPokemonStorageSystemPtr->unk_267f == 0) + { + gPokemonStorageSystemPtr->unk_267d = 1; + gPokemonStorageSystemPtr->unk_267c = 1; + } + break; + } + return -1; +} + +void sub_809BB90(void) +{ + if (gUnknown_020384E6) + gUnknown_02038480 = gPokemonStorageSystemPtr->unk_25b4; +} + +void sub_809BBC0(void) +{ + if (gUnknown_020384E6) + { + if (gUnknown_020384E7 == 14) + gPokemonStorageSystemPtr->unk_25b4 = gUnknown_02038480; + else + gPokemonStorageSystemPtr->unk_25b4.box = gUnknown_02038480.box; + } +} + +void sub_809BC18(void) +{ + if (gUnknown_020384E6) + { + sub_809BB90(); + gPokemonStorageSystemPtr->unk_2690.pokemon = &gUnknown_02038480; + gPokemonStorageSystemPtr->unk_268d = 0; + gPokemonStorageSystemPtr->unk_268c = 0; + gPokemonStorageSystemPtr->unk_268e = 0; + } + else if (gUnknown_020384E4 == 1) + { + gPokemonStorageSystemPtr->unk_2690.pokemon = gPlayerParty; + gPokemonStorageSystemPtr->unk_268d = gUnknown_020384E5; + gPokemonStorageSystemPtr->unk_268c = StorageSystemGetPartySize() - 1; + gPokemonStorageSystemPtr->unk_268e = 0; + } + else + { + gPokemonStorageSystemPtr->unk_2690.box = gPokemonStorage.boxes[gPokemonStorage.currentBox]; + gPokemonStorageSystemPtr->unk_268d = gUnknown_020384E5; + gPokemonStorageSystemPtr->unk_268c = 30 - 1; + gPokemonStorageSystemPtr->unk_268e = 5; + } +} + +void sub_809BD14(void) +{ + if (gUnknown_020384E6) + sub_809BBC0(); + else + gUnknown_020384E5 = pssData.monIndex; +} + +s16 party_compaction(void) +{ + s16 retVal = -1; + u16 i; + u16 last; + + for (i = 0, last = 0; i < PARTY_SIZE; i++) + { + if ((u16)GetMonData(gPlayerParty + i, MON_DATA_SPECIES) != SPECIES_NONE) + { + if (i != last) + gPlayerParty[last] = gPlayerParty[i]; + last++; + } + else if (retVal == -1) + retVal = i; + } + for (; last < PARTY_SIZE; last++) + ZeroMonData(gPlayerParty + last); + return retVal; +} + +void sub_809BDD8(u8 markings) +{ + gPokemonStorageSystemPtr->unk_11f7 = markings; + if (gUnknown_020384E6) + SetMonData(&gPokemonStorageSystemPtr->unk_25b4, MON_DATA_MARKINGS, &markings); + else + { + if (gUnknown_020384E4 == 1) + SetMonData(gPlayerParty + gUnknown_020384E5, MON_DATA_MARKINGS, &markings); + if (gUnknown_020384E4 == 0) + SetBoxMonData(gPokemonStorage.boxes[get_preferred_box()] + gUnknown_020384E5, MON_DATA_MARKINGS, &markings); + } +} + +bool8 sub_809BE80(void) +{ + if (gUnknown_020384E4 == 1 && !gUnknown_020384E6 && CountAlivePartyMonsExceptOne(gUnknown_020384E5) == 0) + return TRUE; + return FALSE; +} + +bool8 sub_809BEBC(void) +{ + if (gUnknown_020384E6) + { + if (gUnknown_020384E4 == 1 && CountAlivePartyMonsExceptOne(gUnknown_020384E5) == 0) + { + if (gPokemonStorageSystemPtr->unk_11f9 || GetMonData(&gPokemonStorageSystemPtr->unk_25b4, MON_DATA_HP) == 0) + return FALSE; + } + return TRUE; + } + return FALSE; +} + +bool8 sub_809BF20(void) +{ + return gUnknown_020384E6; +} + +bool8 sub_809BF2C(void) +{ + return gUnknown_020384E4 == 2 ? TRUE : FALSE; +} + +bool8 sub_809BF48(void) +{ + return (gUnknown_020384E4 == 3 && gUnknown_020384E5 == 1) ? TRUE : FALSE; +} + +void sub_809BF74(void) +{ + gPokemonStorageSystemPtr->unk_11f6 = gUnknown_020384E6 ? 0 : 1; + if (!gUnknown_020384E6) + { + switch (gUnknown_020384E4) + { + case 1: + if (gUnknown_020384E5 < PARTY_SIZE) + { + sub_809C04C(gPlayerParty + gUnknown_020384E5, 0); + break; + } + // fallthrough + case 2: + case 3: + sub_809C04C(NULL, 2); + break; + case 0: + sub_809C04C(gPokemonStorage.boxes[get_preferred_box()] + gUnknown_020384E5, 1); + break; + } + } +} + +void sub_809C028(void) +{ + if (gUnknown_020384E6) + sub_809C04C(&gUnknown_02038480.box, 0); + else + sub_809BF74(); +} + +void sub_809C04C(void *pokemon, u8 a1) +{ + u8 *buf; + u16 gender = MON_MALE; + gPokemonStorageSystemPtr->unk_11f2 = 0; + if (a1 == 0) + { + struct Pokemon *pkmn = (struct Pokemon *)pokemon; + gPokemonStorageSystemPtr->unk_11f0 = GetMonData(pokemon, MON_DATA_SPECIES2); + if (gPokemonStorageSystemPtr->unk_11f0 != SPECIES_NONE) + { + gPokemonStorageSystemPtr->unk_11f9 = GetMonData(pkmn, MON_DATA_IS_EGG); + GetMonData(pkmn, MON_DATA_NICKNAME, gPokemonStorageSystemPtr->unk_11fa); + StringGetEnd10(gPokemonStorageSystemPtr->unk_11fa); + gPokemonStorageSystemPtr->unk_11f8 = GetMonData(pkmn, MON_DATA_LEVEL); + gPokemonStorageSystemPtr->unk_11f7 = GetMonData(pkmn, MON_DATA_MARKINGS); + gPokemonStorageSystemPtr->unk_11ec = GetMonData(pkmn, MON_DATA_PERSONALITY); + gPokemonStorageSystemPtr->unk_11e8 = GetMonSpritePal(pkmn); + gender = GetMonGender(pkmn); + gPokemonStorageSystemPtr->unk_11f2 = GetMonData(pkmn, MON_DATA_HELD_ITEM); + } + } + else if (a1 == 1) + { + struct BoxPokemon *boxmon = (struct BoxPokemon *)pokemon; + gPokemonStorageSystemPtr->unk_11f0 = GetBoxMonData(pokemon, MON_DATA_SPECIES2); + if (gPokemonStorageSystemPtr->unk_11f0 != SPECIES_NONE) + { + u32 otId = GetBoxMonData(boxmon, MON_DATA_OT_ID); + gPokemonStorageSystemPtr->unk_11f9 = GetBoxMonData(boxmon, MON_DATA_IS_EGG); + GetBoxMonData(boxmon, MON_DATA_NICKNAME, gPokemonStorageSystemPtr->unk_11fa); + StringGetEnd10(gPokemonStorageSystemPtr->unk_11fa); + gPokemonStorageSystemPtr->unk_11f8 = GetLevelFromBoxMonExp(boxmon); + gPokemonStorageSystemPtr->unk_11f7 = GetBoxMonData(boxmon, MON_DATA_MARKINGS); + gPokemonStorageSystemPtr->unk_11ec = GetBoxMonData(boxmon, MON_DATA_PERSONALITY); + gPokemonStorageSystemPtr->unk_11e8 = GetMonSpritePalFromOtIdPersonality(gPokemonStorageSystemPtr->unk_11f0, otId, gPokemonStorageSystemPtr->unk_11ec); + gender = GetGenderFromSpeciesAndPersonality(gPokemonStorageSystemPtr->unk_11f0, gPokemonStorageSystemPtr->unk_11ec); + gPokemonStorageSystemPtr->unk_11f2 = GetBoxMonData(boxmon, MON_DATA_HELD_ITEM); + } + } + else + { + gPokemonStorageSystemPtr->unk_11f0 = SPECIES_NONE; + } + if (gPokemonStorageSystemPtr->unk_11f0 == SPECIES_NONE) + { + gPokemonStorageSystemPtr->unk_11fa[0] = EOS; + gPokemonStorageSystemPtr->unk_120f[0] = EOS; + gPokemonStorageSystemPtr->unk_1234[0] = EOS; + gPokemonStorageSystemPtr->unk_1259[0] = EOS; + gPokemonStorageSystemPtr->unk_127a[0] = EOS; + } + else if (gPokemonStorageSystemPtr->unk_11f9) + { + buf = gPokemonStorageSystemPtr->unk_120f; + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW + buf[2] = 0x0F; // WHITE2 + buf[3] = 0x00; // TRANSPARENT + buf[4] = 0x01; // DARK_GREY + buf = gPokemonStorageSystemPtr->unk_120f + 5; + buf = StringCopy(buf, gPokemonStorageSystemPtr->unk_11fa); + gPokemonStorageSystemPtr->unk_1234[0] = EOS; + gPokemonStorageSystemPtr->unk_1259[0] = EOS; + gPokemonStorageSystemPtr->unk_127a[0] = EOS; + } + else + { + if (gPokemonStorageSystemPtr->unk_11f0 == SPECIES_NIDORAN_M || gPokemonStorageSystemPtr->unk_11f0 == SPECIES_NIDORAN_F) + gender = MON_GENDERLESS; + buf = gPokemonStorageSystemPtr->unk_120f; + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW + buf[2] = 0x0F; // WHITE2 + buf[3] = 0x00; // TRANSPARENT + buf[4] = 0x01; // DARK_GREY + buf = gPokemonStorageSystemPtr->unk_120f + 5; + buf = StringCopy(buf, gPokemonStorageSystemPtr->unk_11fa); + buf = gPokemonStorageSystemPtr->unk_1234; + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW + buf[2] = 0x0F; // WHITE2 + buf[3] = 0x00; // TRANSPARENT + buf[4] = 0x01; // DARK_GREY + buf[5] = EXT_CTRL_CODE_BEGIN; + buf[6] = 0x13; // CLEAR_TO + buf[7] = 7; + buf[8] = CHAR_SLASH; + buf = gPokemonStorageSystemPtr->unk_1234 + 9; + buf = StringCopy(buf, gSpeciesNames[gPokemonStorageSystemPtr->unk_11f0]); + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x13; // CLEAR_TO + buf[2] = 0x50; + buf[3] = EOS; + buf = gPokemonStorageSystemPtr->unk_1259; + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW + buf[2] = 0x0F; // WHITE2 + buf[3] = 0x00; // TRANSPARENT + buf[4] = 0x01; // DARK_GREY + buf[5] = EXT_CTRL_CODE_BEGIN; + buf[6] = 0x13; // CLEAR_TO + buf[7] = 8; + buf = gPokemonStorageSystemPtr->unk_1259 + 8; + buf[0] = 0x34; // LV + buf = gPokemonStorageSystemPtr->unk_1259 + 9; + buf = sub_8072C14(buf, gPokemonStorageSystemPtr->unk_11f8, 0x22, STR_CONV_MODE_RIGHT_ALIGN); + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x11; // CLEAR + buf[2] = 8; + buf += 3; + switch (gender) + { + case MON_MALE: + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW + buf[2] = 0x04; // BLUE + buf[3] = 0x00; // TRANSPARENT + buf[4] = 0x05; // YELLOW + buf[5] = CHAR_MALE; + buf += 6; + break; + case MON_FEMALE: + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW + buf[2] = 0x06; // CYAN + buf[3] = 0x00; // TRANSPARENT + buf[4] = 0x07; // MAGENTA + buf[5] = CHAR_FEMALE; + buf += 6; + break; + } + buf[0] = EOS; + buf = gPokemonStorageSystemPtr->unk_127a; + if (gPokemonStorageSystemPtr->unk_11f2) + { + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW + buf[2] = 0x0F; // WHITE2 + buf[3] = 0x00; // TRANSPARENT + buf[4] = 0x01; // DARK_GREY + buf = gPokemonStorageSystemPtr->unk_127a + 5; + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x06; // size + buf[2] = 0x04; + buf = gPokemonStorageSystemPtr->unk_127a + 8; + buf = StringCopy(buf, ItemId_GetItem(gPokemonStorageSystemPtr->unk_11f2)->name); + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x07; // UNKNOWN_7; + buf += 2; + } + buf[0] = EOS; + } +} + +#ifdef NONMATCHING +u8 sub_809C464(void) +{ + u8 r9; + s8 r8 = gUnknown_020384E4; + s8 r4 = gUnknown_020384E5; + gPokemonStorageSystemPtr->unk_11de = 0; + gPokemonStorageSystemPtr->unk_11df = 0; + gPokemonStorageSystemPtr->unk_11e3 = 0; + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + r9 = 1; + if (gUnknown_020384E5 >= 6) + { + r4 -= 6; + } + else + { + r8 = 2; + r4 = 0; + } + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + r9 = 1; + r4 += 6; + if (r4 >= 30) + { + r8 = 3; + r4 -= 30; + r4 /= 3; + gPokemonStorageSystemPtr->unk_11de = 1; + gPokemonStorageSystemPtr->unk_11e3 = 1; + } + } + else if (gMain.newAndRepeatedKeys & DPAD_LEFT) + { + r9 = 1; + if (gUnknown_020384E5 % 6) + r4--; + else + { + gPokemonStorageSystemPtr->unk_11df = -1; + r4 += 5; + } + } + else if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + { + r9 = 1; + if ((gUnknown_020384E5 + 1) % 6) + r4++; + else + { + gPokemonStorageSystemPtr->unk_11df = 1; + r4 -= 5; + } + } + else if (gMain.newKeys & START_BUTTON) + { + r9 = 1; + r8 = 2; + r4 = 0; + } + else + { + if ((gMain.newKeys & A_BUTTON) && sub_809CAB0()) + { + if (gUnknown_020384E9 == 0) + return 8; + switch (sub_809CE4C(0)) + { + case 1: + return 11; + case 2: + return 12; + case 3: + return 13; + case 4: + return 14; + case 5: + return 15; + } + } + if (gMain.newKeys & B_BUTTON) + return 16; + if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR) + { + if (gMain.heldKeys & L_BUTTON) + return 10; + if (gMain.heldKeys & R_BUTTON) + return 9; + } + if (gMain.newKeys & SELECT_BUTTON) + { + sub_809CD88(); + return 0; + } + r9 = 0; + } + if (r9) + sub_809AF18(r8, r4); + return r9; +} +#else +__attribute__((naked)) u8 sub_809C464(void) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r9\n" + "\tmov r6, r8\n" + "\tpush {r6,r7}\n" + "\tldr r0, _0809C4D8 @ =gUnknown_020384E4\n" + "\tldrb r0, [r0]\n" + "\tmov r8, r0\n" + "\tldr r2, _0809C4DC @ =gUnknown_020384E5\n" + "\tldrb r4, [r2]\n" + "\tldr r0, _0809C4E0 @ =gPokemonStorageSystemPtr\n" + "\tldr r1, [r0]\n" + "\tldr r0, _0809C4E4 @ =0x000011de\n" + "\tadds r7, r1, r0\n" + "\tmovs r0, 0\n" + "\tstrb r0, [r7]\n" + "\tldr r3, _0809C4E8 @ =0x000011df\n" + "\tadds r5, r1, r3\n" + "\tstrb r0, [r5]\n" + "\tadds r3, 0x4\n" + "\tadds r6, r1, r3\n" + "\tstrb r0, [r6]\n" + "\tldr r0, _0809C4EC @ =gMain\n" + "\tmov r12, r0\n" + "\tldrh r1, [r0, 0x30]\n" + "\tmovs r0, 0x40\n" + "\tands r0, r1\n" + "\tadds r3, r2, 0\n" + "\tcmp r0, 0\n" + "\tbeq _0809C4A0\n" + "\tb _0809C62A\n" + "_0809C4A0:\n" + "\tmovs r0, 0x80\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C4F0\n" + "\tmovs r1, 0x1\n" + "\tmov r9, r1\n" + "\tlsls r0, r4, 24\n" + "\tmovs r3, 0xC0\n" + "\tlsls r3, 19\n" + "\tadds r0, r3\n" + "\tlsrs r4, r0, 24\n" + "\tasrs r0, 24\n" + "\tcmp r0, 0x1D\n" + "\tbgt _0809C4BE\n" + "\tb _0809C648\n" + "_0809C4BE:\n" + "\tmovs r1, 0x3\n" + "\tmov r8, r1\n" + "\tsubs r0, 0x1E\n" + "\tlsls r0, 24\n" + "\tasrs r0, 24\n" + "\tbl __divsi3\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "\tmov r3, r9\n" + "\tstrb r3, [r7]\n" + "\tstrb r3, [r6]\n" + "\tb _0809C648\n" + "\t.align 2, 0\n" + "_0809C4D8: .4byte gUnknown_020384E4\n" + "_0809C4DC: .4byte gUnknown_020384E5\n" + "_0809C4E0: .4byte gPokemonStorageSystemPtr\n" + "_0809C4E4: .4byte 0x000011de\n" + "_0809C4E8: .4byte 0x000011df\n" + "_0809C4EC: .4byte gMain\n" + "_0809C4F0:\n" + "\tmovs r0, 0x20\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C524\n" + "\tmovs r0, 0x1\n" + "\tmov r9, r0\n" + "\tmovs r0, 0\n" + "\tldrsb r0, [r3, r0]\n" + "\tmovs r1, 0x6\n" + "\tbl __modsi3\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _0809C514\n" + "\tlsls r0, r4, 24\n" + "\tmovs r1, 0xFF\n" + "\tlsls r1, 24\n" + "\tb _0809C63C\n" + "_0809C514:\n" + "\tmovs r0, 0xFF\n" + "\tstrb r0, [r5]\n" + "\tlsls r0, r4, 24\n" + "\tmovs r3, 0xA0\n" + "\tlsls r3, 19\n" + "\tadds r0, r3\n" + "\tlsrs r4, r0, 24\n" + "\tb _0809C648\n" + "_0809C524:\n" + "\tmovs r0, 0x10\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C554\n" + "\tmovs r0, 0x1\n" + "\tmov r9, r0\n" + "\tmovs r0, 0\n" + "\tldrsb r0, [r3, r0]\n" + "\tadds r0, 0x1\n" + "\tmovs r1, 0x6\n" + "\tbl __modsi3\n" + "\tcmp r0, 0\n" + "\tbeq _0809C548\n" + "\tlsls r0, r4, 24\n" + "\tmovs r1, 0x80\n" + "\tlsls r1, 17\n" + "\tb _0809C63C\n" + "_0809C548:\n" + "\tmov r3, r9\n" + "\tstrb r3, [r5]\n" + "\tlsls r0, r4, 24\n" + "\tmovs r1, 0xFB\n" + "\tlsls r1, 24\n" + "\tb _0809C63C\n" + "_0809C554:\n" + "\tmov r3, r12\n" + "\tldrh r1, [r3, 0x2E]\n" + "\tmovs r0, 0x8\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C56A\n" + "\tmovs r0, 0x1\n" + "\tmov r9, r0\n" + "\tmovs r1, 0x2\n" + "\tmov r8, r1\n" + "\tb _0809C646\n" + "_0809C56A:\n" + "\tmovs r0, 0x1\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C5D4\n" + "\tbl sub_809CAB0\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _0809C5D4\n" + "\tldr r0, _0809C588 @ =gUnknown_020384E9\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbne _0809C58C\n" + "\tmovs r0, 0x8\n" + "\tb _0809C658\n" + "\t.align 2, 0\n" + "_0809C588: .4byte gUnknown_020384E9\n" + "_0809C58C:\n" + "\tmovs r0, 0\n" + "\tbl sub_809CE4C\n" + "\tsubs r0, 0x1\n" + "\tlsls r0, 24\n" + "\tasrs r0, 24\n" + "\tcmp r0, 0x4\n" + "\tbhi _0809C5D4\n" + "\tlsls r0, 2\n" + "\tldr r1, _0809C5A8 @ =_0809C5AC\n" + "\tadds r0, r1\n" + "\tldr r0, [r0]\n" + "\tmov pc, r0\n" + "\t.align 2, 0\n" + "_0809C5A8: .4byte _0809C5AC\n" + "\t.align 2, 0\n" + "_0809C5AC:\n" + "\t.4byte _0809C5C0\n" + "\t.4byte _0809C5C4\n" + "\t.4byte _0809C5C8\n" + "\t.4byte _0809C5CC\n" + "\t.4byte _0809C5D0\n" + "_0809C5C0:\n" + "\tmovs r0, 0xB\n" + "\tb _0809C658\n" + "_0809C5C4:\n" + "\tmovs r0, 0xC\n" + "\tb _0809C658\n" + "_0809C5C8:\n" + "\tmovs r0, 0xD\n" + "\tb _0809C658\n" + "_0809C5CC:\n" + "\tmovs r0, 0xE\n" + "\tb _0809C658\n" + "_0809C5D0:\n" + "\tmovs r0, 0xF\n" + "\tb _0809C658\n" + "_0809C5D4:\n" + "\tldr r2, _0809C5E4 @ =gMain\n" + "\tldrh r1, [r2, 0x2E]\n" + "\tmovs r0, 0x2\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C5E8\n" + "\tmovs r0, 0x10\n" + "\tb _0809C658\n" + "\t.align 2, 0\n" + "_0809C5E4: .4byte gMain\n" + "_0809C5E8:\n" + "\tldr r0, _0809C600 @ =gSaveBlock2\n" + "\tldrb r0, [r0, 0x13]\n" + "\tcmp r0, 0x1\n" + "\tbne _0809C612\n" + "\tldrh r1, [r2, 0x2C]\n" + "\tmovs r0, 0x80\n" + "\tlsls r0, 2\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C604\n" + "\tmovs r0, 0xA\n" + "\tb _0809C658\n" + "\t.align 2, 0\n" + "_0809C600: .4byte gSaveBlock2\n" + "_0809C604:\n" + "\tmovs r0, 0x80\n" + "\tlsls r0, 1\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C612\n" + "\tmovs r0, 0x9\n" + "\tb _0809C658\n" + "_0809C612:\n" + "\tldrh r1, [r2, 0x2E]\n" + "\tmovs r0, 0x4\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C624\n" + "\tbl sub_809CD88\n" + "\tmovs r0, 0\n" + "\tb _0809C658\n" + "_0809C624:\n" + "\tmovs r3, 0\n" + "\tmov r9, r3\n" + "\tb _0809C656\n" + "_0809C62A:\n" + "\tmovs r0, 0x1\n" + "\tmov r9, r0\n" + "\tmovs r0, 0\n" + "\tldrsb r0, [r2, r0]\n" + "\tcmp r0, 0x5\n" + "\tble _0809C642\n" + "\tlsls r0, r4, 24\n" + "\tmovs r1, 0xFA\n" + "\tlsls r1, 24\n" + "_0809C63C:\n" + "\tadds r0, r1\n" + "\tlsrs r4, r0, 24\n" + "\tb _0809C648\n" + "_0809C642:\n" + "\tmovs r3, 0x2\n" + "\tmov r8, r3\n" + "_0809C646:\n" + "\tmovs r4, 0\n" + "_0809C648:\n" + "\tmov r0, r9\n" + "\tcmp r0, 0\n" + "\tbeq _0809C656\n" + "\tmov r0, r8\n" + "\tadds r1, r4, 0\n" + "\tbl sub_809AF18\n" + "_0809C656:\n" + "\tmov r0, r9\n" + "_0809C658:\n" + "\tpop {r3,r4}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tpop {r4-r7}\n" + "\tpop {r1}\n" + "\tbx r1"); +} +#endif + +#ifdef NONMATCHING +u8 sub_809C664(void) +{ + s8 r10 = gUnknown_020384E4; + s8 r4 = gUnknown_020384E5; + u8 r8; + u8 r9; + + gPokemonStorageSystemPtr->unk_11df = 0; + gPokemonStorageSystemPtr->unk_11de = 0; + gPokemonStorageSystemPtr->unk_11e3 = 0; + r9 = FALSE; + r8 = 0; + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + if (--r4 < 0) + r4 = 6; + if (r4 != gUnknown_020384E5) + r8 = 1; + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if (++r4 > 6) + r4 = 0; + if (r4 != gUnknown_020384E5) + r8 = 1; + } + else if ((gMain.newAndRepeatedKeys & DPAD_LEFT) && gUnknown_020384E5) + { + r8 = 1; + gPokemonStorageSystemPtr->unk_11e2 = gUnknown_020384E5; + r4 = 0; + } + else if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + { + if (gUnknown_020384E5 == 0) + { + r8 = 1; + r4 = gPokemonStorageSystemPtr->unk_11e2; + } + else + { + r8 = 6; + r10 = 0; + r4 = 0; + } + } + else + { + if (gMain.newKeys & A_BUTTON) + { + if (gUnknown_020384E5 == 6) + { + if (gPokemonStorageSystemPtr->unk_0005 == 1) + return 4; + r9 = TRUE; + } + else if (sub_809CAB0()) + { + if (gUnknown_020384E9 == 0) + return 8; + switch (sub_809CE4C(0)) + { + case 1: + return 11; + case 2: + return 12; + case 3: + return 13; + case 4: + return 14; + case 5: + return 15; + } + } + } + if (gMain.newKeys & B_BUTTON) + { + if (gPokemonStorageSystemPtr->unk_0005 == 1) + return 16; + r9 = TRUE; + } + if (!r9) + { + r8 = 6; + r10 = 0; + r4 = 0; + } + else if (gMain.newKeys & SELECT_BUTTON) + { + sub_809CD88(); + return 0; + } + } + if (r8) + sub_809AF18(r10, r4); + return r8; +} +#else +__attribute__((naked)) u8 sub_809C664(void) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tldr r0, _0809C6D8 @ =gUnknown_020384E4\n" + "\tldrb r0, [r0]\n" + "\tmov r10, r0\n" + "\tldr r7, _0809C6DC @ =gUnknown_020384E5\n" + "\tldrb r4, [r7]\n" + "\tldr r2, _0809C6E0 @ =gPokemonStorageSystemPtr\n" + "\tldr r5, [r2]\n" + "\tldr r1, _0809C6E4 @ =0x000011df\n" + "\tadds r0, r5, r1\n" + "\tmovs r1, 0\n" + "\tstrb r1, [r0]\n" + "\tldr r3, _0809C6E8 @ =0x000011de\n" + "\tadds r0, r5, r3\n" + "\tstrb r1, [r0]\n" + "\tadds r3, 0x5\n" + "\tadds r0, r5, r3\n" + "\tstrb r1, [r0]\n" + "\tmov r9, r1\n" + "\tmov r8, r1\n" + "\tldr r1, _0809C6EC @ =gMain\n" + "\tldrh r3, [r1, 0x30]\n" + "\tmovs r0, 0x40\n" + "\tands r0, r3\n" + "\tadds r6, r7, 0\n" + "\tmov r12, r2\n" + "\tadds r2, r1, 0\n" + "\tcmp r0, 0\n" + "\tbeq _0809C6A8\n" + "\tb _0809C81C\n" + "_0809C6A8:\n" + "\tmovs r0, 0x80\n" + "\tands r0, r3\n" + "\tcmp r0, 0\n" + "\tbeq _0809C6F0\n" + "\tlsls r0, r4, 24\n" + "\tmovs r1, 0x80\n" + "\tlsls r1, 17\n" + "\tadds r0, r1\n" + "\tlsrs r4, r0, 24\n" + "\tasrs r0, 24\n" + "\tcmp r0, 0x6\n" + "\tble _0809C6C2\n" + "\tmovs r4, 0\n" + "_0809C6C2:\n" + "\tlsls r0, r4, 24\n" + "\tasrs r0, 24\n" + "\tmovs r1, 0\n" + "\tldrsb r1, [r6, r1]\n" + "\tcmp r0, r1\n" + "\tbne _0809C6D0\n" + "\tb _0809C83C\n" + "_0809C6D0:\n" + "\tmovs r2, 0x1\n" + "\tmov r8, r2\n" + "\tb _0809C842\n" + "\t.align 2, 0\n" + "_0809C6D8: .4byte gUnknown_020384E4\n" + "_0809C6DC: .4byte gUnknown_020384E5\n" + "_0809C6E0: .4byte gPokemonStorageSystemPtr\n" + "_0809C6E4: .4byte 0x000011df\n" + "_0809C6E8: .4byte 0x000011de\n" + "_0809C6EC: .4byte gMain\n" + "_0809C6F0:\n" + "\tmovs r0, 0x20\n" + "\tands r0, r3\n" + "\tcmp r0, 0\n" + "\tbeq _0809C714\n" + "\tldrb r1, [r6]\n" + "\tmovs r0, 0\n" + "\tldrsb r0, [r6, r0]\n" + "\tcmp r0, 0\n" + "\tbeq _0809C714\n" + "\tmovs r3, 0x1\n" + "\tmov r8, r3\n" + "\tldr r2, _0809C710 @ =0x000011e2\n" + "\tadds r0, r5, r2\n" + "\tstrb r1, [r0]\n" + "\tmovs r4, 0\n" + "\tb _0809C83C\n" + "\t.align 2, 0\n" + "_0809C710: .4byte 0x000011e2\n" + "_0809C714:\n" + "\tldrh r1, [r2, 0x30]\n" + "\tmovs r0, 0x10\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C748\n" + "\tmovs r0, 0\n" + "\tldrsb r0, [r6, r0]\n" + "\tcmp r0, 0\n" + "\tbne _0809C73C\n" + "\tmovs r3, 0x1\n" + "\tmov r8, r3\n" + "\tmov r1, r12\n" + "\tldr r0, [r1]\n" + "\tldr r2, _0809C738 @ =0x000011e2\n" + "\tadds r0, r2\n" + "\tldrb r4, [r0]\n" + "\tb _0809C83C\n" + "\t.align 2, 0\n" + "_0809C738: .4byte 0x000011e2\n" + "_0809C73C:\n" + "\tmovs r3, 0x6\n" + "\tmov r8, r3\n" + "\tmovs r0, 0\n" + "\tmov r10, r0\n" + "\tmovs r4, 0\n" + "\tb _0809C83C\n" + "_0809C748:\n" + "\tldrh r1, [r2, 0x2E]\n" + "\tmovs r0, 0x1\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C7D0\n" + "\tmovs r0, 0\n" + "\tldrsb r0, [r6, r0]\n" + "\tcmp r0, 0x6\n" + "\tbne _0809C76E\n" + "\tmov r1, r12\n" + "\tldr r0, [r1]\n" + "\tldrb r0, [r0, 0x5]\n" + "\tcmp r0, 0x1\n" + "\tbne _0809C768\n" + "\tmovs r0, 0x4\n" + "\tb _0809C84C\n" + "_0809C768:\n" + "\tmovs r2, 0x1\n" + "\tmov r9, r2\n" + "\tb _0809C7D0\n" + "_0809C76E:\n" + "\tbl sub_809CAB0\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _0809C7D0\n" + "\tldr r0, _0809C784 @ =gUnknown_020384E9\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbne _0809C788\n" + "\tmovs r0, 0x8\n" + "\tb _0809C84C\n" + "\t.align 2, 0\n" + "_0809C784: .4byte gUnknown_020384E9\n" + "_0809C788:\n" + "\tmovs r0, 0\n" + "\tbl sub_809CE4C\n" + "\tsubs r0, 0x1\n" + "\tlsls r0, 24\n" + "\tasrs r0, 24\n" + "\tcmp r0, 0x4\n" + "\tbhi _0809C7D0\n" + "\tlsls r0, 2\n" + "\tldr r1, _0809C7A4 @ =_0809C7A8\n" + "\tadds r0, r1\n" + "\tldr r0, [r0]\n" + "\tmov pc, r0\n" + "\t.align 2, 0\n" + "_0809C7A4: .4byte _0809C7A8\n" + "\t.align 2, 0\n" + "_0809C7A8:\n" + "\t.4byte _0809C7BC\n" + "\t.4byte _0809C7C0\n" + "\t.4byte _0809C7C4\n" + "\t.4byte _0809C7C8\n" + "\t.4byte _0809C7CC\n" + "_0809C7BC:\n" + "\tmovs r0, 0xB\n" + "\tb _0809C84C\n" + "_0809C7C0:\n" + "\tmovs r0, 0xC\n" + "\tb _0809C84C\n" + "_0809C7C4:\n" + "\tmovs r0, 0xD\n" + "\tb _0809C84C\n" + "_0809C7C8:\n" + "\tmovs r0, 0xE\n" + "\tb _0809C84C\n" + "_0809C7CC:\n" + "\tmovs r0, 0xF\n" + "\tb _0809C84C\n" + "_0809C7D0:\n" + "\tldr r2, _0809C7EC @ =gMain\n" + "\tldrh r1, [r2, 0x2E]\n" + "\tmovs r0, 0x2\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C7F8\n" + "\tldr r0, _0809C7F0 @ =gPokemonStorageSystemPtr\n" + "\tldr r0, [r0]\n" + "\tldrb r0, [r0, 0x5]\n" + "\tcmp r0, 0x1\n" + "\tbne _0809C7F4\n" + "\tmovs r0, 0x10\n" + "\tb _0809C84C\n" + "\t.align 2, 0\n" + "_0809C7EC: .4byte gMain\n" + "_0809C7F0: .4byte gPokemonStorageSystemPtr\n" + "_0809C7F4:\n" + "\tmovs r3, 0x1\n" + "\tmov r9, r3\n" + "_0809C7F8:\n" + "\tmov r0, r9\n" + "\tcmp r0, 0\n" + "\tbeq _0809C80A\n" + "\tmovs r1, 0x6\n" + "\tmov r8, r1\n" + "\tmovs r2, 0\n" + "\tmov r10, r2\n" + "\tmovs r4, 0\n" + "\tb _0809C83C\n" + "_0809C80A:\n" + "\tldrh r1, [r2, 0x2E]\n" + "\tmovs r0, 0x4\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C83C\n" + "\tbl sub_809CD88\n" + "\tmovs r0, 0\n" + "\tb _0809C84C\n" + "_0809C81C:\n" + "\tlsls r0, r4, 24\n" + "\tmovs r3, 0xFF\n" + "\tlsls r3, 24\n" + "\tadds r0, r3\n" + "\tlsrs r4, r0, 24\n" + "\tcmp r0, 0\n" + "\tbge _0809C82C\n" + "\tmovs r4, 0x6\n" + "_0809C82C:\n" + "\tlsls r0, r4, 24\n" + "\tasrs r0, 24\n" + "\tmovs r1, 0\n" + "\tldrsb r1, [r7, r1]\n" + "\tcmp r0, r1\n" + "\tbeq _0809C83C\n" + "\tmovs r0, 0x1\n" + "\tmov r8, r0\n" + "_0809C83C:\n" + "\tmov r1, r8\n" + "\tcmp r1, 0\n" + "\tbeq _0809C84A\n" + "_0809C842:\n" + "\tmov r0, r10\n" + "\tadds r1, r4, 0\n" + "\tbl sub_809AF18\n" + "_0809C84A:\n" + "\tmov r0, r8\n" + "_0809C84C:\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r1}\n" + "\tbx r1"); +} +#endif diff --git a/src/pokemon/pokemon_storage_system_5.c b/src/pokemon/pokemon_storage_system_5.c new file mode 100644 index 000000000..b7c3d42f5 --- /dev/null +++ b/src/pokemon/pokemon_storage_system_5.c @@ -0,0 +1,16 @@ + +// Includes +#include "global.h" +#include "pokemon_storage_system.h" + +// Static type declarations + +// Static RAM declarations + +EWRAM_DATA struct UnkStruct_2000020 *gUnknown_020384EC = NULL; + +// Static ROM declarations + +// .rodata + +// .text diff --git a/src/pokemon/pokemon_summary_screen.c b/src/pokemon/pokemon_summary_screen.c index 9563bc08f..9c621780a 100644 --- a/src/pokemon/pokemon_summary_screen.c +++ b/src/pokemon/pokemon_summary_screen.c @@ -29,7 +29,7 @@ #include "strings2.h" #include "task.h" #include "tv.h" -#include "unknown_task.h" +#include "scanline_effect.h" static void sub_809FC0C(void); static void sub_809FEB8(void); @@ -41,11 +41,11 @@ static void sub_80A0090(struct Pokemon *); static void sub_80A015C(struct Pokemon *); static void sub_809DE44(void); static void sub_809EB40(u8); -static void sub_809EBC4(void); -static void sub_809E044(void); +/*static*/ void sub_809EBC4(void); +/*static*/ void sub_809E044(void); static void sub_80A1D84(struct Pokemon *); -static void sub_80A18C4(void); -static bool8 LoadPokemonSummaryScreenGraphics(void); +/*static*/ void sub_80A18C4(void); +/*static*/ bool8 LoadPokemonSummaryScreenGraphics(void); static bool8 MonKnowsMultipleMoves(struct Pokemon *); static void PrintSummaryWindowHeaderText(void); static void sub_80A1DCC(struct Pokemon *); @@ -63,8 +63,8 @@ static void PrintHeldItemName(u16, u8, u8); static void PrintNumRibbons(struct Pokemon *); static void DrawExperienceProgressBar(struct Pokemon *, u8, u8); static void sub_809E13C(u8 taskId); -static void sub_80A1950(void); -static void sub_809DE64(void); +/*static*/ void sub_80A1950(void); +/*static*/ void sub_809DE64(void); static void SummaryScreenHandleAButton(u8); static void SummaryScreenHandleUpDownInput(u8, s8); static bool8 sub_809F7D0(u8); @@ -121,16 +121,14 @@ extern u8 ball_number_to_ball_processing_index(u16); extern u8 StorageSystemGetNextMonIndex(struct BoxPokemon *, u8, u8, u8); extern struct MusicPlayerInfo gMPlay_BGM; -extern u8 gUnknown_020384F0; extern u8 gUnknown_08208238[]; -extern u16 gUnknown_030041B8; +extern u16 gBattle_BG3_Y; extern u16 gBattle_BG2_Y; extern u16 gBattle_BG1_Y; extern u16 gBattle_BG1_X; extern u16 gBattle_BG2_X; -extern u16 gUnknown_030041B0; +extern u16 gBattle_BG3_X; extern TaskFunc gUnknown_03005CF0; -extern struct Sprite *gUnknown_020384F4; extern struct SpriteTemplate gUnknown_02024E8C; extern const u8 gStatusPal_Icons[]; @@ -146,7 +144,6 @@ extern const u8 gUnknown_08E74E88[]; extern const u8 gUnknown_08E73508[]; extern const u8 gStatusScreen_Gfx[]; extern const u8 gFontDefaultPalette[]; -extern const u8 gUnknownPalette_81E6692[]; extern const u8 gAbilityNames[][13]; extern const u8 * const gAbilityDescriptions[]; extern const u8 * const gContestEffectStrings[]; @@ -157,6 +154,9 @@ extern const u16 gUnknown_08E94550[]; extern const u16 gUnknown_08E94590[]; extern const u8 gUnknown_08E73E88[]; +EWRAM_DATA u8 gUnknown_020384F0 = 0; +EWRAM_DATA struct Sprite *gUnknown_020384F4 = NULL; + #if ENGLISH #include "../data/text/move_descriptions_en.h" #include "../data/text/nature_names_en.h" @@ -571,7 +571,43 @@ static const u8 sUnknown_083C15BC[] = { -1, 15, 0, 10, }; - +#if DEBUG +__attribute__((naked)) +void sub_809D844(void) +{ + asm("\ + push {lr}\n\ + add sp, sp, #0xfffffffc\n\ + bl RunTasks\n\ + bl AnimateSprites\n\ + bl BuildOamBuffer\n\ + bl UpdatePaletteFade\n\ + ldr r0, ._2 @ gLinkOpen\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._1 @cond_branch\n\ + ldr r0, ._2 + 4 @ gLink\n\ + ldr r1, ._2 + 8 @ 0xfbd\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + mov r1, #0x3\n\ + str r1, [sp]\n\ + mov r1, #0x14\n\ + mov r2, #0x1\n\ + mov r3, #0x2\n\ + bl debug_sub_8008264\n\ +._1:\n\ + add sp, sp, #0x4\n\ + pop {r0}\n\ + bx r0\n\ +._3:\n\ + .align 2, 0\n\ +._2:\n\ + .word gLinkOpen\n\ + .word gLink\n\ + .word 0xfbd"); +} +#else void sub_809D844(void) { RunTasks(); @@ -579,6 +615,7 @@ void sub_809D844(void) BuildOamBuffer(); UpdatePaletteFade(); } +#endif void sub_809D85C(void) { @@ -586,8 +623,8 @@ void sub_809D85C(void) REG_BG1VOFS = gBattle_BG1_Y; REG_BG2HOFS = gBattle_BG2_X; REG_BG2VOFS = gBattle_BG2_Y; - REG_BG3HOFS = gUnknown_030041B0; - REG_BG3VOFS = gUnknown_030041B8; + REG_BG3HOFS = gBattle_BG3_X; + REG_BG3VOFS = gBattle_BG3_Y; LoadOam(); ProcessSpriteCopyRequests(); @@ -688,11 +725,493 @@ void sub_809DA1C(void) } } +#if DEBUG +__attribute__((naked)) +bool8 sub_809DA84(void) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + add sp, sp, #0xfffffff8\n\ + ldr r1, ._52 @ gMain\n\ + ldr r2, ._52 + 4 @ 0x43c\n\ + add r0, r1, r2\n\ + ldrb r0, [r0]\n\ + mov ip, r1\n\ + cmp r0, #0x16\n\ + bls ._50 @cond_branch\n\ + b ._51\n\ +._50:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._52 + 8 @ \n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._53:\n\ + .align 2, 0\n\ +._52:\n\ + .word gMain\n\ + .word 0x43c\n\ + .word ._54\n\ +._54:\n\ + .word ._55\n\ + .word ._56\n\ + .word ._57\n\ + .word ._58\n\ + .word ._59\n\ + .word ._60\n\ + .word ._61\n\ + .word ._62\n\ + .word ._63\n\ + .word ._64\n\ + .word ._65\n\ + .word ._66\n\ + .word ._67\n\ + .word ._68\n\ + .word ._69\n\ + .word ._70\n\ + .word ._71\n\ + .word ._72\n\ + .word ._73\n\ + .word ._74\n\ + .word ._75\n\ + .word ._76\n\ + .word ._77\n\ +._55:\n\ + mov r0, #0x0\n\ + bl SetVBlankCallback\n\ + bl ResetSpriteData\n\ + b ._146\n\ +._56:\n\ + bl ScanlineEffect_Stop\n\ + ldr r1, ._80 @ gMain\n\ + ldr r2, ._80 + 4 @ 0x43c\n\ + add r1, r1, r2\n\ + b ._153\n\ +._81:\n\ + .align 2, 0\n\ +._80:\n\ + .word gMain\n\ + .word 0x43c\n\ +._57:\n\ + bl FreeAllSpritePalettes\n\ + b ._146\n\ +._58:\n\ + mov r2, #0xc0\n\ + lsl r2, r2, #0x13\n\ + mov r3, #0x80\n\ + lsl r3, r3, #0x9\n\ + mov r5, #0x0\n\ + ldr r1, ._85 @ 0x40000d4\n\ + mov r4, #0x80\n\ + lsl r4, r4, #0x5\n\ + ldr r6, ._85 + 4 @ 0x85000400\n\ + mov r7, #0x85\n\ + lsl r7, r7, #0x18\n\ +._83:\n\ + str r5, [sp, #0x4]\n\ + add r0, sp, #0x4\n\ + str r0, [r1]\n\ + str r2, [r1, #0x4]\n\ + str r6, [r1, #0x8]\n\ + ldr r0, [r1, #0x8]\n\ + add r2, r2, r4\n\ + sub r3, r3, r4\n\ + cmp r3, r4\n\ + bhi ._83 @cond_branch\n\ + str r5, [sp, #0x4]\n\ + add r0, sp, #0x4\n\ + str r0, [r1]\n\ + str r2, [r1, #0x4]\n\ + lsr r0, r3, #0x2\n\ + orr r0, r0, r7\n\ + str r0, [r1, #0x8]\n\ + ldr r0, [r1, #0x8]\n\ + ldr r1, ._85 + 8 @ 0x43c\n\ + add r1, r1, ip\n\ + b ._153\n\ +._86:\n\ + .align 2, 0\n\ +._85:\n\ + .word 0x40000d4\n\ + .word 0x85000400\n\ + .word 0x43c\n\ +._59:\n\ + bl sub_809DE64\n\ + ldr r1, ._88 @ gMain\n\ + ldr r2, ._88 + 4 @ 0x43c\n\ + add r1, r1, r2\n\ + b ._153\n\ +._89:\n\ + .align 2, 0\n\ +._88:\n\ + .word gMain\n\ + .word 0x43c\n\ +._60:\n\ + ldr r0, ._91 @ gWindowTemplate_81E6E6C\n\ + bl Text_LoadWindowTemplate\n\ + b ._146\n\ +._92:\n\ + .align 2, 0\n\ +._91:\n\ + .word gWindowTemplate_81E6E6C\n\ +._61:\n\ + ldr r0, ._94 @ gWindowTemplate_81E6E6C\n\ + bl MultistepInitMenuWindowBegin\n\ + ldr r1, ._94 + 4 @ gMain\n\ + ldr r2, ._94 + 8 @ 0x43c\n\ + add r1, r1, r2\n\ + b ._153\n\ +._95:\n\ + .align 2, 0\n\ +._94:\n\ + .word gWindowTemplate_81E6E6C\n\ + .word gMain\n\ + .word 0x43c\n\ +._62:\n\ + bl MultistepInitMenuWindowContinue\n\ + cmp r0, #0\n\ + bne ._96 @cond_branch\n\ + b ._157\n\ +._96:\n\ + b ._146\n\ +._63:\n\ + bl sub_809DA1C\n\ + ldr r1, ._100 @ gMain\n\ + ldr r2, ._100 + 4 @ 0x43c\n\ + add r1, r1, r2\n\ + b ._153\n\ +._101:\n\ + .align 2, 0\n\ +._100:\n\ + .word gMain\n\ + .word 0x43c\n\ +._64:\n\ + ldr r1, ._103 @ gSummaryScreenTextTiles\n\ + ldr r2, ._103 + 4 @ 0x600d000\n\ + ldr r0, ._103 + 8 @ 0x40000d4\n\ + str r1, [r0]\n\ + str r2, [r0, #0x4]\n\ + ldr r1, ._103 + 12 @ 0x800000a0\n\ + str r1, [r0, #0x8]\n\ + ldr r1, [r0, #0x8]\n\ + ldr r1, ._103 + 16 @ sSummaryScreenButtonTiles\n\ + ldr r2, ._103 + 20 @ 0x600d140\n\ + str r1, [r0]\n\ + str r2, [r0, #0x4]\n\ + ldr r1, ._103 + 24 @ 0x80000080\n\ + str r1, [r0, #0x8]\n\ + ldr r0, [r0, #0x8]\n\ + ldr r0, ._103 + 28 @ \n\ + add r0, r0, #0x74\n\ + mov r1, #0x0\n\ + strb r1, [r0]\n\ + ldr r1, ._103 + 32 @ \n\ + add r1, r1, ip\n\ + b ._153\n\ +._104:\n\ + .align 2, 0\n\ +._103:\n\ + .word gSummaryScreenTextTiles\n\ + .word 0x600d000\n\ + .word 0x40000d4\n\ + .word 0x800000a0\n\ + .word sSummaryScreenButtonTiles\n\ + .word 0x600d140\n\ + .word 0x80000080\n\ + .word +0x2018000\n\ + .word 0x43c\n\ +._65:\n\ + bl LoadPokemonSummaryScreenGraphics\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._105 @cond_branch\n\ + b ._157\n\ +._105:\n\ + ldr r0, ._108 @ \n\ + add r0, r0, #0x74\n\ + mov r1, #0x0\n\ + strb r1, [r0]\n\ + b ._146\n\ +._109:\n\ + .align 2, 0\n\ +._108:\n\ + .word +0x2018000\n\ +._66:\n\ + bl sub_80A18C4\n\ + ldr r1, ._111 @ gMain\n\ + ldr r2, ._111 + 4 @ 0x43c\n\ + add r1, r1, r2\n\ + b ._153\n\ +._112:\n\ + .align 2, 0\n\ +._111:\n\ + .word gMain\n\ + .word 0x43c\n\ +._67:\n\ + ldr r4, ._115 @ \n\ + add r0, r4, #0\n\ + bl sub_809F678\n\ + add r0, r4, #0\n\ + bl GetMonStatusAndPokerus\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._113 @cond_branch\n\ + mov r0, #0x0\n\ + bl sub_80A12D0\n\ + b ._114\n\ +._116:\n\ + .align 2, 0\n\ +._115:\n\ + .word +0x2018010\n\ +._113:\n\ + mov r0, #0xa\n\ + bl sub_80A12D0\n\ +._114:\n\ + ldr r0, ._118 @ \n\ + bl DrawPokerusSurvivorDot\n\ + b ._146\n\ +._119:\n\ + .align 2, 0\n\ +._118:\n\ + .word +0x2018010\n\ +._68:\n\ + bl sub_80A1950\n\ + ldr r0, ._121 @ \n\ + bl sub_80A1D84\n\ + ldr r1, ._121 + 4 @ \n\ + ldr r2, ._121 + 8 @ \n\ + add r1, r1, r2\n\ + b ._153\n\ +._122:\n\ + .align 2, 0\n\ +._121:\n\ + .word +0x2018010\n\ + .word gMain\n\ + .word 0x43c\n\ +._69:\n\ + ldr r4, ._124 @ \n\ + add r0, r4, #0\n\ + bl sub_80A1DE8\n\ + add r4, r4, #0x64\n\ + mov r0, #0x0\n\ + strb r0, [r4]\n\ + b ._146\n\ +._125:\n\ + .align 2, 0\n\ +._124:\n\ + .word +0x2018010\n\ +._70:\n\ + ldr r4, ._129 @ \n\ + add r5, r4, #0\n\ + add r5, r5, #0x64\n\ + add r0, r4, #0\n\ + add r1, r5, #0\n\ + bl sub_809F6B4\n\ + sub r4, r4, #0x10\n\ + strb r0, [r4, #0xc]\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0xff\n\ + bne ._126 @cond_branch\n\ + b ._157\n\ +._126:\n\ + mov r0, #0x0\n\ + strb r0, [r5]\n\ + ldr r1, ._129 + 4 @ \n\ + ldr r2, ._129 + 8 @ \n\ + add r1, r1, r2\n\ + b ._153\n\ +._130:\n\ + .align 2, 0\n\ +._129:\n\ + .word +0x2018010\n\ + .word gMain\n\ + .word 0x43c\n\ +._71:\n\ + bl sub_809E044\n\ + bl DrawSummaryScreenNavigationDots\n\ + b ._146\n\ +._72:\n\ + ldr r1, ._134 @ \n\ + ldrb r0, [r1, #0xb]\n\ + cmp r0, #0x1\n\ + bhi ._132 @cond_branch\n\ + ldr r0, ._134 + 4 @ \n\ + ldrb r1, [r1, #0xb]\n\ + lsl r1, r1, #0x2\n\ + add r1, r1, r0\n\ + ldr r0, [r1]\n\ + bl _call_via_r0\n\ +._132:\n\ + ldr r1, ._134 + 8 @ \n\ + ldr r2, ._134 + 12 @ \n\ + add r1, r1, r2\n\ + b ._153\n\ +._135:\n\ + .align 2, 0\n\ +._134:\n\ + .word +0x2018000\n\ + .word sUnknown_083C1580\n\ + .word gMain\n\ + .word 0x43c\n\ +._73:\n\ + ldr r0, ._137 @ \n\ + bl sub_809FAC8\n\ + b ._146\n\ +._138:\n\ + .align 2, 0\n\ +._137:\n\ + .word +0x2018010\n\ +._74:\n\ + ldr r2, ._140 @ sUnknown_083C1598\n\ + ldr r0, ._140 + 4 @ \n\ + ldrb r1, [r0, #0xb]\n\ + lsl r1, r1, #0x2\n\ + add r1, r1, r2\n\ + add r0, r0, #0x10\n\ + ldr r1, [r1]\n\ + bl _call_via_r1\n\ + ldr r1, ._140 + 8 @ \n\ + ldr r2, ._140 + 12 @ \n\ + add r1, r1, r2\n\ + b ._153\n\ +._141:\n\ + .align 2, 0\n\ +._140:\n\ + .word sUnknown_083C1598\n\ + .word +0x2018000\n\ + .word gMain\n\ + .word 0x43c\n\ +._75:\n\ + ldr r0, ._144 @ \n\ + mov r1, #0x2d\n\ + bl GetMonData\n\ + add r1, r0, #0\n\ + cmp r1, #0\n\ + beq ._142 @cond_branch\n\ + ldr r1, ._144 + 4 @ \n\ + mov r2, #0x80\n\ + lsl r2, r2, #0x1\n\ + add r0, r2, #0\n\ + strh r0, [r1]\n\ + b ._146\n\ +._145:\n\ + .align 2, 0\n\ +._144:\n\ + .word +0x2018010\n\ + .word gBattle_BG3_X\n\ +._142:\n\ + ldr r0, ._147 @ gBattle_BG3_X\n\ + strh r1, [r0]\n\ + b ._146\n\ +._148:\n\ + .align 2, 0\n\ +._147:\n\ + .word gBattle_BG3_X\n\ +._76:\n\ + bl sub_809EBC4\n\ + ldr r0, ._151 @ \n\ + add r0, r0, #0x79\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._149 @cond_branch\n\ + mov r0, #0x0\n\ + mov r1, #0x0\n\ + bl sub_80A1488\n\ + mov r0, #0x0\n\ + mov r1, #0x0\n\ + bl sub_80A1654\n\ + b ._150\n\ +._152:\n\ + .align 2, 0\n\ +._151:\n\ + .word +0x2018000\n\ +._149:\n\ + mov r0, #0xa\n\ + mov r1, #0x0\n\ + bl sub_80A1488\n\ + mov r0, #0xa\n\ + mov r1, #0x0\n\ + bl sub_80A1654\n\ +._150:\n\ + bl PrintSummaryWindowHeaderText\n\ + ldr r1, ._154 @ gMain\n\ + ldr r2, ._154 + 4 @ 0x43c\n\ + add r1, r1, r2\n\ + b ._153\n\ +._155:\n\ + .align 2, 0\n\ +._154:\n\ + .word gMain\n\ + .word 0x43c\n\ +._77:\n\ + bl sub_8055870\n\ + cmp r0, #0x1\n\ + beq ._157 @cond_branch\n\ +._146:\n\ + ldr r1, ._158 @ gMain\n\ + ldr r0, ._158 + 4 @ 0x43c\n\ + add r1, r1, r0\n\ +._153:\n\ + ldrb r0, [r1]\n\ + add r0, r0, #0x1\n\ + strb r0, [r1]\n\ + b ._157\n\ +._159:\n\ + .align 2, 0\n\ +._158:\n\ + .word gMain\n\ + .word 0x43c\n\ +._51:\n\ + ldr r0, ._162 @ sub_809D85C\n\ + bl SetVBlankCallback\n\ + mov r0, #0x1\n\ + str r0, [sp]\n\ + mov r0, #0xff\n\ + mov r1, #0x0\n\ + mov r2, #0x10\n\ + mov r3, #0x0\n\ + bl BeginHardwarePaletteFade\n\ + ldr r0, ._162 + 4 @ sub_809D844\n\ + bl SetMainCallback2\n\ + ldr r2, ._162 + 8 @ gPaletteFade\n\ + ldrb r1, [r2, #0x8]\n\ + mov r0, #0x7f\n\ + and r0, r0, r1\n\ + strb r0, [r2, #0x8]\n\ + ldr r0, ._162 + 12 @ gLinkOpen\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._160 @cond_branch\n\ + ldr r0, ._162 + 16 @ 0x600dde0\n\ + mov r1, #0x80\n\ + lsl r1, r1, #0x8\n\ + ldr r2, ._162 + 20 @ 0x600f000\n\ + mov r3, #0x3\n\ + bl debug_sub_8008218\n\ +._160:\n\ + mov r0, #0x1\n\ + b ._161\n\ +._163:\n\ + .align 2, 0\n\ +._162:\n\ + .word sub_809D85C+1\n\ + .word sub_809D844+1\n\ + .word gPaletteFade\n\ + .word gLinkOpen\n\ + .word 0x600dde0\n\ + .word 0x600f000\n\ +._157:\n\ + mov r0, #0x0\n\ +._161:\n\ + add sp, sp, #0x8\n\ + pop {r4, r5, r6, r7}\n\ + pop {r1}\n\ + bx r1"); +} +#else bool8 sub_809DA84(void) { - const u16 *src; - void *dest; - switch (gMain.state) { case 0: @@ -701,7 +1220,7 @@ bool8 sub_809DA84(void) gMain.state++; break; case 1: - remove_some_task(); + ScanlineEffect_Stop(); gMain.state++; break; case 2: @@ -709,8 +1228,7 @@ bool8 sub_809DA84(void) gMain.state++; break; case 3: - dest = (void *)VRAM; - DmaClearLarge(3, dest, 0x10000, 0x1000, 32); + DmaClearLarge(3, (void *)(VRAM + 0x0), 0x10000, 0x1000, 32); gMain.state++; break; case 4: @@ -718,11 +1236,11 @@ bool8 sub_809DA84(void) gMain.state++; break; case 5: - SetUpWindowConfig(&gWindowConfig_81E6E6C); + Text_LoadWindowTemplate(&gWindowTemplate_81E6E6C); gMain.state++; break; case 6: - MultistepInitMenuWindowBegin(&gWindowConfig_81E6E6C); + MultistepInitMenuWindowBegin(&gWindowTemplate_81E6E6C); gMain.state++; break; case 7: @@ -736,14 +1254,8 @@ bool8 sub_809DA84(void) gMain.state++; break; case 9: - src = gSummaryScreenTextTiles; - dest = (void *)VRAM + 0xD000; - DmaCopy16(3, src, dest, 320); - - src = sSummaryScreenButtonTiles; - dest = (void *)VRAM + 0xD140; - DmaCopy16(3, src, dest, 256); - + DmaCopy16Defvars(3, gSummaryScreenTextTiles, (void *)(VRAM + 0xD000), 320); + DmaCopy16Defvars(3, sSummaryScreenButtonTiles, (void *)(VRAM + 0xD140), 256); pssData.loadGfxState = 0; gMain.state++; break; @@ -813,11 +1325,11 @@ bool8 sub_809DA84(void) case 20: if (GetMonData(&pssData.loadedMon, MON_DATA_IS_EGG)) { - gUnknown_030041B0 = 256; + gBattle_BG3_X = 256; } else { - gUnknown_030041B0 = 0; + gBattle_BG3_X = 0; } gMain.state++; @@ -855,13 +1367,15 @@ bool8 sub_809DA84(void) return FALSE; } +#endif static void sub_809DE44(void) { - while (sub_809DA84() != TRUE && sub_80F9344() != TRUE); + while (sub_809DA84() != TRUE && sub_80F9344() != TRUE) + ; } -static void sub_809DE64(void) +/*static*/ void sub_809DE64(void) { REG_BG0CNT = 0x1E08; REG_BG1CNT = 0x4801; @@ -872,8 +1386,8 @@ static void sub_809DE64(void) gBattle_BG1_Y = 0; gBattle_BG2_X = 0; gBattle_BG2_Y = 0; - gUnknown_030041B0 = 0; - gUnknown_030041B8 = 0; + gBattle_BG3_X = 0; + gBattle_BG3_Y = 0; REG_BG0HOFS = 0; REG_BG0VOFS = 0; @@ -888,7 +1402,7 @@ static void sub_809DE64(void) REG_DISPCNT = 0x1F40; } -static bool8 LoadPokemonSummaryScreenGraphics(void) +/*static*/ bool8 LoadPokemonSummaryScreenGraphics(void) { switch (pssData.loadGfxState) { @@ -938,23 +1452,23 @@ static bool8 LoadPokemonSummaryScreenGraphics(void) return FALSE; } -static void sub_809E044(void) +/*static*/ void sub_809E044(void) { - LoadPalette(&gUnknownPalette_81E6692[28], 129, 2); - LoadPalette(&gUnknownPalette_81E6692[30], 136, 2); - LoadPalette(&gUnknownPalette_81E6692[28], 143, 2); - LoadPalette(&gUnknownPalette_81E6692[30], 137, 2); - LoadPalette(&gUnknownPalette_81E6692[12], 209, 4); - LoadPalette(&gUnknownPalette_81E6692[20], 211, 4); - LoadPalette(&gUnknownPalette_81E6692[28], 213, 4); - LoadPalette(&gUnknownPalette_81E6692[12], 215, 4); - LoadPalette(&gUnknownPalette_81E6692[8], 217, 4); - LoadPalette(&gUnknownPalette_81E6692[16], 219, 4); - LoadPalette(&gUnknownPalette_81E6692[4], 221, 2); - LoadPalette(&gUnknownPalette_81E6692[6], 222, 2); - LoadPalette(&gUnknownPalette_81E6692[2], 223, 2); + LoadPalette(gUnknownPalette_81E6692 + 14, 129, 2); + LoadPalette(gUnknownPalette_81E6692 + 15, 136, 2); + LoadPalette(gUnknownPalette_81E6692 + 14, 143, 2); + LoadPalette(gUnknownPalette_81E6692 + 15, 137, 2); + LoadPalette(gUnknownPalette_81E6692 + 6, 209, 4); + LoadPalette(gUnknownPalette_81E6692 + 10, 211, 4); + LoadPalette(gUnknownPalette_81E6692 + 14, 213, 4); + LoadPalette(gUnknownPalette_81E6692 + 6, 215, 4); + LoadPalette(gUnknownPalette_81E6692 + 4, 217, 4); + LoadPalette(gUnknownPalette_81E6692 + 8, 219, 4); + LoadPalette(gUnknownPalette_81E6692 + 2, 221, 2); + LoadPalette(gUnknownPalette_81E6692 + 3, 222, 2); + LoadPalette(gUnknownPalette_81E6692 + 1, 223, 2); LoadPalette(gFontDefaultPalette, 240, 32); - LoadPalette(&gUnknownPalette_81E6692[6], 249, 2); + LoadPalette(gUnknownPalette_81E6692 + 3, 249, 2); } static void SummaryScreenExit(u8 taskId) @@ -1037,7 +1551,7 @@ static void sub_809E260(u8 taskId) { if (pssData.page == PSS_PAGE_CONTEST_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0)) { - MenuZeroFillWindowRect(0, 14, 9, 18); + Menu_EraseWindowRect(0, 14, 9, 18); } SummaryScreenHandleLeftRightInput(taskId, -1); @@ -1048,7 +1562,7 @@ static void sub_809E260(u8 taskId) { if (pssData.page == PSS_PAGE_BATTLE_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0)) { - MenuZeroFillWindowRect(0, 14, 9, 18); + Menu_EraseWindowRect(0, 14, 9, 18); } SummaryScreenHandleLeftRightInput(taskId, 1); @@ -1482,8 +1996,8 @@ static void sub_809EAC8(u8 taskId) sub_80A1B1C(9); sub_80A16CC(1); - MenuZeroFillWindowRect(15, 12, 28, 13); - MenuZeroFillWindowRect(11, 15, 28, 18); + Menu_EraseWindowRect(15, 12, 28, 13); + Menu_EraseWindowRect(11, 15, 28, 18); pssData.headerActionTextId = 6; PrintSummaryWindowHeaderText(); @@ -1517,7 +2031,7 @@ static void sub_809EB40(u8 taskId) } } -static void sub_809EBC4(void) +/*static*/ void sub_809EBC4(void) { if (pssData.page != PSS_PAGE_INFO) { @@ -2176,11 +2690,11 @@ void sub_809F43C(u8 taskId) pssData.loadGfxState = 0; if (GetMonData(&pssData.loadedMon, MON_DATA_IS_EGG)) { - gUnknown_030041B0 = 256; + gBattle_BG3_X = 256; } else { - gUnknown_030041B0 = 0; + gBattle_BG3_X = 0; } gMain.state++; @@ -2254,7 +2768,7 @@ static void sub_809F678(struct Pokemon *mon) else { struct BoxPokemon *mons = pssData.monList.boxMons; - sub_803B4B4(&mons[pssData.monIndex], mon); + ExpandBoxMon(&mons[pssData.monIndex], mon); } } @@ -2371,7 +2885,7 @@ void sub_809F814(u8 taskId) { if (pssData.page == PSS_PAGE_CONTEST_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0)) { - MenuZeroFillWindowRect(0, 14, 9, 18); + Menu_EraseWindowRect(0, 14, 9, 18); } gTasks[taskId].func = sub_809E260; @@ -2387,7 +2901,7 @@ void sub_809F814(u8 taskId) { if (pssData.page == PSS_PAGE_BATTLE_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0)) { - MenuZeroFillWindowRect(0, 14, 9, 18); + Menu_EraseWindowRect(0, 14, 9, 18); } gTasks[taskId].func = sub_809E260; @@ -2414,8 +2928,8 @@ static void sub_809F9D0(u8 taskId, u8 b) sub_80A1488(-2, 4); sub_80A1654(-2, 4); - MenuZeroFillWindowRect(11, 15, 28, 18); - MenuPrint(gOtherText_CantForgetHMs, 11, 15); + Menu_EraseWindowRect(11, 15, 28, 18); + Menu_PrintText(gOtherText_CantForgetHMs, 11, 15); gTasks[taskId].func = sub_809F814; } @@ -2494,9 +3008,9 @@ static void sub_809FAC8(struct Pokemon *mon) if (GetMonData(mon, MON_DATA_IS_EGG)) { - MenuZeroFillWindowRect(1, 2, 4, 3); - MenuZeroFillWindowRect(3, 16, 9, 17); - MenuZeroFillWindowRect(0, 12, 11, 15); + Menu_EraseWindowRect(1, 2, 4, 3); + Menu_EraseWindowRect(3, 16, 9, 17); + Menu_EraseWindowRect(0, 12, 11, 15); GetMonNickname(mon, gStringVar1); sub_80A1FF8(gStringVar1, 13, 3, 16); LoadPalette(sUnknown_083C157C, 4, 2); @@ -2520,7 +3034,7 @@ static void sub_809FAC8(struct Pokemon *mon) } else { - MenuZeroFillWindowRect(1, 2, 4, 3); + Menu_EraseWindowRect(1, 2, 4, 3); } buffer = gStringVar1; @@ -2530,7 +3044,7 @@ static void sub_809FAC8(struct Pokemon *mon) buffer[1] = 0x13; buffer[2] = 0x3C; buffer[3] = EOS; - MenuPrint(gStringVar1, 1, 12); + Menu_PrintText(gStringVar1, 1, 12); sub_80A0958(mon); } @@ -2545,12 +3059,12 @@ static void sub_809FBE4(void) sub_80A1918(i, 1); } - MenuZeroFillWindowRect(11, 4, 29, 18); + Menu_EraseWindowRect(11, 4, 29, 18); } static void sub_809FC0C(void) { - MenuPrint(gOtherText_Type2, 11, 6); + Menu_PrintText(gOtherText_Type2, 11, 6); GetStringCenterAlignXOffset(0, 22, 4); GetStringCenterAlignXOffset(2, 23, 4); } @@ -2569,38 +3083,38 @@ static void sub_809FC34(struct Pokemon *mon) sub_80A1918(i, 1); } - MenuZeroFillWindowRect(11, 9, 28, 12); + Menu_EraseWindowRect(11, 9, 28, 12); if (GetMonData(mon, MON_DATA_IS_EGG)) { buffer = gStringVar1; buffer = sub_80A1E58(buffer, 13); buffer = StringCopy(buffer, gOtherText_OriginalTrainer); - buffer = StringCopy(buffer, gOtherText_FiveQuestionsAndSlash); + buffer = StringCopy(buffer, gOtherText_FiveQuestions); buffer[0] = EXT_CTRL_CODE_BEGIN; buffer[1] = 0x13; buffer[2] = 0x4E; buffer[3] = EOS; - MenuPrint(gStringVar1, 11, 4); + Menu_PrintText(gStringVar1, 11, 4); - sub_80A1EF8(gOtherText_FiveQuestionsAndSlash, 13, 193, 32, 1); + sub_80A1EF8(gOtherText_FiveQuestions, 13, 193, 32, 1); sub_80A198C(9, 120, 48, 0); friendship = GetMonData(mon, MON_DATA_FRIENDSHIP); if (friendship < 6) { - MenuPrint(gOtherText_EggAbout, 11, 9); + Menu_PrintText(gOtherText_EggAbout, 11, 9); } else if (friendship < 11) { - MenuPrint(gOtherText_EggSoon, 11, 9); + Menu_PrintText(gOtherText_EggSoon, 11, 9); } else if (friendship < 41) { - MenuPrint(gOtherText_EggSomeTime, 11, 9); + Menu_PrintText(gOtherText_EggSomeTime, 11, 9); } else { - MenuPrint(gOtherText_EggLongTime, 11, 9); + Menu_PrintText(gOtherText_EggLongTime, 11, 9); } PokemonSummaryScreen_PrintEggTrainerMemo(mon, 11, 14); @@ -2629,7 +3143,7 @@ static void sub_809FC34(struct Pokemon *mon) buffer[1] = 0x13; buffer[2] = 0x4E; buffer[3] = EOS; - MenuPrint(gStringVar1, 11, 4); + Menu_PrintText(gStringVar1, 11, 4); sub_80A1F98(GetMonData(mon, MON_DATA_OT_ID) & 0xFFFF, 13, 5, 2, 193, 32, 1); @@ -2642,7 +3156,7 @@ static void sub_809FC34(struct Pokemon *mon) ability = GetAbilityBySpecies(GetMonData(mon, MON_DATA_SPECIES), GetMonData(mon, MON_DATA_ALT_ABILITY)); sub_80A1FF8(gAbilityNames[ability], 13, 11, 9); - MenuPrint(gAbilityDescriptions[ability], 11, 11); + Menu_PrintText(gAbilityDescriptions[ability], 11, 11); PokemonSummaryScreen_PrintTrainerMemo(mon, 11, 14); } @@ -2656,17 +3170,17 @@ static void sub_809FE6C(struct Pokemon *mon) static void sub_809FE80(void) { - MenuZeroFillWindowRect(14, 4, 18, 5); - MenuZeroFillWindowRect(25, 4, 30, 5); - MenuZeroFillWindowRect(11, 9, 28, 12); - MenuZeroFillWindowRect(11, 14, 28, 17); + Menu_EraseWindowRect(14, 4, 18, 5); + Menu_EraseWindowRect(25, 4, 30, 5); + Menu_EraseWindowRect(11, 9, 28, 12); + Menu_EraseWindowRect(11, 14, 28, 17); } static void sub_809FEB8(void) { sub_80A1FF8(gOtherText_ExpPoints, 13, 11, 14); sub_80A1FF8(gOtherText_NextLv, 13, 11, 16); - MenuPrint(gOtherText_Terminator18, 21, 16); + Menu_PrintText(gOtherText_Terminator18, 21, 16); sub_80A1F48(gOtherText_HP, 13, 11, 7, 42); sub_80A1F48(gOtherText_Attack, 13, 11, 9, 42); @@ -2716,7 +3230,7 @@ static void sub_809FF64(struct Pokemon *mon) *buffer++ = CHAR_SLASH; buffer = sub_8072C14(buffer, GetMonData(mon, MON_DATA_MAX_HP), 48, 1); - MenuPrint_PixelCoords(gStringVar1, 126, 56, 1); + Menu_PrintTextPixelCoords(gStringVar1, 126, 56, 1); } static void sub_80A0090(struct Pokemon *mon) @@ -2727,12 +3241,12 @@ static void sub_80A0090(struct Pokemon *mon) static void sub_80A00A4(void) { - MenuZeroFillWindowRect(11, 4, 19, 5); - MenuZeroFillWindowRect(16, 7, 21, 8); - MenuZeroFillWindowRect(17, 9, 21, 12); - MenuZeroFillWindowRect(27, 7, 29, 12); - MenuZeroFillWindowRect(22, 14, 28, 15); - MenuZeroFillWindowRect(23, 16, 28, 17); + Menu_EraseWindowRect(11, 4, 19, 5); + Menu_EraseWindowRect(16, 7, 21, 8); + Menu_EraseWindowRect(17, 9, 21, 12); + Menu_EraseWindowRect(27, 7, 29, 12); + Menu_EraseWindowRect(22, 14, 28, 15); + Menu_EraseWindowRect(23, 16, 28, 17); } static void sub_80A00F4(u8 a) @@ -2770,7 +3284,7 @@ static void sub_80A015C(struct Pokemon *mon) { sub_80A1918(i, 1); sub_80A1FF8(gOtherText_OneDash, 13, 15, (2 * i) + 4); - MenuPrint(gOtherText_TwoDashes, 26, (2 * i) + 4); + Menu_PrintText(gOtherText_TwoDashes, 26, (2 * i) + 4); } else { @@ -2793,7 +3307,7 @@ static void sub_80A015C(struct Pokemon *mon) buffer = sub_8072C14(buffer, curPP, 14, 1); *buffer++ = CHAR_SLASH; sub_8072C14(buffer, maxPP, 32, 1); - MenuPrint(gStringVar1, 25, (2 * i) + 4); + Menu_PrintText(gStringVar1, 25, (2 * i) + 4); } } } @@ -2829,7 +3343,7 @@ static void sub_80A029C(struct Pokemon *mon) buffer = sub_8072C14(buffer, pp, 14, 1); *buffer++ = CHAR_SLASH; buffer = sub_8072C14(buffer, pp, 32, 1); - MenuPrint(gStringVar1, 25, 12); + Menu_PrintText(gStringVar1, 25, 12); } static void sub_80A0390(void) @@ -2838,7 +3352,7 @@ static void sub_80A0390(void) for (i = 0; i < MAX_MON_MOVES; i++) { - MenuZeroFillWindowRect(15, (i * 2) + 4, 28, (i * 2) + 5); + Menu_EraseWindowRect(15, (i * 2) + 4, 28, (i * 2) + 5); } } @@ -2883,7 +3397,7 @@ void sub_80A03F0(struct Pokemon *mon, u8 *selectedMoveIndex) static void sub_80A0428(struct Pokemon *mon, u8 *selectedMoveIndex) { u16 move = sub_80A03BC(mon, *selectedMoveIndex); - MenuZeroFillWindowRect(11, 15, 28, 18); + Menu_EraseWindowRect(11, 15, 28, 18); if (pssData.page == PSS_PAGE_BATTLE_MOVES) { @@ -2901,14 +3415,14 @@ static void sub_80A046C(u16 move) { if (move == 0xFFFF) return; - MenuPrint(gMoveDescriptions[move - 1], 11, 15); + Menu_PrintText(gMoveDescriptions[move - 1], 11, 15); } static void sub_80A0498(u16 move) { if (move == 0xFFFF) return; - MenuPrint(gContestEffectStrings[gContestMoves[move].effect], 11, 15); + Menu_PrintText(gContestEffectStrings[gContestMoves[move].effect], 11, 15); } static void sub_80A04CC(u16 move) @@ -2921,26 +3435,26 @@ static void sub_80A04CC(u16 move) { buffer = gStringVar1; buffer = sub_8072C74(buffer, gOtherText_ThreeDashes2, 21, 1); - MenuPrint(gStringVar1, 7, 15); + Menu_PrintText(gStringVar1, 7, 15); } else { buffer = gStringVar1; buffer = sub_8072C14(buffer, gBattleMoves[move].power, 21, 1); - MenuPrint(gStringVar1, 7, 15); + Menu_PrintText(gStringVar1, 7, 15); } if (gBattleMoves[move].accuracy == 0) { buffer = gStringVar1; buffer = sub_8072C74(buffer, gOtherText_ThreeDashes2, 21, 1); - MenuPrint(gStringVar1, 7, 17); + Menu_PrintText(gStringVar1, 7, 17); } else { buffer = gStringVar1; buffer = sub_8072C14(buffer, gBattleMoves[move].accuracy, 21, 1); - MenuPrint(gStringVar1, 7, 17); + Menu_PrintText(gStringVar1, 7, 17); } } @@ -3127,7 +3641,7 @@ bool8 PokemonSummaryScreen_CheckOT(struct Pokemon *mon) u8 enemyId = GetMultiplayerId() ^ 1; trainerId = gLinkPlayers[enemyId].trainerId & 0xFFFF; StringCopy(gStringVar1, gLinkPlayers[enemyId].name); - StripExtCtrlCodes(gStringVar1); + Text_StripExtCtrlCodes(gStringVar1); } else { @@ -3153,7 +3667,7 @@ static void PokemonSummaryScreen_PrintEggTrainerMemo(struct Pokemon *mon, u8 lef if (!(gameMet == VERSION_RUBY || gameMet == VERSION_SAPPHIRE || gameMet == VERSION_EMERALD)) { - MenuPrint(gOtherText_EggObtainedInTrade, left, top); + Menu_PrintText(gOtherText_EggObtainedInTrade, left, top); return; } @@ -3162,13 +3676,13 @@ static void PokemonSummaryScreen_PrintEggTrainerMemo(struct Pokemon *mon, u8 lef if (locationMet == 255) { // Eggs received from Pokemon Box. - MenuPrint(gOtherText_EggNicePlace, left, top); + Menu_PrintText(gOtherText_EggNicePlace, left, top); return; } if (!PokemonSummaryScreen_CheckOT(mon)) { - MenuPrint(gOtherText_EggObtainedInTrade, left, top); + Menu_PrintText(gOtherText_EggObtainedInTrade, left, top); return; } @@ -3176,11 +3690,11 @@ static void PokemonSummaryScreen_PrintEggTrainerMemo(struct Pokemon *mon, u8 lef if (locationMet == 253) { - MenuPrint(gOtherText_EggHotSprings, left, top); + Menu_PrintText(gOtherText_EggHotSprings, left, top); return; } - MenuPrint(gOtherText_EggDayCare, left, top); + Menu_PrintText(gOtherText_EggDayCare, left, top); } static void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *mon, u8 left, u8 top) @@ -3285,7 +3799,7 @@ static void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *mon, u8 left, } } - MenuPrint(gStringVar4, left++, top++); + Menu_PrintText(gStringVar4, left++, top++); } static void sub_80A0958(struct Pokemon *mon) @@ -3310,8 +3824,8 @@ static void sub_80A0958(struct Pokemon *mon) buffer[2] = 0x50; buffer[3] = EOS; - MenuPrint(gStringVar1, 0, 14); - MenuZeroFillWindowRect(3, 16, 9, 17); + Menu_PrintText(gStringVar1, 0, 14); + Menu_EraseWindowRect(3, 16, 9, 17); level = GetMonData(mon, MON_DATA_LEVEL); @@ -3325,7 +3839,7 @@ static void sub_80A0958(struct Pokemon *mon) buffer[2] = 0x20; buffer[3] = EOS; - MenuPrint(gStringVar1, 3, 16); + Menu_PrintText(gStringVar1, 3, 16); sub_80A0A2C(mon, 7, 16); } @@ -3343,7 +3857,7 @@ static void sub_80A0A2C(struct Pokemon *mon, u8 left, u8 top) { default: bottom = top + 1; - MenuZeroFillWindowRect(left, top, left, bottom); + Menu_EraseWindowRect(left, top, left, bottom); return; case MON_MALE: genderSymbol = gOtherText_MaleSymbol2; @@ -3406,7 +3920,7 @@ static void PrintNumRibbons(struct Pokemon *mon) ConvertIntToDecimalStringN(&text[3], numRibbons, 1, 2); } - MenuPrint(sUnknown_083C15AE, 21, 4); + Menu_PrintText(sUnknown_083C15AE, 21, 4); } static void PrintHeldItemName(u16 itemId, u8 left, u8 top) @@ -3427,7 +3941,7 @@ static void PrintHeldItemName(u16 itemId, u8 left, u8 top) CopyItemName(itemId, gStringVar1); } - MenuPrint(sUnknown_083C15B4, left, top); + Menu_PrintText(sUnknown_083C15B4, left, top); } static void DrawExperienceProgressBar(struct Pokemon *mon, u8 left, u8 top) @@ -3518,7 +4032,7 @@ static void PrintSummaryWindowHeaderText(void) buffer[2] = 0x58; buffer[3] = EOS; - MenuPrint(gStringVar1, 0, 0); + Menu_PrintText(gStringVar1, 0, 0); if (pssData.headerActionTextId != 0) { @@ -3527,7 +4041,7 @@ static void PrintSummaryWindowHeaderText(void) } else { - MenuZeroFillWindowRect(23, 0, 24, 1); + Menu_EraseWindowRect(23, 0, 24, 1); } buffer = gStringVar1; @@ -3539,7 +4053,7 @@ static void PrintSummaryWindowHeaderText(void) buffer[2] = 0x28; buffer[3] = EOS; - MenuPrint(gStringVar1, 25, 0); + Menu_PrintText(gStringVar1, 25, 0); } // If the given pokemon previously had the pokerus virus, a small @@ -3622,16 +4136,14 @@ static void DrawSummaryScreenNavigationDots(void) } } - dest = (void *)(VRAM + 0xE016); - DmaCopy16(3, arr, dest, 16); + DmaCopy16Defvars(3, arr, (void *)(VRAM + 0xE016), 16); for (i = 0; i < 8; i++) { arr[i] += 0x10; } - dest = (void *)(VRAM + 0xE056); - DmaCopy16(3, arr, dest, 16); + DmaCopy16Defvars(3, arr, (void *)(VRAM + 0xE056), 16); } #else __attribute__((naked)) @@ -4138,7 +4650,7 @@ static void sub_80A12D0(s8 a) { u8 newTaskId; - MenuZeroFillWindowRect(1, 18, 5, 19); + Menu_EraseWindowRect(1, 18, 5, 19); sub_80A18E4(29); newTaskId = CreateTask(sub_80A1048, 0); @@ -4194,14 +4706,14 @@ static void sub_80A12D0(s8 a) // } // else // { -// MenuZeroFillWindowRect(0, 19, 9, 19); +// Menu_EraseWindowRect(0, 19, 9, 19); // } // if (gTasks[taskId].data[0] == 0 || gTasks[taskId].data[1] < 0) // { // if (pssData.page == PSS_PAGE_BATTLE_MOVES) // { -// MenuZeroFillWindowRect(0, 14, 9, 18); +// Menu_EraseWindowRect(0, 14, 9, 18); // sub_80A0958(pssData.loadedMon); // if (GetMonStatusAndPokerus(pssData.loadedMon)) @@ -4327,7 +4839,7 @@ _080A13F4:\n\ movs r1, 0x13\n\ movs r2, 0x9\n\ movs r3, 0x13\n\ - bl MenuZeroFillWindowRect\n\ + bl Menu_EraseWindowRect\n\ _080A1400:\n\ movs r1, 0\n\ ldrsh r0, [r7, r1]\n\ @@ -4346,7 +4858,7 @@ _080A1410:\n\ movs r1, 0xE\n\ movs r2, 0x9\n\ movs r3, 0x12\n\ - bl MenuZeroFillWindowRect\n\ + bl Menu_EraseWindowRect\n\ adds r4, 0x10\n\ adds r0, r4, 0\n\ bl sub_80A0958\n\ @@ -4404,7 +4916,7 @@ static void sub_80A1488(s8 a, u8 b) if (pssData.page == PSS_PAGE_BATTLE_MOVES) { - MenuZeroFillWindowRect(0, 14, 9, 19); + Menu_EraseWindowRect(0, 14, 9, 19); } taskId = FindTaskIdByFunc(sub_80A1334); @@ -4531,7 +5043,7 @@ _080A15C0:\n\ movs r1, 0x13\n\ movs r2, 0x9\n\ movs r3, 0x13\n\ - bl MenuZeroFillWindowRect\n\ + bl Menu_EraseWindowRect\n\ _080A15CC:\n\ movs r1, 0\n\ ldrsh r0, [r7, r1]\n\ @@ -4550,7 +5062,7 @@ _080A15DC:\n\ movs r1, 0xE\n\ movs r2, 0x9\n\ movs r3, 0x12\n\ - bl MenuZeroFillWindowRect\n\ + bl Menu_EraseWindowRect\n\ adds r4, 0x10\n\ adds r0, r4, 0\n\ bl sub_80A0958\n\ @@ -4606,7 +5118,7 @@ static void sub_80A1654(s8 a, u8 b) if (pssData.page == PSS_PAGE_CONTEST_MOVES) { - MenuZeroFillWindowRect(0, 14, 9, 19); + Menu_EraseWindowRect(0, 14, 9, 19); } taskId = FindTaskIdByFunc(sub_80A1500); @@ -4886,7 +5398,7 @@ static void sub_80A1888(struct Sprite *sprite) } } -static void sub_80A18C4(void) +/*static*/ void sub_80A18C4(void) { u8 i; @@ -4910,7 +5422,7 @@ static void sub_80A1918(u8 a, u8 invisible) gSprites[ewram1A000[a]].invisible = invisible; } -static void sub_80A1950(void) +/*static*/ void sub_80A1950(void) { u8 i; @@ -5272,7 +5784,7 @@ u8 *sub_80A1E9C(u8 *dest, const u8 *src, u8 id) { u8 arr[3]; - sub_8072CD4(&arr[0], &arr[1], &arr[2]); + Menu_GetTextColors(&arr[0], &arr[1], &arr[2]); dest = sub_80A1E58(dest, id); dest = StringCopy(dest, src); @@ -5295,7 +5807,7 @@ u8 *sub_80A1E9C(u8 *dest, const u8 *src, u8 id) static void sub_80A1EF8(const u8 *text, u8 id, u8 left, u16 top, s32 e) { sub_80A1E9C(gStringVar4, text, id); - MenuPrint_PixelCoords(gStringVar4, left, top, (bool8)e); + Menu_PrintTextPixelCoords(gStringVar4, left, top, (bool8)e); } static void sub_80A1F48(const u8 *text, u8 id, u8 c, u8 d, u16 e) @@ -5313,7 +5825,7 @@ static void sub_80A1F98(s32 value, u8 id, u8 n, u8 mode, u8 left, u16 top, s32 e static void sub_80A1FF8(const u8 *text, u8 id, u8 left, u8 top) { sub_80A1E9C(gStringVar4, text, id); - MenuPrint(gStringVar4, left, top); + Menu_PrintText(gStringVar4, left, top); } u8 *PokemonSummaryScreen_CopyPokemonLevel(u8 *dest, u8 level) diff --git a/src/pokenav_after.c b/src/pokenav_after.c index 84ed7b14b..330305ea3 100644 --- a/src/pokenav_after.c +++ b/src/pokenav_after.c @@ -6,16 +6,10 @@ #include "de_rom_8040FE0.h" #include "string_util.h" -void sub_80F700C(u8 *arg0, u16 arg1) { - struct Trainer *trainer; - u8 *ptr; - -#if ENGLISH - trainer = (struct Trainer *) &gTrainers[gUnknown_083DFEC4->unkCEE8[arg1].unk0]; -#elif GERMAN - const u16 trainerIndex = gUnknown_083DFEC4->unkCEE8[arg1].unk0; - trainer = (struct Trainer *) &gTrainers[trainerIndex]; -#endif +void sub_80F700C(u8 *arg0, u16 arg1) +{ + const struct Trainer *trainer = &gTrainers[gUnknown_083DFEC4->unkCEE8[arg1].unk0]; + u8 *ptr = arg0; ptr = arg0; if (arg1 < gUnknown_083DFEC4->unkD158) @@ -23,7 +17,7 @@ void sub_80F700C(u8 *arg0, u16 arg1) { #if ENGLISH ptr = StringCopy(ptr, gTrainerClassNames[trainer->trainerClass]); #elif GERMAN - ptr = StringCopy(ptr, de_sub_8041024(0, trainerIndex)); + ptr = StringCopy(ptr, de_sub_8041024(0, gUnknown_083DFEC4->unkCEE8[arg1].unk0)); #endif ptr[0] = 0xFC; diff --git a/src/pokenav_before.c b/src/pokenav_before.c index 7693cba7d..4f7eb66b4 100644 --- a/src/pokenav_before.c +++ b/src/pokenav_before.c @@ -18,73 +18,72 @@ #include "sound.h" #include "task.h" #include "text.h" -#include "unknown_task.h" - -extern u8 ewram[]; - -struct UnknownPokenav0 { - /* 0x0000 */ u8 var0[0x0300]; - /* 0x0300 */ void (*var300)(void); - /* 0x0304 */ u16 var304; - /* 0x0306 */ u16 var306; - /* 0x0308 */ u32 var308; - /* 0x030C */ u8 fill030C[0x6a9f]; - /* 0x6dab */ u8 var6dab; - /* 0x6dac */ u8 var6dac; - /* 0x6dad */ u8 var6dad; - /* 0x6dae */ u8 var6dae; - /* 0x6daf */ u8 fill6daf[0x3]; - /* 0x6db2 */ u8 var6db2[5]; - /* 0x6db7 */ u8 fill6db7[0x25]; - /* 0x6ddc */ s8 var6ddc; - /* 0x6ddd */ u8 fill6ddd[0x13]; - /* 0x6df0 */ s8 var6df0; - /* 0x6df1 */ u8 fill6df1[0xB]; - /* 0x6dfc */ u8 var6dfc; - /* 0x6dfd */ u8 fill6dfd[0x17]; - /* 0x6e14 */ u8 var6e14; - /* 0x6e15 */ u8 var6e15; - /* 0x6e16 */ u8 var6e16; - /* 0x6e17 */ u8 var6e17; - /* 0x6e18 */ u8 fill6e18[0x78]; - /* 0x6e90 */ u8 var6e90; - /* 0x6e91 */ u8 fill6e91[0x4]; - /* 0x6e95 */ u8 var6e95; - /* 0x6e96 */ u8 var6e96[0x814]; - /* 0x76AA */ u8 var76aa; - /* 0x76AB */ u8 fill76AB[0x10BD]; - /* 0x8768 */ u32 var8768; - /* 0x876C */ u8 fill876C[0x2]; - /* 0x876E */ u8 var876E; - /* 0x876F */ u8 fill876F[0x5]; - /* 0x8774 */ s16 var8774; - /* 0x8776 */ u8 fill8776[0x55]; - /* 0x87CB */ u8 var87CB; - /* 0x87CC */ u8 fill87CC[0xC]; - /* 0x87D8 */ u8 var87D8; - /* 0x87D9 */ u8 fill87D9[0x1]; - /* 0x87DA */ s16 var87DA; - /* 0x87DC */ s16 var87DC; - /* 0x87DE */ u8 fill87DE[0x4a]; - /* 0x8828 */ u8 playerPartyCount; - /* 0x8829 */ u8 fill8829[0x07bf]; - /* 0x8FE8 */ s8 var8fe8; - /* 0x8FE9 */ u8 fill8FE9[0x16]; - /* 0x8FFF */ u8 var8fff[5]; - /* 0x9004 */ u8 fill9004[0x340]; - /* 0x9344 */ u8 var9344; - /* 0x9345 */ u8 fill9345[0x3b8b]; - /* 0xced0 */ u32 varCED0; - /* 0xced4 */ u8 fillCED4[0x284]; - /* 0xD158 */ u16 varD158; - /* 0xD15A */ u8 fillD15A[0x8]; - /* 0xD162 */ u8 varD162; +#include "scanline_effect.h" + +struct UnknownPokenav0 +{ + /* 0x0000 */ u8 var0[0x0300]; + /* 0x0300 */ void (*var300)(void); + /* 0x0304 */ u16 var304; + /* 0x0306 */ u16 var306; + /* 0x0308 */ u32 var308; + /* 0x030C */ u8 fill030C[0x6a9f]; + /* 0x6dab */ u8 var6dab; + /* 0x6dac */ u8 var6dac; + /* 0x6dad */ u8 var6dad; + /* 0x6dae */ u8 var6dae; + /* 0x6daf */ u8 fill6daf[0x3]; + /* 0x6db2 */ u8 var6db2[5]; + /* 0x6db7 */ u8 fill6db7[0x25]; + /* 0x6ddc */ s8 var6ddc; + /* 0x6ddd */ u8 fill6ddd[0x13]; + /* 0x6df0 */ s8 var6df0; + /* 0x6df1 */ u8 fill6df1[0xB]; + /* 0x6dfc */ u8 var6dfc; + /* 0x6dfd */ u8 fill6dfd[0x17]; + /* 0x6e14 */ u8 var6e14; + /* 0x6e15 */ u8 var6e15; + /* 0x6e16 */ u8 var6e16; + /* 0x6e17 */ u8 var6e17; + /* 0x6e18 */ u8 fill6e18[0x78]; + /* 0x6e90 */ u8 var6e90; + /* 0x6e91 */ u8 fill6e91[0x4]; + /* 0x6e95 */ u8 var6e95; + /* 0x6e96 */ u8 var6e96[0x814]; + /* 0x76AA */ u8 var76aa; + /* 0x76AB */ u8 fill76AB[0x10BD]; + /* 0x8768 */ u32 var8768; + /* 0x876C */ u8 fill876C[0x2]; + /* 0x876E */ u8 var876E; + /* 0x876F */ u8 fill876F[0x5]; + /* 0x8774 */ s16 var8774; + /* 0x8776 */ u8 fill8776[0x55]; + /* 0x87CB */ u8 var87CB; + /* 0x87CC */ u8 fill87CC[0xC]; + /* 0x87D8 */ u8 var87D8; + /* 0x87D9 */ u8 fill87D9[0x1]; + /* 0x87DA */ s16 var87DA; + /* 0x87DC */ s16 var87DC; + /* 0x87DE */ u8 fill87DE[0x4a]; + /* 0x8828 */ u8 playerPartyCount; + /* 0x8829 */ u8 fill8829[0x07bf]; + /* 0x8FE8 */ s8 var8fe8; + /* 0x8FE9 */ u8 fill8FE9[0x16]; + /* 0x8FFF */ u8 var8fff[5]; + /* 0x9004 */ u8 fill9004[0x340]; + /* 0x9344 */ u8 var9344; + /* 0x9345 */ u8 fill9345[0x3b8b]; + /* 0xced0 */ u32 varCED0; + /* 0xced4 */ u8 fillCED4[0x284]; + /* 0xD158 */ u16 varD158; + /* 0xD15A */ u8 fillD15A[0x8]; + /* 0xD162 */ u8 varD162; }; struct UnknownPokenav0_1 { - u8 fill6dad[0x6dad]; - s8 var6dad; - s8 var6dae; + u8 fill6dad[0x6dad]; + s8 var6dad; + s8 var6dae; }; IWRAM_DATA void (*gUnknown_03000744)(void); @@ -101,7 +100,6 @@ extern const u16 gPokenavConditionSearch2_Pal[]; extern const u8 gUnknown_083E0334[]; extern const u16 gUnknown_083E02B4[]; extern const u8 gPokenavConditionSearch2_Gfx[]; -extern const u8 gUnknownPalette_81E6692[]; extern const u8 gUnknown_083E0254[]; extern const u8 gUnknown_08E9FEB4[]; extern const u8 gUnknown_083E01AC[]; @@ -131,6 +129,10 @@ extern const u8 gUnknown_08E99FB0[]; extern const u8 gUnknown_08E9A100[]; extern const u16 gPokenavHoennMap1_Pal[]; +// TODO: decompile the debug code so the compiler doesn't complain about +// unused static functions +#define static + static void sub_80EBCA8(); static void sub_80EEE20(); static bool8 sub_80EEE54(); @@ -296,1141 +298,1330 @@ extern void sub_80F19FC(); extern u16 gKeyRepeatStartDelay; +void sub_80EBA5C() +{ + switch (gMain.state) + { + default: + gMain.state = 0; + case 0: + ewram0_10.var6dac = is_c1_link_related_active(); + if (!ewram0_10.var6dac) + { + ewram0_10.var6dab = 0; + gMain.state++; + SetMainCallback2(&sub_80EBBE8); + } + break; + case 1: + SetVBlankCallback(NULL); + break; + case 2: + ResetPaletteFade(); + break; + case 3: + ResetSpriteData(); + break; + case 4: + FreeAllSpritePalettes(); + break; + case 5: + ResetTasks(); + break; + case 6: + ScanlineEffect_Stop(); + break; + case 7: + sub_80F1A90(); + gMain.state++; + case 8: + if (sub_80F1AC4()) + return; + break; + case 9: + sub_80F2688(); + gMain.state++; + // fall through + case 10: + if (sub_80F26BC()) + return; + break; + case 11: + sub_80F36F0(); + gMain.state++; + case 12: + if (sub_80F3724()) + return; + break; + case 13: + sub_80EBC10(); + sub_80EBDBC(&sub_80EBDD8); + break; + case 14: + ewram0_10.var6dab = 1; + PlaySE(SE_PN_ON); + SetMainCallback2(&sub_80EBD90); + SetVBlankCallback(&sub_80EBD18); + sub_80F1A74(); + break; + } -void sub_80EBA5C() { - switch (gMain.state) { - default: - gMain.state = 0; - case 0: - ewram0_10.var6dac = is_c1_link_related_active(); - if (!ewram0_10.var6dac) { - ewram0_10.var6dab = 0; - gMain.state++; - SetMainCallback2(&sub_80EBBE8); - break; - } - break; - case 1: - SetVBlankCallback(NULL); - break; - case 2: - ResetPaletteFade(); - break; - case 3: - ResetSpriteData(); - break; - case 4: - FreeAllSpritePalettes(); - break; - case 5: - ResetTasks(); - break; - case 6: - remove_some_task(); - break; - case 7: - sub_80F1A90(); - gMain.state++; - case 8: - if (sub_80F1AC4()) return; - break; - case 9: - sub_80F2688(); - gMain.state++; - - case 10: - if (sub_80F26BC()) return; - break; - case 11: - sub_80F36F0(); - gMain.state++; - case 12: - if (sub_80F3724()) return; - break; - case 13: - sub_80EBC10(); - sub_80EBDBC(&sub_80EBDD8); - break; - case 14: - ewram0_10.var6dab = 1; - PlaySE(SE_PN_ON); - SetMainCallback2(&sub_80EBD90); - SetVBlankCallback(&sub_80EBD18); - sub_80F1A74(); - break; - } - - gMain.state++; + gMain.state++; } -void sub_80EBBE8() { - u8 var1; - if (!ewram0_10.var6dab) { - var1 = ewram0_10.var6dab; - do { - sub_80EBA5C(); - var1 = ewram0_10.var6dab; - } while (!var1); - } +void sub_80EBBE8() +{ + while (!ewram0_10.var6dab) + sub_80EBA5C(); } -void sub_80EBC10() { - u16 i; - u16 *var1; - - gKeyRepeatStartDelay = 0x14; - ewram0_10.playerPartyCount = CalculatePlayerPartyCount(); - ewram0_10.var6ddc = 0; - ewram0_10.var9344 = 0; - ewram0_10.var8768 = 0; - ewram0_10.varCED0 = 0; - - for (i = 0; i < 5; ++i) { - ewram0_10.var8fff[i] = 0; - var1 = (u16 *)ewram0_10.var0; - var1[i*2 + 0x4820] = 0x9B; - var1[i*2 + 0x4821] = 0x5B; - } - - ewram0_10.var6e95 = 0; - sub_80EBCA8(); +void sub_80EBC10() +{ + u16 i; + u16 *var1; + + gKeyRepeatStartDelay = 0x14; + ewram0_10.playerPartyCount = CalculatePlayerPartyCount(); + ewram0_10.var6ddc = 0; + ewram0_10.var9344 = 0; + ewram0_10.var8768 = 0; + ewram0_10.varCED0 = 0; + + for (i = 0; i < 5; ++i) + { + ewram0_10.var8fff[i] = 0; + var1 = (u16 *)ewram0_10.var0; + var1[i*2 + 0x4820] = 0x9B; + var1[i*2 + 0x4821] = 0x5B; + } + + ewram0_10.var6e95 = 0; + sub_80EBCA8(); } -void sub_80EBCA8() { - ewram0_10.var6db2[0] = 1; - ewram0_10.var6db2[1] = 2; - ewram0_10.var6db2[2] = 3; +void sub_80EBCA8() +{ + ewram0_10.var6db2[0] = 1; + ewram0_10.var6db2[1] = 2; + ewram0_10.var6db2[2] = 3; - if (FlagGet(FLAG_SYS_RIBBON_GET)) { - ewram0_10.var6db2[3] = 4; - } - else { - ewram0_10.var6db2[3] = 0; - } + if (FlagGet(FLAG_SYS_RIBBON_GET)) + ewram0_10.var6db2[3] = 4; + else + ewram0_10.var6db2[3] = 0; - ewram0_10.var6db2[4] = 5; + ewram0_10.var6db2[4] = 5; } -void sub_80EBD18() { - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - sub_80F1FF0(); +void sub_80EBD18() +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + sub_80F1FF0(); } -void sub_80EBD30() { - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - UpdateRegionMapVideoRegs(); - sub_80EFE7C(); +void sub_80EBD30() +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + UpdateRegionMapVideoRegs(); + sub_80EFE7C(); } -void sub_80EBD4C() { - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - sub_80F5BF0(); - sub_8089668(); +void sub_80EBD4C() +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + sub_80F5BF0(); + ScanlineEffect_InitHBlankDmaTransfer(); } -void sub_80EBD68() { - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - sub_80F6F64(); +void sub_80EBD68() +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + sub_80F6F64(); } -void sub_80EBD80() { - LoadOam(); - ProcessSpriteCopyRequests(); +void sub_80EBD80() +{ + LoadOam(); + ProcessSpriteCopyRequests(); } -void sub_80EBD90() { - ewram0_10.var300(); - AnimateSprites(); - BuildOamBuffer(); - RunTasks(); - UpdatePaletteFade(); - sub_80F19FC(); +void sub_80EBD90() +{ + ewram0_10.var300(); + AnimateSprites(); + BuildOamBuffer(); + RunTasks(); + UpdatePaletteFade(); + sub_80F19FC(); } -void sub_80EBDBC(void (*func)(void)) { - ewram0_10.var300 = func; - ewram0_10.var304 = 0; +void sub_80EBDBC(void (*func)(void)) +{ + ewram0_10.var300 = func; + ewram0_10.var304 = 0; } -void sub_80EBDD8() { - switch (ewram0_10.var304) { - case 0: - SetVBlankCallback(NULL); - REG_DISPCNT = 0; - ewram0_10.var6dad = ewram0_10.var6ddc; - ewram0_10.var6dae = 5; - ewram0_10.var304++; - break; - case 1: - sub_80F3FF0(); - ewram0_10.var304++; - case 2: - if (sub_80F4024()) return; - ewram0_10.var304++; - break; - case 3: - sub_80F2598(); - ewram0_10.var304++; - break; - case 4: - sub_80EEE20(); - ewram0_10.var304++; - case 5: - if (sub_80EEE54()) return; - sub_80EEE08(); - ewram0_10.var304++; - return; - case 6: - sub_80EF248(0); - ewram0_10.var304++; - case 7: - if (sub_80EF284(0)) return; - ewram0_10.var304++; - break; - case 8: - sub_80F1B8C(0); - ewram0_10.var304++; - case 9: - if (sub_80F1BC8(0)) return; - ewram0_10.var304++; - break; - case 10: - SetVBlankCallback(&sub_80EBD18); - ewram0_10.var304++; - break; - case 11: - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - ewram0_10.var304++; - return; - case 12: - sub_80EED2C(0); - ewram0_10.var304++; - return; - case 13: - if (gPaletteFade.active) return; - ewram0_10.var304++; - return; - case 14: - sub_80F2C80(0); - ewram0_10.var304++; - case 15: - if (sub_80F2CBC(0)) return; - ewram0_10.var304++; - break; - case 16: - sub_80F1DF0(); - ewram0_10.var304++; - return; - case 17: - if (!sub_80F1E50()) { - sub_80EF428(0, 0); - sub_80EBDBC(&sub_80EC268); +void sub_80EBDD8() +{ + switch (ewram0_10.var304) + { + case 0: + SetVBlankCallback(NULL); + REG_DISPCNT = 0; + ewram0_10.var6dad = ewram0_10.var6ddc; + ewram0_10.var6dae = 5; + ewram0_10.var304++; + break; + case 1: + sub_80F3FF0(); + ewram0_10.var304++; + // fall through + case 2: + if (!sub_80F4024()) + ewram0_10.var304++; + break; + case 3: + sub_80F2598(); + ewram0_10.var304++; + break; + case 4: + sub_80EEE20(); + ewram0_10.var304++; + // fall through + case 5: + if (!sub_80EEE54()) + { + sub_80EEE08(); + ewram0_10.var304++; } - return; - - } - + break; + case 6: + sub_80EF248(0); + ewram0_10.var304++; + // fall through + case 7: + if (!sub_80EF284(0)) + ewram0_10.var304++; + break; + case 8: + sub_80F1B8C(0); + ewram0_10.var304++; + // fall through + case 9: + if (!sub_80F1BC8(0)) + ewram0_10.var304++; + break; + case 10: + SetVBlankCallback(&sub_80EBD18); + ewram0_10.var304++; + break; + case 11: + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + ewram0_10.var304++; + break; + case 12: + sub_80EED2C(0); + ewram0_10.var304++; + break; + case 13: + if (!gPaletteFade.active) + ewram0_10.var304++; + break; + case 14: + sub_80F2C80(0); + ewram0_10.var304++; + // fall through + case 15: + if (!sub_80F2CBC(0)) + ewram0_10.var304++; + break; + case 16: + sub_80F1DF0(); + ewram0_10.var304++; + break; + case 17: + if (!sub_80F1E50()) + { + sub_80EF428(0, 0); + sub_80EBDBC(&sub_80EC268); +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF800), 4); +#endif + } + break; + } } -void sub_80EC00C() { - switch (ewram0_10.var304) { - case 0: - if (!sub_80EEF78()) { - SetVBlankCallback(&sub_80EBD80); - sub_80EED1C(); - ewram0_10.var6dad = ewram0_10.var6ddc; - ewram0_10.var6dae = 5; - sub_80EEE08(); +void sub_80EC00C() +{ + switch (ewram0_10.var304) + { + case 0: + if (!sub_80EEF78()) + { + SetVBlankCallback(&sub_80EBD80); + sub_80EED1C(); + ewram0_10.var6dad = ewram0_10.var6ddc; + ewram0_10.var6dae = 5; + sub_80EEE08(); + ewram0_10.var304++; + } + break; + case 1: + sub_80EF248(0); + ewram0_10.var304++; + // fall through + case 2: + if (!sub_80EF284(0)) ewram0_10.var304++; + break; + case 3: + sub_80F1B8C(0); + ewram0_10.var304++; + // fall through + case 4: + if (!sub_80F1BC8(0)) + ewram0_10.var304++; + break; + case 5: + if (!sub_8055870()) + ewram0_10.var304++; + break; + case 6: + BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0); + SetVBlankCallback(&sub_80EBD18); + ewram0_10.var304++; + break; + case 7: + sub_80EED2C(0); + ewram0_10.var304++; + break; + case 8: + if (!gPaletteFade.active) + ewram0_10.var304++; + break; + case 9: + sub_80F2598(); + ewram0_10.var304++; + break; + case 10: + sub_80F2C80(0); + ewram0_10.var304++; + // fall through + case 11: + if (!sub_80F2CBC(0)) + ewram0_10.var304++; + break; + case 12: + sub_80F1DF0(); + ewram0_10.var304++; + break; + case 13: + if (!sub_80F1E50()) + { + sub_80EF428(0, ewram0_10.var6dad); + sub_80EBDBC(&sub_80EC268); +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF800), 4); +#endif } break; - case 1: - sub_80EF248(0); - ewram0_10.var304++; - case 2: - if (sub_80EF284(0)) return; - ewram0_10.var304++; - break; - case 3: - sub_80F1B8C(0); - ewram0_10.var304++; - case 4: - if (sub_80F1BC8(0)) return; - ewram0_10.var304++; - break; - case 5: - if (sub_8055870()) return; - ewram0_10.var304++; - break; - case 6: - BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0); - SetVBlankCallback(&sub_80EBD18); - ewram0_10.var304++; - break; - case 7: - sub_80EED2C(0); - ewram0_10.var304++; - break; - case 8: - if (gPaletteFade.active) return; - ewram0_10.var304++; - return; - case 9: - sub_80F2598(); - ewram0_10.var304++; - break; - case 10: - sub_80F2C80(0); - ewram0_10.var304++; - case 11: - if (sub_80F2CBC(0)) return; - ewram0_10.var304++; - return; - case 12: - sub_80F1DF0(); - ewram0_10.var304++; - return; - case 13: - if (sub_80F1E50()) return; - sub_80EF428(0, ewram0_10.var6dad); - sub_80EBDBC(&sub_80EC268); - } + } } -void sub_80EC210() { - switch (ewram0_10.var304) { - case 0: - sub_80F2D04(1); - sub_80EE9C0(0, ewram0_10.var6ddc, 0); - ewram0_10.var304++; +void sub_80EC210() +{ + switch (ewram0_10.var304) + { + case 0: + sub_80F2D04(1); + sub_80EE9C0(0, ewram0_10.var6ddc, 0); + ewram0_10.var304++; + break; + case 1: + if (!sub_80EEA0C()) + sub_80EBDBC(&sub_80EC268); break; - case 1: - if (sub_80EEA0C()) return; - sub_80EBDBC(&sub_80EC268); - } + } } -void sub_80EC268() { - u8 var1; - switch (ewram0_10.var304) { - case 0: - if (sub_80EEC10() != 0) { - PlaySE(0x5); - sub_80EF428(0, ewram0_10.var6dad); - sub_80EED9C(); - break; - } - else { - if (gMain.newKeys & A_BUTTON) { - ewram0_10.var6ddc = ewram0_10.var6dad; - switch (ewram0_10.var6db2[ewram0_10.var6ddc] - 1) { - case 0: - PlaySE(5); - sub_80EBDBC(&sub_80EC4A0); - break; - case 1: - PlaySE(5); - sub_80EBDBC(&sub_80EC81C); - break; - case 4: - ewram0_10.var304 = 1; - break; - case 3: - ewram0_10.var304 = 2; - break; - case 2: - ewram0_10.var304 = 6; - break; - } +void sub_80EC268() +{ + u8 var1; + + switch (ewram0_10.var304) + { + case 0: + if (sub_80EEC10() != 0) + { + PlaySE(SE_SELECT); + sub_80EF428(0, ewram0_10.var6dad); + sub_80EED9C(); + } + else + { + if (gMain.newKeys & A_BUTTON) + { + ewram0_10.var6ddc = ewram0_10.var6dad; + switch (ewram0_10.var6db2[ewram0_10.var6ddc] - 1) + { + case 0: + PlaySE(SE_SELECT); + sub_80EBDBC(&sub_80EC4A0); + break; + case 1: + PlaySE(SE_SELECT); + sub_80EBDBC(&sub_80EC81C); + break; + case 4: + ewram0_10.var304 = 1; + break; + case 3: + ewram0_10.var304 = 2; + break; + case 2: + ewram0_10.var304 = 6; + break; + } + } + else if (gMain.newKeys & B_BUTTON) + { + ewram0_10.var304 = 1; + } + } + break; + case 1: + sub_80F208C(); + sub_80EBDBC(&sub_80EE96C); + break; + case 2: + sub_80F6208(); + ewram0_10.var304++; + // fall through + case 3: + if (!sub_80F6250()) + ewram0_10.var304++; + break; + case 4: + if (!sub_8055870()) + { + if (ewram0_10.var8fe8 != 0) + { + PlaySE(SE_SELECT); + sub_80EBDBC(&sub_80EDB88); } - else if (gMain.newKeys & B_BUTTON) { - ewram0_10.var304 = 1; + else + { + PlaySE(0x20); + sub_80EF428(0, 5); + ewram0_10.var304 = 0xFF; } - break; } - case 1: - sub_80F208C(); - sub_80EBDBC(&sub_80EE96C); - break; - case 2: - sub_80F6208(); - ewram0_10.var304++; - case 3: - if (sub_80F6250()) return; - ewram0_10.var304++; break; - case 4: - if (sub_8055870()) return; - if (ewram0_10.var8fe8 != 0) { - PlaySE(0x5); - sub_80EBDBC(&sub_80EDB88); - break; - } - else { - PlaySE(0x20); - sub_80EF428(0, 5); - ewram0_10.var304 = 0xFF; - break; - } - case 6: - sub_80F6C20(); - if (ewram0_10.varD158 != 0) { - PlaySE(0x5); - sub_80EBDBC(&sub_80EE3D8); - break; - } - else { - PlaySE(0x20); - sub_80EF428(0, 6); - ewram0_10.var304 = 0xFF; - break; - } - case 0xFF: - if ((var1 = sub_80EEC10()) != 0) { - PlaySE(0x5); - sub_80EF428(0, ewram0_10.var6dad); - ewram0_10.var304 = 0; - sub_80EED9C(); - } - else { - if (!(gMain.newKeys & (A_BUTTON | B_BUTTON))) return; + case 6: + sub_80F6C20(); + if (ewram0_10.varD158 != 0) + { + PlaySE(SE_SELECT); + sub_80EBDBC(&sub_80EE3D8); + } + else + { + PlaySE(0x20); + sub_80EF428(0, 6); + ewram0_10.var304 = 0xFF; + } + break; + case 0xFF: + if ((var1 = sub_80EEC10()) != 0) + { + PlaySE(SE_SELECT); + sub_80EF428(0, ewram0_10.var6dad); + ewram0_10.var304 = 0; + sub_80EED9C(); + } + else if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { sub_80EF428(0, ewram0_10.var6dad); ewram0_10.var304 = var1; - break; } - } + break; + } } -void sub_80EC4A0() { - u32 var1; - u32 var2; - switch (ewram0_10.var304) { - case 0: - sub_80F1E84(); - sub_80F2D04(0); - ewram0_10.var304++; - break; - case 1: - if (!sub_80F1F10()) { - if (gSaveBlock2.regionMapZoom) { - var1 = 0x7; - } - else var1 = 0x8; - sub_80EEFBC(var1); +void sub_80EC4A0() +{ + u32 var1; + + switch (ewram0_10.var304) + { + case 0: + sub_80F1E84(); + sub_80F2D04(0); + ewram0_10.var304++; + break; + case 1: + if (!sub_80F1F10()) + { + if (gSaveBlock2.regionMapZoom) + var1 = 0x7; + else + var1 = 0x8; + sub_80EEFBC(var1); + ewram0_10.var304++; + } + break; + case 2: + if (!sub_80EEF34()) + { + BeginNormalPaletteFade(ewram0_10.var308, -1, 0x0, 0x10, 0); + ewram0_10.var304++; + } + break; + case 3: + if (!gPaletteFade.active) + { + SetVBlankCallback(NULL); + sub_80EED0C(); ewram0_10.var304++; } - break; - case 2: - if (!(var2 = sub_80EEF34())) { - BeginNormalPaletteFade(ewram0_10.var308, -1, 0x0, 0x10, var2); + break; + case 4: + sub_80F2620(); + ewram0_10.var304++; + break; + case 5: + sub_80EF814(); + ewram0_10.var304++; + break; + case 6: + sub_80EF840(); + ewram0_10.var304++; + // fall through + case 7: + if (!sub_80EF874()) ewram0_10.var304++; - } - break; - case 3: - if (gPaletteFade.active) return; - SetVBlankCallback(NULL); - sub_80EED0C(); - ewram0_10.var304++; - break; - case 4: - sub_80F2620(); - ewram0_10.var304++; - break; - case 5: - sub_80EF814(); - ewram0_10.var304++; - break; - case 6: - sub_80EF840(); - ewram0_10.var304++; - case 7: - if (sub_80EF874()) return; - ewram0_10.var304++; - break; - case 8: - sub_80F2C80(0x4); - ewram0_10.var304++; - case 9: - if (sub_80F2CBC(0x4)) return; - ewram0_10.var304++; - break; - case 0xA: - sub_80F2DD8(); - SetVBlankCallback(&sub_80EBD30); - ewram0_10.var304++; - break; - case 0xB: - if (sub_8055870()) return; - ewram0_10.var304++; - break; - case 0xC: - BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0); - ewram0_10.var304++; - break; - case 0xD: - sub_80EED2C(0x1); - ewram0_10.var304++; + break; + case 8: + sub_80F2C80(0x4); + ewram0_10.var304++; + // fall through + case 9: + if (!sub_80F2CBC(0x4)) + ewram0_10.var304++; + break; + case 0xA: + sub_80F2DD8(); + SetVBlankCallback(&sub_80EBD30); + ewram0_10.var304++; + break; + case 0xB: + if (!sub_8055870()) + ewram0_10.var304++; + break; + case 0xC: + BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0); + ewram0_10.var304++; + break; + case 0xD: + sub_80EED2C(0x1); +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0x75E0), 0, (void *)(VRAM + 0xF800), 4); +#endif + ewram0_10.var304++; + break; + case 0xE: + if (!gPaletteFade.active) + sub_80EBDBC(&sub_80EC67C); break; - case 0xE: - if (gPaletteFade.active) return; - sub_80EBDBC(&sub_80EC67C); - } + } } -void sub_80EC67C() { - u32 var1; - u32 var2; - switch (ewram0_10.var304) { - case 0: - switch (sub_80FAB60()) { - case 1: - sub_80EED9C(); - break; - case 3: - sub_80EF9F8(); - break; - case 4: - PlaySE(0x5); - ewram0_10.var304 = 1; - break; - case 5: - PlaySE(0x5); - ewram0_10.var304 = 4; - break; - } - break; - case 1: - if (!ewram0_10.var6e90) { +void sub_80EC67C() +{ + switch (ewram0_10.var304) + { + case 0: + switch (sub_80FAB60()) + { + case 1: + sub_80EED9C(); + break; + case 3: + sub_80EF9F8(); + break; + case 4: + PlaySE(SE_SELECT); + ewram0_10.var304 = 1; + break; + case 5: + PlaySE(SE_SELECT); + ewram0_10.var304 = 4; + break; + } + break; + case 1: + if (!ewram0_10.var6e90) + { + sub_80FAEC4(); + ewram0_10.var304++; + } + else if (!sub_80EFBDC(1)) + { sub_80FAEC4(); ewram0_10.var304++; - break; } - if (sub_80EFBDC(1)) return; - sub_80FAEC4(); - ewram0_10.var304++; - break; - case 2: - if ((var2 = sub_80FAFC0())) return; - if (!ewram0_10.var6e90) { + break; + case 2: + if (!sub_80FAFC0()) + { + if (!ewram0_10.var6e90) + { + sub_80EFBB0(); + ewram0_10.var304 = 0; + } + else + { + ewram0_10.var304++; + } + } + break; + case 3: + if (!sub_80EFBDC(0)) + { sub_80EFBB0(); - ewram0_10.var304 = var2; - break; + ewram0_10.var304 = 0; + } + break; + case 4: + BeginNormalPaletteFade(ewram0_10.var308, -1, 0, 0x10, 0); + ewram0_10.var304++; + break; + case 5: + if (!gPaletteFade.active) + { + sub_80F2DF4(); + sub_80F2D04(0x4); + gSaveBlock2.regionMapZoom = (ewram0_10.var6e90 == 1) ? 1 : 0; + sub_80EBDBC(&sub_80EC00C); } - ewram0_10.var304++; - break; - case 3: - if ((var1 = sub_80EFBDC(0))) return; - sub_80EFBB0(); - ewram0_10.var304 = var1; - break; - case 4: - BeginNormalPaletteFade(ewram0_10.var308, -1, 0, 0x10, 0); - ewram0_10.var304++; break; - case 5: - if (gPaletteFade.active) return; - sub_80F2DF4(); - sub_80F2D04(0x4); - gSaveBlock2.regionMapZoom = (ewram0_10.var6e90 == 1) ? 1 : 0; - sub_80EBDBC(&sub_80EC00C); - } + } +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008264(gLink.recvQueue.count, 1, 1, 2, 4); +#endif } -void sub_80EC81C() { - switch (ewram0_10.var304) { - case 0: - sub_80F2D04(0); - sub_80EE9C0(1, 0, 1); - ewram0_10.var304++; +void sub_80EC81C() +{ + switch (ewram0_10.var304) + { + case 0: + sub_80F2D04(0); + sub_80EE9C0(1, 0, 1); + ewram0_10.var304++; + break; + case 1: + if (!sub_80EEA0C()) + sub_80EBDBC(&sub_80EC86C); break; - case 1: - if (sub_80EEA0C()) return; - sub_80EBDBC(&sub_80EC86C); - } + } } -void sub_80EC86C() { - switch (ewram0_10.var304) { - case 0: - if (sub_80EEC90()) { - PlaySE(0x5); - sub_80EF428(1, ewram0_10.var6dad); - sub_80EED9C(); - break; - } - if (gMain.newKeys & A_BUTTON) { - PlaySE(0x5); - ewram0_10.var6df0 = ewram0_10.var6dad; - switch (ewram0_10.var6df0) { - case 0: - sub_80EBDBC(&sub_80ED620); - break; - case 1: - sub_80EBDBC(&sub_80EC960); - break; - case 2: - sub_80EBDBC(&sub_80EC210); - break; - } - break; - } - else if (gMain.newKeys & B_BUTTON) { - PlaySE(0x5); - ewram0_10.var6df0 = 0x2; - ewram0_10.var6dad = 0x2; - ewram0_10.var304++; - break; - } +void sub_80EC86C() +{ + switch (ewram0_10.var304) + { + case 0: + if (sub_80EEC90()) + { + PlaySE(SE_SELECT); + sub_80EF428(1, ewram0_10.var6dad); + sub_80EED9C(); + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + ewram0_10.var6df0 = ewram0_10.var6dad; + switch (ewram0_10.var6df0) + { + case 0: + sub_80EBDBC(&sub_80ED620); + break; + case 1: + sub_80EBDBC(&sub_80EC960); + break; + case 2: + sub_80EBDBC(&sub_80EC210); + break; + } + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + ewram0_10.var6df0 = 0x2; + ewram0_10.var6dad = 0x2; + ewram0_10.var304++; + } + break; + case 1: + if (!sub_80F1E6C()) + sub_80EBDBC(&sub_80EC210); break; - case 1: - if (sub_80F1E6C()) return; - sub_80EBDBC(&sub_80EC210); - } + } } -void sub_80EC960() { - switch (ewram0_10.var304) { - case 0: - sub_80EE9C0(2, 0, 5); - ewram0_10.var304++; +void sub_80EC960() +{ + switch (ewram0_10.var304) + { + case 0: + sub_80EE9C0(2, 0, 5); + ewram0_10.var304++; + break; + case 1: + if (!sub_80EEA0C()) + sub_80EBDBC(&sub_80ECC08); break; - case 1: - if (sub_80EEA0C()) return; - sub_80EBDBC(&sub_80ECC08); - } + } } -void sub_80EC9A8() { - switch (ewram0_10.var304) { - case 0: - sub_80F2D04(5); - sub_80EE9C0(1, ewram0_10.var6df0, 0xC); - ewram0_10.var304++; +void sub_80EC9A8() +{ + switch (ewram0_10.var304) + { + case 0: + sub_80F2D04(5); + sub_80EE9C0(1, ewram0_10.var6df0, 0xC); + ewram0_10.var304++; + break; + case 1: + if (!sub_80EEA0C()) + { + sub_80EBDBC(&sub_80EC86C); + sub_80EF428(1, ewram0_10.var6dad); + } break; - case 1: - if (sub_80EEA0C()) return; - sub_80EBDBC(&sub_80EC86C); - sub_80EF428(1, ewram0_10.var6dad); - } + } } -void sub_80ECA10() { - switch (ewram0_10.var304) { - case 0: - if (sub_80EEF78()) return; - SetVBlankCallback(&sub_80EBD80); - sub_80EED1C(); - ewram0_10.var6dad = ewram0_10.var6df0; - ewram0_10.var6dae = 0x3; - sub_80EEE08(); - ewram0_10.var304++; - break; - case 1: - sub_80EF248(0x1); - ewram0_10.var304++; - case 2: - if (sub_80EF284(0x1)) return; - ewram0_10.var304++; - break; - case 3: - sub_80F1B8C(0x1); - ewram0_10.var304++; - case 4: - if (sub_80F1BC8(0x1)) return; - ewram0_10.var304++; - break; - case 5: - if (sub_8055870()) return; - ewram0_10.var304++; - break; - case 6: - BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0); - SetVBlankCallback(&sub_80EBD18); - ewram0_10.var304++; - break; - case 7: - sub_80EED2C(0); - ewram0_10.var304++; - break; - case 8: - sub_80F2598(); - ewram0_10.var304++; - break; - case 9: - if (gPaletteFade.active) return; - ewram0_10.var304++; - break; - case 0xA: - sub_80F2C80(0x1); - ewram0_10.var304++; - - case 0xB: - if (sub_80F2CBC(0x1)) return; - ewram0_10.var304++; - break; - case 0xC: - sub_80F1DF0(); - ewram0_10.var304++; +void sub_80ECA10() +{ + switch (ewram0_10.var304) + { + case 0: + if (!sub_80EEF78()) + { + SetVBlankCallback(&sub_80EBD80); + sub_80EED1C(); + ewram0_10.var6dad = ewram0_10.var6df0; + ewram0_10.var6dae = 3; + sub_80EEE08(); + ewram0_10.var304++; + } + break; + case 1: + sub_80EF248(1); + ewram0_10.var304++; + case 2: + if (!sub_80EF284(1)) + ewram0_10.var304++; + break; + case 3: + sub_80F1B8C(1); + ewram0_10.var304++; + case 4: + if (!sub_80F1BC8(1)) + ewram0_10.var304++; + break; + case 5: + if (sub_8055870()) return; + ewram0_10.var304++; + break; + case 6: + BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0); + SetVBlankCallback(&sub_80EBD18); + ewram0_10.var304++; + break; + case 7: + sub_80EED2C(0); + ewram0_10.var304++; + break; + case 8: + sub_80F2598(); + ewram0_10.var304++; + break; + case 9: + if (!gPaletteFade.active) + ewram0_10.var304++; + break; + case 10: + sub_80F2C80(1); + ewram0_10.var304++; + // fall through + case 11: + if (!sub_80F2CBC(1)) + ewram0_10.var304++; + break; + case 12: + sub_80F1DF0(); + ewram0_10.var304++; + break; + case 13: + if (!sub_80F1E50()) + { + sub_80EF428(1, ewram0_10.var6dad); + sub_80EBDBC(&sub_80EC86C); +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF800), 4); +#endif + } break; - case 0xD: - if (sub_80F1E50()) return; - sub_80EF428(1, ewram0_10.var6dad); - sub_80EBDBC(&sub_80EC86C); - } + } } -void sub_80ECC08() { - switch (ewram0_10.var304) { - case 0: - if (sub_80EEC90()) { - PlaySE(0x5); - sub_80EF428(2, ewram0_10.var6dad); - sub_80EED9C(); - break; - } +void sub_80ECC08() +{ + switch (ewram0_10.var304) + { + case 0: + if (sub_80EEC90()) + { + PlaySE(SE_SELECT); + sub_80EF428(2, ewram0_10.var6dad); + sub_80EED9C(); + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + switch ((s8)ewram0_10.var6dad) + { + case 0: + ewram0_10.var87D8 = 22; + break; + case 1: + ewram0_10.var87D8 = 23; + break; + case 2: + ewram0_10.var87D8 = 24; + break; + case 3: + ewram0_10.var87D8 = 33; + break; + case 4: + ewram0_10.var87D8 = 47; + break; + case 5: + sub_80EBDBC(&sub_80EC9A8); + return; + } - if (gMain.newKeys & A_BUTTON) { - PlaySE(0x5); - switch ((s8)ewram0_10.var6dad) { - case 0: - ewram0_10.var87D8 = 22; - break; - case 1: - ewram0_10.var87D8 = 23; - break; - case 2: - ewram0_10.var87D8 = 24; - break; - case 3: - ewram0_10.var87D8 = 33; - break; - case 4: - ewram0_10.var87D8 = 47; - break; - case 5: - sub_80EBDBC(&sub_80EC9A8); - return; - } + ewram0_10.var6dfc = ewram0_10.var6dad; + ewram0_10.var76aa = 1; + sub_80EBDBC(&sub_80ED01C); + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + ewram0_10.var6dad = 0x5; + ewram0_10.var304++; + } + break; + case 1: + if (!sub_80F1E6C()) + sub_80EBDBC(&sub_80EC9A8); + break; + } +} - ewram0_10.var6dfc = ewram0_10.var6dad; - ewram0_10.var76aa = 1; - sub_80EBDBC(&sub_80ED01C); +void sub_80ECD80() +{ + switch (ewram0_10.var304) + { + case 0: + BeginNormalPaletteFade(ewram0_10.var308, -1, 0, 0x10, 0); + ewram0_10.var304++; + break; + case 1: + if (!gPaletteFade.active) + ewram0_10.var304++; + break; + case 2: + if (!sub_80EEF78()) + { + SetVBlankCallback(&sub_80EBD80); + ewram0_10.var304++; + } + break; + case 3: + sub_80EED1C(); + sub_80F3130(); + ewram0_10.var304++; + break; + case 4: + sub_80F2D6C(0x1); + ewram0_10.var304++; + break; + case 5: + sub_80F2D6C(0x5); + ewram0_10.var304++; + break; + case 6: + ewram0_10.var6dad = ewram0_10.var6dfc; + ewram0_10.var6dae = 0x6; + sub_80EEE08(); + ewram0_10.var304++; + break; + case 7: + sub_80EF248(0x2); + ewram0_10.var304++; + // fall through + case 8: + if (!sub_80EF284(0x2)) + ewram0_10.var304++; + break; + case 9: + sub_80F1B8C(0x2); + ewram0_10.var304++; + // fall through + case 10: + if (!sub_80F1BC8(0x2)) + ewram0_10.var304++; + break; + case 11: + if (!sub_8055870()) + ewram0_10.var304++; + break; + case 12: + BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0); + SetVBlankCallback(&sub_80EBD18); + ewram0_10.var304++; + break; + case 13: + sub_80EED2C(0); + ewram0_10.var304++; + break; + case 14: + sub_80F2598(); + ewram0_10.var304++; + break; + case 15: + if (!gPaletteFade.active) + ewram0_10.var304++; + break; + case 16: + sub_80F2C80(0x1); + ewram0_10.var304++; + // fall through + case 17: + if (!sub_80F2CBC(0x1)) + { + ewram0_10.var306 = 0; + ewram0_10.var304++; } - else if (gMain.newKeys & B_BUTTON) { - PlaySE(0x5); - ewram0_10.var6dad = 0x5; + break; + case 18: + sub_80F2C80(0x5); + ewram0_10.var304++; + // fall through + case 19: + if (!sub_80F2CBC(0x5)) + { + sub_80F1DF0(); ewram0_10.var304++; } + break; + case 20: + if (!sub_80F1E50()) + { + sub_80EF428(2, ewram0_10.var6dad); + sub_80EBDBC(&sub_80ECC08); +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF800), 4); +#endif + } break; - case 1: - if (sub_80F1E6C()) return;; - sub_80EBDBC(&sub_80EC9A8); - break; - } -} - -void sub_80ECD80() { - u16 var1; - switch (ewram0_10.var304) { - case 0: - BeginNormalPaletteFade(ewram0_10.var308, -1, 0, 0x10, 0); - ewram0_10.var304++; - break; - case 1: - if (gPaletteFade.active) return; - ewram0_10.var304++; - break; - case 2: - if (sub_80EEF78()) return; - SetVBlankCallback(&sub_80EBD80); - ewram0_10.var304++; - break; - case 3: - sub_80EED1C(); - sub_80F3130(); - ewram0_10.var304++; - break; - case 4: - sub_80F2D6C(0x1); - ewram0_10.var304++; - break; - case 5: - sub_80F2D6C(0x5); - ewram0_10.var304++; - break; - case 6: - ewram0_10.var6dad = ewram0_10.var6dfc; - ewram0_10.var6dae = 0x6; - sub_80EEE08(); - ewram0_10.var304++; - break; - case 7: - sub_80EF248(0x2); - ewram0_10.var304++; - case 8: - if (sub_80EF284(0x2)) return; - ewram0_10.var304++; - break; - case 9: - sub_80F1B8C(0x2); - ewram0_10.var304++; - case 10: - if (sub_80F1BC8(0x2)) return; - ewram0_10.var304++; - break; - case 11: - if (sub_8055870()) return; - ewram0_10.var304++; - break; - case 12: - BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0); - SetVBlankCallback(&sub_80EBD18); - ewram0_10.var304++; - break; - case 13: - sub_80EED2C(0); - ewram0_10.var304++; - break; - case 14: - sub_80F2598(); - ewram0_10.var304++; - break; - case 15: - if (gPaletteFade.active) return; - ewram0_10.var304++; - break; - case 16: - sub_80F2C80(0x1); - ewram0_10.var304++; - case 17: - if ((var1 = sub_80F2CBC(0x1))) return; - ewram0_10.var306 = var1; - ewram0_10.var304++; - break; - case 18: - sub_80F2C80(0x5); - ewram0_10.var304++; - case 19: - if (sub_80F2CBC(0x5)) return; - sub_80F1DF0(); - ewram0_10.var304++; - break; - case 20: - if (sub_80F1E50()) return; - sub_80EF428(2, ewram0_10.var6dad); - sub_80EBDBC(&sub_80ECC08); - } + } } -void sub_80ED01C() { - u16 var1; - u16 var3; - switch (ewram0_10.var304) { - case 0: - sub_80F1E84(); - sub_80F2D04(0x1); - sub_80F2D04(0x5); - ewram0_10.var304++; - break; - case 1: - if (sub_80F1F10()) return; - sub_80EEFBC(0); - ewram0_10.var304++; - break; - case 2: - if ((var1 = sub_80EEF34())) return; - BeginNormalPaletteFade(ewram0_10.var308, -1, 0x0, 0x10, var1); - ewram0_10.var304++; - break; - case 3: - if (gPaletteFade.active) return; - SetVBlankCallback(NULL); - sub_80EED0C(); - sub_80EF814(); - ewram0_10.var304++; - break; - case 4: - sub_80F2620(); - ewram0_10.var304++; - break; - case 5: - sub_80F4D44(); - ewram0_10.var304++; - case 6: - if (!sub_80F4D88()) { - ewram0_10.var304 += 2; - break; +void sub_80ED01C() +{ + switch (ewram0_10.var304) + { + case 0: + sub_80F1E84(); + sub_80F2D04(0x1); + sub_80F2D04(0x5); + ewram0_10.var304++; + break; + case 1: + if (!sub_80F1F10()) + { + sub_80EEFBC(0); + ewram0_10.var304++; } - ewram0_10.var304++; - break; - case 7: - if (sub_8055870()) return; - ewram0_10.var304--; - break; - case 8: - if (sub_8055870()) return; - ewram0_10.var304++; - break; - case 9: - sub_80F0264(0); - ewram0_10.var304++; - case 10: - if (sub_80F02A0()) return; - ewram0_10.var304++; - break; - case 11: - sub_80F3008(0); - ewram0_10.var304++; - break; - case 12: - if (sub_8055870()) return; - ewram0_10.var304++; - break; - case 13: - BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0); - SetVBlankCallback(&sub_80EBD18); - ewram0_10.var304++; - break; - case 14: - sub_80EED2C(0x4); - ewram0_10.var304++; - break; - case 15: - if (gPaletteFade.active) return; - ewram0_10.var306 = (u8)(gPaletteFade.active << 24); - ewram0_10.var304++; - break; - case 16: - sub_80F2C80(0x1); - ewram0_10.var304++; - case 17: - if ((var3 = sub_80F2CBC(0x1))) return; - ewram0_10.var306 = var3; - ewram0_10.var304++; - break; - case 18: - sub_80F2C80(ewram0_10.var6dfc + 7); - ewram0_10.var304++; - case 19: - if (sub_80F2CBC(ewram0_10.var6dfc + 7)) return; - sub_80EBDBC(&sub_80ED31C); - break; - } + break; + case 2: + if (!sub_80EEF34()) + { + BeginNormalPaletteFade(ewram0_10.var308, -1, 0x0, 0x10, 0); + ewram0_10.var304++; + } + break; + case 3: + if (!gPaletteFade.active) + { + SetVBlankCallback(NULL); + sub_80EED0C(); + sub_80EF814(); + ewram0_10.var304++; + } + break; + case 4: + sub_80F2620(); + ewram0_10.var304++; + break; + case 5: + sub_80F4D44(); + ewram0_10.var304++; + // fall through + case 6: + if (!sub_80F4D88()) + ewram0_10.var304 += 2; + else + ewram0_10.var304 += 1; + break; + case 7: + if (!sub_8055870()) + ewram0_10.var304--; + break; + case 8: + if (!sub_8055870()) + ewram0_10.var304++; + break; + case 9: + sub_80F0264(0); + ewram0_10.var304++; + // fall through + case 10: + if (!sub_80F02A0()) + ewram0_10.var304++; + break; + case 11: + sub_80F3008(0); + ewram0_10.var304++; + break; + case 12: + if (!sub_8055870()) + ewram0_10.var304++; + break; + case 13: + BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0); + SetVBlankCallback(&sub_80EBD18); + ewram0_10.var304++; + break; + case 14: + sub_80EED2C(0x4); + ewram0_10.var304++; + break; + case 15: + if (!gPaletteFade.active) + { + ewram0_10.var306 = 0; + ewram0_10.var304++; + } + break; + case 16: + sub_80F2C80(0x1); + ewram0_10.var304++; + // fall through + case 17: + if (!sub_80F2CBC(0x1)) + { + ewram0_10.var306 = 0; + ewram0_10.var304++; + } + break; + case 18: + sub_80F2C80(ewram0_10.var6dfc + 7); + ewram0_10.var304++; + // fall through + case 19: + if (!sub_80F2CBC(ewram0_10.var6dfc + 7)) + { + sub_80EBDBC(&sub_80ED31C); +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF800), 4); +#endif + } + break; + } } -void sub_80ED31C() { - switch (ewram0_10.var304) { - case 0: - switch (sub_80F5DD4()) { - case 1: - PlaySE(0x5); +void sub_80ED31C() +{ + switch (ewram0_10.var304) + { + case 0: + switch (sub_80F5DD4()) + { + case 1: + PlaySE(SE_SELECT); + ShowMapNamePopUpWindow(); + return; + case 2: + PlaySE(SE_SELECT); + ewram0_10.var304++; + return; + default: + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + sub_80EBDBC(&sub_80ED4D8); + return; + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_80EBDBC(&sub_80ECD80); + return; + } + break; + } + break; + case 1: + if (!sub_80F0718()) + { ShowMapNamePopUpWindow(); - break; - case 2: - PlaySE(0x5); + sub_80F3264(); ewram0_10.var304++; - break; - default: - if (gMain.newKeys & A_BUTTON) { - PlaySE(0x5); - sub_80EBDBC(&sub_80ED4D8); - } - else if (gMain.newKeys & B_BUTTON) { - PlaySE(0x5); - sub_80EBDBC(&sub_80ECD80); - } - break; } - break; - case 1: - if (sub_80F0718()) return; - ShowMapNamePopUpWindow(); - sub_80F3264(); - ewram0_10.var304++; - break; - case 2: - if (sub_8055870()) return; - ewram0_10.var304 = 0; - break; - } + break; + case 2: + if (!sub_8055870()) + ewram0_10.var304 = 0; + break; + } +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008264(gLink.recvQueue.count, 1, 8, 2, 4); +#endif } -void sub_80ED3D0() { - switch (ewram0_10.var304) { - case 0: - SetVBlankCallback(NULL); - ewram0_10.var304++; - break; - case 1: - sub_80EED0C(); - sub_80F6134(); - ewram0_10.var304++; - break; - case 2: - sub_80EEFBC(0); - ewram0_10.var304++; - break; - case 3: - sub_80F0264(0); - ewram0_10.var304++; - case 4: - if (sub_80F02A0()) return; - ewram0_10.var304++; - break; - case 5: - if (sub_8055870()) return; - ewram0_10.var304++; - break; - case 6: - sub_80F3008(0); - BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0); - SetVBlankCallback(&sub_80EBD18); - ewram0_10.var304++; - break; - case 7: - sub_80EED2C(0x4); - ewram0_10.var304++; +void sub_80ED3D0() +{ + switch (ewram0_10.var304) + { + case 0: + SetVBlankCallback(NULL); + ewram0_10.var304++; + break; + case 1: + sub_80EED0C(); + sub_80F6134(); + ewram0_10.var304++; + break; + case 2: + sub_80EEFBC(0); + ewram0_10.var304++; + break; + case 3: + sub_80F0264(0); + ewram0_10.var304++; + // fall through + case 4: + if (!sub_80F02A0()) + ewram0_10.var304++; + break; + case 5: + if (!sub_8055870()) + ewram0_10.var304++; + break; + case 6: + sub_80F3008(0); + BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0); + SetVBlankCallback(&sub_80EBD18); + ewram0_10.var304++; + break; + case 7: + sub_80EED2C(0x4); + ewram0_10.var304++; +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF800), 4); +#endif + break; + case 8: + if (!gPaletteFade.active) + sub_80EBDBC(&sub_80ED31C); break; - case 8: - if (gPaletteFade.active) return; - sub_80EBDBC(&sub_80ED31C); - } + } } -void sub_80ED4D8() { - switch (ewram0_10.var304) { - case 0: - BeginNormalPaletteFade(ewram0_10.var308, -1, 0, 0x10, 0); - ewram0_10.var304++; - break; - case 1: - if (gPaletteFade.active) return; - SetVBlankCallback(NULL); - sub_80EED0C(); - sub_80F3130(); - ewram0_10.var304++; - break; - case 2: - if (sub_8055870()) return; - ewram0_10.var304++; - break; - case 3: - sub_80F4CF0(); - ewram0_10.var304++; - break; - case 4: - sub_80EFF34(); - ewram0_10.var304++; - case 5: - if (sub_80EFF68()) return; - ewram0_10.var304++; - break; - case 6: - sub_80F35B4(); - sub_80EEFBC(0x2); - BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0); - SetVBlankCallback(sub_80EBD4C); - ewram0_10.var304++; - break; - case 7: - sub_80EED2C(0x2); - ewram0_10.var304++; - break; - case 8: - if (gPaletteFade.active) return; - sub_80EBDBC(&sub_80ED858); - break; - } +void sub_80ED4D8() +{ + switch (ewram0_10.var304) + { + case 0: + BeginNormalPaletteFade(ewram0_10.var308, -1, 0, 0x10, 0); + ewram0_10.var304++; + break; + case 1: + if (!gPaletteFade.active) + { + SetVBlankCallback(NULL); + sub_80EED0C(); + sub_80F3130(); + ewram0_10.var304++; + } + break; + case 2: + if (!sub_8055870()) + ewram0_10.var304++; + break; + case 3: + sub_80F4CF0(); + ewram0_10.var304++; + break; + case 4: + sub_80EFF34(); + ewram0_10.var304++; + // fall through + case 5: + if (!sub_80EFF68()) + ewram0_10.var304++; + break; + case 6: + sub_80F35B4(); + sub_80EEFBC(0x2); + BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0); + SetVBlankCallback(sub_80EBD4C); + ewram0_10.var304++; + break; + case 7: + sub_80EED2C(0x2); + ewram0_10.var304++; +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF000), 4); +#endif + break; + case 8: + if (!gPaletteFade.active) + sub_80EBDBC(&sub_80ED858); + break; + } } -void sub_80ED620() { - u8 var1; - switch (ewram0_10.var304) { - case 0: - sub_80F1E84(); - sub_80F2D04(0x1); - ewram0_10.var304++; - break; - case 1: - if (sub_80F1F10()) return; - sub_80EEFBC(0x1); - ewram0_10.var304++; - break; - case 2: - if (!(var1 = sub_80EEF34())) { - BeginNormalPaletteFade(ewram0_10.var308, -1, 0x0, 0x10, var1); +void sub_80ED620() +{ + switch (ewram0_10.var304) + { + case 0: + sub_80F1E84(); + sub_80F2D04(0x1); + ewram0_10.var304++; + break; + case 1: + if (!sub_80F1F10()) + { + sub_80EEFBC(0x1); ewram0_10.var304++; } - break; - case 3: - if (gPaletteFade.active) return; - SetVBlankCallback(NULL); - sub_80EED0C(); - sub_80EF814(); - ewram0_10.var76aa = (u8)(gPaletteFade.active << 24); - ewram0_10.var304++; - break; - case 4: - sub_80F2620(); - ewram0_10.var304++; - break; - case 5: - ewram0_10.varD162 = 0x2; - sub_80F4BD0(); - ewram0_10.var304++; - break; - case 6: - sub_80EFF34(); - ewram0_10.var304++; - case 7: - if (sub_80EFF68()) return; - ewram0_10.var304++; - break; - case 8: - if (sub_8055870()) return; - ewram0_10.var304++; - break; - case 9: - if (sub_8055870()) return; - ewram0_10.var304++; - break; - case 10: - sub_80F33A8(); - BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0); - SetVBlankCallback(&sub_80EBD4C); - ewram0_10.var304++; - break; - case 11: - sub_80EED2C(0x2); - ewram0_10.var304++; - break; - case 12: - if (gPaletteFade.active) return; - ewram0_10.var304++; - break; - case 13: - sub_80F2C80(0x1); - ewram0_10.var304++; - case 14: - if (sub_80F2CBC(0x1)) return; - ewram0_10.var304++; - break; - case 15: - sub_80F2C80(0x6); - ewram0_10.var304++; - case 16: - if (sub_80F2CBC(0x6)) return; - sub_80EBDBC(&sub_80ED858); - break; - } + break; + case 2: + if (!sub_80EEF34()) + { + BeginNormalPaletteFade(ewram0_10.var308, -1, 0x0, 0x10, 0); + ewram0_10.var304++; + } + break; + case 3: + if (!gPaletteFade.active) + { + SetVBlankCallback(NULL); + sub_80EED0C(); + sub_80EF814(); + ewram0_10.var76aa = 0; + ewram0_10.var304++; + } + break; + case 4: + sub_80F2620(); + ewram0_10.var304++; + break; + case 5: + ewram0_10.varD162 = 0x2; + sub_80F4BD0(); + ewram0_10.var304++; + break; + case 6: + sub_80EFF34(); + ewram0_10.var304++; + // fall through + case 7: + if (!sub_80EFF68()) + ewram0_10.var304++; + break; + case 8: + if (!sub_8055870()) + ewram0_10.var304++; + break; + case 9: + if (!sub_8055870()) + ewram0_10.var304++; + break; + case 10: + sub_80F33A8(); + BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0); + SetVBlankCallback(&sub_80EBD4C); + ewram0_10.var304++; + break; + case 11: + sub_80EED2C(0x2); + ewram0_10.var304++; + break; + case 12: + if (!gPaletteFade.active) + ewram0_10.var304++; + break; + case 13: + sub_80F2C80(0x1); + ewram0_10.var304++; + case 14: + if (!sub_80F2CBC(0x1)) + ewram0_10.var304++; + break; + case 15: + sub_80F2C80(0x6); + ewram0_10.var304++; + // fall through + case 16: + if (!sub_80F2CBC(0x6)) + { + sub_80EBDBC(&sub_80ED858); +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF000), 4); +#endif + } + break; + } } #if 0 @@ -1448,1834 +1639,2334 @@ void sub_80F357C(); void sub_80F4FDC(); void sub_80ED858() { - u8 var1; - switch (ewram0_10.var304) { - case 0: - sub_80F4F78(); - sub_80F5B38(); - ewram0_10.var304 = 0x1; - break; - case 1: - if (sub_80F5B50()) return; - ewram0_10.var304 = 0x2; - break; - case 2: - sub_80F0174(0x1); - ewram0_10.var304 = 0x3; - break; - case 3: - if (sub_80F4FB4()) return; - sub_80F3C94(); - sub_80F3D00(); - ewram0_10.var304 = 0x4; - break; - case 4: - if ( (gMain.heldKeys & 0x40) && (ewram0_10.var87CB) && (!(ewram0_10.var76aa) || (ewram0_10.var87DC)) ) { - PlaySE(0x5); - sub_80F5060(0x1); - move_anim_execute(); - ewram0_10.var304 = 0x5; - } - else if ( (gMain.heldKeys & 0x80) && (ewram0_10.var87CB) && (!(ewram0_10.var76aa) || (ewram0_10.var76aa >= ewram0_10.var87DC)) ) { - PlaySE(0x5); - sub_80F5060(0); - move_anim_execute(); - ewram0_10.var304 = 0x5; - } - if (gMain.newKeys & B_BUTTON) { - PlaySE(0x5); - sub_80F4FDC(); - move_anim_execute(); - ewram0_10.var304 = 0x9; - } - else if (gMain.newKeys & A_BUTTON) { - if (ewram0_10.var76aa) { - if (ewram0_10.var6dac) { - PlaySE(0x5); - ewram0_10.var304 = 0x7; - } - } - else if ((ewram0_10.var87DC == ewram0_10.var87DA - 1)) { - PlaySE(0x5); - ewram0_10.var304 = 0x9; - } - } + u8 var1; + switch (ewram0_10.var304) { + case 0: + sub_80F4F78(); + sub_80F5B38(); + ewram0_10.var304 = 0x1; + break; + case 1: + if (sub_80F5B50()) return; + ewram0_10.var304 = 0x2; + break; + case 2: + sub_80F0174(0x1); + ewram0_10.var304 = 0x3; + break; + case 3: + if (sub_80F4FB4()) return; + sub_80F3C94(); + sub_80F3D00(); + ewram0_10.var304 = 0x4; + break; + case 4: + if ( (gMain.heldKeys & 0x40) && (ewram0_10.var87CB) && (!(ewram0_10.var76aa) || (ewram0_10.var87DC)) ) { + PlaySE(SE_SELECT); + sub_80F5060(0x1); + move_anim_execute(); + ewram0_10.var304 = 0x5; + } + else if ( (gMain.heldKeys & 0x80) && (ewram0_10.var87CB) && (!(ewram0_10.var76aa) || (ewram0_10.var76aa >= ewram0_10.var87DC)) ) { + PlaySE(SE_SELECT); + sub_80F5060(0); + move_anim_execute(); + ewram0_10.var304 = 0x5; + } + if (gMain.newKeys & B_BUTTON) { + PlaySE(SE_SELECT); + sub_80F4FDC(); + move_anim_execute(); + ewram0_10.var304 = 0x9; + } + else if (gMain.newKeys & A_BUTTON) { + if (ewram0_10.var76aa) { + if (ewram0_10.var6dac) { + PlaySE(SE_SELECT); + ewram0_10.var304 = 0x7; + } + } + else if ((ewram0_10.var87DC == ewram0_10.var87DA - 1)) { + PlaySE(SE_SELECT); + ewram0_10.var304 = 0x9; + } + } /* - if (gMain.heldKeys & 0x40) { - if (ewram0_10.var87CB) { - if (ewram0_10.var76aa) { - if (!ewram0_10.var87DC) goto label1; - } - PlaySE(0x5); - sub_80F5060(0x1); - move_anim_execute(); - ewram0_10.var304 = 0x5; + if (gMain.heldKeys & 0x40) { + if (ewram0_10.var87CB) { + if (ewram0_10.var76aa) { + if (!ewram0_10.var87DC) goto label1; + } + PlaySE(SE_SELECT); + sub_80F5060(0x1); + move_anim_execute(); + ewram0_10.var304 = 0x5; - } - else goto label1; - } - else goto label1; - break; + } + else goto label1; + } + else goto label1; + break; label1: - if (gMain.heldKeys & 0x80) { - if (ewram0_10.var87CB) { - if (ewram0_10.var76aa) { - if (!(ewram0_10.var76aa < ewram0_10.var87DC)) goto label2; - } - PlaySE(0x5); - sub_80F5060(0x1); - move_anim_execute(); - ewram0_10.var304 = 0x5; - } - else goto label2; - } - else goto label2; - break; + if (gMain.heldKeys & 0x80) { + if (ewram0_10.var87CB) { + if (ewram0_10.var76aa) { + if (!(ewram0_10.var76aa < ewram0_10.var87DC)) goto label2; + } + PlaySE(SE_SELECT); + sub_80F5060(0x1); + move_anim_execute(); + ewram0_10.var304 = 0x5; + } + else goto label2; + } + else goto label2; + break; label2: - if (gMain.newKeys & B_BUTTON) { - PlaySE(0x5); - sub_80F4FDC(); - move_anim_execute(); - ewram0_10.var304 = 0x9; - } - else if (gMain.newKeys & A_BUTTON) { - if (!ewram0_10.var76aa) { - if ((ewram0_10.var87DC == ewram0_10.var87DA - 1)) { - PlaySE(0x5); - ewram0_10.var304 = 0x9; - } - } - else { - PlaySE(0x5); - ewram0_10.var304 = 0x9; - } - } + if (gMain.newKeys & B_BUTTON) { + PlaySE(SE_SELECT); + sub_80F4FDC(); + move_anim_execute(); + ewram0_10.var304 = 0x9; + } + else if (gMain.newKeys & A_BUTTON) { + if (!ewram0_10.var76aa) { + if ((ewram0_10.var87DC == ewram0_10.var87DA - 1)) { + PlaySE(SE_SELECT); + ewram0_10.var304 = 0x9; + } + } + else { + PlaySE(SE_SELECT); + ewram0_10.var304 = 0x9; + } + } */ - break; + break; - case 5: - if (gpu_sync_bg_show()) return; - sub_80F3D00(); - ewram0_10.var304 = 0x6; - break; - case 6: - if (sub_8055870()) return; - ewram0_10.var304 = 0x4; - break; - case 7: - sub_80EEFBC(0x3); - sub_80F3668(); - ewram0_10.var304 = 0x8; - break; - case 8: - if (sub_80F7500()) return; - sub_80EEFBC(0x2); - sub_80F3698(); - ewram0_10.var304 = 0x4; - break; - case 9: - if (!(var1 = sub_80F5038())) { - sub_80F0174(0); - sub_80F2F48(); - BeginNormalPaletteFade(ewram0_10.var308, -1, 0x0, 0x10, var1); - ewram0_10.var304 = 0xB; - } - break; - case 0xA: - if (gPaletteFade.active) return; - sub_80F3CE8(); - sub_80F5BDC(); - if (!ewram0_10.var76aa) { - sub_80F357C(); - sub_80F2D6C(0x1); - sub_80F2D6C(0x6); - sub_80EBDBC(&sub_80ECA10); - } - else { - sub_80F3614(); - sub_80EBDBC(&sub_80ED3D0); - } - break; - } + case 5: + if (gpu_sync_bg_show()) return; + sub_80F3D00(); + ewram0_10.var304 = 0x6; + break; + case 6: + if (sub_8055870()) return; + ewram0_10.var304 = 0x4; + break; + case 7: + sub_80EEFBC(0x3); + sub_80F3668(); + ewram0_10.var304 = 0x8; + break; + case 8: + if (sub_80F7500()) return; + sub_80EEFBC(0x2); + sub_80F3698(); + ewram0_10.var304 = 0x4; + break; + case 9: + if (!(var1 = sub_80F5038())) { + sub_80F0174(0); + sub_80F2F48(); + BeginNormalPaletteFade(ewram0_10.var308, -1, 0x0, 0x10, var1); + ewram0_10.var304 = 0xB; + } + break; + case 0xA: + if (gPaletteFade.active) return; + sub_80F3CE8(); + sub_80F5BDC(); + if (!ewram0_10.var76aa) { + sub_80F357C(); + sub_80F2D6C(0x1); + sub_80F2D6C(0x6); + sub_80EBDBC(&sub_80ECA10); + } + else { + sub_80F3614(); + sub_80EBDBC(&sub_80ED3D0); + } + break; + } } #else +#if DEBUG __attribute__((naked)) -void sub_80ED858() { - asm_unified("push {r4,r5,lr}\n\ - sub sp, 0x4\n\ - ldr r1, _080ED878 @ =gSharedMem\n\ - movs r2, 0xC1\n\ - lsls r2, 2\n\ - adds r0, r1, r2\n\ - ldrh r0, [r0]\n\ - adds r5, r1, 0\n\ - cmp r0, 0xB\n\ - bls _080ED86E\n\ - b _080EDB7A\n\ +void sub_80ED858() +{ + asm("\ + push {r4, r5, lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r1, ._917 @ gSharedMem\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r0, r1, r2\n\ + ldrh r0, [r0]\n\ + add r5, r1, #0\n\ + cmp r0, #0xb\n\ + bls ._915 @cond_branch\n\ + b ._999\n\ +._915:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._917 + 4 @ \n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._918:\n\ + .align 2, 0\n\ +._917:\n\ + .word gSharedMem\n\ + .word ._919\n\ +._919:\n\ + .word ._920\n\ + .word ._921\n\ + .word ._922\n\ + .word ._923\n\ + .word ._924\n\ + .word ._925\n\ + .word ._926\n\ + .word ._927\n\ + .word ._928\n\ + .word ._929\n\ + .word ._999\n\ + .word ._931\n\ +._920:\n\ + bl sub_80F4F78\n\ + bl sub_80F5B38\n\ + ldr r0, ._933 @ gSharedMem\n\ + mov r4, #0xc1\n\ + lsl r4, r4, #0x2\n\ + add r0, r0, r4\n\ + mov r1, #0x1\n\ + strh r1, [r0]\n\ + b ._999\n\ +._934:\n\ + .align 2, 0\n\ +._933:\n\ + .word gSharedMem\n\ +._921:\n\ + bl sub_80F5B50\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._935 @cond_branch\n\ + b ._999\n\ +._935:\n\ + ldr r0, ._938 @ gSharedMem\n\ + mov r1, #0xc1\n\ + lsl r1, r1, #0x2\n\ + add r0, r0, r1\n\ + mov r1, #0x2\n\ + strh r1, [r0]\n\ + b ._999\n\ +._939:\n\ + .align 2, 0\n\ +._938:\n\ + .word gSharedMem\n\ +._922:\n\ + mov r0, #0x1\n\ + bl sub_80F0174\n\ + ldr r0, ._941 @ gSharedMem\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r0, r0, r2\n\ + mov r1, #0x3\n\ + strh r1, [r0]\n\ + b ._999\n\ +._942:\n\ + .align 2, 0\n\ +._941:\n\ + .word gSharedMem\n\ +._923:\n\ + bl sub_80F4FB4\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._943 @cond_branch\n\ + b ._999\n\ +._943:\n\ + bl sub_80F3C94\n\ + bl sub_80F3D00\n\ + b ._945\n\ +._924:\n\ + ldr r2, ._951 @ gMain\n\ + ldrh r1, [r2, #0x2c]\n\ + mov r0, #0x40\n\ + and r0, r0, r1\n\ + add r3, r2, #0\n\ + cmp r0, #0\n\ + beq ._949 @cond_branch\n\ + ldr r1, ._951 + 4 @ 0x87cb\n\ + add r0, r5, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._949 @cond_branch\n\ + ldr r2, ._951 + 8 @ 0x76aa\n\ + add r0, r5, r2\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._948 @cond_branch\n\ + ldr r4, ._951 + 12 @ 0x87dc\n\ + add r0, r5, r4\n\ + mov r1, #0x0\n\ + ldsh r0, [r0, r1]\n\ + cmp r0, #0\n\ + beq ._949 @cond_branch\n\ +._948:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + mov r0, #0x1\n\ + bl sub_80F5060\n\ + bl move_anim_execute\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r5, r2\n\ + b ._950\n\ +._952:\n\ + .align 2, 0\n\ +._951:\n\ + .word gMain\n\ + .word 0x87cb\n\ + .word 0x76aa\n\ + .word 0x87dc\n\ +._949:\n\ + ldrh r1, [r3, #0x2c]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._956 @cond_branch\n\ + ldr r4, ._958 @ 0x87cb\n\ + add r0, r5, r4\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._956 @cond_branch\n\ + ldr r1, ._958 + 4 @ 0x76aa\n\ + add r0, r5, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._955 @cond_branch\n\ + ldr r2, ._958 + 8 @ 0x87dc\n\ + add r0, r5, r2\n\ + sub r4, r4, #0x57\n\ + add r1, r5, r4\n\ + mov r4, #0x0\n\ + ldsh r2, [r0, r4]\n\ + mov r4, #0x0\n\ + ldsh r0, [r1, r4]\n\ + cmp r2, r0\n\ + bge ._956 @cond_branch\n\ +._955:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + mov r0, #0x0\n\ + bl sub_80F5060\n\ + bl move_anim_execute\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r5, r0\n\ +._950:\n\ + mov r0, #0x5\n\ + strh r0, [r1]\n\ + b ._999\n\ +._959:\n\ + .align 2, 0\n\ +._958:\n\ + .word 0x87cb\n\ + .word 0x76aa\n\ + .word 0x87dc\n\ +._956:\n\ + ldrh r2, [r3, #0x2e]\n\ + mov r0, #0x2\n\ + and r0, r0, r2\n\ + cmp r0, #0\n\ + beq ._960 @cond_branch\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + bl sub_80F4FDC\n\ + bl move_anim_execute\n\ + ldr r0, ._962 @ gSharedMem\n\ + mov r1, #0xc1\n\ + lsl r1, r1, #0x2\n\ + add r0, r0, r1\n\ + mov r1, #0x9\n\ + strh r1, [r0]\n\ + b ._999\n\ +._963:\n\ + .align 2, 0\n\ +._962:\n\ + .word gSharedMem\n\ +._960:\n\ + mov r0, #0x1\n\ + and r0, r0, r2\n\ + cmp r0, #0\n\ + bne ._964 @cond_branch\n\ + b ._999\n\ +._964:\n\ + add r4, r5, #0\n\ + ldr r2, ._970 @ 0x76aa\n\ + add r0, r4, r2\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + bne ._966 @cond_branch\n\ + ldr r1, ._970 + 4 @ 0x87dc\n\ + add r0, r4, r1\n\ + mov r2, #0x0\n\ + ldsh r1, [r0, r2]\n\ + ldr r2, ._970 + 8 @ 0x87da\n\ + add r0, r4, r2\n\ + mov r2, #0x0\n\ + ldsh r0, [r0, r2]\n\ + sub r0, r0, #0x1\n\ + cmp r1, r0\n\ + beq ._967 @cond_branch\n\ + b ._999\n\ +._967:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r4, r0\n\ + mov r0, #0x9\n\ + strh r0, [r1]\n\ + b ._999\n\ +._971:\n\ + .align 2, 0\n\ +._970:\n\ + .word 0x76aa\n\ + .word 0x87dc\n\ + .word 0x87da\n\ +._966:\n\ + ldr r1, ._975 @ 0x6dac\n\ + add r0, r5, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._972 @cond_branch\n\ + b ._999\n\ +._972:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r5, r2\n\ + mov r0, #0x7\n\ + strh r0, [r1]\n\ + b ._999\n\ +._976:\n\ + .align 2, 0\n\ +._975:\n\ + .word 0x6dac\n\ +._925:\n\ + bl gpu_sync_bg_show\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._977 @cond_branch\n\ + b ._999\n\ +._977:\n\ + bl sub_80F3D00\n\ + ldr r0, ._980 @ gSharedMem\n\ + mov r4, #0xc1\n\ + lsl r4, r4, #0x2\n\ + add r0, r0, r4\n\ + mov r1, #0x6\n\ + strh r1, [r0]\n\ + b ._999\n\ +._981:\n\ + .align 2, 0\n\ +._980:\n\ + .word gSharedMem\n\ +._926:\n\ + bl sub_8055870\n\ + cmp r0, #0\n\ + bne ._999 @cond_branch\n\ + ldr r0, ._984 @ gSharedMem\n\ + mov r1, #0xc1\n\ + lsl r1, r1, #0x2\n\ + add r0, r0, r1\n\ + b ._983\n\ +._985:\n\ + .align 2, 0\n\ +._984:\n\ + .word gSharedMem\n\ +._927:\n\ + mov r0, #0x3\n\ + bl sub_80EEFBC\n\ + bl sub_80F3668\n\ + ldr r0, ._987 @ gSharedMem\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r0, r0, r2\n\ + mov r1, #0x8\n\ + strh r1, [r0]\n\ + b ._999\n\ +._988:\n\ + .align 2, 0\n\ +._987:\n\ + .word gSharedMem\n\ +._928:\n\ + bl sub_80F7500\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._999 @cond_branch\n\ + mov r0, #0x2\n\ + bl sub_80EEFBC\n\ + bl sub_80F3698\n\ +._945:\n\ + ldr r0, ._991 @ gSharedMem\n\ + mov r4, #0xc1\n\ + lsl r4, r4, #0x2\n\ + add r0, r0, r4\n\ +._983:\n\ + mov r1, #0x4\n\ + strh r1, [r0]\n\ + b ._999\n\ +._992:\n\ + .align 2, 0\n\ +._991:\n\ + .word gSharedMem\n\ +._929:\n\ + bl sub_80F5038\n\ + lsl r0, r0, #0x18\n\ + lsr r4, r0, #0x18\n\ + cmp r4, #0\n\ + bne ._999 @cond_branch\n\ + mov r0, #0x0\n\ + bl sub_80F0174\n\ + bl sub_80F2F48\n\ + ldr r5, ._995 @ gSharedMem\n\ + mov r1, #0xc2\n\ + lsl r1, r1, #0x2\n\ + add r0, r5, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x1\n\ + neg r1, r1\n\ + str r4, [sp]\n\ + mov r2, #0x0\n\ + mov r3, #0x10\n\ + bl BeginNormalPaletteFade\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r5, r2\n\ + mov r0, #0xb\n\ + strh r0, [r1]\n\ + b ._999\n\ +._996:\n\ + .align 2, 0\n\ +._995:\n\ + .word gSharedMem\n\ +._931:\n\ + ldr r0, ._1000 @ gPaletteFade\n\ + ldrb r1, [r0, #0x7]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._999 @cond_branch\n\ + bl sub_80F3CE8\n\ + bl sub_80F5BDC\n\ + ldr r0, ._1000 + 4 @ gSharedMem\n\ + ldr r4, ._1000 + 8 @ 0x76aa\n\ + add r0, r0, r4\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + bne ._998 @cond_branch\n\ + bl sub_80F357C\n\ + mov r0, #0x1\n\ + bl sub_80F2D6C\n\ + mov r0, #0x6\n\ + bl sub_80F2D6C\n\ + ldr r0, ._1000 + 12 @ sub_80ECA10\n\ + bl sub_80EBDBC\n\ + b ._999\n\ +._1001:\n\ + .align 2, 0\n\ +._1000:\n\ + .word gPaletteFade\n\ + .word gSharedMem\n\ + .word 0x76aa\n\ + .word sub_80ECA10+1\n\ +._998:\n\ + bl sub_80F3614\n\ + ldr r0, ._1003 @ sub_80ED3D0\n\ + bl sub_80EBDBC\n\ +._999:\n\ + ldr r0, ._1003 + 4 @ gLinkOpen\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._1002 @cond_branch\n\ + ldr r0, ._1003 + 8 @ gLink\n\ + ldr r1, ._1003 + 12 @ 0xfbd\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + mov r1, #0x4\n\ + str r1, [sp]\n\ + mov r1, #0x9\n\ + mov r2, #0x6\n\ + mov r3, #0x2\n\ + bl debug_sub_8008264\n\ +._1002:\n\ + add sp, sp, #0x4\n\ + pop {r4, r5}\n\ + pop {r0}\n\ + bx r0\n\ +._1004:\n\ + .align 2, 0\n\ +._1003:\n\ + .word sub_80ED3D0+1\n\ + .word gLinkOpen\n\ + .word gLink\n\ + .word 0xfbd"); +} +#else +__attribute__((naked)) +void sub_80ED858() +{ + asm_unified("push {r4,r5,lr}\n\ + sub sp, 0x4\n\ + ldr r1, _080ED878 @ =gSharedMem\n\ + movs r2, 0xC1\n\ + lsls r2, 2\n\ + adds r0, r1, r2\n\ + ldrh r0, [r0]\n\ + adds r5, r1, 0\n\ + cmp r0, 0xB\n\ + bls _080ED86E\n\ + b _080EDB7A\n\ _080ED86E:\n\ - lsls r0, 2\n\ - ldr r1, _080ED87C @ =_080ED880\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ - .align 2, 0\n\ + lsls r0, 2\n\ + ldr r1, _080ED87C @ =_080ED880\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ + .align 2, 0\n\ _080ED878: .4byte gSharedMem\n\ _080ED87C: .4byte _080ED880\n\ - .align 2, 0\n\ + .align 2, 0\n\ _080ED880:\n\ - .4byte _080ED8B0\n\ - .4byte _080ED8CC\n\ - .4byte _080ED8EC\n\ - .4byte _080ED904\n\ - .4byte _080ED91A\n\ - .4byte _080EDA68\n\ - .4byte _080EDA8C\n\ - .4byte _080EDAA4\n\ - .4byte _080EDAC0\n\ - .4byte _080EDAE8\n\ - .4byte _080EDB7A\n\ - .4byte _080EDB28\n\ + .4byte _080ED8B0\n\ + .4byte _080ED8CC\n\ + .4byte _080ED8EC\n\ + .4byte _080ED904\n\ + .4byte _080ED91A\n\ + .4byte _080EDA68\n\ + .4byte _080EDA8C\n\ + .4byte _080EDAA4\n\ + .4byte _080EDAC0\n\ + .4byte _080EDAE8\n\ + .4byte _080EDB7A\n\ + .4byte _080EDB28\n\ _080ED8B0:\n\ - bl sub_80F4F78\n\ - bl sub_80F5B38\n\ - ldr r0, _080ED8C8 @ =gSharedMem\n\ - movs r4, 0xC1\n\ - lsls r4, 2\n\ - adds r0, r4\n\ - movs r1, 0x1\n\ - strh r1, [r0]\n\ - b _080EDB7A\n\ - .align 2, 0\n\ + bl sub_80F4F78\n\ + bl sub_80F5B38\n\ + ldr r0, _080ED8C8 @ =gSharedMem\n\ + movs r4, 0xC1\n\ + lsls r4, 2\n\ + adds r0, r4\n\ + movs r1, 0x1\n\ + strh r1, [r0]\n\ + b _080EDB7A\n\ + .align 2, 0\n\ _080ED8C8: .4byte gSharedMem\n\ _080ED8CC:\n\ - bl sub_80F5B50\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _080ED8D8\n\ - b _080EDB7A\n\ + bl sub_80F5B50\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080ED8D8\n\ + b _080EDB7A\n\ _080ED8D8:\n\ - ldr r0, _080ED8E8 @ =gSharedMem\n\ - movs r1, 0xC1\n\ - lsls r1, 2\n\ - adds r0, r1\n\ - movs r1, 0x2\n\ - strh r1, [r0]\n\ - b _080EDB7A\n\ - .align 2, 0\n\ + ldr r0, _080ED8E8 @ =gSharedMem\n\ + movs r1, 0xC1\n\ + lsls r1, 2\n\ + adds r0, r1\n\ + movs r1, 0x2\n\ + strh r1, [r0]\n\ + b _080EDB7A\n\ + .align 2, 0\n\ _080ED8E8: .4byte gSharedMem\n\ _080ED8EC:\n\ - movs r0, 0x1\n\ - bl sub_80F0174\n\ - ldr r0, _080ED900 @ =gSharedMem\n\ - movs r2, 0xC1\n\ - lsls r2, 2\n\ - adds r0, r2\n\ - movs r1, 0x3\n\ - strh r1, [r0]\n\ - b _080EDB7A\n\ - .align 2, 0\n\ + movs r0, 0x1\n\ + bl sub_80F0174\n\ + ldr r0, _080ED900 @ =gSharedMem\n\ + movs r2, 0xC1\n\ + lsls r2, 2\n\ + adds r0, r2\n\ + movs r1, 0x3\n\ + strh r1, [r0]\n\ + b _080EDB7A\n\ + .align 2, 0\n\ _080ED900: .4byte gSharedMem\n\ _080ED904:\n\ - bl sub_80F4FB4\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _080ED910\n\ - b _080EDB7A\n\ + bl sub_80F4FB4\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080ED910\n\ + b _080EDB7A\n\ _080ED910:\n\ - bl sub_80F3C94\n\ - bl sub_80F3D00\n\ - b _080EDAD4\n\ + bl sub_80F3C94\n\ + bl sub_80F3D00\n\ + b _080EDAD4\n\ _080ED91A:\n\ - ldr r2, _080ED960 @ =gMain\n\ - ldrh r1, [r2, 0x2C]\n\ - movs r0, 0x40\n\ - ands r0, r1\n\ - adds r3, r2, 0\n\ - cmp r0, 0\n\ - beq _080ED970\n\ - ldr r1, _080ED964 @ =0x000087cb\n\ - adds r0, r5, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - beq _080ED970\n\ - ldr r2, _080ED968 @ =0x000076aa\n\ - adds r0, r5, r2\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - beq _080ED948\n\ - ldr r4, _080ED96C @ =0x000087dc\n\ - adds r0, r5, r4\n\ - movs r1, 0\n\ - ldrsh r0, [r0, r1]\n\ - cmp r0, 0\n\ - beq _080ED970\n\ + ldr r2, _080ED960 @ =gMain\n\ + ldrh r1, [r2, 0x2C]\n\ + movs r0, 0x40\n\ + ands r0, r1\n\ + adds r3, r2, 0\n\ + cmp r0, 0\n\ + beq _080ED970\n\ + ldr r1, _080ED964 @ =0x000087cb\n\ + adds r0, r5, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + beq _080ED970\n\ + ldr r2, _080ED968 @ =0x000076aa\n\ + adds r0, r5, r2\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + beq _080ED948\n\ + ldr r4, _080ED96C @ =0x000087dc\n\ + adds r0, r5, r4\n\ + movs r1, 0\n\ + ldrsh r0, [r0, r1]\n\ + cmp r0, 0\n\ + beq _080ED970\n\ _080ED948:\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - movs r0, 0x1\n\ - bl sub_80F5060\n\ - bl move_anim_execute\n\ - movs r2, 0xC1\n\ - lsls r2, 2\n\ - adds r1, r5, r2\n\ - b _080ED9B8\n\ - .align 2, 0\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + movs r0, 0x1\n\ + bl sub_80F5060\n\ + bl move_anim_execute\n\ + movs r2, 0xC1\n\ + lsls r2, 2\n\ + adds r1, r5, r2\n\ + b _080ED9B8\n\ + .align 2, 0\n\ _080ED960: .4byte gMain\n\ _080ED964: .4byte 0x000087cb\n\ _080ED968: .4byte 0x000076aa\n\ _080ED96C: .4byte 0x000087dc\n\ _080ED970:\n\ - ldrh r1, [r3, 0x2C]\n\ - movs r0, 0x80\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080ED9CC\n\ - ldr r4, _080ED9C0 @ =0x000087cb\n\ - adds r0, r5, r4\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - beq _080ED9CC\n\ - ldr r1, _080ED9C4 @ =0x000076aa\n\ - adds r0, r5, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - beq _080ED9A2\n\ - ldr r2, _080ED9C8 @ =0x000087dc\n\ - adds r0, r5, r2\n\ - subs r4, 0x57\n\ - adds r1, r5, r4\n\ - movs r4, 0\n\ - ldrsh r2, [r0, r4]\n\ - movs r4, 0\n\ - ldrsh r0, [r1, r4]\n\ - cmp r2, r0\n\ - bge _080ED9CC\n\ + ldrh r1, [r3, 0x2C]\n\ + movs r0, 0x80\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080ED9CC\n\ + ldr r4, _080ED9C0 @ =0x000087cb\n\ + adds r0, r5, r4\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + beq _080ED9CC\n\ + ldr r1, _080ED9C4 @ =0x000076aa\n\ + adds r0, r5, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + beq _080ED9A2\n\ + ldr r2, _080ED9C8 @ =0x000087dc\n\ + adds r0, r5, r2\n\ + subs r4, 0x57\n\ + adds r1, r5, r4\n\ + movs r4, 0\n\ + ldrsh r2, [r0, r4]\n\ + movs r4, 0\n\ + ldrsh r0, [r1, r4]\n\ + cmp r2, r0\n\ + bge _080ED9CC\n\ _080ED9A2:\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - movs r0, 0\n\ - bl sub_80F5060\n\ - bl move_anim_execute\n\ - movs r0, 0xC1\n\ - lsls r0, 2\n\ - adds r1, r5, r0\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + movs r0, 0\n\ + bl sub_80F5060\n\ + bl move_anim_execute\n\ + movs r0, 0xC1\n\ + lsls r0, 2\n\ + adds r1, r5, r0\n\ _080ED9B8:\n\ - movs r0, 0x5\n\ - strh r0, [r1]\n\ - b _080EDB7A\n\ - .align 2, 0\n\ + movs r0, 0x5\n\ + strh r0, [r1]\n\ + b _080EDB7A\n\ + .align 2, 0\n\ _080ED9C0: .4byte 0x000087cb\n\ _080ED9C4: .4byte 0x000076aa\n\ _080ED9C8: .4byte 0x000087dc\n\ _080ED9CC:\n\ - ldrh r2, [r3, 0x2E]\n\ - movs r0, 0x2\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - beq _080ED9F8\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - bl sub_80F4FDC\n\ - bl move_anim_execute\n\ - ldr r0, _080ED9F4 @ =gSharedMem\n\ - movs r1, 0xC1\n\ - lsls r1, 2\n\ - adds r0, r1\n\ - movs r1, 0x9\n\ - strh r1, [r0]\n\ - b _080EDB7A\n\ - .align 2, 0\n\ + ldrh r2, [r3, 0x2E]\n\ + movs r0, 0x2\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + beq _080ED9F8\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + bl sub_80F4FDC\n\ + bl move_anim_execute\n\ + ldr r0, _080ED9F4 @ =gSharedMem\n\ + movs r1, 0xC1\n\ + lsls r1, 2\n\ + adds r0, r1\n\ + movs r1, 0x9\n\ + strh r1, [r0]\n\ + b _080EDB7A\n\ + .align 2, 0\n\ _080ED9F4: .4byte gSharedMem\n\ _080ED9F8:\n\ - movs r0, 0x1\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - bne _080EDA02\n\ - b _080EDB7A\n\ + movs r0, 0x1\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + bne _080EDA02\n\ + b _080EDB7A\n\ _080EDA02:\n\ - adds r4, r5, 0\n\ - ldr r2, _080EDA38 @ =0x000076aa\n\ - adds r0, r4, r2\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - bne _080EDA44\n\ - ldr r1, _080EDA3C @ =0x000087dc\n\ - adds r0, r4, r1\n\ - movs r2, 0\n\ - ldrsh r1, [r0, r2]\n\ - ldr r2, _080EDA40 @ =0x000087da\n\ - adds r0, r4, r2\n\ - movs r2, 0\n\ - ldrsh r0, [r0, r2]\n\ - subs r0, 0x1\n\ - cmp r1, r0\n\ - beq _080EDA26\n\ - b _080EDB7A\n\ + adds r4, r5, 0\n\ + ldr r2, _080EDA38 @ =0x000076aa\n\ + adds r0, r4, r2\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + bne _080EDA44\n\ + ldr r1, _080EDA3C @ =0x000087dc\n\ + adds r0, r4, r1\n\ + movs r2, 0\n\ + ldrsh r1, [r0, r2]\n\ + ldr r2, _080EDA40 @ =0x000087da\n\ + adds r0, r4, r2\n\ + movs r2, 0\n\ + ldrsh r0, [r0, r2]\n\ + subs r0, 0x1\n\ + cmp r1, r0\n\ + beq _080EDA26\n\ + b _080EDB7A\n\ _080EDA26:\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - movs r0, 0xC1\n\ - lsls r0, 2\n\ - adds r1, r4, r0\n\ - movs r0, 0x9\n\ - strh r0, [r1]\n\ - b _080EDB7A\n\ - .align 2, 0\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + movs r0, 0xC1\n\ + lsls r0, 2\n\ + adds r1, r4, r0\n\ + movs r0, 0x9\n\ + strh r0, [r1]\n\ + b _080EDB7A\n\ + .align 2, 0\n\ _080EDA38: .4byte 0x000076aa\n\ _080EDA3C: .4byte 0x000087dc\n\ _080EDA40: .4byte 0x000087da\n\ _080EDA44:\n\ - ldr r1, _080EDA64 @ =0x00006dac\n\ - adds r0, r5, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - beq _080EDA50\n\ - b _080EDB7A\n\ + ldr r1, _080EDA64 @ =0x00006dac\n\ + adds r0, r5, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + beq _080EDA50\n\ + b _080EDB7A\n\ _080EDA50:\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - movs r2, 0xC1\n\ - lsls r2, 2\n\ - adds r1, r5, r2\n\ - movs r0, 0x7\n\ - strh r0, [r1]\n\ - b _080EDB7A\n\ - .align 2, 0\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + movs r2, 0xC1\n\ + lsls r2, 2\n\ + adds r1, r5, r2\n\ + movs r0, 0x7\n\ + strh r0, [r1]\n\ + b _080EDB7A\n\ + .align 2, 0\n\ _080EDA64: .4byte 0x00006dac\n\ _080EDA68:\n\ - bl gpu_sync_bg_show\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _080EDA74\n\ - b _080EDB7A\n\ + bl gpu_sync_bg_show\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080EDA74\n\ + b _080EDB7A\n\ _080EDA74:\n\ - bl sub_80F3D00\n\ - ldr r0, _080EDA88 @ =gSharedMem\n\ - movs r4, 0xC1\n\ - lsls r4, 2\n\ - adds r0, r4\n\ - movs r1, 0x6\n\ - strh r1, [r0]\n\ - b _080EDB7A\n\ - .align 2, 0\n\ + bl sub_80F3D00\n\ + ldr r0, _080EDA88 @ =gSharedMem\n\ + movs r4, 0xC1\n\ + lsls r4, 2\n\ + adds r0, r4\n\ + movs r1, 0x6\n\ + strh r1, [r0]\n\ + b _080EDB7A\n\ + .align 2, 0\n\ _080EDA88: .4byte gSharedMem\n\ _080EDA8C:\n\ - bl sub_8055870\n\ - cmp r0, 0\n\ - bne _080EDB7A\n\ - ldr r0, _080EDAA0 @ =gSharedMem\n\ - movs r1, 0xC1\n\ - lsls r1, 2\n\ - adds r0, r1\n\ - b _080EDADC\n\ - .align 2, 0\n\ + bl sub_8055870\n\ + cmp r0, 0\n\ + bne _080EDB7A\n\ + ldr r0, _080EDAA0 @ =gSharedMem\n\ + movs r1, 0xC1\n\ + lsls r1, 2\n\ + adds r0, r1\n\ + b _080EDADC\n\ + .align 2, 0\n\ _080EDAA0: .4byte gSharedMem\n\ _080EDAA4:\n\ - movs r0, 0x3\n\ - bl sub_80EEFBC\n\ - bl sub_80F3668\n\ - ldr r0, _080EDABC @ =gSharedMem\n\ - movs r2, 0xC1\n\ - lsls r2, 2\n\ - adds r0, r2\n\ - movs r1, 0x8\n\ - strh r1, [r0]\n\ - b _080EDB7A\n\ - .align 2, 0\n\ + movs r0, 0x3\n\ + bl sub_80EEFBC\n\ + bl sub_80F3668\n\ + ldr r0, _080EDABC @ =gSharedMem\n\ + movs r2, 0xC1\n\ + lsls r2, 2\n\ + adds r0, r2\n\ + movs r1, 0x8\n\ + strh r1, [r0]\n\ + b _080EDB7A\n\ + .align 2, 0\n\ _080EDABC: .4byte gSharedMem\n\ _080EDAC0:\n\ - bl sub_80F7500\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _080EDB7A\n\ - movs r0, 0x2\n\ - bl sub_80EEFBC\n\ - bl sub_80F3698\n\ + bl sub_80F7500\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _080EDB7A\n\ + movs r0, 0x2\n\ + bl sub_80EEFBC\n\ + bl sub_80F3698\n\ _080EDAD4:\n\ - ldr r0, _080EDAE4 @ =gSharedMem\n\ - movs r4, 0xC1\n\ - lsls r4, 2\n\ - adds r0, r4\n\ + ldr r0, _080EDAE4 @ =gSharedMem\n\ + movs r4, 0xC1\n\ + lsls r4, 2\n\ + adds r0, r4\n\ _080EDADC:\n\ - movs r1, 0x4\n\ - strh r1, [r0]\n\ - b _080EDB7A\n\ - .align 2, 0\n\ + movs r1, 0x4\n\ + strh r1, [r0]\n\ + b _080EDB7A\n\ + .align 2, 0\n\ _080EDAE4: .4byte gSharedMem\n\ _080EDAE8:\n\ - bl sub_80F5038\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - cmp r4, 0\n\ - bne _080EDB7A\n\ - movs r0, 0\n\ - bl sub_80F0174\n\ - bl sub_80F2F48\n\ - ldr r5, _080EDB24 @ =gSharedMem\n\ - movs r1, 0xC2\n\ - lsls r1, 2\n\ - adds r0, r5, r1\n\ - ldr r0, [r0]\n\ - movs r1, 0x1\n\ - negs r1, r1\n\ - str r4, [sp]\n\ - movs r2, 0\n\ - movs r3, 0x10\n\ - bl BeginNormalPaletteFade\n\ - movs r2, 0xC1\n\ - lsls r2, 2\n\ - adds r1, r5, r2\n\ - movs r0, 0xB\n\ - strh r0, [r1]\n\ - b _080EDB7A\n\ - .align 2, 0\n\ + bl sub_80F5038\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + cmp r4, 0\n\ + bne _080EDB7A\n\ + movs r0, 0\n\ + bl sub_80F0174\n\ + bl sub_80F2F48\n\ + ldr r5, _080EDB24 @ =gSharedMem\n\ + movs r1, 0xC2\n\ + lsls r1, 2\n\ + adds r0, r5, r1\n\ + ldr r0, [r0]\n\ + movs r1, 0x1\n\ + negs r1, r1\n\ + str r4, [sp]\n\ + movs r2, 0\n\ + movs r3, 0x10\n\ + bl BeginNormalPaletteFade\n\ + movs r2, 0xC1\n\ + lsls r2, 2\n\ + adds r1, r5, r2\n\ + movs r0, 0xB\n\ + strh r0, [r1]\n\ + b _080EDB7A\n\ + .align 2, 0\n\ _080EDB24: .4byte gSharedMem\n\ _080EDB28:\n\ - ldr r0, _080EDB60 @ =gPaletteFade\n\ - ldrb r1, [r0, 0x7]\n\ - movs r0, 0x80\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _080EDB7A\n\ - bl sub_80F3CE8\n\ - bl sub_80F5BDC\n\ - ldr r0, _080EDB64 @ =gSharedMem\n\ - ldr r4, _080EDB68 @ =0x000076aa\n\ - adds r0, r4\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - bne _080EDB70\n\ - bl sub_80F357C\n\ - movs r0, 0x1\n\ - bl sub_80F2D6C\n\ - movs r0, 0x6\n\ - bl sub_80F2D6C\n\ - ldr r0, _080EDB6C @ =sub_80ECA10\n\ - bl sub_80EBDBC\n\ - b _080EDB7A\n\ - .align 2, 0\n\ + ldr r0, _080EDB60 @ =gPaletteFade\n\ + ldrb r1, [r0, 0x7]\n\ + movs r0, 0x80\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _080EDB7A\n\ + bl sub_80F3CE8\n\ + bl sub_80F5BDC\n\ + ldr r0, _080EDB64 @ =gSharedMem\n\ + ldr r4, _080EDB68 @ =0x000076aa\n\ + adds r0, r4\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + bne _080EDB70\n\ + bl sub_80F357C\n\ + movs r0, 0x1\n\ + bl sub_80F2D6C\n\ + movs r0, 0x6\n\ + bl sub_80F2D6C\n\ + ldr r0, _080EDB6C @ =sub_80ECA10\n\ + bl sub_80EBDBC\n\ + b _080EDB7A\n\ + .align 2, 0\n\ _080EDB60: .4byte gPaletteFade\n\ _080EDB64: .4byte gSharedMem\n\ _080EDB68: .4byte 0x000076aa\n\ _080EDB6C: .4byte sub_80ECA10\n\ _080EDB70:\n\ - bl sub_80F3614\n\ - ldr r0, _080EDB84 @ =sub_80ED3D0\n\ - bl sub_80EBDBC\n\ + bl sub_80F3614\n\ + ldr r0, _080EDB84 @ =sub_80ED3D0\n\ + bl sub_80EBDBC\n\ _080EDB7A:\n\ - add sp, 0x4\n\ - pop {r4,r5}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ + add sp, 0x4\n\ + pop {r4,r5}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ _080EDB84: .4byte sub_80ED3D0\n"); } #endif +#endif -void sub_80EDB88() { - u8 var1; - switch (ewram0_10.var304) { - case 0: - sub_80F1E84(); - sub_80F2D04(0); - ewram0_10.var304++; - break; - case 1: - if (sub_80F1F10()) return; - sub_80EEFBC(0x4); - ewram0_10.var304++; - break; - case 2: - if (!(var1 = sub_80EEF34())) { - BeginNormalPaletteFade(ewram0_10.var308, -1, 0x0, 0x10, var1); +void sub_80EDB88() +{ + switch (ewram0_10.var304) + { + case 0: + sub_80F1E84(); + sub_80F2D04(0); + ewram0_10.var304++; + break; + case 1: + if (!sub_80F1F10()) + { + sub_80EEFBC(0x4); ewram0_10.var304++; } - break; - case 3: - if (gPaletteFade.active) return; - SetVBlankCallback(0); - sub_80EED0C(); - sub_80EF814(); - ewram0_10.var304++; - break; - case 4: - sub_80F2620(); - ewram0_10.var304++; - break; - case 5: - sub_80F638C(); - ewram0_10.var304++; - case 6: - if (!sub_80F63D0()) { - ewram0_10.var304 += 0x2; - break; + break; + case 2: + if (!sub_80EEF34()) + { + BeginNormalPaletteFade(ewram0_10.var308, -1, 0x0, 0x10, 0); + ewram0_10.var304++; + } + break; + case 3: + if (!gPaletteFade.active) + { + SetVBlankCallback(NULL); + sub_80EED0C(); + sub_80EF814(); + ewram0_10.var304++; } - ewram0_10.var304++; - break; - case 7: - if (sub_8055870()) return; - ewram0_10.var304--; - break; - case 8: - if (sub_8055870()) return; - ewram0_10.var304++; - break; - case 9: - sub_80F0264(0x1); - ewram0_10.var304++; - case 10: - if (sub_80F02A0()) return; - ewram0_10.var304++; - break; - case 11: - sub_80F2C80(0x2); - ewram0_10.var304++; - case 12: - if (sub_80F2CBC(0x2)) return; - ewram0_10.var304++; - break; - case 13: - sub_80F3008(0x1); - ewram0_10.var304++; - break; - case 14: - if (sub_8055870()) return; - ewram0_10.var304++; - break; - case 15: - BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0); - SetVBlankCallback(&sub_80EBD18); - ewram0_10.var304++; - break; - case 16: - sub_80EED2C(0x4); - ewram0_10.var304++; - break; - case 17: - if (gPaletteFade.active) return; - sub_80EBDBC(&sub_80EDDBC); - break; - } + break; + case 4: + sub_80F2620(); + ewram0_10.var304++; + break; + case 5: + sub_80F638C(); + ewram0_10.var304++; + case 6: + if (!sub_80F63D0()) + ewram0_10.var304 += 2; + else + ewram0_10.var304 += 1; + break; + case 7: + if (!sub_8055870()) + ewram0_10.var304--; + break; + case 8: + if (!sub_8055870()) + ewram0_10.var304++; + break; + case 9: + sub_80F0264(0x1); + ewram0_10.var304++; + case 10: + if (!sub_80F02A0()) + ewram0_10.var304++; + break; + case 11: + sub_80F2C80(0x2); + ewram0_10.var304++; + case 12: + if (!sub_80F2CBC(0x2)) + ewram0_10.var304++; + break; + case 13: + sub_80F3008(0x1); + ewram0_10.var304++; + break; + case 14: + if (!sub_8055870()) + ewram0_10.var304++; + break; + case 15: + BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0); + SetVBlankCallback(&sub_80EBD18); + ewram0_10.var304++; + break; + case 16: + sub_80EED2C(0x4); + ewram0_10.var304++; +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF800), 4); +#endif + break; + case 17: + if (!gPaletteFade.active) + sub_80EBDBC(&sub_80EDDBC); + break; + } } -void sub_80EDDBC() { - switch (ewram0_10.var304) { - case 0: - switch (sub_80F5DD4()) { - case 1: - PlaySE(0x5); +void sub_80EDDBC() +{ + switch (ewram0_10.var304) + { + case 0: + switch (sub_80F5DD4()) + { + case 1: + PlaySE(SE_SELECT); + ShowMapNamePopUpWindow(); + return; + case 2: + PlaySE(SE_SELECT); + ewram0_10.var304++; + return; + default: + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + sub_80EBDBC(&sub_80EDEE4); + return; + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_80EBDBC(&sub_80EDE70); + return; + } + break; + } + break; + case 1: + if (!sub_80F0718()) + { ShowMapNamePopUpWindow(); - break; - case 2: - PlaySE(0x5); + sub_80F3264(); ewram0_10.var304++; - break; - default: - if (gMain.newKeys & A_BUTTON) { - PlaySE(0x5); - sub_80EBDBC(&sub_80EDEE4); - } - else if (gMain.newKeys & B_BUTTON) { - PlaySE(0x5); - sub_80EBDBC(&sub_80EDE70); - } - break; } - break; - case 1: - if (sub_80F0718()) return; - ShowMapNamePopUpWindow(); - sub_80F3264(); - ewram0_10.var304++; - break; - case 2: - if (sub_8055870()) return; - ewram0_10.var304 = 0; - break; - - } + break; + case 2: + if (!sub_8055870()) + ewram0_10.var304 = 0; + break; + } +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008264(gLink.recvQueue.count, 1, 8, 2, 4); +#endif } -void sub_80EDE70() { - switch (ewram0_10.var304) { - case 0: - BeginNormalPaletteFade(ewram0_10.var308, -1, 0, 0x10, 0); - ewram0_10.var304++; - break; - case 1: - if (gPaletteFade.active) return; - sub_80F3130(); - sub_80F2D6C(0x2); - ewram0_10.var304++; - break; - case 2: - sub_80EBDBC(&sub_80EC00C); - break; - } +void sub_80EDE70() +{ + switch (ewram0_10.var304) + { + case 0: + BeginNormalPaletteFade(ewram0_10.var308, -1, 0, 0x10, 0); + ewram0_10.var304++; + break; + case 1: + if (!gPaletteFade.active) + { + sub_80F3130(); + sub_80F2D6C(0x2); + ewram0_10.var304++; + } + break; + case 2: + sub_80EBDBC(&sub_80EC00C); + break; + } } -void sub_80EDEE4() { - switch (ewram0_10.var304) { - case 0: - BeginNormalPaletteFade(ewram0_10.var308, -1, 0, 0x10, 0); - ewram0_10.var304++; - break; - case 1: - if (gPaletteFade.active) return; - SetVBlankCallback(NULL); - sub_80EED0C(); - sub_80F3130(); - ewram0_10.var304++; - break; - case 2: - sub_80F66E0(); - sub_80EEE08(); - ewram0_10.var304++; - break; - case 3: - if (sub_80F1080()) return; - ewram0_10.var304++; - break; - case 4: - sub_80EEFBC(0x5); - sub_80F38B8(); - ewram0_10.var304++; - case 5: - if (sub_80F38EC()) return; - ewram0_10.var304++; - break; - case 6: - if (sub_8055870()) return; - ewram0_10.var304++; - break; - case 7: - BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0); - SetVBlankCallback(&sub_80EBD18); - ewram0_10.var304++; - break; - case 8: - sub_80EED2C(0x3); - ewram0_10.var304++; - break; - case 9: - if (gPaletteFade.active) return; - ewram0_10.var304++; - break; - case 10: - if (sub_80F170C()) return; - sub_80EBDBC(&sub_80EE06C); - break; - } +void sub_80EDEE4() +{ + switch (ewram0_10.var304) + { + case 0: + BeginNormalPaletteFade(ewram0_10.var308, -1, 0, 0x10, 0); + ewram0_10.var304++; + break; + case 1: + if (!gPaletteFade.active) + { + SetVBlankCallback(NULL); + sub_80EED0C(); + sub_80F3130(); + ewram0_10.var304++; + } + break; + case 2: + sub_80F66E0(); + sub_80EEE08(); + ewram0_10.var304++; + break; + case 3: + if (!sub_80F1080()) + ewram0_10.var304++; + break; + case 4: + sub_80EEFBC(0x5); + sub_80F38B8(); + ewram0_10.var304++; + case 5: + if (!sub_80F38EC()) + ewram0_10.var304++; + break; + case 6: + if (!sub_8055870()) + ewram0_10.var304++; + break; + case 7: + BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0); + SetVBlankCallback(&sub_80EBD18); + ewram0_10.var304++; + break; + case 8: + sub_80EED2C(0x3); + ewram0_10.var304++; +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF000), 4); +#endif + break; + case 9: + if (!gPaletteFade.active) + ewram0_10.var304++; + break; + case 10: + if (!sub_80F170C()) + sub_80EBDBC(&sub_80EE06C); + break; + } } -void sub_80EE06C() { - u32 var1; - u16 var2; - switch (ewram0_10.var304) { - case 0: - sub_80F15A8(); - ewram0_10.var304++; - break; - case 1: - if (gMain.newAndRepeatedKeys & 0x40) { - if (ewram0_10.var87DC) { - PlaySE(0x5); - sub_80F6A4C(-1); - ewram0_10.var304++; - } - else goto label1; - } - else goto label1; - break; -label1: - if (gMain.newAndRepeatedKeys & 0x80) { - if (ewram0_10.var87DC < ewram0_10.var8774) { - PlaySE(0x5); - sub_80F6A4C(1); - ewram0_10.var304++; - } - else goto label2; +void sub_80EE06C() +{ + switch (ewram0_10.var304) + { + case 0: + sub_80F15A8(); + ewram0_10.var304++; + break; + case 1: + if ((gMain.newAndRepeatedKeys & 0x40) && (ewram0_10.var87DC)) + { + PlaySE(SE_SELECT); + sub_80F6A4C(-1); + ewram0_10.var304++; + } + else if ((gMain.newAndRepeatedKeys & 0x80) && ewram0_10.var87DC < ewram0_10.var8774) + { + PlaySE(SE_SELECT); + sub_80F6A4C(1); + ewram0_10.var304++; + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + sub_80EEFBC(0xB); + ewram0_10.var304 = 0x4; + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_80EBDBC(&sub_80EE294); + } + break; + case 2: + if (!sub_80F6AF0()) + ewram0_10.var304++; + break; + case 3: + if (!sub_8055870()) + ewram0_10.var304 = 0; + break; + case 4: + sub_80F3B00(); + ewram0_10.var304++; + break; + case 5: + if (!sub_80F3B58()) + { + sub_80F1494(); + ewram0_10.var304++; + sub_80EED9C(); } - else goto label2; - break; -label2: - if (gMain.newKeys & A_BUTTON) { - PlaySE(0x5); - sub_80EEFBC(0xB); + break; + case 6: + switch (sub_80F68E8()) + { + case 1: + PlaySE(SE_SELECT); + sub_80F3B94(); + ewram0_10.var304 = 0x7; + return; + default: + case 0: + if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_80F3B94(); + ewram0_10.var304 = 0x8; + } + break; + } + break; + case 7: + if (!sub_80F3BD4()) ewram0_10.var304 = 0x4; + break; + case 8: + if (!sub_80F3BD4()) + { + sub_80EEFBC(0x5); + ewram0_10.var304 = 0; } - else if (gMain.newKeys & B_BUTTON) { - PlaySE(0x5); - sub_80EBDBC(&sub_80EE294); - } - break; - case 2: - if (sub_80F6AF0()) return; - ewram0_10.var304++; - break; - case 3: - var1 = sub_8055870(); - if (var1) return; - ewram0_10.var304 = var1; - break; - case 4: - sub_80F3B00(); - ewram0_10.var304++; - break; - case 5: - if (sub_80F3B58()) return; - sub_80F1494(); - ewram0_10.var304++; - sub_80EED9C(); - break; - case 6: - switch (sub_80F68E8()) { - case 1: - PlaySE(0x5); - sub_80F3B94(); - ewram0_10.var304 = 0x7; - break; - default: - case 0: - if (gMain.newKeys & B_BUTTON) { - PlaySE(0x5); - sub_80F3B94(); - ewram0_10.var304 = 0x8; - } - break; - } - break; - case 7: - if (sub_80F3BD4()) return; - ewram0_10.var304 = 0x4; - break; - case 8: - var2 = sub_80F3BD4(); - if (var2) return; - sub_80EEFBC(0x5); - ewram0_10.var304 = var2; - break; - } + break; + } +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008264(gLink.recvQueue.count, 1, 4, 2, 4); +#endif } -void sub_80EE294() { - switch (ewram0_10.var304) { - case 0: - BeginNormalPaletteFade(ewram0_10.var308, -1, 0, 0x10, 0); - ewram0_10.var304++; - break; - case 1: - if (gPaletteFade.active) return; - SetVBlankCallback(NULL); - sub_80EED0C(); - sub_80F3C2C(); - sub_80EEE08(); - ewram0_10.var304++; - break; - case 2: - sub_80F6134(); - sub_80F0264(0x1); - ewram0_10.var304++; - case 3: - if (sub_80F02A0()) return; - ewram0_10.var304++; - break; - case 4: - sub_80EEFBC(0x4); - sub_80F3008(0x1); - SetVBlankCallback(&sub_80EBD18); - ewram0_10.var304++; - break; - case 5: - if (sub_8055870()) return; - ewram0_10.var304++; - break; - case 6: - BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0); - ewram0_10.var304++; - break; - case 7: - sub_80EED2C(0x4); - ewram0_10.var304++; - break; - case 8: - if (gPaletteFade.active) return; - sub_80EBDBC(&sub_80EDDBC); - break; - } +void sub_80EE294() +{ + switch (ewram0_10.var304) + { + case 0: + BeginNormalPaletteFade(ewram0_10.var308, -1, 0, 0x10, 0); + ewram0_10.var304++; + break; + case 1: + if (!gPaletteFade.active) + { + SetVBlankCallback(NULL); + sub_80EED0C(); + sub_80F3C2C(); + sub_80EEE08(); + ewram0_10.var304++; + } + break; + case 2: + sub_80F6134(); + sub_80F0264(0x1); + ewram0_10.var304++; + case 3: + if (!sub_80F02A0()) + ewram0_10.var304++; + break; + case 4: + sub_80EEFBC(0x4); + sub_80F3008(0x1); + SetVBlankCallback(&sub_80EBD18); + ewram0_10.var304++; + break; + case 5: + if (!sub_8055870()) + ewram0_10.var304++; + break; + case 6: + BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0); + ewram0_10.var304++; + break; + case 7: + sub_80EED2C(0x4); + ewram0_10.var304++; +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF800), 4); +#endif + break; + case 8: + if (!gPaletteFade.active) + sub_80EBDBC(&sub_80EDDBC); + break; + } } -void sub_80EE3D8() { - u8 var1; - switch (ewram0_10.var304) { - case 0: - sub_80F1E84(); - sub_80F2D04(0); - ewram0_10.var304++; - break; - case 1: - if (sub_80F1F10()) return; - sub_80EEFBC(0x9); - ewram0_10.var304++; - break; - case 2: - if (!(var1 = sub_80EEF34())) { - BeginNormalPaletteFade(ewram0_10.var308, -1, 0x0, 0x10, var1); +void sub_80EE3D8() +{ + switch (ewram0_10.var304) + { + case 0: + sub_80F1E84(); + sub_80F2D04(0); + ewram0_10.var304++; + break; + case 1: + if (!sub_80F1F10()) + { + sub_80EEFBC(0x9); ewram0_10.var304++; } - break; - case 3: - if (gPaletteFade.active) return; - SetVBlankCallback(NULL); - sub_80EED0C(); - sub_80EF814(); - sub_80EEE08(); - ewram0_10.var304++; - break; - case 4: - sub_80F2620(); - ewram0_10.var304++; - break; - case 5: - sub_80F0264(0x2); - ewram0_10.var304++; - case 6: - if (sub_80F02A0()) return; - ewram0_10.var304++; - break; - case 7: - sub_80F2C80(0x3); - ewram0_10.var304++; - case 8: - if (sub_80F2CBC(0x3)) return; - ewram0_10.var304++; - break; - case 9: - sub_80F3008(0x2); - ewram0_10.var304++; - break; - case 10: - if (sub_8055870()) return; - ewram0_10.var304++; - break; - case 11: - sub_80F6F10(); - BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0); - SetVBlankCallback(&sub_80EBD68); - ewram0_10.var304++; - break; - case 12: - sub_80EED2C(0x5); - ewram0_10.var304++; - break; - case 13: - if (gPaletteFade.active) return; - sub_80EBDBC(&sub_80EE58C); - break; - } + break; + case 2: + if (!sub_80EEF34()) + { + BeginNormalPaletteFade(ewram0_10.var308, -1, 0x0, 0x10, 0); + ewram0_10.var304++; + } + break; + case 3: + if (!gPaletteFade.active) + { + SetVBlankCallback(NULL); + sub_80EED0C(); + sub_80EF814(); + sub_80EEE08(); + ewram0_10.var304++; + } + break; + case 4: + sub_80F2620(); + ewram0_10.var304++; + break; + case 5: + sub_80F0264(0x2); + ewram0_10.var304++; + case 6: + if (!sub_80F02A0()) + ewram0_10.var304++; + break; + case 7: + sub_80F2C80(0x3); + ewram0_10.var304++; + case 8: + if (!sub_80F2CBC(0x3)) + ewram0_10.var304++; + break; + case 9: + sub_80F3008(0x2); + ewram0_10.var304++; + break; + case 10: + if (!sub_8055870()) + ewram0_10.var304++; + break; + case 11: + sub_80F6F10(); + BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0); + SetVBlankCallback(&sub_80EBD68); + ewram0_10.var304++; + break; + case 12: + sub_80EED2C(0x5); + ewram0_10.var304++; +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF800), 4); +#endif + break; + case 13: + if (!gPaletteFade.active) + sub_80EBDBC(&sub_80EE58C); + break; + } } -void sub_80EE58C() { - switch (ewram0_10.var304) { - case 0: - switch (sub_80F5DD4()) { - case 1: - PlaySE(0x5); +void sub_80EE58C() +{ + switch (ewram0_10.var304) + { + case 0: + switch (sub_80F5DD4()) + { + case 1: + PlaySE(SE_SELECT); + sub_80F0FFC(ewram0_10.var876E); + return; + case 2: + PlaySE(SE_SELECT); + ewram0_10.var304++; + return; + default: + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + sub_80EBDBC(&sub_80EE658); + return; + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_80EBDBC(&sub_80EE8F4); + return; + } + break; + } + break; + case 1: + if (!sub_80F0718()) + { sub_80F0FFC(ewram0_10.var876E); - break; - case 2: - PlaySE(0x5); + sub_80F3264(); ewram0_10.var304++; - break; - default: - if (gMain.newKeys & A_BUTTON) { - PlaySE(0x5); - sub_80EBDBC(&sub_80EE658); - } - else if (gMain.newKeys & B_BUTTON) { - PlaySE(0x5); - sub_80EBDBC(&sub_80EE8F4); - } - break; } - break; - case 1: - if (sub_80F0718()) return; - sub_80F0FFC(ewram0_10.var876E); - sub_80F3264(); - ewram0_10.var304++; - break; - case 2: - if (sub_8055870()) return; - ewram0_10.var304 = 0; - break; - } + break; + case 2: + if (!sub_8055870()) + ewram0_10.var304 = 0; + break; + } +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008264(gLink.recvQueue.count, 1, 3, 2, 4); +#endif } -void sub_80EE658() { - switch (ewram0_10.var304) { - case 0: - sub_80F3294(0x1); - sub_80EEFBC(0xA); - sub_80F0B24(); - ewram0_10.var304++; - break; - case 1: - if (sub_80F0B44()) return; - ewram0_10.var304++; - break; - case 2: - sub_80F0F64(); - ewram0_10.var304++; - break; - case 3: - if (sub_80F0FEC()) return; - sub_80F6FB8(0x1); - ewram0_10.var304++; - break; - case 4: - sub_80F6DB8(); - ewram0_10.var304++; - break; - case 5: - sub_80F700C((u8 *)(gSharedMem + 0x8788), *(u16 *)(gSharedMem + 0x8788 - 0x1A)); - sub_80F42C4((u8 *)(gSharedMem + 0x8788)); - ewram0_10.var304++; - break; - case 6: - sub_80F0CD8(); - ewram0_10.var304++; - case 7: - if (sub_80F6E9C()) return; - if (sub_80F0D5C()) return; - ewram0_10.var304++; - break; - case 8: - if (gMain.heldKeys & 0x40) { - if (ewram0_10.var87DC) { - PlaySE(0x5); - sub_80F708C(-1); - ewram0_10.var304 = 0x10; - } - else goto label1; - } - else goto label1; - break; -label1: - if (gMain.heldKeys & 0x80) { - if (ewram0_10.var87DC < ewram0_10.var8774) { - PlaySE(0x5); - sub_80F708C(1); - ewram0_10.var304 = 0x10; - } - else goto label2; +void sub_80EE658() +{ + switch (ewram0_10.var304) + { + case 0: + sub_80F3294(0x1); + sub_80EEFBC(0xA); + sub_80F0B24(); + ewram0_10.var304++; + break; + case 1: + if (!sub_80F0B44()) + ewram0_10.var304++; + break; + case 2: + sub_80F0F64(); + ewram0_10.var304++; + break; + case 3: + if (!sub_80F0FEC()) + { + sub_80F6FB8(0x1); + ewram0_10.var304++; } - else goto label2; - break; -label2: - if (gMain.newKeys & B_BUTTON) { - PlaySE(0x5); - sub_80F4394(); - sub_80F0EC0(); + break; + case 4: + sub_80F6DB8(); + ewram0_10.var304++; + break; + case 5: + sub_80F700C((u8 *)(gSharedMem + 0x8788), *(u16 *)(gSharedMem + 0x8788 - 0x1A)); + sub_80F42C4((u8 *)(gSharedMem + 0x8788)); + ewram0_10.var304++; + break; + case 6: + sub_80F0CD8(); + ewram0_10.var304++; + case 7: + if (!sub_80F6E9C() && !sub_80F0D5C()) + ewram0_10.var304++; + break; + case 8: + if ((gMain.heldKeys & 0x40) && ewram0_10.var87DC) + { + PlaySE(SE_SELECT); + sub_80F708C(-1); + ewram0_10.var304 = 0x10; + } + else if ((gMain.heldKeys & 0x80) && ewram0_10.var87DC < ewram0_10.var8774) + { + PlaySE(SE_SELECT); + sub_80F708C(1); + ewram0_10.var304 = 0x10; + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_80F4394(); + sub_80F0EC0(); + ewram0_10.var304++; + } + break; + case 9: + if (!sub_80F6ED4() && !sub_80F0EF4()) + { + sub_80F6FB8(0); + sub_80F2FB0(); ewram0_10.var304++; } - break; - case 9: - if (sub_80F6ED4()) return; - if (sub_80F0EF4()) return; - sub_80F6FB8(0); - sub_80F2FB0(); - ewram0_10.var304++; - break; - case 10: - sub_80F6134(); - ewram0_10.var304++; - break; - case 11: - sub_80F0FA0(); - ewram0_10.var304++; - break; - case 12: - if (sub_80F0FEC()) return; - ewram0_10.var304++; - break; - case 13: - sub_80F0C28(); - ewram0_10.var304++; - break; - case 14: - if (sub_80F0C48()) return; - ewram0_10.var304++; - break; - case 15: - sub_80EEFBC(0x9); - sub_80F3294(0); - sub_80EBDBC(&sub_80EE58C); - sub_80EED9C(); - break; - case 16: - if (sub_80F70FC()) return; - ewram0_10.var304++; - break; - case 17: - if (sub_8055870()) return; - ewram0_10.var304 = 0x8; - break; - } + break; + case 10: + sub_80F6134(); + ewram0_10.var304++; + break; + case 11: + sub_80F0FA0(); + ewram0_10.var304++; + break; + case 12: + if (!sub_80F0FEC()) + ewram0_10.var304++; + break; + case 13: + sub_80F0C28(); + ewram0_10.var304++; + break; + case 14: + if (!sub_80F0C48()) + ewram0_10.var304++; + break; + case 15: + sub_80EEFBC(0x9); + sub_80F3294(0); + sub_80EBDBC(&sub_80EE58C); + sub_80EED9C(); + break; + case 16: + if (!sub_80F70FC()) + ewram0_10.var304++; + break; + case 17: + if (!sub_8055870()) + ewram0_10.var304 = 0x8; + break; + } } -void sub_80EE8F4() { - switch (ewram0_10.var304) { - case 0: - BeginNormalPaletteFade(ewram0_10.var308, -1, 0, 0x10, 0); - ewram0_10.var304++; - break; - case 1: - if (gPaletteFade.active) return; - sub_80F3130(); - sub_80F2D6C(0x2); - sub_80F6FFC(); - ewram0_10.var304++; - break; - case 2: - sub_80EBDBC(&sub_80EC00C); - break; - } +void sub_80EE8F4() +{ + switch (ewram0_10.var304) + { + case 0: + BeginNormalPaletteFade(ewram0_10.var308, -1, 0, 0x10, 0); + ewram0_10.var304++; + break; + case 1: + if (!gPaletteFade.active) + { + sub_80F3130(); + sub_80F2D6C(0x2); + sub_80F6FFC(); + ewram0_10.var304++; + } + break; + case 2: + sub_80EBDBC(&sub_80EC00C); + break; + } } -void sub_80EE96C() { - u16 var1 = ewram0_10.var304; - if (!var1) { - PlaySE(0x6F); - BeginNormalPaletteFade(-1, 0, 0, 0x10, var1); - ewram0_10.var304++; - } - else { - if (gPaletteFade.active) return; - sub_80F5BDC(); - sub_805469C(); - } +void sub_80EE96C() +{ + if (!ewram0_10.var304) + { + PlaySE(0x6F); + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + ewram0_10.var304++; + } + else + { + if (!gPaletteFade.active) + { + sub_80F5BDC(); + sub_805469C(); + } + } } -void sub_80EE9C0(u8 param1, u8 param2, u8 param3) { - sub_80F1E84(); - ewram0_10.var6e14 = param1; - ewram0_10.var6e15 = param2; - ewram0_10.var6e16 = 0; - ewram0_10.var6e17 = param3; +void sub_80EE9C0(u8 param1, u8 param2, u8 param3) +{ + sub_80F1E84(); + ewram0_10.var6e14 = param1; + ewram0_10.var6e15 = param2; + ewram0_10.var6e16 = 0; + ewram0_10.var6e17 = param3; } #if 0 bool8 sub_80EEA0C() { - switch (ewram0_10.var6e16) { - case 0: - if (sub_80F1F10()) return 1; - if (ewram0_10.var6e17 != 0xC) { - ewram0_10.var6e16 = 0x1; - return 1; - } - else { - ewram0_10.var6e16 = 0x3; - return 1; - } - case 1: - sub_80F2C80(ewram0_10.var6e17); - ewram0_10.var6e16++; - case 2: - if (sub_80F2CBC(ewram0_10.var6e17)) return 1; - ewram0_10.var6e16++; - case 3: - - } + switch (ewram0_10.var6e16) { + case 0: + if (sub_80F1F10()) return 1; + if (ewram0_10.var6e17 != 0xC) { + ewram0_10.var6e16 = 0x1; + return 1; + } + else { + ewram0_10.var6e16 = 0x3; + return 1; + } + case 1: + sub_80F2C80(ewram0_10.var6e17); + ewram0_10.var6e16++; + case 2: + if (sub_80F2CBC(ewram0_10.var6e17)) return 1; + ewram0_10.var6e16++; + case 3: + + } } #else __attribute__((naked)) bool8 sub_80EEA0C() { - asm_unified( - "push {r4,lr}\n\ - ldr r1, _080EEA28 @ =gSharedMem\n\ - ldr r2, _080EEA2C @ =0x00006e16\n\ - adds r0, r1, r2\n\ - ldrb r0, [r0]\n\ - adds r3, r1, 0\n\ - cmp r0, 0x8\n\ - bls _080EEA1E\n\ - b _080EEBFA\n\ + asm_unified( + "push {r4,lr}\n\ + ldr r1, _080EEA28 @ =gSharedMem\n\ + ldr r2, _080EEA2C @ =0x00006e16\n\ + adds r0, r1, r2\n\ + ldrb r0, [r0]\n\ + adds r3, r1, 0\n\ + cmp r0, 0x8\n\ + bls _080EEA1E\n\ + b _080EEBFA\n\ _080EEA1E:\n\ - lsls r0, 2\n\ - ldr r1, _080EEA30 @ =_080EEA34\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ - .align 2, 0\n\ + lsls r0, 2\n\ + ldr r1, _080EEA30 @ =_080EEA34\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ + .align 2, 0\n\ _080EEA28: .4byte gSharedMem\n\ _080EEA2C: .4byte 0x00006e16\n\ _080EEA30: .4byte _080EEA34\n\ - .align 2, 0\n\ + .align 2, 0\n\ _080EEA34:\n\ - .4byte _080EEA58\n\ - .4byte _080EEA98\n\ - .4byte _080EEAAE\n\ - .4byte _080EEAD4\n\ - .4byte _080EEB3E\n\ - .4byte _080EEB68\n\ - .4byte _080EEB88\n\ - .4byte _080EEBAC\n\ - .4byte _080EEBE4\n\ + .4byte _080EEA58\n\ + .4byte _080EEA98\n\ + .4byte _080EEAAE\n\ + .4byte _080EEAD4\n\ + .4byte _080EEB3E\n\ + .4byte _080EEB68\n\ + .4byte _080EEB88\n\ + .4byte _080EEBAC\n\ + .4byte _080EEBE4\n\ _080EEA58:\n\ - bl sub_80F1F10\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _080EEA64\n\ - b _080EEC08\n\ + bl sub_80F1F10\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080EEA64\n\ + b _080EEC08\n\ _080EEA64:\n\ - ldr r1, _080EEA7C @ =gSharedMem\n\ - ldr r4, _080EEA80 @ =0x00006e17\n\ - adds r0, r1, r4\n\ - ldrb r0, [r0]\n\ - cmp r0, 0xC\n\ - beq _080EEA88\n\ - ldr r0, _080EEA84 @ =0x00006e16\n\ - adds r1, r0\n\ - movs r0, 0x1\n\ - strb r0, [r1]\n\ - b _080EEC08\n\ - .align 2, 0\n\ + ldr r1, _080EEA7C @ =gSharedMem\n\ + ldr r4, _080EEA80 @ =0x00006e17\n\ + adds r0, r1, r4\n\ + ldrb r0, [r0]\n\ + cmp r0, 0xC\n\ + beq _080EEA88\n\ + ldr r0, _080EEA84 @ =0x00006e16\n\ + adds r1, r0\n\ + movs r0, 0x1\n\ + strb r0, [r1]\n\ + b _080EEC08\n\ + .align 2, 0\n\ _080EEA7C: .4byte gSharedMem\n\ _080EEA80: .4byte 0x00006e17\n\ _080EEA84: .4byte 0x00006e16\n\ _080EEA88:\n\ - ldr r2, _080EEA94 @ =0x00006e16\n\ - adds r1, r2\n\ - movs r0, 0x3\n\ - strb r0, [r1]\n\ - b _080EEC08\n\ - .align 2, 0\n\ + ldr r2, _080EEA94 @ =0x00006e16\n\ + adds r1, r2\n\ + movs r0, 0x3\n\ + strb r0, [r1]\n\ + b _080EEC08\n\ + .align 2, 0\n\ _080EEA94: .4byte 0x00006e16\n\ _080EEA98:\n\ - ldr r4, _080EEAC8 @ =gSharedMem\n\ - ldr r1, _080EEACC @ =0x00006e17\n\ - adds r0, r4, r1\n\ - ldrb r0, [r0]\n\ - bl sub_80F2C80\n\ - ldr r2, _080EEAD0 @ =0x00006e16\n\ - adds r4, r2\n\ - ldrb r0, [r4]\n\ - adds r0, 0x1\n\ - strb r0, [r4]\n\ + ldr r4, _080EEAC8 @ =gSharedMem\n\ + ldr r1, _080EEACC @ =0x00006e17\n\ + adds r0, r4, r1\n\ + ldrb r0, [r0]\n\ + bl sub_80F2C80\n\ + ldr r2, _080EEAD0 @ =0x00006e16\n\ + adds r4, r2\n\ + ldrb r0, [r4]\n\ + adds r0, 0x1\n\ + strb r0, [r4]\n\ _080EEAAE:\n\ - ldr r4, _080EEAC8 @ =gSharedMem\n\ - ldr r1, _080EEACC @ =0x00006e17\n\ - adds r0, r4, r1\n\ - ldrb r0, [r0]\n\ - bl sub_80F2CBC\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _080EEAC2\n\ - b _080EEC08\n\ + ldr r4, _080EEAC8 @ =gSharedMem\n\ + ldr r1, _080EEACC @ =0x00006e17\n\ + adds r0, r4, r1\n\ + ldrb r0, [r0]\n\ + bl sub_80F2CBC\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080EEAC2\n\ + b _080EEC08\n\ _080EEAC2:\n\ - ldr r2, _080EEAD0 @ =0x00006e16\n\ - adds r1, r4, r2\n\ - b _080EEB76\n\ - .align 2, 0\n\ + ldr r2, _080EEAD0 @ =0x00006e16\n\ + adds r1, r4, r2\n\ + b _080EEB76\n\ + .align 2, 0\n\ _080EEAC8: .4byte gSharedMem\n\ _080EEACC: .4byte 0x00006e17\n\ _080EEAD0: .4byte 0x00006e16\n\ _080EEAD4:\n\ - adds r2, r3, 0\n\ - ldr r4, _080EEAF8 @ =0x00006e15\n\ - adds r0, r2, r4\n\ - ldrb r1, [r0]\n\ - subs r4, 0x68\n\ - adds r0, r2, r4\n\ - strb r1, [r0]\n\ - ldr r1, _080EEAFC @ =0x00006e14\n\ - adds r0, r2, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x1\n\ - beq _080EEB14\n\ - cmp r0, 0x1\n\ - bgt _080EEB00\n\ - cmp r0, 0\n\ - beq _080EEB06\n\ - b _080EEB28\n\ - .align 2, 0\n\ + adds r2, r3, 0\n\ + ldr r4, _080EEAF8 @ =0x00006e15\n\ + adds r0, r2, r4\n\ + ldrb r1, [r0]\n\ + subs r4, 0x68\n\ + adds r0, r2, r4\n\ + strb r1, [r0]\n\ + ldr r1, _080EEAFC @ =0x00006e14\n\ + adds r0, r2, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x1\n\ + beq _080EEB14\n\ + cmp r0, 0x1\n\ + bgt _080EEB00\n\ + cmp r0, 0\n\ + beq _080EEB06\n\ + b _080EEB28\n\ + .align 2, 0\n\ _080EEAF8: .4byte 0x00006e15\n\ _080EEAFC: .4byte 0x00006e14\n\ _080EEB00:\n\ - cmp r0, 0x2\n\ - beq _080EEB20\n\ - b _080EEB28\n\ + cmp r0, 0x2\n\ + beq _080EEB20\n\ + b _080EEB28\n\ _080EEB06:\n\ - ldr r4, _080EEB10 @ =0x00006dae\n\ - adds r1, r2, r4\n\ - movs r0, 0x5\n\ - b _080EEB26\n\ - .align 2, 0\n\ + ldr r4, _080EEB10 @ =0x00006dae\n\ + adds r1, r2, r4\n\ + movs r0, 0x5\n\ + b _080EEB26\n\ + .align 2, 0\n\ _080EEB10: .4byte 0x00006dae\n\ _080EEB14:\n\ - ldr r0, _080EEB1C @ =0x00006dae\n\ - adds r1, r2, r0\n\ - movs r0, 0x3\n\ - b _080EEB26\n\ - .align 2, 0\n\ + ldr r0, _080EEB1C @ =0x00006dae\n\ + adds r1, r2, r0\n\ + movs r0, 0x3\n\ + b _080EEB26\n\ + .align 2, 0\n\ _080EEB1C: .4byte 0x00006dae\n\ _080EEB20:\n\ - ldr r2, _080EEB58 @ =0x00006dae\n\ - adds r1, r3, r2\n\ - movs r0, 0x6\n\ + ldr r2, _080EEB58 @ =0x00006dae\n\ + adds r1, r3, r2\n\ + movs r0, 0x6\n\ _080EEB26:\n\ - strb r0, [r1]\n\ + strb r0, [r1]\n\ _080EEB28:\n\ - ldr r4, _080EEB5C @ =gSharedMem\n\ - ldr r1, _080EEB60 @ =0x00006e14\n\ - adds r0, r4, r1\n\ - ldrb r0, [r0]\n\ - bl sub_80F1B8C\n\ - ldr r2, _080EEB64 @ =0x00006e16\n\ - adds r4, r2\n\ - ldrb r0, [r4]\n\ - adds r0, 0x1\n\ - strb r0, [r4]\n\ + ldr r4, _080EEB5C @ =gSharedMem\n\ + ldr r1, _080EEB60 @ =0x00006e14\n\ + adds r0, r4, r1\n\ + ldrb r0, [r0]\n\ + bl sub_80F1B8C\n\ + ldr r2, _080EEB64 @ =0x00006e16\n\ + adds r4, r2\n\ + ldrb r0, [r4]\n\ + adds r0, 0x1\n\ + strb r0, [r4]\n\ _080EEB3E:\n\ - ldr r4, _080EEB5C @ =gSharedMem\n\ - ldr r1, _080EEB60 @ =0x00006e14\n\ - adds r0, r4, r1\n\ - ldrb r0, [r0]\n\ - bl sub_80F1BC8\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _080EEC08\n\ - ldr r2, _080EEB64 @ =0x00006e16\n\ - adds r1, r4, r2\n\ - b _080EEB76\n\ - .align 2, 0\n\ + ldr r4, _080EEB5C @ =gSharedMem\n\ + ldr r1, _080EEB60 @ =0x00006e14\n\ + adds r0, r4, r1\n\ + ldrb r0, [r0]\n\ + bl sub_80F1BC8\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _080EEC08\n\ + ldr r2, _080EEB64 @ =0x00006e16\n\ + adds r1, r4, r2\n\ + b _080EEB76\n\ + .align 2, 0\n\ _080EEB58: .4byte 0x00006dae\n\ _080EEB5C: .4byte gSharedMem\n\ _080EEB60: .4byte 0x00006e14\n\ _080EEB64: .4byte 0x00006e16\n\ _080EEB68:\n\ - bl sub_8055870\n\ - cmp r0, 0\n\ - bne _080EEC08\n\ - ldr r1, _080EEB80 @ =gSharedMem\n\ - ldr r4, _080EEB84 @ =0x00006e16\n\ - adds r1, r4\n\ + bl sub_8055870\n\ + cmp r0, 0\n\ + bne _080EEC08\n\ + ldr r1, _080EEB80 @ =gSharedMem\n\ + ldr r4, _080EEB84 @ =0x00006e16\n\ + adds r1, r4\n\ _080EEB76:\n\ - ldrb r0, [r1]\n\ - adds r0, 0x1\n\ - strb r0, [r1]\n\ - b _080EEC08\n\ - .align 2, 0\n\ + ldrb r0, [r1]\n\ + adds r0, 0x1\n\ + strb r0, [r1]\n\ + b _080EEC08\n\ + .align 2, 0\n\ _080EEB80: .4byte gSharedMem\n\ _080EEB84: .4byte 0x00006e16\n\ _080EEB88:\n\ - bl sub_80F1DF0\n\ - ldr r4, _080EEBA0 @ =gSharedMem\n\ - ldr r1, _080EEBA4 @ =0x00006e14\n\ - adds r0, r4, r1\n\ - ldrb r0, [r0]\n\ - bl sub_80EF490\n\ - ldr r2, _080EEBA8 @ =0x00006e16\n\ - adds r4, r2\n\ - b _080EEBCC\n\ - .align 2, 0\n\ + bl sub_80F1DF0\n\ + ldr r4, _080EEBA0 @ =gSharedMem\n\ + ldr r1, _080EEBA4 @ =0x00006e14\n\ + adds r0, r4, r1\n\ + ldrb r0, [r0]\n\ + bl sub_80EF490\n\ + ldr r2, _080EEBA8 @ =0x00006e16\n\ + adds r4, r2\n\ + b _080EEBCC\n\ + .align 2, 0\n\ _080EEBA0: .4byte gSharedMem\n\ _080EEBA4: .4byte 0x00006e14\n\ _080EEBA8: .4byte 0x00006e16\n\ _080EEBAC:\n\ - bl sub_80F1E50\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _080EEC08\n\ - ldr r4, _080EEBD4 @ =gSharedMem\n\ - ldr r1, _080EEBD8 @ =0x00006e14\n\ - adds r0, r4, r1\n\ - ldrb r0, [r0]\n\ - ldr r2, _080EEBDC @ =0x00006dad\n\ - adds r1, r4, r2\n\ - ldrb r1, [r1]\n\ - bl sub_80EF428\n\ - ldr r0, _080EEBE0 @ =0x00006e16\n\ - adds r4, r0\n\ + bl sub_80F1E50\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _080EEC08\n\ + ldr r4, _080EEBD4 @ =gSharedMem\n\ + ldr r1, _080EEBD8 @ =0x00006e14\n\ + adds r0, r4, r1\n\ + ldrb r0, [r0]\n\ + ldr r2, _080EEBDC @ =0x00006dad\n\ + adds r1, r4, r2\n\ + ldrb r1, [r1]\n\ + bl sub_80EF428\n\ + ldr r0, _080EEBE0 @ =0x00006e16\n\ + adds r4, r0\n\ _080EEBCC:\n\ - ldrb r0, [r4]\n\ - adds r0, 0x1\n\ - strb r0, [r4]\n\ - b _080EEC08\n\ - .align 2, 0\n\ + ldrb r0, [r4]\n\ + adds r0, 0x1\n\ + strb r0, [r4]\n\ + b _080EEC08\n\ + .align 2, 0\n\ _080EEBD4: .4byte gSharedMem\n\ _080EEBD8: .4byte 0x00006e14\n\ _080EEBDC: .4byte 0x00006dad\n\ _080EEBE0: .4byte 0x00006e16\n\ _080EEBE4:\n\ - bl sub_80EF4F8\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _080EEC08\n\ - ldr r1, _080EEC00 @ =gSharedMem\n\ - ldr r2, _080EEC04 @ =0x00006e16\n\ - adds r1, r2\n\ - ldrb r0, [r1]\n\ - adds r0, 0x1\n\ - strb r0, [r1]\n\ + bl sub_80EF4F8\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _080EEC08\n\ + ldr r1, _080EEC00 @ =gSharedMem\n\ + ldr r2, _080EEC04 @ =0x00006e16\n\ + adds r1, r2\n\ + ldrb r0, [r1]\n\ + adds r0, 0x1\n\ + strb r0, [r1]\n\ _080EEBFA:\n\ - movs r0, 0\n\ - b _080EEC0A\n\ - .align 2, 0\n\ + movs r0, 0\n\ + b _080EEC0A\n\ + .align 2, 0\n\ _080EEC00: .4byte gSharedMem\n\ _080EEC04: .4byte 0x00006e16\n\ _080EEC08:\n\ - movs r0, 0x1\n\ + movs r0, 0x1\n\ _080EEC0A:\n\ - pop {r4}\n\ - pop {r1}\n\ - bx r1\n" + pop {r4}\n\ + pop {r1}\n\ + bx r1\n" - ); + ); } #endif // var6dad and var6dae must be s8 in this func -bool8 sub_80EEC10() { - if (gMain.newKeys & 0x40) { - do { - if (--ewram0_11.var6dad < 0) { - ewram0_11.var6dad = ewram0_11.var6dae - 1; - } - - } while (!ewram0_10.var6db2[ewram0_11.var6dad]); - return 1; - } - if (gMain.newKeys & 0x80) { - do { - if (++ewram0_11.var6dad >= ewram0_11.var6dae) { - ewram0_11.var6dad = 0; - } - } while (!ewram0_10.var6db2[ewram0_11.var6dad]); - return 1; - } - return 0; +bool8 sub_80EEC10() +{ + if (gMain.newKeys & 0x40) + { + do + { + if (--ewram0_11.var6dad < 0) + ewram0_11.var6dad = ewram0_11.var6dae - 1; + } while (!ewram0_10.var6db2[ewram0_11.var6dad]); + return TRUE; + } + if (gMain.newKeys & 0x80) + { + do + { + if (++ewram0_11.var6dad >= ewram0_11.var6dae) + ewram0_11.var6dad = 0; + } while (!ewram0_10.var6db2[ewram0_11.var6dad]); + return TRUE; + } +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008264(gLink.recvQueue.count, 6, 10, 2, 4); +#endif + return FALSE; } -bool8 sub_80EEC90() { - if (gMain.newKeys & 0x40) { - if (--ewram0_11.var6dad < 0) { - ewram0_11.var6dad = ewram0_11.var6dae - 1; - } - return 1; - } - if (gMain.newKeys & 0x80) { - if (++ewram0_11.var6dad >= ewram0_11.var6dae) { - ewram0_11.var6dad = 0; - } - return 1; - } - return 0; +bool8 sub_80EEC90() +{ + if (gMain.newKeys & 0x40) + { + if (--ewram0_11.var6dad < 0) + ewram0_11.var6dad = ewram0_11.var6dae - 1; + return TRUE; + } + if (gMain.newKeys & 0x80) + { + if (++ewram0_11.var6dad >= ewram0_11.var6dae) + ewram0_11.var6dad = 0; + return TRUE; + } +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008264(gLink.recvQueue.count, 6, 10, 2, 4); +#endif + return FALSE; } -void sub_80EED0C() { - REG_DISPCNT = 512; +void sub_80EED0C() +{ + REG_DISPCNT = 512; } -void sub_80EED1C() { - REG_DISPCNT = 0x92 << 5; +void sub_80EED1C() +{ + REG_DISPCNT = 0x92 << 5; } -void sub_80EED2C(u8 param1) { - switch (param1) { - case 0: - REG_DISPCNT = 0xFA << 5; - break; - case 1: - REG_DISPCNT = 0x1741; - break; - case 3: - case 4: - REG_DISPCNT = 0xFA << 5; - break; - case 2: - REG_DISPCNT = 0x7b40; - break; - case 5: - REG_DISPCNT = 0xFD << 6; - break; - } +void sub_80EED2C(u8 param1) +{ + switch (param1) { + case 0: + REG_DISPCNT = 0xFA << 5; + break; + case 1: + REG_DISPCNT = 0x1741; + break; + case 3: + case 4: + REG_DISPCNT = 0xFA << 5; + break; + case 2: + REG_DISPCNT = 0x7b40; + break; + case 5: + REG_DISPCNT = 0xFD << 6; + break; + } } -void sub_80EED9C(void) { - gUnknown_03000744 = ewram0_10.var300; - ewram0_10.var300 = &sub_80EEDC4; - ewram0_10.var300(); +void sub_80EED9C(void) +{ + gUnknown_03000744 = ewram0_10.var300; + ewram0_10.var300 = &sub_80EEDC4; + ewram0_10.var300(); } -void sub_80EEDC4(void) { - if (sub_8055870() != 0x1) { - ewram0_10.var300 = gUnknown_03000744; - } +void sub_80EEDC4(void) +{ + if (sub_8055870() != 0x1) + ewram0_10.var300 = gUnknown_03000744; } -void sub_80EEDE8(void) { - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - REG_BG2VOFS = 0; - REG_BG2HOFS = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; +void sub_80EEDE8(void) +{ + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG2VOFS = 0; + REG_BG2HOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; } -void sub_80EEE08(void) { - gUnknown_083DFEC4->unkD160 = 0; +void sub_80EEE08(void) +{ + gUnknown_083DFEC4->unkD160 = 0; } -void sub_80EEE20(void) { - gUnknown_083DFEC4->unkD160 = 0; - if (!gUnknown_083DFEC4->unk6DAC) { - while (sub_80EEE54()); - } +void sub_80EEE20(void) +{ + gUnknown_083DFEC4->unkD160 = 0; + if (!gUnknown_083DFEC4->unk6DAC) + { + while (sub_80EEE54()) + ; + } } -bool8 sub_80EEE54(void) { - switch (gUnknown_083DFEC4->unkD160) { - case 0: - LZ77UnCompVram(gPokenavHoennMapMisc_Gfx, (void *)VRAM + 0xC000); - break; - case 1: - LZ77UnCompVram(gUnknown_08E99FB0, (void *)VRAM + 0xD800); - break; - case 2: - LoadPalette(gPokenavHoennMap1_Pal, 0x10, 0x20); - break; - case 3: - sub_80EF58C(0); - sub_80EF58C(1); - sub_80EF58C(2); - break; - case 4: - gUnknown_083DFEC4->unk030C.unk030C.unk0 = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG1CNT = 0x1B0C; - gUnknown_083DFEC4->unkD160++; - default: - return 0; - } - gUnknown_083DFEC4->unkD160++; - return 1; +bool8 sub_80EEE54(void) +{ + switch (gUnknown_083DFEC4->unkD160) + { + case 0: + LZ77UnCompVram(gPokenavHoennMapMisc_Gfx, (void *)VRAM + 0xC000); + break; + case 1: + LZ77UnCompVram(gUnknown_08E99FB0, (void *)VRAM + 0xD800); + break; + case 2: + LoadPalette(gPokenavHoennMap1_Pal, 0x10, 0x20); + break; + case 3: + sub_80EF58C(0); + sub_80EF58C(1); + sub_80EF58C(2); + break; + case 4: + gUnknown_083DFEC4->unk030C.unk030C.unk0 = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG1CNT = 0x1B0C; + gUnknown_083DFEC4->unkD160++; + default: + return FALSE; + } + gUnknown_083DFEC4->unkD160++; + return TRUE; } -bool8 sub_80EEF34(void) { - bool8 retVal = TRUE; +bool8 sub_80EEF34(void) +{ + bool8 retVal = TRUE; - if (gUnknown_083DFEC4->unk030C.unk030C.unk0 == 32) - { - return FALSE; - } + if (gUnknown_083DFEC4->unk030C.unk030C.unk0 == 32) + return FALSE; - gUnknown_083DFEC4->unk030C.unk030C.unk0 += 2; - if (gUnknown_083DFEC4->unk030C.unk030C.unk0 > 31) - { - gUnknown_083DFEC4->unk030C.unk030C.unk0 = 32; - retVal = FALSE; - } + gUnknown_083DFEC4->unk030C.unk030C.unk0 += 2; + if (gUnknown_083DFEC4->unk030C.unk030C.unk0 > 31) + { + gUnknown_083DFEC4->unk030C.unk030C.unk0 = 32; + retVal = FALSE; + } - REG_BG1VOFS = gUnknown_083DFEC4->unk030C.unk030C.unk0; - return retVal; + REG_BG1VOFS = gUnknown_083DFEC4->unk030C.unk030C.unk0; + return retVal; } bool8 sub_80EEF78(void) { - bool8 retVal = TRUE; - - if (gUnknown_083DFEC4->unk030C.unk030C.unk0 == 0) - { - return FALSE; - } - - gUnknown_083DFEC4->unk030C.unk030C.unk0 -= 2; - if (gUnknown_083DFEC4->unk030C.unk030C.unk0 <= 0) - { - gUnknown_083DFEC4->unk030C.unk030C.unk0 = 0; - retVal = FALSE; - } - - REG_BG1VOFS = gUnknown_083DFEC4->unk030C.unk030C.unk0; - return retVal; + bool8 retVal = TRUE; + + if (gUnknown_083DFEC4->unk030C.unk030C.unk0 == 0) + return FALSE; + + gUnknown_083DFEC4->unk030C.unk030C.unk0 -= 2; + if (gUnknown_083DFEC4->unk030C.unk030C.unk0 <= 0) + { + gUnknown_083DFEC4->unk030C.unk030C.unk0 = 0; + retVal = FALSE; + } + + REG_BG1VOFS = gUnknown_083DFEC4->unk030C.unk030C.unk0; + return retVal; } void sub_80EEFBC(u8 a) { - u8 var1; + u8 var1; - sub_809D104((void *)VRAM + 0xD800, 0, 22, gUnknown_08E9A100, 0, 0, 17, 2); + sub_809D104((void *)VRAM + 0xD800, 0, 22, gUnknown_08E9A100, 0, 0, 17, 2); - switch (a) - { - case 0: - sub_809D104((void *)VRAM + 0xD800, 0, 22, gUnknown_08E9A100, 17, 0, 10, 2); - sub_809D104((void *)VRAM + 0xD800, 10, 22, gUnknown_08E9A100, 0, 6, 7, 2); - break; - case 11: - sub_809D104((void *)VRAM + 0xD800, 8, 22, gUnknown_08E9A100, 0, 6, 7, 2); - break; - case 2: - var1 = gUnknown_083DFEC4->unk6DAC; - if (!var1) - { - sub_809D104((void *)VRAM + 0xD800, 0, 22, gUnknown_08E9A100, 10, 2, 10, 2); - sub_809D104((void *)VRAM + 0xD800, 10, 22, gUnknown_08E9A100, var1, 6, 7, 2); - } - else - { - sub_809D104((void *)VRAM + 0xD800, 10, 22, gUnknown_08E9A100, 0, 6, 7, 2); - } - break; - case 3: - sub_809D104((void *)VRAM + 0xD800, 0, 22, gUnknown_08E9A100, 0, 4, 10, 2); - sub_809D104((void *)VRAM + 0xD800, 10, 22, gUnknown_08E9A100, 0, 6, 7, 2); - break; - case 4: - sub_809D104((void *)VRAM + 0xD800, 0, 22, gUnknown_08E9A100, 20, 2, 10, 2); - sub_809D104((void *)VRAM + 0xD800, 10, 22, gUnknown_08E9A100, 0, 6, 7, 2); - break; - case 7: - sub_809D104((void *)VRAM + 0xD800, 0, 22, gUnknown_08E9A100, 10, 4, 10, 2); - sub_809D104((void *)VRAM + 0xD800, 7, 22, gUnknown_08E9A100, 0, 6, 7, 2); - break; - case 8: - sub_809D104((void *)VRAM + 0xD800, 0, 22, gUnknown_08E9A100, 20, 4, 10, 2); - sub_809D104((void *)VRAM + 0xD800, 7, 22, gUnknown_08E9A100, 0, 6, 7, 2); - break; - case 5: - case 9: - sub_809D104((void *)VRAM + 0xD800, 0, 22, gUnknown_08E9A100, 0, 2, 10, 2); - sub_809D104((void *)VRAM + 0xD800, 8, 22, gUnknown_08E9A100, 0, 6, 7, 2); - break; - case 10: - sub_809D104((void *)VRAM + 0xD800, 8, 22, gUnknown_08E9A100, 0, 6, 7, 2); - break; - } + switch (a) + { + case 0: + sub_809D104((void *)VRAM + 0xD800, 0, 22, gUnknown_08E9A100, 17, 0, 10, 2); + sub_809D104((void *)VRAM + 0xD800, 10, 22, gUnknown_08E9A100, 0, 6, 7, 2); + break; + case 11: + sub_809D104((void *)VRAM + 0xD800, 8, 22, gUnknown_08E9A100, 0, 6, 7, 2); + break; + case 2: + var1 = gUnknown_083DFEC4->unk6DAC; + if (!var1) + { + sub_809D104((void *)VRAM + 0xD800, 0, 22, gUnknown_08E9A100, 10, 2, 10, 2); + sub_809D104((void *)VRAM + 0xD800, 10, 22, gUnknown_08E9A100, var1, 6, 7, 2); + } + else + { + sub_809D104((void *)VRAM + 0xD800, 10, 22, gUnknown_08E9A100, 0, 6, 7, 2); + } + break; + case 3: + sub_809D104((void *)VRAM + 0xD800, 0, 22, gUnknown_08E9A100, 0, 4, 10, 2); + sub_809D104((void *)VRAM + 0xD800, 10, 22, gUnknown_08E9A100, 0, 6, 7, 2); + break; + case 4: + sub_809D104((void *)VRAM + 0xD800, 0, 22, gUnknown_08E9A100, 20, 2, 10, 2); + sub_809D104((void *)VRAM + 0xD800, 10, 22, gUnknown_08E9A100, 0, 6, 7, 2); + break; + case 7: + sub_809D104((void *)VRAM + 0xD800, 0, 22, gUnknown_08E9A100, 10, 4, 10, 2); + sub_809D104((void *)VRAM + 0xD800, 7, 22, gUnknown_08E9A100, 0, 6, 7, 2); + break; + case 8: + sub_809D104((void *)VRAM + 0xD800, 0, 22, gUnknown_08E9A100, 20, 4, 10, 2); + sub_809D104((void *)VRAM + 0xD800, 7, 22, gUnknown_08E9A100, 0, 6, 7, 2); + break; + case 5: + case 9: + sub_809D104((void *)VRAM + 0xD800, 0, 22, gUnknown_08E9A100, 0, 2, 10, 2); + sub_809D104((void *)VRAM + 0xD800, 8, 22, gUnknown_08E9A100, 0, 6, 7, 2); + break; + case 10: + sub_809D104((void *)VRAM + 0xD800, 8, 22, gUnknown_08E9A100, 0, 6, 7, 2); + break; + } } void sub_80EF248(u8 a) { - gUnknown_083DFEC4->unkD160 = 0; + gUnknown_083DFEC4->unkD160 = 0; - if (!gUnknown_083DFEC4->unk6DAC) - { - while (sub_80EF284(a)); - } + if (!gUnknown_083DFEC4->unk6DAC) + { + while (sub_80EF284(a)) + ; + } } bool8 sub_80EF284(u8 a) { - switch (gUnknown_083DFEC4->unkD160) - { - case 0: - sub_80EEDE8(); - break; - case 1: - SetUpWindowConfig(&gWindowConfig_81E7224); - break; - case 2: - MultistepInitMenuWindowBegin(&gWindowConfig_81E7224); - break; - case 3: - if (!MultistepInitMenuWindowContinue()) - { - return TRUE; - } - break; - case 4: - DmaCopy16Defvars(3, gUnknown_083DFEEC, (void *)VRAM + 0x5000, 0xA0); - break; - case 5: - LZ77UnCompVram(gUnknown_083DFF8C, (void *)VRAM + 0xF800); - break; - case 6: - DmaCopy16Defvars(3, gUnknown_083E005C, (void *)VRAM + 0x8000, 0x20); - break; - case 7: - LZ77UnCompVram(gUnknown_083E007C, (void *)VRAM + 0xE000); - break; - case 8: - LZ77UnCompVram(gPokenavOutlineTilemap, (void *)VRAM + 0xE800); - break; - case 9: - LZ77UnCompVram(gPokenavOutlineTiles, (void *)VRAM + 0x8020); - break; - case 10: - sub_80EF54C(a); - LoadPalette(gUnknown_083DFECC, 0xF0, 0x20); - LoadPalette(gPokenavOutlinePalette, 0x40, 0x20); - sub_80EF7D4(); - break; - case 11: - REG_BG0CNT = 0x1F01; - REG_BG2CNT = 0x1D0A; - REG_BG3CNT = 0x1C0B; - REG_BLDCNT = 0; - - gUnknown_083DFEC4->unkD160++; - return FALSE; - default: - return FALSE; - } - - gUnknown_083DFEC4->unkD160++; - return TRUE; + switch (gUnknown_083DFEC4->unkD160) + { + case 0: + sub_80EEDE8(); + break; + case 1: + Text_LoadWindowTemplate(&gWindowTemplate_81E7224); + break; + case 2: + MultistepInitMenuWindowBegin(&gWindowTemplate_81E7224); + break; + case 3: + if (!MultistepInitMenuWindowContinue()) + return TRUE; + break; + case 4: + DmaCopy16Defvars(3, gUnknown_083DFEEC, (void *)VRAM + 0x5000, 0xA0); + break; + case 5: + LZ77UnCompVram(gUnknown_083DFF8C, (void *)VRAM + 0xF800); + break; + case 6: + DmaCopy16Defvars(3, gUnknown_083E005C, (void *)VRAM + 0x8000, 0x20); + break; + case 7: + LZ77UnCompVram(gUnknown_083E007C, (void *)VRAM + 0xE000); + break; + case 8: + LZ77UnCompVram(gPokenavOutlineTilemap, (void *)VRAM + 0xE800); + break; + case 9: + LZ77UnCompVram(gPokenavOutlineTiles, (void *)VRAM + 0x8020); + break; + case 10: + sub_80EF54C(a); + LoadPalette(gUnknown_083DFECC, 0xF0, 0x20); + LoadPalette(gPokenavOutlinePalette, 0x40, 0x20); + sub_80EF7D4(); + break; + case 11: + REG_BG0CNT = 0x1F01; + REG_BG2CNT = 0x1D0A; + REG_BG3CNT = 0x1C0B; + REG_BLDCNT = 0; + + gUnknown_083DFEC4->unkD160++; + return FALSE; + default: + return FALSE; + } + + gUnknown_083DFEC4->unkD160++; + return TRUE; } void sub_80EF428(u8 a, u8 b) { - u8 *tileBuffer; - const u8 *pcText = 0; + u8 *tileBuffer; + const u8 *pcText = 0; - switch (a) - { - case 0: - pcText = gUnknown_083E31B0[b]; - break; - case 1: - pcText = gUnknown_083E31CC[b]; - break; - case 2: - pcText = gUnknown_083E31D8[b]; - break; - } + switch (a) + { + case 0: + pcText = gUnknown_083E31B0[b]; + break; + case 1: + pcText = gUnknown_083E31CC[b]; + break; + case 2: + pcText = gUnknown_083E31D8[b]; + break; + } - tileBuffer = gUnknown_083DFEC8; - sub_8072C74(&tileBuffer[0x800], pcText, 0xC0, 2); - MenuPrint(&tileBuffer[0x800], 3, 17); + tileBuffer = gUnknown_083DFEC8; + sub_8072C74(&tileBuffer[0x800], pcText, 0xC0, 2); + Menu_PrintText(&tileBuffer[0x800], 3, 17); } void sub_80EF490(u8 a) { - u16 var1, var2; - - if (a == 2) - { - a = 1; - } - - gUnknown_083DFEC4->unkCE4E = a * 30; - var1 = gUnknown_083DFEC4->unkCE4C; - var2 = a * 30; - if (var1 < var2) - { - gUnknown_083DFEC4->unkCE50 = 2; - } - else if (var1 > var2) - { - gUnknown_083DFEC4->unkCE50 = -2; - } - else - { - gUnknown_083DFEC4->unkCE50 = 0; - } + u16 var1, var2; + + if (a == 2) + a = 1; + + gUnknown_083DFEC4->unkCE4E = a * 30; + var1 = gUnknown_083DFEC4->unkCE4C; + var2 = a * 30; + if (var1 < var2) + gUnknown_083DFEC4->unkCE50 = 2; + else if (var1 > var2) + gUnknown_083DFEC4->unkCE50 = -2; + else + gUnknown_083DFEC4->unkCE50 = 0; } bool8 sub_80EF4F8(void) { - u16 *palettes; + u16 *palettes; - if (gUnknown_083DFEC4->unkCE4C == gUnknown_083DFEC4->unkCE4E) - { - return FALSE; - } - else - { - gUnknown_083DFEC4->unkCE4C = gUnknown_083DFEC4->unkCE50 + gUnknown_083DFEC4->unkCE4C; + if (gUnknown_083DFEC4->unkCE4C == gUnknown_083DFEC4->unkCE4E) + { + return FALSE; + } + else + { + gUnknown_083DFEC4->unkCE4C = gUnknown_083DFEC4->unkCE50 + gUnknown_083DFEC4->unkCE4C; - palettes = gUnknown_083DFEC4->palettesCE52; - LoadPalette(&palettes[gUnknown_083DFEC4->unkCE4C], 0x31, 4); - return TRUE; - } + palettes = gUnknown_083DFEC4->palettesCE52; + LoadPalette(&palettes[gUnknown_083DFEC4->unkCE4C], 0x31, 4); + return TRUE; + } } void sub_80EF54C(u8 a) { - if (a == 2) - { - a = 1; - } + if (a == 2) + a = 1; - gUnknown_083DFEC4->unkCE4C = a * 30; - LoadPalette(&gUnknown_083DFEC4->palettesCE52[gUnknown_083DFEC4->unkCE4C], 0x31, 4); + gUnknown_083DFEC4->unkCE4C = a * 30; + LoadPalette(&gUnknown_083DFEC4->palettesCE52[gUnknown_083DFEC4->unkCE4C], 0x31, 4); } void sub_80EF58C(u8 a) { - u16 i; - u16 * palettes; - const u16 *var1; - - switch (a) - { - case 0: - for (i = 0; i < 62; i++) - { - gUnknown_083DFEC4->palettesCE52[i] = 0; - } - break; - case 1: - palettes = gUnknown_083DFEC4->palettesCE52; - var1 = gUnknown_083E003C; - sub_80EF624(&var1[1], &var1[3], 16, 2, palettes); - break; - case 2: - palettes = gUnknown_083DFEC4->palettesCE8E; - var1 = gUnknown_083E003C; - sub_80EF624(&var1[3], &var1[7], 16, 2, palettes); - break; - } + u16 i; + u16 * palettes; + const u16 *var1; + + switch (a) + { + case 0: + for (i = 0; i < 62; i++) + gUnknown_083DFEC4->palettesCE52[i] = 0; + break; + case 1: + palettes = gUnknown_083DFEC4->palettesCE52; + var1 = gUnknown_083E003C; + sub_80EF624(&var1[1], &var1[3], 16, 2, palettes); + break; + case 2: + palettes = gUnknown_083DFEC4->palettesCE8E; + var1 = gUnknown_083E003C; + sub_80EF624(&var1[3], &var1[7], 16, 2, palettes); + break; + } } #ifdef NONMATCHING void sub_80EF624(const u16 *a, const u16 *b, u8 c, u8 d, u16 *palettes) { - u16 red1, green1, blue1; - u16 red2, green2, blue2; - s32 redDiv, greenDiv, blueDiv; - u16 *palettes2; - u16 i, j; - - i = 0; - while (i < d) - { - red1 = (*a & 0x1F) << 8; - green1 = ((*a >> 5) & 0x1F) << 8; - blue1 = ((*a >> 10) & 0x1F) << 8; - - red2 = (*b & 0x1F) << 8; - green2 = ((*b >> 5) & 0x1F) << 8; - blue2 = ((*b >> 10) & 0x1F) << 8; - - redDiv = (red2 - red1) / c; - greenDiv = (green2 - green1) / c; - blueDiv = (blue2 - blue1) / c; - - palettes2 = palettes; - for (j = 0; j < c - 1; j++) - { - *palettes2 = (((blue1 << 8) >> 16) << 10) | (((green1 << 8) >> 16) << 5) | ((red1 << 8) >> 16); - palettes2 += d; - red1 += redDiv; - green1 += greenDiv; - blue1 += blueDiv; - } + u16 red1, green1, blue1; + u16 red2, green2, blue2; + s32 redDiv, greenDiv, blueDiv; + u16 *palettes2; + u16 i, j; + + i = 0; + while (i < d) + { + red1 = (*a & 0x1F) << 8; + green1 = ((*a >> 5) & 0x1F) << 8; + blue1 = ((*a >> 10) & 0x1F) << 8; + + red2 = (*b & 0x1F) << 8; + green2 = ((*b >> 5) & 0x1F) << 8; + blue2 = ((*b >> 10) & 0x1F) << 8; + + redDiv = (red2 - red1) / c; + greenDiv = (green2 - green1) / c; + blueDiv = (blue2 - blue1) / c; + + palettes2 = palettes; + for (j = 0; j < c - 1; j++) + { + *palettes2 = (((blue1 << 8) >> 16) << 10) | (((green1 << 8) >> 16) << 5) | ((red1 << 8) >> 16); + palettes2 += d; + red1 += redDiv; + green1 += greenDiv; + blue1 += blueDiv; + } - *palettes2 = (red2 >> 8) | (blue2 << 2) | (green2 >> 3); - palettes++; + *palettes2 = (red2 >> 8) | (blue2 << 2) | (green2 >> 3); + palettes++; - a++; - b++; - i++; - } + a++; + b++; + i++; + } } #else __attribute__((naked)) @@ -3430,151 +4121,142 @@ _080EF72E:\n\ void sub_80EF740(void) { - gUnknown_083DFEC4->unk6DA0 = (gUnknown_083DFEC4->unk6DA0 + 1) & 1; - if (gUnknown_083DFEC4->unk6DA0) - { - gUnknown_083DFEC4->unk6DA2++; - } + gUnknown_083DFEC4->unk6DA0 = (gUnknown_083DFEC4->unk6DA0 + 1) & 1; + if (gUnknown_083DFEC4->unk6DA0) + gUnknown_083DFEC4->unk6DA2++; - REG_BG3HOFS = gUnknown_083DFEC4->unk6DA2; + REG_BG3HOFS = gUnknown_083DFEC4->unk6DA2; } void sub_80EF780(u8 taskId) { - if (gTasks[taskId].data[0] == 0 || (gUnknown_083DFEC4->unk6DA2 & 0x7) != 0) - { - sub_80EF740(); - } - else - { - u16 value = gUnknown_083DFEC4->unk6DA2 & 0x7; - gUnknown_083DFEC4->unk6DA2 = value; - gUnknown_083DFEC4->unk6DA0 = value; - REG_BG3HOFS = value; - } + if (gTasks[taskId].data[0] == 0 || (gUnknown_083DFEC4->unk6DA2 & 0x7) != 0) + { + sub_80EF740(); + } + else + { + u16 value = gUnknown_083DFEC4->unk6DA2 & 0x7; + gUnknown_083DFEC4->unk6DA2 = value; + gUnknown_083DFEC4->unk6DA0 = value; + REG_BG3HOFS = value; + } } void sub_80EF7D4(void) { - gUnknown_083DFEC4->unk6DA2 = 0; - gUnknown_083DFEC4->unk6DA0 = 0; - gUnknown_083DFEC4->taskId6DA4 = CreateTask(sub_80EF780, 80); + gUnknown_083DFEC4->unk6DA2 = 0; + gUnknown_083DFEC4->unk6DA0 = 0; + gUnknown_083DFEC4->taskId6DA4 = CreateTask(sub_80EF780, 80); } void sub_80EF814(void) { - if (FuncIsActiveTask(sub_80EF780)) - { - DestroyTask(gUnknown_083DFEC4->taskId6DA4); - } + if (FuncIsActiveTask(sub_80EF780)) + DestroyTask(gUnknown_083DFEC4->taskId6DA4); } void sub_80EF840(void) { - gUnknown_083DFEC4->unkD160 = 0; + gUnknown_083DFEC4->unkD160 = 0; - if (gUnknown_083DFEC4->unk6DAC == 0) - { - while (sub_80EF874() != 0); - } + if (gUnknown_083DFEC4->unk6DAC == 0) + { + while (sub_80EF874() != 0) + ; + } } bool8 sub_80EF874(void) { - switch (gUnknown_083DFEC4->unkD160) - { - case 0: - sub_80EEDE8(); - break; - case 1: - SetUpWindowConfig(&gWindowConfig_81E7224); - break; - case 2: - MultistepInitMenuWindowBegin(&gWindowConfig_81E7224); - break; - case 3: - if (!MultistepInitMenuWindowContinue()) - { - return TRUE; - } - break; - case 4: - MenuZeroFillScreen(); - break; - case 5: - sub_80FA904(&gUnknown_083DFEC4->regionMap, gSaveBlock2.regionMapZoom ? TRUE : FALSE); - break; - case 6: - if (sub_80FA940()) - { - return TRUE; - } - break; - case 7: - LZ77UnCompVram(gPokenavHoennMapSquares_Gfx, (void *)VRAM + 0x5000); - break; - case 8: - LoadPalette(gPokenavHoennMapSquares_Pal, 0x30, 0x20); - sub_80EFC3C(); - break; - case 9: - if (sub_80EFC64()) - { - return TRUE; - } - break; - case 10: - MenuDrawTextWindow(13, 3, 29, 17); - sub_80EF9F8(); - break; - case 11: - if (!gUnknown_083DFEC4->regionMap.zoomed) - { - gUnknown_083DFEC4->unk7698 = 160; - REG_BG0VOFS = 160; - } - else - { - gUnknown_083DFEC4->unk7698 = 256; - REG_BG0VOFS = 0; - } + switch (gUnknown_083DFEC4->unkD160) + { + case 0: + sub_80EEDE8(); + break; + case 1: + Text_LoadWindowTemplate(&gWindowTemplate_81E7224); + break; + case 2: + MultistepInitMenuWindowBegin(&gWindowTemplate_81E7224); + break; + case 3: + if (!MultistepInitMenuWindowContinue()) + return TRUE; + break; + case 4: + Menu_EraseScreen(); + break; + case 5: + sub_80FA904(&gUnknown_083DFEC4->regionMap, gSaveBlock2.regionMapZoom ? TRUE : FALSE); + break; + case 6: + if (sub_80FA940()) + return TRUE; + break; + case 7: + LZ77UnCompVram(gPokenavHoennMapSquares_Gfx, (void *)VRAM + 0x5000); + break; + case 8: + LoadPalette(gPokenavHoennMapSquares_Pal, 0x30, 0x20); + sub_80EFC3C(); + break; + case 9: + if (sub_80EFC64()) + return TRUE; + break; + case 10: + Menu_DrawStdWindowFrame(13, 3, 29, 17); + sub_80EF9F8(); + break; + case 11: + if (!gUnknown_083DFEC4->regionMap.zoomed) + { + gUnknown_083DFEC4->unk7698 = 160; + REG_BG0VOFS = 160; + } + else + { + gUnknown_083DFEC4->unk7698 = 256; + REG_BG0VOFS = 0; + } - REG_BG0CNT = REG_BG0CNT; - REG_BG0CNT |= 1; - REG_BLDCNT = 0; - break; - default: - return FALSE; - } + REG_BG0CNT = REG_BG0CNT; + REG_BG0CNT |= 1; + REG_BLDCNT = 0; + break; + default: + return FALSE; + } - gUnknown_083DFEC4->unkD160++; - return TRUE; + gUnknown_083DFEC4->unkD160++; + return TRUE; } asm(".include \"constants/gba_constants.inc\"\n"); void sub_80EF9F8(void) { - bool8 someBool = FALSE; + bool8 someBool = FALSE; u16 top = 4; - u16 mapSectionId; - u8 b; + u16 mapSectionId; + u8 b; - switch (gUnknown_083DFEC4->regionMap.unk16) - { + switch (gUnknown_083DFEC4->regionMap.unk16) + { case 0: break; - case 1: - case 4: - sub_8072A18(gUnknown_083DFEC4->regionMap.mapSectionName, 0x70, top * 8, 0x78, 1); - top += 2; - if (gLinkOpen == TRUE) - { - sub_80F1A80(); + case 1: + case 4: + sub_8072A18(gUnknown_083DFEC4->regionMap.mapSectionName, 0x70, top * 8, 0x78, 1); + top += 2; + if (gLinkOpen == TRUE) + { + sub_80F1A80(); someBool = TRUE; - } - else - { + } + else + { u16 i; for (i = 0; i < 4; i++) @@ -3589,99 +4271,95 @@ void sub_80EF9F8(void) sub_8072A18(secName, 0x70, top * 8, 0x78, 1); top += 2; } - } - break; - case 2: - sub_8072A18(gUnknown_083DFEC4->regionMap.mapSectionName, 0x70, top * 8, 0x78, 1); - top += 2; - mapSectionId = gUnknown_083DFEC4->regionMap.mapSectionId; + } + break; + case 2: + sub_8072A18(gUnknown_083DFEC4->regionMap.mapSectionName, 0x70, top * 8, 0x78, 1); + top += 2; + mapSectionId = gUnknown_083DFEC4->regionMap.mapSectionId; b = gUnknown_083DFEC4->regionMap.everGrandeCityArea; if (gUnknown_083DFEC4->unkCDCC[mapSectionId][b] != NULL) - { - MenuFillWindowRectWithBlankTile(14, top, 15, 15); - MenuFillWindowRectWithBlankTile(26, top, 28, 15); - sub_8095C8C((void *)(VRAM + 0xF800), 16, 6, gUnknown_083DFEC4->unkCDCC[mapSectionId][b], 0, 0, 10, 10, 10); - top += 11; - } - break; - case 3: - sub_8072A18(gUnknown_083DFEC4->regionMap.mapSectionName, 0x70, top * 8, 0x78, 1); - top += 2; - break; - } + { + Menu_BlankWindowRect(14, top, 15, 15); + Menu_BlankWindowRect(26, top, 28, 15); + sub_8095C8C((void *)(VRAM + 0xF800), 16, 6, gUnknown_083DFEC4->unkCDCC[mapSectionId][b], 0, 0, 10, 10, 10); + top += 11; + } + break; + case 3: + sub_8072A18(gUnknown_083DFEC4->regionMap.mapSectionName, 0x70, top * 8, 0x78, 1); + top += 2; + break; + } // Epic fail by the compiler at optimizing this. if (!someBool && top < 16) - MenuFillWindowRectWithBlankTile(14, top, 28, 15); + Menu_BlankWindowRect(14, top, 28, 15); - if (gUnknown_083DFEC4->regionMap.unk16 == 2) - sub_80EFD74(); - else - sub_80EFDA0(); + if (gUnknown_083DFEC4->regionMap.unk16 == 2) + sub_80EFD74(); + else + sub_80EFDA0(); } void sub_80EFBB0(void) { - if (!gUnknown_083DFEC4->regionMap.zoomed) - { - sub_80EEFBC(8); - } - else - { - sub_80EEFBC(7); - } + if (!gUnknown_083DFEC4->regionMap.zoomed) + sub_80EEFBC(8); + else + sub_80EEFBC(7); } bool8 sub_80EFBDC(bool8 a) { - bool8 retVal = TRUE; - u16 var1 = gUnknown_083DFEC4->unk7698; + bool8 retVal = TRUE; + u16 var1 = gUnknown_083DFEC4->unk7698; - if (a) - { - if (var1 > 168) - { - var1 = var1 - 8; - } - else - { - var1 = 160; - retVal = FALSE; - } - } - else - { - if (var1 < 248) - { - var1 = var1 + 8; - } - else - { - var1 = 256; - retVal = FALSE; - } - } + if (a) + { + if (var1 > 168) + { + var1 = var1 - 8; + } + else + { + var1 = 160; + retVal = FALSE; + } + } + else + { + if (var1 < 248) + { + var1 = var1 + 8; + } + else + { + var1 = 256; + retVal = FALSE; + } + } - gUnknown_083DFEC4->unk7698 = var1; - REG_BG0VOFS = var1 & 0xFF; + gUnknown_083DFEC4->unk7698 = var1; + REG_BG0VOFS = var1 & 0xFF; - return retVal; + return retVal; } void sub_80EFC3C(void) { - gUnknown_083DFEC4->unkBC9A = 0; - gUnknown_083DFEC4->unkBC9B = 0; - sub_80EFD3C(); + gUnknown_083DFEC4->unkBC9A = 0; + gUnknown_083DFEC4->unkBC9B = 0; + sub_80EFD3C(); } bool8 sub_80EFC64(void) { - u16 i; - u8 var1; - u16 var2; + u16 i; + u8 var1; + u16 var2; - if (gUnknown_083DFEC4->unkBC9A >= 16) + if (gUnknown_083DFEC4->unkBC9A >= 16) return FALSE; var1 = gUnknown_083DFEC4->unkBC9A; @@ -3709,345 +4387,330 @@ bool8 sub_80EFC64(void) void sub_80EFD3C(void) { - gUnknown_083DFEC4->unk769E = 0; - gUnknown_083DFEC4->unk769C = 47; - gUnknown_083DFEC4->unk769D = 0; - gUnknown_083DFEC4->unk769A = 0; + gUnknown_083DFEC4->unk769E = 0; + gUnknown_083DFEC4->unk769C = 47; + gUnknown_083DFEC4->unk769D = 0; + gUnknown_083DFEC4->unk769A = 0; } void sub_80EFD74(void) { - gUnknown_083DFEC4->unk769E = 1; - - if (gUnknown_083DFEC4->unk769D == 1) - { - gUnknown_083DFEC4->unk769D = 2; - } + gUnknown_083DFEC4->unk769E = 1; + if (gUnknown_083DFEC4->unk769D == 1) + gUnknown_083DFEC4->unk769D = 2; } void sub_80EFDA0(void) { - sub_8095C8C((void *)VRAM + 0xF800, 14, 16, gUnknown_08E9AC2C, 0, 0, 15, 1, 15); - gUnknown_083DFEC4->unk769E = 0; + sub_8095C8C((void *)VRAM + 0xF800, 14, 16, gUnknown_08E9AC2C, 0, 0, 15, 1, 15); + gUnknown_083DFEC4->unk769E = 0; } void sub_80EFDE4(u8 param0) { - u16 var1 = 60 - gUnknown_083DFEC4->unk769C; + u16 var1 = 60 - gUnknown_083DFEC4->unk769C; - if (var1 > 15) - { - var1 = 15; - } + if (var1 > 15) + var1 = 15; - if (gUnknown_083DFEC4->unk769E != 0) - { - sub_8095C8C((void *)VRAM + 0xF800, 14, 16, gUnknown_08E9ABB4, gUnknown_083DFEC4->unk769C, 0, var1, 1, 60); + if (gUnknown_083DFEC4->unk769E != 0) + { + sub_8095C8C((void *)VRAM + 0xF800, 14, 16, gUnknown_08E9ABB4, gUnknown_083DFEC4->unk769C, 0, var1, 1, 60); - if (var1 < 15) - { - u16 var2 = var1 + 14; + if (var1 < 15) + { + u16 var2 = var1 + 14; - sub_8095C8C((void *)VRAM + 0xF800, var2, 16, gUnknown_08E9ABB4, 0, 0, (u16)(15 - var1), 1, 60); - } - } + sub_8095C8C((void *)VRAM + 0xF800, var2, 16, gUnknown_08E9ABB4, 0, 0, (u16)(15 - var1), 1, 60); + } + } } void sub_80EFE7C(void) { - u16 var1; - u8 var2 = gUnknown_083DFEC4->unk769D; + u16 var1; + u8 var2 = gUnknown_083DFEC4->unk769D; - switch (var2) - { - case 0: - var1 = ++gUnknown_083DFEC4->unk769C; + switch (var2) + { + case 0: + var1 = ++gUnknown_083DFEC4->unk769C; - if (var1 > 59) - { - gUnknown_083DFEC4->unk769C = var2; - } + if (var1 > 59) + gUnknown_083DFEC4->unk769C = var2; - sub_80EFDE4(gUnknown_083DFEC4->unk769E); + sub_80EFDE4(gUnknown_083DFEC4->unk769E); - switch (gUnknown_083DFEC4->unk769C) - { - case 0: - case 15: - case 30: - case 45: - gUnknown_083DFEC4->unk769D = 1; - gUnknown_083DFEC4->unk769A = 0; - break; - } - break; - case 1: - var1 = ++gUnknown_083DFEC4->unk769A; - if (var1 > 120) - { - gUnknown_083DFEC4->unk769A = 0; - gUnknown_083DFEC4->unk769D = 0; - } - break; - case 2: - sub_80EFDE4(1); - gUnknown_083DFEC4->unk769D = 1; - break; - } + switch (gUnknown_083DFEC4->unk769C) + { + case 0: + case 15: + case 30: + case 45: + gUnknown_083DFEC4->unk769D = 1; + gUnknown_083DFEC4->unk769A = 0; + break; + } + break; + case 1: + var1 = ++gUnknown_083DFEC4->unk769A; + if (var1 > 120) + { + gUnknown_083DFEC4->unk769A = 0; + gUnknown_083DFEC4->unk769D = 0; + } + break; + case 2: + sub_80EFDE4(1); + gUnknown_083DFEC4->unk769D = 1; + break; + } } void sub_80EFF34(void) { - gUnknown_083DFEC4->unkD160 = 0; + gUnknown_083DFEC4->unkD160 = 0; - if (gUnknown_083DFEC4->unk6DAC == 0) - { - while (sub_80EFF68()); - } + if (gUnknown_083DFEC4->unk6DAC == 0) + { + while (sub_80EFF68()) + ; + } } bool8 sub_80EFF68(void) { - switch (gUnknown_083DFEC4->unkD160) - { - case 0: - sub_80EEDE8(); - gUnknown_083DFEC4->unkD162[0] = 11; - break; - case 1: - SetUpWindowConfig(&gWindowConfig_81E7080); - break; - case 2: - MultistepInitMenuWindowBegin(&gWindowConfig_81E7080); - break; - case 3: - if (!MultistepInitMenuWindowContinue()) - { - return TRUE; - } - break; - case 4: - MenuZeroFillScreen(); - break; - case 5: - sub_80F1614(); - break; - case 6: - if (sub_80F162C(0)) - { - return TRUE; - } - break; - case 7: - LZ77UnCompVram(gPokenavConditionView_Gfx, (void *)VRAM + 0x5000); - break; - case 8: - LZ77UnCompVram(gUnknown_08E9AC4C, (void *)VRAM + 0xF000); - LoadPalette(gPokenavConditionMenu2_Pal, 0x20, 0x20); - break; - case 9: - if (gUnknown_083DFEC4->unk76AA == 1) - { - sub_8095C8C((void *)VRAM + 0xF000, 0, 5, gUnknown_083E01AC, 0, 0, 9, 4, 9); - } - break; - case 10: - LZ77UnCompVram(gUnknown_08E9FEB4, (void *)VRAM + 0xB800); - break; - case 11: - LoadPalette(gUnknown_083E0254, 0x30, 0x20); - LoadPalette(gUnknownPalette_81E6692, 0xB0, 0x20); - LoadPalette(&gPokenavConditionMenu2_Pal[2], 0xB1, 0x2); - LoadPalette(&gPokenavConditionMenu2_Pal[16], 0xB5, 0x2); - LoadPalette(&gPokenavConditionMenu2_Pal[30], 0xBF, 0x2); - sub_80F01A4(); - break; - case 12: - sub_80F01E0((u16)gUnknown_083DFEC4->unk8fe9); - break; - case 13: - REG_BG3CNT = 0x1E03; - REG_BG2CNT = 0x1702; - REG_BLDCNT = 0x844; - REG_BLDALPHA = 0x40B; - break; - default: - return FALSE; - } + switch (gUnknown_083DFEC4->unkD160) + { + case 0: + sub_80EEDE8(); + gUnknown_083DFEC4->unkD162[0] = 11; + break; + case 1: + Text_LoadWindowTemplate(&gWindowTemplate_81E7080); + break; + case 2: + MultistepInitMenuWindowBegin(&gWindowTemplate_81E7080); + break; + case 3: + if (!MultistepInitMenuWindowContinue()) + return TRUE; + break; + case 4: + Menu_EraseScreen(); + break; + case 5: + sub_80F1614(); + break; + case 6: + if (sub_80F162C(0)) + return TRUE; + break; + case 7: + LZ77UnCompVram(gPokenavConditionView_Gfx, (void *)VRAM + 0x5000); + break; + case 8: + LZ77UnCompVram(gUnknown_08E9AC4C, (void *)VRAM + 0xF000); + LoadPalette(gPokenavConditionMenu2_Pal, 0x20, 0x20); + break; + case 9: + if (gUnknown_083DFEC4->unk76AA == 1) + sub_8095C8C((void *)VRAM + 0xF000, 0, 5, gUnknown_083E01AC, 0, 0, 9, 4, 9); + break; + case 10: + LZ77UnCompVram(gUnknown_08E9FEB4, (void *)VRAM + 0xB800); + break; + case 11: + LoadPalette(gUnknown_083E0254, 0x30, 0x20); + LoadPalette(gUnknownPalette_81E6692, 0xB0, 0x20); + LoadPalette(&gPokenavConditionMenu2_Pal[2], 0xB1, 0x2); + LoadPalette(&gPokenavConditionMenu2_Pal[16], 0xB5, 0x2); + LoadPalette(&gPokenavConditionMenu2_Pal[30], 0xBF, 0x2); + sub_80F01A4(); + break; + case 12: + sub_80F01E0((u16)gUnknown_083DFEC4->unk8fe9); + break; + case 13: + REG_BG3CNT = 0x1E03; + REG_BG2CNT = 0x1702; + REG_BLDCNT = 0x844; + REG_BLDALPHA = 0x40B; + break; + default: + return FALSE; + } - gUnknown_083DFEC4->unkD160++; - return TRUE; + gUnknown_083DFEC4->unkD160++; + return TRUE; } -void sub_80F0174(bool8 a) +void sub_80F0174(bool8 bg2on) { - if (a) - { - REG_DISPCNT |= DISPCNT_BG2_ON; - } - else - { - REG_DISPCNT &= ~DISPCNT_BG2_ON; - } + if (bg2on) + REG_DISPCNT |= DISPCNT_BG2_ON; + else + REG_DISPCNT &= ~DISPCNT_BG2_ON; } void sub_80F01A4(void) { - REG_WIN0H = WIN_RANGE(0, 240); - REG_WIN1H = WIN_RANGE(0, 155); - REG_WIN0V = WIN_RANGE(56, 121); - REG_WIN1V = WIN_RANGE(56, 121); - REG_WININ = 0x3F3F; - REG_WINOUT = 0x001B; + REG_WIN0H = WIN_RANGE(0, 240); + REG_WIN1H = WIN_RANGE(0, 155); + REG_WIN0V = WIN_RANGE(56, 121); + REG_WIN1V = WIN_RANGE(56, 121); + REG_WININ = 0x3F3F; + REG_WINOUT = 0x001B; } void sub_80F01E0(u16 a) { - MenuPrint(gUnknown_083DFEC4->unk8829[a], 13, 1); - - if (gUnknown_083DFEC4->unk76AA == 1) - { - MenuPrint(gUnknown_083DFEC4->unk88E9[a], 13, 3); - sub_80F443C(gUnknown_083DFEC4->unk8788, gUnknown_083DFEC4->unk893c[gUnknown_083DFEC4->unk87DC].unk2); - MenuPrint(gUnknown_083DFEC4->unk8788, 1, 6); - } + Menu_PrintText(gUnknown_083DFEC4->unk8829[a], 13, 1); + + if (gUnknown_083DFEC4->unk76AA == 1) + { + Menu_PrintText(gUnknown_083DFEC4->unk88E9[a], 13, 3); + sub_80F443C(gUnknown_083DFEC4->unk8788, gUnknown_083DFEC4->unk893c[gUnknown_083DFEC4->unk87DC].unk2); + Menu_PrintText(gUnknown_083DFEC4->unk8788, 1, 6); + } } void sub_80F0264(u8 a) { - gUnknown_083DFEC4->unk306 = 0; - gUnknown_083DFEC4->unk87CA = a; + gUnknown_083DFEC4->unk306 = 0; + gUnknown_083DFEC4->unk87CA = a; - if (gUnknown_083DFEC4->unk6DAC == 0) - { - while (sub_80F02A0()); - } + if (gUnknown_083DFEC4->unk6DAC == 0) + { + while (sub_80F02A0()) + ; + } } #ifdef NONMATCHING // small nonmatching part is in the third else clause in case 7. bool8 sub_80F02A0(void) { - const u16 *pointer; + const u16 *pointer; - switch (gUnknown_083DFEC4->unk306) - { - case 0: - sub_80EEDE8(); + switch (gUnknown_083DFEC4->unk306) + { + case 0: + sub_80EEDE8(); - gUnknown_083DFEC4->unk87C8 = gUnknown_083DFEC4->unk87CA == 1; - gUnknown_083DFEC4->unkD162[0] = 11; - break; - case 1: - SetUpWindowConfig(&gWindowConfig_81E70D4); - break; - case 2: - MultistepInitMenuWindowBegin(&gWindowConfig_81E70D4); - break; - case 3: - if (!MultistepInitMenuWindowContinue()) - { - return TRUE; - } - break; - case 4: - MenuZeroFillScreen(); - break; - case 5: - LZ77UnCompVram(gUnknown_08E9FC64, (void *)VRAM + 0xE800); - break; - case 6: - LZ77UnCompVram(gPokenavConditionSearch2_Gfx, (void *)VRAM + 0x8000); - break; - case 7: - LoadPalette(gUnknown_083E02B4, 0xB0, 0x20); - LoadPalette(gUnknown_083E02B4, 0xF0, 0x20); - LoadPalette(gUnknown_083E0334, 0x40, 0x20); + gUnknown_083DFEC4->unk87C8 = gUnknown_083DFEC4->unk87CA == 1; + gUnknown_083DFEC4->unkD162[0] = 11; + break; + case 1: + Text_LoadWindowTemplate(&gWindowTemplate_81E70D4); + break; + case 2: + MultistepInitMenuWindowBegin(&gWindowTemplate_81E70D4); + break; + case 3: + if (!MultistepInitMenuWindowContinue()) + { + return TRUE; + } + break; + case 4: + Menu_EraseScreen(); + break; + case 5: + LZ77UnCompVram(gUnknown_08E9FC64, (void *)VRAM + 0xE800); + break; + case 6: + LZ77UnCompVram(gPokenavConditionSearch2_Gfx, (void *)VRAM + 0x8000); + break; + case 7: + LoadPalette(gUnknown_083E02B4, 0xB0, 0x20); + LoadPalette(gUnknown_083E02B4, 0xF0, 0x20); + LoadPalette(gUnknown_083E0334, 0x40, 0x20); - if (gUnknown_083DFEC4->unk87CA == 0) - { - LoadPalette(gPokenavConditionSearch2_Pal, 0x30, 0x20); - gPlttBufferUnfaded[0] = gPokenavConditionSearch2_Pal[5]; - LoadPalette(gUnknownPalette_81E6692, 0xB0, 0x20); - LoadPalette(&gUnknown_083E02B4[1], 0xB1, 0x2); - LoadPalette(&gUnknown_083E02B4[8], 0xB5, 0x2); - LoadPalette(&gPokenavConditionSearch2_Pal[5], 0xBF, 0x2); - } - else if (gUnknown_083DFEC4->unk87CA == 1) - { - LoadPalette(gUnknown_083E0274, 0x30, 0x20); - gPlttBufferUnfaded[0] = gUnknown_083E0274[5]; - LoadPalette(gUnknownPalette_81E6692, 0xB0, 0x20); - LoadPalette(&gUnknown_083E02B4[1], 0xB1, 0x2); - LoadPalette(&gUnknown_083E02B4[8], 0xB5, 0x2); - LoadPalette(&gUnknown_083E0274[5], 0xBF, 0x2); - } - else - { - LoadPalette(gUnknown_08E9F9E8, 0x30, 0x20); - pointer = &gUnknown_08E9F9E8[5]; - gPlttBufferUnfaded[0] = gUnknown_08E9F9E8[5]; - LoadPalette(gUnknown_083E0314, 0x50, 0x20); - LoadPalette(&gUnknown_083E02B4[1], 0xB1, 0x2); - LoadPalette(&gUnknown_083E02B4[8], 0xB5, 0x2); - LoadPalette(pointer, 0xBF, 0x2); - LoadPalette(pointer, 0x5F, 0x2); - } - break; - case 8: - if (gUnknown_083DFEC4->unk87CA != 2) - { - sub_8095C8C((void *)VRAM + 0xE800, 0, 5, gUnknown_08E9FD1C, 0, 0, 9, 4, 9); - } - else - { - sub_8095C8C((void *)VRAM + 0xE800, 0, 4, gUnknown_08E9FE54, 0, 0, 12, 10, 12); - sub_8095C8C((void *)VRAM + 0xE800, 0, 8, gUnknown_08E9FD64, 0, 0, 12, 10, 12); - } - break; - case 9: - LZ77UnCompVram(gUnknown_083E0354, (void *)VRAM + 0x5000); - break; - case 10: - DmaClear16(3, (void *)VRAM + 0xF800, 0x800); - break; - case 11: - sub_80F0900(); - break; - case 12: - if (sub_80F0944()) - { - return TRUE; - } - break; - case 13: - if (gUnknown_083DFEC4->unk87CA != 2) - { - ShowMapNamePopUpWindow(); - } - else - { - sub_80F081C(0); - sub_80F0FFC(gUnknown_083DFEC4->unk876E); - } - break; - case 14: - REG_BG2CNT = 0x1D0A; - REG_BG3CNT = 0x1E03; - REG_BG0CNT = 0x1F01; - REG_BG3VOFS = 0xF8; - - gUnknown_083DFEC4->unk8776 = 0xF8; - gUnknown_083DFEC4->unk8778 = 0; - - REG_BLDCNT = 0; - gUnknown_083DFEC4->unkD160++; - return FALSE; - default: - return FALSE; - } - - gUnknown_083DFEC4->unk306++; - return TRUE; + if (gUnknown_083DFEC4->unk87CA == 0) + { + LoadPalette(gPokenavConditionSearch2_Pal, 0x30, 0x20); + gPlttBufferUnfaded[0] = gPokenavConditionSearch2_Pal[5]; + LoadPalette(gUnknownPalette_81E6692, 0xB0, 0x20); + LoadPalette(&gUnknown_083E02B4[1], 0xB1, 0x2); + LoadPalette(&gUnknown_083E02B4[8], 0xB5, 0x2); + LoadPalette(&gPokenavConditionSearch2_Pal[5], 0xBF, 0x2); + } + else if (gUnknown_083DFEC4->unk87CA == 1) + { + LoadPalette(gUnknown_083E0274, 0x30, 0x20); + gPlttBufferUnfaded[0] = gUnknown_083E0274[5]; + LoadPalette(gUnknownPalette_81E6692, 0xB0, 0x20); + LoadPalette(&gUnknown_083E02B4[1], 0xB1, 0x2); + LoadPalette(&gUnknown_083E02B4[8], 0xB5, 0x2); + LoadPalette(&gUnknown_083E0274[5], 0xBF, 0x2); + } + else + { + LoadPalette(gUnknown_08E9F9E8, 0x30, 0x20); + pointer = &gUnknown_08E9F9E8[5]; + gPlttBufferUnfaded[0] = gUnknown_08E9F9E8[5]; + LoadPalette(gUnknown_083E0314, 0x50, 0x20); + LoadPalette(&gUnknown_083E02B4[1], 0xB1, 0x2); + LoadPalette(&gUnknown_083E02B4[8], 0xB5, 0x2); + LoadPalette(pointer, 0xBF, 0x2); + LoadPalette(pointer, 0x5F, 0x2); + } + break; + case 8: + if (gUnknown_083DFEC4->unk87CA != 2) + { + sub_8095C8C((void *)VRAM + 0xE800, 0, 5, gUnknown_08E9FD1C, 0, 0, 9, 4, 9); + } + else + { + sub_8095C8C((void *)VRAM + 0xE800, 0, 4, gUnknown_08E9FE54, 0, 0, 12, 10, 12); + sub_8095C8C((void *)VRAM + 0xE800, 0, 8, gUnknown_08E9FD64, 0, 0, 12, 10, 12); + } + break; + case 9: + LZ77UnCompVram(gUnknown_083E0354, (void *)VRAM + 0x5000); + break; + case 10: + DmaClear16(3, (void *)VRAM + 0xF800, 0x800); + break; + case 11: + sub_80F0900(); + break; + case 12: + if (sub_80F0944()) + { + return TRUE; + } + break; + case 13: + if (gUnknown_083DFEC4->unk87CA != 2) + { + ShowMapNamePopUpWindow(); + } + else + { + sub_80F081C(0); + sub_80F0FFC(gUnknown_083DFEC4->unk876E); + } + break; + case 14: + REG_BG2CNT = 0x1D0A; + REG_BG3CNT = 0x1E03; + REG_BG0CNT = 0x1F01; + REG_BG3VOFS = 0xF8; + + gUnknown_083DFEC4->unk8776 = 0xF8; + gUnknown_083DFEC4->unk8778 = 0; + + REG_BLDCNT = 0; + gUnknown_083DFEC4->unkD160++; + return FALSE; + default: + return FALSE; + } + + gUnknown_083DFEC4->unk306++; + return TRUE; } #else __attribute__((naked)) @@ -4120,17 +4783,17 @@ _080F0338: .4byte 0x000087ca\n\ _080F033C: .4byte 0x000087c8\n\ _080F0340: .4byte 0x0000d162\n\ _080F0344:\n\ - ldr r0, _080F034C @ =gWindowConfig_81E70D4\n\ - bl SetUpWindowConfig\n\ + ldr r0, _080F034C @ =gWindowTemplate_81E70D4\n\ + bl Text_LoadWindowTemplate\n\ b _080F0618\n\ .align 2, 0\n\ -_080F034C: .4byte gWindowConfig_81E70D4\n\ +_080F034C: .4byte gWindowTemplate_81E70D4\n\ _080F0350:\n\ - ldr r0, _080F0358 @ =gWindowConfig_81E70D4\n\ + ldr r0, _080F0358 @ =gWindowTemplate_81E70D4\n\ bl MultistepInitMenuWindowBegin\n\ b _080F0618\n\ .align 2, 0\n\ -_080F0358: .4byte gWindowConfig_81E70D4\n\ +_080F0358: .4byte gWindowTemplate_81E70D4\n\ _080F035C:\n\ bl MultistepInitMenuWindowContinue\n\ cmp r0, 0\n\ @@ -4139,7 +4802,7 @@ _080F035C:\n\ _080F0366:\n\ b _080F0626\n\ _080F0368:\n\ - bl MenuZeroFillScreen\n\ + bl Menu_EraseScreen\n\ b _080F0618\n\ _080F036E:\n\ ldr r0, _080F0378 @ =gUnknown_08E9FC64\n\ diff --git a/src/rom3.c b/src/rom3.c index cdc66989c..7b3051b86 100644 --- a/src/rom3.c +++ b/src/rom3.c @@ -5,6 +5,7 @@ #include "battle_anim.h" #include "battle_anim_81258BC.h" #include "battle_anim_8137220.h" +#include "battle_util.h" #include "cable_club.h" #include "constants/items.h" #include "link.h" @@ -66,6 +67,10 @@ void sub_800B858(void) } } +#if DEBUG +extern u8 gUnknown_02023A14_50; +#endif + void setup_poochyena_battle(void) { s32 i; @@ -92,6 +97,16 @@ void setup_poochyena_battle(void) } gUnknown_020239FC = 0; gUnknown_02024C78 = 0; + +#if DEBUG + if (gUnknown_02023A14_50 & 0x80) + { + gSharedMem[0x160fd] = 0; + gSharedMem[0x160fe] = 0; + gSharedMem[0x160ff] = 0; + ((u32 *) gBattleBuffersTransferData)[64]++; + } +#endif } void sub_800B950(void) @@ -462,7 +477,7 @@ void sub_800C1A8(u8 taskId) } break; case 4: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { var = (ewram14004arr(0, gTasks[taskId].data[15]) | (ewram14004arr(1, gTasks[taskId].data[15]) << 8)); gTasks[taskId].data[13] = 1; @@ -582,7 +597,7 @@ void Emitcmd1(u8 a, u8 b, u8 c) PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); } -void EmitSetAttributes(u8 a, u8 b, u8 c, u8 d, void *e) +void EmitSetMonData(u8 a, u8 b, u8 c, u8 d, void *e) { int i; @@ -748,9 +763,9 @@ void EmitPrintString(u8 a, u16 stringID) stringInfo->lastMove = gChosenMove; stringInfo->lastItem = gLastUsedItem; stringInfo->lastAbility = gLastUsedAbility; - stringInfo->scrActive = BATTLE_STRUCT->scriptingActive; - stringInfo->unk1605E = BATTLE_STRUCT->unk1605E; - stringInfo->hpScale = BATTLE_STRUCT->hpScale; + stringInfo->scrActive = gBattleStruct->scriptingActive; + stringInfo->unk1605E = gBattleStruct->unk1605E; + stringInfo->hpScale = gBattleStruct->hpScale; stringInfo->StringBank = gStringBank; stringInfo->moveType = gBattleMoves[gCurrentMove].type; @@ -780,8 +795,8 @@ void EmitPrintStringPlayerOnly(u8 a, u16 stringID) stringInfo->lastMove = gChosenMove; stringInfo->lastItem = gLastUsedItem; stringInfo->lastAbility = gLastUsedAbility; - stringInfo->scrActive = BATTLE_STRUCT->scriptingActive; - stringInfo->unk1605E = BATTLE_STRUCT->unk1605E; + stringInfo->scrActive = gBattleStruct->scriptingActive; + stringInfo->unk1605E = gBattleStruct->unk1605E; for (i = 0; i < 4; i++) stringInfo->abilities[i] = gBattleMons[i].ability; diff --git a/src/rom6.c b/src/rom6.c index e71484b0a..06e84cc0f 100644 --- a/src/rom6.c +++ b/src/rom6.c @@ -1,4 +1,6 @@ #include "global.h" +#include "constants/map_objects.h" +#include "constants/songs.h" #include "rom6.h" #include "braille_puzzles.h" #include "field_effect.h" @@ -8,7 +10,6 @@ #include "pokemon_menu.h" #include "overworld.h" #include "script.h" -#include "constants/songs.h" #include "sound.h" #include "sprite.h" #include "task.h" @@ -116,6 +117,21 @@ static void sub_810B4CC(u8 taskId) DestroyTask(taskId); } +#if DEBUG +void debug_sub_8120968(void) +{ + if (npc_before_player_of_type(MAP_OBJ_GFX_BREAKABLE_ROCK) == TRUE) + { + gLastFieldPokeMenuOpened = 0; + sub_810B53C(); + } + else + { + ScriptContext2_Disable(); + } +} +#endif + bool8 SetUpFieldMove_RockSmash(void) { if (npc_before_player_of_type(0x56) == TRUE) @@ -142,7 +158,7 @@ int FldEff_RockSmash(void) gTasks[taskId].data[8] = (u32)sub_810B58C >> 16; gTasks[taskId].data[9] = (u32)sub_810B58C; - IncrementGameStat(0x13); + IncrementGameStat(GAME_STAT_USED_ROCK_SMASH); return 0; } diff --git a/src/rom_800D42C.c b/src/rom_800D42C.c index bf6d03fb7..a1b0f5ecb 100644 --- a/src/rom_800D42C.c +++ b/src/rom_800D42C.c @@ -28,8 +28,8 @@ extern u8 BattleText_Tie[]; #define PRINT_MESSAGE(text, tileDataStartOffset, x) \ { \ - InitWindow(&gUnknown_03004210, text, tileDataStartOffset, x, MESSAGE_Y); \ - sub_8002F44(&gUnknown_03004210); \ + Text_InitWindow(&gUnknown_03004210, text, tileDataStartOffset, x, MESSAGE_Y); \ + Text_PrintWindow8002F44(&gUnknown_03004210); \ } #define PRINT_MESSAGE_LEFT(text, tileDataStartOffset) PRINT_MESSAGE(text, tileDataStartOffset, LEFT_MESSAGE_X) @@ -52,7 +52,7 @@ void PrintLinkBattleWinLossTie(void) { // lp_field_18 = player position? - switch (gLinkPlayers[BATTLE_STRUCT->linkPlayerIndex].lp_field_18) + switch (gLinkPlayers[gBattleStruct->linkPlayerIndex].lp_field_18) { case 0: case 2: @@ -70,7 +70,7 @@ void PrintLinkBattleWinLossTie(void) else { - switch (gLinkPlayers[BATTLE_STRUCT->linkPlayerIndex].lp_field_18) + switch (gLinkPlayers[gBattleStruct->linkPlayerIndex].lp_field_18) { case 1: case 3: @@ -92,7 +92,7 @@ void PrintLinkBattleWinLossTie(void) if (gBattleOutcome == 1) { - if (gLinkPlayers[BATTLE_STRUCT->linkPlayerIndex].lp_field_18 != 0) + if (gLinkPlayers[gBattleStruct->linkPlayerIndex].lp_field_18 != 0) { PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN); PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS); @@ -105,7 +105,7 @@ void PrintLinkBattleWinLossTie(void) } else { - if (gLinkPlayers[BATTLE_STRUCT->linkPlayerIndex].lp_field_18 != 0) + if (gLinkPlayers[gBattleStruct->linkPlayerIndex].lp_field_18 != 0) { PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); diff --git a/src/rom_8077ABC.c b/src/rom_8077ABC.c index 9cf28a111..4a580eb41 100644 --- a/src/rom_8077ABC.c +++ b/src/rom_8077ABC.c @@ -1,13 +1,14 @@ #include "global.h" +#include "constants/species.h" #include "rom_8077ABC.h" #include "battle.h" #include "battle_anim.h" #include "blend_palette.h" +#include "contest.h" #include "data2.h" #include "decompress.h" #include "palette.h" #include "pokemon_icon.h" -#include "constants/species.h" #include "sprite.h" #include "task.h" #include "trig.h" @@ -31,52 +32,28 @@ #define gTransformPersonalities gTransformedPersonalities #define gBattleMonSprites gObjectBankIDs - -struct Struct_unk_2019348 { - u16 field_0; - u16 field_2; - u8 field_4; - u32 field_8; - u32 field_c; - u32 field_10; -}; - -struct TransformStatus { +struct TransformStatus +{ u16 unknown; u16 species; }; -struct Struct_gUnknown_0837F578 { +struct Struct_gUnknown_0837F578 +{ u8 field_0; u8 field_1; }; -struct Struct_2017810 { +struct Struct_2017810 +{ u8 filler_0[6]; u8 field_6; u8 filler_7[5]; }; -struct Color { - u16 r:5; - u16 g:5; - u16 b:5; -}; - -struct BGCnt { - u16 priority:2; - u16 charBase:2; - u16 unused:2; - u16 mosaic:1; - u16 colorMode:1; - u16 screenBase:5; - u16 overflow:1; - u16 size:2; -}; - -#define BG1CNT (*(volatile struct BGCnt*)REG_ADDR_BG1CNT) -#define BG2CNT (*(volatile struct BGCnt*)REG_ADDR_BG2CNT) -#define BG3CNT (*(volatile struct BGCnt*)REG_ADDR_BG3CNT) +#define BG1CNT (*(vBgCnt *)REG_ADDR_BG1CNT) +#define BG2CNT (*(vBgCnt *)REG_ADDR_BG2CNT) +#define BG3CNT (*(vBgCnt *)REG_ADDR_BG3CNT) extern struct OamData gOamData_837DF9C[]; extern const union AnimCmd *const gDummySpriteAnimTable[]; @@ -102,7 +79,8 @@ extern u8 UpdateMonIconFrame(struct Sprite *sprite); EWRAM_DATA union AffineAnimCmd *gUnknown_0202F7D4 = NULL; EWRAM_DATA u32 filler_0202F7D8[3] = {0}; -const struct Struct_gUnknown_0837F578 gUnknown_0837F578[][4] = { +const struct Struct_gUnknown_0837F578 gUnknown_0837F578[][4] = +{ { { 72, 80 }, { 176, 40 }, @@ -120,14 +98,16 @@ const struct Struct_gUnknown_0837F578 gUnknown_0837F578[][4] = { // One entry for each of the four Castform forms. // Coords are probably front pic coords or back pic coords, but this data does not seem to be // used during battle, party summary, or pokedex screens. -const struct MonCoords gCastformFrontSpriteCoords[] = { +const struct MonCoords gCastformFrontSpriteCoords[] = +{ { 0x44, 17 }, // NORMAL { 0x66, 9 }, // SUN { 0x46, 9 }, // RAIN { 0x86, 8 }, // HAIL }; -const u8 gCastformElevations[] = { +const u8 gCastformElevations[] = +{ 13, // NORMAL 14, // SUN 13, // RAIN @@ -135,14 +115,16 @@ const u8 gCastformElevations[] = { }; // Y position of the backsprite for each of the four Castform forms. -const u8 gCastformBackSpriteYCoords[] = { +const u8 gCastformBackSpriteYCoords[] = +{ 0, // NORMAL 0, // SUN 0, // RAIN 0, // HAIL }; -const struct SpriteTemplate gSpriteTemplate_837F5B0[] = { +const struct SpriteTemplate gSpriteTemplate_837F5B0[] = +{ { .tileTag = 55125, .paletteTag = 55125, @@ -151,7 +133,8 @@ const struct SpriteTemplate gSpriteTemplate_837F5B0[] = { .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, - }, { + }, + { .tileTag = 55126, .paletteTag = 55126, .oam = gOamData_837DF9C, @@ -162,23 +145,27 @@ const struct SpriteTemplate gSpriteTemplate_837F5B0[] = { } }; -const struct SpriteSheet gUnknown_0837F5E0[] = { +const struct SpriteSheet gUnknown_0837F5E0[] = +{ { gMiscBlank_Gfx, 0x800, 55125, }, { gMiscBlank_Gfx, 0x800, 55126, }, }; +// pkmn_form.c -u8 GetBankPosition(u8 slot, u8 a2) { +u8 GetBankPosition(u8 slot, u8 a2) +{ u8 var; u16 species; struct TransformStatus *transform; - if (IsContest()) { - if (a2 == 3 && slot == 3) { + if (IsContest()) + { + if (a2 == 3 && slot == 3) a2 = 1; - } } - switch (a2) { + switch (a2) + { case 0: case 2: var = gUnknown_0837F578[IS_DOUBLE_BATTLE()][GetBankIdentity(slot)].field_0; @@ -189,339 +176,402 @@ u8 GetBankPosition(u8 slot, u8 a2) { case 3: case 4: default: - if (IsContest()) { - if (ewram19348.unk4 & 1) { - species = ewram19348.unk2; - } else { - species = ewram19348.unk0; - } - } else { - if (GetBankSide(slot)) { + if (IsContest()) + { + if (shared19348.unk4_0) + species = shared19348.unk2; + else + species = shared19348.unk0; + } + else + { + if (GetBankSide(slot)) + { transform = &eTransformStatuses[slot]; - if (!transform->species) { + if (!transform->species) species = GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES); - } else { + else species = transform->species; - } - } else { + } + else + { transform = &eTransformStatuses[slot]; - if (!transform->species) { + if (!transform->species) species = GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES); - } else { + else species = transform->species; - } } } - if (a2 == 3) { + if (a2 == 3) var = sub_8077E44(slot, species, 1); - } else { + else var = sub_8077E44(slot, species, 0); - } break; } return var; } -u8 sub_8077BFC(u8 slot, u16 species) { +u8 sub_8077BFC(u8 slot, u16 species) +{ u16 letter; u32 personality; struct TransformStatus *transform; u8 ret; u16 var; - if (!GetBankSide(slot) || IsContest()) { - if (species == SPECIES_UNOWN) { - if (IsContest()) { - if (ewram19348.unk4 & 1) { - personality = ewram19348.unk10; - } else { - personality = ewram19348.unk8; - } - } else { + if (GetBankSide(slot) == 0 || IsContest()) + { + if (species == SPECIES_UNOWN) + { + if (IsContest()) + { + if (shared19348.unk4_0) + personality = shared19348.unk10; + else + personality = shared19348.unk8; + } + else + { transform = &eTransformStatuses[slot]; - if (!transform->species) { + if (!transform->species) personality = GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_PERSONALITY); - } else { + else personality = gTransformPersonalities[slot]; - } } letter = GET_UNOWN_LETTER(personality); - if (!letter) { + if (!letter) var = species; - } else { + else var = letter + SPECIES_UNOWN_B - 1; - } ret = gMonBackPicCoords[var].y_offset; - } else if (species == SPECIES_CASTFORM) { + } + else if (species == SPECIES_CASTFORM) + { ret = gCastformBackSpriteYCoords[gBattleMonForms[slot]]; - } else if (species > NUM_SPECIES) { + } + else if (species > NUM_SPECIES) + { ret = gMonBackPicCoords[0].y_offset; - } else { + } + else + { ret = gMonBackPicCoords[species].y_offset; } - } else { - if (species == SPECIES_UNOWN) { + } + else + { + if (species == SPECIES_UNOWN) + { transform = &eTransformStatuses[slot]; - if (!transform->species) { + if (!transform->species) personality = GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_PERSONALITY); - } else { + else personality = gTransformPersonalities[slot]; - } letter = GET_UNOWN_LETTER(personality); - if (!letter) { + if (!letter) var = species; - } else { + else var = letter + SPECIES_UNOWN_B - 1; - } ret = gMonFrontPicCoords[var].y_offset; - } else if (species == SPECIES_CASTFORM) { + } + else if (species == SPECIES_CASTFORM) + { ret = gCastformFrontSpriteCoords[gBattleMonForms[slot]].y_offset; - } else if (species > NUM_SPECIES) { + } + else if (species > NUM_SPECIES) + { ret = gMonFrontPicCoords[0].y_offset; - } else { + } + else + { ret = gMonFrontPicCoords[species].y_offset; } } return ret; } -u8 sub_8077DD8(u8 slot, u16 species) { +u8 sub_8077DD8(u8 slot, u16 species) +{ u8 ret = 0; - if (GetBankSide(slot) == 1) { - if (!IsContest()) { - if (species == SPECIES_CASTFORM) { + if (GetBankSide(slot) == 1) + { + if (!IsContest()) + { + if (species == SPECIES_CASTFORM) ret = gCastformElevations[gBattleMonForms[slot]]; - } else if (species > NUM_SPECIES) { + else if (species > NUM_SPECIES) ret = gEnemyMonElevation[0]; - } else { + else ret = gEnemyMonElevation[species]; - } } } return ret; } -u8 sub_8077E44(u8 slot, u16 species, u8 a3) { +u8 sub_8077E44(u8 slot, u16 species, u8 a3) +{ u16 offset; u8 y; - if (GetBankSide(slot) == 0 || IsContest()) { + + if (GetBankSide(slot) == 0 || IsContest()) + { offset = sub_8077BFC(slot, species); - } else { + } + else + { offset = sub_8077BFC(slot, species); offset -= sub_8077DD8(slot, species); } y = offset + gUnknown_0837F578[IS_DOUBLE_BATTLE()][GetBankIdentity(slot)].field_1; - if (a3) { - if (GetBankSide(slot) == 0) { + if (a3) + { + if (GetBankSide(slot) == 0) y += 8; - } - if (y > 104) y = 104; + if (y > 104) + y = 104; } return y; } -u8 sub_8077EE4(u8 slot, u8 a2) { +u8 sub_8077EE4(u8 slot, u8 a2) +{ u16 species; struct TransformStatus *transform; - if (a2 == 3 || a2 == 4) { - if (IsContest()) { - if (ewram19348.unk4 & 1) { - species = ewram19348.unk2; - } else { - species = ewram19348.unk0; - } - } else { + if (a2 == 3 || a2 == 4) + { + if (IsContest()) + { + if (shared19348.unk4_0) + species = shared19348.unk2; + else + species = shared19348.unk0; + } + else + { transform = &eTransformStatuses[slot]; - if (!transform->species) { + if (!transform->species) species = gAnimSpeciesByBanks[slot]; - } else { + else species = transform->species; - } } - if (a2 == 3) { + if (a2 == 3) return sub_8077E44(slot, species, 1); - } else { + else return sub_8077E44(slot, species, 0); - } - } else { + } + else + { return GetBankPosition(slot, a2); } } -u8 sub_8077F68(u8 slot) { +u8 sub_8077F68(u8 slot) +{ return GetBankPosition(slot, 4); } -u8 sub_8077F7C(u8 slot) { +u8 sub_8077F7C(u8 slot) +{ u16 var; - if (GetBankSide(slot)) { + if (GetBankSide(slot) != 0) var = GetBankPosition(slot, 1) + 16; - } else { + else var = GetBankPosition(slot, 1) + 17; - } return var; } -u8 sub_8077FC0(u8 slot) { +u8 sub_8077FC0(u8 slot) +{ u16 var; u8 r6; struct TransformStatus *transform; + r6 = GetBankPosition(slot, 1); - if (!IsContest()) { - if (GetBankSide(slot)) { + if (!IsContest()) + { + if (GetBankSide(slot) != 0) + { transform = &eTransformStatuses[slot]; if (!transform->species) { var = GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES); } else { var = transform->species; } - } else { + } + else + { transform = &eTransformStatuses[slot]; - if (!transform->species) { + if (!transform->species) var = GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES); - } else { + else var = transform->species; - } } - if (GetBankSide(slot)) { + if (GetBankSide(slot) != 0) r6 -= sub_8077DD8(slot, var); - } } return r6; } -u8 GetAnimBankSpriteId(u8 whichBank) { +u8 GetAnimBankSpriteId(u8 whichBank) +{ u8 *sprites; - if (whichBank == ANIM_BANK_ATTACKER) { - if (IsBankSpritePresent(gAnimBankAttacker)) { + + if (whichBank == ANIM_BANK_ATTACKER) + { + if (IsBankSpritePresent(gAnimBankAttacker)) + { sprites = gBattleMonSprites; return sprites[gAnimBankAttacker]; - } else { + } + else + { return 0xff; } - } else if (whichBank == ANIM_BANK_TARGET) { - if (IsBankSpritePresent(gAnimBankTarget)) { + } + else if (whichBank == ANIM_BANK_TARGET) + { + if (IsBankSpritePresent(gAnimBankTarget)) + { sprites = gBattleMonSprites; return sprites[gAnimBankTarget]; - } else { + } + else + { return 0xff; } - } else if (whichBank == ANIM_BANK_ATK_PARTNER) { - if (!IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2)) { + } + else if (whichBank == ANIM_BANK_ATK_PARTNER) + { + if (!IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2)) return 0xff; - } else { + else return gBattleMonSprites[gAnimBankAttacker ^ 2]; - } - } else { - if (IsAnimBankSpriteVisible(gAnimBankTarget ^ 2)) { + } + else + { + if (IsAnimBankSpriteVisible(gAnimBankTarget ^ 2)) return gBattleMonSprites[gAnimBankTarget ^ 2]; - } else { + else return 0xff; - } } } -void StoreSpriteCallbackInData(struct Sprite *sprite, void (*callback)(struct Sprite*)) { +void StoreSpriteCallbackInData(struct Sprite *sprite, void (*callback)(struct Sprite*)) +{ sprite->data[6] = (u32)(callback) & 0xffff; sprite->data[7] = (u32)(callback) >> 16; } -void SetCallbackToStoredInData(struct Sprite *sprite) { +void SetCallbackToStoredInData(struct Sprite *sprite) +{ u32 callback = (u16)sprite->data[6] | (sprite->data[7] << 16); sprite->callback = (void (*)(struct Sprite *))callback; } -void sub_8078114(struct Sprite *sprite) { - if (sprite->data[3]) { +void sub_8078114(struct Sprite *sprite) +{ + if (sprite->data[3]) + { sprite->pos2.x = Sin(sprite->data[0], sprite->data[1]); sprite->pos2.y = Cos(sprite->data[0], sprite->data[1]); sprite->data[0] += sprite->data[2]; - if (sprite->data[0] >= 0x100) { + if (sprite->data[0] >= 0x100) sprite->data[0] -= 0x100; - } else if (sprite->data[0] < 0) { + else if (sprite->data[0] < 0) sprite->data[0] += 0x100; - } sprite->data[3]--; - } else { + } + else + { SetCallbackToStoredInData(sprite); } } -void sub_8078174(struct Sprite *sprite) { - if (sprite->data[3]) { +void sub_8078174(struct Sprite *sprite) +{ + if (sprite->data[3]) + { sprite->pos2.x = Sin(sprite->data[0], (sprite->data[5] >> 8) + sprite->data[1]); sprite->pos2.y = Cos(sprite->data[0], (sprite->data[5] >> 8) + sprite->data[1]); sprite->data[0] += sprite->data[2]; sprite->data[5] += sprite->data[4]; - if (sprite->data[0] >= 0x100) { + if (sprite->data[0] >= 0x100) sprite->data[0] -= 0x100; - } else if (sprite->data[0] < 0) { + else if (sprite->data[0] < 0) sprite->data[0] += 0x100; - } sprite->data[3]--; - } else { + } + else + { SetCallbackToStoredInData(sprite); } } -void unref_sub_80781F0(struct Sprite *sprite) { - if (sprite->data[3]) { +void unref_sub_80781F0(struct Sprite *sprite) +{ + if (sprite->data[3]) + { sprite->pos2.x = Sin(sprite->data[0], sprite->data[1]); sprite->pos2.y = Cos(sprite->data[4], sprite->data[1]); sprite->data[0] += sprite->data[2]; sprite->data[4] += sprite->data[5]; - if (sprite->data[0] >= 0x100) { + if (sprite->data[0] >= 0x100) sprite->data[0] -= 0x100; - } else if (sprite->data[0] < 0) { + else if (sprite->data[0] < 0) sprite->data[0] += 0x100; - } - if (sprite->data[4] >= 0x100) { + if (sprite->data[4] >= 0x100) sprite->data[4] -= 0x100; - } else if (sprite->data[4] < 0) { + else if (sprite->data[4] < 0) sprite->data[4] += 0x100; - } sprite->data[3]--; - } else { + } + else + { SetCallbackToStoredInData(sprite); } } -void sub_8078278(struct Sprite *sprite) { - if (sprite->data[3]) { +void sub_8078278(struct Sprite *sprite) +{ + if (sprite->data[3]) + { sprite->pos2.x = Sin(sprite->data[0], sprite->data[1]); sprite->pos2.y = Cos(sprite->data[0], sprite->data[4]); sprite->data[0] += sprite->data[2]; - if (sprite->data[0] >= 0x100) { + if (sprite->data[0] >= 0x100) sprite->data[0] -= 0x100; - } else if (sprite->data[0] < 0) { + else if (sprite->data[0] < 0) sprite->data[0] += 0x100; - } sprite->data[3]--; - } else { + } + else + { SetCallbackToStoredInData(sprite); } } -void sub_80782D8(struct Sprite *sprite) { - if (sprite->data[0] > 0) { +void sub_80782D8(struct Sprite *sprite) +{ + if (sprite->data[0] > 0) sprite->data[0]--; - } else { + else SetCallbackToStoredInData(sprite); - } } -void sub_80782F8(struct Sprite *sprite) { +void sub_80782F8(struct Sprite *sprite) +{ sub_8078314(sprite); sprite->callback = sub_8078364; sprite->callback(sprite); } -void sub_8078314(struct Sprite *sprite) { +void sub_8078314(struct Sprite *sprite) +{ s16 old; int v1; - if (sprite->data[1] > sprite->data[2]) { + + if (sprite->data[1] > sprite->data[2]) sprite->data[0] = -sprite->data[0]; - } v1 = sprite->data[2] - sprite->data[1]; old = sprite->data[0]; sprite->data[0] = abs(v1 / sprite->data[0]); @@ -529,42 +579,55 @@ void sub_8078314(struct Sprite *sprite) { sprite->data[1] = old; } -void sub_8078364(struct Sprite *sprite) { - if (sprite->data[0] > 0) { +void sub_8078364(struct Sprite *sprite) +{ + if (sprite->data[0] > 0) + { sprite->data[0]--; sprite->pos2.x += sprite->data[1]; sprite->pos2.y += sprite->data[2]; - } else { + } + else + { SetCallbackToStoredInData(sprite); } } -void sub_8078394(struct Sprite *sprite) { - if (sprite->data[0] > 0) { +void sub_8078394(struct Sprite *sprite) +{ + if (sprite->data[0] > 0) + { sprite->data[0]--; sprite->data[3] += sprite->data[1]; sprite->data[4] += sprite->data[2]; sprite->pos2.x = sprite->data[3] >> 8; sprite->pos2.y = sprite->data[4] >> 8; - } else { + } + else + { SetCallbackToStoredInData(sprite); } } -void sub_80783D0(struct Sprite *sprite) { - if (sprite->data[0] > 0) { +void sub_80783D0(struct Sprite *sprite) +{ + if (sprite->data[0] > 0) + { sprite->data[0]--; sprite->data[3] += sprite->data[1]; sprite->data[4] += sprite->data[2]; sprite->pos2.x = sprite->data[3] >> 8; sprite->pos2.y = sprite->data[4] >> 8; - } else { + } + else + { SetCallbackToStoredInData(sprite); } UpdateMonIconFrame(sprite); } -void unref_sub_8078414(struct Sprite *sprite) { +void unref_sub_8078414(struct Sprite *sprite) +{ sprite->data[1] = sprite->pos1.x + sprite->pos2.x; sprite->data[3] = sprite->pos1.y + sprite->pos2.y; sprite->data[2] = GetBankPosition(gAnimBankTarget, 2); @@ -572,51 +635,65 @@ void unref_sub_8078414(struct Sprite *sprite) { sprite->callback = sub_80782F8; } -void sub_8078458(struct Sprite *sprite) { - if (sprite->data[0] > 0) { +void sub_8078458(struct Sprite *sprite) +{ + if (sprite->data[0] > 0) + { sprite->data[0]--; gSprites[sprite->data[3]].pos2.x += sprite->data[1]; gSprites[sprite->data[3]].pos2.y += sprite->data[2]; - } else { + } + else + { SetCallbackToStoredInData(sprite); } } -void sub_80784A8(struct Sprite *sprite) { - if (sprite->data[0] > 0) { +void sub_80784A8(struct Sprite *sprite) +{ + if (sprite->data[0] > 0) + { sprite->data[0]--; sprite->data[3] += sprite->data[1]; sprite->data[4] += sprite->data[2]; gSprites[sprite->data[5]].pos2.x = sprite->data[3] >> 8; gSprites[sprite->data[5]].pos2.y = sprite->data[4] >> 8; - } else { + } + else + { SetCallbackToStoredInData(sprite); } } -void sub_8078504(struct Sprite *sprite) { - if (sprite->data[0] > 0) { +void sub_8078504(struct Sprite *sprite) +{ + if (sprite->data[0] > 0) + { sprite->data[0]--; sprite->pos2.x = sprite->data[2] >> 8; sprite->data[2] += sprite->data[1]; sprite->pos2.y = sprite->data[4] >> 8; sprite->data[4] += sprite->data[3]; - if (sprite->data[0] % sprite->data[5] == 0) { - if (sprite->data[5]) { + if (sprite->data[0] % sprite->data[5] == 0) + { + if (sprite->data[5]) sprite->invisible ^= 1; - } } - } else { + } + else + { SetCallbackToStoredInData(sprite); } } -void move_anim_8074EE0(struct Sprite *sprite) { +void move_anim_8074EE0(struct Sprite *sprite) +{ FreeSpriteOamMatrix(sprite); DestroyAnimSprite(sprite); } -void unref_sub_8078588(struct Sprite *sprite) { +void unref_sub_8078588(struct Sprite *sprite) +{ sprite->data[1] = sprite->pos1.x + sprite->pos2.x; sprite->data[3] = sprite->pos1.y + sprite->pos2.y; sprite->data[2] = GetBankPosition(gAnimBankAttacker, 2); @@ -624,57 +701,68 @@ void unref_sub_8078588(struct Sprite *sprite) { sprite->callback = sub_80782F8; } -void unref_sub_80785CC(struct Sprite *sprite) { +void unref_sub_80785CC(struct Sprite *sprite) +{ ResetPaletteStructByUid(sprite->data[5]); move_anim_8074EE0(sprite); } -void sub_80785E4(struct Sprite *sprite) { - if (sprite->affineAnimEnded) { +void sub_80785E4(struct Sprite *sprite) +{ + if (sprite->affineAnimEnded) SetCallbackToStoredInData(sprite); - } } -void sub_8078600(struct Sprite *sprite) { - if (sprite->animEnded) { +void sub_8078600(struct Sprite *sprite) +{ + if (sprite->animEnded) SetCallbackToStoredInData(sprite); - } } -void sub_807861C(struct Sprite *sprite) { +void sub_807861C(struct Sprite *sprite) +{ REG_BLDCNT = 0; REG_BLDALPHA = 0; DestroyAnimSprite(sprite); } -void sub_8078634(u8 task) { +void sub_8078634(u8 task) +{ REG_BLDCNT = 0; REG_BLDALPHA = 0; DestroyAnimVisualTask(task); } -void sub_8078650(struct Sprite *sprite) { +void sub_8078650(struct Sprite *sprite) +{ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2); sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3); } -void sub_807867C(struct Sprite *sprite, s16 a2) { +void sub_807867C(struct Sprite *sprite, s16 a2) +{ u16 v1 = GetBankPosition(gAnimBankAttacker, 0); u16 v2 = GetBankPosition(gAnimBankTarget, 0); - if (v1 > v2) { + + if (v1 > v2) + { sprite->pos1.x -= a2; - } else if (v1 < v2) { + } + else if (v1 < v2) + { sprite->pos1.x += a2; - } else { - if (GetBankSide(gAnimBankAttacker)) { + } + else + { + if (GetBankSide(gAnimBankAttacker) != 0) sprite->pos1.x -= a2; - } else { + else sprite->pos1.x += a2; - } } } -void sub_80786EC(struct Sprite *sprite) { +void sub_80786EC(struct Sprite *sprite) +{ sprite->data[1] = sprite->pos1.x; sprite->data[3] = sprite->pos1.y; obj_translate_based_on_private_1_2_3_4(sprite); @@ -682,24 +770,27 @@ void sub_80786EC(struct Sprite *sprite) { sprite->data[7] = 0; } -bool8 sub_8078718(struct Sprite *sprite) { - if (sub_8078B5C(sprite)) { +bool8 sub_8078718(struct Sprite *sprite) +{ + if (sub_8078B5C(sprite)) return TRUE; - } sprite->data[7] += sprite->data[6]; sprite->pos2.y += Sin((u8)(sprite->data[7] >> 8), sprite->data[5]); return FALSE; } -void oamt_add_pos2_onto_pos1(struct Sprite *sprite) { +void oamt_add_pos2_onto_pos1(struct Sprite *sprite) +{ sprite->pos1.x += sprite->pos2.x; sprite->pos1.y += sprite->pos2.y; sprite->pos2.x = 0; sprite->pos2.y = 0; } -void sub_8078764(struct Sprite *sprite, u8 a2) { - if (!a2) { +void sub_8078764(struct Sprite *sprite, bool8 a2) +{ + if (!a2) + { sprite->pos1.x = sub_8077EE4(gAnimBankTarget, 0); sprite->pos1.y = sub_8077EE4(gAnimBankTarget, 1); } @@ -707,11 +798,15 @@ void sub_8078764(struct Sprite *sprite, u8 a2) { sprite->pos1.y += gBattleAnimArgs[1]; } -void sub_80787B0(struct Sprite *sprite, u8 a2) { - if (!a2) { +void sub_80787B0(struct Sprite *sprite, u8 a2) +{ + if (!a2) + { sprite->pos1.x = sub_8077EE4(gAnimBankAttacker, 0); sprite->pos1.y = sub_8077EE4(gAnimBankAttacker, 1); - } else { + } + else + { sprite->pos1.x = sub_8077EE4(gAnimBankAttacker, 2); sprite->pos1.y = sub_8077EE4(gAnimBankAttacker, 3); } @@ -719,103 +814,127 @@ void sub_80787B0(struct Sprite *sprite, u8 a2) { sprite->pos1.y += gBattleAnimArgs[1]; } -u8 GetBankSide(u8 slot) { +u8 GetBankSide(u8 slot) +{ return gBanksBySide[slot] & 1; } -u8 GetBankIdentity(u8 slot) { +u8 GetBankIdentity(u8 slot) +{ return gBanksBySide[slot]; } -u8 GetBankByPlayerAI(u8 slot) { +u8 GetBankByIdentity(u8 slot) +{ u8 i; - for (i = 0; i < gNoOfAllBanks; i++) { - if (gBanksBySide[i] == slot) { + + for (i = 0; i < gNoOfAllBanks; i++) + { + if (gBanksBySide[i] == slot) break; - } } return i; } -bool8 IsBankSpritePresent(u8 slot) { - if (IsContest()) { - if (gAnimBankAttacker == slot) { +bool8 IsBankSpritePresent(u8 slot) +{ + if (IsContest()) + { + if (gAnimBankAttacker == slot) return TRUE; - } - if (gAnimBankTarget == slot) { + if (gAnimBankTarget == slot) return TRUE; - } return FALSE; - } else { - if (gBanksBySide[slot] == 0xff) { + } + else + { + if (gBanksBySide[slot] == 0xff) return FALSE; - } - if (GetBankSide(slot)) { - if (GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_HP) != 0) { + if (GetBankSide(slot)) + { + if (GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_HP) != 0) return TRUE; - } - } else { - if (GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_HP) != 0) { + } + else + { + if (GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_HP) != 0) return TRUE; - } } return FALSE; } } -bool8 IsDoubleBattle() { +bool8 IsDoubleBattle() +{ return IS_DOUBLE_BATTLE(); } -void sub_8078914(struct Struct_sub_8078914 *unk) { - if (IsContest()) { - unk->field_0 = (u8 *)0x6008000; - unk->field_4 = (u8 *)0x600f000; +void sub_8078914(struct Struct_sub_8078914 *unk) +{ + if (IsContest()) + { + unk->field_0 = (u8 *)(VRAM + 0x8000); + unk->field_4 = (u8 *)(VRAM + 0xf000); unk->field_8 = 0xe; - } else { - unk->field_0 = (u8 *)0x6004000; - unk->field_4 = (u8 *)0x600e000; + } + else + { + unk->field_0 = (u8 *)(VRAM + 0x4000); + unk->field_4 = (u8 *)(VRAM + 0xe000); unk->field_8 = 0x8; } } -void sub_8078954(struct Struct_sub_8078914 *unk) { - if (IsContest()) { - unk->field_0 = (u8 *)0x6008000; - unk->field_4 = (u8 *)0x600f000; +void sub_8078954(struct Struct_sub_8078914 *unk) +{ + if (IsContest()) + { + unk->field_0 = (u8 *)(VRAM + 0x8000); + unk->field_4 = (u8 *)(VRAM + 0xf000); unk->field_8 = 0xe; - } else if (GetBankIdentity_permutated(gAnimBankAttacker) == 1) { - unk->field_0 = (u8 *)0x6004000; - unk->field_4 = (u8 *)0x600e000; + } + else if (GetBankIdentity_permutated(gAnimBankAttacker) == 1) + { + unk->field_0 = (u8 *)(VRAM + 0x4000); + unk->field_4 = (u8 *)(VRAM + 0xe000); unk->field_8 = 0x8; - } else { - unk->field_0 = (u8 *)0x6006000; - unk->field_4 = (u8 *)0x600f000; + } + else + { + unk->field_0 = (u8 *)(VRAM + 0x6000); + unk->field_4 = (u8 *)(VRAM + 0xf000); unk->field_8 = 0x9; } } -u8 sub_80789BC() { - if (IsContest()) { +u8 sub_80789BC() +{ + if (IsContest()) return 1; - } return 2; } -void sub_80789D4(bool8 a1) { - if (!a1) { - BG3CNT.size = 0; - BG3CNT.overflow = 1; - } else if (IsContest()) { - BG3CNT.size = 0; - BG3CNT.overflow = 1; - } else { - BG3CNT.size = 1; - BG3CNT.overflow = 0; +void sub_80789D4(bool8 a1) +{ + if (!a1) + { + BG3CNT.screenSize = 0; + BG3CNT.areaOverflowMode = 1; + } + else if (IsContest()) + { + BG3CNT.screenSize = 0; + BG3CNT.areaOverflowMode = 1; + } + else + { + BG3CNT.screenSize = 1; + BG3CNT.areaOverflowMode = 0; } } -void sub_8078A34(struct Sprite *sprite) { +void sub_8078A34(struct Sprite *sprite) +{ sprite->data[1] = sprite->pos1.x; sprite->data[3] = sprite->pos1.y; sub_8078A5C(sprite); @@ -823,7 +942,8 @@ void sub_8078A34(struct Sprite *sprite) { sprite->callback(sprite); } -void sub_8078A5C(struct Sprite *sprite) { +void sub_8078A5C(struct Sprite *sprite) +{ s16 x = (sprite->data[2] - sprite->data[1]) << 8; s16 y = (sprite->data[4] - sprite->data[3]) << 8; sprite->data[1] = x / sprite->data[0]; @@ -832,32 +952,36 @@ void sub_8078A5C(struct Sprite *sprite) { sprite->data[3] = 0; } -void obj_translate_based_on_private_1_2_3_4(struct Sprite *sprite) { +void obj_translate_based_on_private_1_2_3_4(struct Sprite *sprite) +{ int x = sprite->data[2] - sprite->data[1]; int y = sprite->data[4] - sprite->data[3]; bool8 r8 = x < 0; bool8 r9 = y < 0; u16 x2 = abs(x) << 8; u16 y2 = abs(y) << 8; + x2 = x2 / sprite->data[0]; y2 = y2 / sprite->data[0]; - if (r8) { + + if (r8) x2 |= 1; - } else { + else x2 &= ~1; - } - if (r9) { + + if (r9) y2 |= 1; - } else { + else y2 &= ~1; - } + sprite->data[1] = x2; sprite->data[2] = y2; sprite->data[4] = 0; sprite->data[3] = 0; } -void sub_8078B34(struct Sprite *sprite) { +void sub_8078B34(struct Sprite *sprite) +{ sprite->data[1] = sprite->pos1.x; sprite->data[3] = sprite->pos1.y; obj_translate_based_on_private_1_2_3_4(sprite); @@ -865,46 +989,51 @@ void sub_8078B34(struct Sprite *sprite) { sprite->callback(sprite); } -bool8 sub_8078B5C(struct Sprite *sprite) { +bool8 sub_8078B5C(struct Sprite *sprite) +{ u16 v1, v2, x, y; - if (!sprite->data[0]) { + + if (!sprite->data[0]) return TRUE; - } + v1 = sprite->data[1]; v2 = sprite->data[2]; x = sprite->data[3]; y = sprite->data[4]; x += v1; y += v2; - if (v1 & 1) { + + if (v1 & 1) sprite->pos2.x = -(x >> 8); - } else { + else sprite->pos2.x = x >> 8; - } - if (v2 & 1) { + + if (v2 & 1) sprite->pos2.y = -(y >> 8); - } else { + else sprite->pos2.y = y >> 8; - } + sprite->data[3] = x; sprite->data[4] = y; sprite->data[0]--; return FALSE; } -void sub_8078BB8(struct Sprite *sprite) { - if (sub_8078B5C(sprite)) { +void sub_8078BB8(struct Sprite *sprite) +{ + if (sub_8078B5C(sprite)) SetCallbackToStoredInData(sprite); - } } -void sub_8078BD4(struct Sprite *sprite) { +void sub_8078BD4(struct Sprite *sprite) +{ int v1 = abs(sprite->data[2] - sprite->data[1]) << 8; sprite->data[0] = v1 / sprite->data[0]; obj_translate_based_on_private_1_2_3_4(sprite); } -void sub_8078C00(struct Sprite *sprite) { +void sub_8078C00(struct Sprite *sprite) +{ sprite->data[1] = sprite->pos1.x; sprite->data[3] = sprite->pos1.y; sub_8078BD4(sprite); @@ -912,32 +1041,36 @@ void sub_8078C00(struct Sprite *sprite) { sprite->callback(sprite); } -void sub_8078C28(struct Sprite *sprite) { +void sub_8078C28(struct Sprite *sprite) +{ int x = sprite->data[2] - sprite->data[1]; int y = sprite->data[4] - sprite->data[3]; bool8 x_sign = x < 0; bool8 y_sign = y < 0; u16 x2 = abs(x) << 4; u16 y2 = abs(y) << 4; + x2 /= sprite->data[0]; y2 /= sprite->data[0]; - if (x_sign) { + + if (x_sign) x2 |= 1; - } else { + else x2 &= ~1; - } - if (y_sign) { + + if (y_sign) y2 |= 1; - } else { + else y2 &= ~1; - } + sprite->data[1] = x2; sprite->data[2] = y2; sprite->data[4] = 0; sprite->data[3] = 0; } -void sub_8078CC0(struct Sprite *sprite) { +void sub_8078CC0(struct Sprite *sprite) +{ sprite->data[1] = sprite->pos1.x; sprite->data[3] = sprite->pos1.y; sub_8078C28(sprite); @@ -945,46 +1078,51 @@ void sub_8078CC0(struct Sprite *sprite) { sprite->callback(sprite); } -bool8 sub_8078CE8(struct Sprite *sprite) { +bool8 sub_8078CE8(struct Sprite *sprite) +{ u16 v1, v2, x, y; - if (!sprite->data[0]) { + + if (!sprite->data[0]) return TRUE; - } + v1 = sprite->data[1]; v2 = sprite->data[2]; x = sprite->data[3]; y = sprite->data[4]; x += v1; y += v2; - if (v1 & 1) { + + if (v1 & 1) sprite->pos2.x = -(x >> 4); - } else { + else sprite->pos2.x = x >> 4; - } - if (v2 & 1) { + + if (v2 & 1) sprite->pos2.y = -(y >> 4); - } else { + else sprite->pos2.y = y >> 4; - } + sprite->data[3] = x; sprite->data[4] = y; sprite->data[0]--; return FALSE; } -void sub_8078D44(struct Sprite *sprite) { - if (sub_8078CE8(sprite)) { +void sub_8078D44(struct Sprite *sprite) +{ + if (sub_8078CE8(sprite)) SetCallbackToStoredInData(sprite); - } } -void sub_8078D60(struct Sprite *sprite) { +void sub_8078D60(struct Sprite *sprite) +{ int v1 = abs(sprite->data[2] - sprite->data[1]) << 4; sprite->data[0] = v1 / sprite->data[0]; sub_8078C28(sprite); } -void sub_8078D8C(struct Sprite *sprite) { +void sub_8078D8C(struct Sprite *sprite) +{ sprite->data[1] = sprite->pos1.x; sprite->data[3] = sprite->pos1.y; sub_8078D60(sprite); @@ -992,16 +1130,17 @@ void sub_8078D8C(struct Sprite *sprite) { sprite->callback(sprite); } -void obj_id_set_rotscale(u8 sprite, s16 xScale, s16 yScale, u16 rotation) { +void obj_id_set_rotscale(u8 sprite, s16 xScale, s16 yScale, u16 rotation) +{ int i; struct ObjAffineSrcData src; struct OamMatrix matrix; + src.xScale = xScale; src.yScale = yScale; src.rotation = rotation; - if (sub_8078E38()) { + if (sub_8078E38()) src.xScale = -src.xScale; - } i = gSprites[sprite].oam.matrixNum; ObjAffineSet(&src, &matrix, 1, 2); gOamMatrices[i].a = matrix.a; @@ -1010,31 +1149,33 @@ void obj_id_set_rotscale(u8 sprite, s16 xScale, s16 yScale, u16 rotation) { gOamMatrices[i].d = matrix.d; } -bool8 sub_8078E38() { - if (IsContest()) { - if (gSprites[GetAnimBankSpriteId(0)].data[2] == 0xc9 /* XXX SPECIES_UNOWN? */) { +bool8 sub_8078E38() +{ + if (IsContest()) + { + if (gSprites[GetAnimBankSpriteId(0)].data[2] == 0xc9 /* XXX SPECIES_UNOWN? */) return FALSE; - } return TRUE; } return FALSE; } -void sub_8078E70(u8 sprite, u8 a2) { +void sub_8078E70(u8 sprite, u8 a2) +{ u8 r7 = gSprites[sprite].data[0]; - if (IsContest() || IsAnimBankSpriteVisible(r7)) { + + if (IsContest() || IsAnimBankSpriteVisible(r7)) gSprites[sprite].invisible = FALSE; - } gSprites[sprite].oam.objMode = a2; gSprites[sprite].affineAnimPaused = TRUE; - if (!IsContest() && !gSprites[sprite].oam.affineMode) { + if (!IsContest() && !gSprites[sprite].oam.affineMode) gSprites[sprite].oam.matrixNum = ewram17810[r7].unk6; - } gSprites[sprite].oam.affineMode = 3; CalcCenterToCornerVec(&gSprites[sprite], gSprites[sprite].oam.shape, gSprites[sprite].oam.size, gSprites[sprite].oam.affineMode); } -void sub_8078F40(u8 sprite) { +void sub_8078F40(u8 sprite) +{ obj_id_set_rotscale(sprite, 0x100, 0x100, 0); gSprites[sprite].oam.affineMode = 1; gSprites[sprite].oam.objMode = 0; @@ -1042,31 +1183,33 @@ void sub_8078F40(u8 sprite) { CalcCenterToCornerVec(&gSprites[sprite], gSprites[sprite].oam.shape, gSprites[sprite].oam.size, gSprites[sprite].oam.affineMode); } -void sub_8078F9C(u8 sprite) { +void sub_8078F9C(u8 sprite) +{ u16 matrix = gSprites[sprite].oam.matrixNum; s16 c = gOamMatrices[matrix].c; - if (c < 0) { + + if (c < 0) c = -c; - } gSprites[sprite].pos2.y = c >> 3; } // related to obj_id_set_rotscale -void sub_8078FDC(struct Sprite *sprite, bool8 a2, s16 xScale, s16 yScale, u16 rotation) { +void sub_8078FDC(struct Sprite *sprite, bool8 a2, s16 xScale, s16 yScale, u16 rotation) +{ int i; struct ObjAffineSrcData src; struct OamMatrix matrix; - if (sprite->oam.affineMode & 1) { + + if (sprite->oam.affineMode & 1) + { sprite->affineAnimPaused = TRUE; - if (a2) { + if (a2) CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); - } src.xScale = xScale; src.yScale = yScale; src.rotation = rotation; - if (sub_8078E38()) { + if (sub_8078E38()) src.xScale = -src.xScale; - } i = sprite->oam.matrixNum; ObjAffineSet(&src, &matrix, 1, 2); gOamMatrices[i].a = matrix.a; @@ -1076,56 +1219,67 @@ void sub_8078FDC(struct Sprite *sprite, bool8 a2, s16 xScale, s16 yScale, u16 ro } } -void sub_8079098(struct Sprite *sprite) { +void sub_8079098(struct Sprite *sprite) +{ sub_8078FDC(sprite, TRUE, 0x100, 0x100, 0); sprite->affineAnimPaused = FALSE; CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); } -static u16 ArcTan2_(s16 a, s16 b) { +static u16 ArcTan2_(s16 a, s16 b) +{ return ArcTan2(a, b); } -u16 sub_80790F0(s16 a, s16 b) { +u16 sub_80790F0(s16 a, s16 b) +{ u16 var = ArcTan2_(a, b); return -var; } -void sub_8079108(u16 a1, bool8 a2) { +void sub_8079108(u16 a1, bool8 a2) +{ int i; - struct Color *c; - struct Color *c2; + struct PlttData *c; + struct PlttData *c2; u16 average; a1 *= 0x10; - if (!a2) { - for (i = 0; i < 0x10; i++) { - c = (struct Color *)&gPlttBufferUnfaded[a1 + i]; + if (!a2) + { + for (i = 0; i < 0x10; i++) + { + c = (struct PlttData *)&gPlttBufferUnfaded[a1 + i]; average = c->r + c->g + c->b; average /= 3; - c2 = (struct Color *)&gPlttBufferFaded[a1 + i]; + c2 = (struct PlttData *)&gPlttBufferFaded[a1 + i]; c2->r = average; c2->g = average; c2->b = average; } - } else { + } + else + { CpuCopy32(&gPlttBufferUnfaded[a1], &gPlttBufferFaded[a1], 0x20); } } -u32 sub_80791A8(u8 a1, u8 a2, u8 a3, u8 a4, u8 a5, u8 a6, u8 a7) { +u32 sub_80791A8(u8 a1, u8 a2, u8 a3, u8 a4, u8 a5, u8 a6, u8 a7) +{ u32 var = 0; u32 shift; - if (a1) { - if (!IsContest()) { + + if (a1) + { + if (!IsContest()) var = 0xe; - } else { + else var = 1 << sub_80789BC(); - } } - if (a2) { + if (a2) + { shift = gAnimBankAttacker + 16; var |= 1 << shift; } @@ -1133,62 +1287,70 @@ u32 sub_80791A8(u8 a1, u8 a2, u8 a3, u8 a4, u8 a5, u8 a6, u8 a7) { shift = gAnimBankTarget + 16; var |= 1 << shift; } - if (a4) { - if (IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2)) { + if (a4) + { + if (IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2)) + { shift = (gAnimBankAttacker ^ 2) + 16; var |= 1 << shift; } } - if (a5) { - if (IsAnimBankSpriteVisible(gAnimBankTarget ^ 2)) { + if (a5) + { + if (IsAnimBankSpriteVisible(gAnimBankTarget ^ 2)) + { shift = (gAnimBankTarget ^ 2) + 16; var |= 1 << shift; } } - if (a6) { - if (!IsContest()) { + if (a6) + { + if (!IsContest()) var |= 0x100; - } else { + else var |= 0x4000; - } } - if (a7) { - if (!IsContest()) { + if (a7) + { + if (!IsContest()) var |= 0x200; - } } return var; } -u32 sub_80792C0(u8 a1, u8 a2, u8 a3, u8 a4) { +u32 sub_80792C0(u8 a1, u8 a2, u8 a3, u8 a4) +{ u32 var = 0; u32 shift; - if (IsContest()) { - if (a1) { + + if (IsContest()) + { + if (a1) + { var |= 1 << 18; return var; } } else { if (a1) { - if (IsAnimBankSpriteVisible(GetBankByPlayerAI(0))) { - var |= 1 << (GetBankByPlayerAI(0) + 16); + if (IsAnimBankSpriteVisible(GetBankByIdentity(0))) { + var |= 1 << (GetBankByIdentity(0) + 16); } } if (a2) { - if (IsAnimBankSpriteVisible(GetBankByPlayerAI(2))) { - shift = GetBankByPlayerAI(2) + 16; + if (IsAnimBankSpriteVisible(GetBankByIdentity(2))) { + shift = GetBankByIdentity(2) + 16; var |= 1 << shift; } } if (a3) { - if (IsAnimBankSpriteVisible(GetBankByPlayerAI(1))) { - shift = GetBankByPlayerAI(1) + 16; + if (IsAnimBankSpriteVisible(GetBankByIdentity(1))) { + shift = GetBankByIdentity(1) + 16; var |= 1 << shift; } } if (a4) { - if (IsAnimBankSpriteVisible(GetBankByPlayerAI(3))) { - shift = GetBankByPlayerAI(3) + 16; + if (IsAnimBankSpriteVisible(GetBankByIdentity(3))) { + shift = GetBankByIdentity(3) + 16; var |= 1 << shift; } } @@ -1196,51 +1358,57 @@ u32 sub_80792C0(u8 a1, u8 a2, u8 a3, u8 a4) { return var; } -u8 sub_80793A8(u8 a1) { +u8 sub_80793A8(u8 a1) +{ return a1; } -u8 unref_sub_80793B0(u8 a1) { - return GetBankByPlayerAI(a1); +u8 unref_sub_80793B0(u8 a1) +{ + return GetBankByIdentity(a1); } -void sub_80793C4(struct Sprite *sprite) { +void sub_80793C4(struct Sprite *sprite) +{ bool8 var; - if (!sprite->data[0]) { - if (!gBattleAnimArgs[3]) { + + if (!sprite->data[0]) + { + if (!gBattleAnimArgs[3]) var = TRUE; - } else { + else var = FALSE; - } - if (!gBattleAnimArgs[2]) { + if (!gBattleAnimArgs[2]) sub_80787B0(sprite, var); - } else { + else sub_8078764(sprite, var); - } sprite->data[0]++; - } else if (sprite->animEnded || sprite->affineAnimEnded) { + } + else if (sprite->animEnded || sprite->affineAnimEnded) + { move_anim_8074EE0(sprite); } } -void sub_807941C(struct Sprite *sprite) { +void sub_807941C(struct Sprite *sprite) +{ bool8 v1; u8 v2; - if (!(gBattleAnimArgs[5] & 0xff00)) { + + if (!(gBattleAnimArgs[5] & 0xff00)) v1 = TRUE; - } else { + else v1 = FALSE; - } - if (!(gBattleAnimArgs[5] & 0xff)) { + + if (!(gBattleAnimArgs[5] & 0xff)) v2 = 3; - } else { + else v2 = 1; - } + sub_80787B0(sprite, v1); - if (GetBankSide(gAnimBankAttacker)) { + if (GetBankSide(gAnimBankAttacker)) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; - } sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[2]; sprite->data[4] = GetBankPosition(gAnimBankTarget, v2) + gBattleAnimArgs[3]; @@ -1248,11 +1416,11 @@ void sub_807941C(struct Sprite *sprite) { StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } -void sub_80794A8(struct Sprite *sprite) { +void sub_80794A8(struct Sprite *sprite) +{ sub_80787B0(sprite, 1); - if (GetBankSide(gAnimBankAttacker)) { + if (GetBankSide(gAnimBankAttacker)) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; - } sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[2]; sprite->data[4] = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[3]; @@ -1261,31 +1429,38 @@ void sub_80794A8(struct Sprite *sprite) { sprite->callback = sub_8079518; } -void sub_8079518(struct Sprite *sprite) { - if (sub_8078718(sprite)) { +void sub_8079518(struct Sprite *sprite) +{ + if (sub_8078718(sprite)) DestroyAnimSprite(sprite); - } } -void sub_8079534(struct Sprite *sprite) { +void sub_8079534(struct Sprite *sprite) +{ u8 r4, slot, r7; - if (!gBattleAnimArgs[6]) { + + if (!gBattleAnimArgs[6]) + { r4 = 1; r7 = 3; - } else { + } + else + { r4 = 0; r7 = 1; } - if (!gBattleAnimArgs[5]) { + if (!gBattleAnimArgs[5]) + { sub_80787B0(sprite, r4); slot = gAnimBankAttacker; - } else { + } + else + { sub_8078764(sprite, r4); slot = gAnimBankTarget; } - if (GetBankSide(gAnimBankAttacker)) { + if (GetBankSide(gAnimBankAttacker)) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; - } sub_8078764(sprite, r4); sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = GetBankPosition(slot, 2) + gBattleAnimArgs[2]; @@ -1294,43 +1469,47 @@ void sub_8079534(struct Sprite *sprite) { StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } -s16 duplicate_obj_of_side_rel2move_in_transparent_mode(u8 a1) { +s16 duplicate_obj_of_side_rel2move_in_transparent_mode(u8 a1) +{ u16 i; u8 sprite = GetAnimBankSpriteId(a1); - if (sprite != 0xff) { - for (i = 0; i < 0x40; i++) { - if (gSprites[i].inUse) { - continue; + + if (sprite != 0xff) + { + for (i = 0; i < 0x40; i++) + { + if (!gSprites[i].inUse) + { + gSprites[i] = gSprites[sprite]; + gSprites[i].oam.objMode = 1; + gSprites[i].invisible = FALSE; + return i; } - gSprites[i] = gSprites[sprite]; - gSprites[i].oam.objMode = 1; - gSprites[i].invisible = FALSE; - return i; } } return -1; } -void obj_delete_but_dont_free_vram(struct Sprite *sprite) { +void obj_delete_but_dont_free_vram(struct Sprite *sprite) +{ sprite->usingSheet = TRUE; DestroySprite(sprite); } -void sub_8079670(u8 task) { +void sub_8079670(u8 task) +{ s16 v1 = 0; s16 v2 = 0; - if (gBattleAnimArgs[2] > gBattleAnimArgs[0]) { + + if (gBattleAnimArgs[2] > gBattleAnimArgs[0]) v2 = 1; - } - if (gBattleAnimArgs[2] < gBattleAnimArgs[0]) { + if (gBattleAnimArgs[2] < gBattleAnimArgs[0]) v2 = -1; - } - if (gBattleAnimArgs[3] > gBattleAnimArgs[1]) { + if (gBattleAnimArgs[3] > gBattleAnimArgs[1]) v1 = 1; - } - if (gBattleAnimArgs[3] < gBattleAnimArgs[1]) { + if (gBattleAnimArgs[3] < gBattleAnimArgs[1]) v1 = -1; - } + gTasks[task].data[0] = 0; gTasks[task].data[1] = gBattleAnimArgs[4]; gTasks[task].data[2] = 0; @@ -1344,30 +1523,38 @@ void sub_8079670(u8 task) { gTasks[task].func = sub_80796F8; } -void sub_80796F8(u8 taskId) { +void sub_80796F8(u8 taskId) +{ struct Task *task = &gTasks[taskId]; - if (++task->data[0] > task->data[1]) { + + if (++task->data[0] > task->data[1]) + { task->data[0] = 0; - if (++task->data[2] & 1) { - if (task->data[3] != task->data[7]) { + if (++task->data[2] & 1) + { + if (task->data[3] != task->data[7]) task->data[3] += task->data[5]; - } - } else { - if (task->data[4] != task->data[8]) { + } + else + { + if (task->data[4] != task->data[8]) task->data[4] += task->data[6]; - } } REG_BLDALPHA = (task->data[4] << 8) | task->data[3]; - if (task->data[3] == task->data[7] && task->data[4] == task->data[8]) { + if (task->data[3] == task->data[7] && task->data[4] == task->data[8]) + { DestroyAnimVisualTask(taskId); return; } } } -void sub_8079790(u8 task) { +void sub_8079790(u8 task) +{ u8 sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]); - if (sprite == 0xff) { + + if (sprite == 0xff) + { DestroyAnimVisualTask(task); return; } @@ -1375,7 +1562,8 @@ void sub_8079790(u8 task) { sub_80797EC(&gTasks[task]); } -void sub_80797EC(struct Task *task) { +void sub_80797EC(struct Task *task) +{ task->data[1] = gBattleAnimArgs[1]; task->data[2] = 0; task->data[3] = gBattleAnimArgs[2]; @@ -1386,24 +1574,33 @@ void sub_80797EC(struct Task *task) { task->func = sub_8079814; } -void sub_8079814(u8 taskId) { +void sub_8079814(u8 taskId) +{ struct Task *task = &gTasks[taskId]; - if (++task->data[4] >= task->data[5]) { + + if (++task->data[4] >= task->data[5]) + { task->data[4] = 0; - if (!task->data[6]) { + if (!task->data[6]) + { task->data[2]++; BlendPalette(task->data[0], 0xf, task->data[2], task->data[1]); - if (task->data[2] == task->data[3]) { + if (task->data[2] == task->data[3]) task->data[6] = 1; - } - } else { + } + else + { task->data[2]--; BlendPalette(task->data[0], 0xf, task->data[2], task->data[1]); - if (!task->data[2]) { - if (--task->data[7]) { + if (!task->data[2]) + { + if (--task->data[7]) + { task->data[4] = 0; task->data[6] = 0; - } else { + } + else + { DestroyAnimVisualTask(taskId); return; } @@ -1412,9 +1609,12 @@ void sub_8079814(u8 taskId) { } } -void sub_80798AC(u8 task) { +void sub_80798AC(u8 task) +{ u8 palette = IndexOfSpritePaletteTag(gBattleAnimArgs[0]); - if (palette == 0xff) { + + if (palette == 0xff) + { DestroyAnimVisualTask(task); return; } @@ -1422,7 +1622,8 @@ void sub_80798AC(u8 task) { sub_80797EC(&gTasks[task]); } -void sub_80798F4(struct Task *task, u8 a2, const void *a3) { +void sub_80798F4(struct Task *task, u8 a2, const void *a3) +{ task->data[7] = 0; task->data[8] = 0; task->data[9] = 0; @@ -1434,11 +1635,14 @@ void sub_80798F4(struct Task *task, u8 a2, const void *a3) { sub_8078E70(a2, 0); } -bool8 sub_807992C(struct Task *task) { +bool8 sub_807992C(struct Task *task) +{ gUnknown_0202F7D4 = sub_8079BFC(task->data[13], task->data[14]) + (task->data[7] << 3); - switch (gUnknown_0202F7D4->type) { + switch (gUnknown_0202F7D4->type) + { default: - if (!gUnknown_0202F7D4->frame.duration) { + if (!gUnknown_0202F7D4->frame.duration) + { task->data[10] = gUnknown_0202F7D4->frame.xScale; task->data[11] = gUnknown_0202F7D4->frame.yScale; task->data[12] = gUnknown_0202F7D4->frame.rotation; @@ -1450,44 +1654,49 @@ bool8 sub_807992C(struct Task *task) { task->data[12] += gUnknown_0202F7D4->frame.rotation; obj_id_set_rotscale(task->data[15], task->data[10], task->data[11], task->data[12]); sub_8079A64(task->data[15]); - if (++task->data[8] >= gUnknown_0202F7D4->frame.duration) { + if (++task->data[8] >= gUnknown_0202F7D4->frame.duration) + { task->data[8] = 0; task->data[7]++; } break; - case AFFINEANIMCMDTYPE_JUMP: task->data[7] = gUnknown_0202F7D4->jump.target; break; - case AFFINEANIMCMDTYPE_LOOP: - if (gUnknown_0202F7D4->loop.count) { - if (task->data[9]) { - if (!--task->data[9]) { + if (gUnknown_0202F7D4->loop.count) + { + if (task->data[9]) + { + if (!--task->data[9]) + { task->data[7]++; break; } - } else { + } + else + { task->data[9] = gUnknown_0202F7D4->loop.count; } - if (!task->data[7]) { + if (!task->data[7]) + { break; } - for (;;) { + for (;;) + { task->data[7]--; gUnknown_0202F7D4--; - if (gUnknown_0202F7D4->type == AFFINEANIMCMDTYPE_LOOP) { + if (gUnknown_0202F7D4->type == AFFINEANIMCMDTYPE_LOOP) + { task->data[7]++; return TRUE; } - if (!task->data[7]) { + if (!task->data[7]) return TRUE; - } } } task->data[7]++; break; - case 0x7fff: gSprites[task->data[15]].pos2.y = 0; sub_8078F40(task->data[15]); @@ -1497,52 +1706,62 @@ bool8 sub_807992C(struct Task *task) { return TRUE; } -void sub_8079A64(u8 sprite) { +void sub_8079A64(u8 sprite) +{ int var = 0x40 - sub_8079B10(sprite) * 2; u16 matrix = gSprites[sprite].oam.matrixNum; int var2 = (var << 8) / gOamMatrices[matrix].d; - if (var2 > 0x80) { + + if (var2 > 0x80) var2 = 0x80; - } gSprites[sprite].pos2.y = (var - var2) / 2; } -void sub_8079AB8(u8 sprite, u8 sprite2) { +void sub_8079AB8(u8 sprite, u8 sprite2) +{ int var = 0x40 - sub_8079B10(sprite2) * 2; u16 matrix = gSprites[sprite].oam.matrixNum; int var2 = (var << 8) / gOamMatrices[matrix].d; - if (var2 > 0x80) { + + if (var2 > 0x80) var2 = 0x80; - } gSprites[sprite].pos2.y = (var - var2) / 2; } -u16 sub_8079B10(u8 sprite) { +u16 sub_8079B10(u8 sprite) +{ struct TransformStatus *transform; u8 slot = gSprites[sprite].data[0]; u16 species; u16 i; - for (i = 0; i < (sizeof(gBattleMonSprites) / sizeof(u8)); i++) { - if (gBattleMonSprites[i] == sprite) { - if (IsContest()) { - species = ewram19348.unk0; + + for (i = 0; i < (sizeof(gBattleMonSprites) / sizeof(u8)); i++) + { + if (gBattleMonSprites[i] == sprite) + { + if (IsContest()) + { + species = shared19348.unk0; return gMonBackPicCoords[species].y_offset; - } else { - if (!GetBankSide(i)) { + } + else + { + if (!GetBankSide(i)) + { transform = &eTransformStatuses[slot]; - if (!transform->species) { + if (!transform->species) species = GetMonData(&gPlayerParty[gBattleMonPartyPositions[i]], MON_DATA_SPECIES); - } else { + else species = transform->species; - } return gMonBackPicCoords[species].y_offset; - } else { + } + else + { transform = &eTransformStatuses[slot]; - if (!transform->species) { + if (!transform->species) species = GetMonData(&gEnemyParty[gBattleMonPartyPositions[i]], MON_DATA_SPECIES); - } else { + else species = transform->species; - } return gMonFrontPicCoords[species].y_offset; } } @@ -1551,19 +1770,22 @@ u16 sub_8079B10(u8 sprite) { return 0x40; } -void sub_8079BF4(s16 *bottom, s16 *top, const void *ptr) { +void sub_8079BF4(s16 *bottom, s16 *top, const void *ptr) +{ *bottom = ((intptr_t) ptr) & 0xffff; *top = (((intptr_t) ptr) >> 16) & 0xffff; } -void *sub_8079BFC(s16 bottom, s16 top) { +void *sub_8079BFC(s16 bottom, s16 top) +{ return (void *)((u16)bottom | ((u16)top << 16)); } // possible new file -void sub_8079C08(struct Task *task, u8 a2, s16 a3, s16 a4, s16 a5, s16 a6, u16 a7) { +void sub_8079C08(struct Task *task, u8 a2, s16 a3, s16 a4, s16 a5, s16 a6, u16 a7) +{ task->data[8] = a7; task->data[15] = a2; // spriteId task->data[9] = a3; @@ -1574,124 +1796,133 @@ void sub_8079C08(struct Task *task, u8 a2, s16 a3, s16 a4, s16 a5, s16 a6, u16 a task->data[12] = (a6 - a4) / a7; } -u8 sub_8079C74(struct Task *task) { - if (!task->data[8]) { +u8 sub_8079C74(struct Task *task) +{ + if (!task->data[8]) return 0; - } - if (--task->data[8]) { + + if (--task->data[8] != 0) + { task->data[9] += task->data[11]; task->data[10] += task->data[12]; - } else { + } + else + { task->data[9] = task->data[13]; task->data[10] = task->data[14]; } obj_id_set_rotscale(task->data[15], task->data[9], task->data[10], 0); - if (task->data[8]) { + if (task->data[8]) sub_8079A64(task->data[15]); - } else { + else gSprites[task->data[15]].pos2.y = 0; - } return task->data[8]; } -void sub_8079CEC(u8 task) { +void sub_8079CEC(u8 task) +{ u16 v1; - if (gAnimFriendship <= 30) { + + if (gAnimFriendship <= 30) v1 = 0; - } else if (gAnimFriendship <= 100) { + else if (gAnimFriendship <= 100) v1 = 1; - } else if (gAnimFriendship <= 200) { + else if (gAnimFriendship <= 200) v1 = 2; - } else { + else v1 = 3; - } gBattleAnimArgs[7] = v1; DestroyAnimVisualTask(task); } -void unref_sub_8079D20(u8 priority) { - if (IsAnimBankSpriteVisible(gAnimBankTarget)) { +void unref_sub_8079D20(u8 priority) +{ + if (IsAnimBankSpriteVisible(gAnimBankTarget)) gSprites[gBattleMonSprites[gAnimBankTarget]].oam.priority = priority; - } - if (IsAnimBankSpriteVisible(gAnimBankAttacker)) { + if (IsAnimBankSpriteVisible(gAnimBankAttacker)) gSprites[gBattleMonSprites[gAnimBankAttacker]].oam.priority = priority; - } - if (IsAnimBankSpriteVisible(gAnimBankTarget ^ 2)) { + if (IsAnimBankSpriteVisible(gAnimBankTarget ^ 2)) gSprites[gBattleMonSprites[gAnimBankTarget ^ 2]].oam.priority = priority; - } - if (IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2)) { + if (IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2)) gSprites[gBattleMonSprites[gAnimBankAttacker ^ 2]].oam.priority = priority; - } } -void sub_8079E24() { +void sub_8079E24() +{ int i; - for (i = 0; i < gNoOfAllBanks; i++) { - if (IsAnimBankSpriteVisible(i)) { + + for (i = 0; i < gNoOfAllBanks; i++) + { + if (IsAnimBankSpriteVisible(i)) + { gSprites[gBattleMonSprites[i]].subpriority = sub_8079E90(i); gSprites[gBattleMonSprites[i]].oam.priority = 2; } } } -u8 sub_8079E90(u8 slot) { +u8 sub_8079E90(u8 slot) +{ u8 status; u8 ret; - if (IsContest()) { - if (slot == 2) { + + if (IsContest()) + { + if (slot == 2) return 30; - } else { + else return 40; - } - } else { + } + else + { status = GetBankIdentity(slot); - if (status == 0) { + if (status == 0) ret = 30; - } else if (status == 2) { + else if (status == 2) ret = 20; - } else if (status == 1) { + else if (status == 1) ret = 40; - } else { + else ret = 50; - } } return ret; } -u8 sub_8079ED4(u8 slot) { +u8 sub_8079ED4(u8 slot) +{ u8 status = GetBankIdentity(slot); - if (IsContest()) { + + if (IsContest()) return 2; - } - if (status == 0 || status == 3) { + if (status == 0 || status == 3) return BG2CNT.priority; - } else { + else return BG1CNT.priority; - } } -u8 GetBankIdentity_permutated(u8 slot) { +u8 GetBankIdentity_permutated(u8 slot) +{ u8 status; - if (!IsContest()) { + + if (!IsContest()) + { status = GetBankIdentity(slot); - if (status == 0 || status == 3) { + if (status == 0 || status == 3) return 2; - } else { + else return 1; - } } return 1; } -u8 sub_8079F44(u16 species, u8 isBackpic, u8 a3, s16 a4, s16 a5, u8 a6, u32 a7, u32 a8) { - void *src; - void *dest; - int size; - +u8 sub_8079F44(u16 species, u8 isBackpic, u8 a3, s16 a4, s16 a5, u8 a6, u32 a7, u32 a8) +{ u8 sprite; u16 sheet = LoadSpriteSheet(&gUnknown_0837F5E0[a3]); u16 palette = AllocSpritePalette(gSpriteTemplate_837F5B0[a3].paletteTag); - if (!isBackpic) { + + if (!isBackpic) + { LoadCompressedPalette(GetMonSpritePalFromOtIdPersonality(species, a8, a7), (palette * 0x10) + 0x100, 0x20); LoadSpecialPokePic( &gMonFrontPicTable[species], @@ -1703,9 +1934,10 @@ u8 sub_8079F44(u16 species, u8 isBackpic, u8 a3, s16 a4, s16 a5, u8 a6, u32 a7, a7, 1 ); - } else { - LoadCompressedPalette( - GetMonSpritePalFromOtIdPersonality(species, a8, a7), (palette * 0x10) + 0x100, 0x20); + } + else + { + LoadCompressedPalette(GetMonSpritePalFromOtIdPersonality(species, a8, a7), (palette * 0x10) + 0x100, 0x20); LoadSpecialPokePic( &gMonBackPicTable[species], gMonBackPicCoords[species].coords, @@ -1718,28 +1950,28 @@ u8 sub_8079F44(u16 species, u8 isBackpic, u8 a3, s16 a4, s16 a5, u8 a6, u32 a7, ); } - src = (void *)0x2000000; - dest = (void *)(0x6010000 + (sheet * 0x20)); - size = 0x800; - DmaCopy32(3, src, dest, size); + DmaCopy32Defvars(3, (void *)0x2000000, (void *)(VRAM + 0x10000 + (sheet * 0x20)), 0x800); - if (!isBackpic) { + if (!isBackpic) sprite = CreateSprite(&gSpriteTemplate_837F5B0[a3], a4, a5 + gMonFrontPicCoords[species].y_offset, a6); - } else { + else sprite = CreateSprite(&gSpriteTemplate_837F5B0[a3], a4, a5 + gMonBackPicCoords[species].y_offset, a6); - } - if (IsContest()) { + + if (IsContest()) + { gSprites[sprite].affineAnims = gSpriteAffineAnimTable_81E7C18; StartSpriteAffineAnim(&gSprites[sprite], 0); } return sprite; } -void sub_807A0F4(struct Sprite *sprite) { +void sub_807A0F4(struct Sprite *sprite) +{ DestroySpriteAndFreeResources(sprite); } -int sub_807A100(u8 slot, u8 a2) { +s16 sub_807A100(u8 slot, u8 a2) +{ u16 species; u32 personality; u16 letter; @@ -1747,80 +1979,113 @@ int sub_807A100(u8 slot, u8 a2) { int ret; const struct MonCoords *coords; struct TransformStatus *transform; - if (IsContest()) { - if (ewram19348.unk4 & 1) { - species = ewram19348.unk2; - personality = ewram19348.unk10; - } else { - species = ewram19348.unk0; - personality = ewram19348.unk8; + + if (IsContest()) + { + if (shared19348.unk4_0) + { + species = shared19348.unk2; + personality = shared19348.unk10; + } + else + { + species = shared19348.unk0; + personality = shared19348.unk8; } - if (species == SPECIES_UNOWN) { + if (species == SPECIES_UNOWN) + { letter = GET_UNOWN_LETTER(personality); - if (!letter) { + if (!letter) var = SPECIES_UNOWN; - } else { + else var = letter + SPECIES_UNOWN_B - 1; - } coords = &gMonBackPicCoords[var]; - } else if (species == SPECIES_CASTFORM) { + } + else if (species == SPECIES_CASTFORM) + { coords = &gCastformFrontSpriteCoords[gBattleMonForms[slot]]; - } else if (species <= SPECIES_EGG) { + } + else if (species <= SPECIES_EGG) + { coords = &gMonBackPicCoords[species]; - } else { + } + else + { coords = &gMonBackPicCoords[0]; } - } else { - if (!GetBankSide(slot)) { + } + else + { + if (!GetBankSide(slot)) + { transform = &eTransformStatuses[slot]; - if (!transform->species) { + if (!transform->species) + { species = GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES); personality = GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_PERSONALITY); - } else { + } + else + { species = transform->species; personality = gTransformPersonalities[slot]; } - if (species == SPECIES_UNOWN) { + if (species == SPECIES_UNOWN) + { letter = GET_UNOWN_LETTER(personality); - if (!letter) { + if (!letter) var = SPECIES_UNOWN; - } else { + else var = letter + SPECIES_UNOWN_B - 1; - } coords = &gMonBackPicCoords[var]; - } else if (species > SPECIES_EGG) { + } + else if (species > SPECIES_EGG) + { coords = &gMonBackPicCoords[0]; - } else { + } + else + { coords = &gMonBackPicCoords[species]; } - } else { + } + else + { transform = &eTransformStatuses[slot]; - if (!transform->species) { + if (!transform->species) + { species = GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES); personality = GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_PERSONALITY); - } else { + } + else + { species = transform->species; personality = gTransformPersonalities[slot]; } - if (species == SPECIES_UNOWN) { + if (species == SPECIES_UNOWN) + { letter = GET_UNOWN_LETTER(personality); - if (!letter) { + if (!letter) var = SPECIES_UNOWN; - } else { + else var = letter + SPECIES_UNOWN_B - 1; - } coords = &gMonFrontPicCoords[var]; - } else if (species == SPECIES_CASTFORM) { + } + else if (species == SPECIES_CASTFORM) + { coords = &gCastformFrontSpriteCoords[gBattleMonForms[slot]]; - } else if (species > SPECIES_EGG) { + } + else if (species > SPECIES_EGG) + { coords = &gMonFrontPicCoords[0]; - } else { + } + else + { coords = &gMonFrontPicCoords[species]; } } } - switch (a2) { + switch (a2) + { case 0: return (coords->coords & 0xf) * 8; case 1: @@ -1841,23 +2106,31 @@ int sub_807A100(u8 slot, u8 a2) { } } -void sub_807A3FC(u8 slot, u8 a2, s16 *a3, s16 *a4) { +void sub_807A3FC(u8 slot, bool8 a2, s16 *a3, s16 *a4) +{ u8 v1, v2; s16 v3, v4; s16 v5, v6; - if (!a2) { + + if (!a2) + { v1 = 0; v2 = 1; - } else { + } + else + { v1 = 2; v2 = 3; } v3 = GetBankPosition(slot, v1); v4 = GetBankPosition(slot, v2); - if (IsDoubleBattle() && !IsContest()) { + if (IsDoubleBattle() && !IsContest()) + { v5 = GetBankPosition(slot ^ 2, v1); v6 = GetBankPosition(slot ^ 2, v2); - } else { + } + else + { v5 = v3; v6 = v4; } @@ -1865,7 +2138,8 @@ void sub_807A3FC(u8 slot, u8 a2, s16 *a3, s16 *a4) { *a4 = (v4 + v6) / 2; } -u8 sub_807A4A0(int a1, u8 sprite, int a3) { +u8 sub_807A4A0(int bank, u8 sprite, int species) +{ u8 new_sprite = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); gSprites[new_sprite] = gSprites[sprite]; gSprites[new_sprite].usingSheet = TRUE; @@ -1876,13 +2150,19 @@ u8 sub_807A4A0(int a1, u8 sprite, int a3) { return new_sprite; } -void sub_807A544(struct Sprite *sprite) { +// unused_orb + +void sub_807A544(struct Sprite *sprite) +{ sub_8078650(sprite); - if (GetBankSide(gAnimBankAttacker)) { + if (GetBankSide(gAnimBankAttacker)) + { sprite->pos1.x -= gBattleAnimArgs[0]; gBattleAnimArgs[3] = -gBattleAnimArgs[3]; sprite->hFlip = TRUE; - } else { + } + else + { sprite->pos1.x += gBattleAnimArgs[0]; } sprite->pos1.y += gBattleAnimArgs[1]; @@ -1894,11 +2174,15 @@ void sub_807A544(struct Sprite *sprite) { sprite->callback = sub_8078504; } -void sub_807A5C4(struct Sprite *sprite) { - if (GetBankSide(gAnimBankAttacker)) { +void sub_807A5C4(struct Sprite *sprite) +{ + if (GetBankSide(gAnimBankAttacker)) + { sprite->pos1.x -= gBattleAnimArgs[0]; gBattleAnimArgs[3] *= -1; - } else { + } + else + { sprite->pos1.x += gBattleAnimArgs[0]; } sprite->pos1.y += gBattleAnimArgs[1]; @@ -1911,19 +2195,24 @@ void sub_807A5C4(struct Sprite *sprite) { sprite->callback = sub_8078504; } -void sub_807A63C(struct Sprite *sprite) { +// file_2 + +void sub_807A63C(struct Sprite *sprite) +{ sub_8078650(sprite); - if (GetBankSide(gAnimBankAttacker)) { + if (GetBankSide(gAnimBankAttacker)) sprite->pos1.x -= gBattleAnimArgs[0]; - } else { + else sprite->pos1.x += gBattleAnimArgs[0]; - } sprite->pos1.y += gBattleAnimArgs[1]; sprite->callback = sub_8078600; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } -void sub_807A69C(u8 taskId) { +// file_3 (punch effect?) + +void sub_807A69C(u8 taskId) +{ u16 src; u16 dest; struct Task *task = &gTasks[taskId]; @@ -1938,23 +2227,25 @@ void sub_807A69C(u8 taskId) { dest = (task->data[4] + 0x10) * 0x10; src = (gSprites[task->data[0]].oam.paletteNum + 0x10) * 0x10; task->data[6] = sub_8079E90(gAnimBankAttacker); - if (task->data[6] == 20 || task->data[6] == 40) { + if (task->data[6] == 20 || task->data[6] == 40) task->data[6] = 2; - } else { + else task->data[6] = 3; - } CpuCopy32(&gPlttBufferUnfaded[src], &gPlttBufferFaded[dest], 0x20); BlendPalette(dest, 0x10, gBattleAnimArgs[1], gBattleAnimArgs[0]); task->func = sub_807A784; } -void sub_807A784(u8 taskId) { +void sub_807A784(u8 taskId) +{ struct Task *task = &gTasks[taskId]; - switch (task->data[2]) { + switch (task->data[2]) + { case 0: sub_807A850(task, taskId); gSprites[task->data[0]].pos2.x += task->data[1]; - if (++task->data[3] == 5) { + if (++task->data[3] == 5) + { task->data[3]--; task->data[2]++; } @@ -1962,13 +2253,15 @@ void sub_807A784(u8 taskId) { case 1: sub_807A850(task, taskId); gSprites[task->data[0]].pos2.x -= task->data[1]; - if (--task->data[3] == 0) { + if (--task->data[3] == 0) + { gSprites[task->data[0]].pos2.x = 0; task->data[2]++; } break; case 2: - if (!task->data[5]) { + if (!task->data[5]) + { FreeSpritePaletteByTag(10097); DestroyAnimVisualTask(taskId); } @@ -1976,9 +2269,11 @@ void sub_807A784(u8 taskId) { } } -void sub_807A850(struct Task *task, u8 taskId) { +void sub_807A850(struct Task *task, u8 taskId) +{ s16 sprite = duplicate_obj_of_side_rel2move_in_transparent_mode(0); - if (sprite >= 0) { + if (sprite >= 0) + { gSprites[sprite].oam.priority = task->data[6]; gSprites[sprite].oam.paletteNum = task->data[4]; gSprites[sprite].data[0] = 8; @@ -1990,48 +2285,54 @@ void sub_807A850(struct Task *task, u8 taskId) { } } -void sub_807A8D4(struct Sprite *sprite) { - if (--sprite->data[0] == 0) { +void sub_807A8D4(struct Sprite *sprite) +{ + if (--sprite->data[0] == 0) + { gTasks[sprite->data[1]].data[5]--; obj_delete_but_dont_free_vram(sprite); } } +// file_4 + void sub_807A908(struct Sprite *sprite) { sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2); sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3); - if (!GetBankSide(gAnimBankAttacker)) { + if (!GetBankSide(gAnimBankAttacker)) sprite->data[0] = 5; - } else { + else sprite->data[0] = -10; - } sprite->data[1] = -40; sprite->callback = sub_807A960; } -void sub_807A960(struct Sprite *sprite) { +void sub_807A960(struct Sprite *sprite) +{ sprite->data[2] += sprite->data[0]; sprite->data[3] += sprite->data[1]; sprite->pos2.x = sprite->data[2] / 10; sprite->pos2.y = sprite->data[3] / 10; - if (sprite->data[1] < -20) { + if (sprite->data[1] < -20) sprite->data[1]++; - } - if ((sprite->pos1.y + sprite->pos2.y) < -32) { + if (sprite->pos1.y + sprite->pos2.y < -32) DestroyAnimSprite(sprite); - } } -void sub_807A9BC(struct Sprite *sprite) { +void sub_807A9BC(struct Sprite *sprite) +{ int x; sprite->data[0] = gBattleAnimArgs[2]; sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[4]; sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[5]; - if (!GetBankSide(gAnimBankTarget)) { + if (!GetBankSide(gAnimBankTarget)) + { x = (u16)gBattleAnimArgs[4] + 30; sprite->pos1.x += x; sprite->pos1.y = gBattleAnimArgs[5] - 20; - } else { + } + else + { x = (u16)gBattleAnimArgs[4] - 30; sprite->pos1.x += x; sprite->pos1.y = gBattleAnimArgs[5] - 80; diff --git a/src/roulette.c b/src/roulette.c new file mode 100644 index 000000000..838ce94f8 --- /dev/null +++ b/src/roulette.c @@ -0,0 +1,5731 @@ +#include "global.h" +#include "ewram.h" +#include "field_fadetransition.h" +#include "constants/game_stat.h" +#include "m4a.h" +#include "main.h" +#include "menu.h" +#include "menu_cursor.h" +#include "menu_helpers.h" +#include "overworld.h" +#include "palette.h" +#include "pokemon.h" +#include "roulette.h" +#include "roulette_util.h" +#include "rtc.h" +#include "constants/songs.h" +#include "sound.h" +#include "script.h" +#include "constants/species.h" +#include "sprite.h" +#include "strings2.h" +#include "string_util.h" +#include "task.h" +#include "text.h" +#include "trig.h" +#include "scanline_effect.h" + +asm(".include \"constants/gba_constants.inc\""); + +struct Roulette /* ewram + 0x19000 */ +{ + u8 var00; + u8 var01; + u8 var02; + u8 var03_0:5; + u8 var03_5:1; + u8 var03_6:1; + u8 var03_7:1; + u8 var04_0:2; + u8 var04_2:5; + u8 var04_7:1; + u32 var08; + u8 var0C[0x6]; + u8 var12[0x4]; + u8 var16[0x3]; + u8 var19; + u8 var1A_0:4; + u8 var1A_4:4; + u8 var1B[0x6]; + u8 var21; + u8 var22; + u8 var23; + s16 var24; + s16 var26; + s16 var28; + s16 var2A; + struct OamMatrix var2C; + u16 var34; + struct Sprite *var38; + u8 var3C[0x40]; // Sprite IDs + u8 var7C; + u8 var7D; + u8 var7E; + u8 var7F; + s16 var80; + s16 var82; + s16 var84; + s16 var86; + float var88; + float var8C; + float var90; + float var94; + float var98; + float var9C; + float varA0; + u8 varA4; + u8 varA5; + u8 v51[0x2]; + u16 varA8; + u16 varAA; + TaskFunc varAC; + u8 v46[0x4]; + TaskFunc varB4; + struct UnkStruct0 varB8; +}; + +struct StructgUnknown_083F8DF4 +{ + u8 var00; + u8 var01; + u8 var02; + u8 var03; + u8 var04; + u8 v[0x3]; + u16 var08; + u16 var0A; + u16 var0C; + u16 v13[0x1]; + u16 var10; + u16 var12; + u16 var14; + u8 v1[0x2]; + u16 var18; + u16 var1A; + float var1C; +}; + +struct StructgUnknown_083F8C00 +{ + u8 var00; + u8 var01_0:4; + u8 var01_4:4; + u8 var02; + u8 var03; + u8 var04; + u8 var05; + u8 var06; + u8 var07; + u32 var08; + u32 var0C; + u16 var10; + u16 var12; +}; + +struct StructgUnknown_083F8D90 +{ + u8 var00; + u8 var01; + u8 var02; + u8 var03; + u32 var04; +}; + +#if DEBUG +u8 gUnknown_Debug_03005FB8; +#endif + +#define static + +static void sub_81150FC(void); +static void sub_8115124(void); +static void sub_8115238(void); +static void sub_8115384(void); +static void sub_8115634(u8); +static void sub_81156BC(u8); +static void sub_8115734(u8); +void sub_811577C(u8); +void sub_81157AC(u8); +static void sub_81157D0(u8); +static void sub_8115928(u8, u8); +static void sub_811597C(u8); +static void sub_81159BC(u8); +static u8 sub_8115A94(s16 *, u8); +void sub_8115B58(u8); +static void sub_8115DA0(u8); +static void sub_8115E14(u8); +static void sub_8115ECC(u8); +u8 sub_8115F58(u16, u16); +static void sub_8116100(u8); +void sub_8116308(u8); +static void sub_811637C(u8); +static void sub_8116474(u8); +static void sub_8116514(u8); +static void sub_811659C(u8); +static void sub_8116638(u8); +static void sub_81166E8(u8); +static void sub_811677C(u8); +static void sub_81167F4(u8); +static void sub_8116880(u8); +static void dp01t_12_3_battle_menu(u8); +static void sub_8116AB0(u8); +static void sub_8116B40(u8); +static void sub_8116BC0(u8); +static void sub_8116C34(u8, TaskFunc, u16, u16); +static void sub_8116CAC(u8); +static void sub_8116CF8(void); +static u8 sub_8116D54(u8, u8); +static u8 sub_8116E5C(u8, u8); +static void sub_8116EF8(u8); +static void sub_8117158(u8); +static u8 sub_8117380(u8); +static void sub_8117434(void); +static void sub_81174F8(u8); +static void sub_8117528(u8); +void sub_811755C(u8); +void sub_81175C0(u8); +static void sub_81175DC(u8); +static void sub_8117630(u8); +static void Task_Roulette_0(u8); +static void sub_8117838(u8); +static u8 sub_8117890(const struct SpriteTemplate *, u8, u16 *); +static void sub_8117900(void); +void unref_sub_8117A74(void); +static void sub_8117AA8(u8, u8); +static void sub_8117BBC(void); +static void sub_8117C60(u8, u8); +static void sub_8117D68(u8); +static void sub_8117DF4(void); +void sub_8117E98(struct Sprite *); +static void sub_8117F2C(void); +static void sub_81180F4(u16); +static u8 sub_81181E8(u8); +static void sub_811829C(u8); +static void sub_81182F8(u8); +void sub_81184CC(struct Sprite *); +static void sub_81184D8(void); +void sub_8118554(struct Sprite *); +static void sub_811857C(void); +static void sub_81185E8(void); +static s16 sub_811866C(struct Sprite *); +static u8 sub_81186B8(struct Sprite *); +static s16 sub_81186E8(struct Sprite *); +static void sub_8118724(struct Sprite *); +static void sub_8118834(struct Sprite *); +static void sub_811889C(struct Sprite *); +static void sub_81189A8(struct Sprite *); +static void sub_8118B30(struct Sprite *); +static void sub_8118BD8(struct Sprite *); +static void sub_8118CAC(struct Sprite *); +void sub_8118CEC(struct Sprite *); +void sub_8118D2C(struct Sprite *); +static void sub_8118DE4(struct Sprite *); +static void sub_8118F8C(struct Sprite *); +static void sub_8119088(struct Sprite *); +static void sub_8119134(struct Sprite *); +static void sub_81191F4(struct Sprite *); +static void sub_8119224(struct Sprite *); +static void sub_81193D4(struct Sprite *); +static void sub_811952C(struct Sprite *); +static void sub_8119780(struct Sprite *); +static void sub_81197D8(struct Sprite *); +static void sub_8119898(struct Sprite *); +void sub_8119964(struct Sprite *); +static void sub_8119A90(struct Sprite *); +static void sub_8119AAC(struct Sprite *); +static void sub_8119B24(struct Sprite *); +static void sub_8119BCC(struct Sprite *); +static void sub_8119D08(struct Sprite *); +void sub_8119D80(struct Sprite *); + +extern u8 gUnknown_02019000[]; +extern u16 gSpecialVar_0x8004; +extern struct StructgUnknown_083F8DF4 gUnknown_083F8DF4[]; +extern u8 gUnknown_083F8EC4; +extern u8 gUnknown_083F8DF0[]; +extern u8 gUnknown_083F8E34[]; +extern const u8 gUnknown_08E8096C[]; +extern const u8 gRouletteWheelTiles[]; +extern const u8 gRouletteCenter_Gfx[]; +extern const u8 gRouletteHeadersTiles[]; +extern const u8 gRouletteCreditTiles[]; +extern const u8 gRouletteNumbersTiles[]; +extern const u8 gRouletteMultiplierTiles[]; +extern const u16 gUnknown_083F86BC[]; +extern const u8 gUnknown_083F88BC[]; +extern const u8 gUnknown_083F8A60[]; +extern u16 gPlttBufferFaded[]; +extern u16 gPlttBufferUnfaded[]; +extern const u8 gUnknown_081C4157[]; +extern const struct YesNoFuncTable gUnknown_083F8EBC; +extern const u8 gUnknown_081C41E3; +extern const u16 gUnknown_083F8ECE; +extern const struct StructgUnknown_083F8C00 gUnknown_083F8C00[]; +const extern u8 gUnknown_083F8ECA[]; +const extern u8 gUnknown_081C41A5; +const extern u8 gUnknown_081C4199; +const extern u8 gUnknown_081C41AE; +const extern u8 gUnknown_081C41BD; +const extern u8 gUnknown_081C41F1; +const extern u8 gUnknown_081C4231; +const extern u8 gUnknown_081C41D2; +extern const struct StructgUnknown_083F8D90 gUnknown_083F8D90[]; +extern const u32 gUnknown_083F8ED8[]; +extern const u32 gUnknown_083F8EE8[]; +extern const struct UnkStruct1 gUnknown_083F8E9C[]; +extern const u8 gUnknown_083F8EF4[]; +extern const struct YesNoFuncTable gUnknown_083F8EB4; +extern const u8 gUnknown_081C40DF; +extern const u8 gUnknown_081C4139; +extern const u8 gUnknown_081C411C; +extern const u8 gUnknown_083F92A8[]; +extern const u8 gUnknown_083F90FC[]; +extern const u8 gUnknown_083F9D3C[]; +extern const struct SpritePalette gUnknown_083F9E30; +extern const struct SpriteSheet gUnknown_083F9F54; +extern const struct SpriteSheet gUnknown_083F9F5C; +extern const struct SpriteTemplate gSpriteTemplate_83FA07C[]; +extern const struct SpriteTemplate gSpriteTemplate_83F9FD4[]; +extern const struct SpriteTemplate gSpriteTemplate_83FA034[]; +extern const struct SpriteTemplate gSpriteTemplate_83FA40C; +extern const struct SpriteSheet gUnknown_083F9EE8; +extern const struct SpriteTemplate gSpriteTemplate_83FA0DC[]; +extern struct OamMatrix gOamMatrices[]; +extern const struct SpriteSheet gUnknown_083FA21C[]; +extern const struct SpriteTemplate gSpriteTemplate_83FA2B0; +extern const struct SpriteTemplate gSpriteTemplate_83FA2C8; +extern const struct SpriteTemplate gSpriteTemplate_83FA2E0; +extern const struct SpriteTemplate gSpriteTemplate_83FA2F8; +extern const struct SpriteTemplate gSpriteTemplate_83FA310; +extern const u8 gUnknown_083FA608[0x5]; +extern const struct SpriteSheet gUnknown_083FA42C; +extern const struct SpriteTemplate gSpriteTemplate_83FA434; +extern void (*gFieldCallback)(void); +extern struct MusicPlayerInfo gMPlay_SE1; +extern struct MusicPlayerInfo gMPlay_SE2; +extern const u16 gUnknown_083FA60E[0x2][0x2]; +extern const struct SpriteTemplate gSpriteTemplate_83FA50C; +extern const struct SpriteTemplate gSpriteTemplate_83FA5C0[]; +extern const u16 gUnknown_083FA616[0x2][0x2]; +extern const struct SpriteTemplate gSpriteTemplate_83FA524; +extern const struct SpriteTemplate gSpriteTemplate_83FA5F0; +extern const u16 gUnknown_083FA61E[0xA]; +extern const u16 gUnknown_083FA632[]; +extern const s8 gUnknown_083FA64A[0x2]; +extern const s8 gUnknown_083FA64C[0x8][0x2]; + +#if DEBUG +EWRAM_DATA u8 unk_203955C[4] = { 0 }; +EWRAM_DATA u8 unk_2039560[4] = { 0 }; +#endif + + +void sub_81150FC(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + if (eRoulette->varB8.var00) + task_tutorial_controls_fadein(&eRoulette->varB8); +} + +void sub_8115124(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + sub_8117434(); + REG_BG1HOFS = 0x200 - eRoulette->var26; + if (eRoulette->var01) + REG_BLDALPHA = eRoulette->var34; + if (eRoulette->var2A != 0) + { + DmaCopy16(3, &gBGTilemapBuffers[1][0xE0], (void *)(VRAM + 0x21C0), 0x340); + eRoulette->var2A = 0x0; + } + switch (eRoulette->var28) + { + case 0x1: + REG_BG0CNT = (0x20 * 0xF8); + DmaCopy16(3, &gBGTilemapBuffers[2][0xE0], (void *)(VRAM + 0xF9C0), 0x340); + eRoulette->var28 = 0x2; + break; + case 0x2: + DmaCopy16(3, &gBGTilemapBuffers[2][0xE0], (void *)(VRAM + 0xF9C0), 0x340); + break; + case 0xFF: + REG_BG0CNT = 0x1F08; + DmaFill16(3, 0x0, (void *)(VRAM + 0xF9C0), 0x340); + eRoulette->var28 = 0x0; + break; + case 0x0: + } +} +#ifdef NONMATCHING + +void sub_8115238(void) +{ + u8 i; + u32 temp; + struct PlttData t; + struct PlttData *unfaded; + struct PlttData *faded; + struct StructgUnknown_083F8DF4 *s0; + struct PlttData arr[0x3]; // the third is never used ? + memcpy(&arr, &gUnknown_083F8EC4, 0x6); + memset(eRoulette, 0x0, 0x17C); + eRoulette->var04_0 = (gSpecialVar_0x8004 & 0x1); + if (gSpecialVar_0x8004 & 0x80) + eRoulette->var04_7 = 0x1; + s0 = &gUnknown_083F8DF4[0]; + eRoulette->var22 = s0[eRoulette->var04_0].var03; + eRoulette->var23 = s0[eRoulette->var04_0].var04; + temp = gUnknown_083F8DF0[eRoulette->var04_0 + eRoulette->var04_7 * 2]; + eRoulette->var19 = temp; + eRoulette->var1A_4 = 0x1; + if (temp == 0x1) + { + unfaded = (struct PlttData *)&gPlttBufferUnfaded[0]; + faded = (struct PlttData *)&gPlttBufferFaded[0]; + t = arr[0]; + } + else + { + unfaded = (struct PlttData *)&gPlttBufferUnfaded[0]; + faded = (struct PlttData *)&gPlttBufferFaded[0]; + t = arr[1]; + } + faded[0x51] = t; + faded[0x0] = faded[0x51]; + unfaded[0x51] = t; + unfaded[0x0] = t; + sub_8124918((&eRoulette->varB8)); + for (i = 0; i < 0xD; i++) + sub_812492C((&eRoulette->varB8), i, (struct UnkStruct1 *)&gUnknown_083F8E34[i * 8]); + for (i = 0; i < 0x6; i++) + { + switch (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2)) + { + case SPECIES_TAILLOW: + eRoulette->var02 |= 0x2; + break; + case SPECIES_SHROOMISH: + eRoulette->var02 |= 0x1; + break; + } + } + RtcCalcLocalTime(); +} +#else +__attribute__((naked)) +void sub_8115238(void) +{ + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + sub sp, 0x8\n\ + ldr r1, _081152C0 @ =gUnknown_083F8EC4\n\ + mov r0, sp\n\ + movs r2, 0x6\n\ + bl memcpy\n\ + ldr r5, _081152C4 @ =0x02019000\n\ + movs r2, 0xBE\n\ + lsls r2, 1\n\ + adds r0, r5, 0\n\ + movs r1, 0\n\ + bl memset\n\ + ldr r0, _081152C8 @ =gSpecialVar_0x8004\n\ + ldrh r2, [r0]\n\ + movs r0, 0x1\n\ + ands r0, r2\n\ + ldrb r1, [r5, 0x4]\n\ + movs r3, 0x4\n\ + negs r3, r3\n\ + ands r3, r1\n\ + orrs r3, r0\n\ + strb r3, [r5, 0x4]\n\ + movs r0, 0x80\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + beq _08115276\n\ + movs r0, 0x80\n\ + orrs r3, r0\n\ + strb r3, [r5, 0x4]\n\ + _08115276:\n\ + ldr r3, _081152CC @ =gUnknown_083F8DF4\n\ + ldrb r2, [r5, 0x4]\n\ + lsls r1, r2, 30\n\ + lsrs r0, r1, 25\n\ + adds r0, r3\n\ + ldrb r0, [r0, 0x3]\n\ + adds r4, r5, 0\n\ + adds r4, 0x22\n\ + strb r0, [r4]\n\ + lsrs r0, r1, 25\n\ + adds r0, r3\n\ + ldrb r0, [r0, 0x4]\n\ + adds r3, r5, 0\n\ + adds r3, 0x23\n\ + strb r0, [r3]\n\ + ldr r0, _081152D0 @ =gUnknown_083F8DF0\n\ + lsrs r1, 30\n\ + lsls r2, 24\n\ + lsrs r2, 31\n\ + lsls r2, 1\n\ + adds r1, r2\n\ + adds r1, r0\n\ + ldrb r2, [r1]\n\ + strb r2, [r5, 0x19]\n\ + ldrb r1, [r5, 0x1A]\n\ + movs r0, 0xF\n\ + ands r0, r1\n\ + movs r1, 0x10\n\ + orrs r0, r1\n\ + strb r0, [r5, 0x1A]\n\ + cmp r2, 0x1\n\ + bne _081152DC\n\ + ldr r4, _081152D4 @ =gPlttBufferUnfaded\n\ + ldr r3, _081152D8 @ =gPlttBufferFaded\n\ + mov r0, sp\n\ + ldrh r2, [r0]\n\ + b _081152E4\n\ + .align 2, 0\n\ + _081152C0: .4byte gUnknown_083F8EC4\n\ + _081152C4: .4byte 0x02019000\n\ + _081152C8: .4byte gSpecialVar_0x8004\n\ + _081152CC: .4byte gUnknown_083F8DF4\n\ + _081152D0: .4byte gUnknown_083F8DF0\n\ + _081152D4: .4byte gPlttBufferUnfaded\n\ + _081152D8: .4byte gPlttBufferFaded\n\ + _081152DC:\n\ + ldr r4, _08115348 @ =gPlttBufferUnfaded\n\ + ldr r3, _0811534C @ =gPlttBufferFaded\n\ + mov r0, sp\n\ + ldrh r2, [r0, 0x2]\n\ + _081152E4:\n\ + adds r0, r3, 0\n\ + adds r0, 0xA2\n\ + strh r2, [r0]\n\ + ldr r1, _08115350 @ =0x0000ffff\n\ + adds r0, r1, 0\n\ + ands r0, r2\n\ + strh r0, [r3]\n\ + ands r0, r1\n\ + adds r2, r4, 0\n\ + adds r2, 0xA2\n\ + strh r0, [r2]\n\ + ands r0, r1\n\ + strh r0, [r4]\n\ + ldr r0, _08115354 @ =0x020190b8\n\ + bl sub_8124918\n\ + movs r4, 0\n\ + ldr r5, _08115358 @ =gUnknown_083F8E34\n\ + _08115308:\n\ + lsls r2, r4, 3\n\ + adds r2, r5\n\ + ldr r0, _08115354 @ =0x020190b8\n\ + adds r1, r4, 0\n\ + bl sub_812492C\n\ + adds r0, r4, 0x1\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + cmp r4, 0xC\n\ + bls _08115308\n\ + movs r4, 0\n\ + ldr r5, _0811535C @ =0x02019000\n\ + _08115322:\n\ + movs r0, 0x64\n\ + muls r0, r4\n\ + ldr r1, _08115360 @ =gPlayerParty\n\ + adds r0, r1\n\ + movs r1, 0x41\n\ + bl GetMonData\n\ + adds r1, r0, 0\n\ + movs r0, 0x98\n\ + lsls r0, 1\n\ + cmp r1, r0\n\ + beq _08115364\n\ + adds r0, 0x2\n\ + cmp r1, r0\n\ + bne _0811536C\n\ + ldrb r0, [r5, 0x2]\n\ + movs r1, 0x1\n\ + b _08115368\n\ + .align 2, 0\n\ + _08115348: .4byte gPlttBufferUnfaded\n\ + _0811534C: .4byte gPlttBufferFaded\n\ + _08115350: .4byte 0x0000ffff\n\ + _08115354: .4byte 0x020190b8\n\ + _08115358: .4byte gUnknown_083F8E34\n\ + _0811535C: .4byte 0x02019000\n\ + _08115360: .4byte gPlayerParty\n\ + _08115364:\n\ + ldrb r0, [r5, 0x2]\n\ + movs r1, 0x2\n\ + _08115368:\n\ + orrs r0, r1\n\ + strb r0, [r5, 0x2]\n\ + _0811536C:\n\ + adds r0, r4, 0x1\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + cmp r4, 0x5\n\ + bls _08115322\n\ + bl RtcCalcLocalTime\n\ + add sp, 0x8\n\ + pop {r4-r6}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} +#endif + +#if DEBUG +__attribute__((naked)) +void sub_8115384(void) +{ + asm("\ + push {r4, lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r1, ._35 @ gUnknown_Debug_03005FB8\n\ + ldr r0, ._35 + 4 @ 0x2019000\n\ + str r0, [r1]\n\ + ldr r1, ._35 + 8 @ gMain\n\ + ldr r2, ._35 + 12 @ 0x43c\n\ + add r0, r1, r2\n\ + ldrb r0, [r0]\n\ + add r2, r1, #0\n\ + cmp r0, #0x7\n\ + bls ._33 @cond_branch\n\ + b ._64\n\ +._33:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._35 + 16 @ \n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._36:\n\ + .align 2, 0\n\ +._35:\n\ + .word gUnknown_Debug_03005FB8\n\ + .word 0x2019000\n\ + .word gMain\n\ + .word 0x43c\n\ + .word ._37\n\ +._37:\n\ + .word ._38\n\ + .word ._39\n\ + .word ._40\n\ + .word ._41\n\ + .word ._42\n\ + .word ._43\n\ + .word ._44\n\ + .word ._45\n\ +._38:\n\ + mov r0, #0x0\n\ + bl SetVBlankCallback\n\ + bl ScanlineEffect_Stop\n\ + bl ClearVideoCallbacks\n\ + bl sub_80F9368\n\ + ldr r1, ._47 @ 0x400000c\n\ + ldr r3, ._47 + 4 @ 0x4686\n\ + add r0, r3, #0\n\ + strh r0, [r1]\n\ + sub r1, r1, #0x2\n\ + ldr r2, ._47 + 8 @ 0x4401\n\ + add r0, r2, #0\n\ + strh r0, [r1]\n\ + add r1, r1, #0x46\n\ + mov r3, #0x90\n\ + lsl r3, r3, #0x6\n\ + add r0, r3, #0\n\ + strh r0, [r1]\n\ + add r1, r1, #0x2\n\ + ldr r2, ._47 + 12 @ 0x60a\n\ + add r0, r2, #0\n\ + strh r0, [r1]\n\ + ldr r0, ._47 + 16 @ gUnknown_08E8096C\n\ + mov r1, #0xc0\n\ + lsl r1, r1, #0x13\n\ + bl LZ77UnCompVram\n\ + ldr r0, ._47 + 20 @ gRouletteWheelTiles\n\ + ldr r1, ._47 + 24 @ 0x6004000\n\ + bl LZ77UnCompVram\n\ + ldr r1, ._47 + 28 @ gMain\n\ + ldr r3, ._47 + 32 @ 0x43c\n\ + add r1, r1, r3\n\ + b ._61\n\ +._48:\n\ + .align 2, 0\n\ +._47:\n\ + .word 0x400000c\n\ + .word 0x4686\n\ + .word 0x4401\n\ + .word 0x60a\n\ + .word gUnknown_08E8096C\n\ + .word gRouletteWheelTiles\n\ + .word 0x6004000\n\ + .word gMain\n\ + .word 0x43c\n\ +._39:\n\ + bl ResetPaletteFade\n\ + bl ResetSpriteData\n\ + bl ResetTasks\n\ + ldr r1, ._50 @ gMain\n\ + ldr r0, ._50 + 4 @ 0x43c\n\ + add r1, r1, r0\n\ + b ._61\n\ +._51:\n\ + .align 2, 0\n\ +._50:\n\ + .word gMain\n\ + .word 0x43c\n\ +._40:\n\ + ldr r0, ._53 @ gWindowTemplate_81E6C3C\n\ + bl Text_LoadWindowTemplate\n\ + ldr r0, ._53 + 4 @ gWindowTemplate_81E6CE4\n\ + bl InitMenuWindow\n\ + ldr r0, ._53 + 8 @ gUnknown_083F86BC\n\ + mov r2, #0xe0\n\ + lsl r2, r2, #0x1\n\ + mov r1, #0x0\n\ + bl LoadPalette\n\ + ldr r1, ._53 + 12 @ gMain\n\ + ldr r2, ._53 + 16 @ 0x43c\n\ + add r1, r1, r2\n\ + b ._61\n\ +._54:\n\ + .align 2, 0\n\ +._53:\n\ + .word gWindowTemplate_81E6C3C\n\ + .word gWindowTemplate_81E6CE4\n\ + .word gUnknown_083F86BC\n\ + .word gMain\n\ + .word 0x43c\n\ +._41:\n\ + bl sub_8115238\n\ + bl ClearBGTilemapBuffers\n\ + ldr r0, ._56 @ gUnknown_083F88BC\n\ + ldr r1, ._56 + 4 @ 0x2018800\n\ + bl LZ77UnCompWram\n\ + ldr r0, ._56 + 8 @ gUnknown_083F8A60\n\ + ldr r1, ._56 + 12 @ 0x6003000\n\ + bl LZ77UnCompVram\n\ + ldr r1, ._56 + 16 @ gMain\n\ + ldr r3, ._56 + 20 @ 0x43c\n\ + add r1, r1, r3\n\ + b ._61\n\ +._57:\n\ + .align 2, 0\n\ +._56:\n\ + .word gUnknown_083F88BC\n\ + .word 0x2018800\n\ + .word gUnknown_083F8A60\n\ + .word 0x6003000\n\ + .word gMain\n\ + .word 0x43c\n\ +._42:\n\ + mov r0, #0x0\n\ + bl sub_8117838\n\ + bl sub_811857C\n\ + bl sub_81184D8\n\ + bl sub_8117F2C\n\ + bl sub_8117900\n\ + bl sub_8117BBC\n\ + bl sub_8117DF4\n\ + ldr r1, ._59 @ gMain\n\ + ldr r0, ._59 + 4 @ 0x43c\n\ + add r1, r1, r0\n\ + b ._61\n\ +._60:\n\ + .align 2, 0\n\ +._59:\n\ + .word gMain\n\ + .word 0x43c\n\ +._43:\n\ + bl AnimateSprites\n\ + bl BuildOamBuffer\n\ + ldr r0, ._62 @ gSaveBlock1\n\ + ldr r1, ._62 + 4 @ 0x494\n\ + add r0, r0, r1\n\ + ldrh r0, [r0]\n\ + bl sub_81180F4\n\ + mov r0, #0x6\n\ + bl sub_81182F8\n\ + mov r0, #0x0\n\ + bl sub_811829C\n\ + mov r0, #0x0\n\ + bl sub_8117158\n\ + mov r0, #0x0\n\ + mov r1, #0xe\n\ + mov r2, #0x1d\n\ + mov r3, #0x13\n\ + bl Menu_DrawStdWindowFrame\n\ + ldr r0, ._62 + 8 @ gUnknown_081C4157\n\ + mov r1, #0x1\n\ + mov r2, #0xf\n\ + bl Menu_PrintText\n\ + ldr r1, ._62 + 12 @ gSpriteCoordOffsetX\n\ + mov r2, #0x3c\n\ + neg r2, r2\n\ + add r0, r2, #0\n\ + strh r0, [r1]\n\ + ldr r1, ._62 + 16 @ gSpriteCoordOffsetY\n\ + mov r0, #0x0\n\ + strh r0, [r1]\n\ + ldr r1, ._62 + 20 @ gMain\n\ + ldr r3, ._62 + 24 @ 0x43c\n\ + add r1, r1, r3\n\ + b ._61\n\ +._63:\n\ + .align 2, 0\n\ +._62:\n\ + .word gSaveBlock1\n\ + .word 0x494\n\ + .word gUnknown_081C4157\n\ + .word gSpriteCoordOffsetX\n\ + .word gSpriteCoordOffsetY\n\ + .word gMain\n\ + .word 0x43c\n\ +._44:\n\ + mov r1, #0x80\n\ + lsl r1, r1, #0x13\n\ + ldr r3, ._65 @ 0x1741\n\ + add r0, r3, #0\n\ + strh r0, [r1]\n\ + ldr r0, ._65 + 4 @ 0x43c\n\ + add r1, r2, r0\n\ +._61:\n\ + ldrb r0, [r1]\n\ + add r0, r0, #0x1\n\ + strb r0, [r1]\n\ + b ._64\n\ +._66:\n\ + .align 2, 0\n\ +._65:\n\ + .word 0x1741\n\ + .word 0x43c\n\ +._45:\n\ + ldr r3, ._67 @ 0x4000208\n\ + ldrh r2, [r3]\n\ + mov r0, #0x0\n\ + strh r0, [r3]\n\ + ldr r4, ._67 + 4 @ 0x4000200\n\ + ldrh r0, [r4]\n\ + mov r1, #0x1\n\ + orr r0, r0, r1\n\ + strh r0, [r4]\n\ + strh r2, [r3]\n\ + ldr r2, ._67 + 8 @ 0x4000004\n\ + ldrh r0, [r2]\n\ + mov r1, #0x8\n\ + orr r0, r0, r1\n\ + strh r0, [r2]\n\ + ldr r0, ._67 + 12 @ sub_8115124\n\ + bl SetVBlankCallback\n\ + mov r0, #0x1\n\ + str r0, [sp]\n\ + mov r0, #0xff\n\ + mov r1, #0x0\n\ + mov r2, #0x10\n\ + mov r3, #0x0\n\ + bl BeginHardwarePaletteFade\n\ + ldr r0, ._67 + 16 @ sub_81156BC\n\ + mov r1, #0x0\n\ + bl CreateTask\n\ + ldr r4, ._67 + 20 @ 0x2019000\n\ + add r1, r4, #0\n\ + add r1, r1, #0xa4\n\ + strb r0, [r1]\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + ldr r2, ._67 + 24 @ gTasks\n\ + lsl r1, r0, #0x2\n\ + add r1, r1, r0\n\ + lsl r1, r1, #0x3\n\ + add r1, r1, r2\n\ + mov r0, #0x6\n\ + strh r0, [r1, #0x14]\n\ + ldr r0, ._67 + 28 @ gSaveBlock1\n\ + ldr r2, ._67 + 32 @ 0x494\n\ + add r0, r0, r2\n\ + ldrh r0, [r0]\n\ + strh r0, [r1, #0x22]\n\ + ldr r0, ._67 + 36 @ sub_8115634\n\ + mov r1, #0x1\n\ + bl CreateTask\n\ + add r4, r4, #0xa5\n\ + strb r0, [r4]\n\ + ldr r0, ._67 + 40 @ sub_81150FC\n\ + bl SetMainCallback2\n\ +._64:\n\ + add sp, sp, #0x4\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ +._68:\n\ + .align 2, 0\n\ +._67:\n\ + .word 0x4000208\n\ + .word 0x4000200\n\ + .word 0x4000004\n\ + .word sub_8115124+1\n\ + .word sub_81156BC+1\n\ + .word 0x2019000\n\ + .word gTasks\n\ + .word gSaveBlock1\n\ + .word 0x494\n\ + .word sub_8115634+1\n\ + .word sub_81150FC+1"); +} +#else +void sub_8115384(void) +{ + u32 temp_IME; + u8 taskid; + switch (gMain.state) + { + case 0x0: + SetVBlankCallback(NULL); + ScanlineEffect_Stop(); + ClearVideoCallbacks(); + sub_80F9368(); + REG_BG2CNT = 0x4686; + REG_BG1CNT = 0x4401; + REG_BLDCNT = 0x2400; + REG_BLDALPHA = 0x060A; + LZ77UnCompVram(&gUnknown_08E8096C, (void *)VRAM); + LZ77UnCompVram(&gRouletteWheelTiles, (void *)(VRAM + 0x4000)); + gMain.state++; + break; + case 0x1: + ResetPaletteFade(); + ResetSpriteData(); + ResetTasks(); + gMain.state++; + break; + case 0x2: + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow(&gWindowTemplate_81E6CE4); + LoadPalette(&gUnknown_083F86BC, 0x0, 0x1C0); + gMain.state++; + break; + case 0x3: + sub_8115238(); + ClearBGTilemapBuffers(); + LZ77UnCompWram(&gUnknown_083F88BC, (void *)(ewram18800)); + LZ77UnCompVram(&gUnknown_083F8A60, (void *)(VRAM + 0x3000)); + gMain.state++; + break; + case 0x4: + sub_8117838(0x0); + sub_811857C(); + sub_81184D8(); + sub_8117F2C(); + sub_8117900(); + sub_8117BBC(); + sub_8117DF4(); + gMain.state++; + break; + case 0x5: + AnimateSprites(); + BuildOamBuffer(); + sub_81180F4(gSaveBlock1.coins); + sub_81182F8(0x6); + sub_811829C(0x0); + sub_8117158(0x0); + Menu_DrawStdWindowFrame(0x0, 0xE, 0x1D, 0x13); + Menu_PrintText(&gUnknown_081C4157[0], 0x1, 0xF); + gSpriteCoordOffsetX = -0x3C; + gSpriteCoordOffsetY = 0x0; + gMain.state++; + break; + case 0x6: + REG_DISPCNT = 0x1741; + gMain.state++; + break; + case 0x7: + temp_IME = REG_IME; + REG_IME = 0x0; //disable interrupts + REG_IE |= 0x1; //enable VBlank interrupt + REG_IME = temp_IME; //reenable interrupts + REG_DISPSTAT |= 0x8; + SetVBlankCallback(&sub_8115124); + BeginHardwarePaletteFade(0xFF, 0x0, 0x10, 0x0 , 0x1); + taskid = eRoulette->varA4 = CreateTask(&sub_81156BC, 0x0); + gTasks[taskid].data[0x6] = 0x6; + gTasks[taskid].data[0xD] = gSaveBlock1.coins; + eRoulette->varA5 = CreateTask(&sub_8115634, 0x1); + SetMainCallback2(&sub_81150FC); + break; + } +} +#endif + +#if DEBUG +__attribute__((naked)) +void sub_8115634(u8 unused) +{ + asm("\ + push {r4, r5, r6, lr}\n\ + ldr r0, ._75 @ 0x2019000\n\ + add r3, r0, #0\n\ + add r3, r3, #0x21\n\ + ldrb r1, [r3]\n\ + add r2, r1, #1\n\ + strb r2, [r3]\n\ + add r2, r0, #0\n\ + add r2, r2, #0x23\n\ + lsl r1, r1, #0x18\n\ + lsr r1, r1, #0x18\n\ + add r6, r0, #0\n\ + ldrb r2, [r2]\n\ + cmp r1, r2\n\ + bne ._70 @cond_branch\n\ + mov r0, #0x0\n\ + strb r0, [r3]\n\ + add r2, r6, #0\n\ + add r2, r2, #0x22\n\ + ldrb r1, [r2]\n\ + ldrh r0, [r6, #0x24]\n\ + sub r0, r0, r1\n\ + strh r0, [r6, #0x24]\n\ + lsl r0, r0, #0x10\n\ + cmp r0, #0\n\ + bge ._70 @cond_branch\n\ + ldrb r1, [r2]\n\ + mov r2, #0xb4\n\ + lsl r2, r2, #0x1\n\ + add r0, r2, #0\n\ + sub r0, r0, r1\n\ + strh r0, [r6, #0x24]\n\ +._70:\n\ + add r4, r6, #0\n\ + ldrh r0, [r4, #0x24]\n\ + bl Sin2\n\ + lsl r0, r0, #0x10\n\ + lsr r5, r0, #0x10\n\ + ldrh r0, [r4, #0x24]\n\ + bl Cos2\n\ + lsl r0, r0, #0x10\n\ + lsr r1, r0, #0x10\n\ + lsl r0, r5, #0x10\n\ + asr r0, r0, #0x10\n\ + cmp r0, #0\n\ + bge ._71 @cond_branch\n\ + add r0, r0, #0xf\n\ +._71:\n\ + lsl r0, r0, #0xc\n\ + lsr r5, r0, #0x10\n\ + lsl r0, r1, #0x10\n\ + asr r0, r0, #0x10\n\ + cmp r0, #0\n\ + bge ._72 @cond_branch\n\ + add r0, r0, #0xf\n\ +._72:\n\ + asr r0, r0, #0x4\n\ + strh r0, [r6, #0x32]\n\ + strh r0, [r6, #0x2c]\n\ + strh r5, [r6, #0x2e]\n\ + lsl r0, r5, #0x10\n\ + asr r0, r0, #0x10\n\ + neg r0, r0\n\ + strh r0, [r6, #0x30]\n\ + ldr r0, ._75 + 4 @ unk_203955C\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._74 @cond_branch\n\ + ldr r0, ._75 + 8 @ gMain\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0x8\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._74 @cond_branch\n\ + ldr r2, ._75 + 12 @ gTasks\n\ + add r0, r6, #0\n\ + add r0, r0, #0xa4\n\ + ldrb r1, [r0]\n\ + lsl r0, r1, #0x2\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x3\n\ + add r0, r0, r2\n\ + ldr r1, ._75 + 16 @ sub_81157AC\n\ + str r1, [r0]\n\ + ldr r0, ._75 + 20 @ gMPlay_SE1\n\ + bl m4aMPlayStop\n\ + ldr r0, ._75 + 24 @ gMPlay_SE2\n\ + bl m4aMPlayStop\n\ + ldr r0, ._75 + 28 @ gMPlay_SE3\n\ + bl m4aMPlayStop\n\ +._74:\n\ + pop {r4, r5, r6}\n\ + pop {r0}\n\ + bx r0\n\ +._76:\n\ + .align 2, 0\n\ +._75:\n\ + .word 0x2019000\n\ + .word unk_203955C\n\ + .word gMain\n\ + .word gTasks\n\ + .word sub_81157AC+1\n\ + .word gMPlay_SE1\n\ + .word gMPlay_SE2\n\ + .word gMPlay_SE3"); +} +#else +void sub_8115634(u8 unused) +{ + s16 sin; + s16 cos; + s32 cos32; + if (eRoulette->var21++ == eRoulette->var23) + { + eRoulette->var21 = 0x0; + if ((eRoulette->var24 -= eRoulette->var22) < 0) + eRoulette->var24 = 0x168 - eRoulette->var22; + } + sin = Sin2(eRoulette->var24); + cos = Cos2(eRoulette->var24); + sin = sin / 16; + cos32 = cos / 16; + eRoulette->var2C.d = cos32; + eRoulette->var2C.a = cos32; + eRoulette->var2C.b = sin; + eRoulette->var2C.c = -sin; +} +#endif + +void sub_81156BC(u8 taskid) +{ + if (UpdatePaletteFade() == 0) + { + REG_BLDCNT |= 0x2400; + REG_BLDALPHA = 0x0808; + gTasks[taskid].data[0x6] = 0; + sub_8116CAC(taskid); + sub_8116CF8(); + sub_81185E8(); + sub_8117158(0); + sub_81182F8(0x6); + sub_8116C34(taskid, &sub_81159BC, 0xFFFF, 0x3); + } +} + +void sub_8115734(u8 taskid) +{ + DisplayYesNoMenu(0x14, 0x8, 0x1); + sub_814AAF8(0x2D9E); + Menu_DrawStdWindowFrame(0x0, 0xE, 0x1D, 0x13); + Menu_PrintText(&gUnknown_081C41E3, 0x1, 0xF); + DoYesNoFuncWithChoice(taskid, &gUnknown_083F8EBC); +} + +void sub_811577C(u8 taskid) +{ + Menu_EraseWindowRect(0x14, 0x8, 0x1A, 0xD); + gTasks[taskid].func = &sub_81159BC; +} + +void sub_81157AC(u8 taskid) +{ + DestroyTask(eRoulette->varA5); + sub_8116AB0(taskid); +} + +void sub_81157D0(u8 r0) +{ + u8 temp0, temp1; + switch (r0) + { + case 0x0: + sub_8124DDC(&gBGTilemapBuffers[2][0], 0x0, 0xE, 0x7, 0x10, 0xD); + break; + case 0x1: + case 0x2: + case 0x3: + case 0x4: + temp0 = (r0 * 3 + 0xE); + sub_8124DDC(&gBGTilemapBuffers[2][0], 0x0, 0xE, 0x7, 0x10, 0xD); + sub_8124E2C(&gBGTilemapBuffers[2][0], ewram18a32, temp0, 0x7, 0x3, 0xD); + break; + case 0x5: + case 0xA: + case 0xF: + temp1 = ((r0 - 1) / 5 * 3 + 0xA); + sub_8124DDC(&gBGTilemapBuffers[2][0], 0x0, 0xE, 0x7, 0x10, 0xD); + sub_8124E2C(&gBGTilemapBuffers[2][0], ewram18a80, 0xE, temp1, 0x10, 0x3); + break; + default: + temp0 = ((r0 % 5) * 3 + 0xE); + temp1 = ((r0 - 1) / 5 * 3 + 0x7); + sub_8124DDC(&gBGTilemapBuffers[2][0], 0x0, 0xE, 0x7, 0x10, 0xD); + sub_8124E2C(&gBGTilemapBuffers[2][0], ewram18a20, temp0, temp1, 0x3, 0x3); + } +} + +void sub_8115928(u8 taskid, u8 r1) +{ + if (!r1) + sub_811829C(gTasks[taskid].data[0x4]); + else + sub_811829C(eRoulette->var1B[eRoulette->var1A_0]); + sub_81157D0(gTasks[taskid].data[0x4]); +} + +void sub_811597C(u8 taskid) +{ + eRoulette->var28 = 0x1; + sub_81157D0(gTasks[taskid].data[0x4]); + eRoulette->var23 = 0x2; + eRoulette->var21 = 0x0; + gTasks[taskid].func = &sub_8115E14; +} + +void sub_81159BC(u8 taskid) +{ + s16 i; + if(eRoulette->var08 & 0x20) + { + for (i = 0xB; (i < 0xE); i++) + if ((eRoulette->var08 & gUnknown_083F8C00[i].var08) == 0) + break; + } + else + { + for (i = 0x6; (i < 0xA); i++) + if ((eRoulette->var08 & gUnknown_083F8C00[i].var08) == 0) + break; + } + gTasks[taskid].data[0x4] = i; + sub_8116CAC(taskid); + sub_8117158(gTasks[taskid].data[0x4]); + sub_811829C(gTasks[taskid].data[0x4]); + sub_8116EF8(gTasks[taskid].data[0x4]); + gTasks[taskid].data[0x1] = 0x0; + gTasks[taskid].func = &sub_811597C; +} + +u8 sub_8115A94(s16 *r0, u8 r1) +{ + s8 temp1 = 0; + s8 temp = 0; + s8 arr[0x4]; + s8 t; + memcpy(&arr, gUnknown_083F8ECA, 0x4); + t = (u8)*r0; + switch (r1) + { + case 0x0: + case 0x1: + temp1 = (*r0 % 5); + temp = temp1 + 0xF; + if (temp1 == 0) + temp1 = 0x5; + break; + case 0x2: + case 0x3: + temp1 = (s16)(*r0 / 5) * 5; + temp = temp1 + 0x4; + if (temp1 == 0) + temp1 = 0x1; + break; + } + *r0 += arr[r1]; + if (*r0 < temp1) + *r0 = temp; + if (*r0 > temp) + *r0 = temp1; + if (*r0 != t) + return TRUE; + return FALSE; +} + +void sub_8115B58(u8 r0) +{ + u8 z = 0x0; + bool8 var0 = FALSE; + if (!(gMain.newKeys & DPAD_UP) || ((var0 = TRUE), sub_8115A94(&gTasks[r0].data[0x4], 0x0))) + if (!(gMain.newKeys & DPAD_DOWN) || ((var0 = TRUE), sub_8115A94(&gTasks[r0].data[0x4], 0x1))) + if (!(gMain.newKeys & DPAD_LEFT) || ((var0 = TRUE), sub_8115A94(&gTasks[r0].data[0x4], 0x2))) + if (!(gMain.newKeys & DPAD_RIGHT) || ((var0 = TRUE), sub_8115A94(&gTasks[r0].data[0x4], 0x3))) + if (var0) + { + u8 i; + sub_8117158(gTasks[r0].data[0x4]); + sub_8115928(r0, FALSE); + gTasks[r0].data[0x1] = z; + PlaySE(SE_SELECT); + sub_8124D3C((&eRoulette->varB8), 0xFFFF); + (&eRoulette->varB8)->var04[0xF].var00_7 = 0x0; + (&eRoulette->varB8)->var04[0xE].var00_7 = 0x0; + (&eRoulette->varB8)->var04[0xD].var00_7 = 0x0; + sub_8116EF8(gTasks[r0].data[0x4]); + for (i = 0; i < 0x4; i++) + { + gSprites[eRoulette->var3C[i + 0x29]].oam.tileNum = + gSprites[eRoulette->var3C[i + 0x29]].sheetTileStart + + (*gSprites[eRoulette->var3C[i + 0x29]].anims)->type; + } + if ((u16)(gTasks[r0].data[0x4] - 1) < 0x4 && !(eRoulette->var08 & gUnknown_083F8C00[gTasks[r0].data[0x4]].var08) ) + { + z = gTasks[r0].data[0x4] - 1; + gSprites[eRoulette->var3C[z + 0x29]].oam.tileNum = + gSprites[eRoulette->var3C[z + 0x29]].sheetTileStart + + (*gSprites[eRoulette->var3C[z + 0x29]].anims + 1)->type; + } + } +} + +void sub_8115D58(u8 r0) +{ + eRoulette->var28 = 0xFF; + if (eRoulette->var19 == 1) + eRoulette->var23 = 1; + else + eRoulette->var23 = 0; + eRoulette->var21 = 0; + gTasks[r0].data[0x1] = 0x20; + gTasks[r0].func = &sub_8115ECC; +} + +void sub_8115DA0(u8 taskid) +{ + eRoulette->var1B[eRoulette->var1A_0] = gTasks[taskid].data[0x4]; + gTasks[taskid].data[0x2] = sub_8117380(eRoulette->var1B[eRoulette->var1A_0]); + sub_811829C(eRoulette->var1B[eRoulette->var1A_0]); + if ((gTasks[taskid].data[0xD] -= eRoulette->var19) < 0) + gTasks[taskid].data[0xD] = 0; + sub_81180F4(gTasks[taskid].data[0xD]); + gTasks[taskid].func = &sub_8115D58; +} + +void sub_8115E14(u8 taskid) +{ + sub_8115B58(taskid); + switch (gTasks[taskid].data[0x1]) + { + case 0x0: + sub_81157D0(gTasks[taskid].data[0x4]); + gTasks[taskid].data[0x1]+= 1; + break; + case 0x1E: + sub_81157D0(0); + gTasks[taskid].data[0x1]+= 1; + break; + case 0x3B: + gTasks[taskid].data[0x1] = 0; + break; + default: + gTasks[taskid].data[0x1]++; + } + if (gMain.newKeys & A_BUTTON) + { + if ((eRoulette->var08 & gUnknown_083F8C00[gTasks[taskid].data[0x4]].var08)) + PlaySE(SE_BOO); + else + { + m4aSongNumStart(SE_REGI); + gTasks[taskid].func = &sub_8115DA0; + } + } +} + +void sub_8115ECC(u8 taskid) +{ + if (gTasks[taskid].data[0x1]-- > 0) + { + if (gTasks[taskid].data[0x1] > 0x2) + gSpriteCoordOffsetX += 0x2; + if ((eRoulette->var26 += 0x4) == 0x68) + gSprites[eRoulette->var3C[0x19]].callback = &SpriteCallbackDummy; + } + else + { + sub_8117AA8(0x1, 0xFF); + sub_8117C60(0x1, 0xFF); + gTasks[taskid].func = &sub_8116100; + gTasks[taskid].data[0x1] = 0; + } +} + +u8 sub_8115F58(u16 r0, u16 r1) +{ + u8 timeh; + switch (eRoulette->var02) + { + case 0x1: // SHROOMISH + case 0x2: // TAILLOW + // one of the two is in party + timeh = gLocalTime.hours - 0x4; + if (!(timeh > 0x5)) + { + if (!(r0 < 0xC || (r1 & 0x1))) + return 0x1; + else + { + struct StructgUnknown_083F8DF4 *p = &gUnknown_083F8DF4[0]; + return p[eRoulette->var04_0].var02 / 2; + } + } + else if (!(r1 & 0x3)) + { + struct StructgUnknown_083F8DF4 *p = &gUnknown_083F8DF4[0]; + return p[eRoulette->var04_0].var02 / 2; + } + else + { + struct StructgUnknown_083F8DF4 *p = &gUnknown_083F8DF4[0]; + return p[eRoulette->var04_0].var02; + } + break; + case 0x3: + // both are in party + timeh = gLocalTime.hours - 0x4; + if (!(timeh > 0x6)) + { + if (r0 < 0x6 || (r1 & 0x1)) + { + struct StructgUnknown_083F8DF4 *p = &gUnknown_083F8DF4[0]; + return p[eRoulette->var04_0].var02 / 2; + } + else + { + return 0x1; + } + } + else if ((r1 & 0x1) && !(r0 < 0x7)) + { + struct StructgUnknown_083F8DF4 *p = &gUnknown_083F8DF4[0]; + return p[eRoulette->var04_0].var02 / 4; + } + else + { + struct StructgUnknown_083F8DF4 *p = &gUnknown_083F8DF4[0]; + return p[eRoulette->var04_0].var02 / 2; + } + break; + case 0: + default: + // neither is in party + timeh = gLocalTime.hours - 0x4; + if (!(timeh > 5)) + { + if (!(r1 & 0x3)) + { + return 0x1; + } + else + { + struct StructgUnknown_083F8DF4 *p = &gUnknown_083F8DF4[0]; + return p[eRoulette->var04_0].var02 / 2; + } + } + else if (!(r1 & 0x3)) + { + if (!(r0 < 0xD)) + { + struct StructgUnknown_083F8DF4 *p = &gUnknown_083F8DF4[0]; + return p[eRoulette->var04_0].var02 / 2; + } + else + { + struct StructgUnknown_083F8DF4 *p = &gUnknown_083F8DF4[0]; + return p[eRoulette->var04_0].var02; + } + } + else if (r1 & (0x80 << 8)) + { + if (!(r0 < 0xD)) + { + struct StructgUnknown_083F8DF4 *p = &gUnknown_083F8DF4[0]; + return p[eRoulette->var04_0].var02; + } + else + { + struct StructgUnknown_083F8DF4 *p = &gUnknown_083F8DF4[0]; + return p[eRoulette->var04_0].var01; + } + } + else + { + struct StructgUnknown_083F8DF4 *p = &gUnknown_083F8DF4[0]; + return p[eRoulette->var04_0].var01 * 2; + } + } +} + +#ifdef NONMATCHING +void sub_8116100(u8 taskid) +{ + u8 randf; + s8 randfinal; + s8 r5; + u16 g; + u16 rand; + u16 randmod; + u16 angles[0x4]; // angles in 90 degree steps + u8 zero = 0x0; + memcpy(angles, &gUnknown_083F8ECE, 0x8); + rand = Random(); + randmod = rand % 0x64; + eRoulette->var7C = gTasks[taskid].data[0x6]; + eRoulette->var7F = zero; + eRoulette->var7E = zero; + eRoulette->var7D = zero; + randf = sub_8115F58(gTasks[taskid].data[0x8], rand); + randfinal = (rand % randf) - (randf / 2); + if (gLocalTime.hours < 0xD) + r5 = 0x0; + else + r5 = 0x1; + if (randmod < 0x50) + r5 *= 2; + else + r5 = (1 - r5) * 2; + g = (&gUnknown_083F8DF4[eRoulette->var04_0])->var1A; + eRoulette->var80 = (g + randfinal); + // + g = ((float)(u16)(g + randfinal)) / 5.0f; + eRoulette->var82 = g * 3; + eRoulette->var84 = g; + eRoulette->var86 = g; + // + eRoulette->var88 = (float)(angles[(rand & 0x1) + r5]); + eRoulette->var8C = (float)((&gUnknown_083F8DF4[eRoulette->var04_0])->var18); + eRoulette->var90 = ((eRoulette->var8C * 0.5f) - eRoulette->var8C) / (float)(u16)(g * 3); + eRoulette->var94 = 68.0f; + eRoulette->var9C = 0.0f; + eRoulette->var98 = -(8.0f / (float)(u16)(g * 3)); + eRoulette->varA0 = 36.0f; + gTasks[taskid].func = &sub_8116308; +} +#else +__attribute__((naked)) +void sub_8116100(u8 taskid) +{ +asm(".syntax unified\n\ +push {r4-r7,lr}\n\ +mov r7, r10\n\ +mov r6, r9\n\ +mov r5, r8\n\ +push {r5-r7}\n\ +sub sp, 0x8\n\ +lsls r0, 24\n\ +lsrs r0, 24\n\ +mov r9, r0\n\ +movs r4, 0\n\ +ldr r1, _08116188 @ =gUnknown_083F8ECE\n\ +mov r0, sp\n\ +movs r2, 0x8\n\ +bl memcpy\n\ +bl Random\n\ +lsls r0, 16\n\ +lsrs r7, r0, 16\n\ +adds r0, r7, 0\n\ +movs r1, 0x64\n\ +bl __umodsi3\n\ +lsls r0, 16\n\ +lsrs r6, r0, 16\n\ +ldr r3, _0811618C @ =0x02019000\n\ +ldr r1, _08116190 @ =gTasks\n\ +mov r2, r9\n\ +lsls r0, r2, 2\n\ +add r0, r9\n\ +lsls r0, 3\n\ +adds r0, r1\n\ +ldrh r2, [r0, 0x14]\n\ +adds r1, r3, 0\n\ +adds r1, 0x7C\n\ +strb r2, [r1]\n\ +adds r1, 0x3\n\ +strb r4, [r1]\n\ +subs r1, 0x1\n\ +strb r4, [r1]\n\ +subs r1, 0x1\n\ +strb r4, [r1]\n\ +ldrh r0, [r0, 0x18]\n\ +adds r1, r7, 0\n\ +bl sub_8115F58\n\ +adds r4, r0, 0\n\ +lsls r4, 24\n\ +lsrs r1, r4, 24\n\ +adds r0, r7, 0\n\ +bl __modsi3\n\ +lsrs r4, 25\n\ +subs r0, r4\n\ +lsls r0, 24\n\ +lsrs r4, r0, 24\n\ +ldr r0, _08116194 @ =gLocalTime\n\ +ldrb r0, [r0, 0x2]\n\ +lsls r0, 24\n\ +asrs r0, 24\n\ +movs r5, 0x1\n\ +cmp r0, 0xC\n\ +bgt _08116180\n\ +movs r5, 0\n\ +_08116180:\n\ +cmp r6, 0x4F\n\ +bhi _08116198\n\ +lsls r0, r5, 25\n\ +b _081161A2\n\ +.align 2, 0\n\ +_08116188: .4byte gUnknown_083F8ECE\n\ +_0811618C: .4byte 0x02019000\n\ +_08116190: .4byte gTasks\n\ +_08116194: .4byte gLocalTime\n\ +_08116198:\n\ +lsls r1, r5, 24\n\ +asrs r1, 24\n\ +movs r0, 0x1\n\ +subs r0, r1\n\ +lsls r0, 25\n\ +_081161A2:\n\ +lsrs r5, r0, 24\n\ +ldr r6, _081162D8 @ =0x02019000\n\ +ldrb r0, [r6, 0x4]\n\ +lsls r0, 30\n\ +mov r10, r0\n\ +lsrs r0, 25\n\ +ldr r1, _081162DC @ =gUnknown_083F8DF4\n\ +adds r0, r1\n\ +lsls r4, 24\n\ +asrs r4, 24\n\ +ldrh r0, [r0, 0x1A]\n\ +adds r4, r0\n\ +adds r0, r6, 0\n\ +adds r0, 0x80\n\ +strh r4, [r0]\n\ +lsls r4, 16\n\ +asrs r4, 16\n\ +adds r0, r4, 0\n\ +bl __floatsisf\n\ +cmp r4, 0\n\ +bge _081161D4\n\ +ldr r1, _081162E0 @ =0x47800000\n\ +bl __addsf3\n\ +_081161D4:\n\ +ldr r1, _081162E4 @ =0x40a00000\n\ +bl __divsf3\n\ +bl __fixunssfsi\n\ +lsls r0, 16\n\ +lsrs r4, r0, 16\n\ +lsls r0, r4, 1\n\ +adds r0, r4\n\ +mov r8, r0\n\ +adds r0, r6, 0\n\ +adds r0, 0x82\n\ +mov r2, r8\n\ +strh r2, [r0]\n\ +adds r0, 0x2\n\ +strh r4, [r0]\n\ +adds r0, 0x2\n\ +strh r4, [r0]\n\ +movs r0, 0x1\n\ +ands r0, r7\n\ +lsls r1, r5, 24\n\ +asrs r1, 24\n\ +adds r0, r1\n\ +lsls r0, 1\n\ +add r0, sp\n\ +movs r1, 0\n\ +ldrsh r4, [r0, r1]\n\ +adds r0, r4, 0\n\ +bl __floatsisf\n\ +cmp r4, 0\n\ +bge _0811621A\n\ +ldr r1, _081162E0 @ =0x47800000\n\ +bl __addsf3\n\ +_0811621A:\n\ +ldr r2, _081162E8 @ =0x02019088\n\ +str r0, [r2]\n\ +adds r7, r6, 0\n\ +adds r7, 0x8C\n\ +mov r1, r10\n\ +lsrs r0, r1, 25\n\ +ldr r2, _081162DC @ =gUnknown_083F8DF4\n\ +adds r0, r2\n\ +movs r1, 0x18\n\ +ldrsh r4, [r0, r1]\n\ +adds r0, r4, 0\n\ +bl __floatsisf\n\ +adds r5, r0, 0\n\ +cmp r4, 0\n\ +bge _08116242\n\ +ldr r1, _081162E0 @ =0x47800000\n\ +bl __addsf3\n\ +adds r5, r0, 0\n\ +_08116242:\n\ +str r5, [r7]\n\ +adds r7, r6, 0\n\ +adds r7, 0x90\n\ +ldr r1, _081162EC @ =0x3f000000\n\ +adds r0, r5, 0\n\ +bl __mulsf3\n\ +adds r1, r5, 0\n\ +bl __subsf3\n\ +adds r5, r0, 0\n\ +mov r2, r8\n\ +lsls r0, r2, 16\n\ +asrs r4, r0, 16\n\ +adds r0, r4, 0\n\ +bl __floatsisf\n\ +adds r2, r0, 0\n\ +cmp r4, 0\n\ +bge _08116272\n\ +ldr r1, _081162E0 @ =0x47800000\n\ +bl __addsf3\n\ +adds r2, r0, 0\n\ +_08116272:\n\ +adds r0, r5, 0\n\ +adds r1, r2, 0\n\ +bl __divsf3\n\ +str r0, [r7]\n\ +adds r1, r6, 0\n\ +adds r1, 0x94\n\ +ldr r0, _081162F0 @ =0x42880000\n\ +str r0, [r1]\n\ +adds r1, 0x8\n\ +ldr r0, _081162F4 @ =0x00000000\n\ +str r0, [r1]\n\ +adds r5, r6, 0\n\ +adds r5, 0x98\n\ +adds r0, r4, 0\n\ +bl __floatsisf\n\ +adds r2, r0, 0\n\ +cmp r4, 0\n\ +bge _081162A2\n\ +ldr r1, _081162E0 @ =0x47800000\n\ +bl __addsf3\n\ +adds r2, r0, 0\n\ +_081162A2:\n\ +ldr r0, _081162F8 @ =0x41000000\n\ +adds r1, r2, 0\n\ +bl __divsf3\n\ +bl __negsf2\n\ +str r0, [r5]\n\ +adds r1, r6, 0\n\ +adds r1, 0xA0\n\ +ldr r0, _081162FC @ =0x42100000\n\ +str r0, [r1]\n\ +ldr r1, _08116300 @ =gTasks\n\ +mov r2, r9\n\ +lsls r0, r2, 2\n\ +add r0, r9\n\ +lsls r0, 3\n\ +adds r0, r1\n\ +ldr r1, _08116304 @ =sub_8116308\n\ +str r1, [r0]\n\ +add sp, 0x8\n\ +pop {r3-r5}\n\ +mov r8, r3\n\ +mov r9, r4\n\ +mov r10, r5\n\ +pop {r4-r7}\n\ +pop {r0}\n\ +bx r0\n\ +.align 2, 0\n\ +_081162D8: .4byte 0x02019000\n\ +_081162DC: .4byte gUnknown_083F8DF4\n\ +_081162E0: .4byte 0x47800000\n\ +_081162E4: .4byte 0x40a00000\n\ +_081162E8: .4byte 0x02019088\n\ +_081162EC: .4byte 0x3f000000\n\ +_081162F0: .4byte 0x42880000\n\ +_081162F4: .4byte 0x00000000\n\ +_081162F8: .4byte 0x41000000\n\ +_081162FC: .4byte 0x42100000\n\ +_08116300: .4byte gTasks\n\ +_08116304: .4byte sub_8116308\n\ +.syntax divided\n"); +} +#endif + +void sub_8116308(u8 taskid) +{ + u8 index; + eRoulette->var03_7 = 1; + index = eRoulette->var3C[eRoulette->var7C]; + eRoulette->var38 = &gSprites[index]; + (&gSprites[index])->callback = &sub_81191F4; + gTasks[taskid].data[0x6]++; + gTasks[taskid].data[0x8]++; + sub_81182F8(0x6 - gTasks[taskid].data[0x6]); + m4aSongNumStart(SE_TAMAKORO); + gTasks[taskid].func = &sub_811637C; +} + +void sub_811637C(u8 taskid) +{ + if (eRoulette->var7D) + { + if (eRoulette->var03_5) + { + if (eRoulette->var03_6) + { + eRoulette->var03_6 = FALSE; + eRoulette->var03_5 = FALSE; + } + } + else + { + if (!gTasks[taskid].data[0x1]) + { + u8 temp = sub_8116E5C(sub_8116D54(taskid, eRoulette->var7E), eRoulette->var1B[eRoulette->var1A_0]); + gTasks[taskid].data[0x5] = temp; + if (temp == 1) + sub_8124CE8((&eRoulette->varB8), 0x1000); + } + if (gTasks[taskid].data[0x1] < 0x3D) + { + if (gMain.newKeys & A_BUTTON) + gTasks[taskid].data[0x1] = 0x3C; + gTasks[taskid].data[0x1]++; + } + else + { + sub_8117158(eRoulette->var1B[eRoulette->var1A_0]); + sub_8117AA8(0x0, (u8)gTasks[taskid].data[0xC]); + sub_8117C60(0x0, (u8)gTasks[taskid].data[0x6] - 0x1); + gTasks[taskid].data[0x1] = 0x20; + gTasks[taskid].func = &sub_8116474; + } + } + } +} + +void sub_8116474(u8 taskid) +{ + if (gTasks[taskid].data[0x1]-- > 0x0) + { + if(gTasks[taskid].data[0x1] > 0x2) + gSpriteCoordOffsetX -= 0x2; + if((eRoulette->var26 -= 0x4) == 0x68) + gSprites[eRoulette->var3C[0x19]].callback = &sub_81184CC; + } + else + { + sub_8117D68(gTasks[taskid].data[0xC]); + if (gTasks[taskid].data[0x5] == 1) + gTasks[taskid].data[0x1] = 0x79; + else + gTasks[taskid].data[0x1] = 0x3D; + gTasks[taskid].func = &sub_8116514; + } +} + +void sub_8116514(u8 taskid) +{ + if (gTasks[taskid].data[0x1]-- > 0x1) + { + switch(gTasks[taskid].data[0x1] % 0x10) + { + case 0x8: + sub_8117AA8(0x0, 0xFF); + sub_8117C60(0x0, 0xFF); + break; + case 0x0: + sub_8117AA8(0x0, (u8)gTasks[taskid].data[0xC]); + sub_8117C60(0x0, (u8)gTasks[taskid].data[0x6] - 0x1); + break; + } + } + else + { + sub_8116C34(taskid, &sub_8116638, 0x1E, 0x0); + } +} + +void sub_811659C(u8 taskid) +{ + switch(gTasks[taskid].data[0x5]) + { + case 0x1: + case 0x2: + if (IsFanfareTaskInactive()) + { + u32 wins = GetGameStat(GAME_STAT_CONSECUTIVE_ROULETTE_WINS); + if(wins < ++gTasks[taskid].data[0xB]) + SetGameStat(GAME_STAT_CONSECUTIVE_ROULETTE_WINS, gTasks[taskid].data[0xB]); + sub_8116C34(taskid, &sub_811677C, 0xFFFF, 0x3); + } + break; + case 0: + default: + if (!IsSEPlaying()) + { + gTasks[taskid].data[0xB] = FALSE; + sub_8116C34(taskid, &sub_81167F4, 0xFFFF, 0x3); + } + } +} + +void sub_8116638(u8 taskid) +{ + switch(gTasks[taskid].data[0x5]) + { + case 0x1: + case 0x2: + if (gTasks[taskid].data[0x2] == 0xC) + { + PlayFanfare(BGM_ME_B_BIG); + Menu_DrawStdWindowFrame(0x0, 0xE, 0x1D, 0x13); + Menu_PrintText(&gUnknown_081C41A5, 0x1, 0xF); + } + else + { + PlayFanfare(BGM_ME_B_SMALL); + Menu_DrawStdWindowFrame(0x0, 0xE, 0x1D, 0x13); + Menu_PrintText(&gUnknown_081C4199, 0x1, 0xF); + } + break; + case 0: + default: + m4aSongNumStart(SE_HAZURE); + Menu_DrawStdWindowFrame(0x0, 0xE, 0x1D, 0x13); + Menu_PrintText(&gUnknown_081C41AE, 0x1, 0xF); + } + gTasks[taskid].data[0x1] = 0x0; + gTasks[taskid].func = &sub_811659C; +} + +void sub_81166E8(u8 taskid) +{ + s32 r0 = gTasks[taskid].data[0x7]; + switch(r0) + { + case 0x0: + gTasks[taskid].data[0xD]++; + m4aSongNumStart(SE_PIN); + sub_81180F4(gTasks[taskid].data[0xD]); + if (gTasks[taskid].data[0xD] > 0x270E) + { + gTasks[taskid].data[0x1] = r0; + } + else + { + gTasks[taskid].data[0x1]--; + gTasks[taskid].data[0x7]++; + } + break; + case 0x3: + m4aSongNumStop(SE_PIN); + gTasks[taskid].data[0x7] = 0x0; + break; + default: + gTasks[taskid].data[0x7]++; + } + if (gTasks[taskid].data[0x1] == 0x0) + sub_8116C34(taskid, &sub_81167F4, 0xFFFF, 0x3); +} + +void sub_811677C(u8 taskid) +{ + ConvertIntToDecimalStringN((u8 *)&gStringVar1, (eRoulette->var19 * gTasks[taskid].data[0x2]), STR_CONV_MODE_LEFT_ALIGN, 0x2); + StringExpandPlaceholders((u8 *)&gStringVar4, &gUnknown_081C41BD); + Menu_DrawStdWindowFrame(0x0, 0xE, 0x1D, 0x13); + Menu_PrintText((u8 *)&gStringVar4, 0x1, 0xF); + gTasks[taskid].data[0x1] = (eRoulette->var19 * gTasks[taskid].data[0x2]); + gTasks[taskid].data[0x7] = 0x0; + gTasks[taskid].func = &sub_81166E8; +} + +void sub_81167F4(u8 taskid) +{ + sub_8124D3C((&eRoulette->varB8), 0xFFFF); + (&eRoulette->varB8)->var04[0xF].var00_7 = 0x0; + (&eRoulette->varB8)->var04[0xE].var00_7 = 0x0; + (&eRoulette->varB8)->var04[0xD].var00_7 = 0x0; + gSprites[eRoulette->var3C[0x7 + gUnknown_083F8C00[gTasks[taskid].data[0xC]].var00]].invisible = TRUE; + gTasks[taskid].func = &sub_8116880; +} + +void sub_8116880(u8 taskid) +{ + u8 i = 0; + gTasks[taskid].data[0x4] = i; + eRoulette->var1B[eRoulette->var1A_0] = 0x0; + sub_8117158(0x0); + gSprites[eRoulette->var3C[0x30]].invisible = TRUE; + for (i = 0; i < 0x4; i++) + { + gSprites[eRoulette->var3C[i + 0x29]].oam.tileNum = + gSprites[eRoulette->var3C[i + 0x29]].sheetTileStart + + (*gSprites[eRoulette->var3C[i + 0x29]].anims)->type; + } + if (!(gTasks[taskid].data[0xD] < eRoulette->var19)) + { + if (gTasks[taskid].data[0x6] == 0x6) + { + Menu_DrawStdWindowFrame(0x0, 0xE, 0x1D, 0x13); + Menu_PrintText(&gUnknown_081C41F1, 0x1, 0xF); + sub_8116C34(taskid, &dp01t_12_3_battle_menu, 0xFFFF, 0x3); + } + else if (gTasks[taskid].data[0xD] == 0x270F) + { + Menu_DrawStdWindowFrame(0x0, 0xE, 0x1D, 0x13); + Menu_PrintText(&gUnknown_081C4231, 0x1, 0xF); + sub_8116C34(taskid, &sub_8115734, 0xFFFF, 0x3); + } + else + { + gTasks[taskid].func = &sub_8115734; + } + } + else + { + Menu_DrawStdWindowFrame(0x0, 0xE, 0x1D, 0x13); + Menu_PrintText(&gUnknown_081C41D2, 0x1, 0xF); + sub_8116C34(taskid, &sub_81157AC, 0x3C, 0x3); + } +} + +void dp01t_12_3_battle_menu(u8 taskid) +{ + u8 i = 0x0; + gTasks[taskid].data[0x6] = 0x0; + sub_8116CAC(taskid); + sub_8116CF8(); + sub_81185E8(); + sub_8117158(0x0); + sub_81182F8(0x6); + for (i = 0; i < 0xC; i++) + gSprites[eRoulette->var3C[i + 0x7]].invisible = FALSE; + if (gTasks[taskid].data[0xD] == 0x270F) + { + Menu_DrawStdWindowFrame(0x0, 0xE, 0x1D, 0x13); + Menu_PrintText(&gUnknown_081C4231, 0x1, 0xF); + sub_8116C34(taskid, &sub_8115734, 0xFFFF, 0x3); + } + else + { + gTasks[taskid].func = &sub_8115734; + } +} + +void sub_8116AB0(u8 taskid) +{ + sub_8124D3C((&eRoulette->varB8), 0xFFFF); + sub_8124918((&eRoulette->varB8)); + gSaveBlock1.coins = gTasks[taskid].data[0xD]; + if (gSaveBlock1.coins < eRoulette->var19) + gSpecialVar_0x8004 = TRUE; + else + gSpecialVar_0x8004 = FALSE; + BeginHardwarePaletteFade(0xFF, 0x0, 0x0, 0x10, 0x0); + gTasks[taskid].func = &sub_8116B40; +} + +#if DEBUG +__attribute__((naked)) +void sub_8116B40(u8 taskid) // end roulette ? +{ + asm("\ + push {r4, r5, r6, lr}\n\ + lsl r0, r0, #0x18\n\ + lsr r6, r0, #0x18\n\ + bl UpdatePaletteFade\n\ + lsl r0, r0, #0x18\n\ + lsr r5, r0, #0x18\n\ + cmp r5, #0\n\ + bne ._380 @cond_branch\n\ + mov r0, #0x0\n\ + bl SetVBlankCallback\n\ + ldr r0, ._381 @ 0x2019000\n\ + mov r2, #0xbe\n\ + lsl r2, r2, #0x1\n\ + mov r1, #0x0\n\ + bl memset\n\ + ldr r1, ._381 + 4 @ gSpriteCoordOffsetX\n\ + ldr r0, ._381 + 8 @ gSpriteCoordOffsetY\n\ + mov r4, #0x0\n\ + strh r5, [r0]\n\ + strh r5, [r1]\n\ + bl sub_80F9368\n\ + bl FreeAllSpritePalettes\n\ + bl ResetPaletteFade\n\ + bl ResetSpriteData\n\ + bl ClearBGTilemapBuffers\n\ + ldr r0, ._381 + 12 @ 0x4000050\n\ + strh r5, [r0]\n\ + add r0, r0, #0x2\n\ + strh r5, [r0]\n\ + add r0, r0, #0x2\n\ + strh r5, [r0]\n\ + ldr r1, ._381 + 16 @ gFieldCallback\n\ + ldr r0, ._381 + 20 @ sub_8080990\n\ + str r0, [r1]\n\ + ldr r0, ._381 + 24 @ c2_exit_to_overworld_2_switch\n\ + bl SetMainCallback2\n\ + add r0, r6, #0\n\ + bl DestroyTask\n\ + ldr r0, ._381 + 28 @ unk_203955C\n\ + strb r4, [r0]\n\ +._380:\n\ + pop {r4, r5, r6}\n\ + pop {r0}\n\ + bx r0\n\ +._382:\n\ + .align 2, 0\n\ +._381:\n\ + .word 0x2019000\n\ + .word gSpriteCoordOffsetX\n\ + .word gSpriteCoordOffsetY\n\ + .word 0x4000050\n\ + .word gFieldCallback\n\ + .word sub_8080990+1\n\ + .word c2_exit_to_overworld_2_switch+1\n\ + .word unk_203955C"); +} +#else +void sub_8116B40(u8 taskid) // end roulette ? +{ + if (UpdatePaletteFade() == 0) + { + SetVBlankCallback(0x0); + memset(eRoulette, 0x0, 0x17C); + gSpriteCoordOffsetX = gSpriteCoordOffsetY = 0x0; + sub_80F9368(); + FreeAllSpritePalettes(); + ResetPaletteFade(); + ResetSpriteData(); + ClearBGTilemapBuffers(); + REG_BLDCNT = 0x0; + REG_BLDALPHA = 0x0; + REG_BLDY = 0x0; + gFieldCallback = &sub_8080990; + SetMainCallback2(&c2_exit_to_overworld_2_switch); + DestroyTask(taskid); + } +} +#endif + +void sub_8116BC0(u8 taskid) +{ + if(eRoulette->varA8 == 0 || gMain.newKeys & eRoulette->varAA) + { + gTasks[taskid].func = eRoulette->varAC; + if (eRoulette->varAA > 0) + PlaySE(SE_SELECT); + eRoulette->varAC = NULL; + eRoulette->varAA = 0x0; + eRoulette->varA8 = 0x0; + } + if (eRoulette->varA8 != 0xFFFF) + eRoulette->varA8--; +} + +void sub_8116C34(u8 taskid, TaskFunc r1, u16 r2, u16 r3) +{ + eRoulette->varB4 = gTasks[taskid].func; + if(r1 == NULL) + r1 = eRoulette->varB4; + eRoulette->varAC = r1; + eRoulette->varA8 = r2; + if (r2 == 0xFFFF && r3 == 0) + eRoulette->varAA = 0xFFFF; + else + eRoulette->varAA = r3; + gTasks[taskid].func = &sub_8116BC0; +} + +void sub_8116CAC(u8 taskid) +{ + u8 i = 0; + eRoulette->var00 = i; + eRoulette->var03_0 = 0x0; + eRoulette->var03_5 = 0x0; + eRoulette->var03_6 = 0x0; + eRoulette->var03_7 = 0x0; + for (i = 0; i < 0x6; i++) + eRoulette->var1B[i] = 0x0; + eRoulette->var1A_0 = 0x0; + gTasks[taskid].data[0x1] = 0x0; +} + +void sub_8116CF8(void) +{ + u8 i; + eRoulette->var08 = 0x0; + for (i = 0; i < 0x6; i++) + eRoulette->var0C[i] = 0x0; + for (i = 0; i < 0x4; i++) + eRoulette->var12[i] = 0x0; + for (i = 0; i < 0x3; i++) + eRoulette->var16[i] = 0x0; + sub_8117C60(0x1, 0xFF); +} + +u8 sub_8116D54(u8 taskid, u8 r1) +{ + u32 t0[0x4]; + u32 t1[0x3]; + memcpy(t0, gUnknown_083F8ED8, 0x10); + memcpy(t1, gUnknown_083F8EE8, 0xC); + if (r1 > 0xB) + { + return 0x0; + } + else + { + u8 i; + u8 z; + eRoulette->var0C[gTasks[taskid].data[0x6] - 1] = gUnknown_083F8D90[r1].var02; + gTasks[taskid].data[0xC] = gUnknown_083F8D90[r1].var02; + eRoulette->var08 |= gUnknown_083F8D90[r1].var04; + for (i = 0; i < 0x4; i++) + { + if (gUnknown_083F8D90[r1].var04 & t0[i]) + eRoulette->var12[i]++; + if (eRoulette->var12[i] > 0x2) + eRoulette->var08 |= t0[i]; + } + for (z = 0; z < 0x3; z++) + { + if (gUnknown_083F8D90[r1].var04 & t1[z]) + eRoulette->var16[z]++; + if (eRoulette->var16[z] > 0x3) + eRoulette->var08 |= t1[z]; + } + return gUnknown_083F8D90[r1].var02; + } +} + +u8 sub_8116E5C(u8 r0, u8 r1) +{ + u8 t = r0; + if (--r0 < 0x13) + { + switch(r1) + { + case 0x0: + return 0x3; + break; + case 0x1 ... 0x4: + if (t == r1 + 5 || t == r1 + 10 || t == r1 + 15) + return 0x1; + break; + case 0x5: + case 0xA: + case 0xF: + if (!(t < r1 + 1) && !(t > r1 + 4)) + return 0x1; + break; + default: + if (t == r1) + return 0x1; + } + } + return 0x0; +} + +#ifdef NONMATCHING // stack variable switched with a register variable +void sub_8116EF8(u8 r0) +{ + + u32 var0 = 0x0; + struct UnkStruct1 var1[0x3]; + u32 var2; + u16 var3; + u32 var4; + u8 i; + switch(r0) + { + case 0x5: + case 0xA: + case 0xF: + for (i = (r0 + 0x1); i < (r0 + 0x5); i++) + if (!(eRoulette->var08 & gUnknown_083F8C00[i].var08)) + var0 |= gUnknown_083F8C00[i].var10; + var0 &= 0xDFFF; + sub_8124CE8(&eRoulette->varB8, var0); + break; + default: + memcpy(var1, gUnknown_083F8E9C, 0x18); + if ((u8)(r0 - 0x1) < 0x4) + var2 = 0x3; + else + var2 = 0x1; + var3 = ((r0 / 0x5) - 0x1); + switch((u8)r0 % 0x5) + { + case 0x1: + var3 = gSprites[eRoulette->var3C[0x7 + 0x0]].oam.paletteNum * 0x10; + break; + case 0x2: + var3 = gSprites[eRoulette->var3C[0x7 + 0x1]].oam.paletteNum * 0x10; + break; + case 0x3: + var3 = gSprites[eRoulette->var3C[0x7 + 0x2]].oam.paletteNum * 0x10; + break; + case 0x4: + var3 = gSprites[eRoulette->var3C[0x7 + 0x3]].oam.paletteNum * 0x10; + break; + } + if (var2 == 0x1) + { + if (!(eRoulette->var08 & gUnknown_083F8C00[r0].var08)) + { + var4 = (r0 / 0x5); + var1[var4 - 0x1].var02 += var3; + sub_812492C(&eRoulette->varB8, 0xD, &var1[var4 - 0x2]); + sub_8124CE8(&eRoulette->varB8, var0 |= gUnknown_083F8C00[r0].var10); + } + } + else + { + for (i = 0; i < 0x3; i++) + { + u8 var4 = i * 0x5 + r0 + 0x5; + if (!(eRoulette->var08 & gUnknown_083F8C00[var4].var08)) + { + u8 var5 = (var4 / 0x5); + var1[var5 - 0x1].var02 += var3; + sub_812492C(&eRoulette->varB8, (u8)(0xD + i), &var1[var5 - 0x2]); + if (var2 == 0x3) + var0 = gUnknown_083F8C00[var4].var10; + var2--; + } + } + if (var2 != 0x2) + var0 = 0x0; + sub_8124CE8(&eRoulette->varB8, var0 |= gUnknown_083F8C00[r0].var10); + } + } +} + +#else +__attribute__((naked)) +void sub_8116EF8(u8 r0) +{ +asm(".syntax unified\n\ +push {r4-r7,lr}\n\ +mov r7, r10\n\ +mov r6, r9\n\ +mov r5, r8\n\ +push {r5-r7}\n\ +sub sp, 0x20\n\ +lsls r0, 24\n\ +lsrs r6, r0, 24\n\ +movs r0, 0\n\ +str r0, [sp, 0x18]\n\ +cmp r6, 0xA\n\ +beq _08116F1E\n\ +cmp r6, 0xA\n\ +bgt _08116F1A\n\ +cmp r6, 0x5\n\ +beq _08116F1E\n\ +b _08116F7C\n\ +_08116F1A:\n\ +cmp r6, 0xF\n\ +bne _08116F7C\n\ +_08116F1E:\n\ +adds r0, r6, 0x1\n\ +lsls r0, 24\n\ +lsrs r4, r0, 24\n\ +adds r0, r6, 0x5\n\ +ldr r7, _08116F70 @ =0x020190b8\n\ +cmp r4, r0\n\ +bge _08116F5E\n\ +adds r1, r7, 0\n\ +subs r1, 0xB8\n\ +ldr r3, _08116F74 @ =gUnknown_083F8C00\n\ +ldr r5, [r1, 0x8]\n\ +adds r6, r3, 0\n\ +adds r6, 0x8\n\ +adds r2, r0, 0\n\ +_08116F3A:\n\ +lsls r0, r4, 2\n\ +adds r0, r4\n\ +lsls r1, r0, 2\n\ +adds r0, r1, r6\n\ +ldr r0, [r0]\n\ +ands r0, r5\n\ +cmp r0, 0\n\ +bne _08116F54\n\ +adds r0, r1, r3\n\ +ldrh r0, [r0, 0x10]\n\ +ldr r1, [sp, 0x18]\n\ +orrs r1, r0\n\ +str r1, [sp, 0x18]\n\ +_08116F54:\n\ +adds r0, r4, 0x1\n\ +lsls r0, 24\n\ +lsrs r4, r0, 24\n\ +cmp r4, r2\n\ +blt _08116F3A\n\ +_08116F5E:\n\ +ldr r0, _08116F78 @ =0x0000dfff\n\ +ldr r2, [sp, 0x18]\n\ +ands r2, r0\n\ +str r2, [sp, 0x18]\n\ +adds r0, r7, 0\n\ +adds r1, r2, 0\n\ +bl sub_8124CE8\n\ +b _0811713C\n\ +.align 2, 0\n\ +_08116F70: .4byte 0x020190b8\n\ +_08116F74: .4byte gUnknown_083F8C00\n\ +_08116F78: .4byte 0x0000dfff\n\ +_08116F7C:\n\ +mov r0, sp\n\ +ldr r1, _08116FC8 @ =gUnknown_083F8E9C\n\ +ldm r1!, {r2-r4}\n\ +stm r0!, {r2-r4}\n\ +ldm r1!, {r2-r4}\n\ +stm r0!, {r2-r4}\n\ +subs r0, r6, 0x1\n\ +lsls r0, 24\n\ +lsrs r0, 24\n\ +movs r3, 0x1\n\ +mov r10, r3\n\ +cmp r0, 0x3\n\ +bhi _08116F9A\n\ +movs r4, 0x3\n\ +mov r10, r4\n\ +_08116F9A:\n\ +adds r0, r6, 0\n\ +movs r1, 0x5\n\ +bl __udivsi3\n\ +lsls r0, 24\n\ +lsrs r0, 8\n\ +ldr r1, _08116FCC @ =0xffff0000\n\ +adds r0, r1\n\ +lsrs r7, r0, 16\n\ +adds r0, r6, 0\n\ +movs r1, 0x5\n\ +bl __umodsi3\n\ +lsls r0, 24\n\ +lsrs r0, 24\n\ +cmp r0, 0x2\n\ +beq _08116FF8\n\ +cmp r0, 0x2\n\ +bgt _08116FD4\n\ +cmp r0, 0x1\n\ +beq _08116FE4\n\ +ldr r4, _08116FD0 @ =0x02019000\n\ +b _0811703A\n\ +.align 2, 0\n\ +_08116FC8: .4byte gUnknown_083F8E9C\n\ +_08116FCC: .4byte 0xffff0000\n\ +_08116FD0: .4byte 0x02019000\n\ +_08116FD4:\n\ +cmp r0, 0x3\n\ +beq _0811700C\n\ +cmp r0, 0x4\n\ +beq _08117020\n\ +ldr r4, _08116FE0 @ =0x02019000\n\ +b _0811703A\n\ +.align 2, 0\n\ +_08116FE0: .4byte 0x02019000\n\ +_08116FE4:\n\ +ldr r3, _08116FF0 @ =gSprites\n\ +ldr r2, _08116FF4 @ =0x02019000\n\ +adds r0, r2, 0\n\ +adds r0, 0x43\n\ +b _08117028\n\ +.align 2, 0\n\ +_08116FF0: .4byte gSprites\n\ +_08116FF4: .4byte 0x02019000\n\ +_08116FF8:\n\ +ldr r3, _08117004 @ =gSprites\n\ +ldr r2, _08117008 @ =0x02019000\n\ +adds r0, r2, 0\n\ +adds r0, 0x44\n\ +b _08117028\n\ +.align 2, 0\n\ +_08117004: .4byte gSprites\n\ +_08117008: .4byte 0x02019000\n\ +_0811700C:\n\ +ldr r3, _08117018 @ =gSprites\n\ +ldr r2, _0811701C @ =0x02019000\n\ +adds r0, r2, 0\n\ +adds r0, 0x45\n\ +b _08117028\n\ +.align 2, 0\n\ +_08117018: .4byte gSprites\n\ +_0811701C: .4byte 0x02019000\n\ +_08117020:\n\ +ldr r3, _08117088 @ =gSprites\n\ +ldr r2, _0811708C @ =0x02019000\n\ +adds r0, r2, 0\n\ +adds r0, 0x46\n\ +_08117028:\n\ +ldrb r1, [r0]\n\ +lsls r0, r1, 4\n\ +adds r0, r1\n\ +lsls r0, 2\n\ +adds r0, r3\n\ +ldrb r0, [r0, 0x5]\n\ +lsrs r0, 4\n\ +lsls r7, r0, 4\n\ +adds r4, r2, 0\n\ +_0811703A:\n\ +mov r2, r10\n\ +cmp r2, 0x1\n\ +bne _08117094\n\ +ldr r1, _08117090 @ =gUnknown_083F8C00\n\ +lsls r2, r6, 2\n\ +adds r0, r2, r6\n\ +lsls r0, 2\n\ +adds r1, 0x8\n\ +adds r0, r1\n\ +ldr r1, [r4, 0x8]\n\ +ldr r0, [r0]\n\ +ands r1, r0\n\ +str r2, [sp, 0x1C]\n\ +cmp r1, 0\n\ +bne _0811713C\n\ +adds r0, r6, 0\n\ +movs r1, 0x5\n\ +bl __udivsi3\n\ +lsls r0, 24\n\ +lsrs r0, 24\n\ +subs r1, r0, 0x1\n\ +lsls r1, 3\n\ +mov r3, sp\n\ +adds r2, r3, r1\n\ +ldrh r1, [r2, 0x2]\n\ +adds r1, r7, r1\n\ +strh r1, [r2, 0x2]\n\ +adds r1, r4, 0\n\ +adds r1, 0xB8\n\ +lsls r0, 3\n\ +subs r0, 0x8\n\ +adds r2, r3, r0\n\ +adds r0, r1, 0\n\ +movs r1, 0xD\n\ +bl sub_812492C\n\ +b _08117122\n\ +.align 2, 0\n\ +_08117088: .4byte gSprites\n\ +_0811708C: .4byte 0x02019000\n\ +_08117090: .4byte gUnknown_083F8C00\n\ +_08117094:\n\ +movs r4, 0\n\ +lsls r0, r6, 2\n\ +str r0, [sp, 0x1C]\n\ +ldr r1, _0811714C @ =0x02019000\n\ +mov r8, r1\n\ +ldr r2, _08117150 @ =gUnknown_083F8C00\n\ +mov r9, r2\n\ +_081170A2:\n\ +lsls r0, r4, 2\n\ +adds r0, r4\n\ +adds r0, r6, r0\n\ +adds r0, 0x5\n\ +lsls r0, 24\n\ +lsrs r2, r0, 24\n\ +lsls r0, r2, 2\n\ +adds r0, r2\n\ +lsls r5, r0, 2\n\ +mov r0, r9\n\ +adds r0, 0x8\n\ +adds r0, r5, r0\n\ +mov r3, r8\n\ +ldr r1, [r3, 0x8]\n\ +ldr r0, [r0]\n\ +ands r1, r0\n\ +cmp r1, 0\n\ +bne _0811710E\n\ +adds r0, r2, 0\n\ +movs r1, 0x5\n\ +bl __udivsi3\n\ +lsls r0, 24\n\ +lsrs r0, 24\n\ +subs r1, r0, 0x1\n\ +lsls r1, 3\n\ +mov r3, sp\n\ +adds r2, r3, r1\n\ +ldrh r1, [r2, 0x2]\n\ +adds r1, r7, r1\n\ +strh r1, [r2, 0x2]\n\ +adds r1, r4, 0\n\ +adds r1, 0xD\n\ +lsls r1, 24\n\ +lsrs r1, 24\n\ +lsls r0, 3\n\ +subs r0, 0x8\n\ +adds r2, r3, r0\n\ +mov r0, r8\n\ +adds r0, 0xB8\n\ +bl sub_812492C\n\ +mov r0, r10\n\ +cmp r0, 0x3\n\ +bne _08117104\n\ +mov r1, r9\n\ +adds r0, r5, r1\n\ +ldrh r0, [r0, 0x10]\n\ +str r0, [sp, 0x18]\n\ +_08117104:\n\ +mov r0, r10\n\ +subs r0, 0x1\n\ +lsls r0, 24\n\ +lsrs r0, 24\n\ +mov r10, r0\n\ +_0811710E:\n\ +adds r0, r4, 0x1\n\ +lsls r0, 24\n\ +lsrs r4, r0, 24\n\ +cmp r4, 0x2\n\ +bls _081170A2\n\ +mov r2, r10\n\ +cmp r2, 0x2\n\ +beq _08117122\n\ +movs r3, 0\n\ +str r3, [sp, 0x18]\n\ +_08117122:\n\ +ldr r0, _08117154 @ =0x020190b8\n\ +ldr r2, _08117150 @ =gUnknown_083F8C00\n\ +ldr r4, [sp, 0x1C]\n\ +adds r1, r4, r6\n\ +lsls r1, 2\n\ +adds r1, r2\n\ +ldrh r1, [r1, 0x10]\n\ +ldr r2, [sp, 0x18]\n\ +orrs r2, r1\n\ +str r2, [sp, 0x18]\n\ +adds r1, r2, 0\n\ +bl sub_8124CE8\n\ +_0811713C:\n\ +add sp, 0x20\n\ +pop {r3-r5}\n\ +mov r8, r3\n\ +mov r9, r4\n\ +mov r10, r5\n\ +pop {r4-r7}\n\ +pop {r0}\n\ +bx r0\n\ +.align 2, 0\n\ +_0811714C: .4byte 0x02019000\n\ +_08117150: .4byte gUnknown_083F8C00\n\ +_08117154: .4byte 0x020190b8\n\ +.syntax divided\n"); +} +#endif + +#ifdef NONMATCHING //not enough stack usage +void sub_8117158(u8 r0) +{ + u8 i; + u8 l; + u8 v[0x5]; + u8 z; + u8 var0; + u8 var1; + u16 var2; + eRoulette->var2A = 0x1; + sub_8117AA8(0x0, 0x0); + sub_8124E2C(&gBGTilemapBuffers[2][0], ewram18800, 0xE, 0x7, 0x10, 0xD); + switch(r0) + { + case 0x0: + return; + case 0x1 ... 0x4: + l = 0x4; + for (i = 0x0; i < l; i++) + v[i] = i * 0x5 + r0; + break; + case 0x5: + case 0xA: + case 0xF: + l = 0x5; + for (i = 0x0; i < l; i++) + v[i] = i + r0; + break; + default: + l = 0x1; + v[0] = r0; + } + for (i = 0x0; i < l; i++) + { + //_0811727C + var0 = gUnknown_083F8C00[v[i]].var06; + var1 = gUnknown_083F8C00[v[i]].var03; + for (z = 0; z < 0x3; z++) + { + var2 = (gUnknown_083F8C00[v[i]].var04 + z) * 0x20; + gBGTilemapBuffers[2][var2 + var1 + 0x0] = ewram189a0[(var0 + z) * 0x3 + 0x0]; + gBGTilemapBuffers[2][var2 + var1 + 0x1] = ewram189a0[(var0 + z) * 0x3 + 0x1]; + gBGTilemapBuffers[2][var2 + var1 + 0x2] = ewram189a0[(var0 + z) * 0x3 + 0x2]; + } + //_08117350 + } +} +#else +__attribute__((naked)) +void sub_8117158(u8 r0) +{ +asm(".syntax unified\n\ +push {r4-r7,lr}\n\ +mov r7, r10\n\ +mov r6, r9\n\ +mov r5, r8\n\ +push {r5-r7}\n\ +sub sp, 0x24\n\ +lsls r0, 24\n\ +lsrs r5, r0, 24\n\ +ldr r4, _0811719C @ =0x02019000\n\ +movs r0, 0x1\n\ +strh r0, [r4, 0x2A]\n\ +movs r0, 0\n\ +movs r1, 0\n\ +bl sub_8117AA8\n\ +ldr r0, _081171A0 @ =gBGTilemapBuffers + 0x800\n\ +ldr r1, _081171A4 @ =0xfffff800\n\ +adds r4, r1\n\ +movs r1, 0x10\n\ +str r1, [sp]\n\ +movs r1, 0xD\n\ +str r1, [sp, 0x4]\n\ +adds r1, r4, 0\n\ +movs r2, 0xE\n\ +movs r3, 0x7\n\ +bl sub_8124E2C\n\ +cmp r5, 0xF\n\ +bhi _08117250\n\ +lsls r0, r5, 2\n\ +ldr r1, _081171A8 @ =_081171AC\n\ +adds r0, r1\n\ +ldr r0, [r0]\n\ +mov pc, r0\n\ +.align 2, 0\n\ +_0811719C: .4byte 0x02019000\n\ +_081171A0: .4byte gBGTilemapBuffers + 0x800\n\ +_081171A4: .4byte 0xfffff800\n\ +_081171A8: .4byte _081171AC\n\ +.align 2, 0\n\ +_081171AC:\n\ +.4byte _08117360\n\ +.4byte _081171EC\n\ +.4byte _081171EC\n\ +.4byte _081171EC\n\ +.4byte _081171EC\n\ +.4byte _08117220\n\ +.4byte _08117250\n\ +.4byte _08117250\n\ +.4byte _08117250\n\ +.4byte _08117250\n\ +.4byte _08117220\n\ +.4byte _08117250\n\ +.4byte _08117250\n\ +.4byte _08117250\n\ +.4byte _08117250\n\ +.4byte _08117220\n\ +_081171EC:\n\ +movs r0, 0x4\n\ +str r0, [sp, 0x18]\n\ +add r1, sp, 0x8\n\ +movs r0, 0\n\ +strb r0, [r1]\n\ +adds r0, r1, 0\n\ +ldrb r0, [r0]\n\ +cmp r0, 0x3\n\ +bhi _08117258\n\ +add r4, sp, 0x10\n\ +adds r3, r1, 0\n\ +_08117202:\n\ +ldrb r2, [r3]\n\ +adds r2, r4\n\ +ldrb r1, [r3]\n\ +lsls r0, r1, 2\n\ +adds r0, r1\n\ +adds r0, r5, r0\n\ +strb r0, [r2]\n\ +ldrb r0, [r3]\n\ +adds r0, 0x1\n\ +strb r0, [r3]\n\ +ldrb r0, [r3]\n\ +ldr r1, [sp, 0x18]\n\ +cmp r0, r1\n\ +bcc _08117202\n\ +b _08117258\n\ +_08117220:\n\ +movs r0, 0x5\n\ +str r0, [sp, 0x18]\n\ +add r1, sp, 0x8\n\ +movs r0, 0\n\ +strb r0, [r1]\n\ +adds r0, r1, 0\n\ +ldrb r0, [r0]\n\ +cmp r0, 0x4\n\ +bhi _08117258\n\ +add r3, sp, 0x10\n\ +adds r2, r1, 0\n\ +_08117236:\n\ +ldrb r1, [r2]\n\ +adds r1, r3\n\ +ldrb r0, [r2]\n\ +adds r0, r5, r0\n\ +strb r0, [r1]\n\ +ldrb r0, [r2]\n\ +adds r0, 0x1\n\ +strb r0, [r2]\n\ +ldrb r0, [r2]\n\ +ldr r1, [sp, 0x18]\n\ +cmp r0, r1\n\ +bcc _08117236\n\ +b _08117258\n\ +_08117250:\n\ +movs r0, 0x1\n\ +str r0, [sp, 0x18]\n\ +add r0, sp, 0x10\n\ +strb r5, [r0]\n\ +_08117258:\n\ +add r1, sp, 0x8\n\ +movs r0, 0\n\ +strb r0, [r1]\n\ +adds r0, r1, 0\n\ +ldrb r0, [r0]\n\ +ldr r1, [sp, 0x18]\n\ +cmp r0, r1\n\ +bcs _08117360\n\ +mov r0, sp\n\ +adds r0, 0xE\n\ +str r0, [sp, 0x1C]\n\ +add r1, sp, 0x10\n\ +mov r9, r1\n\ +add r0, sp, 0x8\n\ +mov r12, r0\n\ +mov r1, sp\n\ +adds r1, 0xA\n\ +str r1, [sp, 0x20]\n\ +_0811727C:\n\ +mov r1, r12\n\ +ldrb r0, [r1]\n\ +add r0, r9\n\ +ldrb r1, [r0]\n\ +lsls r0, r1, 2\n\ +adds r0, r1\n\ +lsls r0, 2\n\ +ldr r1, _08117370 @ =gUnknown_083F8C00\n\ +adds r0, r1\n\ +ldrb r0, [r0, 0x6]\n\ +ldr r1, [sp, 0x1C]\n\ +strb r0, [r1]\n\ +mov r1, r12\n\ +ldrb r0, [r1]\n\ +add r0, r9\n\ +ldrb r1, [r0]\n\ +lsls r0, r1, 2\n\ +adds r0, r1\n\ +lsls r0, 2\n\ +ldr r1, _08117370 @ =gUnknown_083F8C00\n\ +adds r0, r1\n\ +ldrb r0, [r0, 0x3]\n\ +ldr r1, [sp, 0x20]\n\ +strh r0, [r1]\n\ +mov r4, sp\n\ +adds r4, 0x9\n\ +movs r0, 0\n\ +strb r0, [r4]\n\ +ldrb r0, [r4]\n\ +cmp r0, 0x2\n\ +bhi _08117350\n\ +add r5, sp, 0xC\n\ +ldr r7, [sp, 0x20]\n\ +ldr r0, _08117374 @ =gBGTilemapBuffers + 0x800\n\ +mov r8, r0\n\ +ldr r6, [sp, 0x1C]\n\ +ldr r1, _08117378 @ =0x020189a0\n\ +mov r10, r1\n\ +_081172C8:\n\ +mov r1, r12\n\ +ldrb r0, [r1]\n\ +add r0, r9\n\ +ldrb r0, [r0]\n\ +lsls r1, r0, 2\n\ +adds r1, r0\n\ +lsls r1, 2\n\ +ldr r0, _08117370 @ =gUnknown_083F8C00\n\ +adds r1, r0\n\ +adds r3, r4, 0\n\ +ldrb r0, [r4]\n\ +ldrb r1, [r1, 0x4]\n\ +adds r0, r1\n\ +lsls r0, 5\n\ +strh r0, [r5]\n\ +ldrh r0, [r7]\n\ +ldrh r2, [r5]\n\ +adds r2, r0\n\ +lsls r2, 1\n\ +add r2, r8\n\ +ldrb r0, [r6]\n\ +ldrb r1, [r4]\n\ +adds r1, r0\n\ +lsls r0, r1, 1\n\ +adds r0, r1\n\ +lsls r0, 1\n\ +add r0, r10\n\ +ldrh r0, [r0]\n\ +strh r0, [r2]\n\ +ldrh r0, [r7]\n\ +ldrh r2, [r5]\n\ +adds r2, r0\n\ +adds r2, 0x1\n\ +lsls r2, 1\n\ +add r2, r8\n\ +ldrb r0, [r6]\n\ +ldrb r1, [r4]\n\ +adds r1, r0\n\ +lsls r0, r1, 1\n\ +adds r0, r1\n\ +lsls r0, 1\n\ +mov r1, r10\n\ +adds r1, 0x2\n\ +adds r0, r1\n\ +ldrh r0, [r0]\n\ +strh r0, [r2]\n\ +ldrh r0, [r7]\n\ +ldrh r2, [r5]\n\ +adds r2, r0\n\ +adds r2, 0x2\n\ +lsls r2, 1\n\ +add r2, r8\n\ +ldrb r0, [r6]\n\ +ldrb r1, [r4]\n\ +adds r1, r0\n\ +lsls r0, r1, 1\n\ +adds r0, r1\n\ +lsls r0, 1\n\ +ldr r1, _0811737C @ =0x020189a4\n\ +adds r0, r1\n\ +ldrh r0, [r0]\n\ +strh r0, [r2]\n\ +ldrb r0, [r4]\n\ +adds r0, 0x1\n\ +strb r0, [r4]\n\ +ldrb r0, [r3]\n\ +cmp r0, 0x2\n\ +bls _081172C8\n\ +_08117350:\n\ +mov r1, r12\n\ +ldrb r0, [r1]\n\ +adds r0, 0x1\n\ +strb r0, [r1]\n\ +ldrb r0, [r1]\n\ +ldr r1, [sp, 0x18]\n\ +cmp r0, r1\n\ +bcc _0811727C\n\ +_08117360:\n\ +add sp, 0x24\n\ +pop {r3-r5}\n\ +mov r8, r3\n\ +mov r9, r4\n\ +mov r10, r5\n\ +pop {r4-r7}\n\ +pop {r0}\n\ +bx r0\n\ +.align 2, 0\n\ +_08117370: .4byte gUnknown_083F8C00\n\ +_08117374: .4byte gBGTilemapBuffers + 0x800\n\ +_08117378: .4byte 0x020189a0\n\ +_0811737C: .4byte 0x020189a4\n\ +.syntax divided\n"); +} +#endif + +#ifdef NONMATCHING +u8 sub_8117380(u8 r0) +{ + u8 var0[0x5]; + u8 t; + u8 z; + memcpy(var0, gUnknown_083F8EF4, 0x5); + if (r0 > 0x13) + r0 = 0x0; + switch (gUnknown_083F8C00[r0].var01_0) + { + case 0x3: + z = r0 / 0x5 - 0x1; + if (eRoulette->var16[z] > 0x3) + return 0x0; + return var0[eRoulette->var16[z] + 0x1]; + case 0x4: + t = r0 - 0x1; + if (eRoulette->var12[t] > 0x2) + return 0x0; + return var0[eRoulette->var12[t] + 0x2]; + case 0xC: + if (eRoulette->var08 & gUnknown_083F8C00[r0].var08) + return 0x0; + return var0[0x4]; + default: + } + return 0x0; +} +#else +__attribute__((naked)) +u8 sub_8117380(u8 r0) +{ +asm(".syntax unified\n\ +push {r4,lr}\n\ +sub sp, 0x8\n\ +lsls r0, 24\n\ +lsrs r4, r0, 24\n\ +ldr r1, _081173B8 @ =gUnknown_083F8EF4\n\ +mov r0, sp\n\ +movs r2, 0x5\n\ +bl memcpy\n\ +cmp r4, 0x13\n\ +bls _08117398\n\ +movs r4, 0\n\ +_08117398:\n\ +ldr r3, _081173BC @ =gUnknown_083F8C00\n\ +lsls r0, r4, 2\n\ +adds r0, r4\n\ +lsls r2, r0, 2\n\ +adds r0, r2, r3\n\ +ldrb r0, [r0, 0x1]\n\ +lsls r0, 28\n\ +lsrs r0, 28\n\ +cmp r0, 0x4\n\ +beq _081173EC\n\ +cmp r0, 0x4\n\ +bgt _081173C0\n\ +cmp r0, 0x3\n\ +beq _081173C6\n\ +b _08117428\n\ +.align 2, 0\n\ +_081173B8: .4byte gUnknown_083F8EF4\n\ +_081173BC: .4byte gUnknown_083F8C00\n\ +_081173C0:\n\ +cmp r0, 0xC\n\ +beq _0811740C\n\ +b _08117428\n\ +_081173C6:\n\ +adds r0, r4, 0\n\ +movs r1, 0x5\n\ +bl __udivsi3\n\ +subs r0, 0x1\n\ +lsls r0, 24\n\ +lsrs r4, r0, 24\n\ +ldr r0, _081173E8 @ =0x02019000\n\ +adds r0, 0x16\n\ +adds r1, r4, r0\n\ +ldrb r0, [r1]\n\ +cmp r0, 0x3\n\ +bhi _08117428\n\ +ldrb r0, [r1]\n\ +adds r0, 0x1\n\ +b _08117402\n\ +.align 2, 0\n\ +_081173E8: .4byte 0x02019000\n\ +_081173EC:\n\ +subs r0, r4, 0x1\n\ +lsls r0, 24\n\ +lsrs r4, r0, 24\n\ +ldr r0, _08117408 @ =0x02019000\n\ +adds r0, 0x12\n\ +adds r1, r4, r0\n\ +ldrb r0, [r1]\n\ +cmp r0, 0x2\n\ +bhi _08117428\n\ +ldrb r0, [r1]\n\ +adds r0, 0x2\n\ +_08117402:\n\ +add r0, sp\n\ +ldrb r0, [r0]\n\ +b _0811742A\n\ +.align 2, 0\n\ +_08117408: .4byte 0x02019000\n\ +_0811740C:\n\ +ldr r1, _08117424 @ =0x02019000\n\ +adds r0, r3, 0\n\ +adds r0, 0x8\n\ +adds r0, r2, r0\n\ +ldr r1, [r1, 0x8]\n\ +ldr r0, [r0]\n\ +ands r1, r0\n\ +cmp r1, 0\n\ +bne _08117428\n\ +mov r0, sp\n\ +ldrb r0, [r0, 0x4]\n\ +b _0811742A\n\ +.align 2, 0\n\ +_08117424: .4byte 0x02019000\n\ +_08117428:\n\ +movs r0, 0\n\ +_0811742A:\n\ +add sp, 0x8\n\ +pop {r4}\n\ +pop {r1}\n\ +bx r1\n\ +.syntax divided\n"); +} +#endif + +void sub_8117434(void) +{ + s32 x1; + s32 x2; + REG_BG2PA = eRoulette->var2C.a; + REG_BG2PB = eRoulette->var2C.b; + REG_BG2PC = eRoulette->var2C.c; + REG_BG2PD = eRoulette->var2C.d; + x1 = 0x7400 - eRoulette->var2C.a * (gSpriteCoordOffsetX + 0x74) + - eRoulette->var2C.b * (gSpriteCoordOffsetY + 0x50); + x2 = 0x5400 - eRoulette->var2C.c * (gSpriteCoordOffsetX + 0x74) + - eRoulette->var2C.d * (gSpriteCoordOffsetY + 0x50); + REG_BG2X_L = x1; + REG_BG2X_H = (x1 & 0x0fff0000) >> 16; + REG_BG2Y_L = x2; + REG_BG2Y_H = (x2 & 0x0fff0000) >> 16; +} + +s16 sub_81174C4(s16 r0, s16 r1) +{ + s32 t = r0 * r1; + t /= 0x100; + return t; +} + +s16 sub_81174E0(s16 r0) +{ + s32 t = 0x10000; + return t / r0; +} + +void sub_81174F8(u8 r0) +{ + DisplayYesNoMenu(0x14, 0x8, 0x1); + sub_814AAF8(0x2D9E); + DoYesNoFuncWithChoice(r0, &gUnknown_083F8EB4); +} + +void sub_8117528(u8 taskid) +{ + if (!gPaletteFade.active) + { + SetVBlankCallback(NULL); + SetMainCallback2(&sub_8115384); + DestroyTask(taskid); + } +} + +void sub_811755C(u8 taskid) +{ + Menu_EraseWindowRect(0x14, 0x8, 0x1A, 0xD); + Menu_EraseScreen(); + BeginNormalPaletteFade(-0x1, 0x0, 0x0, 0x10, 0x0); + gPaletteFade.delayCounter = gPaletteFade.multipurpose2; + UpdatePaletteFade(); + gTasks[taskid].func = &sub_8117528; +} + +void sub_81175C0(u8 taskid) +{ +#if DEBUG + unk_203955C[0] = 0; +#endif + Menu_EraseScreen(); + ScriptContext2_Disable(); + DestroyTask(taskid); +} + +void sub_81175DC(u8 taskid) +{ + gTasks[taskid].data[0]++; + if (!(gMain.newKeys & (A_BUTTON | B_BUTTON)) && gTasks[taskid].data[0] < 0x3D) + return; + gSpecialVar_0x8004 = 0x1; + Menu_EraseScreen(); + ScriptContext2_Disable(); + DestroyTask(taskid); +} + +void sub_8117630(u8 taskid) +{ + u32 temp = gUnknown_083F8DF0[(gSpecialVar_0x8004 & 0x1) + (gSpecialVar_0x8004 >> 0x7 << 0x1)]; + ConvertIntToDecimalStringN(gStringVar1, temp, 0x2, 0x1); + StringExpandPlaceholders(gStringVar4, &gUnknown_081C40DF); + Menu_DrawStdWindowFrame(0x0, 0xE, 0x1D, 0x13); + Menu_PrintText(gStringVar4, 0x1, 0xF); + gTasks[taskid].func = &sub_81174F8; +} + +void Task_Roulette_0(u8 taskid) +{ + s32 temp; + ConvertIntToDecimalStringN(gStringVar1, gTasks[taskid].data[0xD], 0x1, 0x4); + StringExpandPlaceholders(gStringVar4, gOtherText_Coins); + Menu_DrawStdWindowFrame(0x0, 0x0, 0x9, 0x3); + MenuPrint_RightAligned(gStringVar4, 0x9, 0x1); + temp = gUnknown_083F8DF0[(gSpecialVar_0x8004 & 0x1) + (gSpecialVar_0x8004 >> 0x7 << 0x1)]; + ConvertIntToDecimalStringN(gStringVar1, temp, 0x2, 0x1); + if (gTasks[taskid].data[0xD] >= temp) + { + if ((gSpecialVar_0x8004 & 0x80) && (gSpecialVar_0x8004 & 0x1)) + { + Menu_DrawStdWindowFrame(0x0, 0xE, 0x1D, 0x13); + Menu_PrintText(&gUnknown_081C4139, 0x1, 0xF); + sub_8116C34(taskid , &sub_8117630, 0xFFFF, 0x3); + } + else + { + StringExpandPlaceholders(gStringVar4, &gUnknown_081C40DF); + Menu_DrawStdWindowFrame(0x0, 0xE, 0x1D, 0x13); + Menu_PrintText(gStringVar4, 0x1, 0xF); + gTasks[taskid].func = &sub_81174F8; + } + } + else + { + StringExpandPlaceholders(gStringVar4, &gUnknown_081C411C); + Menu_DrawStdWindowFrame(0x0, 0xE, 0x1D, 0x13); + Menu_PrintText(gStringVar4, 0x1, 0xF); + gTasks[taskid].func = &sub_81175DC; + gTasks[taskid].data[0xD] = 0x0; + gTasks[taskid].data[0x0] = 0x0; + } +} + +#if DEBUG + +__attribute__((naked)) +void debug_sub_812CDE4() +{ + asm("\ + push {r4, r5, lr}\n\ + lsl r0, r0, #0x18\n\ + lsr r3, r0, #0x18\n\ + add r4, r3, #0\n\ + ldr r0, ._575 @ gMain\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._572 @cond_branch\n\ + ldr r1, ._575 + 4 @ gTasks\n\ + lsl r0, r3, #0x2\n\ + add r0, r0, r3\n\ + lsl r0, r0, #0x3\n\ + add r2, r0, r1\n\ + ldrh r0, [r2, #0x22]\n\ + add r0, r0, #0x1\n\ + strh r0, [r2, #0x22]\n\ + lsl r0, r0, #0x10\n\ + ldr r1, ._575 + 8 @ 0x27100000\n\ + cmp r0, r1\n\ + bne ._573 @cond_branch\n\ + mov r0, #0x0\n\ + strh r0, [r2, #0x22]\n\ +._573:\n\ + ldr r0, ._575 + 12 @ gStringVar1\n\ + mov r3, #0x22\n\ + ldsh r1, [r2, r3]\n\ + b ._584\n\ +._576:\n\ + .align 2, 0\n\ +._575:\n\ + .word gMain\n\ + .word gTasks\n\ + .word 0x27100000\n\ + .word gStringVar1\n\ +._572:\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._577 @cond_branch\n\ + ldr r1, ._580 @ gTasks\n\ + lsl r0, r3, #0x2\n\ + add r0, r0, r3\n\ + lsl r0, r0, #0x3\n\ + add r2, r0, r1\n\ + ldrh r0, [r2, #0x22]\n\ + sub r0, r0, #0x1\n\ + strh r0, [r2, #0x22]\n\ + lsl r0, r0, #0x10\n\ + asr r0, r0, #0x10\n\ + mov r1, #0x1\n\ + neg r1, r1\n\ + cmp r0, r1\n\ + bne ._578 @cond_branch\n\ + ldr r0, ._580 + 4 @ 0x270f\n\ + strh r0, [r2, #0x22]\n\ +._578:\n\ + ldr r0, ._580 + 8 @ gStringVar1\n\ + mov r3, #0x22\n\ + ldsh r1, [r2, r3]\n\ + b ._584\n\ +._581:\n\ + .align 2, 0\n\ +._580:\n\ + .word gTasks\n\ + .word 0x270f\n\ + .word gStringVar1\n\ +._577:\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._582 @cond_branch\n\ + ldr r1, ._585 @ gTasks\n\ + lsl r0, r3, #0x2\n\ + add r0, r0, r3\n\ + lsl r0, r0, #0x3\n\ + add r2, r0, r1\n\ + ldrh r3, [r2, #0x22]\n\ + add r0, r3, #0\n\ + add r0, r0, #0xa\n\ + strh r0, [r2, #0x22]\n\ + lsl r0, r0, #0x10\n\ + ldr r1, ._585 + 4 @ 0x270f0000\n\ + cmp r0, r1\n\ + ble ._583 @cond_branch\n\ + ldr r1, ._585 + 8 @ 0xffffd8fb\n\ + add r0, r3, r1\n\ + strh r0, [r2, #0x22]\n\ +._583:\n\ + ldr r0, ._585 + 12 @ gStringVar1\n\ + mov r3, #0x22\n\ + ldsh r1, [r2, r3]\n\ + b ._584\n\ +._586:\n\ + .align 2, 0\n\ +._585:\n\ + .word gTasks\n\ + .word 0x270f0000\n\ + .word 0xffffd8fb\n\ + .word gStringVar1\n\ +._582:\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._587 @cond_branch\n\ + ldr r0, ._590 @ gTasks\n\ + lsl r1, r3, #0x2\n\ + add r1, r1, r3\n\ + lsl r1, r1, #0x3\n\ + add r1, r1, r0\n\ + ldrh r2, [r1, #0x22]\n\ + add r0, r2, #0\n\ + sub r0, r0, #0xa\n\ + strh r0, [r1, #0x22]\n\ + lsl r0, r0, #0x10\n\ + cmp r0, #0\n\ + bge ._588 @cond_branch\n\ + ldr r3, ._590 + 4 @ 0x2705\n\ + add r0, r2, r3\n\ + strh r0, [r1, #0x22]\n\ +._588:\n\ + ldr r0, ._590 + 8 @ gStringVar1\n\ + mov r2, #0x22\n\ + ldsh r1, [r1, r2]\n\ +._584:\n\ + mov r2, #0x1\n\ + mov r3, #0x4\n\ + bl ConvertIntToDecimalStringN\n\ + ldr r4, ._590 + 12 @ gStringVar4\n\ + ldr r1, ._590 + 16 @ gOtherText_Coins\n\ + add r0, r4, #0\n\ + bl StringExpandPlaceholders\n\ + add r0, r4, #0\n\ + mov r1, #0x9\n\ + mov r2, #0x1\n\ + bl MenuPrint_RightAligned\n\ + b ._596\n\ +._591:\n\ + .align 2, 0\n\ +._590:\n\ + .word gTasks\n\ + .word 0x2705\n\ + .word gStringVar1\n\ + .word gStringVar4\n\ + .word gOtherText_Coins\n\ +._587:\n\ + mov r0, #0x8\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._592 @cond_branch\n\ + ldr r0, ._594 @ gSaveBlock1\n\ + ldr r2, ._594 + 4 @ gTasks\n\ + lsl r1, r3, #0x2\n\ + add r1, r1, r3\n\ + lsl r1, r1, #0x3\n\ + add r1, r1, r2\n\ + ldrh r2, [r1, #0x22]\n\ + ldr r3, ._594 + 8 @ 0x494\n\ + add r0, r0, r3\n\ + mov r5, #0x0\n\ + strh r2, [r0]\n\ + ldr r0, ._594 + 12 @ Task_Roulette_0\n\ + str r0, [r1]\n\ + ldr r0, ._594 + 16 @ gStringVar1\n\ + mov r2, #0x22\n\ + ldsh r1, [r1, r2]\n\ + mov r2, #0x1\n\ + mov r3, #0x4\n\ + bl ConvertIntToDecimalStringN\n\ + ldr r4, ._594 + 20 @ gStringVar4\n\ + ldr r1, ._594 + 24 @ gOtherText_Coins\n\ + add r0, r4, #0\n\ + bl StringExpandPlaceholders\n\ + add r0, r4, #0\n\ + mov r1, #0x9\n\ + mov r2, #0x1\n\ + bl MenuPrint_RightAligned\n\ + ldr r0, ._594 + 28 @ unk_2039560\n\ + strb r5, [r0]\n\ + b ._596\n\ +._595:\n\ + .align 2, 0\n\ +._594:\n\ + .word gSaveBlock1\n\ + .word gTasks\n\ + .word 0x494\n\ + .word Task_Roulette_0+1\n\ + .word gStringVar1\n\ + .word gStringVar4\n\ + .word gOtherText_Coins\n\ + .word unk_2039560\n\ +._592:\n\ + mov r0, #0x4\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._596 @cond_branch\n\ + ldr r0, ._597 @ gSaveBlock1\n\ + ldr r2, ._597 + 4 @ gTasks\n\ + lsl r1, r4, #0x2\n\ + add r1, r1, r4\n\ + lsl r1, r1, #0x3\n\ + add r1, r1, r2\n\ + ldrh r2, [r1, #0x22]\n\ + ldr r3, ._597 + 8 @ 0x494\n\ + add r0, r0, r3\n\ + strh r2, [r0]\n\ + ldr r0, ._597 + 12 @ Task_Roulette_0\n\ + str r0, [r1]\n\ + ldr r0, ._597 + 16 @ gStringVar1\n\ + mov r2, #0x22\n\ + ldsh r1, [r1, r2]\n\ + mov r2, #0x1\n\ + mov r3, #0x4\n\ + bl ConvertIntToDecimalStringN\n\ + ldr r4, ._597 + 20 @ gStringVar4\n\ + ldr r1, ._597 + 24 @ gOtherText_Coins\n\ + add r0, r4, #0\n\ + bl StringExpandPlaceholders\n\ + add r0, r4, #0\n\ + mov r1, #0x9\n\ + mov r2, #0x1\n\ + bl MenuPrint_RightAligned\n\ + ldr r1, ._597 + 28 @ unk_2039560\n\ + mov r0, #0x1\n\ + strb r0, [r1]\n\ +._596:\n\ + pop {r4, r5}\n\ + pop {r0}\n\ + bx r0\n\ +._598:\n\ + .align 2, 0\n\ +._597:\n\ + .word gSaveBlock1\n\ + .word gTasks\n\ + .word 0x494\n\ + .word Task_Roulette_0+1\n\ + .word gStringVar1\n\ + .word gStringVar4\n\ + .word gOtherText_Coins\n\ + .word unk_2039560"); +} + +__attribute__((naked)) +void debug_sub_812CFE8() +{ + asm("\ + push {r4, r5, lr}\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + ldr r2, ._600 @ gTasks\n\ + lsl r1, r0, #0x2\n\ + add r1, r1, r0\n\ + lsl r1, r1, #0x3\n\ + add r5, r1, r2\n\ + ldr r0, ._600 + 4 @ gSaveBlock1\n\ + ldr r1, ._600 + 8 @ 0x494\n\ + add r0, r0, r1\n\ + ldrh r0, [r0]\n\ + strh r0, [r5, #0x22]\n\ + bl Random\n\ + mov r1, #0x1\n\ + and r1, r1, r0\n\ + cmp r1, #0\n\ + beq ._599 @cond_branch\n\ + ldr r0, ._600 + 12 @ gSpecialVar_0x8004\n\ + ldrh r1, [r0]\n\ + mov r2, #0x80\n\ + orr r1, r1, r2\n\ + strh r1, [r0]\n\ +._599:\n\ + ldr r0, ._600 + 16 @ gStringVar1\n\ + mov r2, #0x22\n\ + ldsh r1, [r5, r2]\n\ + mov r2, #0x1\n\ + mov r3, #0x4\n\ + bl ConvertIntToDecimalStringN\n\ + ldr r4, ._600 + 20 @ gStringVar4\n\ + ldr r1, ._600 + 24 @ gOtherText_Coins\n\ + add r0, r4, #0\n\ + bl StringExpandPlaceholders\n\ + mov r0, #0x0\n\ + mov r1, #0x0\n\ + mov r2, #0x9\n\ + mov r3, #0x3\n\ + bl Menu_DrawStdWindowFrame\n\ + add r0, r4, #0\n\ + mov r1, #0x9\n\ + mov r2, #0x1\n\ + bl MenuPrint_RightAligned\n\ + mov r0, #0x0\n\ + mov r1, #0xe\n\ + mov r2, #0x1d\n\ + mov r3, #0x13\n\ + bl Menu_DrawStdWindowFrame\n\ + ldr r0, ._600 + 28 @ gUnknown_Debug_0842510D\n\ + mov r1, #0x1\n\ + mov r2, #0xf\n\ + bl Menu_PrintText\n\ + ldr r0, ._600 + 32 @ debug_sub_812CDE4\n\ + str r0, [r5]\n\ + pop {r4, r5}\n\ + pop {r0}\n\ + bx r0\n\ +._601:\n\ + .align 2, 0\n\ +._600:\n\ + .word gTasks\n\ + .word gSaveBlock1\n\ + .word 0x494\n\ + .word gSpecialVar_0x8004\n\ + .word gStringVar1\n\ + .word gStringVar4\n\ + .word gOtherText_Coins\n\ + .word gUnknown_Debug_0842510D\n\ + .word debug_sub_812CDE4+1"); +} + +#endif + +#if DEBUG +__attribute__((naked)) +void PlayRoulette(void) +{ + asm("\ + push {lr}\n\ + bl ScriptContext2_Enable\n\ + ldr r1, ._604 @ unk_2039560\n\ + mov r0, #0x0\n\ + strb r0, [r1]\n\ + ldr r0, ._604 + 4 @ unk_203955C\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._602 @cond_branch\n\ + ldr r0, ._604 + 8 @ debug_sub_812CFE8\n\ + mov r1, #0x0\n\ + bl CreateTask\n\ + b ._603\n\ +._605:\n\ + .align 2, 0\n\ +._604:\n\ + .word unk_2039560\n\ + .word unk_203955C\n\ + .word debug_sub_812CFE8+1\n\ +._602:\n\ + ldr r0, ._606 @ Task_Roulette_0\n\ + mov r1, #0x0\n\ + bl CreateTask\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + ldr r2, ._606 + 4 @ gTasks\n\ + lsl r1, r0, #0x2\n\ + add r1, r1, r0\n\ + lsl r1, r1, #0x3\n\ + add r1, r1, r2\n\ + ldr r0, ._606 + 8 @ gSaveBlock1\n\ + ldr r2, ._606 + 12 @ 0x494\n\ + add r0, r0, r2\n\ + ldrh r0, [r0]\n\ + strh r0, [r1, #0x22]\n\ +._603:\n\ + pop {r0}\n\ + bx r0\n\ +._607:\n\ + .align 2, 0\n\ +._606:\n\ + .word Task_Roulette_0+1\n\ + .word gTasks\n\ + .word gSaveBlock1\n\ + .word 0x494"); +} +#else +void PlayRoulette(void) +{ + u8 taskid; + ScriptContext2_Enable(); + taskid = CreateTask(&Task_Roulette_0, 0x0); + gTasks[taskid].data[0xD] = gSaveBlock1.coins; +} +#endif + +void sub_8117838(u8 r0) +{ + if (!r0) + { + FreeAllSpritePalettes(); + LoadSpritePalettes(&gUnknown_083F9E30); + LZ77UnCompWram(gUnknown_083F92A8, ewram17000); + LZ77UnCompWram(gUnknown_083F90FC, ewram17E00); + LZ77UnCompWram(gUnknown_083F9D3C, ewram18000); + } + else + { + FreeAllSpritePalettes(); + } +} + +u8 sub_8117890(const struct SpriteTemplate *r0, u8 r1, u16 *r2) +{ + u16 temp; + u8 spriteid = CreateSprite(r0, 0x74, 0x50, r0->oam->y); + gSprites[spriteid].data[0] = *r2; + gSprites[spriteid].data[1] = r1; + gSprites[spriteid].coordOffsetEnabled = TRUE; + gSprites[spriteid].animPaused = TRUE; + gSprites[spriteid].affineAnimPaused = TRUE; + temp = *r2; + *r2 += 0x1E; + if (*r2 > 0x167) + *r2 = temp - 0x14A; + return spriteid; +} + +void sub_8117900(void) +{ + u8 i, j; + u8 spriteid; + struct SpriteSheet s; + LZ77UnCompWram(gUnknown_083F9F54.data, gSharedMem); + s.data = gSharedMem; + s.size = gUnknown_083F9F54.size; + s.tag = gUnknown_083F9F54.tag; + LoadSpriteSheet(&s); + LZ77UnCompWram(gUnknown_083F9F5C.data, gSharedMem); + s.data = gSharedMem; + s.size = gUnknown_083F9F5C.size; + s.tag = gUnknown_083F9F5C.tag; + LoadSpriteSheet(&s); + for (i = 0; i < 0x3; i++) + { + u8 o = i * 0x18; + for (j = 0; j < 0x4; j++) + { + spriteid = eRoulette->var3C[0x1D + i * 0x4 + j] = + CreateSprite(&gSpriteTemplate_83FA07C[j], j * 0x18 + 0x94, o + 0x5C, 0x1E); + gSprites[spriteid].animPaused = TRUE; + o += 0x18; + if (o > 0x47) + o = 0x0; + } + } + for (i = 0x0; i < 0x4; i++) + { + spriteid = eRoulette->var3C[0x29 + i] = + CreateSprite(&gSpriteTemplate_83F9FD4[i], (s16)(i * 0x18 + 0x94), 0x46, 0x1E); + gSprites[spriteid].animPaused = TRUE; + } + for (i = 0x0; i < 0x3; i++) + { + spriteid = eRoulette->var3C[0x2D + i] = + CreateSprite(&gSpriteTemplate_83FA034[i], 0x7E, (s16)(i * 0x18 + 0x5C), 0x1E); + gSprites[spriteid].animPaused = TRUE; + } +} + +void unref_sub_8117A74(void) //destroy all sprites at 0x1D +{ + u8 i; + for (i = 0x0; i < 0xC; i++) + DestroySprite(&gSprites[eRoulette->var3C[0x1D + i]]); +} + +void sub_8117AA8(u8 r0, u8 r1) +{ + u8 i; + switch(r0) + { + case 0x1: + for (i = 0x0; i < 0x13; i++) + gSprites[eRoulette->var3C[0x1D + i]].invisible = TRUE; + break; + case 0x0: + for (i = 0x0; i < 0xC; i++) + { + if (!(eRoulette->var08 & gUnknown_083F8D90[i].var04)) + gSprites[eRoulette->var3C[0x1D + i]].invisible = FALSE; + else if(!(gUnknown_083F8D90[i].var02 == r1)) + gSprites[eRoulette->var3C[0x1D + i]].invisible = TRUE; + else + gSprites[eRoulette->var3C[0x1D + i]].invisible = FALSE; + } + for ( ; i < 0x13; i++) + gSprites[eRoulette->var3C[0x1D + i]].invisible = FALSE; + break; + } +} + +void sub_8117BBC(void) +{ + u8 i; + for (i = 0x0; i < 0x6; i++) + { + eRoulette->var3C[0x31 + i] = CreateSprite(&gSpriteTemplate_83FA40C, 0x74, 0x14, 0xA); + gSprites[eRoulette->var3C[0x31 + i]].invisible = TRUE; + gSprites[eRoulette->var3C[0x31 + i]].data[0] = 0x1; + gSprites[eRoulette->var3C[0x31 + i]].callback = &sub_81184CC; + gSprites[eRoulette->var3C[0x31 + i]].oam.priority = 0x1; + StartSpriteAnim(&gSprites[eRoulette->var3C[0x31 + i]], 0x8); + } +} + +void sub_8117C60(u8 r0, u8 r1) +{ + u8 i = 0x0; + if (r0) + { + for ( ; i < 0x6; i++) + gSprites[eRoulette->var3C[0x31 + i]].invisible = TRUE; + } + else + { + for ( ; i < 0x6; i++) + { + if (!(eRoulette->var0C[i]) || (i == r1)) + { + gSprites[eRoulette->var3C[0x31 + i]].invisible = TRUE; + } + else + { + gSprites[eRoulette->var3C[0x31 + i]].invisible = FALSE; + gSprites[eRoulette->var3C[0x31 + i]].pos1.x = (gUnknown_083F8C00[eRoulette->var0C[i]].var03 + 0x1) * 0x8 + 0x4; + gSprites[eRoulette->var3C[0x31 + i]].pos1.y = (gUnknown_083F8C00[eRoulette->var0C[i]].var04 + 0x1) * 0x8 + 0x3; + } + } + } +} + +void sub_8117D68(u8 r0) +{ + if (!r0) + { + gSprites[eRoulette->var3C[0x30]].invisible = TRUE; + } + else + { + gSprites[eRoulette->var3C[0x30]].invisible = FALSE; + gSprites[eRoulette->var3C[0x30]].pos1.x = (gUnknown_083F8C00[r0].var03 + 0x2) * 0x8; + gSprites[eRoulette->var3C[0x30]].pos1.y = (gUnknown_083F8C00[r0].var04 + 0x2) * 0x8; + } +} + +void sub_8117DF4(void) +{ + u8 i, j; + u16 k; + struct SpriteSheet s; + LZ77UnCompWram(gUnknown_083F9EE8.data, gSharedMem); + s.data = gSharedMem; + s.size = gUnknown_083F9EE8.size; + s.tag = gUnknown_083F9EE8.tag; + LoadSpriteSheet(&s); + k = 0xF; + for (i = 0x0; i < 0x3; i++) + { + for (j = 0x0; j < 0x4; j++) + { + u8 spriteid; + spriteid = + eRoulette->var3C[0x7 + i * 0x4 + j] = sub_8117890(&gSpriteTemplate_83FA0DC[i * 0x4 + j], 0x28, &k); + gSprites[spriteid].animPaused = TRUE; + gSprites[spriteid].affineAnimPaused = TRUE; + } + } +} + +#ifdef NONMATCHING +void sub_8117E98(struct Sprite *sprite) +{ + struct OamMatrix *m; + u8 p; + u16 angle; + s16 cos, sin, z; + u32 cos32; + angle = eRoulette->var24 + sprite->data[0x0]; + z = angle; + if (z > 359) + angle = z - 360; + sin = Sin2(angle); + cos = Cos2(angle); + sprite->pos2.x = sin * sprite->data[0x1] >> 0xC; + sprite->pos2.y = -cos * sprite->data[0x1] >> 0xC; + p = sprite->oam.matrixNum; + sin = sin / 0x10; + m = &gOamMatrices[p]; + cos32 = cos / 0x10; + + m->d = cos32; + m->a = cos32; + m->b = sin; + m->c = -sin; +} +#else +__attribute__((naked)) +void sub_8117E98(struct Sprite *r0) +{ +asm(".syntax unified\n\ +push {r4-r6,lr}\n\ +adds r6, r0, 0\n\ +ldr r0, _08117F1C @ =0x02019000\n\ +ldrh r1, [r6, 0x2E]\n\ +ldrh r0, [r0, 0x24]\n\ +adds r1, r0\n\ +lsls r1, 16\n\ +lsrs r4, r1, 16\n\ +asrs r1, 16\n\ +ldr r0, _08117F20 @ =0x00000167\n\ +cmp r1, r0\n\ +ble _08117EB8\n\ +ldr r2, _08117F24 @ =0xfffffe98\n\ +adds r0, r1, r2\n\ +lsls r0, 16\n\ +lsrs r4, r0, 16\n\ +_08117EB8:\n\ +adds r0, r4, 0\n\ +bl Sin2\n\ +lsls r0, 16\n\ +lsrs r5, r0, 16\n\ +adds r0, r4, 0\n\ +bl Cos2\n\ +lsls r2, r5, 16\n\ +asrs r2, 16\n\ +movs r3, 0x30\n\ +ldrsh r1, [r6, r3]\n\ +muls r1, r2\n\ +asrs r1, 12\n\ +strh r1, [r6, 0x24]\n\ +lsls r0, 16\n\ +asrs r4, r0, 16\n\ +negs r1, r4\n\ +movs r3, 0x30\n\ +ldrsh r0, [r6, r3]\n\ +muls r0, r1\n\ +asrs r0, 12\n\ +strh r0, [r6, 0x26]\n\ +ldrb r0, [r6, 0x3]\n\ +lsls r0, 26\n\ +lsrs r3, r0, 27\n\ +cmp r2, 0\n\ +bge _08117EF2\n\ +adds r2, 0xF\n\ +_08117EF2:\n\ +lsls r0, r2, 12\n\ +lsrs r5, r0, 16\n\ +ldr r1, _08117F28 @ =gOamMatrices\n\ +lsls r0, r3, 3\n\ +adds r1, r0, r1\n\ +adds r0, r4, 0\n\ +cmp r0, 0\n\ +bge _08117F04\n\ +adds r0, 0xF\n\ +_08117F04:\n\ +asrs r0, 4\n\ +strh r0, [r1, 0x6]\n\ +strh r0, [r1]\n\ +strh r5, [r1, 0x2]\n\ +lsls r0, r5, 16\n\ +asrs r0, 16\n\ +negs r0, r0\n\ +strh r0, [r1, 0x4]\n\ +pop {r4-r6}\n\ +pop {r0}\n\ +bx r0\n\ +.align 2, 0\n\ +_08117F1C: .4byte 0x02019000\n\ +_08117F20: .4byte 0x00000167\n\ +_08117F24: .4byte 0xfffffe98\n\ +_08117F28: .4byte gOamMatrices\n\ +.syntax divided\n"); +} +#endif + +void sub_8117F2C(void) +{ + u8 i; + for (i = 0x0; i < 0x5; i++) + { + struct SpriteSheet s; + LZ77UnCompWram(gUnknown_083FA21C[i].data, gSharedMem); + s.data = gSharedMem; + s.size = gUnknown_083FA21C[i].size; + s.tag = gUnknown_083FA21C[i].tag; + LoadSpriteSheet(&s); + } + eRoulette->var3C[0x14] = CreateSprite(&gSpriteTemplate_83FA2B0, 0xD0, 0x10, 0x4); + gSprites[eRoulette->var3C[0x14]].animPaused = TRUE; + for (i = 0x0; i < 0x4; i++) + { + eRoulette->var3C[0x15 + i] = CreateSprite(&gSpriteTemplate_83FA2C8, (s16)(i * 0x8 + 0xC4), 0x18, 0x0); + gSprites[eRoulette->var3C[0x15 + i]].invisible = TRUE; + gSprites[eRoulette->var3C[0x15 + i]].animPaused = TRUE; + } + eRoulette->var3C[0x19] = CreateSprite(&gSpriteTemplate_83FA2E0, 0x78, 0x44, 0x4); + gSprites[eRoulette->var3C[0x19]].animPaused = TRUE; + for (i = 0x0; i < 0x3; i++) + { + eRoulette->var3C[0x1A + i] = CreateSprite(&gSpriteTemplate_83FA2F8, (s16)(i * 0x10 + 0xC0), 0x24, 0x4); + gSprites[eRoulette->var3C[0x1A + i]].invisible = TRUE; + gSprites[eRoulette->var3C[0x1A + i]].animPaused = TRUE; + } + eRoulette->var3C[0x30] = CreateSprite(&gSpriteTemplate_83FA310, 0x98, 0x60, 0x9); + gSprites[eRoulette->var3C[0x30]].oam.priority = 0x1; + gSprites[eRoulette->var3C[0x30]].animPaused = TRUE; + gSprites[eRoulette->var3C[0x30]].invisible = TRUE; +} + +void sub_81180F4(u16 r0) +{ + u8 i; + u16 d = 1000; + bool8 v = FALSE; + for (i = 0x0; i < 0x4; i++) + { + u8 t = r0 / d; + gSprites[eRoulette->var3C[0x15 + i]].invisible = TRUE; + if (t > 0x0 || v || i == 0x3) + { + gSprites[eRoulette->var3C[0x15 + i]].invisible = FALSE; + gSprites[eRoulette->var3C[0x15 + i]].oam.tileNum = + gSprites[eRoulette->var3C[0x15 + i]].sheetTileStart + + (*gSprites[eRoulette->var3C[0x15 + i]].anims + t)->type; + v = TRUE; + } + r0 = r0 % d; + d = d / 10; + } +} + +#ifdef NONMATCHING +u8 sub_81181E8(u8 r0) +{ + u8 t[0x5]; + memcpy(&t, &gUnknown_083FA608, 0x5); + if (r0 > 0x13) + r0 = 0x0; + switch(gUnknown_083F8C00[r0].var01_0) + { + case 0x3: + r0 = r0 / 0x5 - 0x1; + if ((u32)eRoulette->var16[r0] < 0x4) + return t[0x1 + eRoulette->var16[r0]]; // couldn't recreate redundant loads + break; + case 0x4: + r0 = r0 - 0x1; + if (eRoulette->var12[r0] < 0x3) + return t[0x2 + eRoulette->var12[r0]]; + break; + case 0xC: + if (!(eRoulette->var08 & gUnknown_083F8C00[r0].var08)) + return t[0x4]; + break; + } + return 0x0; +} +#else +__attribute__((naked)) +u8 sub_81181E8(u8 r0) +{ +asm(".syntax unified\n\ +push {r4,lr}\n\ +sub sp, 0x8\n\ +lsls r0, 24\n\ +lsrs r4, r0, 24\n\ +ldr r1, _08118220 @ =gUnknown_083FA608\n\ +mov r0, sp\n\ +movs r2, 0x5\n\ +bl memcpy\n\ +cmp r4, 0x13\n\ +bls _08118200\n\ +movs r4, 0\n\ +_08118200:\n\ +ldr r3, _08118224 @ =gUnknown_083F8C00\n\ +lsls r0, r4, 2\n\ +adds r0, r4\n\ +lsls r2, r0, 2\n\ +adds r0, r2, r3\n\ +ldrb r0, [r0, 0x1]\n\ +lsls r0, 28\n\ +lsrs r0, 28\n\ +cmp r0, 0x4\n\ +beq _08118254\n\ +cmp r0, 0x4\n\ +bgt _08118228\n\ +cmp r0, 0x3\n\ +beq _0811822E\n\ +b _08118290\n\ +.align 2, 0\n\ +_08118220: .4byte gUnknown_083FA608\n\ +_08118224: .4byte gUnknown_083F8C00\n\ +_08118228:\n\ +cmp r0, 0xC\n\ +beq _08118274\n\ +b _08118290\n\ +_0811822E:\n\ +adds r0, r4, 0\n\ +movs r1, 0x5\n\ +bl __udivsi3\n\ +subs r0, 0x1\n\ +lsls r0, 24\n\ +lsrs r4, r0, 24\n\ +ldr r0, _08118250 @ =0x02019000\n\ +adds r0, 0x16\n\ +adds r1, r4, r0\n\ +ldrb r0, [r1]\n\ +cmp r0, 0x3\n\ +bhi _08118290\n\ +ldrb r0, [r1]\n\ +adds r0, 0x1\n\ +b _0811826A\n\ +.align 2, 0\n\ +_08118250: .4byte 0x02019000\n\ +_08118254:\n\ +subs r0, r4, 0x1\n\ +lsls r0, 24\n\ +lsrs r4, r0, 24\n\ +ldr r0, _08118270 @ =0x02019000\n\ +adds r0, 0x12\n\ +adds r1, r4, r0\n\ +ldrb r0, [r1]\n\ +cmp r0, 0x2\n\ +bhi _08118290\n\ +ldrb r0, [r1]\n\ +adds r0, 0x2\n\ +_0811826A:\n\ +add r0, sp\n\ +ldrb r0, [r0]\n\ +b _08118292\n\ +.align 2, 0\n\ +_08118270: .4byte 0x02019000\n\ +_08118274:\n\ +ldr r1, _0811828C @ =0x02019000\n\ +adds r0, r3, 0\n\ +adds r0, 0x8\n\ +adds r0, r2, r0\n\ +ldr r1, [r1, 0x8]\n\ +ldr r0, [r0]\n\ +ands r1, r0\n\ +cmp r1, 0\n\ +bne _08118290\n\ +mov r0, sp\n\ +ldrb r0, [r0, 0x4]\n\ +b _08118292\n\ +.align 2, 0\n\ +_0811828C: .4byte 0x02019000\n\ +_08118290:\n\ +movs r0, 0\n\ +_08118292:\n\ +add sp, 0x8\n\ +pop {r4}\n\ +pop {r1}\n\ +bx r1\n\ +.syntax divided\n"); +} +#endif + +void sub_811829C(u8 r0) +{ + struct Sprite *s = &gSprites[eRoulette->var3C[0x19]]; + s->animCmdIndex = sub_81181E8(r0); + s->oam.tileNum = + s->sheetTileStart + + (*s->anims + s->animCmdIndex)->type; +} + +void sub_81182F8(u8 r0) +{ + u8 i; + u8 t = 0x0; + if (eRoulette->var19 == 0x1) + t = 0x2; + switch(r0) + { + case 0x6: + for (i = 0x0; i < 0x3; i++) + { + gSprites[eRoulette->var3C[0x1A + i]].invisible = FALSE; + gSprites[eRoulette->var3C[0x1A + i]].oam.tileNum = + gSprites[eRoulette->var3C[0x1A + i]].sheetTileStart + + (*gSprites[eRoulette->var3C[0x1A + i]].anims)->type; + } + break; + case 0x5: + gSprites[eRoulette->var3C[0x1C]].oam.tileNum = + gSprites[eRoulette->var3C[0x1C]].sheetTileStart + + (*gSprites[eRoulette->var3C[0x1C]].anims + t + 0x1)->type; + break; + case 0x4: + gSprites[eRoulette->var3C[0x1C]].oam.tileNum = + gSprites[eRoulette->var3C[0x1C]].sheetTileStart + + (*gSprites[eRoulette->var3C[0x1C]].anims + t + 0x2)->type; + break; + case 0x3: + gSprites[eRoulette->var3C[0x1B]].oam.tileNum = + gSprites[eRoulette->var3C[0x1B]].sheetTileStart + + (*gSprites[eRoulette->var3C[0x1B]].anims + t + 0x1)->type; + break; + case 0x2: + gSprites[eRoulette->var3C[0x1B]].oam.tileNum = + gSprites[eRoulette->var3C[0x1B]].sheetTileStart + + (*gSprites[eRoulette->var3C[0x1B]].anims + t + 0x2)->type; + break; + case 0x1: + gSprites[eRoulette->var3C[0x1A]].oam.tileNum = + gSprites[eRoulette->var3C[0x1A]].sheetTileStart + + (*gSprites[eRoulette->var3C[0x1A]].anims + t + 0x1)->type; + break; + case 0x0: + default: + for (i = 0x0; i < 0x3; i++) + { + gSprites[eRoulette->var3C[0x1A + i]].oam.tileNum = + gSprites[eRoulette->var3C[0x1A + i]].sheetTileStart + + (*gSprites[eRoulette->var3C[0x1A + i]].anims + t + 2)->type; + } + } +} + +void sub_81184CC(struct Sprite *sprite) +{ + sprite->pos2.x = eRoulette->var26; +} + +void sub_81184D8(void) +{ + u8 spriteid; + struct SpriteSheet s; + LZ77UnCompWram(gUnknown_083FA42C.data, gSharedMem); + s.data = gSharedMem; + s.size = gUnknown_083FA42C.size; + s.tag = gUnknown_083FA42C.tag; + LoadSpriteSheet(&s); + spriteid = CreateSprite(&gSpriteTemplate_83FA434, 0x74, 0x50, 0x51); + gSprites[spriteid].data[0] = eRoulette->var24; + gSprites[spriteid].data[1] = 0x0; + gSprites[spriteid].animPaused = TRUE; + gSprites[spriteid].affineAnimPaused = TRUE; + gSprites[spriteid].coordOffsetEnabled = TRUE; +} + +void sub_8118554(struct Sprite *sprite) +{ + u32 t = sprite->oam.matrixNum; + struct OamMatrix *m = &gOamMatrices[0]; + m[t].d = eRoulette->var2C.a; + m[t].a = eRoulette->var2C.a; + m[t].b = eRoulette->var2C.b; + m[t].c = eRoulette->var2C.c; +} + +void sub_811857C(void) +{ + u8 i; + for (i = 0x0; i < 0x6; i++) + { + u8 spriteid = + eRoulette->var3C[i] = CreateSprite(&gSpriteTemplate_83FA40C, 0x74, 0x50, 0x39 - i); + if (spriteid != 0x40) + { + gSprites[eRoulette->var3C[i]].invisible = TRUE; + gSprites[eRoulette->var3C[i]].coordOffsetEnabled = TRUE; + } + } +} + +void sub_81185E8(void) +{ + u8 t = eRoulette->var3C[0x0]; + u8 i; + for (i = 0x0; i < 0x6; i++) + { + u8 j; + gSprites[t].invisible = TRUE; + gSprites[t].callback = &SpriteCallbackDummy; + StartSpriteAnim(&gSprites[t], 0x0); + for (j = 0x0; j < 0x8; j++) + gSprites[t].data[j] = 0x0; + t++; + } +} + +s16 sub_811866C(struct Sprite *sprite) +{ + if (eRoulette->var24 > sprite->data[0x3]) + { + sprite->data[0x6] = 360 - eRoulette->var24 + sprite->data[0x3]; + if (sprite->data[0x6] > 359) + sprite->data[0x6] -=360; + } + else + sprite->data[0x6] = sprite->data[0x3] - eRoulette->var24; + return sprite->data[0x6]; +} + +u8 sub_81186B8(struct Sprite *sprite) +{ + eRoulette->var7E = (u8)(((float)(s16)sub_811866C(sprite)) / 30.0f); + return eRoulette->var7E; +} + +s16 sub_81186E8(struct Sprite *sprite) +{ + s16 t = sub_811866C(sprite) % 30; + u16 z; + if (t == 0xE) + { + z = 0x0; + return sprite->data[0x2] = z; + } + else if (t > 0xD) + { + z = (u16)(0x2B - t); + return sprite->data[0x2] = z; + } + else + { + z = (u16)(0xE - t); + return sprite->data[0x2] = z; + } +} + +void sub_8118724(struct Sprite *sprite) +{ + s16 sin, cos; + eRoulette->var8C += eRoulette->var90; + eRoulette->var88 += eRoulette->var8C; + if (eRoulette->var88 >= 360) + eRoulette->var88 -= 360.0f; + else + if (eRoulette->var88 < 0.0f) + eRoulette->var88 += 360.0f; + sprite->data[0x3] = eRoulette->var88; + eRoulette->var98 += eRoulette->var9C; + eRoulette->var94 += eRoulette->var98; + sprite->data[0x4] = eRoulette->var94; + sin = Sin2(sprite->data[0x3]); + cos = Cos2(sprite->data[0x3]); + sprite->pos2.x = sin * sprite->data[0x4] >> 0xC; + sprite->pos2.y = -cos * sprite->data[0x4] >> 0xC; + if (IsSEPlaying()) + { + m4aMPlayPanpotControl(&gMPlay_SE1, 0xFFFF, sprite->pos2.x); + m4aMPlayPanpotControl(&gMPlay_SE2, 0xFFFF, sprite->pos2.x); + } +} + +void sub_8118834(struct Sprite *sprite) +{ + s16 sin, cos; + sprite->data[0x3] = eRoulette->var24 + sprite->data[0x6]; + if (sprite->data[0x3] > 359) + sprite->data[0x3] -= 360; + sin = Sin2(sprite->data[0x3]); + cos = Cos2(sprite->data[0x3]); + sprite->pos2.x = sin * sprite->data[0x4] >> 0xC; + sprite->pos2.y = -cos * sprite->data[0x4] >> 0xC; + sprite->pos2.y += gSpriteCoordOffsetY; +} + +void sub_811889C(struct Sprite *sprite) +{ + sub_8118724(sprite); + sprite->data[0x2]++; + if ((u16)(sprite->data[0x4] + 0x84) > 0xD4) + sprite->invisible = TRUE; + else + sprite->invisible = FALSE; + if (!(sprite->data[0x2] < 30)) + { + if (!sprite->data[0x0]) + { + if (eRoulette->var94 <= eRoulette->varA0 - 2.0f) + { + eRoulette->var7D = 0xFF; + eRoulette->var03_7 = 0x0; + StartSpriteAnim(sprite, sprite->animCmdIndex + 0x3); + sub_81186B8(sprite); + sprite->data[0x4] = 30; + sub_811866C(sprite); + sprite->data[0x6] = (sprite->data[0x6] / 30) * 30 + 0xF; + sprite->callback = &sub_8118834; + m4aSongNumStartOrChange(0x47); + eRoulette->var9C = eRoulette->var98 = 0.0f; + eRoulette->var8C = -1.0f; + } + } + else + { + if (eRoulette->var94 >= eRoulette->varA0 - 2.0f) + { + eRoulette->var7D = 0xFF; + eRoulette->var03_7 = 0x0; + StartSpriteAnim(sprite, sprite->animCmdIndex + 0x3); + sub_81186B8(sprite); + sprite->data[0x4] = 30; + sub_811866C(sprite); + sprite->data[0x6] = (sprite->data[0x6] / 30) * 30 + 0xF; + sprite->callback = &sub_8118834; + m4aSongNumStartOrChange(0x47); + eRoulette->var9C = eRoulette->var98 = 0.0f; + eRoulette->var8C = -1.0f; + } + } + } +} + +void sub_81189A8(struct Sprite *sprite) +{ + float f0, f1, f2; + struct StructgUnknown_083F8DF4 *p; + sub_8118724(sprite); + switch(sprite->data[0x3]) + { + case 0: + if (sprite->data[0x0] != 0x1) + { + f0 = ((float)sprite->data[0x7]); + p = &gUnknown_083F8DF4[0]; + f1 = (f0 * ((float)(s32)p[eRoulette->var04_0].var01) + (float)((s32)p[eRoulette->var04_0].var02 - 0x1)); + f2 = (f0 / ((float)(s32)p[eRoulette->var04_0].var0C)); + } + else + { + return; + } + break; + case 180: + if (sprite->data[0x0] != 0x0) + { + f0 = ((float)sprite->data[0x7]); + p = &gUnknown_083F8DF4[0]; + f1 = (f0 * ((float)(s32)p[eRoulette->var04_0].var01) + (float)((s32)p[eRoulette->var04_0].var02 - 0x1)); + f2 = -(f0 / ((float)(s32)p[eRoulette->var04_0].var0C)); + } + else + { + return; + } + break; + default: return; + } + eRoulette->varA0 = eRoulette->var94; + eRoulette->var98 = f2; + eRoulette->var9C = -((f2 + f2) / f1 + (2.0f / (f1 * f1))); + eRoulette->var8C = 0.0f; + sprite->animPaused = FALSE; + sprite->animNum = 0x0; + sprite->animBeginning = TRUE; + sprite->animEnded = FALSE; + sprite->callback = &sub_811889C; + sprite->data[0x2] = 0x0; +} + +void sub_8118B30(struct Sprite *sprite) +{ + sprite->pos2.y = (s32)(((float)sprite->data[0x2]) * 0.05f * ((float)sprite->data[0x2])) - 45; + sprite->data[0x2]++; + if (sprite->data[0x2] > 29 && sprite->pos2.y >= 0) + { + eRoulette->var7D = 0xFF; + eRoulette->var03_7 = FALSE; + StartSpriteAnim(sprite, sprite->animCmdIndex + 0x3); + sub_81186B8(sprite); + sprite->data[0x4] = 30; + sub_811866C(sprite); + sprite->data[0x6] = (sprite->data[0x6] / 30) * 30 + 0xF; + sprite->callback = &sub_8118834; + m4aSongNumStartOrChange(0x47); + eRoulette->var03_6 = TRUE; + } +} + +void sub_8118BD8(struct Sprite *sprite) +{ + if (sprite->data[0x2]++ < 45) + { + sprite->pos2.y--; + if(sprite->data[0x2] == 45) + { + if (gSprites[eRoulette->var3C[0x37]].animCmdIndex == 0x1) + sprite->pos2.y++; + } + } + else + { + if (sprite->data[0x2] < sprite->data[0x7]) + { + if (gSprites[eRoulette->var3C[0x37]].animDelayCounter == 0x0) + { + if (gSprites[eRoulette->var3C[0x37]].animCmdIndex == 0x1) + sprite->pos2.y++; + else + sprite->pos2.y--; + } + } + else + { + sprite->animPaused = FALSE; + sprite->animNum = 0x1; + sprite->animBeginning = TRUE; + sprite->animEnded = FALSE; + sprite->data[0x2] = 0x0; + sprite->callback = &sub_8118B30; + m4aSongNumStart(0x3D); + } + } +} + +void sub_8118CAC(struct Sprite *sprite) +{ + sub_8118724(sprite); + switch(sprite->data[0x3]) + { + case 90: + if (sprite->data[0x0] != 0x1) + { + sprite->callback = &sub_8118BD8; + sprite->data[0x2] = 0x0; + } + break; + case 270: + if (sprite->data[0x0] != 0x0) + { + sprite->callback = &sub_8118BD8; + sprite->data[0x2] = 0x0; + } + break; + } +} + +void sub_8118CEC(struct Sprite *sprite) +{ + sub_8118724(sprite); + switch(eRoulette->var03_0) + { + default: + case 0x0: + sub_8119224(sprite); + sprite->callback = &sub_81189A8; + break; + case 0x1: + sub_81193D4(sprite); + sprite->callback = &sub_8118CAC; + break; + } +} + +void sub_8118D2C(struct Sprite *sprite) +{ + sub_8118724(sprite); + if (sprite->data[0x2]-- == 0x10) + eRoulette->var98 *= -1.0f; + if (sprite->data[0x2] == 0x0) + { + if (!sprite->data[0x0]) + { + eRoulette->var7D = 0xFF; + eRoulette->var03_7 = 0x0; + StartSpriteAnim(sprite, sprite->animCmdIndex + 0x3); + sub_81186B8(sprite); + sprite->data[0x4] = 30; + sub_811866C(sprite); + sprite->data[0x6] = (sprite->data[0x6] / 30) * 30 + 15; + sprite->callback = &sub_8118834; + m4aSongNumStartOrChange(0x47); + } + else + { + sprite->animPaused = TRUE; + m4aSongNumStart(0x38); + sub_811952C(sprite); + } + } +} + +#if DEBUG +__attribute__((naked)) +void debug_sub_812E698() +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + add r7, r0, #0\n\ + bl sub_8118724\n\ + mov r0, #0x0\n\ + strh r0, [r7, #0x32]\n\ + add r0, r7, #0\n\ + bl sub_81186B8\n\ + mov r0, #0x38\n\ + bl m4aSongNumStart\n\ + bl Random\n\ + mov r1, #0x1\n\ + and r1, r1, r0\n\ + cmp r1, #0\n\ + beq ._837 @cond_branch\n\ + ldr r4, ._839 @ 0x2019000\n\ + add r1, r4, #0\n\ + add r1, r1, #0x8c\n\ + ldr r0, ._839 + 4 @ 0x0\n\ + str r0, [r1]\n\ + add r0, r4, #0\n\ + add r0, r0, #0x7e\n\ + ldrb r0, [r0]\n\ + add r0, r0, #0x1\n\ + mov r1, #0xc\n\ + bl __modsi3\n\ + add r1, r4, #0\n\ + add r1, r1, #0x7f\n\ + strb r0, [r1]\n\ + add r1, r4, #0\n\ + ldr r4, ._839 + 8 @ gUnknown_083F8DF4\n\ + b ._838\n\ +._840:\n\ + .align 2, 0\n\ +._839:\n\ + .word 0x2019000\n\ + .word 0x0\n\ + .word gUnknown_083F8DF4\n\ +._837:\n\ + ldr r6, ._841 @ 0x2019000\n\ + add r5, r6, #0\n\ + add r5, r5, #0x8c\n\ + ldr r4, ._841 + 4 @ gUnknown_083F8DF4\n\ + ldrb r0, [r6, #0x4]\n\ + lsl r0, r0, #0x1e\n\ + lsr r0, r0, #0x19\n\ + add r1, r4, #0\n\ + add r1, r1, #0x1c\n\ + add r0, r0, r1\n\ + ldr r1, [r0]\n\ + add r0, r1, #0\n\ + bl __addsf3\n\ + str r0, [r5]\n\ + add r0, r6, #0\n\ + add r0, r0, #0x7e\n\ + ldrb r0, [r0]\n\ + add r1, r6, #0\n\ + add r1, r1, #0x7f\n\ + strb r0, [r1]\n\ + add r1, r6, #0\n\ +._838:\n\ + mov r0, #0x1\n\ + strh r0, [r7, #0x2e]\n\ + ldrb r0, [r1, #0x4]\n\ + lsl r0, r0, #0x1e\n\ + lsr r0, r0, #0x19\n\ + add r0, r0, r4\n\ + ldrb r0, [r0, #0x2]\n\ + strh r0, [r7, #0x32]\n\ + add r1, r1, #0x98\n\ + ldr r0, ._841 + 8 @ 0x3dae147b\n\ + str r0, [r1]\n\ + ldr r0, ._841 + 12 @ sub_8118D2C\n\ + str r0, [r7, #0x1c]\n\ + mov r0, #0x5\n\ + strh r0, [r7, #0x30]\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._842:\n\ + .align 2, 0\n\ +._841:\n\ + .word 0x2019000\n\ + .word gUnknown_083F8DF4\n\ + .word 0x3dae147b\n\ + .word sub_8118D2C+1"); +} +#endif + +#ifdef NONMATCHING +void sub_8118DE4(struct Sprite *sprite) +{ + sub_8118724(sprite); + sprite->data[0x2] = 0x0; + sub_81186B8(sprite); + if (!(gUnknown_083F8D90[eRoulette->var7E].var04 & eRoulette->var08)) + { + eRoulette->var7D = 0xFF; + eRoulette->var03_7 = 0x0; + StartSpriteAnim(sprite, sprite->animCmdIndex + 0x3); + sub_81186B8(sprite); + sprite->data[0x4] = 30; + sub_811866C(sprite); + sprite->data[0x6] = (sprite->data[0x6] / 30) * 30 + 15; + sprite->callback = &sub_8118834; + m4aSongNumStartOrChange(0x47); + } + else + { + u8 t; + u32 z; + m4aSongNumStart(0x38); + if ((z = (Random() & 0x1))) + { + u32 o; + eRoulette->var8C = 0.0f; + o = (eRoulette->var7E + 0x1) % 0xC; + t = o; + eRoulette->var7F = o; + } + else + { + eRoulette->var8C = gUnknown_083F8DF4[eRoulette->var04_0].var1C * 2; // couldn't replicate loads + t = (eRoulette->var7E + 0xB) % 0xC; + eRoulette->var7F = eRoulette->var7E; + } + if (gUnknown_083F8D90[t].var04 & eRoulette->var08) + { + sprite->data[0x0] = 0x1; + sprite->data[0x2] = (&gUnknown_083F8DF4[eRoulette->var04_0])->var02; + } + else + { + sprite->data[0x0] = gUnknown_083F8D90[t].var04 & eRoulette->var08; + if (eRoulette->var04_0) + { + sprite->data[0x2] = (&gUnknown_083F8DF4[eRoulette->var04_0])->var01; + } + else + { + sprite->data[0x2] = (&gUnknown_083F8DF4[eRoulette->var04_0])->var02; + if (z) + { + eRoulette->var8C = 1.5f; + } + else + { + eRoulette->var8C = -1.5f; + } + } + } + eRoulette->var98 = 0.085f; + sprite->callback = &sub_8118D2C; + sprite->data[0x1] = 0x5; + } +} +#else +__attribute__((naked)) +void sub_8118DE4(struct Sprite *sprite) +{ +asm(".syntax unified\n\ +push {r4-r7,lr}\n\ +mov r7, r9\n\ +mov r6, r8\n\ +push {r6,r7}\n\ +adds r7, r0, 0\n\ +bl sub_8118724\n\ +movs r0, 0\n\ +strh r0, [r7, 0x32]\n\ +adds r0, r7, 0\n\ +bl sub_81186B8\n\ +ldr r1, _08118E70 @ =gUnknown_083F8D90\n\ +ldr r6, _08118E74 @ =gSharedMem + 0x19000\n\ +movs r0, 0x7E\n\ +adds r0, r6\n\ +mov r8, r0\n\ +ldrb r0, [r0]\n\ +lsls r0, 3\n\ +adds r1, 0x4\n\ +adds r0, r1\n\ +ldr r0, [r0]\n\ +ldr r1, [r6, 0x8]\n\ +ands r0, r1\n\ +cmp r0, 0\n\ +bne _08118E7C\n\ +adds r1, r6, 0\n\ +adds r1, 0x7D\n\ +movs r0, 0xFF\n\ +strb r0, [r1]\n\ +ldrb r1, [r6, 0x3]\n\ +movs r0, 0x7F\n\ +ands r0, r1\n\ +strb r0, [r6, 0x3]\n\ +adds r0, r7, 0\n\ +adds r0, 0x2B\n\ +ldrb r1, [r0]\n\ +adds r1, 0x3\n\ +lsls r1, 24\n\ +lsrs r1, 24\n\ +adds r0, r7, 0\n\ +bl StartSpriteAnim\n\ +adds r0, r7, 0\n\ +bl sub_81186B8\n\ +movs r0, 0x1E\n\ +strh r0, [r7, 0x36]\n\ +adds r0, r7, 0\n\ +bl sub_811866C\n\ +movs r1, 0x3A\n\ +ldrsh r0, [r7, r1]\n\ +movs r1, 0x1E\n\ +bl __divsi3\n\ +lsls r0, 16\n\ +asrs r0, 16\n\ +lsls r1, r0, 4\n\ +subs r1, r0\n\ +lsls r1, 1\n\ +adds r1, 0xF\n\ +strh r1, [r7, 0x3A]\n\ +ldr r0, _08118E78 @ =sub_8118834\n\ +str r0, [r7, 0x1C]\n\ +movs r0, 0x47\n\ +bl m4aSongNumStartOrChange\n\ +b _08118F74\n\ +.align 2, 0\n\ +_08118E70: .4byte gUnknown_083F8D90\n\ +_08118E74: .4byte gSharedMem + 0x19000\n\ +_08118E78: .4byte sub_8118834\n\ +_08118E7C:\n\ +movs r0, 0x38\n\ +bl m4aSongNumStart\n\ +bl Random\n\ +movs r2, 0x1\n\ +mov r9, r2\n\ +mov r1, r9\n\ +ands r1, r0\n\ +mov r9, r1\n\ +cmp r1, 0\n\ +beq _08118EC0\n\ +adds r1, r6, 0\n\ +adds r1, 0x8C\n\ +ldr r0, _08118EB8 @ =0x00000000\n\ +str r0, [r1]\n\ +mov r2, r8\n\ +ldrb r0, [r2]\n\ +adds r0, 0x1\n\ +movs r1, 0xC\n\ +bl __modsi3\n\ +lsls r1, r0, 24\n\ +lsrs r2, r1, 24\n\ +adds r1, r6, 0\n\ +adds r1, 0x7F\n\ +strb r0, [r1]\n\ +ldr r5, _08118EBC @ =gUnknown_083F8DF4\n\ +b _08118EF4\n\ +.align 2, 0\n\ +_08118EB8: .4byte 0x00000000\n\ +_08118EBC: .4byte gUnknown_083F8DF4\n\ +_08118EC0:\n\ +adds r4, r6, 0\n\ +adds r4, 0x8C\n\ +ldr r5, _08118F1C @ =gUnknown_083F8DF4\n\ +ldrb r0, [r6, 0x4]\n\ +lsls r0, 30\n\ +lsrs r0, 25\n\ +adds r1, r5, 0\n\ +adds r1, 0x1C\n\ +adds r0, r1\n\ +ldr r1, [r0]\n\ +adds r0, r1, 0\n\ +bl __addsf3\n\ +str r0, [r4]\n\ +mov r0, r8\n\ +ldrb r4, [r0]\n\ +adds r0, r4, 0\n\ +adds r0, 0xB\n\ +movs r1, 0xC\n\ +bl __modsi3\n\ +lsls r0, 24\n\ +lsrs r2, r0, 24\n\ +adds r0, r6, 0\n\ +adds r0, 0x7F\n\ +strb r4, [r0]\n\ +_08118EF4:\n\ +ldr r0, _08118F20 @ =gUnknown_083F8D90\n\ +lsls r1, r2, 3\n\ +adds r0, 0x4\n\ +adds r1, r0\n\ +ldr r2, _08118F24 @ =gSharedMem + 0x19000\n\ +ldr r1, [r1]\n\ +ldr r0, [r2, 0x8]\n\ +ands r1, r0\n\ +cmp r1, 0\n\ +beq _08118F28\n\ +movs r0, 0x1\n\ +strh r0, [r7, 0x2E]\n\ +ldrb r0, [r2, 0x4]\n\ +lsls r0, 30\n\ +lsrs r0, 25\n\ +adds r0, r5\n\ +ldrb r0, [r0, 0x2]\n\ +strh r0, [r7, 0x32]\n\ +b _08118F64\n\ +.align 2, 0\n\ +_08118F1C: .4byte gUnknown_083F8DF4\n\ +_08118F20: .4byte gUnknown_083F8D90\n\ +_08118F24: .4byte gSharedMem + 0x19000\n\ +_08118F28:\n\ +strh r1, [r7, 0x2E]\n\ +ldrb r1, [r2, 0x4]\n\ +movs r0, 0x3\n\ +ands r0, r1\n\ +cmp r0, 0\n\ +beq _08118F40\n\ +lsls r0, r1, 30\n\ +lsrs r0, 25\n\ +adds r0, r5\n\ +ldrb r0, [r0, 0x1]\n\ +strh r0, [r7, 0x32]\n\ +b _08118F64\n\ +_08118F40:\n\ +lsls r0, r1, 30\n\ +lsrs r0, 25\n\ +adds r0, r5\n\ +ldrb r0, [r0, 0x2]\n\ +strh r0, [r7, 0x32]\n\ +mov r1, r9\n\ +cmp r1, 0\n\ +beq _08118F5C\n\ +adds r1, r2, 0\n\ +adds r1, 0x8C\n\ +ldr r0, _08118F58 @ =0x3f000000\n\ +b _08118F62\n\ +.align 2, 0\n\ +_08118F58: .4byte 0x3f000000\n\ +_08118F5C:\n\ +adds r1, r2, 0\n\ +adds r1, 0x8C\n\ +ldr r0, _08118F80 @ =0xbfc00000\n\ +_08118F62:\n\ +str r0, [r1]\n\ +_08118F64:\n\ +adds r1, r2, 0\n\ +adds r1, 0x98\n\ +ldr r0, _08118F84 @ =0x3dae147b\n\ +str r0, [r1]\n\ +ldr r0, _08118F88 @ =sub_8118D2C\n\ +str r0, [r7, 0x1C]\n\ +movs r0, 0x5\n\ +strh r0, [r7, 0x30]\n\ +_08118F74:\n\ +pop {r3,r4}\n\ +mov r8, r3\n\ +mov r9, r4\n\ +pop {r4-r7}\n\ +pop {r0}\n\ +bx r0\n\ +.align 2, 0\n\ +_08118F80: .4byte 0xbfc00000\n\ +_08118F84: .4byte 0x3dae147b\n\ +_08118F88: .4byte sub_8118D2C\n\ +.syntax divided\n"); +} +#endif + +#if DEBUG +__attribute__((naked)) +void sub_8118F8C(struct Sprite *sprite) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + mov r7, r9\n\ + mov r6, r8\n\ + push {r6, r7}\n\ + add r6, r0, #0\n\ + bl sub_8118724\n\ + ldr r5, ._868 @ 0x2019000\n\ + mov r0, #0x8c\n\ + add r0, r0, r5\n\ + mov r8, r0\n\ + ldr r0, [r0]\n\ + ldr r1, ._868 + 4 @ 0x3f000000\n\ + bl __gtsf2\n\ + cmp r0, #0\n\ + bgt ._874 @cond_branch\n\ + add r0, r6, #0\n\ + bl sub_81186B8\n\ + add r0, r6, #0\n\ + bl sub_81186E8\n\ + lsl r0, r0, #0x10\n\ + cmp r0, #0\n\ + bne ._864 @cond_branch\n\ + add r1, r5, #0\n\ + add r1, r1, #0x90\n\ + ldr r0, ._868 + 8 @ 0x0\n\ + str r0, [r1]\n\ + ldr r1, ._868 + 12 @ gUnknown_083F8DF4\n\ + mov r9, r1\n\ + ldrb r0, [r5, #0x4]\n\ + lsl r7, r0, #0x1e\n\ + lsr r0, r7, #0x19\n\ + add r0, r0, r9\n\ + mov r4, #0x3\n\ + ldsb r4, [r0, r4]\n\ + add r0, r4, #0\n\ + bl __floatsisf\n\ + add r5, r0, #0\n\ + cmp r4, #0\n\ + bge ._865 @cond_branch\n\ + ldr r1, ._868 + 16 @ 0x43800000\n\ + bl __addsf3\n\ + add r5, r0, #0\n\ +._865:\n\ + lsr r0, r7, #0x19\n\ + add r0, r0, r9\n\ + ldrb r0, [r0, #0x4]\n\ + add r0, r0, #0x1\n\ + bl __floatsisf\n\ + add r1, r0, #0\n\ + add r0, r5, #0\n\ + bl __divsf3\n\ + add r1, r0, #0\n\ + mov r2, r8\n\ + ldr r0, [r2]\n\ + bl __subsf3\n\ + mov r1, r8\n\ + str r0, [r1]\n\ + mov r0, #0x4\n\ + strh r0, [r6, #0x30]\n\ + ldr r0, ._868 + 20 @ unk_2039560\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._866 @cond_branch\n\ + ldr r0, ._868 + 24 @ debug_sub_812E698\n\ + str r0, [r6, #0x1c]\n\ + b ._874\n\ +._869:\n\ + .align 2, 0\n\ +._868:\n\ + .word 0x2019000\n\ + .word 0x3f000000\n\ + .word 0x0\n\ + .word gUnknown_083F8DF4\n\ + .word 0x43800000\n\ + .word unk_2039560\n\ + .word debug_sub_812E698+1\n\ +._866:\n\ + ldr r0, ._871 @ sub_8118DE4\n\ + str r0, [r6, #0x1c]\n\ + b ._874\n\ +._872:\n\ + .align 2, 0\n\ +._871:\n\ + .word sub_8118DE4+1\n\ +._864:\n\ + add r6, r5, #0\n\ + add r6, r6, #0x90\n\ + ldr r0, [r6]\n\ + ldr r4, ._875 @ 0x0\n\ + add r1, r4, #0\n\ + bl __nesf2\n\ + cmp r0, #0\n\ + beq ._874 @cond_branch\n\ + mov r2, r8\n\ + ldr r0, [r2]\n\ + add r1, r4, #0\n\ + bl __ltsf2\n\ + cmp r0, #0\n\ + bge ._874 @cond_branch\n\ + str r4, [r6]\n\ + mov r0, r8\n\ + str r4, [r0]\n\ + add r4, r5, #0\n\ + add r4, r4, #0x98\n\ + ldr r0, [r4]\n\ + bl __extendsfdf2\n\ + ldr r2, ._875 + 4 @ 0x3ff33333\n\ + ldr r3, ._875 + 8 @ 0x33333333\n\ + bl __divdf3\n\ + bl __truncdfsf2\n\ + str r0, [r4]\n\ +._874:\n\ + pop {r3, r4}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._876:\n\ + .align 2, 0\n\ +._875:\n\ + .word 0x0\n\ + .word 0x3ff33333\n\ + .word 0x33333333"); +} +#else +void sub_8118F8C(struct Sprite *sprite) +{ + sub_8118724(sprite); + if (!(eRoulette->var8C > 0.5f)) + { + sub_81186B8(sprite); + if (sub_81186E8(sprite) == 0x0) + { + struct StructgUnknown_083F8DF4 *p; + eRoulette->var90 = 0.0f; + p = &gUnknown_083F8DF4[0]; + eRoulette->var8C -= ((float)p[eRoulette->var04_0].var03) + / ((float)(s16)((&p[eRoulette->var04_0])->var04 + 0x1)); + sprite->data[0x1] = 0x4; + sprite->callback = &sub_8118DE4; + } + else + { + if (eRoulette->var90 != 0.0f) + { + if (eRoulette->var8C < 0.0f) + { + eRoulette->var90 = 0.0f; + eRoulette->var8C = 0.0f; + eRoulette->var98 /= 1.2; + } + } + } + } +} +#endif + +void sub_8119088(struct Sprite *sprite) +{ + sub_8118724(sprite); + if (!(eRoulette->var94 > 40.f)) + { + eRoulette->var98 = - ( 4.0f / (float)(u16)eRoulette->var86); + eRoulette->var90 = - (eRoulette->var8C / (float)(u16)eRoulette->var86); + sprite->animNum = 0x2; + sprite->animBeginning = TRUE; + sprite->animEnded = FALSE; + sprite->data[0x1] = 0x3; + sprite->callback = &sub_8118F8C; + } +} + +void sub_8119134(struct Sprite *sprite) +{ + sub_8118724(sprite); + if (!(eRoulette->var94 > 60.0f)) + { + m4aSongNumStartOrChange(0x5D); + eRoulette->var98 = - ( 20.0f / (float)(u16)eRoulette->var84); + eRoulette->var90 = ((1.0f - eRoulette->var8C) / (float)(u16)eRoulette->var84); + sprite->animNum = 0x1; + sprite->animBeginning = TRUE; + sprite->animEnded = FALSE; + sprite->data[0x1] = 0x2; + sprite->callback = &sub_8119088; + } +} + +void sub_81191F4(struct Sprite *sprite) +{ + sprite->data[0x1] = 0x1; + sprite->data[0x2] = 0x0; + sub_8118724(sprite); + sprite->invisible = FALSE; + sprite->callback = &sub_8119134; +} + +void sub_8119224(struct Sprite *sprite) +{ + u16 t; + u8 i; + s16 s[0x2][0x2]; + struct Roulette *p; + memcpy(s, &gUnknown_083FA60E, 0x8); + t = sprite->data[0x7] - 0x2; + p = eRoulette; + p->var3C[0x37] = CreateSprite(&gSpriteTemplate_83FA50C, 0x24, -0xC, 0x32); + p->var3C[0x38] = CreateSprite(&gSpriteTemplate_83FA5C0[0x0], s[sprite->data[0x0]][0x0], s[sprite->data[0x0]][0x1], 0x3B); + p->var3C[0x39] = CreateSprite(&gSpriteTemplate_83FA5C0[0x1], 0x24, 0x8C, 0x33); + gSprites[eRoulette->var3C[0x39]].oam.objMode = 0x1; + for (i = 0x0; i < 0x3; i++) + { + gSprites[eRoulette->var3C[0x37 + i]].coordOffsetEnabled = FALSE; + gSprites[eRoulette->var3C[0x37 + i]].invisible = TRUE; + gSprites[eRoulette->var3C[0x37 + i]].animPaused = TRUE; + gSprites[eRoulette->var3C[0x37 + i]].affineAnimPaused = TRUE; + gSprites[eRoulette->var3C[0x37 + i]].data[0x4] = eRoulette->var3C[0x37]; + gSprites[eRoulette->var3C[0x37 + i]].data[0x5] = eRoulette->var3C[0x38]; + gSprites[eRoulette->var3C[0x37 + i]].data[0x6] = eRoulette->var3C[0x39]; + gSprites[eRoulette->var3C[0x37 + i]].data[0x2] = t; + gSprites[eRoulette->var3C[0x37 + i]].data[0x3] = (sprite->data[0x7] * (&gUnknown_083F8DF4[eRoulette->var04_0])->var01) + + ((&gUnknown_083F8DF4[eRoulette->var04_0])->var02 + 0xFFFF); + } + gSprites[eRoulette->var3C[0x38]].coordOffsetEnabled = TRUE; + eRoulette->var38 = sprite; +} + +void sub_81193D4(struct Sprite *sprite) +{ + u8 i = 0; + s16 t; + s16 s[0x2][0x2]; + struct StructgUnknown_083F8DF4 *p; + memcpy(s, &gUnknown_083FA616, 0x8); + t = sprite->data[0x7] - 0x2; + eRoulette->var3C[0x37] = CreateSprite(&gSpriteTemplate_83FA524, s[sprite->data[0x0]][0x0], s[sprite->data[0x0]][0x1], 0x32); + StartSpriteAnim(&gSprites[eRoulette->var3C[0x37]], sprite->data[0x0]); + eRoulette->var3C[0x38] = CreateSprite(&gSpriteTemplate_83FA5F0, s[sprite->data[0x0]][0x0], s[sprite->data[0x0]][0x1], 0x33); + gSprites[eRoulette->var3C[0x38]].affineAnimPaused = TRUE; + gSprites[eRoulette->var3C[0x38]].animPaused = TRUE; + sprite->data[0x7] = (t * (p = &gUnknown_083F8DF4[0])[eRoulette->var04_0].var01) + (p[eRoulette->var04_0].var10 + 0x2D); + for (; i < 0x2; i++) + { + gSprites[eRoulette->var3C[0x37 + i]].data[0x4] = eRoulette->var3C[0x37]; + gSprites[eRoulette->var3C[0x37 + i]].data[0x5] = eRoulette->var3C[0x38]; + gSprites[eRoulette->var3C[0x37 + i]].data[0x6] = eRoulette->var3C[0x38]; + gSprites[eRoulette->var3C[0x37 + i]].data[0x2] = t; + gSprites[eRoulette->var3C[0x37 + i]].data[0x3] = sprite->data[0x7] - 0x2D; + } + eRoulette->var38 = sprite; +} + +#ifdef NONMATCHING +void sub_811952C(struct Sprite *sprite) +{ + u8 z; + register u8 h asm("r10") = 0x0; + u8 j = 0x5; + u32 p = 0x0; + u16 o; + u8 i; + u8 s[0xA] = (u8[]){0,0,0,0,0,0,0,0,0,0}; + u16 t = Random(); + eRoulette->var7D = 0x1; + eRoulette->var03_5 = TRUE; + eRoulette->var03_6 = FALSE; + eRoulette->var7E = 0xFF; + eRoulette->var88 = sprite->data[0x3]; + eRoulette->var98 = 0.0f; + eRoulette->var8C = (&gUnknown_083F8DF4[eRoulette->var04_0])->var1C; //couldn't replicate load, same as sub_8118DE4 + o = (eRoulette->var04_0 * 30 + 33) + (0x1 - eRoulette->var03_0) * 15; + for (i = 0x0; i < 0x4; i++) + { + if (o < sprite->data[0x3] && !(sprite->data[0x3] > o + 90)) + { + sprite->data[0x0] = i * 0x2; + eRoulette->var03_0 = 0x1 & i; + break; + } + if (i == 0x3) + { + sprite->data[0x0] = 0x1; + eRoulette->var03_0 = 0x1; + break; + } + o += 90; + } + if (eRoulette->var03_0) + { + if (sprite->data[0x0]) + { + PlayCry1(0x130, -0x3F); + } + else + { + PlayCry1(0x130, 0x3F); + } + } + else + { + PlayCry1(0x132, -0x3F); + } + i = 0x2; + z = (eRoulette->var7F + 0x2) % 0xC; + if (eRoulette->var03_0 == 0x1 && eRoulette->var04_0 == 0x1) + j += 0x6; + else + j += i; + for (; i < j; i++) + { + if (!(eRoulette->var08 & gUnknown_083F8D90[z].var04)) + { + s[h++] = i; + if (!p && (gUnknown_083F8D90[z].var04 & gUnknown_083F8C00[eRoulette->var1B[eRoulette->var1A_0]].var00)) + { + p = i; + } + } + z = (z + 0x1) % 0xC; + } + if ((eRoulette->var03_0 + 0x1) & eRoulette->var02) + { + if (p && (t & 0xFF) <= 0xBF) + { + sprite->data[0x7] = p; + } + else + { + sprite->data[0x7] = s[t % h]; + } + } + else + { + sprite->data[0x7] = s[t % h]; + } + sprite->callback = &sub_8118CEC; +} +#else +__attribute__((naked)) +void sub_811952C(struct Sprite *sprite) +{ +asm(".syntax unified\n\ +push {r4-r7,lr}\n\ +mov r7, r10\n\ +mov r6, r9\n\ +mov r5, r8\n\ +push {r5-r7}\n\ +sub sp, 0x14\n\ +mov r8, r0\n\ +movs r0, 0\n\ +mov r10, r0\n\ +movs r1, 0x5\n\ +mov r9, r1\n\ +movs r2, 0\n\ +str r2, [sp, 0xC]\n\ +mov r0, sp\n\ +movs r1, 0\n\ +movs r2, 0xA\n\ +bl memset\n\ +bl Random\n\ +lsls r0, 16\n\ +lsrs r0, 16\n\ +str r0, [sp, 0x10]\n\ +ldr r7, _08119610 @ =gSharedMem + 0x19000\n\ +adds r0, r7, 0\n\ +adds r0, 0x7D\n\ +movs r6, 0x1\n\ +strb r6, [r0]\n\ +ldrb r4, [r7, 0x3]\n\ +movs r0, 0x20\n\ +orrs r4, r0\n\ +movs r0, 0x41\n\ +negs r0, r0\n\ +ands r4, r0\n\ +strb r4, [r7, 0x3]\n\ +adds r1, r7, 0\n\ +adds r1, 0x7E\n\ +movs r0, 0xFF\n\ +strb r0, [r1]\n\ +adds r5, r7, 0\n\ +adds r5, 0x88\n\ +mov r3, r8\n\ +movs r1, 0x34\n\ +ldrsh r0, [r3, r1]\n\ +bl __floatsisf\n\ +str r0, [r5]\n\ +adds r1, r7, 0\n\ +adds r1, 0x98\n\ +ldr r0, _08119614 @ =0x00000000\n\ +str r0, [r1]\n\ +adds r3, r7, 0\n\ +adds r3, 0x8C\n\ +ldr r2, _08119618 @ =gUnknown_083F8DF4\n\ +ldrb r0, [r7, 0x4]\n\ +lsls r0, 30\n\ +lsrs r1, r0, 25\n\ +adds r2, 0x1C\n\ +adds r1, r2\n\ +ldr r1, [r1]\n\ +str r1, [r3]\n\ +lsrs r0, 30\n\ +lsls r1, r0, 4\n\ +subs r1, r0\n\ +lsls r1, 1\n\ +adds r1, 0x21\n\ +lsls r4, 27\n\ +lsrs r4, 27\n\ +subs r6, r4\n\ +lsls r0, r6, 4\n\ +subs r0, r6\n\ +adds r1, r0\n\ +lsls r1, 16\n\ +lsrs r1, 16\n\ +mov r5, r10\n\ +mov r3, r8\n\ +movs r0, 0x34\n\ +ldrsh r2, [r3, r0]\n\ +_081195C8:\n\ +cmp r1, r2\n\ +bge _081195D4\n\ +adds r0, r1, 0\n\ +adds r0, 0x5A\n\ +cmp r2, r0\n\ +ble _08119638\n\ +_081195D4:\n\ +cmp r5, 0x3\n\ +beq _0811961C\n\ +adds r0, r1, 0\n\ +adds r0, 0x5A\n\ +lsls r0, 16\n\ +lsrs r1, r0, 16\n\ +adds r0, r5, 0x1\n\ +lsls r0, 24\n\ +lsrs r5, r0, 24\n\ +cmp r5, 0x3\n\ +bls _081195C8\n\ +_081195EA:\n\ +ldr r0, _08119610 @ =gSharedMem + 0x19000\n\ +ldrb r1, [r0, 0x3]\n\ +movs r0, 0x1F\n\ +ands r0, r1\n\ +cmp r0, 0\n\ +beq _08119664\n\ +mov r1, r8\n\ +movs r2, 0x2E\n\ +ldrsh r0, [r1, r2]\n\ +cmp r0, 0\n\ +beq _08119658\n\ +movs r0, 0x98\n\ +lsls r0, 1\n\ +movs r1, 0x3F\n\ +negs r1, r1\n\ +bl PlayCry1\n\ +b _08119670\n\ +.align 2, 0\n\ +_08119610: .4byte gSharedMem + 0x19000\n\ +_08119614: .4byte 0x00000000\n\ +_08119618: .4byte gUnknown_083F8DF4\n\ +_0811961C:\n\ +movs r0, 0x1\n\ +mov r3, r8\n\ +strh r0, [r3, 0x2E]\n\ +ldr r2, _08119634 @ =gSharedMem + 0x19000\n\ +ldrb r1, [r2, 0x3]\n\ +subs r0, 0x21\n\ +ands r0, r1\n\ +movs r1, 0x1\n\ +orrs r0, r1\n\ +strb r0, [r2, 0x3]\n\ +b _081195EA\n\ +.align 2, 0\n\ +_08119634: .4byte gSharedMem + 0x19000\n\ +_08119638:\n\ +lsrs r0, r5, 1\n\ +mov r1, r8\n\ +strh r0, [r1, 0x2E]\n\ +ldr r3, _08119654 @ =gSharedMem + 0x19000\n\ +movs r1, 0x1\n\ +ands r1, r5\n\ +ldrb r2, [r3, 0x3]\n\ +movs r0, 0x20\n\ +negs r0, r0\n\ +ands r0, r2\n\ +orrs r0, r1\n\ +strb r0, [r3, 0x3]\n\ +b _081195EA\n\ +.align 2, 0\n\ +_08119654: .4byte gSharedMem + 0x19000\n\ +_08119658:\n\ +movs r0, 0x98\n\ +lsls r0, 1\n\ +movs r1, 0x3F\n\ +bl PlayCry1\n\ +b _08119670\n\ +_08119664:\n\ +movs r0, 0x99\n\ +lsls r0, 1\n\ +movs r1, 0x3F\n\ +negs r1, r1\n\ +bl PlayCry1\n\ +_08119670:\n\ +movs r5, 0x2\n\ +ldr r4, _081196A0 @ =gSharedMem + 0x19000\n\ +adds r0, r4, 0\n\ +adds r0, 0x7F\n\ +ldrb r0, [r0]\n\ +adds r0, 0x2\n\ +movs r1, 0xC\n\ +bl __modsi3\n\ +lsls r0, 24\n\ +lsrs r3, r0, 24\n\ +ldrb r1, [r4, 0x3]\n\ +movs r0, 0x1F\n\ +ands r0, r1\n\ +cmp r0, 0x1\n\ +bne _081196A4\n\ +ldrb r1, [r4, 0x4]\n\ +movs r0, 0x3\n\ +ands r0, r1\n\ +cmp r0, 0x1\n\ +bne _081196A4\n\ +mov r0, r9\n\ +adds r0, 0x6\n\ +b _081196A8\n\ +.align 2, 0\n\ +_081196A0: .4byte gSharedMem + 0x19000\n\ +_081196A4:\n\ +mov r2, r9\n\ +adds r0, r2, r5\n\ +_081196A8:\n\ +lsls r0, 24\n\ +lsrs r0, 24\n\ +mov r9, r0\n\ +cmp r5, r9\n\ +bcs _0811970E\n\ +ldr r6, _08119734 @ =gSharedMem + 0x19000\n\ +ldr r7, _08119738 @ =gUnknown_083F8C00 + 0xC\n\ +_081196B6:\n\ +lsls r0, r3, 3\n\ +ldr r1, _0811973C @ =gUnknown_083F8D90 + 0x4\n\ +adds r0, r1\n\ +ldr r1, [r6, 0x8]\n\ +ldr r2, [r0]\n\ +ands r1, r2\n\ +cmp r1, 0\n\ +bne _081196F8\n\ +mov r0, r10\n\ +adds r1, r0, 0x1\n\ +lsls r1, 24\n\ +lsrs r1, 24\n\ +mov r10, r1\n\ +add r0, sp\n\ +strb r5, [r0]\n\ +ldr r0, [sp, 0xC]\n\ +cmp r0, 0\n\ +bne _081196F8\n\ +ldrb r0, [r6, 0x1A]\n\ +lsls r0, 28\n\ +lsrs r0, 28\n\ +ldr r1, _08119740 @ =gSharedMem + 0x1901B\n\ +adds r0, r1\n\ +ldrb r1, [r0]\n\ +lsls r0, r1, 2\n\ +adds r0, r1\n\ +lsls r0, 2\n\ +adds r0, r7\n\ +ldr r0, [r0]\n\ +ands r2, r0\n\ +cmp r2, 0\n\ +beq _081196F8\n\ +str r5, [sp, 0xC]\n\ +_081196F8:\n\ +adds r0, r3, 0x1\n\ +movs r1, 0xC\n\ +bl __modsi3\n\ +lsls r0, 24\n\ +lsrs r3, r0, 24\n\ +adds r0, r5, 0x1\n\ +lsls r0, 24\n\ +lsrs r5, r0, 24\n\ +cmp r5, r9\n\ +bcc _081196B6\n\ +_0811970E:\n\ +ldrb r0, [r4, 0x3]\n\ +lsls r0, 27\n\ +lsrs r0, 27\n\ +adds r0, 0x1\n\ +ldrb r1, [r4, 0x2]\n\ +ands r0, r1\n\ +cmp r0, 0\n\ +beq _08119756\n\ +ldr r2, [sp, 0xC]\n\ +cmp r2, 0\n\ +beq _08119744\n\ +movs r0, 0xFF\n\ +ldr r3, [sp, 0x10]\n\ +ands r0, r3\n\ +cmp r0, 0xBF\n\ +bhi _08119744\n\ +mov r0, r8\n\ +strh r2, [r0, 0x3C]\n\ +b _08119766\n\ +.align 2, 0\n\ +_08119734: .4byte gSharedMem + 0x19000\n\ +_08119738: .4byte gUnknown_083F8C00 + 0xC\n\ +_0811973C: .4byte gUnknown_083F8D90 + 0x4\n\ +_08119740: .4byte gSharedMem + 0x1901B\n\ +_08119744:\n\ +ldr r0, [sp, 0x10]\n\ +mov r1, r10\n\ +bl __modsi3\n\ +add r0, sp\n\ +ldrb r0, [r0]\n\ +mov r1, r8\n\ +strh r0, [r1, 0x3C]\n\ +b _08119766\n\ +_08119756:\n\ +ldr r0, [sp, 0x10]\n\ +mov r1, r10\n\ +bl __modsi3\n\ +add r0, sp\n\ +ldrb r0, [r0]\n\ +mov r2, r8\n\ +strh r0, [r2, 0x3C]\n\ +_08119766:\n\ +ldr r3, _0811977C @ =sub_8118CEC\n\ +mov r0, r8\n\ +str r3, [r0, 0x1C]\n\ +add sp, 0x14\n\ +pop {r3-r5}\n\ +mov r8, r3\n\ +mov r9, r4\n\ +mov r10, r5\n\ +pop {r4-r7}\n\ +pop {r0}\n\ +bx r0\n\ +.align 2, 0\n\ +_0811977C: .4byte sub_8118CEC\n\ +.syntax divided\n"); +} +#endif + +void sub_8119780(struct Sprite *sprite) +{ + if (!(sprite->data[0x1]++ < sprite->data[0x3])) + { + if ((sprite->pos1.x -= 0x2) < -0x10) + { + if (!eRoulette->var03_6) + { + eRoulette->var03_6 = TRUE; + } + DestroySprite(sprite); + eRoulette->var01 = 0x0; + eRoulette->var34 = gUnknown_083FA61E[0x0]; + } + } +} + +void sub_81197D8(struct Sprite *sprite) +{ + u16 t[0x3][0x4]; + s32 p, z; + memcpy(t, &gUnknown_083FA632, 0x18); + if (sprite->data[0x1]++ < sprite->data[0x3]) + { + if(sprite->data[0x1] & 0x1) + { + gSpriteCoordOffsetY = t[sprite->data[0x2] / 0x2][sprite->data[0x7]]; + p = z = sprite->data[0x7] + 0x1; + if (z < 0) + p += 0x3; + sprite->data[0x7] = z - ((p >> 2) * 4); + } + sprite->invisible ^= 0x1; + } + else + { + gSpriteCoordOffsetY = 0x0; + gSprites[eRoulette->var3C[0x37]].animPaused = FALSE; + DestroySprite(sprite); + } +} + +void sub_8119898(struct Sprite *sprite) +{ + float t; + sprite->data[0x1]++; + t = sprite->data[0x1]; + sprite->pos2.y = t * 0.039f * t; + eRoulette->var34 = gUnknown_083FA61E[(eRoulette->var01 - 0x1) / 2]; + if (eRoulette->var01 < 0x13) + eRoulette->var01++; + if (sprite->data[0x1] > 0x3C) + { + sprite->data[0x1] = 0x0; + sprite->callback = &sub_8119780; + gSprites[sprite->data[0x6]].callback = &sub_8119780; + gSprites[sprite->data[0x6]].data[0x1] = -0x2; + gSprites[sprite->data[0x5]].invisible = FALSE; + gSprites[sprite->data[0x5]].callback = &sub_81197D8; + m4aSongNumStart(0xD6); + } +} + +void sub_8119964(struct Sprite *sprite) +{ + if(sprite->data[0x7] == 0x0) + { + register u32 t asm("r2"); + u32 z ; + if (eRoulette->var38->data[0x0] == 0x0) + { + t = eRoulette->var38->data[0x3]; + z = gUnknown_083F8DF4[eRoulette->var04_0].var08; + } + else + { + t = eRoulette->var38->data[0x3]; + z = gUnknown_083F8DF4[eRoulette->var04_0].var08; + z += 0xB4; + } + if (t == z) + { + sprite->invisible = FALSE; + sprite->data[0x7]++; + m4aSongNumStart(0x2B); + eRoulette->var01 = 0x1; + eRoulette->var34 = gUnknown_083FA61E[0x0]; + } + } + else + { + u32 t, z; + eRoulette->var34 = gUnknown_083FA61E[(eRoulette->var01 - 0x1) / 2]; + if (eRoulette->var01 < 0x13) + eRoulette->var01++; + if (eRoulette->var38->data[0x0] == 0x0) + { + t = eRoulette->var38->data[0x3]; + z = gUnknown_083F8DF4[eRoulette->var04_0].var0A; + } + else + { + t = eRoulette->var38->data[0x3]; + z = gUnknown_083F8DF4[eRoulette->var04_0].var0A ; + z += 0xB4; + } + if (t == z) + { + gSprites[sprite->data[0x4]].callback = &sub_8119898; + gSprites[sprite->data[0x4]].invisible = FALSE; + sprite->callback = &SpriteCallbackDummy; + sprite->data[0x7] = 0x0; + } + } +} + +void sub_8119A90(struct Sprite *sprite) +{ + sprite->invisible ^= 0x1; +} + +void sub_8119AAC(struct Sprite *sprite) +{ + if (sprite->pos1.y > -0x10) + { + sprite->pos1.y--; + } + else + { + sprite->callback = &SpriteCallbackDummy; + sprite->invisible = TRUE; + sprite->animPaused = TRUE; + m4aSongNumStop(0x5E); + DestroySprite(sprite); + FreeOamMatrix(gSprites[eRoulette->var3C[0x38]].oam.matrixNum); + DestroySprite(&gSprites[eRoulette->var3C[0x38]]); + } +} + +void sub_8119B24(struct Sprite *sprite) +{ + if (!(sprite->data[0x1] < 0x0)) + { + sprite->data[0x1]--; + sprite->pos1.y--; + if (sprite->data[0x1] == 0x0 && sprite->animCmdIndex == 0x1) + sprite->pos2.y++; + } + else + { + if (!(sprite->data[0x3] < 0x0)) + { + sprite->data[0x3]--; + if (sprite->animDelayCounter == 0x0) + { + if (sprite->animCmdIndex == 0x1) + sprite->pos2.y++; + else + sprite->pos2.y--; + } + } + else + { + m4aSongNumStart(0x2B); + StartSpriteAnim(sprite, eRoulette->var38->data[0x0] + 0x4); + sprite->callback = &sub_8119AAC; + gSprites[sprite->data[0x6]].affineAnimPaused = FALSE; + } + } +} + +void sub_8119BCC(struct Sprite *sprite) +{ + s8 t[0x2]; //sign + s8 z[0x8][0x2]; + memcpy(t, &gUnknown_083FA64A, 0x2); + memcpy(z, &gUnknown_083FA64C, 0x10); + if (sprite->data[0x1]-- > 0x7) + { + sprite->pos1.x += t[eRoulette->var38->data[0x0]] * 0x2; + if (IsSEPlaying()) + { + s8 u = -((0x74 - sprite->pos1.x) / 0x2); + m4aMPlayPanpotControl(&gMPlay_SE1, 0xFFFF,u); + m4aMPlayPanpotControl(&gMPlay_SE2, 0xFFFF, u); + } + } + else + { + if (!(sprite->data[0x1] < 0x0)) + { + sprite->pos1.x += t[eRoulette->var38->data[0x0]] * z[0x7 - sprite->data[0x1]][0x0]; + sprite->pos1.y += z[0x7 - sprite->data[0x1]][0x1]; + } + else + { + m4aSongNumStartOrChange(0x5E); + if(eRoulette->var38->data[0x0] == 0x0) + PlayCry1(0x130, 0x3F); + else + PlayCry1(0x130, -0x3F); + StartSpriteAnim(sprite, eRoulette->var38->data[0x0] + 0x2); + sprite->data[0x1] = 45; + sprite->callback = &sub_8119B24; + } + } +} + +void sub_8119D08(struct Sprite *sprite) +{ + s8 t[0x2]; //sign + memcpy(t, &gUnknown_083FA64A, 0x2); + if (!(sprite->data[0x1]-- < 0x0)) + { + sprite->pos1.x += t[eRoulette->var38->data[0x0]] * 0x2; + gSprites[sprite->data[0x6]].invisible ^= 0x1; + } + else + { + sprite->callback = &sub_8119A90; + } +} + +void sub_8119D80(struct Sprite *sprite) +{ + if (eRoulette->var38->data[0x0] == 0x0) + { + if (eRoulette->var38->data[0x3] == gUnknown_083F8DF4[eRoulette->var04_0].var12 + 90) + { + gSprites[sprite->data[0x6]].data[0x1] = 0x34; + gSprites[sprite->data[0x4]].data[0x1] = 0x34; + } + else + { + return; + } + } + else + { + if (eRoulette->var38->data[0x3] == gUnknown_083F8DF4[eRoulette->var04_0].var14 + 270) + { + gSprites[sprite->data[0x6]].data[0x1] = 0x2E; + gSprites[sprite->data[0x4]].data[0x1] = 0x2E; + } + else + { + return; + } + } + gSprites[sprite->data[0x6]].callback = &sub_8119D08; + gSprites[sprite->data[0x4]].callback = &sub_8119BCC; + m4aSongNumStart(0x2B); +} diff --git a/src/roulette_util.c b/src/roulette_util.c new file mode 100644 index 000000000..f3eae5518 --- /dev/null +++ b/src/roulette_util.c @@ -0,0 +1,242 @@ +#include "global.h" +#include "roulette_util.h" +#include "roulette.h" + +static u8 sub_81249E4(struct UnkStruct3 *); +static u8 sub_8124BEC(struct UnkStruct3 *); +u8 unref_sub_81249B0(struct UnkStruct0 *, u8); + +extern u16 gPlttBufferFaded[]; +extern u16 gPlttBufferUnfaded[]; + +void sub_8124918(struct UnkStruct0 *r0) +{ + r0->var00 = 0; + r0->var02 = 0; + memset(&r0->var04, 0, sizeof(r0->var04)); +} + +u8 sub_812492C(struct UnkStruct0 *r0, u8 r1, struct UnkStruct1 *r2) +{ + if (!(r1 < 16) || (r0->var04[r1].var00_7)) + return 0xFF; + + r0->var04[r1].var04.var00 = r2->var00; + r0->var04[r1].var04.var02 = r2->var02; + r0->var04[r1].var04.var04 = r2->var04; + r0->var04[r1].var04.var05 = r2->var05; + r0->var04[r1].var04.var06 = r2->var06; + r0->var04[r1].var04.var07_0 = r2->var07_0; + r0->var04[r1].var04.var07_5 = r2->var07_5; + r0->var04[r1].var04.var07_7 = r2->var07_7; + r0->var04[r1].var00_0 = 0; + r0->var04[r1].var00_7 = 1; + r0->var04[r1].var02 = 0; + r0->var04[r1].var01 = 0; + if (r0->var04[r1].var04.var07_7 < 0) + r0->var04[r1].var03 = 0xFF; + else + r0->var04[r1].var03 = 1; + return r1; +} + +u8 unref_sub_81249B0(struct UnkStruct0 *r0, u8 r1) +{ + if (r1 >= 16) + return 0xFF; + if (!r0->var04[r1].var00_7) + return 0xFF; + memset(&r0->var04[r1], 0, sizeof(r0->var04[r1])); + return r1; +} + +u8 sub_81249E4(struct UnkStruct3 *r0) +{ + u8 i; + u8 returnval; + + for (i = 0; i < r0->var04.var04; i++) + { + struct PlttData *faded = (struct PlttData *)&gPlttBufferFaded[r0->var04.var02 + i]; + struct PlttData *unfaded = (struct PlttData *)&gPlttBufferUnfaded[r0->var04.var02 + i]; + + switch (r0->var00_0) + { + case 1: + if (faded->r + r0->var03 >= 0 && faded->r + r0->var03 < 32) + faded->r += r0->var03; + if (faded->g + r0->var03 >= 0 && faded->g + r0->var03 < 32) + faded->g += r0->var03; + if (faded->b + r0->var03 >= 0 && faded->b + r0->var03 < 32) + faded->b += r0->var03; + break; + case 2: + if (r0->var03 < 0) + { + if (faded->r + r0->var03 >= unfaded->r) + faded->r += r0->var03; + if (faded->g + r0->var03 >= unfaded->g) + faded->g += r0->var03; + if (faded->b + r0->var03 >= unfaded->b) + faded->b += r0->var03; + } + else + { + if (faded->r + r0->var03 <= unfaded->r) + faded->r += r0->var03; + if (faded->g + r0->var03 <= unfaded->g) + faded->g += r0->var03; + if (faded->b + r0->var03 <= unfaded->b) + faded->b += r0->var03; + } + break; + } + } + if ((u32)r0->var02++ != r0->var04.var07_0) + { + returnval = 0; + } + else + { + r0->var02 = 0; + r0->var03 *= -1; + if (r0->var00_0 == 1) + r0->var00_0++; + else + r0->var00_0--; + returnval = 1; + } + return returnval; +} + +u8 sub_8124BEC(struct UnkStruct3 *r0) +{ + u8 rg2 = 0; + + switch (r0->var00_0) + { + case 1: + for (rg2 = 0; rg2 < r0->var04.var04; rg2++) + gPlttBufferFaded[r0->var04.var02 + rg2] = r0->var04.var00; + r0->var00_0++; + break; + case 2: + for (rg2 = 0; rg2 < r0->var04.var04; rg2++) + gPlttBufferFaded[r0->var04.var02 + rg2] = gPlttBufferUnfaded[r0->var04.var02 + rg2]; + r0->var00_0--; + break; + } + return 1; +} + +void task_tutorial_controls_fadein(struct UnkStruct0 *r0) +{ + u8 i = 0; + + if (r0->var00) + { + for (i = 0; i < 16; i++) + { + if ((r0->var02 >> i) & 1) + { + if (--r0->var04[i].var01 == 0xFF) // if underflow ? + { + if (r0->var04[i].var04.var00 & 0x8000) // PlttData->unused_15 ? + sub_81249E4(&r0->var04[i]); + else + sub_8124BEC(&r0->var04[i]); + r0->var04[i].var01 = r0->var04[i].var04.var05; + } + } + } + } +} + +void sub_8124CE8(struct UnkStruct0 *r0, u16 r1) +{ + u8 i = 0; + + r0->var00++; + for (i = 0; i < 16; i++) + { + if ((r1 >> i) & 1) + { + if (r0->var04[i].var00_7) + { + r0->var02 |= 1 << i; + r0->var04[i].var00_0 = 1; + } + } + } +} + +void sub_8124D3C(struct UnkStruct0 *r0, u16 r1) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + if ((r0->var02 >> i) & 1) + { + if (r0->var04[i].var00_7) + { + if ((r1 >> i) & 1) + { + u32 offset = r0->var04[i].var04.var02; + u16 *faded = &gPlttBufferFaded[offset]; + u16 *unfaded = &gPlttBufferUnfaded[offset]; + memcpy(faded, unfaded, r0->var04[i].var04.var04 * 2); + r0->var04[i].var00_0 = 0; + r0->var04[i].var02 = 0; + r0->var04[i].var01 = 0; + if (r0->var04[i].var04.var07_7 < 0) + r0->var04[i].var03 = 0xFF; + else + r0->var04[i].var03 = 0x1; + } + } + } + } + if (r1 == 0xFFFF) + { + r0->var00 = 0; + r0->var02 = 0; + } + else + { + r0->var02 = r0->var02 & ~r1; + } +} +void sub_8124DDC(u16 *dest, u16 src, u8 left, u8 top, u8 width, u8 height) +{ + u16 *_dest; + u8 i; + u8 j; + i = 0; + dest = &dest[top * 32 + left]; + for (; i < height; i++) + { + _dest = dest + i * 32; + for (j = 0; j < width; j++) + { + *_dest++ = src; + } + } +} +void sub_8124E2C(u16 *dest, u16 *src, u8 left, u8 top, u8 width, u8 height) +{ + u16 *_dest; + u16 *_src = src; + u8 i; + u8 j; + i = 0; + dest = &dest[top * 32 + left]; + for (; i < height; i++) + { + _dest = dest + i * 32; + for (j = 0; j < width; j++) + { + *_dest++ = *_src++; + } + } +} diff --git a/src/scanline_effect.c b/src/scanline_effect.c new file mode 100644 index 000000000..b4de0689f --- /dev/null +++ b/src/scanline_effect.c @@ -0,0 +1,261 @@ +#include "global.h" +#include "data2.h" +#include "task.h" +#include "trig.h" +#include "scanline_effect.h" + +static void CopyValue16Bit(void); +static void CopyValue32Bit(void); + +extern u16 gBattle_BG0_Y; +extern u16 gBattle_BG0_X; +extern u16 gBattle_BG1_X; +extern u16 gBattle_BG1_Y; +extern u16 gBattle_BG2_X; +extern u16 gBattle_BG2_Y; +extern u16 gBattle_BG3_X; +extern u16 gBattle_BG3_Y; + +EWRAM_DATA static u8 sShouldStopWaveTask = FALSE; + +struct ScanlineEffect gScanlineEffect; + +// Per-scanline register values. +// This is double buffered so that it can be safely written to at any time +// without overwriting the buffer that the DMA is currently reading +u16 gScanlineEffectRegBuffers[2][0x3C0]; + +void ScanlineEffect_Stop(void) +{ + gScanlineEffect.state = 0; + DmaStop(0); + if (gScanlineEffect.waveTaskId != 0xFF) + { + DestroyTask(gScanlineEffect.waveTaskId); + gScanlineEffect.waveTaskId = 0xFF; + } +} + +void ScanlineEffect_Clear(void) +{ + CpuFill16(0, gScanlineEffectRegBuffers, sizeof(gScanlineEffectRegBuffers)); + gScanlineEffect.dmaSrcBuffers[0] = NULL; + gScanlineEffect.dmaSrcBuffers[1] = NULL; + gScanlineEffect.dmaDest = NULL; + gScanlineEffect.dmaControl = 0; + gScanlineEffect.srcBuffer = 0; + gScanlineEffect.state = 0; + gScanlineEffect.unused16 = 0; + gScanlineEffect.unused17 = 0; + gScanlineEffect.waveTaskId = 0xFF; +} + +void ScanlineEffect_SetParams(struct ScanlineEffectParams params) +{ + if (params.dmaControl == SCANLINE_EFFECT_DMACNT_16BIT) // 16-bit + { + // Set the DMA src to the value for the second scanline because the + // first DMA transfer occurs in HBlank *after* the first scanline is drawn + gScanlineEffect.dmaSrcBuffers[0] = (u16 *)gScanlineEffectRegBuffers[0] + 1; + gScanlineEffect.dmaSrcBuffers[1] = (u16 *)gScanlineEffectRegBuffers[1] + 1; + gScanlineEffect.setFirstScanlineReg = CopyValue16Bit; + } + else // assume 32-bit + { + // Set the DMA src to the value for the second scanline because the + // first DMA transfer occurs in HBlank *after* the first scanline is drawn + gScanlineEffect.dmaSrcBuffers[0] = (u32 *)gScanlineEffectRegBuffers[0] + 1; + gScanlineEffect.dmaSrcBuffers[1] = (u32 *)gScanlineEffectRegBuffers[1] + 1; + gScanlineEffect.setFirstScanlineReg = CopyValue32Bit; + } + + gScanlineEffect.dmaControl = params.dmaControl; + gScanlineEffect.dmaDest = params.dmaDest; + gScanlineEffect.state = params.initState; + gScanlineEffect.unused16 = params.unused9; + gScanlineEffect.unused17 = params.unused9; +} + +void ScanlineEffect_InitHBlankDmaTransfer(void) +{ + if (gScanlineEffect.state == 0) + { + return; + } + else if (gScanlineEffect.state == 3) + { + gScanlineEffect.state = 0; + DmaStop(0); + sShouldStopWaveTask = TRUE; + } + else + { + DmaStop(0); + // Set DMA to copy to dest register on each HBlank for the next frame. + // The HBlank DMA transfers do not occurr during VBlank, so the transfer + // will begin on the HBlank after the first scanline + DmaSet(0, gScanlineEffect.dmaSrcBuffers[gScanlineEffect.srcBuffer], gScanlineEffect.dmaDest, gScanlineEffect.dmaControl); + // Manually set the reg for the first scanline + gScanlineEffect.setFirstScanlineReg(); + // Swap current buffer + gScanlineEffect.srcBuffer ^= 1; + } +} + +// These two functions are used to copy the register for the first scanline, +// depending whether it is a 16-bit register or a 32-bit register. + +static void CopyValue16Bit(void) +{ + u16 *dest = (u16 *)gScanlineEffect.dmaDest; + u16 *src = (u16 *)&gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer]; + + *dest = *src; +} + +static void CopyValue32Bit(void) +{ + u32 *dest = (u32 *)gScanlineEffect.dmaDest; + u32 *src = (u32 *)&gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer]; + + *dest = *src; +} + +#define tStartLine data[0] +#define tEndLine data[1] +#define tWaveLength data[2] +#define tSrcBufferOffset data[3] +#define tFramesUntilMove data[4] +#define tDelayInterval data[5] +#define tRegOffset data[6] +#define tApplyBattleBgOffsets data[7] + +static void TaskFunc_UpdateWavePerFrame(u8 taskId) +{ + int value = 0; + int i; + int offset; + + if (sShouldStopWaveTask) + { + DestroyTask(taskId); + gScanlineEffect.waveTaskId = 0xFF; + } + else + { + if (gTasks[taskId].tApplyBattleBgOffsets) + { + switch (gTasks[taskId].tRegOffset) + { + case SCANLINE_EFFECT_REG_BG0HOFS: + value = gBattle_BG0_X; + break; + case SCANLINE_EFFECT_REG_BG0VOFS: + value = gBattle_BG0_Y; + break; + case SCANLINE_EFFECT_REG_BG1HOFS: + value = gBattle_BG1_X; + break; + case SCANLINE_EFFECT_REG_BG1VOFS: + value = gBattle_BG1_Y; + break; + case SCANLINE_EFFECT_REG_BG2HOFS: + value = gBattle_BG2_X; + break; + case SCANLINE_EFFECT_REG_BG2VOFS: + value = gBattle_BG2_Y; + break; + case SCANLINE_EFFECT_REG_BG3HOFS: + value = gBattle_BG3_X; + break; + case SCANLINE_EFFECT_REG_BG3VOFS: + value = gBattle_BG3_Y; + break; + } + } + if (gTasks[taskId].tFramesUntilMove != 0) + { + gTasks[taskId].tFramesUntilMove--; + offset = gTasks[taskId].tSrcBufferOffset + 320; + for (i = gTasks[taskId].tStartLine; i < gTasks[taskId].tEndLine; i++) + { + gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gScanlineEffectRegBuffers[0][offset] + value; + offset++; + } + } + else + { + gTasks[taskId].tFramesUntilMove = gTasks[taskId].tDelayInterval; + offset = gTasks[taskId].tSrcBufferOffset + 320; + for (i = gTasks[taskId].tStartLine; i < gTasks[taskId].tEndLine; i++) + { + gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gScanlineEffectRegBuffers[0][offset] + value; + offset++; + } + + // increment src buffer offset + gTasks[taskId].tSrcBufferOffset++; + if (gTasks[taskId].tSrcBufferOffset == gTasks[taskId].tWaveLength) + gTasks[taskId].tSrcBufferOffset = 0; + } + } +} + +static void GenerateWave(u16 *buffer, u8 frequency, u8 amplitude, u8 unused) +{ + u16 i = 0; + u8 theta = 0; + + while (i < 256) + { + buffer[i] = (gSineTable[theta] * amplitude) / 256; + theta += frequency; + i++; + } +} + +// Initializes a background "wave" effect that affects scanlines startLine (inclusive) to endLine (exclusive). +// 'frequency' and 'amplitude' control the frequency and amplitude of the wave. +// 'delayInterval' controls how fast the wave travels up the screen. The wave will shift upwards one scanline every 'delayInterval'+1 frames. +// 'regOffset' is the offset of the video register to modify. +u8 ScanlineEffect_InitWave(u8 startLine, u8 endLine, u8 frequency, u8 amplitude, u8 delayInterval, u8 regOffset, bool8 applyBattleBgOffsets) +{ + int i; + int offset; + struct ScanlineEffectParams params; + u8 taskId; + + ScanlineEffect_Clear(); + + params.dmaDest = (void *)(REG_ADDR_BG0HOFS + regOffset); + params.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT; + params.initState = 1; + params.unused9 = 0; + ScanlineEffect_SetParams(params); + + taskId = CreateTask(TaskFunc_UpdateWavePerFrame, 0); + + gTasks[taskId].tStartLine = startLine; + gTasks[taskId].tEndLine = endLine; + gTasks[taskId].tWaveLength = 256 / frequency; + gTasks[taskId].tSrcBufferOffset = 0; + gTasks[taskId].tFramesUntilMove = delayInterval; + gTasks[taskId].tDelayInterval = delayInterval; + gTasks[taskId].tRegOffset = regOffset; + gTasks[taskId].tApplyBattleBgOffsets = applyBattleBgOffsets; + + gScanlineEffect.waveTaskId = taskId; + sShouldStopWaveTask = FALSE; + + GenerateWave(&gScanlineEffectRegBuffers[0][320], frequency, amplitude, endLine - startLine); + + offset = 320; + for (i = startLine; i < endLine; i++) + { + gScanlineEffectRegBuffers[0][i] = gScanlineEffectRegBuffers[0][offset]; + gScanlineEffectRegBuffers[1][i] = gScanlineEffectRegBuffers[0][offset]; + offset++; + } + + return taskId; +} diff --git a/src/scene/berry_blender.c b/src/scene/berry_blender.c index 53308e856..24cbcb9c0 100644 --- a/src/scene/berry_blender.c +++ b/src/scene/berry_blender.c @@ -198,8 +198,8 @@ void m4aMPlayTempoControl(struct MusicPlayerInfo *mplayInfo, u16 tempo); void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo); void sub_80A6978(void); u8 sub_80A7DEC(u8 berryId, u8 x, u8 y, bool8 animate); -void sub_814A880(u8 a1, u8 a2); -u8 sub_814A5C0(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5); +void MenuCursor_SetPos814A880(u8 a1, u8 a2); +u8 MenuCursor_Create814A5C0(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5); s8 GetFirstFreePokeblockSlot(void); bool8 sub_810CA34(struct Pokeblock *pokeblock); #ifdef GERMAN @@ -215,7 +215,7 @@ extern u8 byte_3002A68; extern const u8 gUnknown_08E6C100[]; extern const u8 gUnknown_08E6C920[]; extern const u8 gUnknown_08E6D354[]; -extern const struct WindowConfig gWindowConfig_81E6F68; +extern const struct WindowTemplate gWindowTemplate_81E6F68; extern const u8 *const gPokeblockNames[]; extern const struct Berry gBerries[]; @@ -274,12 +274,12 @@ static void sub_8051B18(void); static void sub_805123C(void); static void sub_8050954(void); static bool8 Blender_PrintBlendingRanking(void); -static bool8 Blender_PrintBlendingResults(void); +bool8 Blender_PrintBlendingResults(void); static void sub_80510E8(void); static void sub_8050E30(void); static void sub_805197C(u16 a0, u16 a1); -static void Blender_PrintMadePokeblockString(struct Pokeblock* pokeblock, u8* dst); -static void sub_8052BD0(u8 taskID); +/*static*/ void Blender_PrintMadePokeblockString(struct Pokeblock* pokeblock, u8* dst); +/*static*/ void sub_8052BD0(u8 taskID); static void sub_8052AF8(void); static void sub_804F8C8(u8 taskID); static void sub_804F9F4(u8 taskID); @@ -832,34 +832,13 @@ static bool8 sub_804E2EC(void) gBerryBlenderData->field_1++; break; case 1: - { - const void* offsetRead = sBlenderCenterMap; - void* offsetWrite = (void*)(VRAM + 0x4000); - - DmaCopy16(3, offsetRead, offsetWrite, 0x400); - LoadPalette(sBlenderCenterPal, 0, 0x100); - gBerryBlenderData->field_1++; - } + DmaCopy16Defvars(3, sBlenderCenterMap, (void *)(VRAM + 0x4000), 0x400); + LoadPalette(sBlenderCenterPal, 0, 0x100); + gBerryBlenderData->field_1++; break; case 2: - { - void* offsetRead = ewram10000; - void* offsetWrite = (void*)(VRAM); - u32 size = 0x2000; - while (TRUE) - { - DmaCopy16(3, offsetRead, offsetWrite, 0x1000); - offsetRead += 0x1000; - offsetWrite += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaCopy16(3, offsetRead, offsetWrite, size); - break; - } - } - gBerryBlenderData->field_1++; - } + DmaCopyLarge16(3, ewram10000, (void *)(VRAM + 0x0), 0x2000, 0x1000); + gBerryBlenderData->field_1++; break; case 3: LZDecompressWram(gUnknown_08E6C920, ewram10000); @@ -870,37 +849,23 @@ static bool8 sub_804E2EC(void) gBerryBlenderData->field_1++; break; case 5: - { - void* offsetRead = ewram10000; - void* offsetWrite = (void*)(VRAM + 0xE000); - - DmaCopy16(3, offsetRead, offsetWrite, 0x1000); - gBerryBlenderData->field_1++; - } + DmaCopy16Defvars(3, ewram10000, (void *)(VRAM + 0xE000), 0x1000); + gBerryBlenderData->field_1++; break; case 6: - { - void* offsetRead = ewram11000; - void* offsetWrite = (void*)(VRAM + 0xF000); - - DmaCopy16(3, offsetRead, offsetWrite, 0x1000); - gBerryBlenderData->field_1++; - } + DmaCopy16Defvars(3, ewram11000, (void *)(VRAM + 0xF000), 0x1000); + gBerryBlenderData->field_1++; break; case 7: { u16 i; u16* palStore = (u16*)(ewram13000); - void* offsetRead; - void* offsetWrite; for (i = 0; i < 640; i++) { *(palStore + i) |= 0x100; } - offsetRead = ewram13000; - offsetWrite = (void*)(VRAM + 0x6000); - DmaCopy16(3, offsetRead, offsetWrite, 0x500); + DmaCopy16Defvars(3, ewram13000, (void *)(VRAM + 0x6000), 0x500); LoadPalette(sBlenderOuterPal, 0x80, 0x20); gBerryBlenderData->field_1++; } @@ -957,8 +922,8 @@ static void sub_804E56C(void) ResetSpriteData(); FreeAllSpritePalettes(); SetVBlankCallback(NULL); - SetUpWindowConfig(&gWindowConfig_81E6F68); - InitMenuWindow(&gWindowConfig_81E6F68); + Text_LoadWindowTemplate(&gWindowTemplate_81E6F68); + InitMenuWindow(&gWindowTemplate_81E6F68); gBerryBlenderData->field_0++; gBerryBlenderData->field_140 = 0; gBerryBlenderData->field_13E = 0; @@ -993,12 +958,12 @@ static void sub_804E56C(void) } break; case 4: - MenuDrawTextWindow(0, 14, 29, 19); + Menu_DrawStdWindowFrame(0, 14, 29, 19); MenuPrintMessage(gOtherText_BlenderChooseBerry, 1, 15); gBerryBlenderData->field_0++; break; case 5: - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) { gBerryBlenderData->field_0++; BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); @@ -1135,8 +1100,8 @@ static void sub_804E9F8(void) FreeAllSpritePalettes(); ResetTasks(); SetVBlankCallback(VBlankCB0_BerryBlender); - SetUpWindowConfig(&gWindowConfig_81E6F68); - InitMenuWindow(&gWindowConfig_81E6F68); + Text_LoadWindowTemplate(&gWindowTemplate_81E6F68); + InitMenuWindow(&gWindowTemplate_81E6F68); gLinkType = 0x4422; gBerryBlenderData->field_0++; gBerryBlenderData->field_4E = 0; @@ -1184,8 +1149,8 @@ static void sub_804E9F8(void) } break; case 5: - MenuDrawTextWindow(0, 13, 29, 19); - MenuPrint(gOtherText_LinkStandby3, 1, 14); + Menu_DrawStdWindowFrame(0, 13, 29, 19); + Menu_PrintText(gOtherText_LinkStandby3, 1, 14); gBerryBlenderData->field_0 = 8; gBerryBlenderData->framesToWait = 0; break; @@ -1198,7 +1163,7 @@ static void sub_804E9F8(void) gBerryBlenderData->framesToWait = 0; break; case 9: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { ResetBlockReceivedFlags(); if (GetMultiplayerId() == 0) @@ -1209,7 +1174,7 @@ static void sub_804E9F8(void) case 10: if (++gBerryBlenderData->framesToWait > 20) { - MenuZeroFillScreen(); + Menu_EraseScreen(); if (GetBlockReceivedStatus() == sub_8008198()) { for (i = 0; i < GetLinkPlayerCount(); i++) @@ -1250,7 +1215,7 @@ static void sub_804E9F8(void) } break; case 13: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { gBerryBlenderData->field_0++; sub_8051414(&gBerryBlenderData->field_168); @@ -1292,7 +1257,7 @@ static void sub_804E9F8(void) gBerryBlenderData->field_0++; break; case 20: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { sub_8007E24(); gBerryBlenderData->field_0++; @@ -1309,12 +1274,12 @@ static void sub_804E9F8(void) PlayBGM(BGM_CYCLING); break; case 100: - MenuDrawTextWindow(0, 13, 29, 19); + Menu_DrawStdWindowFrame(0, 13, 29, 19); MenuPrintMessage(gOtherText_LinkNotFound, 1, 15); gBerryBlenderData->field_0++; break; case 101: - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) gBerryBlenderData->field_0++; break; case 102: @@ -1338,8 +1303,8 @@ static void sub_804F0F4(void) SetVBlankCallback(VBlankCB0_BerryBlender); - SetUpWindowConfig(&gWindowConfig_81E6F68); - InitMenuWindow(&gWindowConfig_81E6F68); + Text_LoadWindowTemplate(&gWindowTemplate_81E6F68); + InitMenuWindow(&gWindowTemplate_81E6F68); gLinkType = 0x4422; @@ -1426,7 +1391,7 @@ static void sub_804F2A8(void) if (GetMultiplayerId() == gBerryBlenderData->field_9A[i]) stringPtr = StringCopy(stringPtr, sRedColorString); StringCopy(stringPtr, gLinkPlayers[gBerryBlenderData->field_9A[i]].name); - MenuPrint_PixelCoords(gStringVar1, gUnknown_082162D4[i][0] * 8 + 1, gUnknown_082162D4[i][1] * 8, 1); + Menu_PrintTextPixelCoords(gStringVar1, gUnknown_082162D4[i][0] * 8 + 1, gUnknown_082162D4[i][1] * 8, 1); } } } @@ -2446,7 +2411,7 @@ static void BlenderDebug_CalculatePokeblock(struct BlenderBerry* berries, struct Blender_CalculatePokeblock(berries, pokeblock, playersNo, flavours, a4); } -static void sub_8050760(void) +/*static*/ void sub_8050760(void) { u32 frames = (u16)(gBerryBlenderData->gameFrameTime); u16 max_RPM = gBerryBlenderData->max_RPM; @@ -2494,15 +2459,15 @@ static void sub_8050760(void) static void sub_80508D4(u8 value) { gBerryBlenderData->field_AA = value; - sub_814A880(192, (gBerryBlenderData->field_AA * 16) + 72); + MenuCursor_SetPos814A880(192, (gBerryBlenderData->field_AA * 16) + 72); } static void sub_80508FC(void) { gBerryBlenderData->field_AA = 0; - MenuDrawTextWindow(23, 8, 28, 13); - sub_814A5C0(0, -1, 12, 0x2D9F, 32); - MenuPrint(gOtherText_YesNoTerminating, 24, 9); + Menu_DrawStdWindowFrame(23, 8, 28, 13); + MenuCursor_Create814A5C0(0, -1, 12, 0x2D9F, 32); + Menu_PrintText(gOtherText_YesNoTerminating, 24, 9); sub_80508D4(gBerryBlenderData->field_AA); } @@ -2541,7 +2506,7 @@ static void sub_8050954(void) case 3: if (/*multiplayerID != 0*/ GetMultiplayerId() != 0) gBerryBlenderData->field_6F++; - else if (sub_8007ECC()) + else if (IsLinkTaskFinished()) { gBerryBlenderData->field_1BC = gBerryBlenderData->gameFrameTime; gBerryBlenderData->field_1C0 = gBerryBlenderData->max_RPM; @@ -2567,19 +2532,19 @@ static void sub_8050954(void) if (Blender_PrintBlendingResults()) { if (gInGameOpponentsNo == 0) - IncrementGameStat(34); + IncrementGameStat(GAME_STAT_POKEBLOCKS_WITH_FRIENDS); else - IncrementGameStat(33); + IncrementGameStat(GAME_STAT_POKEBLOCKS); gBerryBlenderData->field_6F++; } break; case 7: gBerryBlenderData->field_6F++; - MenuDrawTextWindow(0, 14, 29, 19); + Menu_DrawStdWindowFrame(0, 14, 29, 19); MenuPrintMessage(gOtherText_BlendAnotherBerryPrompt, 1, 15); break; case 8: - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) gBerryBlenderData->field_6F++; break; case 9: @@ -2654,7 +2619,7 @@ static void sub_8050954(void) } break; case 13: - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) { SetMainCallback2(sub_8050E30); gBerryBlenderData->field_6F = 0; @@ -2681,7 +2646,7 @@ bool8 sub_8050CE8(void) gBerryBlenderData->framesToWait = 0; break; case 1: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { gBerryBlenderData->field_1C4++; gSoftResetDisabled = TRUE; @@ -2700,7 +2665,7 @@ bool8 sub_8050CE8(void) } break; case 4: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { if (sub_8125E6C()) gBerryBlenderData->field_1C4 = 5; @@ -2746,7 +2711,7 @@ static void sub_8050E30(void) case 1: gBerryBlenderData->field_6F = 3; DestroyMenuCursor(); - MenuZeroFillWindowRect(23, 8, 28, 13); + Menu_EraseWindowRect(23, 8, 28, 13); #ifdef ENGLISH StringCopy(gStringVar4, gLinkPlayers[gBerryBlenderData->field_7A].name); StringAppend(gStringVar4, gOtherText_OtherCaseIsFull); @@ -2759,7 +2724,7 @@ static void sub_8050E30(void) case 2: gBerryBlenderData->field_6F++; DestroyMenuCursor(); - MenuZeroFillWindowRect(23, 8, 28, 13); + Menu_EraseWindowRect(23, 8, 28, 13); #ifdef ENGLISH StringCopy(gStringVar4, gLinkPlayers[gBerryBlenderData->field_7A].name); StringAppend(gStringVar4, gOtherText_NoBerriesForBlend); @@ -2770,7 +2735,7 @@ static void sub_8050E30(void) MenuPrintMessage(gStringVar4, 1, 15); break; case 3: - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) { gBerryBlenderData->framesToWait = 0; gBerryBlenderData->field_6F++; @@ -2781,13 +2746,13 @@ static void sub_8050E30(void) gBerryBlenderData->field_6F = 5; break; case 5: - MenuDrawTextWindow(0, 14, 29, 19); - MenuPrint(gMultiText_Saving, 2, 15); + Menu_DrawStdWindowFrame(0, 14, 29, 19); + Menu_PrintText(gMultiText_Saving, 2, 15); sub_80084A4(); gBerryBlenderData->field_6F++; break; case 6: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { gBerryBlenderData->framesToWait = 0; gBerryBlenderData->field_6F++; @@ -2806,7 +2771,7 @@ static void sub_8050E30(void) sub_80084A4(); break; case 9: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); gBerryBlenderData->field_6F++; @@ -2859,17 +2824,17 @@ static void sub_80510E8(void) case 1: gBerryBlenderData->field_6F = 3; DestroyMenuCursor(); - MenuZeroFillWindowRect(23, 8, 28, 13); + Menu_EraseWindowRect(23, 8, 28, 13); MenuPrintMessage(gOtherText_CaseIsFull, 1, 15); break; case 2: gBerryBlenderData->field_6F++; DestroyMenuCursor(); - MenuZeroFillWindowRect(23, 8, 28, 13); + Menu_EraseWindowRect(23, 8, 28, 13); MenuPrintMessage(gOtherText_OutOfBerries, 1, 15); break; case 3: - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) gBerryBlenderData->field_6F = 9; break; case 9: @@ -3080,14 +3045,14 @@ void unref_sub_80516F8(u8 taskID) task->data[0] = 0; if (task->data[0] == 100) { - ZeroFillWindowRect(&gBerryBlenderData->field_4, 0, 0, 16, 20); - MenuDrawTextWindow(4, 4, 10, 12); + Text_EraseWindowRect(&gBerryBlenderData->field_4, 0, 0, 16, 20); + Menu_DrawStdWindowFrame(4, 4, 10, 12); for (i = 0; i < 3; i++) { if (gLinkPlayers[i + 1].trainerId != 0) - MenuPrint(gUnknown_08216284[i], 5, (2 * i) + 5); - MenuDrawTextWindow(0, 13, 29, 19); - MenuPrint(gOtherText_PressAToStart, 1, 15); + Menu_PrintText(gUnknown_08216284[i], 5, (2 * i) + 5); + Menu_DrawStdWindowFrame(0, 13, 29, 19); + Menu_PrintText(gOtherText_PressAToStart, 1, 15); } } if (gMain.newKeys & A_BUTTON) @@ -3099,7 +3064,7 @@ void unref_sub_80516F8(u8 taskID) else { if (task->data[0] == 10) - MenuPrint(gOtherText_PleaseWait, 3, 10); + Menu_PrintText(gOtherText_PleaseWait, 3, 10); if (++task->data[0] > 120) task->data[0] = 0; if (byte_3002A68 > 4 && gReceivedRemoteLinkPlayers == 1) @@ -3305,13 +3270,13 @@ static void sub_8051C04(struct Sprite* sprite) sprite->pos2.y = -(gBerryBlenderData->field_146); } -static void Blender_TrySettingRecord(void) +/*static*/ void Blender_TrySettingRecord(void) { if (gSaveBlock1.berryBlenderRecords[gBerryBlenderData->playersNo - 2] < gBerryBlenderData->max_RPM) gSaveBlock1.berryBlenderRecords[gBerryBlenderData->playersNo - 2] = gBerryBlenderData->max_RPM; } -static bool8 Blender_PrintBlendingResults(void) +bool8 Blender_PrintBlendingResults(void) { u16 i; @@ -3348,7 +3313,7 @@ static bool8 Blender_PrintBlendingResults(void) u8* textPtr; u16 secondsPassed, minutes, seconds; - MenuDrawTextWindow(4, 2, 25, 17); + Menu_DrawStdWindowFrame(4, 2, 25, 17); sub_8072BD8(gOtherText_ResultsOfBlending, 5, 3, 160); for (i = 0; i < gBerryBlenderData->playersNo; i++) { @@ -3370,7 +3335,7 @@ static bool8 Blender_PrintBlendingResults(void) textPtr += 3; textPtr = sub_8072C74(textPtr, gLinkPlayers[place].name, 88, 0); sub_8072C74(textPtr, text[0], 157, 0); - MenuPrint(gBerryBlenderData->stringVar, 5, gUnknown_082165E9[gBerryBlenderData->playersNo] + (i * gUnknown_082165EE[gBerryBlenderData->playersNo])); + Menu_PrintText(gBerryBlenderData->stringVar, 5, gUnknown_082165E9[gBerryBlenderData->playersNo] + (i * gUnknown_082165EE[gBerryBlenderData->playersNo])); } ConvertIntToDecimalStringN(text[0], gBerryBlenderData->max_RPM % 100, 2, 2); textPtr = gBerryBlenderData->stringVar; @@ -3388,7 +3353,7 @@ static bool8 Blender_PrintBlendingResults(void) textPtr = sub_8072C74(textPtr, text[0], 136, 1); #endif StringCopy(textPtr, gOtherText_RPM); - MenuPrint(gBerryBlenderData->stringVar, 5, 13); + Menu_PrintText(gBerryBlenderData->stringVar, 5, 13); secondsPassed = gBerryBlenderData->gameFrameTime / 60; seconds = secondsPassed % 60; @@ -3408,7 +3373,7 @@ static bool8 Blender_PrintBlendingResults(void) textPtr = sub_8072C74(textPtr, text[1], 136, 1); StringCopy(textPtr, gOtherText_Sec); - MenuPrint(gBerryBlenderData->stringVar, 5, 15); + Menu_PrintText(gBerryBlenderData->stringVar, 5, 15); gBerryBlenderData->framesToWait = 0; gBerryBlenderData->field_0++; @@ -3419,8 +3384,8 @@ static bool8 Blender_PrintBlendingResults(void) gBerryBlenderData->field_0++; break; case 5: - MenuZeroFillScreen(); - MenuDrawTextWindow(0, 14, 29, 19); + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 14, 29, 19); for (i = 0; i < BLENDER_MAX_PLAYERS; i++) { if (gBerryBlenderData->chosenItemID[i] != 0) @@ -3430,13 +3395,18 @@ static bool8 Blender_PrintBlendingResults(void) Blender_CalculatePokeblock(gBerryBlenderData->blendedBerries, &pokeblock, gBerryBlenderData->playersNo, flavours, gBerryBlenderData->max_RPM); Blender_PrintMadePokeblockString(&pokeblock, gBerryBlenderData->stringVar); CreateTask(sub_8052BD0, 6); +#if DEBUG + ConvertIntToHexStringN(text[0], sub_8007E40(), 0, 4); + StringAppend(text[0], gUnknown_08216249); + StringAppend(gBerryBlenderData->stringVar, text[0]); +#endif MenuPrintMessage(gBerryBlenderData->stringVar, 1, 15); RemoveBagItem(gSpecialVar_ItemId, 1); sub_810CA34(&pokeblock); gBerryBlenderData->field_0++; break; case 6: - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) { Blender_TrySettingRecord(); return TRUE; @@ -3446,7 +3416,7 @@ static bool8 Blender_PrintBlendingResults(void) return FALSE; } -static void Blender_PrintMadePokeblockString(struct Pokeblock* pokeblock, u8* dst) +/*static*/ void Blender_PrintMadePokeblockString(struct Pokeblock* pokeblock, u8* dst) { u8 text[12]; u8 flavourLvl, feel; @@ -3536,7 +3506,7 @@ static bool8 Blender_PrintBlendingRanking(void) } break; case 3: - MenuDrawTextWindow(4, 2, 25, 17); + Menu_DrawStdWindowFrame(4, 2, 25, 17); sub_8072BD8(gOtherText_Ranking, 5, 3, 160); gBerryBlenderData->scoreIconIDs[BLENDER_SCORE_BEST] = CreateSprite(&sSpriteTemplate_821645C, 140, 52, 0); @@ -3575,7 +3545,7 @@ static bool8 Blender_PrintBlendingRanking(void) txtPtr = sub_8072C14(txtPtr, gBerryBlenderData->scores[place][BLENDER_SCORE_GOOD], 132, 1); txtPtr = sub_8072C14(txtPtr, gBerryBlenderData->scores[place][BLENDER_SCORE_MISS], 156, 1); - MenuPrint(gBerryBlenderData->stringVar, 5, i * gUnknown_082165F3[gBerryBlenderData->playersNo] + 8); + Menu_PrintText(gBerryBlenderData->stringVar, 5, i * gUnknown_082165F3[gBerryBlenderData->playersNo] + 8); } gBerryBlenderData->framesToWait = 0; gBerryBlenderData->field_0++; @@ -3606,8 +3576,8 @@ void unref_sub_80524BC(void) FreeAllSpritePalettes(); ResetTasks(); SetVBlankCallback(VBlankCB1_BerryBlender); - SetUpWindowConfig(&gWindowConfig_81E6CE4); - InitMenuWindow(&gWindowConfig_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); SeedRng(gMain.vblankCounter1); REG_DISPCNT = 0x1540; RunTasks(); @@ -3625,10 +3595,10 @@ static void BlenderDebug_PrintBerryData(void) u8 i; StringCopy(text, sText_BPM); - MenuPrint(text, 2, 0); + Menu_PrintText(text, 2, 0); ConvertIntToDecimalStringN(text, sBlenderDebug.BPM / 100, 2, 3); - MenuPrint(text, 6, 0); + Menu_PrintText(text, 6, 0); for (i = 0; i < 4; i++) { @@ -3646,7 +3616,7 @@ static void BlenderDebug_PrintBerryData(void) text[7] = EOS; } var = (i * 3) + 3; - MenuPrint(text, 2, var); + Menu_PrintText(text, 2, var); ConvertIntToDecimalStringN(&text[0], gBerries[sBlenderDebug.berries[i]].spicy, 2, 2); StringAppend(text, sText_Space); @@ -3666,12 +3636,12 @@ static void BlenderDebug_PrintBerryData(void) ConvertIntToDecimalStringN(&text[15], gBerries[sBlenderDebug.berries[i]].smoothness, 2, 2); text[17] = EOS; - MenuPrint(text, 7, var); + Menu_PrintText(text, 7, var); } if (sBlenderDebug.pokeblock.color != 0) { StringCopy(text, gPokeblockNames[sBlenderDebug.pokeblock.color]); - MenuPrint(text, 2, 15); + Menu_PrintText(text, 2, 15); ConvertIntToHexStringN(&text[0], sBlenderDebug.spicy, 2, 2); StringAppend(text, sText_Space); @@ -3691,7 +3661,7 @@ static void BlenderDebug_PrintBerryData(void) ConvertIntToHexStringN(&text[15], sBlenderDebug.feel, 2, 2); text[17] = EOS; - MenuPrint(text, 7, 17); + Menu_PrintText(text, 7, 17); } } @@ -3743,7 +3713,7 @@ static void sub_80527BC(void) gUnknown_020297DC = 0; } - MenuPrint(text, 2, 15); + Menu_PrintText(text, 2, 15); } static void sub_8052918(void) @@ -3845,9 +3815,9 @@ void ShowBerryBlenderRecordWindow(void) u8 text[30]; s32 i; - MenuDrawTextWindow(6, 3, 23, 16); - MenuPrint(gMultiText_BerryBlenderMaxSpeedRecord, 8, 4); - MenuPrint(gMultiText_2P3P4P, 8, 9); + Menu_DrawStdWindowFrame(6, 3, 23, 16); + Menu_PrintText(gMultiText_BerryBlenderMaxSpeedRecord, 8, 4); + Menu_PrintText(gMultiText_2P3P4P, 8, 9); for (i = 0; i < 3; i++) { @@ -3865,11 +3835,11 @@ void ShowBerryBlenderRecordWindow(void) txtPtr = ConvertIntToDecimalStringN(txtPtr, record % 100, 2, 2); StringAppend(txtPtr, gOtherText_RPM); - MenuPrint(text, 15, i * 2 + 9); + Menu_PrintText(text, 15, i * 2 + 9); } } -static void sub_8052BD0(u8 taskID) +/*static*/ void sub_8052BD0(u8 taskID) { if (gTasks[taskID].data[0] == 0) { diff --git a/src/scene/cable_car.c b/src/scene/cable_car.c new file mode 100644 index 000000000..114505e4d --- /dev/null +++ b/src/scene/cable_car.c @@ -0,0 +1,1198 @@ + +// Includes +#include "global.h" +#include "ewram.h" +#include "overworld.h" +#include "palette.h" +#include "random.h" +#include "main.h" +#include "menu.h" +#include "script.h" +#include "task.h" +#include "sound.h" +#include "graphics.h" +#include "constants/songs.h" +#include "decompress.h" +#include "field_weather.h" +#include "field_map_obj.h" +#include "scanline_effect.h" +#include "event_data.h" +#include "cable_car_util.h" +#include "constants/map_objects.h" +#include "constants/weather.h" + +// Static type declarations + +// Credits to Made (dolphin emoji) +#define S16TOPOSFLOAT(val) \ +({ \ + s16 v = (val); \ + float f = (float)v; \ + if(v < 0) f += 65536.0f; \ + f; \ +}) + +struct CableCarEwramStruct1 { + u8 unk_0000; + u8 unk_0001; + u8 unk_0002; + u8 unk_0003; + u16 unk_0004; + u16 unk_0006; + u8 unk_0008; + u8 unk_0009; + u8 filler_000a[2]; + u8 unk_000c; + u8 unk_000d; + u8 filler_0000e[6]; + u8 unk_0014; + u8 unk_0015; + u8 unk_0016; + u8 unk_0017; + u8 unk_0018; + u8 unk_0019; + u8 unk_001a; + u8 unk_001b; + u8 unk_001c; + u8 unk_001d; + u8 unk_001e; + u8 unk_001f; + u8 unk_0020; + u16 unk_0022[9][12]; + u8 filler_00fa[2]; + u16 unk_00fc[0x20][0x20]; + u16 unk_08fc[0x20][0x20]; +}; // size 0x10FC + +struct CableCarEwramStruct2 { + /* 0x000 */ u16 mtChimneyTilemap[0xb4]; + /* 0x168 */ u16 treeTilemap[0x1e0]; + /* 0x528 */ u16 mountainTilemap[0x258]; + /* 0x9d8 */ u16 pylonStemTilemap[0x628]; // size not actually known +}; + +// Static RAM declarations + +EWRAM_DATA struct CableCarEwramStruct1 *sCableCarPtr = NULL; +EWRAM_DATA u8 gUnknown_02039278 = 0; +EWRAM_DATA u8 gUnknown_02039279 = 0; +EWRAM_DATA u8 gUnknown_0203927A = 0; +EWRAM_DATA u8 gUnknown_0203927B = 0; +EWRAM_DATA u8 gUnknown_0203927C = 0; +EWRAM_DATA u8 gUnknown_0203927D = 0; +EWRAM_DATA u32 filler_02039280 = 0; + +// Static ROM declarations + +static void CableCarMainCallback_Setup(void); +static void CableCarMainCallback_Run(void); +static void sub_8123878(u8 taskId); +static void sub_81239E4(u8 taskId); +static void sub_8123AF8(u8 taskId); +static void CableCarVblankCallback(void); +static void nullsub_76(struct Sprite *sprite); +static void sub_8123CB8(struct Sprite *sprite); +static void sub_8123EB8(struct Sprite *sprite); +static void sub_8123F44(struct Sprite *sprite); +static void sub_8123FBC(u8); +static void LoadSprites(void); +static void sub_812453C(void); +static void sub_8124598(void); +static void sub_81245F4(void); +static void sub_812476C(void); +static void sub_81248AC(u8); + +// .rodata + +#if DEBUG + +u8 debug_sub_8138D74(void); +u8 debug_sub_8138D8C(void); +u8 debug_sub_8138C14(void); +u8 debug_sub_8138C34(void); +u8 debug_sub_810CD9C(void); + +const u8 Str_842DBD0[] = _("CABLE CAR U"); +const u8 Str_842DBDC[] = _("CABLE CAR D"); +const u8 Str_842DBE8[] = _("ROULETTE1"); +const u8 Str_842DBF2[] = _("ROULETTE3"); +const u8 Str_842DBFC[] = _("View a MAIL"); + +const struct MenuAction gUnkDebug4Menu[] = +{ + {Str_842DBD0, debug_sub_8138D74}, + {Str_842DBDC, debug_sub_8138D8C}, + {Str_842DBE8, debug_sub_8138C14}, + {Str_842DBF2, debug_sub_8138C34}, + {Str_842DBFC, debug_sub_810CD9C}, +}; + +#endif + +static const u8 gCableCarMtChimneyTilemap[] = INCBIN_U8("graphics/misc/cable_car_mt_chimney_map.bin.lz"); + +static const u8 gCableCarTreeTilemap[] = INCBIN_U8("graphics/misc/cable_car_tree_map.bin.lz"); + +static const u8 gCableCarMountainTilemap[] = INCBIN_U8("graphics/misc/cable_car_mountain_map.bin.lz"); + +static const u16 gCableCarPylonHookTilemapEntries[] = { + 0x3000, + 0x3001, + 0x3002, + 0x3003, + 0x3004, + 0x3005, + 0x3006, + 0x3007, + 0x3008, + 0x3009 +}; + +static const u8 gCableCarPylonStemTilemap[] = INCBIN_U8("graphics/misc/cable_car_pylon_stem_map.bin.lz"); + +static const struct CompressedSpriteSheet gUnknown_08401CF8[] = { + { gCableCar_Gfx, 0x800, 1 }, + { gCableCarDoor_Gfx, 0x40, 2 }, + { gCableCarCord_Gfx, 0x80, 3 }, + { } +}; +static const struct SpritePalette gUnknown_08401D18[] = { + { gCableCar_Pal, 1 }, + { } +}; + +static const struct OamData gOamData_8401D28 = { + .affineMode = ST_OAM_AFFINE_DOUBLE, + .size = 3, + .priority = 2 +}; + +static const struct OamData gOamData_8401D30 = { + .affineMode = ST_OAM_AFFINE_DOUBLE, + .shape = ST_OAM_H_RECTANGLE, + .priority = 2 +}; + +static const struct OamData gOamData_8401D38 = { + .affineMode = ST_OAM_AFFINE_DOUBLE, + .size = 1, + .priority = 2 +}; + +static const struct SpriteTemplate gSpriteTemplate_8401D40[] = { + { + 1, + 1, + &gOamData_8401D28, + gDummySpriteAnimTable, + NULL, + gDummySpriteAffineAnimTable, + sub_8123CB8 + }, { + 2, + 1, + &gOamData_8401D30, + gDummySpriteAnimTable, + NULL, + gDummySpriteAffineAnimTable, + sub_8123CB8 + }, { + 3, + 1, + &gOamData_8401D38, + gDummySpriteAnimTable, + NULL, + gDummySpriteAffineAnimTable, + nullsub_76 + } +}; + +// .text + +#if DEBUG + +__attribute__((naked)) +u8 debug_sub_8138C14(void) +{ + asm("\n\ + push {lr}\n\ + ldr r0, ._1 @ unk_203955C\n\ + mov r1, #0x1\n\ + strb r1, [r0]\n\ + ldr r0, ._1 + 4 @ MauvilleCity_GameCorner_EventScript_1C407E\n\ + bl ScriptContext1_SetupScript\n\ + bl CloseMenu\n\ + mov r0, #0x1\n\ + pop {r1}\n\ + bx r1\n\ +._2:\n\ + .align 2, 0\n\ +._1:\n\ + .word unk_203955C\n\ + .word MauvilleCity_GameCorner_EventScript_1C407E"); +} + +__attribute__((naked)) +u8 debug_sub_8138C34(void) +{ + asm("\n\ + push {lr}\n\ + ldr r0, ._3 @ unk_203955C\n\ + mov r1, #0x1\n\ + strb r1, [r0]\n\ + ldr r0, ._3 + 4 @ MauvilleCity_GameCorner_EventScript_1C40AC\n\ + bl ScriptContext1_SetupScript\n\ + bl CloseMenu\n\ + mov r0, #0x1\n\ + pop {r1}\n\ + bx r1\n\ +._4:\n\ + .align 2, 0\n\ +._3:\n\ + .word unk_203955C\n\ + .word MauvilleCity_GameCorner_EventScript_1C40AC"); +} + +__attribute__((naked)) +u8 debug_sub_8138C54(void) +{ + asm("\n\ + push {r4, lr}\n\ + ldr r4, ._10 @ gMain\n\ + ldrh r0, [r4, #0x2e]\n\ + cmp r0, #0x40\n\ + bne ._5 @cond_branch\n\ + mov r0, #0x1\n\ + neg r0, r0\n\ + bl Menu_MoveCursor\n\ +._5:\n\ + ldrh r0, [r4, #0x2e]\n\ + cmp r0, #0x80\n\ + bne ._6 @cond_branch\n\ + mov r0, #0x1\n\ + bl Menu_MoveCursor\n\ +._6:\n\ + ldrh r1, [r4, #0x2e]\n\ + cmp r1, #0x1\n\ + beq ._7 @cond_branch\n\ + ldr r0, ._10 + 4 @ 0x101\n\ + cmp r1, r0\n\ + bne ._8 @cond_branch\n\ + ldr r1, ._10 + 8 @ gSpecialVar_0x8004\n\ + mov r0, #0x1\n\ + strh r0, [r1]\n\ +._7:\n\ + ldr r4, ._10 + 12 @ gUnkDebug4Menu\n\ + bl Menu_GetCursorPos\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x15\n\ + add r4, r4, #0x4\n\ + add r0, r0, r4\n\ + ldr r0, [r0]\n\ + bl _call_via_r0\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + b ._13\n\ +._11:\n\ + .align 2, 0\n\ +._10:\n\ + .word gMain\n\ + .word 0x101\n\ + .word gSpecialVar_0x8004\n\ + .word gUnkDebug4Menu\n\ +._8:\n\ + cmp r1, #0x2\n\ + beq ._12 @cond_branch\n\ + mov r0, #0x0\n\ + b ._13\n\ +._12:\n\ + bl CloseMenu\n\ + mov r0, #0x1\n\ +._13:\n\ + pop {r4}\n\ + pop {r1}\n\ + bx r1"); +} + +__attribute__((naked)) +u8 debug_sub_8138CC4(void) +{ + asm("\n\ + push {lr}\n\ + add sp, sp, #0xfffffff8\n\ + ldr r1, ._14 @ gSpecialVar_0x8004\n\ + mov r0, #0x0\n\ + strh r0, [r1]\n\ + bl Menu_EraseScreen\n\ + mov r0, #0x13\n\ + mov r1, #0x0\n\ + mov r2, #0x1d\n\ + mov r3, #0xc\n\ + bl Menu_DrawStdWindowFrame\n\ + ldr r3, ._14 + 4 @ gUnkDebug4Menu\n\ + mov r0, #0x14\n\ + mov r1, #0x1\n\ + mov r2, #0x5\n\ + bl Menu_PrintItems\n\ + mov r0, #0x0\n\ + str r0, [sp]\n\ + mov r0, #0x8\n\ + str r0, [sp, #0x4]\n\ + mov r0, #0x0\n\ + mov r1, #0x14\n\ + mov r2, #0x1\n\ + mov r3, #0x5\n\ + bl InitMenu\n\ + ldr r1, ._14 + 8 @ gMenuCallback\n\ + ldr r0, ._14 + 12 @ debug_sub_8138C54\n\ + str r0, [r1]\n\ + mov r0, #0x0\n\ + add sp, sp, #0x8\n\ + pop {r1}\n\ + bx r1\n\ +._15:\n\ + .align 2, 0\n\ +._14:\n\ + .word gSpecialVar_0x8004\n\ + .word gUnkDebug4Menu\n\ + .word gMenuCallback\n\ + .word debug_sub_8138C54+1"); +} + +#endif + +static void CableCarTask1(u8 taskId) +{ + if (!gPaletteFade.active) + { + SetMainCallback2(CableCarMainCallback_Setup); + DestroyTask(taskId); + } +} + +void CableCar(void) +{ + ScriptContext2_Enable(); + CreateTask(CableCarTask1, 1); + BeginNormalPaletteFade(-1, 0, 0, 16, 0); +} + +#if DEBUG + +__attribute__((naked)) +u8 debug_sub_8138D74(void) +{ + asm("\n\ + push {lr}\n\ + ldr r1, ._21 @ gSpecialVar_0x8004\n\ + mov r0, #0x0\n\ + strh r0, [r1]\n\ + bl CloseMenu\n\ + bl CableCar\n\ + pop {r0}\n\ + bx r0\n\ +._22:\n\ + .align 2, 0\n\ +._21:\n\ + .word gSpecialVar_0x8004"); +} + +__attribute__((naked)) +u8 debug_sub_8138D8C(void) +{ + asm("\n\ + push {lr}\n\ + ldr r1, ._23 @ gSpecialVar_0x8004\n\ + mov r0, #0x1\n\ + strh r0, [r1]\n\ + bl CloseMenu\n\ + bl CableCar\n\ + pop {r0}\n\ + bx r0\n\ +._24:\n\ + .align 2, 0\n\ +._23:\n\ + .word gSpecialVar_0x8004"); +} + +#endif + +static void CableCarMainCallback_Setup(void) +{ + u8 i; + u16 imebak; + + switch (gMain.state) + { + case 0: + default: + SetVBlankCallback(NULL); + ScanlineEffect_Stop(); + DmaFill16Large(3, 0, VRAM, VRAM_SIZE, 0x1000); + DmaFill32Defvars(3, 0, OAM, OAM_SIZE); + DmaFill16Defvars(3, 0, PLTT, PLTT_SIZE); + sCableCarPtr = eCableCar1; + DmaFill16Large(3, 0, eCableCar1, 0x10FC, 0x1000); + gMain.state++; + break; + case 1: + ResetSpriteData(); + ResetTasks(); + FreeAllSpritePalettes(); + ResetPaletteFade(); + StartWeather(); + for (i = 0; i < 20; i++) + { + gWeatherPtr->sprites.s2.ashSprites[i] = NULL; + } + InitMapMusic(); + ResetMapMusic(); + gSpriteCoordOffsetX = gSpriteCoordOffsetY = 0; + gMain.state++; + break; + case 2: + for (i = 0; i < 3; i++) + { + LoadCompressedObjectPic(&gUnknown_08401CF8[i]); + } + LoadSpritePalettes(gUnknown_08401D18); + LZDecompressWram(gCableCarMtChimneyTilemap, eCableCar2->mtChimneyTilemap); + LZDecompressWram(gCableCarTreeTilemap, eCableCar2->treeTilemap); + LZDecompressWram(gCableCarMountainTilemap, eCableCar2->mountainTilemap); + LZDecompressWram(gCableCarPylonStemTilemap, eCableCar2->pylonStemTilemap); + LoadPalette(gCableCarBG_Pal, 0, 0x80); + LZ77UnCompVram(gCableCarBG_Gfx, (u16 *)BG_VRAM); + gMain.state++; + break; + case 3: + LoadSprites(); + RunTasks(); + gMain.state++; + break; + case 4: + if (sCableCarPtr->unk_0002 == 7) + { + gMain.state++; + } + else if (gWeatherPtr->sprites.s2.ashSprites[0] != NULL) + { + for (i = 0; i < 20; i++) + { + if (gWeatherPtr->sprites.s2.ashSprites[i] != NULL) + { + gWeatherPtr->sprites.s2.ashSprites[i]->oam.priority = 0; + } + } + gMain.state++; + } + break; + case 5: + CableCarUtil_CopyWrapped((void *)BG_SCREEN_ADDR(29), eCableCar2->treeTilemap, 0, 17, 32, 15); + CableCarUtil_CopyWrapped((void *)BG_SCREEN_ADDR(30), eCableCar2->mountainTilemap, 0, 0, 30, 20); + CableCarUtil_CopyWrapped(sCableCarPtr->unk_08fc, gCableCarPylonHookTilemapEntries, 0, 0, 5, 2); + CableCarUtil_CopyWrapped(sCableCarPtr->unk_08fc, eCableCar2->pylonStemTilemap, 0, 2, 2, 20); + gMain.state++; + break; + case 6: + sub_81248AC(gSpecialVar_0x8004); + CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x48, 0, 14, 12, 3); + CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x6C, 12, 17, 12, 3); + CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x90, 24, 20, 12, 3); + CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x00, 0, 17, 12, 3); + CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x24, 0, 20, 12, 3); + CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x00, 12, 20, 12, 3); + CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x24, 12, 23, 12, 3); + CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x00, 24, 23, 12, 3); + gMain.state++; + break; + case 7: + BeginNormalPaletteFade(-1, 3, 16, 0, 0); + FadeInNewBGM(BGM_ROPEWAY, 1); + sub_8123FBC(1); + gMain.state++; + break; + case 8: + imebak = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = imebak; + SetVBlankCallback(CableCarVblankCallback); + SetMainCallback2(CableCarMainCallback_Run); + CreateTask(sub_8123878, 0); + if (gSpecialVar_0x8004 == 0) + { + sCableCarPtr->unk_0000 = CreateTask(sub_81239E4, 1); + } + else + { + sCableCarPtr->unk_0000 = CreateTask(sub_8123AF8, 1); + } + break; + } +} + +static void CableCarMainCallback_Run(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); + MapMusicMain(); +} + +static void sub_8123740(void) +{ + u8 i; + + i = 0; + sub_8123FBC(0); + gSpriteCoordOffsetX = 0; + sub_807C9B4(WEATHER_NONE); + for (; i < 20; i++) + { + gWeatherPtr->sprites.s2.ashSprites[i] = NULL; + } + ResetTasks(); + ResetSpriteData(); + ResetPaletteFade(); + DmaFill32Large(3, 0, gSharedMem, 0x20000, 0x1000); + sCableCarPtr = NULL; + DmaFill16Large(3, 0, VRAM, VRAM_SIZE, 0x1000); + DmaFill32Defvars(3, 0, OAM, OAM_SIZE); + DmaFill16Defvars(3, 0, PLTT, PLTT_SIZE); + warp_in(); + gFieldCallback = NULL; + SetMainCallback2(CB2_LoadMap); +} + +static void sub_8123878(u8 taskId) +{ + u8 i; + + i = 0; + sCableCarPtr->unk_0006++; + switch (sCableCarPtr->unk_0001) + { + case 0: + if (sCableCarPtr->unk_0006 == sCableCarPtr->unk_0004) + { + ChangeWeather(sCableCarPtr->unk_0002); + sCableCarPtr->unk_0001 = 1; + } + break; + case 1: + switch (sCableCarPtr->unk_0002) + { + case 7: + if (gWeatherPtr->sprites.s2.ashSprites[0] != NULL && gWeatherPtr->sprites.s2.ashSprites[0]->oam.priority != 0) + { + for (; i < 20; i++) + { + if (gWeatherPtr->sprites.s2.ashSprites[i] != NULL) + { + gWeatherPtr->sprites.s2.ashSprites[i]->oam.priority = 0; + } + } + sCableCarPtr->unk_0001 = 2; + } + break; + case 2: + if (gWeatherPtr->currWeather == 2) + { + sCableCarPtr->unk_0001 = 2; + } + else if (sCableCarPtr->unk_0006 >= sCableCarPtr->unk_0004 + 8) + { + for (; i < 20; i++) + { + if (gWeatherPtr->sprites.s2.ashSprites[i] != NULL) + { + gWeatherPtr->sprites.s2.ashSprites[i]->invisible ^= TRUE; + } + } + } + break; + } + break; + case 2: + if (sCableCarPtr->unk_0006 == 570) + { + sCableCarPtr->unk_0001 = 3; + BeginNormalPaletteFade(-1, 3, 0, 16, 0); + FadeOutBGM(4); + } + break; + case 3: + if (!gPaletteFade.active) + { + sCableCarPtr->unk_0001 = 255; + } + break; + case 255: + SetVBlankCallback(NULL); + DestroyTask(taskId); + DestroyTask(sCableCarPtr->unk_0000); + SetMainCallback2(sub_8123740); + break; + } +} + +static void sub_81239E4(u8 taskId) +{ + if (sCableCarPtr->unk_0001 != 255) + { + sCableCarPtr->unk_0014--; + if ((sCableCarPtr->unk_0006 % 2) == 0) + { + sCableCarPtr->unk_0015--; + } + if ((sCableCarPtr->unk_0006 % 8) == 0) + { + sCableCarPtr->unk_000c--; + sCableCarPtr->unk_000d--; + } + switch (sCableCarPtr->unk_0014) + { + case 175: + CableCarUtil_FillWrapped(sCableCarPtr->unk_08fc, 0, 0, 22, 2, 10); + break; + case 40: + CableCarUtil_FillWrapped(sCableCarPtr->unk_08fc, 0, 3, 0, 2, 2); + break; + case 32: + CableCarUtil_FillWrapped(sCableCarPtr->unk_08fc, 0, 2, 0, 1, 2); + break; + case 16: + CableCarUtil_CopyWrapped(sCableCarPtr->unk_08fc, gCableCarPylonHookTilemapEntries, 0, 0, 5, 2); + CableCarUtil_CopyWrapped(sCableCarPtr->unk_08fc, eCableCar2->pylonStemTilemap, 0, 2, 2, 30); + sCableCarPtr->unk_0015 = 64; + break; + } + } + sub_812453C(); + gSpriteCoordOffsetX = (gSpriteCoordOffsetX + 1) % 128; +} + +static void sub_8123AF8(u8 taskId) +{ + if (sCableCarPtr->unk_0001 != 255) + { + sCableCarPtr->unk_0014++; + if ((sCableCarPtr->unk_0006 % 2) == 0) + { + sCableCarPtr->unk_0015++; + } + if ((sCableCarPtr->unk_0006 % 8) == 0) + { + sCableCarPtr->unk_000c++; + sCableCarPtr->unk_000d++; + } + switch (sCableCarPtr->unk_0014) + { + case 176: + CableCarUtil_CopyWrapped(sCableCarPtr->unk_08fc, eCableCar2->pylonStemTilemap, 0, 2, 2, 30); + break; + case 16: + CableCarUtil_FillWrapped(sCableCarPtr->unk_08fc, 0, 2, 0, 3, 2); + CableCarUtil_FillWrapped(sCableCarPtr->unk_08fc, 0, 0, 22, 2, 10); + sCableCarPtr->unk_0015 = 192; + break; + case 32: + sCableCarPtr->unk_08fc[0][2] = (gCableCarPylonHookTilemapEntries + 2)[0]; + sCableCarPtr->unk_08fc[0][3] = (gCableCarPylonHookTilemapEntries + 2)[1]; + sCableCarPtr->unk_08fc[1][2] = (gCableCarPylonHookTilemapEntries + 2)[5]; + sCableCarPtr->unk_08fc[1][3] = (gCableCarPylonHookTilemapEntries + 2)[6]; + break; + case 40: + sCableCarPtr->unk_08fc[0][4] = (gCableCarPylonHookTilemapEntries + 4)[0]; + sCableCarPtr->unk_08fc[1][4] = (gCableCarPylonHookTilemapEntries + 4)[5]; + break; + } + } + sub_8124598(); + if (sCableCarPtr->unk_0006 < sCableCarPtr->unk_0004) { + gSpriteCoordOffsetX = (gSpriteCoordOffsetX + 247) % 248; + } + else + { + gWeatherPtr->unknown_6FC = (gWeatherPtr->unknown_6FC + 247) % 248; + } +} + +static void CableCarVblankCallback(void) +{ + DmaCopy16(3, sCableCarPtr->unk_00fc, BG_SCREEN_ADDR(28), 0x800); + DmaCopy16(3, sCableCarPtr->unk_08fc, BG_SCREEN_ADDR(31), 0x800); + REG_BG3HOFS = sCableCarPtr->unk_0014; + REG_BG3VOFS = sCableCarPtr->unk_0015; + REG_BG1HOFS = sCableCarPtr->unk_000c; + REG_BG1VOFS = sCableCarPtr->unk_000d; + REG_BG0HOFS = sCableCarPtr->unk_0008; + REG_BG0VOFS = sCableCarPtr->unk_0009; + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void nullsub_76(struct Sprite *sprite) +{ + +} + +static void sub_8123CB8(struct Sprite *sprite) +{ + if (sCableCarPtr->unk_0001 != 255) + { + if (gSpecialVar_0x8004 == 0) + { + sprite->pos1.x = sprite->data[0] - (u8)(0.14f * S16TOPOSFLOAT(sCableCarPtr->unk_0006)); + sprite->pos1.y = sprite->data[1] - (u8)(0.067f * S16TOPOSFLOAT(sCableCarPtr->unk_0006)); + } + else + { + sprite->pos1.x = sprite->data[0] + (u8)(0.14f * S16TOPOSFLOAT(sCableCarPtr->unk_0006)); + sprite->pos1.y = sprite->data[1] + (u8)(0.067f * S16TOPOSFLOAT(sCableCarPtr->unk_0006)); + } + } +} + +static void sub_8123D98(struct Sprite *sprite) +{ + if (sCableCarPtr->unk_0001 != 255) + { + if (gSpecialVar_0x8004 == 0) + { + sprite->pos1.x = sprite->data[0] - (u8)(0.14f * S16TOPOSFLOAT(sCableCarPtr->unk_0006)); + sprite->pos1.y = sprite->data[1] - (u8)(0.067f * S16TOPOSFLOAT(sCableCarPtr->unk_0006)); + } + else + { + sprite->pos1.x = sprite->data[0] + (u8)(0.14f * S16TOPOSFLOAT(sCableCarPtr->unk_0006)); + sprite->pos1.y = sprite->data[1] + (u8)(0.067f * S16TOPOSFLOAT(sCableCarPtr->unk_0006)); + } + switch (sprite->data[2]) + { + case 0: + sprite->pos2.y = 17; + if (sprite->data[3] ++ > 9) + { + sprite->data[3] = 0; + sprite->data[2] ++; + } + break; + default: + sprite->pos2.y = 16; + if (sprite->data[3] ++ > 9) + { + sprite->data[3] = 0; + sprite->data[2] = 0; + } + break; + } + } +} + +static void sub_8123EB8(struct Sprite *sprite) +{ + if (sprite->data[0] == 0) + { + sprite->pos1.x += 2 * sprite->centerToCornerVecX; + sprite->pos1.y += 16 + sprite->centerToCornerVecY; + } + if (++sprite->data[0] >= sprite->data[2]) + { + switch (sprite->data[1]) + { + case 0: + sprite->pos1.x++; + if ((sprite->data[0] % 4) == 0) + { + sprite->pos1.y++; + } + break; + case 1: + if ((sprite->data[0] % 2) != 0) + { + sprite->pos1.x++; + if ((sprite->pos1.x % 4) == 0) + { + sprite->pos1.y++; + } + } + break; + } + if (sprite->pos1.y > 0xa0) + { + DestroySprite(sprite); + } + } +} + +static void sub_8123F44(struct Sprite *sprite) +{ + if (sprite->data[0] == 0) + { + sprite->pos1.y += 16 + sprite->centerToCornerVecY; + } + if (++sprite->data[0] >= sprite->data[2]) + { + switch (sprite->data[1]) + { + case 0: + sprite->pos1.x--; + if ((sprite->data[0] % 4) == 0) + { + sprite->pos1.y--; + } + break; + case 1: + if ((sprite->data[0] % 2) != 0) + { + sprite->pos1.x--; + if ((sprite->pos1.x % 4) == 0) + { + sprite->pos1.y--; + } + } + break; + } + if (sprite->pos1.y < 0x50) + { + DestroySprite(sprite); + } + } +} + +static void sub_8123FBC(bool8 which) +{ + switch (which) + { + case FALSE: + default: + REG_WININ = 0; + REG_WINOUT = 0; + REG_WIN0H = 0; + REG_WIN1H = 0; + REG_WIN0V = 0; + REG_WIN1V = 0; + REG_DISPCNT = 0; + REG_BG3CNT = 0; + REG_BG2CNT = 0; + REG_BG1CNT = 0; + REG_BG0CNT = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BLDCNT = 0; + break; + case TRUE: + REG_WININ = 0; + REG_WINOUT = 0; + REG_WIN0H = 0; + REG_WIN1H = 0; + REG_WIN0V = 0; + REG_WIN1V = 0; + if (gSpecialVar_0x8004 == 0) + { + sCableCarPtr->unk_0014 = 0xb0; + sCableCarPtr->unk_0015 = 0x10; + sCableCarPtr->unk_000c = 0x00; + sCableCarPtr->unk_000d = 0x50; + sCableCarPtr->unk_0009 = 0; + sCableCarPtr->unk_0009 = 0; + } + else + { + sCableCarPtr->unk_0014 = 0x60; + sCableCarPtr->unk_0015 = 0xe8; + sCableCarPtr->unk_000c = 0x00; + sCableCarPtr->unk_000d = 0x04; + sCableCarPtr->unk_0009 = 0; + sCableCarPtr->unk_0009 = 0; + } + REG_BG3HOFS = sCableCarPtr->unk_0014; + REG_BG3VOFS = sCableCarPtr->unk_0015; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = sCableCarPtr->unk_000c; + REG_BG1VOFS = sCableCarPtr->unk_000d; + REG_BG0HOFS = sCableCarPtr->unk_0008; + REG_BG0VOFS = sCableCarPtr->unk_0009; + REG_BG0CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(28) | BGCNT_WRAP; + REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(29) | BGCNT_WRAP; + REG_BG2CNT = BGCNT_PRIORITY(3) | BGCNT_SCREENBASE(30) | BGCNT_WRAP; + REG_BG3CNT = BGCNT_PRIORITY(0) | BGCNT_SCREENBASE(31) | BGCNT_WRAP; + REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; + REG_BLDCNT = 0x3f00; + break; + } +} + +static void LoadSprites(void) +{ + u8 spriteId; + u8 i; + + u8 playerGraphicsIds[2] = { + MAP_OBJ_GFX_RIVAL_BRENDAN_NORMAL, + MAP_OBJ_GFX_RIVAL_MAY_NORMAL + }; + u16 rval = Random(); + u8 hikerGraphicsIds[4] = { + MAP_OBJ_GFX_HIKER, + MAP_OBJ_GFX_CAMPER, + MAP_OBJ_GFX_PICNICKER, + MAP_OBJ_GFX_POOCHYENA + }; + s16 hikerCoords[2][2] = { + { 0, 80 }, + { 240, 146 } + }; + u8 hikerMovementDelayTable[4] = { + 0, + 60, + 120, + 170 + }; + void (*callbacks[2])(struct Sprite *) = { + sub_8123EB8, + sub_8123F44 + }; + + switch (gSpecialVar_0x8004) + { + case 0: + default: + spriteId = AddPseudoFieldObject(playerGraphicsIds[gSaveBlock2.playerGender], sub_8123D98, 0xc8, 0x49, 0x66); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].oam.priority = 2; + gSprites[spriteId].pos2.x = 0x08; + gSprites[spriteId].pos2.y = 0x10; + gSprites[spriteId].data[0] = 0xc8; + gSprites[spriteId].data[1] = 0x49; + } + spriteId = CreateSprite(&gSpriteTemplate_8401D40[0], 0xb0, 0x2b, 0x67); + gSprites[spriteId].pos2.x = gSprites[spriteId].pos2.y = 0x20; + gSprites[spriteId].data[0] = 0xb0; + gSprites[spriteId].data[1] = 0x2b; + spriteId = CreateSprite(&gSpriteTemplate_8401D40[1], 0xc8, 0x63, 0x65); + gSprites[spriteId].pos2.x = 8; + gSprites[spriteId].pos2.y = 4; + gSprites[spriteId].data[0] = 0xc8; + gSprites[spriteId].data[1] = 0x63; + sCableCarPtr->unk_0002 = 7; + sCableCarPtr->unk_0004 = 0x15e; + sub_807C9B4(WEATHER_SUNNY); + break; + case 1: + CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x24, 0x18, 0x1a, 0x0c, 0x03); + spriteId = AddPseudoFieldObject(playerGraphicsIds[gSaveBlock2.playerGender], sub_8123D98, 0x80, 0x27, 0x66); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].oam.priority = 2; + gSprites[spriteId].pos2.x = 0x08; + gSprites[spriteId].pos2.y = 0x10; + gSprites[spriteId].data[0] = 0x80; + gSprites[spriteId].data[1] = 0x27; + } + spriteId = CreateSprite(&gSpriteTemplate_8401D40[0], 0x68, 0x09, 0x67); + gSprites[spriteId].pos2.x = gSprites[spriteId].pos2.y = 0x20; + gSprites[spriteId].data[0] = 0x68; + gSprites[spriteId].data[1] = 0x09; + spriteId = CreateSprite(&gSpriteTemplate_8401D40[1], 0x80, 0x41, 0x65); + gSprites[spriteId].pos2.x = 8; + gSprites[spriteId].pos2.y = 4; + gSprites[spriteId].data[0] = 0x80; + gSprites[spriteId].data[1] = 0x41; + sCableCarPtr->unk_0002 = 2; + sCableCarPtr->unk_0004 = 0x109; + sub_807C9B4(WEATHER_ASH); + break; + } + for (i = 0; i < 9; i++) + { + spriteId = CreateSprite(&gSpriteTemplate_8401D40[2], 16 * i + 0x60, 8 * i - 8, 0x68); + gSprites[spriteId].pos2.x = 8; + gSprites[spriteId].pos2.y = 8; + } + if ((rval % 64) == 0) + { + spriteId = AddPseudoFieldObject(hikerGraphicsIds[rval % 3], callbacks[gSpecialVar_0x8004], hikerCoords[gSpecialVar_0x8004][0], hikerCoords[gSpecialVar_0x8004][1], 0x6a); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].oam.priority = 2; + gSprites[spriteId].pos2.x = -gSprites[spriteId].centerToCornerVecX; + gSprites[spriteId].pos2.y = -gSprites[spriteId].centerToCornerVecY; + if (gSpecialVar_0x8004 == 0) + { + if (rval % 2) + { + StartSpriteAnim(&gSprites[spriteId], 6); + gSprites[spriteId].data[1] = 1; + gSprites[spriteId].pos1.y += 2; + } + else + { + StartSpriteAnim(&gSprites[spriteId], 7); + gSprites[spriteId].data[1] = 0; + } + } + else + { + if (rval % 2) + { + StartSpriteAnim(&gSprites[spriteId], 7); + gSprites[spriteId].data[1] = 1; + gSprites[spriteId].pos1.y += 2; + } + else + { + StartSpriteAnim(&gSprites[spriteId], 6); + gSprites[spriteId].data[1] = 0; + } + } + gSprites[spriteId].data[2] = hikerMovementDelayTable[rval % 4]; + } + } +} + +static void sub_812446C(void) +{ + u8 i; + u8 j; + u8 k; + u8 offset; + + for (i = 0, k = 0, offset = 0x24 * (sCableCarPtr->unk_001b + 2); i < 3; i++) + { + for (j = 0; j < 12; j++) + { + sCableCarPtr->unk_0022[i][j] = *(eCableCar2->mtChimneyTilemap + (offset++)); + sCableCarPtr->unk_0022[i + 3][j] = eCableCar2->mtChimneyTilemap[k]; + sCableCarPtr->unk_0022[i + 6][j] = (eCableCar2->mtChimneyTilemap + 0x24)[k]; + k++; + } + } + sCableCarPtr->unk_001b = (sCableCarPtr->unk_001b + 1) % 3; +} + +static void sub_812453C(void) +{ + sCableCarPtr->unk_001c = (sCableCarPtr->unk_001c + 1) % 0x60; + sCableCarPtr->unk_0008 = sCableCarPtr->unk_001f - sCableCarPtr->unk_001d; + sCableCarPtr->unk_0009 = sCableCarPtr->unk_0020 - sCableCarPtr->unk_001e; + sCableCarPtr->unk_001d++; + if ((sCableCarPtr->unk_001d % 4) == 0) + { + sCableCarPtr->unk_001e++; + } + if (sCableCarPtr->unk_001d > 16) + { + sub_81245F4(); + } +} + +static void sub_8124598(void) +{ + sCableCarPtr->unk_001c = (sCableCarPtr->unk_001c + 1) % 0x60; + sCableCarPtr->unk_0008 = sCableCarPtr->unk_001f + sCableCarPtr->unk_001d; + sCableCarPtr->unk_0009 = sCableCarPtr->unk_0020 + sCableCarPtr->unk_001e; + sCableCarPtr->unk_001d++; + if ((sCableCarPtr->unk_001d % 4) == 0) + { + sCableCarPtr->unk_001e++; + } + if (sCableCarPtr->unk_001d > 16) + { + sub_812476C(); + } +} + +static void sub_81245F4(void) +{ + u8 i = 0; + + sCableCarPtr->unk_001d = sCableCarPtr->unk_001e = 0; + sCableCarPtr->unk_001f = sCableCarPtr->unk_0008; + sCableCarPtr->unk_0020 = sCableCarPtr->unk_0009; + sCableCarPtr->unk_0019 = (sCableCarPtr->unk_0019 + 30) % 32; + sCableCarPtr->unk_0018 -= 2; + gUnknown_0203927A = (sCableCarPtr->unk_001a + 23) % 32; + for (i = 0; i < 9; i++) + { + gUnknown_02039278 = sCableCarPtr->unk_0019; + gUnknown_02039279 = (gUnknown_0203927A + i) % 32; + sCableCarPtr->unk_00fc[gUnknown_02039279][gUnknown_02039278] = sCableCarPtr->unk_0022[i][sCableCarPtr->unk_0018]; + gUnknown_02039278 = (gUnknown_02039278 + 1) % 32; + sCableCarPtr->unk_00fc[gUnknown_02039279][gUnknown_02039278] = sCableCarPtr->unk_0022[i][sCableCarPtr->unk_0018 + 1]; + } + gUnknown_02039278 = (sCableCarPtr->unk_0019 + 30) % 32; + CableCarUtil_FillWrapped(sCableCarPtr->unk_00fc, 0, gUnknown_02039278, 0, 2, 32); + if (sCableCarPtr->unk_0018 == 0) + { + sCableCarPtr->unk_001a = (sCableCarPtr->unk_001a + 29) % 32; + sCableCarPtr->unk_0018 = 12; + sub_812446C(); + gUnknown_02039278 = (sCableCarPtr->unk_001a + 1) % 32; + CableCarUtil_FillWrapped(sCableCarPtr->unk_00fc, 0, 0, gUnknown_02039278, 32, 9); + } +} + +static void sub_812476C(void) +{ + u8 i = 0; + + sCableCarPtr->unk_001d = sCableCarPtr->unk_001e = 0; + sCableCarPtr->unk_001f = sCableCarPtr->unk_0008; + sCableCarPtr->unk_0020 = sCableCarPtr->unk_0009; + sCableCarPtr->unk_0019 = (sCableCarPtr->unk_0019 + 2) % 32; + sCableCarPtr->unk_0018 += 2; + gUnknown_0203927D = sCableCarPtr->unk_001a; + for (i = 0; i < 9; i++) + { + gUnknown_0203927B = sCableCarPtr->unk_0019; + gUnknown_0203927C = (gUnknown_0203927D + i) % 32; + sCableCarPtr->unk_00fc[gUnknown_0203927C][gUnknown_0203927B] = sCableCarPtr->unk_0022[i][sCableCarPtr->unk_0018]; + gUnknown_0203927B = (gUnknown_0203927B + 1) % 32; + sCableCarPtr->unk_00fc[gUnknown_0203927C][gUnknown_0203927B] = sCableCarPtr->unk_0022[i][sCableCarPtr->unk_0018 + 1]; + } + gUnknown_0203927C = (sCableCarPtr->unk_001a + 23) % 32; + CableCarUtil_FillWrapped(sCableCarPtr->unk_00fc, 0, sCableCarPtr->unk_0019, gUnknown_0203927C, 2, 9); + if (sCableCarPtr->unk_0018 == 10) + { + sCableCarPtr->unk_001a = (sCableCarPtr->unk_001a + 3) % 32; + sCableCarPtr->unk_0018 = 0xfe; + sub_812446C(); + } +} + +static void sub_81248AC(u8 a0) +{ + switch (a0) + { + case 0: + default: + sCableCarPtr->unk_001b = 2; + sCableCarPtr->unk_0019 = 0; + sCableCarPtr->unk_001a = 20; + sCableCarPtr->unk_0018 = 12; + sub_812446C(); + sub_81245F4(); + break; + case 1: + sCableCarPtr->unk_001b = 2; + sCableCarPtr->unk_0019 = 28; + sCableCarPtr->unk_001a = 20; + sCableCarPtr->unk_0018 = 4; + sub_812446C(); + sub_812476C(); + break; + } + sCableCarPtr->unk_001c = 0; +} diff --git a/src/scene/contest_painting.c b/src/scene/contest_painting.c index 442d8ec26..0aa02312f 100644 --- a/src/scene/contest_painting.c +++ b/src/scene/contest_painting.c @@ -11,7 +11,7 @@ #include "string_util.h" #include "strings.h" #include "text.h" -#include "unknown_task.h" +#include "scanline_effect.h" #include "ewram.h" static u8 gUnknown_03000750; @@ -147,7 +147,7 @@ static void ShowContestPainting(void) switch (gMain.state) { case 0: - remove_some_task(); + ScanlineEffect_Stop(); SetVBlankCallback(NULL); gUnknown_03005E8C = &ewram15DE0; ContestPaintingInitVars(TRUE); @@ -156,23 +156,8 @@ static void ShowContestPainting(void) break; case 1: { - u8 *addr; - size_t size; - ResetPaletteFade(); - addr = (void *)VRAM; - size = 0x18000; - while (1) - { - DmaFill32(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill32(3, 0, addr, size); - break; - } - } + DmaFill32Large(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000); ResetSpriteData(); gMain.state++; break; @@ -243,8 +228,8 @@ static void HoldContestPainting(void) static void ContestPaintingInitWindow(u8 arg0) { - InitMenuWindow(&gWindowConfig_81E7160); - SetUpWindowConfig(&gWindowConfig_81E7160); + InitMenuWindow(&gWindowTemplate_81E7160); + Text_LoadWindowTemplate(&gWindowTemplate_81E7160); } static void ContestPaintingPrintCaption(u8 contestType, u8 arg1) @@ -291,7 +276,7 @@ static void ContestPaintingPrintCaption(u8 contestType, u8 arg1) xPos = 3; yPos = 14; } - MenuPrint_PixelCoords(gUnknown_03005E40, xPos * 8 + 1, yPos * 8, 1); + Menu_PrintTextPixelCoords(gUnknown_03005E40, xPos * 8 + 1, yPos * 8, 1); } static void ContestPaintingInitBG(void) diff --git a/src/scene/credits.c b/src/scene/credits.c index 17c1bf263..e31e2c797 100644 --- a/src/scene/credits.c +++ b/src/scene/credits.c @@ -474,8 +474,8 @@ void sub_81439D0(void) taskIdC = gTasks[taskIdA].data[TDA_TASK_C_ID]; gTasks[taskIdC].data[TDC_0] = 40; - SetUpWindowConfig(&gWindowConfig_81E7208); - InitMenuWindow(&gWindowConfig_81E7208); + Text_LoadWindowTemplate(&gWindowTemplate_81E7208); + InitMenuWindow(&gWindowTemplate_81E7208); LoadPalette(&gUnknown_0840B7BC, 0x80, sizeof(gUnknown_0840B7BC)); CpuCopy16(&gUnknown_0840B7FC, (void *)(VRAM + 0xBEE0), sizeof(gUnknown_0840B7FC)); @@ -857,7 +857,7 @@ static void task_b_81441B8(u8 taskIdB) case 5: if (!gPaletteFade.active) { - MenuZeroFillWindowRect(0, 9, 29, 19); + Menu_EraseWindowRect(0, 9, 29, 19); gTasks[taskIdB].data[TDB_0] = 2; } return; diff --git a/src/scene/cute_sketch.c b/src/scene/cute_sketch.c index 5317bc334..2af990290 100644 --- a/src/scene/cute_sketch.c +++ b/src/scene/cute_sketch.c @@ -29,6 +29,350 @@ void sub_80FD1C8(u16); u16 sub_80FD39C(u16*); u16 sub_80FD68C(u16*, u16*, u16*); +#if DEBUG + +__attribute__((naked)) +void debug_sub_8110CCC(void) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + mov r7, #0x0\n\ + mov r1, #0x0\n\ + ldr r2, ._5 @ gUnknown_083E79C0\n\ + ldr r6, ._5 + 4 @ \n\ +._7:\n\ + lsl r0, r1, #0x3\n\ + add r4, r0, r2\n\ + ldrh r0, [r6, #0x1c]\n\ + ldrh r3, [r4, #0x4]\n\ + cmp r0, r3\n\ + bne ._1 @cond_branch\n\ + ldrh r0, [r4, #0x6]\n\ + bl FlagGet\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._4 @cond_branch\n\ + ldrb r0, [r6, #0x1f]\n\ + ldr r1, [r4]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + bl StringLength\n\ + mov r1, #0xc\n\ + sub r1, r1, r0\n\ + lsl r1, r1, #0x10\n\ + lsr r5, r1, #0x10\n\ + cmp r1, #0\n\ + bge ._3 @cond_branch\n\ + mov r5, #0x0\n\ +._3:\n\ + mov r7, #0x1\n\ + mov r0, #0x10\n\ + mov r1, #0xe\n\ + mov r2, #0x1d\n\ + mov r3, #0x13\n\ + bl Menu_DrawStdWindowFrame\n\ + add r0, r6, #0\n\ + add r0, r0, #0x8\n\ + mov r1, #0x11\n\ + mov r2, #0xf\n\ + bl Menu_PrintText\n\ + ldrb r0, [r6, #0x1f]\n\ + ldr r1, [r4]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + add r1, r5, #0\n\ + add r1, r1, #0x11\n\ + lsl r1, r1, #0x18\n\ + lsr r1, r1, #0x18\n\ + mov r2, #0x11\n\ + bl Menu_PrintText\n\ + b ._4\n\ +._6:\n\ + .align 2, 0\n\ +._5:\n\ + .word gUnknown_083E79C0\n\ + .word +0x2000000\n\ +._1:\n\ + add r0, r1, #1\n\ + lsl r0, r0, #0x10\n\ + lsr r1, r0, #0x10\n\ + cmp r1, #0\n\ + beq ._7 @cond_branch\n\ +._4:\n\ + cmp r7, #0\n\ + bne ._8 @cond_branch\n\ + mov r0, #0x10\n\ + mov r1, #0x10\n\ + mov r2, #0x1d\n\ + mov r3, #0x13\n\ + bl Menu_DrawStdWindowFrame\n\ + ldr r0, ._9 @ \n\ + mov r1, #0x11\n\ + mov r2, #0x11\n\ + bl Menu_PrintText\n\ + mov r0, #0x10\n\ + mov r1, #0xe\n\ + mov r2, #0x1d\n\ + mov r3, #0xf\n\ + bl Menu_EraseWindowRect\n\ +._8:\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._10:\n\ + .align 2, 0\n\ +._9:\n\ + .word +0x2000008"); +} + +__attribute__((naked)) +void debug_sub_8110D84(void) +{ + asm("\ + push {r4, lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r0, ._13 @ \n\ + ldrh r0, [r0, #0x4]\n\ + cmp r0, #0x7\n\ + bls ._11 @cond_branch\n\ + b ._65\n\ +._11:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._13 + 4 @ \n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._14:\n\ + .align 2, 0\n\ +._13:\n\ + .word +0x2000000\n\ + .word ._15\n\ +._15:\n\ + .word ._16\n\ + .word ._17\n\ + .word ._18\n\ + .word ._19\n\ + .word ._20\n\ + .word ._21\n\ + .word ._22\n\ + .word ._23\n\ +._16:\n\ + mov r0, #0x1\n\ + neg r0, r0\n\ + mov r1, #0x0\n\ + str r1, [sp]\n\ + mov r2, #0x10\n\ + mov r3, #0x0\n\ + bl BeginNormalPaletteFade\n\ + ldr r1, ._25 @ \n\ + ldrh r0, [r1, #0x4]\n\ + add r0, r0, #0x1\n\ + b ._62\n\ +._26:\n\ + .align 2, 0\n\ +._25:\n\ + .word +0x2000000\n\ +._17:\n\ + bl UpdatePaletteFade\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._27 @cond_branch\n\ + b ._65\n\ +._27:\n\ + ldr r1, ._30 @ \n\ + ldrh r0, [r1, #0x4]\n\ + add r0, r0, #0x1\n\ + b ._62\n\ +._31:\n\ + .align 2, 0\n\ +._30:\n\ + .word +0x2000000\n\ +._18:\n\ + bl sub_80FAB60\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x3\n\ + beq ._32 @cond_branch\n\ + cmp r0, #0x3\n\ + bgt ._33 @cond_branch\n\ + b ._65\n\ +._33:\n\ + cmp r0, #0x4\n\ + beq ._35 @cond_branch\n\ + cmp r0, #0x5\n\ + beq ._36 @cond_branch\n\ + b ._65\n\ +._35:\n\ + ldr r4, ._41 @ \n\ + ldrb r0, [r4, #0x1e]\n\ + cmp r0, #0\n\ + bne ._38 @cond_branch\n\ + b ._65\n\ +._38:\n\ + mov r0, #0x5\n\ + bl m4aSongNumStart\n\ + ldr r1, ._41 + 4 @ \n\ + add r0, r4, r1\n\ + mov r1, #0x1\n\ + strb r1, [r0]\n\ + ldr r0, ._41 + 8 @ \n\ + bl sub_80FC244\n\ + b ._65\n\ +._42:\n\ + .align 2, 0\n\ +._41:\n\ + .word +0x2000000\n\ + .word 0xa6e\n\ + .word sub_80FC69C+1\n\ +._36:\n\ + mov r0, #0x5\n\ + bl m4aSongNumStart\n\ + mov r0, #0x1\n\ + neg r0, r0\n\ + mov r1, #0x0\n\ + str r1, [sp]\n\ + mov r2, #0x0\n\ + mov r3, #0x10\n\ + bl BeginNormalPaletteFade\n\ + ldr r1, ._44 @ \n\ + ldrh r0, [r1, #0x4]\n\ + add r0, r0, #0x1\n\ + b ._62\n\ +._45:\n\ + .align 2, 0\n\ +._44:\n\ + .word +0x2000000\n\ +._19:\n\ + bl UpdatePaletteFade\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._65 @cond_branch\n\ + ldr r0, ._48 @ sub_805469C\n\ + bl SetMainCallback2\n\ + b ._65\n\ +._49:\n\ + .align 2, 0\n\ +._48:\n\ + .word sub_805469C+1\n\ +._20:\n\ + bl sub_80FAB60\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._50 @cond_branch\n\ +._32:\n\ + bl debug_sub_8110CCC\n\ + b ._65\n\ +._50:\n\ + ldr r0, ._54 @ gMain\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._65 @cond_branch\n\ + bl sub_80FBCA0\n\ + bl sub_80FAEC4\n\ + ldr r1, ._54 + 4 @ \n\ + ldrh r0, [r1, #0x4]\n\ + add r0, r0, #0x1\n\ + b ._62\n\ +._55:\n\ + .align 2, 0\n\ +._54:\n\ + .word gMain\n\ + .word +0x2000000\n\ +._21:\n\ + bl sub_80FAFC0\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._65 @cond_branch\n\ + mov r0, #0x0\n\ + mov r1, #0x0\n\ + bl CreateRegionMapCursor\n\ + ldr r1, ._58 @ \n\ + ldrh r0, [r1, #0x4]\n\ + add r0, r0, #0x1\n\ + b ._62\n\ +._59:\n\ + .align 2, 0\n\ +._58:\n\ + .word +0x2000000\n\ +._22:\n\ + bl sub_80FAB60\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._60 @cond_branch\n\ + bl debug_sub_8110CCC\n\ +._60:\n\ + ldr r0, ._63 @ gMain\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._65 @cond_branch\n\ + bl sub_80FBCA0\n\ + bl sub_80FAEC4\n\ + ldr r1, ._63 + 4 @ \n\ + ldrh r0, [r1, #0x4]\n\ + add r0, r0, #0x1\n\ + b ._62\n\ +._64:\n\ + .align 2, 0\n\ +._63:\n\ + .word gMain\n\ + .word +0x2000000\n\ +._23:\n\ + bl sub_80FAFC0\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._65 @cond_branch\n\ + mov r0, #0x0\n\ + mov r1, #0x0\n\ + bl CreateRegionMapCursor\n\ + ldr r1, ._66 @ \n\ + mov r0, #0x3\n\ +._62:\n\ + strh r0, [r1, #0x4]\n\ +._65:\n\ + add sp, sp, #0x4\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ +._67:\n\ + .align 2, 0\n\ +._66:\n\ + .word +0x2000000"); +} + +__attribute__((naked)) +void debug_sub_8110F28(void) +{ + asm("\ + push {lr}\n\ + bl CB2_InitFlyRegionMap\n\ + ldr r0, ._69 @ gMain\n\ + ldr r1, [r0, #0x4]\n\ + ldr r0, ._69 + 4 @ CB2_FlyRegionMap\n\ + cmp r1, r0\n\ + bne ._68 @cond_branch\n\ + bl sub_80FBF94\n\ + ldr r0, ._69 + 8 @ debug_sub_8110D84\n\ + bl sub_80FC244\n\ + bl debug_sub_8110CCC\n\ +._68:\n\ + pop {r0}\n\ + bx r0\n\ +._70:\n\ + .align 2, 0\n\ +._69:\n\ + .word gMain\n\ + .word CB2_FlyRegionMap+1\n\ + .word debug_sub_8110D84+1"); +} + +#endif + void sub_80FC7A0(struct Unk03005E20* info) { gUnknown_03005DEC = info->var_4; diff --git a/src/scene/egg_hatch.c b/src/scene/egg_hatch.c index c0111de7d..282ad31fb 100644 --- a/src/scene/egg_hatch.c +++ b/src/scene/egg_hatch.c @@ -471,10 +471,10 @@ static void CB2_EggHatch_0(void) gSpecialVar_0x8005 = GetCurrentMapMusic(); break; case 1: - SetUpWindowConfig(&gWindowConfig_81E6F84); - InitWindowFromConfig(&gEggHatchData->window, &gWindowConfig_81E6F84); - gEggHatchData->tileDataStartOffset = SetTextWindowBaseTileNum(20); - LoadTextWindowGraphics(&gEggHatchData->window); + Text_LoadWindowTemplate(&gWindowTemplate_81E6F84); + Text_InitWindowWithTemplate(&gEggHatchData->window, &gWindowTemplate_81E6F84); + gEggHatchData->tileDataStartOffset = TextWindow_SetBaseTileNum(20); + TextWindow_LoadStdFrameGraphics(&gEggHatchData->window); gMain.state++; break; case 2: @@ -504,35 +504,11 @@ static void CB2_EggHatch_0(void) gMain.state++; break; case 7: - { - u32 offsetRead, offsetWrite; - u32 offsetRead2, offsetWrite2; - u32 size; - - REG_BG2CNT = 0x4C06; - LoadPalette(gUnknown_0820C9F8, 0x10, 0xA0); - - offsetRead = (u32)(&gUnknown_0820CA98); - offsetWrite = (VRAM + 0x4000); - size = 0x1300; - while (TRUE) - { - DmaCopy16(3, offsetRead, (void *) (offsetWrite), 0x1000); - offsetRead += 0x1000; - offsetWrite += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaCopy16(3, offsetRead, (void *) (offsetWrite), size); - break; - } - } - - offsetRead2 = (u32)(&gUnknown_0820F798); - offsetWrite2 = (u32)(VRAM + 0x6000); - DmaCopy16(3, offsetRead2, (void*)(offsetWrite2), 0x1000); - gMain.state++; - } + REG_BG2CNT = 0x4C06; + LoadPalette(gUnknown_0820C9F8, 0x10, 0xA0); + DmaCopyLarge16(3, gUnknown_0820CA98, (void *)(VRAM + 0x4000), 0x1300, 0x1000); + DmaCopy16Defvars(3, gUnknown_0820F798, (void *)(VRAM + 0x6000), 0x1000); + gMain.state++; break; case 8: REG_BG1CNT = 0x501; @@ -625,7 +601,7 @@ static void CB2_EggHatch_1(void) case 8: if (EggHatchUpdateWindowText()) { - MenuDrawTextWindow(22, 8, 27, 13); + Menu_DrawStdWindowFrame(22, 8, 27, 13); InitYesNoMenu(22, 8, 4); gEggHatchData->CB2_state++; } @@ -633,7 +609,7 @@ static void CB2_EggHatch_1(void) case 9: { s8 menuInput; - if ((menuInput = ProcessMenuInputNoWrap_()) != -2) + if ((menuInput = Menu_ProcessInputNoWrap_()) != -2) { if (menuInput != -1 && menuInput != 1) { @@ -848,15 +824,15 @@ static void CreateEggShardSprite(u8 x, u8 y, s16 data1, s16 data2, s16 data3, u8 static void EggHatchPrintMessage1(u8* src) { - sub_8002EB0(&gEggHatchData->window, src, gEggHatchData->tileDataStartOffset, 3, 15); + Text_InitWindow8002EB0(&gEggHatchData->window, src, gEggHatchData->tileDataStartOffset, 3, 15); } static void EggHatchPrintMessage2(u8* src) { - sub_8003460(&gEggHatchData->window, src, gEggHatchData->tileDataStartOffset, 3, 15); + Text_InitWindowAndPrintText(&gEggHatchData->window, src, gEggHatchData->tileDataStartOffset, 3, 15); } static bool8 EggHatchUpdateWindowText(void) { - return sub_80035AC(&gEggHatchData->window); + return Text_UpdateWindow(&gEggHatchData->window); } diff --git a/src/scene/evolution_scene.c b/src/scene/evolution_scene.c index f307f5979..3ba325574 100644 --- a/src/scene/evolution_scene.c +++ b/src/scene/evolution_scene.c @@ -9,7 +9,7 @@ #include "pokemon.h" #include "string_util.h" #include "battle.h" -#include "unknown_task.h" +#include "scanline_effect.h" #include "data2.h" #include "decompress.h" #include "m4a.h" @@ -65,14 +65,14 @@ void nullsub_6(void); bool32 IsHMMove2(u16 move); extern struct Window gUnknown_03004210; -extern u16 gUnknown_030042A4; -extern u16 gUnknown_030042A0; +extern u16 gBattle_BG0_X; +extern u16 gBattle_BG0_Y; extern u16 gBattle_BG1_X; extern u16 gBattle_BG1_Y; extern u16 gBattle_BG2_X; extern u16 gBattle_BG2_Y; -extern u16 gUnknown_030041B0; -extern u16 gUnknown_030041B8; +extern u16 gBattle_BG3_X; +extern u16 gBattle_BG3_Y; extern u8 gBattleTerrain; extern u8 gReservedSpritePaletteCount; extern u16 gMoveToLearn; @@ -88,8 +88,7 @@ extern u8 gBattleCommunication[]; extern const u8 BattleText_StartEvo[]; extern const u8 BattleText_FinishEvo[]; extern const u8 BattleText_StopEvo[]; -extern void * const gUnknown_081FAF4C[]; -extern const u8* const gBattleStringsTable[]; +extern const u8 *const gBattleStringsTable[]; // this file's functions static void Task_EvolutionScene(u8 taskID); @@ -197,25 +196,25 @@ void EvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, bool8 canStopEvo, REG_WININ = 0; REG_WINOUT = 0; - SetUpWindowConfig(&gWindowConfig_81E6C58); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C58); ResetPaletteFade(); - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; gBattle_BG1_X = 0; gBattle_BG1_Y = 0; gBattle_BG2_X = 0; gBattle_BG2_Y = 0; - gUnknown_030041B0 = 256; - gUnknown_030041B8 = 0; + gBattle_BG3_X = 256; + gBattle_BG3_Y = 0; - InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6C58); + Text_InitWindowWithTemplate(&gUnknown_03004210, &gWindowTemplate_81E6C58); gBattleTerrain = BATTLE_TERRAIN_PLAIN; sub_800D6D4(); sub_800DAB8(); ResetSpriteData(); - remove_some_task(); + ScanlineEffect_Stop(); ResetTasks(); FreeAllSpritePalettes(); @@ -306,18 +305,18 @@ static void CB2_EvolutionSceneLoadGraphics(void) REG_WIN1V = 0; REG_WININ = 0; REG_WINOUT = 0; - SetUpWindowConfig(&gWindowConfig_81E6C58); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C58); ResetPaletteFade(); - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; gBattle_BG1_X = 0; gBattle_BG1_Y = 0; gBattle_BG2_X = 0; gBattle_BG2_Y = 0; - gUnknown_030041B0 = 256; - gUnknown_030041B8 = 0; + gBattle_BG3_X = 256; + gBattle_BG3_Y = 0; - InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6C58); + Text_InitWindowWithTemplate(&gUnknown_03004210, &gWindowTemplate_81E6C58); gBattleTerrain = BATTLE_TERRAIN_PLAIN; sub_800D6D4(); @@ -362,26 +361,26 @@ static void CB2_TradeEvolutionSceneLoadGraphics(void) ResetSpriteData(); FreeAllSpritePalettes(); gReservedSpritePaletteCount = 4; - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; gBattle_BG1_X = 0; gBattle_BG1_Y = 0; gBattle_BG2_X = 0; gBattle_BG2_Y = 0; - gUnknown_030041B0 = 256; - gUnknown_030041B8 = 0; + gBattle_BG3_X = 256; + gBattle_BG3_Y = 0; gMain.state++; break; case 1: - SetUpWindowConfig(&gWindowConfig_81E6F84); - InitWindowFromConfig(&gUnknown_03004828->window, &gWindowConfig_81E6F84); + Text_LoadWindowTemplate(&gWindowTemplate_81E6F84); + Text_InitWindowWithTemplate(&gUnknown_03004828->window, &gWindowTemplate_81E6F84); gMain.state++; break; case 2: - LoadTextWindowGraphics(&gUnknown_03004828->window); - gUnknown_03004828->textWindowBaseTileNum = SetTextWindowBaseTileNum(2); - LoadTextWindowGraphics(&gUnknown_03004828->window); - MenuZeroFillScreen(); + TextWindow_LoadStdFrameGraphics(&gUnknown_03004828->window); + gUnknown_03004828->textWindowBaseTileNum = TextWindow_SetBaseTileNum(2); + TextWindow_LoadStdFrameGraphics(&gUnknown_03004828->window); + Menu_EraseScreen(); ResetPaletteFade(); gMain.state++; SetHBlankCallback(EvoDummyFunc); @@ -481,7 +480,7 @@ static void CB2_EvolutionSceneUpdate(void) { AnimateSprites(); BuildOamBuffer(); - sub_800374C(&gUnknown_03004210); + Text_UpdateWindowInBattle(&gUnknown_03004210); UpdatePaletteFade(); RunTasks(); } @@ -490,7 +489,7 @@ static void CB2_TradeEvolutionSceneUpdate(void) { AnimateSprites(); BuildOamBuffer(); - sub_80035AC(&gUnknown_03004828->window); + Text_UpdateWindow(&gUnknown_03004828->window); UpdatePaletteFade(); RunTasks(); } @@ -498,35 +497,31 @@ static void CB2_TradeEvolutionSceneUpdate(void) static void CreateShedinja(u16 preEvoSpecies, struct Pokemon* mon) { u32 data = 0; - if (gEvolutionTable[preEvoSpecies].evolutions[0].method == EVO_LEVEL_NINJASK && gPlayerPartyCount < 6) + + if (gEvolutionTable[preEvoSpecies][0].method == EVO_LEVEL_NINJASK && gPlayerPartyCount < 6) { s32 i; struct Pokemon* Shedinja = &gPlayerParty[gPlayerPartyCount]; - const struct EvolutionData* EvoTable; - const struct EvolutionData* Evos; CopyMon(Shedinja, mon, sizeof(struct Pokemon)); - SetMonData(Shedinja, MON_DATA_SPECIES, (void*)(&gEvolutionTable[preEvoSpecies].evolutions[1].targetSpecies)); - SetMonData(Shedinja, MON_DATA_NICKNAME, (void*)(gSpeciesNames[gEvolutionTable[preEvoSpecies].evolutions[1].targetSpecies])); - SetMonData(Shedinja, MON_DATA_HELD_ITEM, (void*)(&data)); - SetMonData(Shedinja, MON_DATA_MARKINGS, (void*)(&data)); - SetMonData(Shedinja, MON_DATA_10, (void*)(&data)); + SetMonData(Shedinja, MON_DATA_SPECIES, (void*)&gEvolutionTable[preEvoSpecies][1].targetSpecies); + SetMonData(Shedinja, MON_DATA_NICKNAME, (void*)gSpeciesNames[gEvolutionTable[preEvoSpecies][1].targetSpecies]); + SetMonData(Shedinja, MON_DATA_HELD_ITEM, (void*)&data); + SetMonData(Shedinja, MON_DATA_MARKINGS, (void*)&data); + SetMonData(Shedinja, MON_DATA_10, (void*)&data); for (i = MON_DATA_COOL_RIBBON; i < MON_DATA_COOL_RIBBON + 5; i++) - SetMonData(Shedinja, i, (void*)(&data)); + SetMonData(Shedinja, i, (void*)&data); for (i = MON_DATA_CHAMPION_RIBBON; i <= MON_DATA_FATEFUL_ENCOUNTER; i++) - SetMonData(Shedinja, i, (void*)(&data)); - SetMonData(Shedinja, MON_DATA_STATUS, (void*)(&data)); + SetMonData(Shedinja, i, (void*)&data); + SetMonData(Shedinja, MON_DATA_STATUS, (void*)&data); data = 0xFF; - SetMonData(Shedinja, MON_DATA_MAIL, (void*)(&data)); + SetMonData(Shedinja, MON_DATA_MAIL, (void*)&data); CalculateMonStats(Shedinja); CalculatePlayerPartyCount(); - // can't match it otherwise, ehh - EvoTable = gEvolutionTable; - Evos = EvoTable + preEvoSpecies; - GetSetPokedexFlag(SpeciesToNationalPokedexNum(Evos->evolutions[1].targetSpecies), 2); - GetSetPokedexFlag(SpeciesToNationalPokedexNum(Evos->evolutions[1].targetSpecies), 3); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gEvolutionTable[preEvoSpecies][1].targetSpecies), 2); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gEvolutionTable[preEvoSpecies][1].targetSpecies), 3); if (GetMonData(Shedinja, MON_DATA_SPECIES) == SPECIES_SHEDINJA && GetMonData(Shedinja, MON_DATA_LANGUAGE) == LANGUAGE_JAPANESE @@ -558,7 +553,7 @@ static void Task_EvolutionScene(u8 taskID) if (!gPaletteFade.active) { StringExpandPlaceholders(gStringVar4, BattleText_StartEvo); - sub_8002EB0(&gUnknown_03004210, gStringVar4, 144, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004210, gStringVar4, 144, 2, 15); gTasks[taskID].tState++; } break; @@ -646,7 +641,7 @@ static void Task_EvolutionScene(u8 taskID) if (IsCryFinished() && !gPaletteFade.active) { StringExpandPlaceholders(gStringVar4, BattleText_FinishEvo); - sub_8002EB0(&gUnknown_03004210, gStringVar4, 144, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004210, gStringVar4, 144, 2, 15); PlayBGM(BGM_FANFA5); gTasks[taskID].tState++; SetMonData(mon, MON_DATA_SPECIES, (void*)(&gTasks[taskID].tPostEvoSpecies)); @@ -654,7 +649,7 @@ static void Task_EvolutionScene(u8 taskID) EvolutionRenameMon(mon, gTasks[taskID].tPreEvoSpecies, gTasks[taskID].tPostEvoSpecies); GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskID].tPostEvoSpecies), 2); GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskID].tPostEvoSpecies), 3); - IncrementGameStat(14); + IncrementGameStat(GAME_STAT_EVOLVED_POKEMON); } break; case 14: // check if it wants to learn a new move @@ -715,7 +710,7 @@ static void Task_EvolutionScene(u8 taskID) if (IsCryFinished()) { StringExpandPlaceholders(gStringVar4, BattleText_StopEvo); - sub_8002EB0(&gUnknown_03004210, gStringVar4, 144, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004210, gStringVar4, 144, 2, 15); gTasks[taskID].tEvoWasStopped = TRUE; gTasks[taskID].tState = 14; } @@ -726,7 +721,7 @@ static void Task_EvolutionScene(u8 taskID) sub_8024CEC(); PlayFanfare(BGM_FANFA1); StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[3]); - sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); gTasks[taskID].tLearnsFirstMove = 0x40; // re-used as a counter gTasks[taskID].tState++; } @@ -743,7 +738,7 @@ static void Task_EvolutionScene(u8 taskID) { sub_8024CEC(); StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[4]); - sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); gTasks[taskID].tLearnMoveState++; } break; @@ -751,7 +746,7 @@ static void Task_EvolutionScene(u8 taskID) if (gUnknown_03004210.state == 0 && !IsSEPlaying()) { StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[5]); - sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); gTasks[taskID].tLearnMoveState++; } break; @@ -761,7 +756,7 @@ static void Task_EvolutionScene(u8 taskID) if (!IsSEPlaying()) { StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[6]); - sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); gTasks[taskID].tData9 = 5; gTasks[taskID].tdata10 = 9; gTasks[taskID].tLearnMoveState++; @@ -794,7 +789,7 @@ static void Task_EvolutionScene(u8 taskID) { sub_8023AD8(); StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[292]); - sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); PlaySE(SE_SELECT); if (sEvoCursorPos != 0) gTasks[taskID].tLearnMoveState = gTasks[taskID].tdata10; @@ -809,7 +804,7 @@ static void Task_EvolutionScene(u8 taskID) { sub_8023AD8(); StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[292]); - sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); PlaySE(SE_SELECT); gTasks[taskID].tLearnMoveState = gTasks[taskID].tdata10; } @@ -835,7 +830,7 @@ static void Task_EvolutionScene(u8 taskID) if (IsHMMove2(move)) { StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[307]); - sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); gTasks[taskID].tLearnMoveState = 11; } else @@ -848,7 +843,7 @@ static void Task_EvolutionScene(u8 taskID) RemoveMonPPBonus(mon, var); SetMonMoveSlot(mon, gMoveToLearn, var); StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[207]); - sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); gTasks[taskID].tLearnMoveState++; } } @@ -858,7 +853,7 @@ static void Task_EvolutionScene(u8 taskID) if (gUnknown_03004210.state == 0 && !IsSEPlaying()) { StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[7]); - sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); gTasks[taskID].tLearnMoveState++; } break; @@ -866,20 +861,20 @@ static void Task_EvolutionScene(u8 taskID) if (gUnknown_03004210.state == 0 && !IsSEPlaying()) { StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[208]); - sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); gTasks[taskID].tState = 19; } break; case 9: StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[8]); - sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); gTasks[taskID].tData9 = 10; gTasks[taskID].tdata10 = 0; gTasks[taskID].tLearnMoveState = 3; break; case 10: StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[9]); - sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); gTasks[taskID].tState = 14; break; case 11: @@ -900,7 +895,7 @@ static void Task_TradeEvolutionScene(u8 taskID) { case 0: StringExpandPlaceholders(gStringVar4, BattleText_StartEvo); - sub_8002EB0(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); gTasks[taskID].tState++; break; case 1: @@ -988,7 +983,7 @@ static void Task_TradeEvolutionScene(u8 taskID) if (IsCryFinished() && !gPaletteFade.active) { StringExpandPlaceholders(gStringVar4, BattleText_FinishEvo); - sub_8002EB0(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); PlayFanfare(BGM_FANFA5); gTasks[taskID].tState++; SetMonData(mon, MON_DATA_SPECIES, (void*)(&gTasks[taskID].tPostEvoSpecies)); @@ -996,7 +991,7 @@ static void Task_TradeEvolutionScene(u8 taskID) EvolutionRenameMon(mon, gTasks[taskID].tPreEvoSpecies, gTasks[taskID].tPostEvoSpecies); GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskID].tPostEvoSpecies), 2); GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskID].tPostEvoSpecies), 3); - IncrementGameStat(14); + IncrementGameStat(GAME_STAT_EVOLVED_POKEMON); } break; case 13: @@ -1022,7 +1017,7 @@ static void Task_TradeEvolutionScene(u8 taskID) else { PlayBGM(BGM_SHINKA); - sub_8002EB0(&gUnknown_03004828->window, gOtherText_LinkStandby2, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004828->window, gOtherText_LinkStandby2, gUnknown_03004828->textWindowBaseTileNum, 2, 15); gTasks[taskID].tState++; } } @@ -1040,7 +1035,7 @@ static void Task_TradeEvolutionScene(u8 taskID) sub_8024CEC(); PlayFanfare(BGM_FANFA1); StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[3]); - sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); gTasks[taskID].tLearnsFirstMove = 0x40; // re-used as a counter gTasks[taskID].tState++; } @@ -1057,7 +1052,7 @@ static void Task_TradeEvolutionScene(u8 taskID) { sub_8024CEC(); StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[4]); - sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); gTasks[taskID].tLearnMoveState++; } break; @@ -1065,7 +1060,7 @@ static void Task_TradeEvolutionScene(u8 taskID) if (gUnknown_03004828->window.state == 0 && !IsSEPlaying()) { StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[5]); - sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); gTasks[taskID].tLearnMoveState++; } break; @@ -1075,7 +1070,7 @@ static void Task_TradeEvolutionScene(u8 taskID) if (!IsSEPlaying()) { StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[6]); - sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); gTasks[taskID].tData9 = 5; gTasks[taskID].tdata10 = 9; gTasks[taskID].tLearnMoveState++; @@ -1083,11 +1078,11 @@ static void Task_TradeEvolutionScene(u8 taskID) case 3: if (gUnknown_03004828->window.state == 0 && !IsSEPlaying()) { - DrawTextWindow(&gUnknown_03004828->window, 24, 8, 29, 13); + TextWindow_DrawStdFrame(&gUnknown_03004828->window, 24, 8, 29, 13); sEvoCursorPos = 0; - InitWindow(&gUnknown_03004828->window, gOtherText_YesNoAndPlayer, gUnknown_03004828->textWindowBaseTileNum + 128, 25, 9); - sub_8002F44(&gUnknown_03004828->window); - sub_814A5C0(0, 0xFFFF, 0xC, 0x2D9F, 0x20); + Text_InitWindow(&gUnknown_03004828->window, gOtherText_YesNoAndPlayer, gUnknown_03004828->textWindowBaseTileNum + 128, 25, 9); + Text_PrintWindow8002F44(&gUnknown_03004828->window); + MenuCursor_Create814A5C0(0, 0xFFFF, 0xC, 0x2D9F, 0x20); sub_81150D8(); gTasks[taskID].tLearnMoveState++; sEvoCursorPos = 0; @@ -1110,10 +1105,10 @@ static void Task_TradeEvolutionScene(u8 taskID) } if (gMain.newKeys & A_BUTTON) { - ZeroFillWindowRect(&gUnknown_03004828->window, 0x18, 8, 0x1D, 0xD); + Text_EraseWindowRect(&gUnknown_03004828->window, 0x18, 8, 0x1D, 0xD); DestroyMenuCursor(); StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[292]); - sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); PlaySE(SE_SELECT); if (sEvoCursorPos != 0) gTasks[taskID].tLearnMoveState = gTasks[taskID].tdata10; @@ -1126,10 +1121,10 @@ static void Task_TradeEvolutionScene(u8 taskID) } if (gMain.newKeys & B_BUTTON) { - ZeroFillWindowRect(&gUnknown_03004828->window, 0x18, 8, 0x1D, 0xD); + Text_EraseWindowRect(&gUnknown_03004828->window, 0x18, 8, 0x1D, 0xD); DestroyMenuCursor(); StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[292]); - sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); PlaySE(SE_SELECT); gTasks[taskID].tLearnMoveState = gTasks[taskID].tdata10; } @@ -1155,7 +1150,7 @@ static void Task_TradeEvolutionScene(u8 taskID) if (IsHMMove2(move)) { StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[307]); - sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); gTasks[taskID].tLearnMoveState = 11; } else @@ -1168,7 +1163,7 @@ static void Task_TradeEvolutionScene(u8 taskID) RemoveMonPPBonus(mon, var); SetMonMoveSlot(mon, gMoveToLearn, var); StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[207]); - sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); gTasks[taskID].tLearnMoveState++; } } @@ -1178,7 +1173,7 @@ static void Task_TradeEvolutionScene(u8 taskID) if (gUnknown_03004828->window.state == 0 && !IsSEPlaying()) { StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[7]); - sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); gTasks[taskID].tLearnMoveState++; } break; @@ -1186,20 +1181,20 @@ static void Task_TradeEvolutionScene(u8 taskID) if (gUnknown_03004828->window.state == 0 && !IsSEPlaying()) { StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[208]); - sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); gTasks[taskID].tState = 15; } break; case 9: StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[8]); - sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); gTasks[taskID].tData9 = 10; gTasks[taskID].tdata10 = 0; gTasks[taskID].tLearnMoveState = 3; break; case 10: StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[9]); - sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); gTasks[taskID].tState = 13; break; case 11: @@ -3923,39 +3918,39 @@ static void EvoDummyFunc(void) static void VBlankCB_EvolutionScene(void) { REG_BG0CNT = BGCNT_SCREENBASE(24) | BGCNT_16COLOR | BGCNT_TXT256x256 | BGCNT_AFF512x512 | BGCNT_PRIORITY(3); // 0x9803 - REG_BG0HOFS = gUnknown_030042A4; - REG_BG0VOFS = gUnknown_030042A0; + REG_BG0HOFS = gBattle_BG0_X; + REG_BG0VOFS = gBattle_BG0_Y; REG_BG1HOFS = gBattle_BG1_X; REG_BG1VOFS = gBattle_BG1_Y; REG_BG2HOFS = gBattle_BG2_X; REG_BG2VOFS = gBattle_BG2_Y; - REG_BG3HOFS = gUnknown_030041B0; - REG_BG3VOFS = gUnknown_030041B8; + REG_BG3HOFS = gBattle_BG3_X; + REG_BG3VOFS = gBattle_BG3_Y; LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); - sub_8089668(); + ScanlineEffect_InitHBlankDmaTransfer(); } static void VBlankCB_TradeEvolutionScene(void) { - REG_BG0HOFS = gUnknown_030042A4; - REG_BG0VOFS = gUnknown_030042A0; + REG_BG0HOFS = gBattle_BG0_X; + REG_BG0VOFS = gBattle_BG0_Y; REG_BG1HOFS = gBattle_BG1_X; REG_BG1VOFS = gBattle_BG1_Y; REG_BG2HOFS = gBattle_BG2_X; REG_BG2VOFS = gBattle_BG2_Y; - REG_BG3HOFS = gUnknown_030041B0; - REG_BG3VOFS = gUnknown_030041B8; + REG_BG3HOFS = gBattle_BG3_X; + REG_BG3VOFS = gBattle_BG3_Y; LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); - sub_8089668(); + ScanlineEffect_InitHBlankDmaTransfer(); } static void sub_81150D8(void) { - sub_814A880(200, 72 + (sEvoCursorPos * 16)); + MenuCursor_SetPos814A880(200, 72 + (sEvoCursorPos * 16)); } static void EvoDummyFunc2(void) diff --git a/src/scene/hall_of_fame.c b/src/scene/hall_of_fame.c index 1751ee99c..2b790e97d 100644 --- a/src/scene/hall_of_fame.c +++ b/src/scene/hall_of_fame.c @@ -16,7 +16,11 @@ #include "data2.h" #include "decompress.h" #include "random.h" +#include "scanline_effect.h" #include "trig.h" +#include "hof_pc.h" +#include "credits.h" +#include "pc_screen_effect.h" #include "ewram.h" static EWRAM_DATA u32 sUnknown_0203931C = 0; @@ -87,16 +91,6 @@ static u32 HallOfFame_LoadPokemonPic(u16 species, s16 posX, s16 posY, u16 pokeID static u32 HallOfFame_LoadTrainerPic(u16 trainerPicID, s16 posX, s16 posY, u16 a3); static bool8 sub_81438C4(void); -// functions from different files -void sub_81439D0(void); -void sub_80C5CD4(void*); // ? -void sub_80C5E38(void*); // ? -bool8 sub_80C5DCC(void); -bool8 sub_80C5F98(void); -void ReturnFromHallOfFamePC(void); -u16 SpeciesToPokedexNum(u16 species); -void remove_some_task(void); - // data and gfx static const struct CompressedSpriteSheet sHallOfFame_ConfettiSpriteSheet = @@ -130,9 +124,9 @@ static const s16 sHallOfFame_MonsHalfTeamPositions[3][4] = {-41, 214, 184, 64} }; -static const struct HallofFameMon sDummyFameMon = -{ - 0x3EA03EA, 0, 0, 0, {0} +static const struct PCScreenEffectStruct sPCScreenEffectTemplate = { + .tileTag = 0x3ea, + .paletteTag = 0x3ea }; static const u8 sUnused2[6] = {2, 1, 3, 6, 4, 5}; @@ -539,7 +533,7 @@ static void sub_814217C(u8 taskID) ewram1E000(i) = 0; } else - sub_8125EC8(3); + Save_LoadGameData(SAVE_HALL_OF_FAME); for (i = 0; i < HALL_OF_FAME_MAX_TEAMS; i++, lastSavedTeam++) { @@ -558,15 +552,15 @@ static void sub_814217C(u8 taskID) lastSavedTeam--; } *lastSavedTeam = *fameMons; - MenuDrawTextWindow(2, 14, 27, 19); - MenuPrint(gMenuText_HOFSaving, 3, 15); + Menu_DrawStdWindowFrame(2, 14, 27, 19); + Menu_PrintText(gMenuText_HOFSaving, 3, 15); gTasks[taskID].func = sub_8142274; } static void sub_8142274(u8 taskID) { gGameContinueCallback = sub_8141FC4; - TrySavingData(3); + Save_WriteData(3); PlaySE(SE_SAVE); gTasks[taskID].func = sub_81422B8; gTasks[taskID].tFrameCount = 32; @@ -582,8 +576,8 @@ static void sub_81422B8(u8 taskID) static void sub_81422E8(u8 taskID) { - SetUpWindowConfig(&gWindowConfig_81E7198); - InitMenuWindow(&gWindowConfig_81E7198); + Text_LoadWindowTemplate(&gWindowTemplate_81E7198); + InitMenuWindow(&gWindowTemplate_81E7198); gTasks[taskID].func = sub_8142320; } @@ -617,7 +611,7 @@ static void sub_8142320(u8 taskID) gSprites[spriteID].data[0] = 0; gSprites[spriteID].callback = sub_81435DC; gTasks[taskID].tMonSpriteID(currPokeID) = spriteID; - MenuZeroFillWindowRect(0, 14, 29, 19); + Menu_EraseWindowRect(0, 14, 29, 19); gTasks[taskID].func = sub_8142404; } @@ -670,7 +664,7 @@ static void sub_8142570(u8 taskID) if (gTasks[taskID].tMonSpriteID(i) != 0xFF) gSprites[gTasks[taskID].tMonSpriteID(i)].oam.priority = 0; } - MenuZeroFillWindowRect(0, 14, 29, 19); + Menu_EraseWindowRect(0, 14, 29, 19); sub_8143068(0, 15); PlaySE(SE_DENDOU); gTasks[taskID].tFrameCount = 400; @@ -694,7 +688,7 @@ static void sub_8142618(u8 taskID) gSprites[gTasks[taskID].tMonSpriteID(i)].oam.priority = 1; } BeginNormalPaletteFade(sUnknown_0203931C, 0, 12, 12, 0x735F); - MenuZeroFillWindowRect(0, 14, 29, 19); + Menu_EraseWindowRect(0, 14, 29, 19); gTasks[taskID].tFrameCount = 7; gTasks[taskID].func = sub_81426F8; } @@ -714,8 +708,8 @@ static void sub_81426F8(u8 taskID) static void sub_8142738(u8 taskID) { REG_DISPCNT = 0x1940; - SetUpWindowConfig(&gWindowConfig_81E71B4); - InitMenuWindow(&gWindowConfig_81E71B4); + Text_LoadWindowTemplate(&gWindowTemplate_81E71B4); + InitMenuWindow(&gWindowTemplate_81E71B4); gTasks[taskID].tPlayerSpriteID = HallOfFame_LoadTrainerPic(gSaveBlock2.playerGender, 120, 72, 6); gTasks[taskID].tFrameCount = 120; @@ -732,10 +726,10 @@ static void sub_8142794(u8 taskID) gSprites[gTasks[taskID].tPlayerSpriteID].pos1.x++; else { - MenuDrawTextWindow(1, 2, 15, 9); + Menu_DrawStdWindowFrame(1, 2, 15, 9); HallOfFame_PrintPlayerInfo(1, 2); - MenuDrawTextWindow(2, 14, 27, 19); - MenuPrint(gMenuText_HOFCongratulations, 4, 15); + Menu_DrawStdWindowFrame(2, 14, 27, 19); + Menu_PrintText(gMenuText_HOFCongratulations, 4, 15); gTasks[taskID].func = sub_8142818; } } @@ -800,20 +794,15 @@ void sub_81428CC(void) } break; case 3: - { - struct HallofFameMons* fameMons; - - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - sub_81435B8(); + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + sub_81435B8(); - fameMons = eHallOfFameMons1; - fameMons->mons[0] = sDummyFameMon; + eHOFPCScreenEffect = sPCScreenEffectTemplate; - sub_80C5CD4(fameMons); - gMain.state++; - } + sub_80C5CD4(&eHOFPCScreenEffect); + gMain.state++; break; case 4: AnimateSprites(); @@ -840,7 +829,7 @@ void sub_81428CC(void) static void sub_8142A28(u8 taskID) { - if (sub_8125EC8(3) != 1) + if (Save_LoadGameData(SAVE_HALL_OF_FAME) != SAVE_STATUS_OK) gTasks[taskID].func = sub_8142FEC; else { @@ -864,8 +853,8 @@ static void sub_8142A28(u8 taskID) *(vram1 + i) = i + 3; *(vram2 + i) = i + 20; } - SetUpWindowConfig(&gWindowConfig_81E7198); - InitMenuWindow(&gWindowConfig_81E7198); + Text_LoadWindowTemplate(&gWindowTemplate_81E7198); + InitMenuWindow(&gWindowTemplate_81E7198); gTasks[taskID].func = sub_8142B04; } } @@ -930,7 +919,7 @@ static void sub_8142B04(u8 taskID) stringPtr[1] = 0x13; stringPtr[2] = 0xF0; stringPtr[3] = EOS; - MenuPrint(gStringVar1, 0, 0); + Menu_PrintText(gStringVar1, 0, 0); gTasks[taskID].func = sub_8142CC8; } @@ -1022,12 +1011,9 @@ static void sub_8142DF4(u8 taskID) static void sub_8142F78(u8 taskID) { - struct HallofFameMons* fameMons; - CpuSet(gPlttBufferFaded, gPlttBufferUnfaded, 0x200); - fameMons = eHallOfFameMons1; - fameMons->mons[0] = sDummyFameMon; - sub_80C5E38(fameMons); + eHOFPCScreenEffect = sPCScreenEffectTemplate; + sub_80C5E38(&eHOFPCScreenEffect); gTasks[taskID].func = sub_8142FCC; } @@ -1042,14 +1028,14 @@ static void sub_8142FCC(u8 taskID) static void sub_8142FEC(u8 taskID) { - MenuDrawTextWindow(2, 14, 27, 19); + Menu_DrawStdWindowFrame(2, 14, 27, 19); MenuPrintMessage(gMenuText_HOFCorrupt, 3, 15); gTasks[taskID].func = sub_814302C; } static void sub_814302C(u8 taskID) { - if (MenuUpdateWindowText() && gMain.newKeys & A_BUTTON) + if (Menu_UpdateWindowText() && gMain.newKeys & A_BUTTON) gTasks[taskID].func = sub_8142F78; } @@ -1086,7 +1072,7 @@ static void HallOfFame_PrintMonInfo(struct HallofFameMon* currMon, u8 a1, u8 a2) } } - MenuPrint(gStringVar1, a1 + 4, a2 + 1); + Menu_PrintText(gStringVar1, a1 + 4, a2 + 1); stringPtr = gStringVar1; for (i = 0; i < 10 && currMon->nick[i] != EOS; stringPtr[i] = currMon->nick[i], i++) {} @@ -1099,8 +1085,8 @@ static void HallOfFame_PrintMonInfo(struct HallofFameMon* currMon, u8 a1, u8 a2) stringPtr[1] = 0x13; stringPtr[2] = 0xA0; stringPtr[3] = EOS; - MenuPrint(gStringVar1, a1 + 9, a2 + 1); - MenuZeroFillWindowRect(0, a2 + 3, 29, a2 + 4); + Menu_PrintText(gStringVar1, a1 + 9, a2 + 1); + Menu_EraseWindowRect(0, a2 + 3, 29, a2 + 4); } else { @@ -1139,7 +1125,7 @@ static void HallOfFame_PrintMonInfo(struct HallofFameMon* currMon, u8 a1, u8 a2) stringPtr[2] = 0xA0; stringPtr[3] = EOS; - MenuPrint(gStringVar1, a1 + 9, a2 + 1); + Menu_PrintText(gStringVar1, a1 + 9, a2 + 1); monData = currMon->lvl; @@ -1157,14 +1143,14 @@ static void HallOfFame_PrintMonInfo(struct HallofFameMon* currMon, u8 a1, u8 a2) stringPtr[2] = 0x30; stringPtr[3] = EOS; - MenuPrint(gStringVar1, a1 + 7, a2 + 3); + Menu_PrintText(gStringVar1, a1 + 7, a2 + 3); monData = currMon->tid; stringPtr = StringCopy(gStringVar1, gOtherText_IDNumber); ConvertIntToDecimalStringN(stringPtr, monData, 2, 5); - MenuPrint(gStringVar1, a1 + 13, a2 + 3); + Menu_PrintText(gStringVar1, a1 + 13, a2 + 3); } } @@ -1175,15 +1161,15 @@ static void HallOfFame_PrintPlayerInfo(u8 a0, u8 a1) u8* stringPtr; u16 visibleTid; - MenuPrint(gOtherText_Name, a0 + 1, a1 + 1); + Menu_PrintText(gOtherText_Name, a0 + 1, a1 + 1); MenuPrint_RightAligned(gSaveBlock2.playerName, a0 + 14, a1 + 1); - MenuPrint(gOtherText_IDNumber2, a0 + 1, a1 + 3); + Menu_PrintText(gOtherText_IDNumber2, a0 + 1, a1 + 3); visibleTid = ByteRead16(gSaveBlock2.playerTrainerId); ConvertIntToDecimalStringN(gStringVar1, visibleTid, 2, 5); MenuPrint_RightAligned(gStringVar1, a0 + 14, a1 + 3); - MenuPrint(gMainMenuString_Time, a0 + 1, a1 + 5); + Menu_PrintText(gMainMenuString_Time, a0 + 1, a1 + 5); stringPtr = ConvertIntToDecimalString(gStringVar1, gSaveBlock2.playTimeHours); stringPtr[0] = CHAR_SPACE; @@ -1199,8 +1185,6 @@ static void HallOfFame_PrintPlayerInfo(u8 a0, u8 a1) static void sub_81433E0(void) { - u32 offsetWrite, offsetWrite2, offsetWrite3, offsetWrite4; - u32 size, size2, size3, size4; u16 i; REG_DISPCNT = 0; @@ -1221,27 +1205,9 @@ static void sub_81433E0(void) REG_BG3HOFS = 0; REG_BG3VOFS = 0; - offsetWrite = (VRAM); - size = 0x18000; - while (TRUE) - { - DmaFill16(3, 0, offsetWrite, 0x1000); - offsetWrite += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill16(3, 0, offsetWrite, size); - break; - } - } - - offsetWrite2 = OAM; - size2 = OAM_SIZE; - DmaFill32(3, 0, offsetWrite2, size2); - - offsetWrite3 = PLTT; - size3 = PLTT_SIZE; - DmaFill16(3, 0, offsetWrite3, size3); + DmaFill16Large(3, 0, VRAM, 0x18000, 0x1000); + DmaFill32Defvars(3, 0, OAM, OAM_SIZE); + DmaFill16Defvars(3, 0, PLTT, PLTT_SIZE); LZ77UnCompVram(gHallOfFame_Gfx, (void*)(VRAM)); @@ -1258,35 +1224,22 @@ static void sub_81433E0(void) *((u16*)(VRAM + 0x3000) + i) = 2; } - offsetWrite4 = ewram0_6; - size4 = 0x4000; - while (TRUE) - { - DmaFill16(3, 0, offsetWrite4, 0x1000); - offsetWrite4 += 0x1000; - size4 -= 0x1000; - if (size4 <= 0x1000) - { - DmaFill16(3, 0, offsetWrite4, size4); - break; - } - } - + DmaFill16Large(3, 0, ewram0_6, 0x4000, 0x1000); ResetPaletteFade(); LoadPalette(gHallOfFame_Pal, 0, 0x20); } static void sub_8143570(void) { - remove_some_task(); + ScanlineEffect_Stop(); ResetTasks(); ResetSpriteData(); FreeAllSpritePalettes(); gReservedSpritePaletteCount = 8; LoadCompressedObjectPic(&sHallOfFame_ConfettiSpriteSheet); LoadCompressedObjectPalette(&sHallOfFame_ConfettiSpritePalette); - SetUpWindowConfig(&gWindowConfig_81E71B4); - InitMenuWindow(&gWindowConfig_81E71B4); + Text_LoadWindowTemplate(&gWindowTemplate_81E71B4); + InitMenuWindow(&gWindowTemplate_81E71B4); } static void sub_81435B8(void) diff --git a/src/scene/intro.c b/src/scene/intro.c index 4dc6cc91c..4da341744 100644 --- a/src/scene/intro.c +++ b/src/scene/intro.c @@ -19,7 +19,7 @@ #include "task.h" #include "title_screen.h" #include "trig.h" -#include "unknown_task.h" +#include "scanline_effect.h" #include "ewram.h" extern struct SpriteTemplate gUnknown_02024E8C; @@ -873,7 +873,7 @@ static u8 SetUpCopyrightScreen(void) DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2); ResetPaletteFade(); LoadCopyrightGraphics(0, 0x3800, 0); - remove_some_task(); + ScanlineEffect_Stop(); ResetTasks(); ResetSpriteData(); FreeAllSpritePalettes(); @@ -930,8 +930,8 @@ void CB2_InitCopyrightScreenAfterBootup(void) if (!SetUpCopyrightScreen()) { sub_8052E4C(); - ResetSaveCounters(); - sub_8125EC8(0); + Save_ResetSaveCounters(); + Save_LoadGameData(SAVE_NORMAL); if (gSaveFileStatus == 0 || gSaveFileStatus == 2) ClearSav2(); SetPokemonCryStereo(gSaveBlock2.optionsSound); @@ -1217,7 +1217,6 @@ static void Task_IntroWaitToSetupPart3DoubleFight(u8 taskId) static void Task_IntroLoadPart3Streaks(u8 taskId) { u16 i; - void *vram; intro_reset_and_hide_bgs(); for (i = 0; i < 32; i++) @@ -1226,8 +1225,7 @@ static void Task_IntroLoadPart3Streaks(u8 taskId) ewram0arr[1][i] = 17; ewram0arr[2][i] = 34; } - vram = (void *)VRAM; - DmaCopy16(3, gSharedMem, vram, 0x60); + DmaCopy16Defvars(3, gSharedMem, (void *)(VRAM + 0x0), 0x60); for (i = 0; i < 0x280; i++) ((u16 *)(VRAM + 0x3000))[i] = 0xF001; for (i = 0; i < 0x80; i++) diff --git a/src/scene/intro_credits_graphics.c b/src/scene/intro_credits_graphics.c index 6cee74cce..7f6765ef6 100755..100644 --- a/src/scene/intro_credits_graphics.c +++ b/src/scene/intro_credits_graphics.c @@ -19,7 +19,7 @@ #include "task.h" #include "title_screen.h" #include "trig.h" -#include "unknown_task.h" +#include "scanline_effect.h" // define register constants for the inline asm asm(".include \"constants/gba_constants.inc\"\n"); @@ -301,9 +301,10 @@ const struct CompressedSpriteSheet gUnknown_08416E34[] = { }; -extern u16 gUnknown_02039358; -extern s16 gUnknown_0203935A; -extern s16 gUnknown_0203935C; +EWRAM_DATA u16 gUnknown_02039358 = 0; +EWRAM_DATA s16 gUnknown_0203935A = 0; +EWRAM_DATA s16 gUnknown_0203935C = 0; + extern u8 gReservedSpritePaletteCount; void sub_8149248(); diff --git a/src/scene/new_game.c b/src/scene/new_game.c index 0279f99c6..e64dc91e3 100644 --- a/src/scene/new_game.c +++ b/src/scene/new_game.c @@ -1,4 +1,7 @@ #include "global.h" +#include "constants/maps.h" +#include "constants/species.h" +#include "clock.h" #include "new_game.h" #include "battle_records.h" #include "berry.h" @@ -20,6 +23,7 @@ #include "pokemon_storage_system.h" #include "random.h" #include "roamer.h" +#include "script_pokemon_80C4.h" #include "overworld.h" #include "rtc.h" #include "script.h" @@ -42,6 +46,18 @@ static const struct ContestWinner sEmptyMuseumPortrait = .trainerName = {EOS}, }; +#if DEBUG +const s8 gUnknown_Debug_0823C788[][2] = +{ + { MAP_GROUP(INSIDE_OF_TRUCK), MAP_NUM(INSIDE_OF_TRUCK) }, + { MAP_GROUP(OLDALE_TOWN_POKEMON_CENTER_2F), MAP_NUM(OLDALE_TOWN_POKEMON_CENTER_2F) }, + { MAP_GROUP(LITTLEROOT_TOWN), MAP_NUM(LITTLEROOT_TOWN) }, + { MAP_GROUP(LITTLEROOT_TOWN_BRENDANS_HOUSE_2F), MAP_NUM(LITTLEROOT_TOWN_BRENDANS_HOUSE_2F) } +}; + +const u8 gUnknown_Debug_0823C790[] = _("KRÖTE"); +#endif + void write_word_to_mem(u32 var, u8 *dataPtr) { dataPtr[0] = var; @@ -94,6 +110,30 @@ void ZeroBattleTowerData(void) CpuFill32(0, &gSaveBlock2.battleTower, sizeof(gSaveBlock2.battleTower)); } +#if DEBUG +void debug_sub_8052E04() +{ + u8 i; + + for (i = 0; i < 4; i++) + { + if (gUnknown_Debug_0823C788[i][0] == gSaveBlock1.location.mapGroup && + gUnknown_Debug_0823C788[i][1] == gSaveBlock1.location.mapNum) + { + break; + } + } + + i++; + if (i >= 4) + { + i = 0; + } + + Overworld_SetWarpDestination(gUnknown_Debug_0823C788[i][0], gUnknown_Debug_0823C788[i][1], -1, -1, -1); +} +#endif + void WarpToTruck(void) { Overworld_SetWarpDestination(25, 40, -1, -1, -1); // inside of truck @@ -109,6 +149,9 @@ void ClearSav2(void) void sub_8052E4C(void) { gDifferentSaveFile = 0; +#if DEBUG + gUnknown_020297ED = 0; +#endif sub_808C0A0(); ZeroPlayerPartyMons(); ZeroEnemyPartyMons(); @@ -161,3 +204,33 @@ void NewGameInitData(void) WarpToTruck(); ScriptContext2_RunNewScript(gUnknown_0819FA81); } + +#if DEBUG +extern void debug_sub_80A3904(void); +extern void debug_sub_80A3714(void); +extern void debug_sub_8120F98(void); +extern void unref_sub_8070F90(void); + +void debug_sub_8057508(bool32 arg0) +{ + gUnknown_020297ED = 1; + NewGameInitData(); + gSaveBlock1.money = 999999; + FlagSet(FLAG_SYS_POKEMON_GET); + FlagSet(FLAG_SYS_POKEDEX_GET); + FlagSet(FLAG_SYS_POKENAV_GET); + FlagSet(FLAG_SYS_B_DASH); + ScriptGiveMon(SPECIES_TREECKO, 99, 0, 0, 0, 0); + + if (arg0 == TRUE) + SetMonData(&gPlayerParty[0], MON_DATA_NICKNAME, gUnknown_Debug_0823C790); + + debug_sub_80A3904(); + debug_sub_80A3714(); + debug_sub_8120F98(); + FlagSet(FLAG_SYS_HIPSTER_MEET); + sub_80EB8EC(); + unref_sub_8070F90(); + InitTimeBasedEvents(); +} +#endif diff --git a/src/scene/title_screen.c b/src/scene/title_screen.c index 26fe088d5..a1c8e081d 100644 --- a/src/scene/title_screen.c +++ b/src/scene/title_screen.c @@ -8,12 +8,13 @@ #include "m4a.h" #include "main.h" #include "main_menu.h" +#include "overworld.h" #include "palette.h" #include "reset_rtc_screen.h" #include "sound.h" #include "sprite.h" #include "task.h" -#include "unknown_task.h" +#include "scanline_effect.h" #if ENGLISH #define VERSION_BANNER_SHAPE 1 @@ -353,6 +354,9 @@ static void Task_TitleScreenPhase1(u8); static void Task_TitleScreenPhase2(u8); static void Task_TitleScreenPhase3(u8); static void CB2_GoToMainMenu(void); +#if DEBUG +static void CB2_GoToTestMenu(void); +#endif static void CB2_GoToClearSaveDataScreen(void); static void CB2_GoToResetRtcScreen(void); static void CB2_GoToCopyrightScreen(void); @@ -598,7 +602,7 @@ static void StartPokemonLogoShine(bool8 flashBackground) static void VBlankCB(void) { - sub_8089668(); + ScanlineEffect_InitHBlankDmaTransfer(); LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); @@ -644,7 +648,7 @@ void CB2_InitTitleScreen(void) LZ77UnCompVram(sLegendaryMonTilemap, (void *)(VRAM + 0xC000)); LZ77UnCompVram(sBackdropTilemap, (void *)(VRAM + 0xC800)); LoadPalette(sLegendaryMonPalettes, 0xE0, sizeof(sLegendaryMonPalettes)); - remove_some_task(); + ScanlineEffect_Stop(); ResetTasks(); ResetSpriteData(); FreeAllSpritePalettes(); @@ -711,7 +715,7 @@ void CB2_InitTitleScreen(void) if (!UpdatePaletteFade()) { StartPokemonLogoShine(FALSE); - sub_8089944(0, 0xA0, 4, 4, 0, 4, 1); + ScanlineEffect_InitWave(0, DISPLAY_HEIGHT, 4, 4, 0, SCANLINE_EFFECT_REG_BG1HOFS, TRUE); SetMainCallback2(MainCB2); } break; @@ -829,6 +833,13 @@ static void Task_TitleScreenPhase3(u8 taskId) BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); SetMainCallback2(CB2_GoToResetRtcScreen); } +#if DEBUG + else if (gMain.heldKeys == SELECT_BUTTON) + { + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + SetMainCallback2(CB2_GoToTestMenu); + } +#endif else { REG_BG2Y = 0; @@ -855,6 +866,14 @@ static void CB2_GoToMainMenu(void) SetMainCallback2(CB2_InitMainMenu); } +#if DEBUG +static void CB2_GoToTestMenu(void) +{ + if (!UpdatePaletteFade()) + SetMainCallback2(CB2_InitTestMenu); +} +#endif + static void CB2_GoToCopyrightScreen(void) { if (!UpdatePaletteFade()) diff --git a/src/script_pokemon_util_80C4BF0.c b/src/script_pokemon_util_80C4BF0.c index f397e5ebb..02e66d313 100644 --- a/src/script_pokemon_util_80C4BF0.c +++ b/src/script_pokemon_util_80C4BF0.c @@ -32,26 +32,13 @@ extern void sub_80C4698(u8 *, u8); extern struct SpriteTemplate gUnknown_02024E8C; -extern u8 gContestPlayerMonIndex; -extern u8 gIsLinkContest; -extern u8 gPlayerPartyCount; extern u8 gSelectedOrderFromParty[]; -extern u16 gSpecialVar_0x8004; -extern u16 gSpecialVar_0x8005; -extern u16 gSpecialVar_0x8006; - extern u16 gSpecialVar_ContestCategory; extern u16 gSpecialVar_ContestRank; -extern u16 gSpecialVar_Result; - -extern u32 gUnknown_03005D28; extern u8 gUnknown_02038694; extern u8 gUnknown_0203856C; -extern u8 gContestFinalStandings[]; -extern s16 gUnknown_02038670[]; -extern s16 gUnknown_02038678[]; void SetContestTrainerGfxIds(void) { @@ -238,8 +225,8 @@ void ShowContestWinner(void) if(gUnknown_0203856C) { sub_80AAF30(); - BATTLE_STRUCT->unk15DDF = 1; - BATTLE_STRUCT->unk15DDE = sub_80B2C4C(254, 0); + gBattleStruct->unk15DDF = 1; + gBattleStruct->unk15DDE = sub_80B2C4C(254, 0); Contest_SaveWinner(3); gUnknown_0203856C = 0; } @@ -292,7 +279,7 @@ void ShowContestEntryMonPic(void) u8 left = CONTEST_ENTRY_PIC_LEFT; u8 top = CONTEST_ENTRY_PIC_TOP; - MenuDrawTextWindow(left, top, 19, 13); + Menu_DrawStdWindowFrame(left, top, 19, 13); species = gContestMons[gSpecialVar_0x8006].species; var1 = gContestMons[gSpecialVar_0x8006].personality; var2 = gContestMons[gSpecialVar_0x8006].otId; @@ -349,7 +336,7 @@ void sub_80C5190(u8 taskId) task->data[0]++; break; case 3: - MenuZeroFillWindowRect(task->data[3], task->data[4], task->data[3] + 9, task->data[4] + 10); + Menu_EraseWindowRect(task->data[3], task->data[4], task->data[3] + 9, task->data[4] + 10); DestroyTask(taskId); break; case 1: @@ -373,8 +360,8 @@ void ScriptRandom(void) if(gIsLinkContest & 1) { - gUnknown_03005D28 = 1103515245 * gUnknown_03005D28 + 24691; - random = gUnknown_03005D28 >> 16; + gContestRngValue = 1103515245 * gContestRngValue + 24691; + random = gContestRngValue >> 16; scriptPtr = &gSpecialVar_Result; } else diff --git a/src/strings.c b/src/strings.c index 06bbadb8f..0f599db72 100644 --- a/src/strings.c +++ b/src/strings.c @@ -173,7 +173,8 @@ const u8 gOtherText_None[] = _("NONE"); const u8 gOtherText_ThreeQuestions2[] = _("???"); -const u8 gOtherText_FiveQuestionsAndSlash[] = _("?????$/"); +const u8 gOtherText_FiveQuestions[] = _("?????"); +const u8 gOtherText_Slash[] = _("/"); const u8 gOtherText_OneDash[] = _("-"); const u8 gOtherText_TwoDashes[] = _("--"); @@ -267,7 +268,9 @@ const u8 gContestStatsText_Spicy[] = _("SPICY"); const u8 gContestStatsText_Dry[] = _("DRY"); const u8 gContestStatsText_Sweet[] = _("SWEET"); const u8 gContestStatsText_Bitter[] = _("BITTER"); -const u8 gContestStatsText_Sour[] = _("SOUR$TASTY$FEEL"); // tasty is unused, feel might not be +const u8 gContestStatsText_Sour[] = _("SOUR"); +const u8 gContestStatsText_Tasty[] = _("TASTY"); +const u8 gContestStatsText_Feel[] = _("FEEL"); const u8 gContestStatsText_StowCase[] = _("Stow CASE."); const u8 gContestStatsText_ThrowAwayPrompt[] = _("Throw away this\n{STR_VAR_1}?"); @@ -1096,7 +1099,8 @@ const u8 gOtherText_None[] = _("KEINES"); const u8 gOtherText_ThreeQuestions2[] = _("???"); -const u8 gOtherText_FiveQuestionsAndSlash[] = _("?????$/"); +const u8 gOtherText_FiveQuestions[] = _("?????"); +const u8 gOtherText_Slash[] = _("/"); const u8 gOtherText_OneDash[] = _("-"); const u8 gOtherText_TwoDashes[] = _("--"); @@ -1190,7 +1194,9 @@ const u8 gContestStatsText_Spicy[] = _("SCHARF"); const u8 gContestStatsText_Dry[] = _("TROCKEN"); const u8 gContestStatsText_Sweet[] = _("SÜSS"); const u8 gContestStatsText_Bitter[] = _("BITTER"); -const u8 gContestStatsText_Sour[] = _("SAUER$LECKER$WÜRZE"); +const u8 gContestStatsText_Sour[] = _("SAUER"); +const u8 gContestStatsText_Tasty[] = _("LECKER"); +const u8 gContestStatsText_Feel[] = _("WÜRZE"); const u8 gContestStatsText_StowCase[] = _("BOX verstauen."); const u8 gContestStatsText_ThrowAwayPrompt[] = _("{STR_VAR_1}\nwegwerfen?"); diff --git a/src/unknown_task.c b/src/unknown_task.c deleted file mode 100644 index c9ba95d42..000000000 --- a/src/unknown_task.c +++ /dev/null @@ -1,234 +0,0 @@ -#include "global.h" -#include "data2.h" -#include "task.h" -#include "trig.h" -#include "unknown_task.h" - -static void sub_80896F4(void); -static void sub_8089714(void); - -extern u16 gUnknown_030041B0; -extern u16 gBattle_BG1_Y; -extern u16 gUnknown_030041B8; -extern u16 gBattle_BG2_Y; -extern u16 gBattle_BG2_X; -extern u16 gUnknown_030042A0; -extern u16 gUnknown_030042A4; -extern u16 gBattle_BG1_X; - -extern u8 gUnknown_0202FFA4; - -extern struct UnknownTaskStruct2 gUnknown_03004DC0; - -extern u16 gUnknown_03004DE0[][0x3C0]; - -void remove_some_task(void) -{ - gUnknown_03004DC0.unk15 = 0; - DmaStop(0); - if (gUnknown_03004DC0.taskId != 0xFF) - { - DestroyTask(gUnknown_03004DC0.taskId); - gUnknown_03004DC0.taskId = 0xFF; - } -} - -void dp12_8087EA4(void) -{ - CpuFill16(0, gUnknown_03004DE0, 0x780 * 2); - gUnknown_03004DC0.src[0] = 0; - gUnknown_03004DC0.src[1] = 0; - gUnknown_03004DC0.dest = 0; - gUnknown_03004DC0.unkC = 0; - gUnknown_03004DC0.srcBank = 0; - gUnknown_03004DC0.unk15 = 0; - gUnknown_03004DC0.unk16 = 0; - gUnknown_03004DC0.unk17 = 0; - gUnknown_03004DC0.taskId = 0xFF; -} - -void sub_80895F8(struct UnknownTaskStruct unk) -{ - if (unk.control == (((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1)) - { - gUnknown_03004DC0.src[0] = &gUnknown_03004DE0[0][1]; - gUnknown_03004DC0.src[1] = &gUnknown_03004DE0[1][1]; - gUnknown_03004DC0.unk10 = sub_80896F4; - } - else - { - gUnknown_03004DC0.src[0] = &gUnknown_03004DE0[0][2]; - gUnknown_03004DC0.src[1] = &gUnknown_03004DE0[1][2]; - gUnknown_03004DC0.unk10 = sub_8089714; - } - - gUnknown_03004DC0.unkC = unk.control; - gUnknown_03004DC0.dest = unk.dest; - gUnknown_03004DC0.unk15 = unk.unk8; - gUnknown_03004DC0.unk16 = unk.unk9; - gUnknown_03004DC0.unk17 = unk.unk9; -} - -void sub_8089668(void) -{ - if (gUnknown_03004DC0.unk15) - { - if (gUnknown_03004DC0.unk15 == 3) - { - gUnknown_03004DC0.unk15 = 0; - DmaStop(0); - gUnknown_0202FFA4 = 1; - } - else - { - DmaStop(0); - DmaSet(0, gUnknown_03004DC0.src[gUnknown_03004DC0.srcBank], gUnknown_03004DC0.dest, gUnknown_03004DC0.unkC); - gUnknown_03004DC0.unk10(); - gUnknown_03004DC0.srcBank ^= 1; - } - } -} - -static void sub_80896F4(void) -{ - u16 *dest = (u16 *)gUnknown_03004DC0.dest; - u16 *src = (u16 *)&gUnknown_03004DE0[gUnknown_03004DC0.srcBank]; - *dest = *src; -} - -static void sub_8089714(void) -{ - u32 *dest = (u32 *)gUnknown_03004DC0.dest; - u32 *src = (u32 *)&gUnknown_03004DE0[gUnknown_03004DC0.srcBank]; - *dest = *src; -} - -static void task00_for_dp12(u8 taskId) -{ - int value = 0; - - if (gUnknown_0202FFA4) - { - DestroyTask(taskId); - gUnknown_03004DC0.taskId = 0xFF; - } - else - { - if (gTasks[taskId].data[7]) - { - switch (gTasks[taskId].data[6]) - { - case 0x0: - value = gUnknown_030042A4; - break; - case 0x2: - value = gUnknown_030042A0; - break; - case 0x4: - value = gBattle_BG1_X; - break; - case 0x6: - value = gBattle_BG1_Y; - break; - case 0x8: - value = gBattle_BG2_X; - break; - case 0xA: - value = gBattle_BG2_Y; - break; - case 0xC: - value = gUnknown_030041B0; - break; - case 0xE: - value = gUnknown_030041B8; - break; - } - } - if (gTasks[taskId].data[4]) - { - int i; - int offset; - gTasks[taskId].data[4]--; - offset = gTasks[taskId].data[3] + 320; - for (i = gTasks[taskId].data[0]; i < gTasks[taskId].data[1]; i++) - { - gUnknown_03004DE0[gUnknown_03004DC0.srcBank][i] = gUnknown_03004DE0[0][offset] + value; - offset++; - } - } - else - { - int i; - int offset; - gTasks[taskId].data[4] = gTasks[taskId].data[5]; - offset = gTasks[taskId].data[3] + 320; - for (i = gTasks[taskId].data[0]; i < gTasks[taskId].data[1]; i++) - { - gUnknown_03004DE0[gUnknown_03004DC0.srcBank][i] = gUnknown_03004DE0[0][offset] + value; - offset++; - } - gTasks[taskId].data[3]++; - if (gTasks[taskId].data[3] == gTasks[taskId].data[2]) - { - gTasks[taskId].data[3] = 0; - } - } - } -} - -static void sub_80898FC(u16 *a1, u8 a2, u8 a3, u8 a4) -{ - u16 i = 0; - u8 offset = 0; - - while (i < 0x100) - { - a1[i] = (gSineTable[offset] * a3) / 256; - offset += a2; - i++; - } -} - -u8 sub_8089944(u8 a1, u8 a2, u8 a3, u8 a4, u8 a5, u8 a6, u8 a7) -{ - int i; - int offset; - struct UnknownTaskStruct unk; - u8 taskId; - - dp12_8087EA4(); - - unk.dest = (void *)(REG_ADDR_BG0HOFS + a6); - unk.control = ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1; - unk.unk8 = 1; - unk.unk9 = 0; - - sub_80895F8(unk); - - taskId = CreateTask(task00_for_dp12, 0); - - gTasks[taskId].data[0] = a1; - gTasks[taskId].data[1] = a2; - gTasks[taskId].data[2] = 256 / a3; - gTasks[taskId].data[3] = 0; - gTasks[taskId].data[4] = a5; - gTasks[taskId].data[5] = a5; - gTasks[taskId].data[6] = a6; - gTasks[taskId].data[7] = a7; - - gUnknown_03004DC0.taskId = taskId; - gUnknown_0202FFA4 = 0; - - sub_80898FC(&gUnknown_03004DE0[0][320], a3, a4, a2 - a1); - - offset = 320; - - for (i = a1; i < a2; i++) - { - gUnknown_03004DE0[0][i] = gUnknown_03004DE0[0][offset]; - gUnknown_03004DE0[1][i] = gUnknown_03004DE0[0][offset]; - offset++; - } - - return taskId; -} diff --git a/src/unused_81258BC.c b/src/unused_81258BC.c new file mode 100644 index 000000000..c25884053 --- /dev/null +++ b/src/unused_81258BC.c @@ -0,0 +1,36 @@ +#include "constants/songs.h" +#include "global.h" +#include "menu.h" +#include "mystery_event_script.h" +#include "sound.h" +#include "text.h" + +void sub_812AF10(void); + +bool8 unref_sub_812AECC(u8 *script) +{ + u8 result = RunMysteryEventScript(script); + switch (result) + { + case 0: + return FALSE; + case 1: + PlaySE(SE_BOO); + return TRUE; + case 2: + sub_812AF10(); + return FALSE; + case 3: + PlaySE(SE_BOO); + sub_812AF10(); + return TRUE; + default: + return FALSE; + } +} + +void sub_812AF10(void) +{ + Menu_DrawStdWindowFrame(2, 14, 27, 19); + Menu_PrintText(gStringVar4, 3, 15); +}
\ No newline at end of file |