diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2018-02-07 00:40:22 -0500 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2018-02-07 00:40:22 -0500 |
commit | dcd35c895cb1c5680f92360cb084e6924ed3b76f (patch) | |
tree | e3b12bfd9f67e1237832602f03fe5bfd7380ab0b /src/battle | |
parent | eff6795887cc27f2c5139df9a6da70f4f02338b4 (diff) | |
parent | c79d259508d47a8b5bde5b9060b8fe8c6989bd44 (diff) |
Merge branch 'master' into unk_text_8095904
Diffstat (limited to 'src/battle')
129 files changed, 16902 insertions, 3861 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++; |