diff options
author | GriffinR <griffin.g.richards@gmail.com> | 2020-08-19 01:04:35 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-19 01:04:35 -0400 |
commit | 5d6e7a31da8f018c1a69e9e57eca0657ec19c283 (patch) | |
tree | 3ce548fbada787a8d2dc686ef6612f06e2b9fc3a /src | |
parent | 9effc97f69d46af00e45420661a775c5977049c8 (diff) | |
parent | 3d96e954c845659f5184e99856ddf61ce1375b2f (diff) |
Merge pull request #788 from kazblox/master
Fix NONMATCHINGs and actual English Debug support
Diffstat (limited to 'src')
44 files changed, 1903 insertions, 8296 deletions
diff --git a/src/battle/anim/dark.c b/src/battle/anim/dark.c index d3d992bda..08aafe195 100644 --- a/src/battle/anim/dark.c +++ b/src/battle/anim/dark.c @@ -730,215 +730,55 @@ static void sub_80E0620(u8 taskId) } } -// 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; -// } -// } -// } - -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"); + int var0, var1; + s16 var2; + s16 i; + int var4; + + var2 = task->data[5] - task->data[4]; + if (var2 != 0) + { + var0 = task->data[13] / var2; + var1 = task->data[6] << 8; + + for (i = 0; i < task->data[4]; i++) + { + gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[10] - (i - 159); + } + + for (i = task->data[4]; i <= task->data[5]; i++) + { + if (i >= 0) + { + s16 var3 = (var1 >> 8) - i; + gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = var3 + task->data[10]; + } + + var1 += var0; + } + + var4 = task->data[10] - (i - 159); + for (i = i; i < task->data[7]; i++) + { + if (i >= 0) + { + gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = var4; + var4--; + } + } + } + else + { + var4 = task->data[10] + 159; + for (i = 0; i < 112; i++) + { + gScanlineEffectRegBuffers[0][i] = var4; + gScanlineEffectRegBuffers[1][i] = var4; + var4--; + } + } } static void sub_80E08CC(u8 priority) diff --git a/src/battle/anim/flying.c b/src/battle/anim/flying.c index 407c9a08f..64991d161 100644 --- a/src/battle/anim/flying.c +++ b/src/battle/anim/flying.c @@ -2330,195 +2330,59 @@ void sub_80DB330(struct Sprite *sprite) } } -#ifdef NONMATCHING void sub_80DB374(struct Sprite *sprite) { - // NONMATCHING - Functionally equivalent - slight register swap at end - u32 matrixNum; - int t1, t3; - s16 t2; + int t1, t2; switch (sprite->data[0]) { + case 0: + if (!gBattleAnimArgs[0]) + { + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0); + sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1); + } + else + { + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 0); + sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 1); + } - case 0: - if (!gBattleAnimArgs[0]) - { - sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0); - sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1); - } - else - { - sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 0); - sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 1); - } - - sprite->data[1] = 512; + sprite->data[1] = 512; - sub_8078FDC(sprite, 0, 256, sprite->data[1], 0); - ++sprite->data[0]; - break; - case 1: - if (sprite->data[2] <= 11) - { - sprite->data[1] -= 40; - } - else - { - sprite->data[1] += 40; - } + sub_8078FDC(sprite, 0, 256, sprite->data[1], 0); + sprite->data[0]++; + break; + case 1: + if (sprite->data[2] <= 11) + sprite->data[1] -= 40; + else + sprite->data[1] += 40; - ++sprite->data[2]; + sprite->data[2]++; - sub_8078FDC(sprite, 0, 256, sprite->data[1], 0); + sub_8078FDC(sprite, 0, 256, sprite->data[1], 0); - matrixNum = sprite->oam.matrixNum; + matrixNum = sprite->oam.matrixNum; - t1 = 15616; - t2 = gOamMatrices[matrixNum].d; - t3 = t1 / t2 + 1; + t1 = 15616; + t2 = t1 / gOamMatrices[matrixNum].d + 1; - if (t3 > 128) - { - t3 = 128; - } + if (t2 > 128) + t2 = 128; - /* NONMATCHING - * compiles to: - * asr r0, r0, #0x1 - strh r0, [r5, #0x26] - * needed: - * asrs r1, r0, 1 - * strh r1, [r5, 0x26] */ - sprite->pos2.y = (64 - t3) / 2; + t2 = (64 - t2) / 2; + sprite->pos2.y = t2; - if (sprite->data[2] == 24) - { - sub_8079098(sprite); - DestroyAnimSprite(sprite); - } + if (sprite->data[2] == 24) + { + sub_8079098(sprite); + DestroyAnimSprite(sprite); + } + break; } } -#else -NAKED -void sub_80DB374(struct Sprite *sprite) -{ - asm_unified("push {r4,r5,lr}\n\ - sub sp, 0x4\n\ - adds r5, r0, 0\n\ - movs r1, 0x2E\n\ - ldrsh r0, [r5, r1]\n\ - cmp r0, 0\n\ - beq _080DB388\n\ - cmp r0, 0x1\n\ - beq _080DB3E0\n\ - b _080DB44C\n\ -_080DB388:\n\ - ldr r0, _080DB398 @ =gBattleAnimArgs\n\ - movs r2, 0\n\ - ldrsh r0, [r0, r2]\n\ - cmp r0, 0\n\ - bne _080DB3A0\n\ - ldr r4, _080DB39C @ =gBattleAnimAttacker\n\ - b _080DB3A2\n\ - .align 2, 0\n\ -_080DB398: .4byte gBattleAnimArgs\n\ -_080DB39C: .4byte gBattleAnimAttacker\n\ -_080DB3A0:\n\ - ldr r4, _080DB3DC @ =gBattleAnimTarget\n\ -_080DB3A2:\n\ - ldrb r0, [r4]\n\ - movs r1, 0\n\ - bl GetBattlerSpriteCoord\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - strh r0, [r5, 0x20]\n\ - ldrb r0, [r4]\n\ - movs r1, 0x1\n\ - bl GetBattlerSpriteCoord\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - strh r0, [r5, 0x22]\n\ - movs r0, 0\n\ - movs r3, 0x80\n\ - lsls r3, 2\n\ - strh r3, [r5, 0x30]\n\ - movs r2, 0x80\n\ - lsls r2, 1\n\ - str r0, [sp]\n\ - adds r0, r5, 0\n\ - movs r1, 0\n\ - bl sub_8078FDC\n\ - ldrh r0, [r5, 0x2E]\n\ - adds r0, 0x1\n\ - strh r0, [r5, 0x2E]\n\ - b _080DB44C\n\ - .align 2, 0\n\ -_080DB3DC: .4byte gBattleAnimTarget\n\ -_080DB3E0:\n\ - movs r1, 0x32\n\ - ldrsh r0, [r5, r1]\n\ - cmp r0, 0xB\n\ - bgt _080DB3EE\n\ - ldrh r0, [r5, 0x30]\n\ - subs r0, 0x28\n\ - b _080DB3F2\n\ -_080DB3EE:\n\ - ldrh r0, [r5, 0x30]\n\ - adds r0, 0x28\n\ -_080DB3F2:\n\ - strh r0, [r5, 0x30]\n\ - ldrh r0, [r5, 0x32]\n\ - adds r0, 0x1\n\ - movs r1, 0\n\ - strh r0, [r5, 0x32]\n\ - movs r2, 0x80\n\ - lsls r2, 1\n\ - movs r0, 0x30\n\ - ldrsh r3, [r5, r0]\n\ - str r1, [sp]\n\ - adds r0, r5, 0\n\ - bl sub_8078FDC\n\ - ldrb r1, [r5, 0x3]\n\ - lsls r1, 26\n\ - lsrs r1, 27\n\ - movs r0, 0xF4\n\ - lsls r0, 6\n\ - ldr r2, _080DB454 @ =gOamMatrices\n\ - lsls r1, 3\n\ - adds r1, r2\n\ - movs r2, 0x6\n\ - ldrsh r1, [r1, r2]\n\ - bl __divsi3\n\ - adds r1, r0, 0x1\n\ - cmp r1, 0x80\n\ - ble _080DB42C\n\ - movs r1, 0x80\n\ -_080DB42C:\n\ - movs r0, 0x40\n\ - subs r0, r1\n\ - lsrs r1, r0, 31\n\ - adds r0, r1\n\ - asrs r1, r0, 1\n\ - strh r1, [r5, 0x26]\n\ - movs r1, 0x32\n\ - ldrsh r0, [r5, r1]\n\ - cmp r0, 0x18\n\ - bne _080DB44C\n\ - adds r0, r5, 0\n\ - bl sub_8079098\n\ - adds r0, r5, 0\n\ - bl DestroyAnimSprite\n\ -_080DB44C:\n\ - add sp, 0x4\n\ - pop {r4,r5}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080DB454: .4byte gOamMatrices\n"); -} -#endif void sub_80DB458(struct Sprite *sprite) { diff --git a/src/battle/anim/ice.c b/src/battle/anim/ice.c index e41057d72..438c61f9f 100644 --- a/src/battle/anim/ice.c +++ b/src/battle/anim/ice.c @@ -26,6 +26,7 @@ extern struct INCBIN_U8 gBattleAnimFogTilemap; extern struct INCBIN_U8 gWeatherFog1Tiles; static void sub_80D7704(struct Sprite *sprite); +static void sub_80D7888(struct Sprite *sprite); static void AnimIcePunchSwirlingParticle(struct Sprite *sprite); static void AnimIceBeamParticle(struct Sprite *sprite); static void AnimIceEffectParticle(struct Sprite *sprite); @@ -53,7 +54,15 @@ static void AnimIceBallParticle(struct Sprite *sprite); static void AnimTask_Haze2(u8 taskId); static void AnimTask_OverlayFogTiles(u8 taskId); static void AnimTask_Hail2(u8 taskId); -bool8 sub_80D8BA8(u8 a1, u8 a2, u8 a3, u8 a4); +bool8 sub_80D8BA8(u8 hailStructId, u8 affineAnimNum, u8 taskId, u8 c); + +struct HailStruct +{ + s32 x:10; + s32 y:10; + s32 bPosition:8; + s32 unk3:4; +}; const union AnimCmd gSpriteAnim_83D9B58[] = { @@ -374,18 +383,18 @@ const struct SpriteTemplate gPoisonGasCloudSpriteTemplate = .callback = InitPoisonGasCloudAnim, }; -const u8 gUnknown_083D9DC4[][4] = -{ - {0x64, 0xE0, 0x01, 0x20}, - {0x55, 0xE0, 0x01, 0x00}, - {0xF2, 0xE0, 0x11, 0x10}, - {0x42, 0xE0, 0x21, 0x10}, - {0xB6, 0xE0, 0x31, 0x00}, - {0x3C, 0xE0, 0x01, 0x20}, - {0xD6, 0xE0, 0x11, 0x00}, - {0x71, 0xE0, 0x01, 0x10}, - {0xD2, 0xE0, 0x31, 0x10}, - {0x26, 0xE0, 0x21, 0x00}, +const struct HailStruct gUnknown_083D9DC4[] = +{ + {.x = 100, .y = 120, .bPosition = B_POSITION_PLAYER_LEFT, .unk3 = 2}, + {.x = 85, .y = 120, .bPosition = B_POSITION_PLAYER_LEFT, .unk3 = 0}, + {.x = 242, .y = 120, .bPosition = B_POSITION_OPPONENT_LEFT, .unk3 = 1}, + {.x = 66, .y = 120, .bPosition = B_POSITION_PLAYER_RIGHT, .unk3 = 1}, + {.x = 182, .y = 120, .bPosition = B_POSITION_OPPONENT_RIGHT, .unk3 = 0}, + {.x = 60, .y = 120, .bPosition = B_POSITION_PLAYER_LEFT, .unk3 = 2}, + {.x = 214, .y = 120, .bPosition = B_POSITION_OPPONENT_LEFT, .unk3 = 0}, + {.x = 113, .y = 120, .bPosition = B_POSITION_PLAYER_LEFT, .unk3 = 1}, + {.x = 210, .y = 120, .bPosition = B_POSITION_OPPONENT_RIGHT, .unk3 = 1}, + {.x = 38, .y = 120, .bPosition = B_POSITION_PLAYER_RIGHT, .unk3 = 0}, }; const union AffineAnimCmd gSpriteAffineAnim_83D9DEC[] = @@ -528,266 +537,46 @@ const struct SpriteTemplate gIceBallParticleSpriteTemplate = .callback = InitIceBallParticle, }; -// unknown - potentially used in weather ball -// TODO: decompile function and name it -/* -// NOT EQUIVALENT static void sub_80D7704(struct Sprite *sprite) { - // - //u16 battler1, battler2, battler3, battler4; // - u16 r9, r8, r3, r6; - //s16 r4, r10; + s16 targetX, targetY, attackerX, attackerY; sprite->oam.tileNum += 7; - - //u8 battler1, battler2, battler3, battler4; - - //battler1 = GetBattlerSpriteCoord(gBattleAnimTarget, 2); - //battler2 = GetBattlerSpriteCoord(gBattleAnimTarget, 3); - //battler3 = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); - //battler4 = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); - - //sprite->oam.tileNum += 7; - - //sprite->data[0] = gBattleAnimArgs[4]; - - //sprite->data[1] = battler3 + gBattleAnimArgs[0]; //??? - //sprite->data[2] = battler1 + gBattleAnimArgs[2]; - //sprite->data[3] = battler4 + gBattleAnimArgs[1]; - //sprite->data[4] = battler2 + gBattleAnimArgs[3]; - - r9 = GetBattlerSpriteCoord(gBattleAnimTarget, 2); - r8 = GetBattlerSpriteCoord(gBattleAnimTarget, 3); - r3 = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); - r6 = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); - + targetX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); + targetY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); + attackerX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); + attackerY = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[1] = gBattleAnimArgs[0] + attackerX; + sprite->data[2] = gBattleAnimArgs[2] + targetX; + sprite->data[3] = gBattleAnimArgs[1] + attackerY; + sprite->data[4] = gBattleAnimArgs[3] + targetY; + sub_8078314(sprite); - sprite->data[1] = r3 + gBattleAnimArgs[0]; //??? - sprite->data[2] = r9 + gBattleAnimArgs[2]; - sprite->data[3] = r6 + gBattleAnimArgs[1]; - sprite->data[4] = r8 + gBattleAnimArgs[3]; - - //sprite->data[0] = gBattleAnimArgs; + for (;(targetX >= -32 && targetX <= 272) && (targetY >= -32 && targetY <= 192); + targetX += sprite->data[1], targetY += sprite->data[2]) + ; + sprite->data[1] = -sprite->data[1]; + sprite->data[2] = -sprite->data[2]; + for (;(attackerX >= -32 && attackerX <= 272) && (attackerY >= -32 && attackerY <= 192); + attackerX += sprite->data[1], attackerY += sprite->data[2]) + ; + sprite->pos1.x = attackerX; + sprite->pos1.y = attackerY; + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[1] = attackerX; + sprite->data[2] = targetX; + sprite->data[3] = attackerY; + sprite->data[4] = targetY; sub_8078314(sprite); - - if ((u32)(r9 + 32) <= 304 || (u32)(r8 + 32) <= 224) // cmp 1 - { - r4 = sprite->data[1]; - r10 = 304; - - // _080D77AA - for (int i = 0; i < 3; i++) - { - // - if (((u32)((s16)r9 + r4) + (0x80 << 14)) >> 16 > 304 - || ((u32)((s16)r8 + r4) + (0x80 << 14)) >> 16 > 0xE0) - { - break; - } - } - } - // _080D77DE -} -*/ - -NAKED static void sub_80D7704(struct Sprite *sprite) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0x4\n" - "\tadds r5, r0, 0\n" - "\tldrh r2, [r5, 0x4]\n" - "\tlsls r1, r2, 22\n" - "\tlsrs r1, 22\n" - "\tadds r1, 0x7\n" - "\tldr r3, _080D780C @ =0x000003ff\n" - "\tadds r0, r3, 0\n" - "\tands r1, r0\n" - "\tldr r0, _080D7810 @ =0xfffffc00\n" - "\tands r0, r2\n" - "\torrs r0, r1\n" - "\tstrh r0, [r5, 0x4]\n" - "\tldr r4, _080D7814 @ =gBattleAnimTarget\n" - "\tldrb r0, [r4]\n" - "\tmovs r1, 0x2\n" - "\tbl GetBattlerSpriteCoord\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tmov r9, r0\n" - "\tldrb r0, [r4]\n" - "\tmovs r1, 0x3\n" - "\tbl GetBattlerSpriteCoord\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tmov r8, r0\n" - "\tldr r4, _080D7818 @ =gBattleAnimAttacker\n" - "\tldrb r0, [r4]\n" - "\tmovs r1, 0x2\n" - "\tbl GetBattlerSpriteCoord\n" - "\tlsls r0, 24\n" - "\tlsrs r3, r0, 24\n" - "\tldrb r0, [r4]\n" - "\tmovs r1, 0x3\n" - "\tstr r3, [sp]\n" - "\tbl GetBattlerSpriteCoord\n" - "\tlsls r0, 24\n" - "\tlsrs r6, r0, 24\n" - "\tldr r1, _080D781C @ =gBattleAnimArgs\n" - "\tldrh r0, [r1, 0x8]\n" - "\tstrh r0, [r5, 0x2E]\n" - "\tldrh r0, [r1]\n" - "\tldr r3, [sp]\n" - "\tadds r0, r3\n" - "\tstrh r0, [r5, 0x30]\n" - "\t ldrh r0, [r1, 0x4]\n" - "\t mov r4, r9\n" - "\t adds r0, r4, r0\n" - "\tstrh r0, [r5, 0x32]\n" - "\tldrh r0, [r1, 0x2]\n" - "\tadds r0, r6\n" - "\tstrh r0, [r5, 0x34]\n" - "\tldrh r0, [r1, 0x6]\n" - "\tmov r7, r8\n" - "\tadds r0, r7, r0\n" - "\tstrh r0, [r5, 0x36]\n" - "\tadds r0, r5, 0\n" - "\tbl sub_8078314\n" - "\tadds r4, 0x20\n" - "\tmovs r0, 0x98\n" - "\tlsls r0, 1\n" - "\tmov r12, r0\n" - "\tldr r3, [sp]\n" - "\tcmp r4, r12\n" - "\tbhi _080D77DE\n" - "\tadds r0, r7, 0\n" - "\tadds r0, 0x20\n" - "\tldrh r1, [r5, 0x30]\n" - "\tldrh r2, [r5, 0x32]\n" - "\tcmp r0, 0xE0\n" - "\tbhi _080D77DE\n" - "\tadds r4, r1, 0\n" - "\tmov r10, r12\n" - "_080D77AA:\n" - "\tmov r7, r9\n" - "\tlsls r1, r7, 16\n" - "\tasrs r1, 16\n" - "\tadds r1, r4\n" - "\tlsls r1, 16\n" - "\tmov r7, r8\n" - "\tlsls r0, r7, 16\n" - "\tasrs r0, 16\n" - "\tadds r0, r2\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tmov r8, r0\n" - "\tlsrs r0, r1, 16\n" - "\tmov r9, r0\n" - "\tmovs r7, 0x80\n" - "\tlsls r7, 14\n" - "\tadds r1, r7\n" - "\tlsrs r1, 16\n" - "\tcmp r1, r10\n" - "\tbhi _080D77DE\n" - "\tmov r1, r8\n" - "\tlsls r0, r1, 16\n" - "\tadds r0, r7\n" - "\tlsrs r0, 16\n" - "\tcmp r0, 0xE0\n" - "\tbls _080D77AA\n" - "_080D77DE:\n" - "\tldrh r0, [r5, 0x30]\n" - "\tnegs r7, r0\n" - "\tstrh r7, [r5, 0x30]\n" - "\tldrh r0, [r5, 0x32]\n" - "\tnegs r4, r0\n" - "\tstrh r4, [r5, 0x32]\n" - "\tlsls r0, r3, 16\n" - "\tmovs r1, 0x80\n" - "\tlsls r1, 14\n" - "\tadds r0, r1\n" - "\tlsrs r0, 16\n" - "\tmovs r2, 0x98\n" - "\tlsls r2, 1\n" - "\tmov r12, r2\n" - "\tldr r1, _080D781C @ =gBattleAnimArgs\n" - "\tmov r10, r1\n" - "\tcmp r0, r12\n" - "\tbhi _080D784A\n" - "\tlsls r1, r6, 16\n" - "\tmovs r2, 0x80\n" - "\tlsls r2, 14\n" - "\tadds r0, r1, r2\n" - "\tb _080D7842\n" - "\t.align 2, 0\n" - "_080D780C: .4byte 0x000003ff\n" - "_080D7810: .4byte 0xfffffc00\n" - "_080D7814: .4byte gBattleAnimTarget\n" - "_080D7818: .4byte gBattleAnimAttacker\n" - "_080D781C: .4byte gBattleAnimArgs\n" - "_080D7820:\n" - "\tlsls r1, r3, 16\n" - "\tasrs r1, 16\n" - "\tadds r1, r7\n" - "\tlsls r1, 16\n" - "\tasrs r0, r2, 16\n" - "\tadds r0, r4\n" - "\tlsls r0, 16\n" - "\tlsrs r6, r0, 16\n" - "\tlsrs r3, r1, 16\n" - "\tmovs r0, 0x80\n" - "\tlsls r0, 14\n" - "\tadds r1, r0\n" - "\tlsrs r1, 16\n" - "\tcmp r1, r12\n" - "\tbhi _080D784A\n" - "\tlsls r1, r6, 16\n" - "\tadds r0, r1, r0\n" - "_080D7842:\n" - "\tlsrs r0, 16\n" - "\tadds r2, r1, 0\n" - "\tcmp r0, 0xE0\n" - "\tbls _080D7820\n" - "_080D784A:\n" - "\tstrh r3, [r5, 0x20]\n" - "\tstrh r6, [r5, 0x22]\n" - "\tmov r1, r10\n" - "\tldrh r0, [r1, 0x8]\n" - "\tstrh r0, [r5, 0x2E]\n" - "\tstrh r3, [r5, 0x30]\n" - "\tmov r2, r9\n" - "\tstrh r2, [r5, 0x32]\n" - "\tstrh r6, [r5, 0x34]\n" - "\tmov r3, r8\n" - "\tstrh r3, [r5, 0x36]\n" - "\tadds r0, r5, 0\n" - "\tbl sub_8078314\n" - "\tmov r7, r10\n" - "\tldrh r0, [r7, 0xA]\n" - "\tstrh r0, [r5, 0x34]\n" - "\tldrh r0, [r7, 0xC]\n" - "\tstrh r0, [r5, 0x36]\n" - "\tldr r0, _080D7884 @ =sub_80D7888\n" - "\tstr r0, [r5, 0x1C]\n" - "\tadd sp, 0x4\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_080D7884: .4byte sub_80D7888"); + sprite->data[3] = gBattleAnimArgs[5]; + sprite->data[4] = gBattleAnimArgs[6]; + sprite->callback = sub_80D7888; } -void sub_80D7888(struct Sprite *sprite) +static void sub_80D7888(struct Sprite *sprite) { if (sprite->data[0] != 0) { @@ -1460,13 +1249,9 @@ static void InitPoisonGasCloudAnim(struct Sprite *sprite) } // Animates the gas clouds towards the target mon in Poison Gas. -// functionally correct, but there appears to be an unused local variable causing -// switch case 1 to not match -#ifdef NONMATCHING static void sub_80D8874(struct Sprite *sprite) { int value; - register s16 value2 asm("r5"); switch (sprite->data[7] & 0xFF) { @@ -1481,19 +1266,20 @@ static void sub_80D8874(struct Sprite *sprite) if (sprite->data[0] <= 0) { - value2 = 80; - sprite->data[0] = value2; - sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 0); + sprite->data[0] = 80; + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); sprite->data[1] = sprite->pos1.x; sprite->data[2] = sprite->pos1.x; sprite->pos1.y += sprite->pos2.y; sprite->data[3] = sprite->pos1.y; sprite->data[4] = sprite->pos1.y + 29; sprite->data[7]++; - if (gMain.inBattle && gBattlerPositions[gBattleAnimTarget] & 1) + if (!gMain.inBattle) + sprite->data[5] = 80; + else if (gBattlerPositions[gBattleAnimTarget] & 1) sprite->data[5] = 204; else - sprite->data[5] = value2; + sprite->data[5] = 80; sprite->pos2.y = 0; value = gSineTable[sprite->data[5]]; @@ -1530,12 +1316,13 @@ static void sub_80D8874(struct Sprite *sprite) if (sprite->data[0] <= 0) { - asm("mov r2, #0"); // unused local variable? sprite->data[0] = 0x300; sprite->data[1] = sprite->pos1.x += sprite->pos2.x; sprite->data[3] = sprite->pos1.y += sprite->pos2.y; sprite->data[4] = sprite->pos1.y + 4; - if (gMain.inBattle && gBattlerPositions[gBattleAnimTarget] & 1) + if (!gMain.inBattle) + sprite->data[2] = -0x10; + else if (gBattlerPositions[gBattleAnimTarget] & 1) sprite->data[2] = 0x100; else sprite->data[2] = -0x10; @@ -1560,321 +1347,6 @@ static void sub_80D8874(struct Sprite *sprite) break; } } -#else -NAKED static void sub_80D8874(struct Sprite *sprite) -{ - asm_unified("\tpush {r4-r6,lr}\n" - "\tadds r4, r0, 0\n" - "\tldrh r0, [r4, 0x3C]\n" - "\tmovs r5, 0xFF\n" - "\tmovs r1, 0xFF\n" - "\tands r1, r0\n" - "\tcmp r1, 0x1\n" - "\tbeq _080D8968\n" - "\tcmp r1, 0x1\n" - "\tbgt _080D888E\n" - "\tcmp r1, 0\n" - "\tbeq _080D8896\n" - "\tb _080D8AD0\n" - "_080D888E:\n" - "\tcmp r1, 0x2\n" - "\tbne _080D8894\n" - "\tb _080D8A94\n" - "_080D8894:\n" - "\tb _080D8AD0\n" - "_080D8896:\n" - "\tadds r0, r4, 0\n" - "\tbl TranslateAnimLinear\n" - "\tldr r1, _080D88C0 @ =gSineTable\n" - "\tmovs r2, 0x38\n" - "\tldrsh r0, [r4, r2]\n" - "\tlsls r0, 1\n" - "\tadds r0, r1\n" - "\tmovs r1, 0\n" - "\tldrsh r0, [r0, r1]\n" - "\tasrs r0, 4\n" - "\tldrh r2, [r4, 0x24]\n" - "\tadds r0, r2\n" - "\tstrh r0, [r4, 0x24]\n" - "\tmovs r1, 0x3A\n" - "\tldrsh r0, [r4, r1]\n" - "\tcmp r0, 0\n" - "\tbeq _080D88C4\n" - "\tldrh r0, [r4, 0x38]\n" - "\tsubs r0, 0x8\n" - "\tb _080D88C8\n" - "\t.align 2, 0\n" - "_080D88C0: .4byte gSineTable\n" - "_080D88C4:\n" - "\tldrh r0, [r4, 0x38]\n" - "\tadds r0, 0x8\n" - "_080D88C8:\n" - "\tands r0, r5\n" - "\tstrh r0, [r4, 0x38]\n" - "\tmovs r2, 0x2E\n" - "\tldrsh r0, [r4, r2]\n" - "\tcmp r0, 0\n" - "\tble _080D88D6\n" - "\tb _080D8AD0\n" - "_080D88D6:\n" - "\tmovs r5, 0x50\n" - "\tstrh r5, [r4, 0x2E]\n" - "\tldr r6, _080D8928 @ =gBattleAnimTarget\n" - "\tldrb r0, [r6]\n" - "\tmovs r1, 0\n" - "\tbl GetBattlerSpriteCoord\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tstrh r0, [r4, 0x20]\n" - "\tstrh r0, [r4, 0x30]\n" - "\tstrh r0, [r4, 0x32]\n" - "\tldrh r0, [r4, 0x26]\n" - "\tldrh r1, [r4, 0x22]\n" - "\tadds r0, r1\n" - "\tstrh r0, [r4, 0x22]\n" - "\tstrh r0, [r4, 0x34]\n" - "\tadds r0, 0x1D\n" - "\tstrh r0, [r4, 0x36]\n" - "\tldrh r0, [r4, 0x3C]\n" - "\tadds r0, 0x1\n" - "\tstrh r0, [r4, 0x3C]\n" - "\tldr r0, _080D892C @ =gMain\n" - "\tldr r2, _080D8930 @ =0x0000043d\n" - "\tadds r0, r2\n" - "\tldrb r1, [r0]\n" - "\tmovs r0, 0x2\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _080D8938\n" - "\tldr r1, _080D8934 @ =gBattlerPositions\n" - "\tldrb r0, [r6]\n" - "\tadds r0, r1\n" - "\tldrb r1, [r0]\n" - "\tmovs r0, 0x1\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _080D8938\n" - "\tmovs r0, 0xCC\n" - "\tstrh r0, [r4, 0x38]\n" - "\tb _080D893A\n" - "\t.align 2, 0\n" - "_080D8928: .4byte gBattleAnimTarget\n" - "_080D892C: .4byte gMain\n" - "_080D8930: .4byte 0x0000043d\n" - "_080D8934: .4byte gBattlerPositions\n" - "_080D8938:\n" - "\tstrh r5, [r4, 0x38]\n" - "_080D893A:\n" - "\tmovs r0, 0\n" - "\tstrh r0, [r4, 0x26]\n" - "\tldr r1, _080D8964 @ =gSineTable\n" - "\tmovs r2, 0x38\n" - "\tldrsh r0, [r4, r2]\n" - "\tlsls r0, 1\n" - "\tadds r0, r1\n" - "\tmovs r1, 0\n" - "\tldrsh r0, [r0, r1]\n" - "\tasrs r0, 3\n" - "\tstrh r0, [r4, 0x24]\n" - "\tldrh r0, [r4, 0x38]\n" - "\tadds r0, 0x2\n" - "\tmovs r1, 0xFF\n" - "\tands r0, r1\n" - "\tstrh r0, [r4, 0x38]\n" - "\tadds r0, r4, 0\n" - "\tbl InitAnimLinearTranslation\n" - "\tb _080D8AD0\n" - "\t.align 2, 0\n" - "_080D8964: .4byte gSineTable\n" - "_080D8968:\n" - "\tadds r0, r4, 0\n" - "\tbl TranslateAnimLinear\n" - "\tldr r1, _080D89C8 @ =gSineTable\n" - "\tmovs r2, 0x38\n" - "\tldrsh r0, [r4, r2]\n" - "\tlsls r0, 1\n" - "\tadds r0, r1\n" - "\tmovs r2, 0\n" - "\tldrsh r0, [r0, r2]\n" - "\tasrs r0, 3\n" - "\tldrh r2, [r4, 0x24]\n" - "\tadds r0, r2\n" - "\tstrh r0, [r4, 0x24]\n" - "\tmovs r2, 0x38\n" - "\tldrsh r0, [r4, r2]\n" - "\tadds r0, 0x40\n" - "\tlsls r0, 1\n" - "\tadds r0, r1\n" - "\tmovs r2, 0\n" - "\tldrsh r1, [r0, r2]\n" - "\tlsls r0, r1, 1\n" - "\tadds r0, r1\n" - "\tnegs r0, r0\n" - "\tasrs r0, 8\n" - "\tldrh r1, [r4, 0x26]\n" - "\tadds r0, r1\n" - "\tstrh r0, [r4, 0x26]\n" - "\tldr r0, _080D89CC @ =gMain\n" - "\tldr r2, _080D89D0 @ =0x0000043d\n" - "\tadds r0, r2\n" - "\tldrb r1, [r0]\n" - "\tmovs r0, 0x2\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _080D89F2\n" - "\tldrh r1, [r4, 0x38]\n" - "\tadds r0, r1, 0\n" - "\tsubs r0, 0x40\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tadds r3, r1, 0\n" - "\tcmp r0, 0x7F\n" - "\tbhi _080D89D4\n" - "\tldrh r1, [r4, 0x3C]\n" - "\tlsls r1, 16\n" - "\tasrs r1, 24\n" - "\tb _080D89DC\n" - "\t.align 2, 0\n" - "_080D89C8: .4byte gSineTable\n" - "_080D89CC: .4byte gMain\n" - "_080D89D0: .4byte 0x0000043d\n" - "_080D89D4:\n" - "\tldrh r1, [r4, 0x3C]\n" - "\tlsls r1, 16\n" - "\tasrs r1, 24\n" - "\tadds r1, 0x1\n" - "_080D89DC:\n" - "\tmovs r0, 0x3\n" - "\tands r1, r0\n" - "\tlsls r1, 2\n" - "\tldrb r2, [r4, 0x5]\n" - "\tmovs r0, 0xD\n" - "\tnegs r0, r0\n" - "\tands r0, r2\n" - "\torrs r0, r1\n" - "\tstrb r0, [r4, 0x5]\n" - "\tadds r0, r3, 0x4\n" - "\tb _080D8A12\n" - "_080D89F2:\n" - "\tldrh r0, [r4, 0x38]\n" - "\tsubs r0, 0x40\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tcmp r0, 0x7F\n" - "\tbhi _080D8A06\n" - "\tadds r1, r4, 0\n" - "\tadds r1, 0x43\n" - "\tmovs r0, 0x80\n" - "\tb _080D8A0C\n" - "_080D8A06:\n" - "\tadds r1, r4, 0\n" - "\tadds r1, 0x43\n" - "\tmovs r0, 0x8C\n" - "_080D8A0C:\n" - "\tstrb r0, [r1]\n" - "\tldrh r0, [r4, 0x38]\n" - "\tsubs r0, 0x4\n" - "_080D8A12:\n" - "\tmovs r1, 0xFF\n" - "\tands r0, r1\n" - "\tstrh r0, [r4, 0x38]\n" - "\tmovs r1, 0x2E\n" - "\tldrsh r0, [r4, r1]\n" - "\tcmp r0, 0\n" - "\tbgt _080D8AD0\n" - "\tmovs r2, 0\n" - "\tmovs r0, 0xC0\n" - "\tlsls r0, 2\n" - "\tstrh r0, [r4, 0x2E]\n" - "\tldrh r0, [r4, 0x24]\n" - "\tldrh r1, [r4, 0x20]\n" - "\tadds r0, r1\n" - "\tstrh r0, [r4, 0x20]\n" - "\tstrh r0, [r4, 0x30]\n" - "\tldrh r0, [r4, 0x26]\n" - "\tldrh r1, [r4, 0x22]\n" - "\tadds r0, r1\n" - "\tstrh r0, [r4, 0x22]\n" - "\tstrh r0, [r4, 0x34]\n" - "\tadds r0, 0x4\n" - "\tstrh r0, [r4, 0x36]\n" - "\tldr r0, _080D8A68 @ =gMain\n" - "\tldr r1, _080D8A6C @ =0x0000043d\n" - "\tadds r0, r1\n" - "\tldrb r1, [r0]\n" - "\tmovs r0, 0x2\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _080D8A78\n" - "\tldr r1, _080D8A70 @ =gBattlerPositions\n" - "\tldr r0, _080D8A74 @ =gBattleAnimTarget\n" - "\tldrb r0, [r0]\n" - "\tadds r0, r1\n" - "\tldrb r1, [r0]\n" - "\tmovs r0, 0x1\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _080D8A78\n" - "\tmovs r0, 0x80\n" - "\tlsls r0, 1\n" - "\tb _080D8A7A\n" - "\t.align 2, 0\n" - "_080D8A68: .4byte gMain\n" - "_080D8A6C: .4byte 0x0000043d\n" - "_080D8A70: .4byte gBattlerPositions\n" - "_080D8A74: .4byte gBattleAnimTarget\n" - "_080D8A78:\n" - "\tldr r0, _080D8A90 @ =0x0000fff0\n" - "_080D8A7A:\n" - "\tstrh r0, [r4, 0x32]\n" - "\tldrh r0, [r4, 0x3C]\n" - "\tadds r0, 0x1\n" - "\tmovs r1, 0\n" - "\tstrh r0, [r4, 0x3C]\n" - "\tstrh r1, [r4, 0x26]\n" - "\tstrh r1, [r4, 0x24]\n" - "\tadds r0, r4, 0\n" - "\tbl sub_8078BD4\n" - "\tb _080D8AD0\n" - "\t.align 2, 0\n" - "_080D8A90: .4byte 0x0000fff0\n" - "_080D8A94:\n" - "\tadds r0, r4, 0\n" - "\tbl TranslateAnimLinear\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbeq _080D8AD0\n" - "\tldrb r0, [r4, 0x1]\n" - "\tlsls r0, 30\n" - "\tlsrs r0, 30\n" - "\tmovs r1, 0x1\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _080D8AC2\n" - "\tldrb r0, [r4, 0x3]\n" - "\tlsls r0, 26\n" - "\tlsrs r0, 27\n" - "\tbl FreeOamMatrix\n" - "\tldrb r1, [r4, 0x1]\n" - "\tmovs r0, 0x4\n" - "\tnegs r0, r0\n" - "\tands r0, r1\n" - "\tstrb r0, [r4, 0x1]\n" - "_080D8AC2:\n" - "\tadds r0, r4, 0\n" - "\tbl DestroySprite\n" - "\tldr r1, _080D8AD8 @ =gAnimVisualTaskCount\n" - "\tldrb r0, [r1]\n" - "\tsubs r0, 0x1\n" - "\tstrb r0, [r1]\n" - "_080D8AD0:\n" - "\tpop {r4-r6}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_080D8AD8: .4byte gAnimVisualTaskCount"); -} -#endif // NONMATCHING // Creates Hail. void AnimTask_Hail1(u8 taskId) @@ -1929,266 +1401,63 @@ static void AnimTask_Hail2(u8 taskId) } } - -/* -// Something to do with Hail. -// possibly equivalent, possibly not -bool8 sub_80D8BA8(u8 a1, u8 a2, u8 a3, u8 a4)//(u8 spriteId, u8 taskId, u8 a3)//(u8 taskId) +bool8 sub_80D8BA8(u8 hailStructId, u8 affineAnimNum, u8 taskId, u8 c) { - // - //struct Task *task = &gTasks[a2]; - //u16 i, j; - //task->data[3]++; - //u8 r5bank = ; - - //const struct SpriteTemplate *spriteTemplate; - u8 spriteId; + u8 id; + s16 battlerX, battlerY; + s16 spriteX; + bool8 possibleBool = FALSE; + s8 unk = gUnknown_083D9DC4[hailStructId].unk3; - s16 r6, r7; - - u32 tempA, tempB; // u32? s16? u16? u8? int? - - //u8 r6, r7; - - tempA = a3 + 0; - tempB = 0; - - // is that gunknown a tempvar? - - if (gUnknown_083D9DC4[a1][3] != 2 - || IsAnimBankSpriteVisible(GetBattlerAtPosition(gUnknown_083D9DC4[a1][2]))) + if (unk != 2) { - //return TRUE; - tempB = 1; - - r7 = GetBattlerSpriteCoord(GetBattlerAtPosition(gUnknown_083D9DC4[a1][2]), 2); - r6 = GetBattlerSpriteCoord(GetBattlerAtPosition(gUnknown_083D9DC4[a1][2]), 3); - - switch (gUnknown_083D9DC4[a1][3]) + id = GetBattlerAtPosition(gUnknown_083D9DC4[hailStructId].bPosition); + if (IsAnimBankSpriteVisible(id)) { - case 0: - // - r7 -= GetBattlerSpriteCoordAttr(GetBattlerAtPosition(gUnknown_083D9DC4[a1][2]), 1) / 6; - r6 -= GetBattlerSpriteCoordAttr(GetBattlerAtPosition(gUnknown_083D9DC4[a1][2]), 0) / 6; - break; - case 1: - // - r7 += GetBattlerSpriteCoordAttr(GetBattlerAtPosition(gUnknown_083D9DC4[a1][2]), 1) / 6; - r6 += GetBattlerSpriteCoordAttr(GetBattlerAtPosition(gUnknown_083D9DC4[a1][2]), 0) / 6; + possibleBool = TRUE; + battlerX = GetBattlerSpriteCoord(id, BATTLER_COORD_X_2); + battlerY = GetBattlerSpriteCoord(id, BATTLER_COORD_Y_PIC_OFFSET); + switch (unk) + { + case 0: + battlerX -= GetBattlerSpriteCoordAttr(id, BATTLER_COORD_ATTR_WIDTH) / 6; + battlerY -= GetBattlerSpriteCoordAttr(id, BATTLER_COORD_ATTR_HEIGHT) / 6; + break; + case 1: + battlerX += GetBattlerSpriteCoordAttr(id, BATTLER_COORD_ATTR_WIDTH) / 6; + battlerY += GetBattlerSpriteCoordAttr(id, BATTLER_COORD_ATTR_HEIGHT) / 6; + break; + } + } + else + { + battlerX = (gUnknown_083D9DC4[hailStructId].x); + battlerY = (gUnknown_083D9DC4[hailStructId].y); } } - else { - // _94 - r7 = gUnknown_083D9DC4[a1][0]; - r6 = gUnknown_083D9DC4[a1][1]; + battlerX = (gUnknown_083D9DC4[hailStructId].x); + battlerY = (gUnknown_083D9DC4[hailStructId].y); } - - spriteId = CreateSprite(&HailSpriteTemplate, r7 - r6, -0x8, 0x12); - - if (spriteId != 0x40) + spriteX = battlerX - ((battlerY + 8) / 2); + id = CreateSprite(&gHailSpriteTemplate, spriteX, -8, 18); + if (id == MAX_SPRITES) { - // - StartSpriteAffineAnim(&gSprites[spriteId], a2); - - gSprites[spriteId].data[0] = tempB; - gSprites[spriteId].data[3] = r7; - gSprites[spriteId].data[4] = r6; - - gSprites[spriteId].data[5] = a2; - gSprites[spriteId].data[6] = tempA; - gSprites[spriteId].data[7] = a4; - + return FALSE; + } + else + { + StartSpriteAffineAnim(&gSprites[id], affineAnimNum); + gSprites[id].data[0] = possibleBool; + gSprites[id].data[3] = battlerX; + gSprites[id].data[4] = battlerY; + gSprites[id].data[5] = affineAnimNum; + gSprites[id].data[6] = taskId; + gSprites[id].data[7] = c; return TRUE; } - - return FALSE; - -} -//*/ - -//* -NAKED bool8 sub_80D8BA8(u8 a1, u8 a2, u8 a3, u8 a4) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0x8\n" - "\tlsls r0, 24\n" - "\tlsls r1, 24\n" - "\tlsrs r1, 24\n" - "\tmov r9, r1\n" - "\tlsls r2, 24\n" - "\tlsrs r2, 24\n" - "\tstr r2, [sp]\n" - "\tlsls r3, 24\n" - "\tlsrs r3, 24\n" - "\tmov r10, r3\n" - "\tmovs r1, 0\n" - "\tstr r1, [sp, 0x4]\n" - "\tldr r1, _080D8C20 @ =gUnknown_083D9DC4\n" - "\tlsrs r0, 22\n" - "\tadds r4, r0, r1\n" - "\tldrb r0, [r4, 0x3]\n" - "\tlsls r0, 24\n" - "\tasrs r0, 28\n" - "\tmov r8, r0\n" - "\tcmp r0, 0x2\n" - "\tbeq _080D8C94\n" - "\tldrh r0, [r4, 0x2]\n" - "\tlsls r0, 20\n" - "\tlsrs r0, 24\n" - "\tbl GetBattlerAtPosition\n" - "\tlsls r0, 24\n" - "\tlsrs r5, r0, 24\n" - "\tadds r0, r5, 0\n" - "\tbl IsAnimBankSpriteVisible\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbeq _080D8C94\n" - "\tmovs r0, 0x1\n" - "\tstr r0, [sp, 0x4]\n" - "\tadds r0, r5, 0\n" - "\tmovs r1, 0x2\n" - "\tbl GetBattlerSpriteCoord\n" - "\tlsls r0, 24\n" - "\tlsrs r7, r0, 24\n" - "\tadds r0, r5, 0\n" - "\tmovs r1, 0x3\n" - "\tbl GetBattlerSpriteCoord\n" - "\tlsls r0, 24\n" - "\tlsrs r6, r0, 24\n" - "\tmov r1, r8\n" - "\tcmp r1, 0\n" - "\tbeq _080D8C24\n" - "\tcmp r1, 0x1\n" - "\tbeq _080D8C5A\n" - "\tb _080D8CA6\n" - "\t.align 2, 0\n" - "_080D8C20: .4byte gUnknown_083D9DC4\n" - "_080D8C24:\n" - "\tadds r0, r5, 0\n" - "\tmovs r1, 0x1\n" - "\tbl GetBattlerSpriteCoordAttr\n" - "\tlsls r0, 16\n" - "\tasrs r0, 16\n" - "\tmovs r1, 0x6\n" - "\tbl __divsi3\n" - "\tlsls r1, r7, 16\n" - "\tasrs r1, 16\n" - "\tsubs r1, r0\n" - "\tlsls r1, 16\n" - "\tlsrs r7, r1, 16\n" - "\tadds r0, r5, 0\n" - "\tmovs r1, 0\n" - "\tbl GetBattlerSpriteCoordAttr\n" - "\tlsls r0, 16\n" - "\tasrs r0, 16\n" - "\tmovs r1, 0x6\n" - "\tbl __divsi3\n" - "\tlsls r1, r6, 16\n" - "\tasrs r1, 16\n" - "\tsubs r1, r0\n" - "\tb _080D8C8E\n" - "_080D8C5A:\n" - "\tadds r0, r5, 0\n" - "\tmovs r1, 0x1\n" - "\tbl GetBattlerSpriteCoordAttr\n" - "\tlsls r0, 16\n" - "\tasrs r0, 16\n" - "\tmovs r1, 0x6\n" - "\tbl __divsi3\n" - "\tlsls r1, r7, 16\n" - "\tasrs r1, 16\n" - "\tadds r1, r0\n" - "\tlsls r1, 16\n" - "\tlsrs r7, r1, 16\n" - "\tadds r0, r5, 0\n" - "\tmovs r1, 0\n" - "\tbl GetBattlerSpriteCoordAttr\n" - "\tlsls r0, 16\n" - "\tasrs r0, 16\n" - "\tmovs r1, 0x6\n" - "\tbl __divsi3\n" - "\tlsls r1, r6, 16\n" - "\tasrs r1, 16\n" - "\tadds r1, r0\n" - "_080D8C8E:\n" - "\tlsls r1, 16\n" - "\tlsrs r6, r1, 16\n" - "\tb _080D8CA6\n" - "_080D8C94:\n" - "\tldrh r0, [r4]\n" - "\tlsls r0, 22\n" - "\tasrs r0, 6\n" - "\tlsrs r7, r0, 16\n" - "\tldr r0, [r4]\n" - "\tlsls r0, 12\n" - "\tasrs r0, 22\n" - "\tlsls r0, 16\n" - "\tlsrs r6, r0, 16\n" - "_080D8CA6:\n" - "\tlsls r0, r6, 16\n" - "\tasrs r0, 16\n" - "\tadds r0, 0x8\n" - "\tlsrs r1, r0, 31\n" - "\tadds r0, r1\n" - "\tasrs r0, 1\n" - "\tlsls r1, r7, 16\n" - "\tasrs r1, 16\n" - "\tsubs r1, r0\n" - "\tldr r0, _080D8D00 @ =HailSpriteTemplate\n" - "\tlsls r1, 16\n" - "\tasrs r1, 16\n" - "\tmovs r2, 0x8\n" - "\tnegs r2, r2\n" - "\tmovs r3, 0x12\n" - "\tbl CreateSprite\n" - "\tlsls r0, 24\n" - "\tlsrs r5, r0, 24\n" - "\tcmp r5, 0x40\n" - "\tbeq _080D8D08\n" - "\tlsls r4, r5, 4\n" - "\tadds r4, r5\n" - "\tlsls r4, 2\n" - "\tldr r0, _080D8D04 @ =gSprites\n" - "\tadds r4, r0\n" - "\tadds r0, r4, 0\n" - "\tmov r1, r9\n" - "\tbl StartSpriteAffineAnim\n" - "\tmov r0, sp\n" - "\tldrh r0, [r0, 0x4]\n" - "\tstrh r0, [r4, 0x2E]\n" - "\tstrh r7, [r4, 0x34]\n" - "\tstrh r6, [r4, 0x36]\n" - "\tmov r1, r9\n" - "\tstrh r1, [r4, 0x38]\n" - "\tmov r0, sp\n" - "\tldrh r0, [r0]\n" - "\tstrh r0, [r4, 0x3A]\n" - "\tmov r1, r10\n" - "\tstrh r1, [r4, 0x3C]\n" - "\tmovs r0, 0x1\n" - "\tb _080D8D0A\n" - "\t.align 2, 0\n" - "_080D8D00: .4byte gHailSpriteTemplate\n" - "_080D8D04: .4byte gSprites\n" - "_080D8D08:\n" - "\tmovs r0, 0\n" - "_080D8D0A:\n" - "\tadd sp, 0x8\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r1}\n" - "\tbx r1"); } -//*/ static void AnimHailBegin(struct Sprite *sprite) { diff --git a/src/battle/anim/psychic.c b/src/battle/anim/psychic.c index 84a7741e1..c76e522f4 100644 --- a/src/battle/anim/psychic.c +++ b/src/battle/anim/psychic.c @@ -1042,17 +1042,14 @@ static void sub_80DC3F4(u8 taskId) } } -#ifdef NONMATCHING void sub_80DC4F4(u8 taskId) { s16 spriteId; - u8 matrixNum; - register u8 matrixNum2 asm("r6"); + s16 matrixNum; struct Task *task = &gTasks[taskId]; matrixNum = AllocOamMatrix(); - matrixNum2 = matrixNum; - if (matrixNum2 == 0xFF) + if (matrixNum == 0xFF) { DestroyAnimVisualTask(taskId); return; @@ -1068,7 +1065,7 @@ void sub_80DC4F4(u8 taskId) gSprites[spriteId].callback = SpriteCallbackDummy; gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE; - gSprites[spriteId].oam.matrixNum = matrixNum2; + gSprites[spriteId].oam.matrixNum = matrixNum; gSprites[spriteId].affineAnimPaused = 1; gSprites[spriteId].subpriority++; obj_id_set_rotscale(spriteId, 256, 256, 0); @@ -1079,132 +1076,6 @@ void sub_80DC4F4(u8 taskId) task->data[15] = spriteId; task->func = sub_80DC5F4; } -#else -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 GetAnimBattlerSpriteId\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) { diff --git a/src/battle/anim/water.c b/src/battle/anim/water.c index 98e50f17f..135ed43cb 100644 --- a/src/battle/anim/water.c +++ b/src/battle/anim/water.c @@ -1,5 +1,7 @@ #include "global.h" #include "battle.h" +#include "decompress.h" +#include "graphics.h" #include "battle_anim.h" #include "random.h" #include "rom_8077ABC.h" @@ -25,6 +27,7 @@ void sub_8078F40(u8); void sub_8079A64(u8); void sub_80D37FC(struct Sprite *sprite); void sub_80D3838(struct Sprite *sprite); +void sub_80D3B60(u8 taskId); void sub_80D3D68(u8 taskId); void sub_80D4044(struct Sprite *sprite); void sub_80D40A8(struct Sprite *); @@ -44,7 +47,7 @@ void sub_80D4BF0(struct Sprite *sprite); void sub_80D4C18(struct Sprite *); void sub_80D4CEC(struct Sprite *); void sub_80D4C64(struct Sprite *sprite); -void sub_80D4D64(struct Sprite*, int, int); +void sub_80D4D64(struct Sprite*, s32, s32); void sub_80E1864(u8); static void sub_80D3874(struct Sprite *sprite); @@ -260,329 +263,104 @@ static void sub_80D3874(struct Sprite *sprite) } } -NAKED void AnimTask_CreateSurfWave(u8 taskId) { - asm(".syntax unified\n\ - .equ REG_BLDCNT, 0x4000050\n\ - .equ REG_BG1CNT, 0x400000A\n\ - .equ REG_BG1HOFS, 0x4000014\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x14\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r10, r0\n\ - ldr r1, _080D398C @ =REG_BLDCNT\n\ - ldr r2, _080D3990 @ =0x00003f42\n\ - adds r0, r2, 0\n\ - strh r0, [r1]\n\ - adds r1, 0x2\n\ - movs r3, 0x80\n\ - lsls r3, 5\n\ - adds r0, r3, 0\n\ - strh r0, [r1]\n\ - ldr r2, _080D3994 @ =REG_BG1CNT\n\ - ldrb r1, [r2]\n\ - movs r0, 0x4\n\ - negs r0, r0\n\ - ands r0, r1\n\ - movs r1, 0x1\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldrb r1, [r2, 0x1]\n\ - movs r0, 0x3F\n\ - ands r0, r1\n\ - movs r1, 0x40\n\ - orrs r0, r1\n\ - strb r0, [r2, 0x1]\n\ - mov r0, sp\n\ - bl sub_8078914\n\ - ldr r2, [sp]\n\ - movs r3, 0x80\n\ - lsls r3, 6\n\ - add r6, sp, 0x10\n\ - add r0, sp, 0xC\n\ - mov r12, r0\n\ - movs r5, 0\n\ - ldr r1, _080D3998 @ =0x040000d4\n\ - movs r4, 0x80\n\ - lsls r4, 5\n\ - mov r8, r6\n\ - ldr r7, _080D399C @ =0x85000400\n\ - movs r0, 0x85\n\ - lsls r0, 24\n\ - mov r9, r0\n\ -_080D3920:\n\ - str r5, [sp, 0x10]\n\ - mov r0, r8\n\ - str r0, [r1]\n\ - str r2, [r1, 0x4]\n\ - str r7, [r1, 0x8]\n\ - ldr r0, [r1, 0x8]\n\ - adds r2, r4\n\ - subs r3, r4\n\ - cmp r3, r4\n\ - bhi _080D3920\n\ - str r5, [sp, 0x10]\n\ - str r6, [r1]\n\ - str r2, [r1, 0x4]\n\ - lsrs r0, r3, 2\n\ - mov r2, r9\n\ - orrs r0, r2\n\ - str r0, [r1, 0x8]\n\ - ldr r0, [r1, 0x8]\n\ - movs r0, 0\n\ - mov r3, r12\n\ - strb r0, [r3]\n\ - strb r0, [r3]\n\ - ldr r1, [sp, 0x4]\n\ - movs r0, 0\n\ - str r0, [sp, 0x10]\n\ - ldr r0, _080D3998 @ =0x040000d4\n\ - str r6, [r0]\n\ - str r1, [r0, 0x4]\n\ - ldr r1, _080D399C @ =0x85000400\n\ - str r1, [r0, 0x8]\n\ - ldr r0, [r0, 0x8]\n\ - bl IsContest\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _080D39B8\n\ - ldr r2, _080D3994 @ =REG_BG1CNT\n\ - ldrb r1, [r2]\n\ - movs r0, 0xD\n\ - negs r0, r0\n\ - ands r0, r1\n\ - movs r1, 0x4\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r0, _080D39A0 @ =gBattleAnimAttacker\n\ - ldrb r0, [r0]\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bne _080D39A8\n\ - ldr r0, _080D39A4 @ =gUnknown_08E70968\n\ - b _080D39AA\n\ - .align 2, 0\n\ -_080D398C: .4byte REG_BLDCNT\n\ -_080D3990: .4byte 0x00003f42\n\ -_080D3994: .4byte REG_BG1CNT\n\ -_080D3998: .4byte 0x040000d4\n\ -_080D399C: .4byte 0x85000400\n\ -_080D39A0: .4byte gBattleAnimAttacker\n\ -_080D39A4: .4byte gUnknown_08E70968\n\ -_080D39A8:\n\ - ldr r0, _080D39B4 @ =gUnknown_08E70C38\n\ -_080D39AA:\n\ - ldr r1, [sp, 0x4]\n\ - bl LZDecompressVram\n\ - b _080D39CE\n\ - .align 2, 0\n\ -_080D39B4: .4byte gUnknown_08E70C38\n\ -_080D39B8:\n\ - ldr r0, _080D39F0 @ =gUnknown_08E70F0C\n\ - ldr r1, [sp, 0x4]\n\ - bl LZDecompressVram\n\ - mov r0, sp\n\ - ldrb r0, [r0, 0x8]\n\ - ldr r1, [sp, 0x4]\n\ - movs r2, 0\n\ - movs r3, 0x1\n\ - bl sub_80763FC\n\ -_080D39CE:\n\ - ldr r0, _080D39F4 @ =gBattleAnimBackgroundImage_Surf\n\ - ldr r1, [sp]\n\ - bl LZDecompressVram\n\ - ldr r0, _080D39F8 @ =gBattleAnimArgs\n\ - movs r1, 0\n\ - ldrsh r0, [r0, r1]\n\ - cmp r0, 0\n\ - bne _080D3A00\n\ - ldr r0, _080D39FC @ =gBattleAnimBackgroundPalette_Surf\n\ - mov r1, sp\n\ - ldrb r1, [r1, 0x8]\n\ - lsls r1, 4\n\ - movs r2, 0x20\n\ - bl LoadCompressedPalette\n\ - b _080D3A0E\n\ - .align 2, 0\n\ -_080D39F0: .4byte gUnknown_08E70F0C\n\ -_080D39F4: .4byte gBattleAnimBackgroundImage_Surf\n\ -_080D39F8: .4byte gBattleAnimArgs\n\ -_080D39FC: .4byte gBattleAnimBackgroundPalette_Surf\n\ -_080D3A00:\n\ - ldr r0, _080D3A78 @ =gBattleAnimBackgroundImageMuddyWater_Pal\n\ - mov r1, sp\n\ - ldrb r1, [r1, 0x8]\n\ - lsls r1, 4\n\ - movs r2, 0x20\n\ - bl LoadCompressedPalette\n\ -_080D3A0E:\n\ - ldr r0, _080D3A7C @ =sub_80D3D68\n\ - ldr r4, _080D3A80 @ =gTasks\n\ - mov r2, r10\n\ - lsls r5, r2, 2\n\ - adds r1, r5, r2\n\ - lsls r1, 3\n\ - adds r6, r1, r4\n\ - ldrb r1, [r6, 0x7]\n\ - adds r1, 0x1\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - bl CreateTask\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r8, r0\n\ - movs r3, 0\n\ - mov r9, r3\n\ - mov r0, r8\n\ - strh r0, [r6, 0x26]\n\ - mov r1, r8\n\ - lsls r0, r1, 2\n\ - add r0, r8\n\ - lsls r0, 3\n\ - adds r7, r0, r4\n\ - mov r2, r9\n\ - strh r2, [r7, 0x8]\n\ - movs r0, 0x80\n\ - lsls r0, 5\n\ - strh r0, [r7, 0xA]\n\ - strh r0, [r7, 0xC]\n\ - bl IsContest\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - cmp r4, 0\n\ - beq _080D3A94\n\ - ldr r3, _080D3A84 @ =0x0000ffb0\n\ - adds r0, r3, 0\n\ - ldr r1, _080D3A88 @ =gBattle_BG1_X\n\ - strh r0, [r1]\n\ - ldr r2, _080D3A8C @ =0x0000ffd0\n\ - adds r0, r2, 0\n\ - ldr r3, _080D3A90 @ =gBattle_BG1_Y\n\ - strh r0, [r3]\n\ - movs r0, 0x2\n\ - strh r0, [r6, 0x8]\n\ - movs r0, 0x1\n\ - strh r0, [r6, 0xA]\n\ - mov r0, r9\n\ - strh r0, [r7, 0xE]\n\ - b _080D3AEE\n\ - .align 2, 0\n\ -_080D3A78: .4byte gBattleAnimBackgroundImageMuddyWater_Pal\n\ -_080D3A7C: .4byte sub_80D3D68\n\ -_080D3A80: .4byte gTasks\n\ -_080D3A84: .4byte 0x0000ffb0\n\ -_080D3A88: .4byte gBattle_BG1_X\n\ -_080D3A8C: .4byte 0x0000ffd0\n\ -_080D3A90: .4byte gBattle_BG1_Y\n\ -_080D3A94:\n\ - ldr r0, _080D3AC4 @ =gBattleAnimAttacker\n\ - ldrb r0, [r0]\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - lsrs r1, r0, 24\n\ - cmp r1, 0x1\n\ - bne _080D3AD8\n\ - ldr r2, _080D3AC8 @ =0x0000ff20\n\ - adds r0, r2, 0\n\ - ldr r3, _080D3ACC @ =gBattle_BG1_X\n\ - strh r0, [r3]\n\ - movs r2, 0x80\n\ - lsls r2, 1\n\ - adds r0, r2, 0\n\ - ldr r3, _080D3AD0 @ =gBattle_BG1_Y\n\ - strh r0, [r3]\n\ - movs r0, 0x2\n\ - strh r0, [r6, 0x8]\n\ - ldr r0, _080D3AD4 @ =0x0000ffff\n\ - strh r0, [r6, 0xA]\n\ - strh r1, [r7, 0xE]\n\ - b _080D3AEE\n\ - .align 2, 0\n\ -_080D3AC4: .4byte gBattleAnimAttacker\n\ -_080D3AC8: .4byte 0x0000ff20\n\ -_080D3ACC: .4byte gBattle_BG1_X\n\ -_080D3AD0: .4byte gBattle_BG1_Y\n\ -_080D3AD4: .4byte 0x0000ffff\n\ -_080D3AD8:\n\ - ldr r0, _080D3B1C @ =gBattle_BG1_X\n\ - strh r4, [r0]\n\ - ldr r1, _080D3B20 @ =0x0000ffd0\n\ - adds r0, r1, 0\n\ - ldr r2, _080D3B24 @ =gBattle_BG1_Y\n\ - strh r0, [r2]\n\ - ldr r0, _080D3B28 @ =0x0000fffe\n\ - strh r0, [r6, 0x8]\n\ - movs r0, 0x1\n\ - strh r0, [r6, 0xA]\n\ - strh r4, [r7, 0xE]\n\ -_080D3AEE:\n\ - ldr r1, _080D3B2C @ =REG_BG1HOFS\n\ - ldr r3, _080D3B1C @ =gBattle_BG1_X\n\ - ldrh r0, [r3]\n\ - strh r0, [r1]\n\ - adds r1, 0x2\n\ - ldr r2, _080D3B24 @ =gBattle_BG1_Y\n\ - ldrh r0, [r2]\n\ - strh r0, [r1]\n\ - ldr r1, _080D3B30 @ =gTasks\n\ - mov r3, r8\n\ - lsls r0, r3, 2\n\ - add r0, r8\n\ - lsls r0, 3\n\ - adds r2, r0, r1\n\ - movs r3, 0xE\n\ - ldrsh r0, [r2, r3]\n\ - cmp r0, 0\n\ - bne _080D3B34\n\ - movs r0, 0x30\n\ - strh r0, [r2, 0x10]\n\ - movs r0, 0x70\n\ - b _080D3B38\n\ - .align 2, 0\n\ -_080D3B1C: .4byte gBattle_BG1_X\n\ -_080D3B20: .4byte 0x0000ffd0\n\ -_080D3B24: .4byte gBattle_BG1_Y\n\ -_080D3B28: .4byte 0x0000fffe\n\ -_080D3B2C: .4byte REG_BG1HOFS\n\ -_080D3B30: .4byte gTasks\n\ -_080D3B34:\n\ - movs r0, 0\n\ - strh r0, [r2, 0x10]\n\ -_080D3B38:\n\ - strh r0, [r2, 0x12]\n\ - mov r2, r10\n\ - adds r0, r5, r2\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - movs r1, 0x1\n\ - strh r1, [r0, 0x14]\n\ - ldr r1, _080D3B5C @ =sub_80D3B60\n\ - str r1, [r0]\n\ - add sp, 0x14\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080D3B5C: .4byte sub_80D3B60\n\ - .syntax divided\n"); + struct Struct_sub_8078914 subStruct; + u8 taskId2; + u16 *BGptrX = &gBattle_BG1_X; + u16 *BGptrY = &gBattle_BG1_Y; + vu8 cpuDelay; // explanation below + + REG_BLDCNT = BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL; + REG_BLDALPHA = 0x1000; + REG_BG1CNT_BITFIELD.priority = 1; + REG_BG1CNT_BITFIELD.screenSize = 1; + sub_8078914(&subStruct); + + // This is gone in FireRed and Emerald. + Dma3FillLarge32_(0, subStruct.field_0, 0x2000); // ! + /* + Many games use wasteful NOPs; some of which are + even moreso than regular ones. This is so that + hardware operations can finish. + + This is just an example. Also, this is apparently + not a macro, as making it a macro results in a + NONMATCHING. + */ + cpuDelay = 0; // stall the CPU + cpuDelay = 0; // stall the CPU + Dma3FillLarge32_(0, subStruct.field_4, 0x1000); // ! + + if (!IsContest()) + { + REG_BG1CNT_BITFIELD.charBaseBlock = 1; + if (GetBattlerSide(gBattleAnimAttacker) == 1) + LZDecompressVram(&gUnknown_08E70968, subStruct.field_4); + else + LZDecompressVram(&gUnknown_08E70C38, subStruct.field_4); + } + else + { + LZDecompressVram(&gUnknown_08E70F0C, subStruct.field_4); + sub_80763FC(subStruct.field_8, (u16 *)subStruct.field_4, 0, 1); + } + LZDecompressVram(&gBattleAnimBackgroundImage_Surf, subStruct.field_0); + if (gBattleAnimArgs[0] == 0) + LoadCompressedPalette(&gBattleAnimBackgroundPalette_Surf, 16 * subStruct.field_8, 32); + else + LoadCompressedPalette(&gBattleAnimBackgroundImageMuddyWater_Pal, 16 * subStruct.field_8, 32); + taskId2 = CreateTask(sub_80D3D68, gTasks[taskId].priority + 1); + gTasks[taskId].data[15] = taskId2; + gTasks[taskId2].data[0] = 0; + gTasks[taskId2].data[1] = 0x1000; + gTasks[taskId2].data[2] = 0x1000; + if (IsContest()) + { + *BGptrX = -80; + *BGptrY = -48; + gTasks[taskId].data[0] = 2; + gTasks[taskId].data[1] = 1; + gTasks[taskId2].data[3] = 0; + } + else if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) + { + *BGptrX = -224; + *BGptrY = 256; + gTasks[taskId].data[0] = 2; + gTasks[taskId].data[1] = -1; + gTasks[taskId2].data[3] = 1; + } + else + { + *BGptrX = 0; + *BGptrY = -48; + gTasks[taskId].data[0] = -2; + gTasks[taskId].data[1] = 1; + gTasks[taskId2].data[3] = 0; + } + REG_BG1HOFS = *BGptrX; + REG_BG1VOFS = *BGptrY; + if(gTasks[taskId2].data[3] == 0) + { + gTasks[taskId2].data[4] = 48; + gTasks[taskId2].data[5] = 112; + } + else + { + gTasks[taskId2].data[4] = 0; + gTasks[taskId2].data[5] = 0; + } + gTasks[taskId].data[6] = 1; + gTasks[taskId].func = sub_80D3B60; } #ifdef NONMATCHING void sub_80D3B60(u8 taskId) { struct Struct_sub_8078914 unk; + + vu8 cpuDelay; // yet again u8 i; u16 rgbBuffer; u16 *BGptrX = &gBattle_BG1_X; @@ -609,6 +387,7 @@ void sub_80D3B60(u8 taskId) } if (++gTasks[taskId].data[6] > 1) { + // there is some weird math going on here gTasks[taskId].data[6] = 0; unkUse = ++gTasks[taskId].data[3]; if (unkUse <= 13) @@ -624,8 +403,20 @@ void sub_80D3B60(u8 taskId) } if (!(gTasks[gTasks[taskId].data[15]].data[1] & 0x1F)) { - gTasks[taskId].data[0] = gTasks[gTasks[taskId].data[15]].data[1] & 0x1F; - gTasks[taskId].func = sub_80D3D68; + Dma3FillLarge32_(0, unk.field_0, 0x2000); // ! + cpuDelay = 0; // stall the CPU + cpuDelay = 0; // stall the CPU + Dma3FillLarge32_(0, unk.field_4, 0x1000); // ! + if (!IsContest) + REG_BG1CNT_BITFIELD.charBaseBlock = 1; + *BGptrX = 0; + *BGptrY = 0; + + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + + gTasks[gTasks[taskId].data[15]].data[15] = 0xffff; + DestroyAnimVisualTask(taskId); } } #else @@ -882,44 +673,35 @@ _080D3D32:\n\ } #endif -#ifdef NONMATCHING void sub_80D3D68(u8 taskId) { s16 i; struct ScanlineEffectParams params; struct Task *task = &gTasks[taskId]; - // u16 *scanlineBuffer; switch (task->data[0]) { case 0: for (i = 0; i < task->data[4]; i++) { - /* scanlineBuffer = &gScanlineEffectRegBuffers[0][i]; - *(u16 *)(&gScanlineEffect) = task->data[2]; - *scanlineBuffer = task->data[2] & -1; */ - gScanlineEffectRegBuffers[1][i] = task->data[2]; - gScanlineEffectRegBuffers[0][i] = (u16)((int)(task->data[2] & 0xFFFF)); + /* variable initialization isn't literal to ASM */ + gScanlineEffectRegBuffers[0][i] = gScanlineEffectRegBuffers[1][i] = task->data[2]; } for (i = task->data[4]; i < task->data[5]; i++) { - gScanlineEffectRegBuffers[1][i] = task->data[1]; - gScanlineEffectRegBuffers[0][i] = (u16)((int)(task->data[1] & 0xFFFF)); + gScanlineEffectRegBuffers[0][i] = gScanlineEffectRegBuffers[1][i] = task->data[1]; } for (i = task->data[5]; i < 160; i++) { - gScanlineEffectRegBuffers[1][i] = task->data[2]; - gScanlineEffectRegBuffers[0][i] = (u16)((int)(task->data[2] & 0xFFFF)); + gScanlineEffectRegBuffers[0][i] = gScanlineEffectRegBuffers[1][i] = task->data[2]; } if (task->data[4] == 0) { - gScanlineEffectRegBuffers[1][i] = task->data[1]; - gScanlineEffectRegBuffers[0][i] = task->data[1]; + gScanlineEffectRegBuffers[0][i] = gScanlineEffectRegBuffers[1][i] = task->data[1]; } else { - gScanlineEffectRegBuffers[1][i] = task->data[2]; - gScanlineEffectRegBuffers[0][i] = task->data[2]; + gScanlineEffectRegBuffers[0][i] = gScanlineEffectRegBuffers[1][i] = task->data[2]; } params.dmaDest = (vu16 *)REG_ADDR_BLDALPHA; params.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT; @@ -975,391 +757,6 @@ void sub_80D3D68(u8 taskId) break; } } -#else -NAKED -void sub_80D3D68(u8 taskId) -{ - asm_unified("push {r4-r7,lr}\n\ - sub sp, 0xC\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - lsls r0, r7, 2\n\ - adds r0, r7\n\ - lsls r0, 3\n\ - ldr r1, =gTasks\n\ - adds r4, r0, r1\n\ - movs r1, 0x8\n\ - ldrsh r0, [r4, r1]\n\ - cmp r0, 0x1\n\ - bne _080D3D84\n\ - b _080D3EBC\n\ -_080D3D84:\n\ - cmp r0, 0x1\n\ - bgt _080D3D94\n\ - cmp r0, 0\n\ - beq _080D3D9C\n\ - b _080D4032\n\ - .align 2, 0\n\ - .pool\n\ -_080D3D94:\n\ - cmp r0, 0x2\n\ - bne _080D3D9A\n\ - b _080D3F88\n\ -_080D3D9A:\n\ - b _080D4032\n\ -_080D3D9C:\n\ - movs r3, 0\n\ - movs r2, 0x10\n\ - ldrsh r0, [r4, r2]\n\ - ldr r1, =gScanlineEffectRegBuffers\n\ - mov r12, r1\n\ - cmp r3, r0\n\ - bge _080D3DDA\n\ - mov r7, r12\n\ - movs r5, 0xF0\n\ - lsls r5, 3\n\ - add r5, r12\n\ - ldr r6, =0x0000ffff\n\ -_080D3DB4:\n\ - lsls r2, r3, 16\n\ - asrs r2, 16\n\ - lsls r1, r2, 1\n\ - adds r3, r1, r7\n\ - adds r1, r5\n\ - ldrh r0, [r4, 0xC]\n\ - strh r0, [r1]\n\ - ldrh r1, [r4, 0xC]\n\ - adds r0, r6, 0\n\ - ands r0, r1\n\ - strh r0, [r3]\n\ - adds r2, 0x1\n\ - lsls r2, 16\n\ - lsrs r3, r2, 16\n\ - asrs r2, 16\n\ - movs r1, 0x10\n\ - ldrsh r0, [r4, r1]\n\ - cmp r2, r0\n\ - blt _080D3DB4\n\ -_080D3DDA:\n\ - ldrh r3, [r4, 0x10]\n\ - lsls r2, r3, 16\n\ - asrs r1, r2, 16\n\ - movs r3, 0x12\n\ - ldrsh r0, [r4, r3]\n\ - cmp r1, r0\n\ - bge _080D3E14\n\ - ldr r5, =gScanlineEffectRegBuffers\n\ - movs r0, 0xF0\n\ - lsls r0, 3\n\ - adds r6, r5, r0\n\ - ldr r7, =0x0000ffff\n\ -_080D3DF2:\n\ - asrs r2, 16\n\ - lsls r1, r2, 1\n\ - adds r3, r1, r5\n\ - adds r1, r6\n\ - ldrh r0, [r4, 0xA]\n\ - strh r0, [r1]\n\ - ldrh r1, [r4, 0xA]\n\ - adds r0, r7, 0\n\ - ands r0, r1\n\ - strh r0, [r3]\n\ - adds r2, 0x1\n\ - lsls r2, 16\n\ - asrs r1, r2, 16\n\ - movs r3, 0x12\n\ - ldrsh r0, [r4, r3]\n\ - cmp r1, r0\n\ - blt _080D3DF2\n\ -_080D3E14:\n\ - ldrh r3, [r4, 0x12]\n\ - lsls r2, r3, 16\n\ - asrs r0, r2, 16\n\ - cmp r0, 0x9F\n\ - bgt _080D3E4A\n\ - ldr r5, =gScanlineEffectRegBuffers\n\ - movs r0, 0xF0\n\ - lsls r0, 3\n\ - adds r6, r5, r0\n\ - ldr r7, =0x0000ffff\n\ -_080D3E28:\n\ - asrs r2, 16\n\ - lsls r1, r2, 1\n\ - adds r3, r1, r5\n\ - adds r1, r6\n\ - ldrh r0, [r4, 0xC]\n\ - strh r0, [r1]\n\ - ldrh r1, [r4, 0xC]\n\ - adds r0, r7, 0\n\ - ands r0, r1\n\ - strh r0, [r3]\n\ - adds r2, 0x1\n\ - lsls r2, 16\n\ - lsrs r3, r2, 16\n\ - lsls r2, r3, 16\n\ - asrs r0, r2, 16\n\ - cmp r0, 0x9F\n\ - ble _080D3E28\n\ -_080D3E4A:\n\ - movs r1, 0x10\n\ - ldrsh r0, [r4, r1]\n\ - cmp r0, 0\n\ - bne _080D3E74\n\ - lsls r0, r3, 16\n\ - asrs r0, 15\n\ - mov r3, r12\n\ - adds r2, r0, r3\n\ - movs r1, 0xF0\n\ - lsls r1, 3\n\ - add r1, r12\n\ - adds r0, r1\n\ - ldrh r1, [r4, 0xA]\n\ - strh r1, [r0]\n\ - ldrh r0, [r4, 0xA]\n\ - b _080D3E8A\n\ - .align 2, 0\n\ - .pool\n\ -_080D3E74:\n\ - lsls r0, r3, 16\n\ - asrs r0, 15\n\ - mov r1, r12\n\ - adds r2, r0, r1\n\ - movs r1, 0xF0\n\ - lsls r1, 3\n\ - add r1, r12\n\ - adds r0, r1\n\ - ldrh r1, [r4, 0xC]\n\ - strh r1, [r0]\n\ - ldrh r0, [r4, 0xC]\n\ -_080D3E8A:\n\ - strh r0, [r2]\n\ - ldr r0, =0x04000052\n\ - str r0, [sp]\n\ - ldr r0, =0xa2600001\n\ - str r0, [sp, 0x4]\n\ - mov r1, sp\n\ - movs r2, 0\n\ - movs r0, 0x1\n\ - strb r0, [r1, 0x8]\n\ - mov r0, sp\n\ - strb r2, [r0, 0x9]\n\ - ldr r0, [sp]\n\ - ldr r1, [sp, 0x4]\n\ - ldr r2, [sp, 0x8]\n\ - bl ScanlineEffect_SetParams\n\ - ldrh r0, [r4, 0x8]\n\ - adds r0, 0x1\n\ - strh r0, [r4, 0x8]\n\ - b _080D4032\n\ - .align 2, 0\n\ - .pool\n\ -_080D3EBC:\n\ - movs r2, 0xE\n\ - ldrsh r1, [r4, r2]\n\ - cmp r1, 0\n\ - bne _080D3ED4\n\ - ldrh r0, [r4, 0x10]\n\ - subs r0, 0x1\n\ - strh r0, [r4, 0x10]\n\ - lsls r0, 16\n\ - cmp r0, 0\n\ - bgt _080D3EE8\n\ - strh r1, [r4, 0x10]\n\ - b _080D3EE2\n\ -_080D3ED4:\n\ - ldrh r0, [r4, 0x12]\n\ - adds r0, 0x1\n\ - strh r0, [r4, 0x12]\n\ - lsls r0, 16\n\ - asrs r0, 16\n\ - cmp r0, 0x6F\n\ - ble _080D3EE8\n\ -_080D3EE2:\n\ - ldrh r0, [r4, 0x8]\n\ - adds r0, 0x1\n\ - strh r0, [r4, 0x8]\n\ -_080D3EE8:\n\ - movs r3, 0\n\ - movs r1, 0x10\n\ - ldrsh r0, [r4, r1]\n\ - cmp r3, r0\n\ - bge _080D3F1C\n\ - ldr r6, =gScanlineEffectRegBuffers\n\ - ldr r5, =gScanlineEffect\n\ -_080D3EF6:\n\ - lsls r1, r3, 16\n\ - asrs r1, 16\n\ - lsls r3, r1, 1\n\ - ldrb r2, [r5, 0x14]\n\ - lsls r0, r2, 4\n\ - subs r0, r2\n\ - lsls r0, 7\n\ - adds r3, r0\n\ - adds r3, r6\n\ - ldrh r0, [r4, 0xC]\n\ - strh r0, [r3]\n\ - adds r1, 0x1\n\ - lsls r1, 16\n\ - lsrs r3, r1, 16\n\ - asrs r1, 16\n\ - movs r2, 0x10\n\ - ldrsh r0, [r4, r2]\n\ - cmp r1, r0\n\ - blt _080D3EF6\n\ -_080D3F1C:\n\ - ldrh r3, [r4, 0x10]\n\ - lsls r2, r3, 16\n\ - asrs r1, r2, 16\n\ - movs r3, 0x12\n\ - ldrsh r0, [r4, r3]\n\ - cmp r1, r0\n\ - bge _080D3F50\n\ - ldr r6, =gScanlineEffectRegBuffers\n\ - ldr r5, =gScanlineEffect\n\ -_080D3F2E:\n\ - asrs r3, r2, 16\n\ - lsls r2, r3, 1\n\ - ldrb r1, [r5, 0x14]\n\ - lsls r0, r1, 4\n\ - subs r0, r1\n\ - lsls r0, 7\n\ - adds r2, r0\n\ - adds r2, r6\n\ - ldrh r0, [r4, 0xA]\n\ - strh r0, [r2]\n\ - adds r3, 0x1\n\ - lsls r2, r3, 16\n\ - asrs r1, r2, 16\n\ - movs r3, 0x12\n\ - ldrsh r0, [r4, r3]\n\ - cmp r1, r0\n\ - blt _080D3F2E\n\ -_080D3F50:\n\ - ldrh r3, [r4, 0x12]\n\ - lsls r1, r3, 16\n\ - asrs r0, r1, 16\n\ - cmp r0, 0x9F\n\ - bgt _080D4032\n\ - ldr r6, =gScanlineEffectRegBuffers\n\ - ldr r5, =gScanlineEffect\n\ -_080D3F5E:\n\ - asrs r3, r1, 16\n\ - lsls r2, r3, 1\n\ - ldrb r1, [r5, 0x14]\n\ - lsls r0, r1, 4\n\ - subs r0, r1\n\ - lsls r0, 7\n\ - adds r2, r0\n\ - adds r2, r6\n\ - ldrh r0, [r4, 0xC]\n\ - strh r0, [r2]\n\ - adds r3, 0x1\n\ - lsls r1, r3, 16\n\ - asrs r0, r1, 16\n\ - cmp r0, 0x9F\n\ - ble _080D3F5E\n\ - b _080D4032\n\ - .align 2, 0\n\ - .pool\n\ -_080D3F88:\n\ - movs r3, 0\n\ - movs r1, 0x10\n\ - ldrsh r0, [r4, r1]\n\ - cmp r3, r0\n\ - bge _080D3FBC\n\ - ldr r6, =gScanlineEffectRegBuffers\n\ - ldr r5, =gScanlineEffect\n\ -_080D3F96:\n\ - lsls r1, r3, 16\n\ - asrs r1, 16\n\ - lsls r3, r1, 1\n\ - ldrb r2, [r5, 0x14]\n\ - lsls r0, r2, 4\n\ - subs r0, r2\n\ - lsls r0, 7\n\ - adds r3, r0\n\ - adds r3, r6\n\ - ldrh r0, [r4, 0xC]\n\ - strh r0, [r3]\n\ - adds r1, 0x1\n\ - lsls r1, 16\n\ - lsrs r3, r1, 16\n\ - asrs r1, 16\n\ - movs r2, 0x10\n\ - ldrsh r0, [r4, r2]\n\ - cmp r1, r0\n\ - blt _080D3F96\n\ -_080D3FBC:\n\ - ldrh r3, [r4, 0x10]\n\ - lsls r2, r3, 16\n\ - asrs r1, r2, 16\n\ - movs r3, 0x12\n\ - ldrsh r0, [r4, r3]\n\ - cmp r1, r0\n\ - bge _080D3FF0\n\ - ldr r6, =gScanlineEffectRegBuffers\n\ - ldr r5, =gScanlineEffect\n\ -_080D3FCE:\n\ - asrs r3, r2, 16\n\ - lsls r2, r3, 1\n\ - ldrb r1, [r5, 0x14]\n\ - lsls r0, r1, 4\n\ - subs r0, r1\n\ - lsls r0, 7\n\ - adds r2, r0\n\ - adds r2, r6\n\ - ldrh r0, [r4, 0xA]\n\ - strh r0, [r2]\n\ - adds r3, 0x1\n\ - lsls r2, r3, 16\n\ - asrs r1, r2, 16\n\ - movs r3, 0x12\n\ - ldrsh r0, [r4, r3]\n\ - cmp r1, r0\n\ - blt _080D3FCE\n\ -_080D3FF0:\n\ - ldrh r3, [r4, 0x12]\n\ - lsls r1, r3, 16\n\ - asrs r0, r1, 16\n\ - cmp r0, 0x9F\n\ - bgt _080D401C\n\ - ldr r6, =gScanlineEffectRegBuffers\n\ - ldr r5, =gScanlineEffect\n\ -_080D3FFE:\n\ - asrs r3, r1, 16\n\ - lsls r2, r3, 1\n\ - ldrb r1, [r5, 0x14]\n\ - lsls r0, r1, 4\n\ - subs r0, r1\n\ - lsls r0, 7\n\ - adds r2, r0\n\ - adds r2, r6\n\ - ldrh r0, [r4, 0xC]\n\ - strh r0, [r2]\n\ - adds r3, 0x1\n\ - lsls r1, r3, 16\n\ - asrs r0, r1, 16\n\ - cmp r0, 0x9F\n\ - ble _080D3FFE\n\ -_080D401C:\n\ - movs r0, 0x26\n\ - ldrsh r1, [r4, r0]\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - cmp r1, r0\n\ - bne _080D4032\n\ - bl ScanlineEffect_Stop\n\ - adds r0, r7, 0\n\ - bl DestroyTask\n\ -_080D4032:\n\ - add sp, 0xC\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ - .pool\n"); -} -#endif void sub_80D4044(struct Sprite *sprite) { @@ -1892,17 +1289,32 @@ void sub_80D4CEC(struct Sprite *sprite) sprite->data[0]++; } -#ifdef NONMATCHING -void sub_80D4D64(struct Sprite *sprite, int xDiff, int yDiff) +void sub_80D4D64(struct Sprite *sprite, s32 xDiff, s32 yDiff) { - s16 something = sprite->data[0] / 2; - s16 combinedX = sprite->pos1.x + sprite->pos2.x; - s16 combinedY = sprite->pos1.y + sprite->pos2.y; - s16 randomSomethingY = yDiff + (Random() % 10) - 5; - s16 randomSomethingX = -xDiff + (Random() % 10) - 5; s16 i; u8 spriteId; + s16 combinedX; + s16 combinedY; + s16 something; + s16 randomSomethingX; + s16 randomSomethingY; + + something = sprite->data[0] / 2; + // regalloc acts strange here... + combinedX = sprite->pos1.x + sprite->pos2.x; + combinedY = sprite->pos1.y + sprite->pos2.y; + + // ...then goes back to normal right here. + // Nothing but this appears to reproduce the behavior. + if (xDiff) // yDiff works too, but not sprite. + { + u8 unk = -unk; // this can be any sort of negation + } + + randomSomethingY = yDiff + (Random() % 10) - 5; + randomSomethingX = -xDiff + (Random() % 10) - 5; + for (i = 0; i <= 0; i++) { spriteId = CreateSprite(&gSpriteTemplate_83D9420, combinedX, combinedY + something, 130); @@ -1926,184 +1338,3 @@ void sub_80D4D64(struct Sprite *sprite, int xDiff, int yDiff) gSprites[spriteId].data[2] = randomSomethingX; } } -#else -NAKED -void sub_80D4D64(struct Sprite *sprite, int xDiff, int yDiff) -{ - asm_unified("push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x18\n\ - adds r4, r1, 0\n\ - adds r5, r2, 0\n\ - movs r2, 0x2E\n\ - ldrsh r1, [r0, r2]\n\ - lsrs r2, r1, 31\n\ - adds r1, r2\n\ - lsls r1, 15\n\ - lsrs r1, 16\n\ - str r1, [sp]\n\ - ldrh r1, [r0, 0x24]\n\ - ldrh r3, [r0, 0x20]\n\ - adds r1, r3\n\ - lsls r1, 16\n\ - lsrs r1, 16\n\ - mov r8, r1\n\ - ldrh r1, [r0, 0x26]\n\ - ldrh r0, [r0, 0x22]\n\ - adds r1, r0\n\ - lsls r1, 16\n\ - lsrs r1, 16\n\ - mov r10, r1\n\ - bl Random\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0xA\n\ - bl __umodsi3\n\ - adds r0, r5, r0\n\ - subs r0, 0x5\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - mov r9, r0\n\ - bl Random\n\ - negs r4, r4\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0xA\n\ - bl __umodsi3\n\ - adds r4, r0\n\ - subs r4, 0x5\n\ - lsls r4, 16\n\ - lsrs r7, r4, 16\n\ - movs r6, 0\n\ - mov r0, r8\n\ - lsls r0, 16\n\ - mov r8, r0\n\ - mov r1, r10\n\ - lsls r1, 16\n\ - str r1, [sp, 0xC]\n\ - ldr r2, [sp]\n\ - lsls r2, 16\n\ - str r2, [sp, 0x10]\n\ - asrs r1, 16\n\ - lsls r0, r7, 16\n\ - asrs r5, r0, 16\n\ - str r0, [sp, 0x14]\n\ - negs r3, r5\n\ - str r3, [sp, 0x4]\n\ - asrs r0, r2, 16\n\ - adds r1, r0\n\ - lsls r1, 16\n\ - mov r10, r1\n\ -_080D4DF2:\n\ - ldr r0, =gSpriteTemplate_83D9420\n\ - mov r2, r8\n\ - asrs r1, r2, 16\n\ - mov r3, r10\n\ - asrs r2, r3, 16\n\ - movs r3, 0x82\n\ - bl CreateSprite\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - ldr r1, =gSprites\n\ - lsls r0, r2, 4\n\ - adds r0, r2\n\ - lsls r0, 2\n\ - adds r4, r0, r1\n\ - movs r0, 0x14\n\ - strh r0, [r4, 0x2E]\n\ - mov r0, r9\n\ - strh r0, [r4, 0x30]\n\ - ldr r0, =gBattleAnimAttacker\n\ - ldrb r0, [r0]\n\ - bl GetBattlerSubpriority\n\ - subs r0, 0x1\n\ - adds r1, r4, 0\n\ - adds r1, 0x43\n\ - strb r0, [r1]\n\ - cmp r5, 0\n\ - bge _080D4E40\n\ - mov r1, sp\n\ - ldrh r1, [r1, 0x4]\n\ - strh r1, [r4, 0x32]\n\ - b _080D4E42\n\ - .align 2, 0\n\ - .pool\n\ -_080D4E40:\n\ - strh r7, [r4, 0x32]\n\ -_080D4E42:\n\ - lsls r0, r6, 16\n\ - movs r2, 0x80\n\ - lsls r2, 9\n\ - adds r0, r2\n\ - lsrs r6, r0, 16\n\ - cmp r0, 0\n\ - ble _080D4DF2\n\ - movs r6, 0\n\ - ldr r3, [sp, 0xC]\n\ - asrs r1, r3, 16\n\ - ldr r0, [sp, 0x14]\n\ - asrs r5, r0, 16\n\ - negs r2, r5\n\ - str r2, [sp, 0x8]\n\ - ldr r3, [sp, 0x10]\n\ - asrs r0, r3, 16\n\ - subs r1, r0\n\ - lsls r1, 16\n\ - mov r10, r1\n\ -_080D4E68:\n\ - ldr r0, =gSpriteTemplate_83D9420\n\ - mov r2, r8\n\ - asrs r1, r2, 16\n\ - mov r3, r10\n\ - asrs r2, r3, 16\n\ - movs r3, 0x82\n\ - bl CreateSprite\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - ldr r1, =gSprites\n\ - lsls r0, r2, 4\n\ - adds r0, r2\n\ - lsls r0, 2\n\ - adds r4, r0, r1\n\ - movs r0, 0x14\n\ - strh r0, [r4, 0x2E]\n\ - mov r0, r9\n\ - strh r0, [r4, 0x30]\n\ - ldr r0, =gBattleAnimAttacker\n\ - ldrb r0, [r0]\n\ - bl GetBattlerSubpriority\n\ - subs r0, 0x1\n\ - adds r1, r4, 0\n\ - adds r1, 0x43\n\ - strb r0, [r1]\n\ - cmp r5, 0\n\ - ble _080D4EB8\n\ - mov r1, sp\n\ - ldrh r1, [r1, 0x8]\n\ - strh r1, [r4, 0x32]\n\ - b _080D4EBA\n\ - .align 2, 0\n\ - .pool\n\ -_080D4EB8:\n\ - strh r7, [r4, 0x32]\n\ -_080D4EBA:\n\ - lsls r0, r6, 16\n\ - movs r2, 0x80\n\ - lsls r2, 9\n\ - adds r0, r2\n\ - lsrs r6, r0, 16\n\ - cmp r0, 0\n\ - ble _080D4E68\n\ - add sp, 0x18\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n"); -} -#endif diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 405776db6..956cc2f6e 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -246,10 +246,7 @@ static const BattleAICmdFunc sBattleAICmdTable[] = BattleAICmd_if_not_taunted, // 0x5D }; -#ifdef NONMATCHING -static -#endif -const u16 sDiscouragedPowerfulMoveEffects[] = +static const u16 sDiscouragedPowerfulMoveEffects[] = { EFFECT_EXPLOSION, EFFECT_DREAM_EATER, @@ -337,7 +334,7 @@ void BattleAI_SetupAIData(void) AI_THINKING_STRUCT->aiFlags = 0x20000000; else if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) AI_THINKING_STRUCT->aiFlags = 0x80000000; -#ifdef GERMAN +#if GERMAN || (ENGLISH && DEBUG && REVISION == 0) else if (gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER) || gTrainerBattleOpponent == SECRET_BASE_OPPONENT) AI_THINKING_STRUCT->aiFlags = 7; #endif @@ -945,18 +942,19 @@ static void BattleAICmd_get_move_power(void) gAIScriptPtr += 1; } -#ifdef NONMATCHING static void BattleAICmd_is_most_powerful_move(void) { - int i, j; - s32 damages[MAX_MON_MOVES]; + s32 i, checkedMove; + s32 moveDmgs[MAX_MON_MOVES]; for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++) + { if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == sDiscouragedPowerfulMoveEffects[i]) break; + } if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power > 1 - && sDiscouragedPowerfulMoveEffects[i] == 0xFFFF) + && sDiscouragedPowerfulMoveEffects[i] == 0xFFFF) { gDynamicBasePower = 0; eDynamicMoveType = 0; @@ -964,294 +962,49 @@ static void BattleAICmd_is_most_powerful_move(void) gMoveResultFlags = 0; gCritMultiplier = 1; - for (i = 0; i < MAX_MON_MOVES; i++) + for (checkedMove = 0; checkedMove < MAX_MON_MOVES; checkedMove++) { - for (j = 0; sDiscouragedPowerfulMoveEffects[j] != 0xFFFF; j++) - { // _08108276 - if (gBattleMoves[gBattleMons[gBattlerAttacker].moves[i]].effect == sDiscouragedPowerfulMoveEffects[j]) + for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++) + { + if (gBattleMoves[gBattleMons[gBattlerAttacker].moves[checkedMove]].effect == sDiscouragedPowerfulMoveEffects[i]) break; } - // _081082BA - if (gBattleMons[gBattlerAttacker].moves[i] - && sDiscouragedPowerfulMoveEffects[j] == 0xFFFF - && gBattleMoves[gBattleMons[gBattlerAttacker].moves[i]].power > 1) + if (gBattleMons[gBattlerAttacker].moves[checkedMove] != MOVE_NONE + && sDiscouragedPowerfulMoveEffects[i] == 0xFFFF + && gBattleMoves[gBattleMons[gBattlerAttacker].moves[checkedMove]].power > 1) { - gCurrentMove = gBattleMons[gBattlerAttacker].moves[i]; + gCurrentMove = gBattleMons[gBattlerAttacker].moves[checkedMove]; AI_CalcDmg(gBattlerAttacker, gBattlerTarget); TypeCalc(gCurrentMove, gBattlerAttacker, gBattlerTarget); - damages[i] = (gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[i]) / 100; - - if (damages[i] == 0) // moves always do at least 1 damage. - damages[i] = 1; + moveDmgs[checkedMove] = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[checkedMove] / 100; + if (moveDmgs[checkedMove] == 0) + moveDmgs[checkedMove] = 1; } else { - damages[i] = 0; + moveDmgs[checkedMove] = 0; } } - for (i = 0; i < MAX_MON_MOVES; i++) - if (damages[i] > damages[AI_THINKING_STRUCT->movesetIndex]) + for (checkedMove = 0; checkedMove < MAX_MON_MOVES; checkedMove++) + { + if (moveDmgs[checkedMove] > moveDmgs[AI_THINKING_STRUCT->movesetIndex]) break; + } - if (i == MAX_MON_MOVES) - AI_THINKING_STRUCT->funcResult = 2; + if (checkedMove == MAX_MON_MOVES) + AI_THINKING_STRUCT->funcResult = 2; // Is the most powerful. else - AI_THINKING_STRUCT->funcResult = 1; + AI_THINKING_STRUCT->funcResult = 1; // Not the most powerful. } else { - AI_THINKING_STRUCT->funcResult = 0; + AI_THINKING_STRUCT->funcResult = 0; // Highly discouraged in terms of power. } - gAIScriptPtr += 1; + gAIScriptPtr++; } -#else -NAKED -static void BattleAICmd_is_most_powerful_move(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, 0x14\n\ - movs r3, 0\n\ - ldr r0, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ - ldrh r1, [r0]\n\ - ldr r4, _0810832C @ =0x0000ffff\n\ - ldr r6, _08108330 @ =gBattleMoves\n\ - ldr r5, _08108334 @ =gSharedMem + 0x16800\n\ - cmp r1, r4\n\ - beq _0810822E\n\ - ldrh r1, [r5, 0x2]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldrb r2, [r0]\n\ - ldr r1, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ -_0810821E:\n\ - ldrh r0, [r1]\n\ - cmp r2, r0\n\ - beq _0810822E\n\ - adds r1, 0x2\n\ - adds r3, 0x1\n\ - ldrh r0, [r1]\n\ - cmp r0, r4\n\ - bne _0810821E\n\ -_0810822E:\n\ - ldrh r0, [r5, 0x2]\n\ - lsls r1, r0, 1\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r6\n\ - ldrb r0, [r1, 0x1]\n\ - cmp r0, 0x1\n\ - bhi _08108240\n\ - b _081083B2\n\ -_08108240:\n\ - lsls r0, r3, 1\n\ - ldr r1, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ - adds r0, r1\n\ - ldrh r3, [r0]\n\ - ldr r0, _0810832C @ =0x0000ffff\n\ - cmp r3, r0\n\ - beq _08108250\n\ - b _081083B2\n\ -_08108250:\n\ - ldr r0, _08108338 @ =gDynamicBasePower\n\ - movs r1, 0\n\ - strh r1, [r0]\n\ - ldr r2, _0810833C @ =0xfffff81c\n\ - adds r0, r5, r2\n\ - strb r1, [r0]\n\ - adds r2, 0x3\n\ - adds r0, r5, r2\n\ - movs r2, 0x1\n\ - strb r2, [r0]\n\ - ldr r0, _08108340 @ =gMoveResultFlags\n\ - strb r1, [r0]\n\ - ldr r0, _08108344 @ =gCritMultiplier\n\ - strb r2, [r0]\n\ - movs r6, 0\n\ - mov r9, r3\n\ - ldr r0, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ - ldrh r0, [r0]\n\ - str r0, [sp, 0x10]\n\ -_08108276:\n\ - movs r3, 0\n\ - ldr r5, _08108348 @ =gBattleMons\n\ - lsls r4, r6, 1\n\ - ldr r7, _0810834C @ =gBattlerAttacker\n\ - lsls r1, r6, 2\n\ - mov r8, r1\n\ - adds r2, r6, 0x1\n\ - mov r10, r2\n\ - ldr r0, [sp, 0x10]\n\ - cmp r0, r9\n\ - beq _081082BA\n\ - ldr r2, _08108330 @ =gBattleMoves\n\ - ldrb r1, [r7]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r0, r4, r0\n\ - adds r1, r5, 0\n\ - adds r1, 0xC\n\ - adds r0, r1\n\ - ldrh r1, [r0]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldrb r2, [r0]\n\ - ldr r1, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ -_081082AA:\n\ - ldrh r0, [r1]\n\ - cmp r2, r0\n\ - beq _081082BA\n\ - adds r1, 0x2\n\ - adds r3, 0x1\n\ - ldrh r0, [r1]\n\ - cmp r0, r9\n\ - bne _081082AA\n\ -_081082BA:\n\ - ldrb r1, [r7]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r0, r4, r0\n\ - adds r1, r5, 0\n\ - adds r1, 0xC\n\ - adds r1, r0, r1\n\ - ldrh r0, [r1]\n\ - cmp r0, 0\n\ - beq _0810835C\n\ - lsls r0, r3, 1\n\ - ldr r2, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ - adds r0, r2\n\ - ldrh r0, [r0]\n\ - cmp r0, r9\n\ - bne _0810835C\n\ - ldr r0, _08108330 @ =gBattleMoves\n\ - ldrh r2, [r1]\n\ - lsls r1, r2, 1\n\ - adds r1, r2\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x1]\n\ - cmp r0, 0x1\n\ - bls _0810835C\n\ - ldr r5, _08108350 @ =gCurrentMove\n\ - strh r2, [r5]\n\ - ldrb r0, [r7]\n\ - ldr r4, _08108354 @ =gBattlerTarget\n\ - ldrb r1, [r4]\n\ - bl AI_CalcDmg\n\ - ldrh r0, [r5]\n\ - ldrb r1, [r7]\n\ - ldrb r2, [r4]\n\ - bl TypeCalc\n\ - mov r4, sp\n\ - add r4, r8\n\ - ldr r2, _08108358 @ =gBattleMoveDamage\n\ - ldr r0, _08108334 @ =gSharedMem + 0x16800\n\ - adds r0, 0x18\n\ - adds r0, r6, r0\n\ - ldrb r1, [r0]\n\ - ldr r0, [r2]\n\ - muls r0, r1\n\ - movs r1, 0x64\n\ - bl __divsi3\n\ - str r0, [r4]\n\ - cmp r0, 0\n\ - bne _08108364\n\ - movs r0, 0x1\n\ - str r0, [r4]\n\ - b _08108364\n\ - .align 2, 0\n\ -_08108328: .4byte sDiscouragedPowerfulMoveEffects\n\ -_0810832C: .4byte 0x0000ffff\n\ -_08108330: .4byte gBattleMoves\n\ -_08108334: .4byte gSharedMem + 0x16800\n\ -_08108338: .4byte gDynamicBasePower\n\ -_0810833C: .4byte 0xfffff81c\n\ -_08108340: .4byte gMoveResultFlags\n\ -_08108344: .4byte gCritMultiplier\n\ -_08108348: .4byte gBattleMons\n\ -_0810834C: .4byte gBattlerAttacker\n\ -_08108350: .4byte gCurrentMove\n\ -_08108354: .4byte gBattlerTarget\n\ -_08108358: .4byte gBattleMoveDamage\n\ -_0810835C:\n\ - mov r1, sp\n\ - add r1, r8\n\ - movs r0, 0\n\ - str r0, [r1]\n\ -_08108364:\n\ - mov r6, r10\n\ - cmp r6, 0x3\n\ - ble _08108276\n\ - movs r6, 0\n\ - ldr r1, _081083A4 @ =gSharedMem + 0x16800\n\ - ldrb r0, [r1, 0x1]\n\ - lsls r0, 2\n\ - add r0, sp\n\ - ldr r2, [sp]\n\ - ldr r0, [r0]\n\ - adds r5, r1, 0\n\ - ldr r4, _081083A8 @ =gAIScriptPtr\n\ - cmp r2, r0\n\ - bgt _0810839A\n\ - adds r3, r5, 0\n\ - mov r2, sp\n\ -_08108384:\n\ - adds r2, 0x4\n\ - adds r6, 0x1\n\ - cmp r6, 0x3\n\ - bgt _0810839A\n\ - ldrb r0, [r3, 0x1]\n\ - lsls r0, 2\n\ - add r0, sp\n\ - ldr r1, [r2]\n\ - ldr r0, [r0]\n\ - cmp r1, r0\n\ - ble _08108384\n\ -_0810839A:\n\ - cmp r6, 0x4\n\ - bne _081083AC\n\ - movs r0, 0x2\n\ - str r0, [r5, 0x8]\n\ - b _081083B8\n\ - .align 2, 0\n\ -_081083A4: .4byte gSharedMem + 0x16800\n\ -_081083A8: .4byte gAIScriptPtr\n\ -_081083AC:\n\ - movs r0, 0x1\n\ - str r0, [r5, 0x8]\n\ - b _081083B8\n\ -_081083B2:\n\ - movs r0, 0\n\ - str r0, [r5, 0x8]\n\ - ldr r4, _081083D0 @ =gAIScriptPtr\n\ -_081083B8:\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - str r0, [r4]\n\ - add sp, 0x14\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_081083D0: .4byte gAIScriptPtr\n\ - .syntax divided\n"); -} -#endif // NONMATCHING static void BattleAICmd_get_move(void) { diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index b4b2841e0..f83334be3 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -47,263 +47,60 @@ static bool8 ShouldSwitchIfPerishSong(void) return FALSE; } -#ifdef NONMATCHING static bool8 ShouldSwitchIfWonderGuard(void) { u8 opposingBattler; u8 moveFlags; s32 i, j; + u16 move; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - return FALSE; - - if (gBattleMons[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)].ability != ABILITY_WONDER_GUARD) + if(gBattleTypeFlags & BATTLE_TYPE_DOUBLE) return FALSE; - // check if pokemon has a super effective move - opposingBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - for (i = 0; i < 4; i++) + if (gBattleMons[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)].ability == ABILITY_WONDER_GUARD) { - u16 move = gBattleMons[gActiveBattler].moves[i]; - if (move == MOVE_NONE) - continue; - - moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability); - if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE) - return FALSE; - } - - // find a pokemon in the party that has a super effective move - for (i = 0; i < 6; i++) - { - if (GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0 - || GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_NONE - || GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_EGG - || i == gBattlerPartyIndexes[gActiveBattler]) - continue; - - GetMonData(&gEnemyParty[i], MON_DATA_SPECIES); // unused return value - GetMonData(&gEnemyParty[i], MON_DATA_ALT_ABILITY); // unused return value - - opposingBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - for (j = 0; j < 4; j++) + // Check if Pokemon has a super effective move. + for (opposingBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT), i = 0; i < MAX_MON_MOVES; ++i) { - u16 move = GetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j); + move = gBattleMons[gActiveBattler].moves[i]; if (move == MOVE_NONE) continue; - moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability); - if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE && (Random() % 3) < 2) + if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE) + return FALSE; + } + // Find a Pokemon in the party that has a super effective move. + for (i = 0; i < PARTY_SIZE; ++i) + { + if (GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0) + continue; + if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_NONE) + continue; + if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) + continue; + if (i == gBattlerPartyIndexes[gActiveBattler]) + continue; + GetMonData(&gEnemyParty[i], MON_DATA_SPECIES); // Unused return value. + GetMonData(&gEnemyParty[i], MON_DATA_ALT_ABILITY); // Unused return value. + + for (opposingBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT), j = 0; j < MAX_MON_MOVES; ++j) { - // we found a mon - ewram160C8arr(GetBattlerPosition(gActiveBattler)) = i; // gBattleStruct->AI_monToSwitchIntoId[GetBattlerPosition(gActiveBattler)] = i; - BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); - return TRUE; + move = GetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j); + if (move == MOVE_NONE) + continue; + moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability); + if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE && Random() % 3 < 2) + { + // We found a mon. + ewram160C8arr(GetBattlerPosition(gActiveBattler)) = i; // gBattleStruct->AI_monToSwitchIntoId[GetBattlerPosition(gActiveBattler)] = i; + BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); + return TRUE; + } } } } - - return FALSE; // at this point there is not a single pokemon in the party that has a super effective move against a pokemon with wonder guard -} -#else -NAKED -static bool8 ShouldSwitchIfWonderGuard(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - ldr r0, _0803606C @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080360A0\n\ - b _080361C8\n\ - .align 2, 0\n\ -_0803606C: .4byte gBattleTypeFlags\n\ -_08036070:\n\ - ldr r0, _08036094 @ =gActiveBattler\n\ - ldrb r0, [r0]\n\ - bl GetBattlerPosition\n\ - ldr r1, _08036098 @ =gSharedMem\n\ - lsls r0, 24\n\ - lsrs r0, 25\n\ - ldr r2, _0803609C @ =0x000160c8\n\ - adds r0, r2\n\ - adds r0, r1\n\ - strb r6, [r0]\n\ - movs r0, 0x1\n\ - movs r1, 0x2\n\ - movs r2, 0\n\ - bl BtlController_EmitTwoReturnValues\n\ - movs r0, 0x1\n\ - b _080361CA\n\ - .align 2, 0\n\ -_08036094: .4byte gActiveBattler\n\ -_08036098: .4byte gSharedMem\n\ -_0803609C: .4byte 0x000160c8\n\ -_080360A0:\n\ - ldr r4, _080361D8 @ =gBattleMons\n\ - movs r0, 0\n\ - bl GetBattlerAtPosition\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - movs r1, 0x58\n\ - muls r0, r1\n\ - adds r0, r4\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x19\n\ - beq _080360BC\n\ - b _080361C8\n\ -_080360BC:\n\ - movs r0, 0\n\ - bl GetBattlerAtPosition\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - movs r6, 0\n\ - adds r7, r4, 0\n\ - movs r5, 0x58\n\ - adds r0, r2, 0\n\ - muls r0, r5\n\ - adds r4, r0, r7\n\ - movs r3, 0x20\n\ - adds r3, r4\n\ - mov r8, r3\n\ -_080360D8:\n\ - lsls r1, r6, 1\n\ - ldr r0, _080361DC @ =gActiveBattler\n\ - ldrb r0, [r0]\n\ - muls r0, r5\n\ - adds r1, r0\n\ - adds r0, r7, 0\n\ - adds r0, 0xC\n\ - adds r1, r0\n\ - ldrh r0, [r1]\n\ - cmp r0, 0\n\ - beq _08036104\n\ - ldrh r1, [r4]\n\ - mov r3, r8\n\ - ldrb r2, [r3]\n\ - bl AI_TypeCalc\n\ - lsls r0, 24\n\ - lsrs r1, r0, 24\n\ - movs r0, 0x2\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - bne _080361C8\n\ -_08036104:\n\ - adds r6, 0x1\n\ - cmp r6, 0x3\n\ - ble _080360D8\n\ - movs r6, 0\n\ - ldr r0, _080361E0 @ =gEnemyParty\n\ - mov r9, r0\n\ -_08036110:\n\ - movs r0, 0x64\n\ - adds r5, r6, 0\n\ - muls r5, r0\n\ - mov r2, r9\n\ - adds r4, r5, r2\n\ - adds r0, r4, 0\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _080361C2\n\ - adds r0, r4, 0\n\ - movs r1, 0x41\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _080361C2\n\ - adds r0, r4, 0\n\ - movs r1, 0x41\n\ - bl GetMonData\n\ - movs r1, 0xCE\n\ - lsls r1, 1\n\ - cmp r0, r1\n\ - beq _080361C2\n\ - ldr r1, _080361E4 @ =gBattlerPartyIndexes\n\ - ldr r0, _080361DC @ =gActiveBattler\n\ - ldrb r0, [r0]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - ldrh r0, [r0]\n\ - cmp r6, r0\n\ - beq _080361C2\n\ - adds r0, r4, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - adds r0, r4, 0\n\ - movs r1, 0x2E\n\ - bl GetMonData\n\ - movs r0, 0\n\ - bl GetBattlerAtPosition\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - movs r4, 0\n\ - mov r8, r5\n\ - ldr r1, _080361D8 @ =gBattleMons\n\ - movs r0, 0x58\n\ - muls r0, r2\n\ - adds r5, r0, r1\n\ - adds r7, r5, 0\n\ - adds r7, 0x20\n\ -_0803617C:\n\ - adds r1, r4, 0\n\ - adds r1, 0xD\n\ - mov r0, r8\n\ - add r0, r9\n\ - bl GetMonData\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0\n\ - beq _080361BC\n\ - ldrh r1, [r5]\n\ - ldrb r2, [r7]\n\ - bl AI_TypeCalc\n\ - lsls r0, 24\n\ - lsrs r1, r0, 24\n\ - movs r0, 0x2\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - beq _080361BC\n\ - bl Random\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0x3\n\ - bl __umodsi3\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0x1\n\ - bhi _080361BC\n\ - b _08036070\n\ -_080361BC:\n\ - adds r4, 0x1\n\ - cmp r4, 0x3\n\ - ble _0803617C\n\ -_080361C2:\n\ - adds r6, 0x1\n\ - cmp r6, 0x5\n\ - ble _08036110\n\ -_080361C8:\n\ - movs r0, 0\n\ -_080361CA:\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_080361D8: .4byte gBattleMons\n\ -_080361DC: .4byte gActiveBattler\n\ -_080361E0: .4byte gEnemyParty\n\ -_080361E4: .4byte gBattlerPartyIndexes\n\ - .syntax divided\n"); + return FALSE; // There is not a single Pokemon in the party that has a super effective move against a mon with Wonder Guard. } -#endif // NONMATCHING static bool8 FindMonThatAbsorbsOpponentsMove(void) { diff --git a/src/battle_anim.c b/src/battle_anim.c index 3be28dd77..ae4342847 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -1479,7 +1479,7 @@ void LaunchBattleAnimation(const u8 *const moveAnims[], u16 move, u8 isMoveAnim) UpdateOamPriorityInAllHealthboxes(0); for (i = 0; i < 4; i++) { - if (GetBattlerSide(i) != 0) + if (GetBattlerSide(i) != B_SIDE_PLAYER) gAnimSpeciesByBanks[i] = GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES); else gAnimSpeciesByBanks[i] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES); @@ -1793,7 +1793,7 @@ static void ScriptCmd_end(void) if (!continuousAnim) // may have been used for debug? { m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 256); - if (IsContest() == 0) + if (!IsContest()) { UpdateBattlerSpritePriorities(); UpdateOamPriorityInAllHealthboxes(1); @@ -1838,7 +1838,7 @@ static void ScriptCmd_monbg(void) { identity = GetBattlerPosition(bank); identity += 0xFF; - if (identity <= 1 || IsContest() != 0) + if (identity <= 1 || IsContest()) toBG_2 = 0; else toBG_2 = 1; @@ -1870,7 +1870,7 @@ static void ScriptCmd_monbg(void) { identity = GetBattlerPosition(bank); identity += 0xFF; - if (identity <= 1 || IsContest() != 0) + if (identity <= 1 || IsContest()) toBG_2 = 0; else toBG_2 = 1; @@ -1940,7 +1940,7 @@ void MoveBattlerSpriteToBG(u8 bank, u8 toBG_2) spriteId = gBattlerSpriteIds[bank]; gBattle_BG1_X = -(gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x) + 32; - if (IsContest() != 0 && IsSpeciesNotUnown(EWRAM_19348[0]) != 0) + if (IsContest() && IsSpeciesNotUnown(EWRAM_19348[0]) != 0) gBattle_BG1_X--; gBattle_BG1_Y = -(gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y) + 32; gSprites[gBattlerSpriteIds[bank]].invisible = TRUE; @@ -1951,12 +1951,12 @@ void MoveBattlerSpriteToBG(u8 bank, u8 toBG_2) LoadPalette(gPlttBufferUnfaded + 0x100 + bank * 16, s.unk8 * 16, 32); DmaCopy32Defvars(3, gPlttBufferUnfaded + 0x100 + bank * 16, (u16 *)PLTT + s.unk8 * 16, 32); - if (IsContest() != 0) + if (IsContest()) r2 = 0; else r2 = GetBattlerPosition(bank); sub_80E4EF8(0, 0, r2, s.unk8, (u32)s.unk0, (((s32)s.unk4 - VRAM) / 2048), REG_BG1CNT_BITFIELD.charBaseBlock); - if (IsContest() != 0) + if (IsContest()) sub_8076380(); } else @@ -2040,7 +2040,7 @@ void sub_8076464(u8 a) struct UnknownStruct2 s; sub_8078914(&s); - if (a == 0 || IsContest() != 0) + if (a == 0 || IsContest()) { DmaFill32Large(3, 0, s.unk0, 0x2000, 0x1000); pointlessZero = 0; // is there a stubbed out Dma macro here that left the 0 load in? @@ -2128,7 +2128,7 @@ static void sub_807672C(u8 taskId) { identity = GetBattlerPosition(gTasks[taskId].data[2]); identity += 0xFF; - if (identity <= 1 || IsContest() != 0) + if (identity <= 1 || IsContest()) to_BG2 = 0; else to_BG2 = 1; @@ -2172,7 +2172,7 @@ static void ScriptCmd_monbg_22(void) { identity = GetBattlerPosition(bank); identity += 0xFF; - if (identity <= 1 || IsContest() != 0) + if (identity <= 1 || IsContest()) r1 = 0; else r1 = 1; @@ -2185,7 +2185,7 @@ static void ScriptCmd_monbg_22(void) { identity = GetBattlerPosition(bank); identity += 0xFF; - if (identity <= 1 || IsContest() != 0) + if (identity <= 1 || IsContest()) r1 = 0; else r1 = 1; @@ -2240,7 +2240,7 @@ static void sub_80769A4(u8 taskId) bank = gTasks[taskId].data[2]; identity = GetBattlerPosition(bank); identity += 0xFF; - if (identity <= 1 || IsContest() != 0) + if (identity <= 1 || IsContest()) toBG_2 = 0; else toBG_2 = 1; @@ -2400,7 +2400,7 @@ static void ScriptCmd_fadetobgfromset(void) if (IsContest()) gTasks[taskId].tBackgroundId = bg3; - else if (GetBattlerSide(gBattleAnimTarget) == 0) + else if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) gTasks[taskId].tBackgroundId = bg2; else gTasks[taskId].tBackgroundId = bg1; @@ -2524,188 +2524,60 @@ static void ScriptCmd_changebg(void) sBattleAnimScriptPtr++; } -//Weird control flow -/* -s8 BattleAnimAdjustPanning(s8 a) +s8 BattleAnimAdjustPanning(s8 pan) { if (!IsContest() && (EWRAM_17810[gBattleAnimAttacker].unk0 & 0x10)) { - a = GetBattlerSide(gBattleAnimAttacker) ? SOUND_PAN_ATTACKER : SOUND_PAN_TARGET; + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + pan = SOUND_PAN_TARGET; + else + pan = SOUND_PAN_ATTACKER_NEG; } - //_08076FDC - else + else if (IsContest()) { - if (IsContest()) - { - if (gBattleAnimAttacker == gBattleAnimTarget && gBattleAnimAttacker == 2 - && a == SOUND_PAN_TARGET) - { - //jump to _0807707A - if (a < SOUND_PAN_ATTACKER_NEG) - a = SOUND_PAN_ATTACKER; - return a; - } - } - //_08077004 - else + if (gBattleAnimAttacker != gBattleAnimTarget || gBattleAnimAttacker != 2 || pan != SOUND_PAN_TARGET) + pan *= -1; + } + else if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) + { + if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) { - if (GetBattlerSide(gBattleAnimAttacker) == 0) - { - if (GetBattlerSide(gBattleAnimTarget) == 0) - } - //_08077042 - else - { - - } - //_0807706C + if (pan == SOUND_PAN_TARGET) + pan = SOUND_PAN_ATTACKER_NEG; + else if (pan != SOUND_PAN_ATTACKER_NEG) + pan *= -1; } } - //_0807706E -} -*/ -NAKED -s8 BattleAnimAdjustPanning(s8 a) -{ - asm(".syntax unified\n\ - push {r4,lr}\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - bl IsContest\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _08076FDC\n\ - ldr r0, _08076FD4 @ =gBattleAnimAttacker\n\ - ldrb r2, [r0]\n\ - lsls r0, r2, 1\n\ - adds r0, r2\n\ - lsls r0, 2\n\ - ldr r1, _08076FD8 @ =gSharedMem + 0x17810\n\ - adds r0, r1\n\ - ldrb r1, [r0]\n\ - movs r0, 0x10\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08076FDC\n\ - adds r0, r2, 0\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - movs r4, 0xC0\n\ - cmp r0, 0\n\ - beq _0807706E\n\ - movs r4, 0x3F\n\ - b _0807706E\n\ - .align 2, 0\n\ -_08076FD4: .4byte gBattleAnimAttacker\n\ -_08076FD8: .4byte gSharedMem + 0x17810\n\ -_08076FDC:\n\ - bl IsContest\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08077004\n\ - ldr r0, _08076FFC @ =gBattleAnimAttacker\n\ - ldr r1, _08077000 @ =gBattleAnimTarget\n\ - ldrb r0, [r0]\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - bne _08077068\n\ - cmp r0, 0x2\n\ - bne _08077068\n\ - cmp r4, 0x3F\n\ - beq _0807707A\n\ - b _08077068\n\ - .align 2, 0\n\ -_08076FFC: .4byte gBattleAnimAttacker\n\ -_08077000: .4byte gBattleAnimTarget\n\ -_08077004:\n\ - ldr r0, _0807702C @ =gBattleAnimAttacker\n\ - ldrb r0, [r0]\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _08077042\n\ - ldr r0, _08077030 @ =gBattleAnimTarget\n\ - ldrb r0, [r0]\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _0807706E\n\ - lsls r0, r4, 24\n\ - asrs r1, r0, 24\n\ - cmp r1, 0x3F\n\ - bne _08077034\n\ - movs r4, 0xC0\n\ - b _0807706E\n\ - .align 2, 0\n\ -_0807702C: .4byte gBattleAnimAttacker\n\ -_08077030: .4byte gBattleAnimTarget\n\ -_08077034:\n\ - movs r0, 0x40\n\ - negs r0, r0\n\ - cmp r1, r0\n\ - beq _0807706E\n\ - negs r0, r1\n\ - lsls r0, 24\n\ - b _0807706C\n\ -_08077042:\n\ - ldr r0, _08077064 @ =gBattleAnimTarget\n\ - ldrb r0, [r0]\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bne _08077068\n\ - lsls r0, r4, 24\n\ - asrs r0, 24\n\ - movs r1, 0x40\n\ - negs r1, r1\n\ - cmp r0, r1\n\ - bne _0807706E\n\ - movs r4, 0x3F\n\ - b _0807706E\n\ - .align 2, 0\n\ -_08077064: .4byte gBattleAnimTarget\n\ -_08077068:\n\ - lsls r0, r4, 24\n\ - negs r0, r0\n\ -_0807706C:\n\ - lsrs r4, r0, 24\n\ -_0807706E:\n\ - lsls r0, r4, 24\n\ - asrs r0, 24\n\ - cmp r0, 0x3F\n\ - ble _0807707A\n\ - movs r4, 0x3F\n\ - b _08077088\n\ -_0807707A:\n\ - lsls r0, r4, 24\n\ - asrs r0, 24\n\ - movs r1, 0x40\n\ - negs r1, r1\n\ - cmp r0, r1\n\ - bge _08077088\n\ - movs r4, 0xC0\n\ -_08077088:\n\ - lsls r0, r4, 24\n\ - asrs r0, 24\n\ - pop {r4}\n\ - pop {r1}\n\ - bx r1\n\ - .syntax divided\n"); + else if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_OPPONENT) + { + if (pan == SOUND_PAN_ATTACKER_NEG) + pan = SOUND_PAN_TARGET; + } + else + { + pan *= -1; + } + + if (pan > SOUND_PAN_TARGET) + pan = SOUND_PAN_TARGET; + else if (pan < SOUND_PAN_ATTACKER_NEG) + pan = SOUND_PAN_ATTACKER_NEG; + + return pan; } s8 BattleAnimAdjustPanning2(s8 pan) { if (!IsContest() && (EWRAM_17810[gBattleAnimAttacker].unk0 & 0x10)) { - if (GetBattlerSide(gBattleAnimAttacker) != 0) + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) pan = SOUND_PAN_TARGET; else pan = SOUND_PAN_ATTACKER; } else { - if (GetBattlerSide(gBattleAnimAttacker) != 0 || IsContest() != 0) + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER || IsContest()) pan = -pan; } return pan; diff --git a/src/battle_anim_special.c b/src/battle_anim_special.c index 86dde8d30..3c2a60077 100755 --- a/src/battle_anim_special.c +++ b/src/battle_anim_special.c @@ -1272,18 +1272,14 @@ static void sub_81407B8(struct Sprite *sprite) sprite->callback = sub_81407F4; } -#ifdef NONMATCHING -// there is some weird typing going on with var0 and var1. static void sub_81407F4(struct Sprite *sprite) { - s16 var0, var1; - - var0 = sprite->data[0] + 0x800; - var1 = sprite->data[1] + 0x680; + s16 var0 = sprite->data[0] + 0x800; + s16 var1 = sprite->data[1] + 0x680; sprite->pos2.x -= var1 >> 8; sprite->pos2.y += var0 >> 8; - sprite->data[0] = var0 & 0xFF; - sprite->data[1] = var1 & 0xFF; + sprite->data[0] = (sprite->data[0] + 0x800) & 0xFF; + sprite->data[1] = (sprite->data[1] + 0x680) & 0xFF; if (sprite->pos1.y + sprite->pos2.y > 160 || sprite->pos1.x + sprite->pos2.x < -8) @@ -1294,74 +1290,6 @@ static void sub_81407F4(struct Sprite *sprite) UpdateOamPriorityInAllHealthboxes(1); } } -#else -NAKED -static void sub_81407F4(struct Sprite *sprite) -{ - asm(".syntax unified\n\ - push {r4,lr}\n\ - adds r4, r0, 0\n\ - movs r0, 0x80\n\ - lsls r0, 4\n\ - adds r2, r0, 0\n\ - ldrh r1, [r4, 0x2E]\n\ - adds r2, r1\n\ - movs r0, 0xD0\n\ - lsls r0, 3\n\ - adds r3, r0, 0\n\ - ldrh r1, [r4, 0x30]\n\ - adds r3, r1\n\ - lsls r1, r3, 16\n\ - asrs r1, 24\n\ - ldrh r0, [r4, 0x24]\n\ - subs r0, r1\n\ - strh r0, [r4, 0x24]\n\ - lsls r0, r2, 16\n\ - asrs r0, 24\n\ - ldrh r1, [r4, 0x26]\n\ - adds r0, r1\n\ - strh r0, [r4, 0x26]\n\ - movs r0, 0xFF\n\ - ands r2, r0\n\ - strh r2, [r4, 0x2E]\n\ - ands r3, r0\n\ - strh r3, [r4, 0x30]\n\ - movs r2, 0x22\n\ - ldrsh r0, [r4, r2]\n\ - movs r2, 0x26\n\ - ldrsh r1, [r4, r2]\n\ - adds r0, r1\n\ - cmp r0, 0xA0\n\ - bgt _0814084A\n\ - movs r1, 0x20\n\ - ldrsh r0, [r4, r1]\n\ - movs r2, 0x24\n\ - ldrsh r1, [r4, r2]\n\ - adds r0, r1\n\ - movs r1, 0x8\n\ - negs r1, r1\n\ - cmp r0, r1\n\ - bge _0814085E\n\ -_0814084A:\n\ - movs r0, 0\n\ - strh r0, [r4, 0x2E]\n\ - ldr r0, _08140864 @ =sub_81405C8\n\ - str r0, [r4, 0x1C]\n\ - ldr r1, _08140868 @ =gDoingBattleAnim\n\ - movs r0, 0\n\ - strb r0, [r1]\n\ - movs r0, 0x1\n\ - bl UpdateOamPriorityInAllHealthboxes\n\ -_0814085E:\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08140864: .4byte sub_81405C8\n\ -_08140868: .4byte gDoingBattleAnim\n\ - .syntax divided\n"); -} -#endif // NONMATCHING u8 AnimateBallOpenParticles(u8 x, u8 y, u8 priority, u8 subpriority, u8 ballIndex) { diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 9a48f4e16..cf816f392 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -1387,7 +1387,6 @@ void sub_802DA9C(u8 taskId) gTasks[taskId].func = sub_802DB6C; } -#ifdef NONMATCHING void sub_802DB6C(u8 taskId) { if (gTasks[taskId].data[10] < 13) @@ -1396,209 +1395,49 @@ void sub_802DB6C(u8 taskId) } else { - u8 r9 = gTasks[taskId].data[0]; - s32 r10 = gTasks[taskId].data[1]; //s16? - u8 r7 = gTasks[taskId].data[2]; - s16 r4; + u8 monId = gTasks[taskId].data[0]; + s16 gainedExp = gTasks[taskId].data[1]; + u8 battlerId = gTasks[taskId].data[2]; + s16 newExpPoints; - r4 = sub_8045C78(r7, gHealthboxSpriteIds[r7], 1, 0); - sub_8043DFC(gHealthboxSpriteIds[r7]); - if (r4 == -1) + newExpPoints = sub_8045C78(battlerId, gHealthboxSpriteIds[battlerId], 1, 0); + sub_8043DFC(gHealthboxSpriteIds[battlerId]); + if (newExpPoints == -1) { - struct Pokemon *pkmn; - u8 r4; - u32 sp4; - u16 r0; - u32 sp0; + u8 level; + s32 currExp; + u16 species; + s32 expOnNextLvl; m4aSongNumStop(SE_EXP); - pkmn = &gPlayerParty[r9]; - r4 = GetMonData(pkmn, MON_DATA_LEVEL); - sp4 = GetMonData(pkmn, MON_DATA_EXP); - r0 = GetMonData(pkmn, MON_DATA_SPECIES); - sp0 = gExperienceTables[gBaseStats[r0].growthRate][r4 + 1]; - if (sp4 + r10 >= sp0) + level = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL); + currExp = GetMonData(&gPlayerParty[monId], MON_DATA_EXP); + species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); + expOnNextLvl = gExperienceTables[gBaseStats[species].growthRate][level + 1]; + + if (currExp + gainedExp >= expOnNextLvl) { - u8 r5; - u32 asdf; - - SetMonData(pkmn, MON_DATA_EXP, &sp0); - CalculateMonStats(pkmn); - //r10 -= sp0 - sp4; - asdf = sp0 - sp4; - //asdf = r10 - (sp0 - sp4); - r10 -= asdf; - r5 = gActiveBattler; - gActiveBattler = r7; - BtlController_EmitTwoReturnValues(1, 11, r10); - gActiveBattler = r5; + u8 savedActiveBattler; + + SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &expOnNextLvl); + CalculateMonStats(&gPlayerParty[monId]); + gainedExp -= expOnNextLvl - currExp; + savedActiveBattler = gActiveBattler; + gActiveBattler = battlerId; + BtlController_EmitTwoReturnValues(1, 11, gainedExp); + gActiveBattler = savedActiveBattler; gTasks[taskId].func = sub_802DCB0; } else { - //u32 asdf = sp4 + r10; - sp4 += r10; - SetMonData(pkmn, MON_DATA_EXP, &sp4); - gBattlerControllerFuncs[r7] = sub_802D90C; + currExp += gainedExp; + SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &currExp); + gBattlerControllerFuncs[battlerId] = sub_802D90C; DestroyTask(taskId); } } } } -#else -NAKED -void sub_802DB6C(u8 taskId) -{ - asm_unified("push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x8\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r8, r0\n\ - ldr r1, _0802DB98 @ =gTasks\n\ - lsls r0, 2\n\ - add r0, r8\n\ - lsls r0, 3\n\ - adds r6, r0, r1\n\ - ldrh r1, [r6, 0x1C]\n\ - movs r2, 0x1C\n\ - ldrsh r0, [r6, r2]\n\ - cmp r0, 0xC\n\ - bgt _0802DB9C\n\ - adds r0, r1, 0x1\n\ - strh r0, [r6, 0x1C]\n\ - b _0802DC98\n\ - .align 2, 0\n\ -_0802DB98: .4byte gTasks\n\ -_0802DB9C:\n\ - ldrb r0, [r6, 0x8]\n\ - mov r9, r0\n\ - ldrh r2, [r6, 0xA]\n\ - mov r10, r2\n\ - ldrb r7, [r6, 0xC]\n\ - ldr r5, _0802DC64 @ =gHealthboxSpriteIds\n\ - adds r5, r7, r5\n\ - ldrb r1, [r5]\n\ - adds r0, r7, 0\n\ - movs r2, 0x1\n\ - movs r3, 0\n\ - bl sub_8045C78\n\ - adds r4, r0, 0\n\ - lsls r4, 16\n\ - lsrs r4, 16\n\ - ldrb r0, [r5]\n\ - bl sub_8043DFC\n\ - lsls r4, 16\n\ - asrs r4, 16\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - cmp r4, r0\n\ - bne _0802DC98\n\ - movs r0, 0x21\n\ - bl m4aSongNumStop\n\ - movs r0, 0x64\n\ - mov r1, r9\n\ - muls r1, r0\n\ - ldr r0, _0802DC68 @ =gPlayerParty\n\ - adds r5, r1, r0\n\ - adds r0, r5, 0\n\ - movs r1, 0x38\n\ - bl GetMonData\n\ - adds r4, r0, 0\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - adds r0, r5, 0\n\ - movs r1, 0x19\n\ - bl GetMonData\n\ - str r0, [sp, 0x4]\n\ - adds r0, r5, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - ldr r3, _0802DC6C @ =gExperienceTables\n\ - adds r4, 0x1\n\ - lsls r4, 2\n\ - ldr r2, _0802DC70 @ =gBaseStats\n\ - lsls r1, r0, 3\n\ - subs r1, r0\n\ - lsls r1, 2\n\ - adds r1, r2\n\ - ldrb r1, [r1, 0x13]\n\ - movs r0, 0xCA\n\ - lsls r0, 1\n\ - muls r0, r1\n\ - adds r4, r0\n\ - adds r4, r3\n\ - ldr r1, [r4]\n\ - str r1, [sp]\n\ - mov r2, r10\n\ - lsls r0, r2, 16\n\ - asrs r4, r0, 16\n\ - ldr r0, [sp, 0x4]\n\ - adds r0, r4\n\ - cmp r0, r1\n\ - blt _0802DC7C\n\ - adds r0, r5, 0\n\ - movs r1, 0x19\n\ - mov r2, sp\n\ - bl SetMonData\n\ - adds r0, r5, 0\n\ - bl CalculateMonStats\n\ - ldr r2, [sp]\n\ - add r0, sp, 0x4\n\ - ldrh r0, [r0]\n\ - subs r2, r0\n\ - subs r2, r4, r2\n\ - ldr r4, _0802DC74 @ =gActiveBattler\n\ - ldrb r5, [r4]\n\ - strb r7, [r4]\n\ - lsls r2, 16\n\ - lsrs r2, 16\n\ - movs r0, 0x1\n\ - movs r1, 0xB\n\ - bl BtlController_EmitTwoReturnValues\n\ - strb r5, [r4]\n\ - ldr r0, _0802DC78 @ =sub_802DCB0\n\ - str r0, [r6]\n\ - b _0802DC98\n\ - .align 2, 0\n\ -_0802DC64: .4byte gHealthboxSpriteIds\n\ -_0802DC68: .4byte gPlayerParty\n\ -_0802DC6C: .4byte gExperienceTables\n\ -_0802DC70: .4byte gBaseStats\n\ -_0802DC74: .4byte gActiveBattler\n\ -_0802DC78: .4byte sub_802DCB0\n\ -_0802DC7C:\n\ - str r0, [sp, 0x4]\n\ - add r2, sp, 0x4\n\ - adds r0, r5, 0\n\ - movs r1, 0x19\n\ - bl SetMonData\n\ - ldr r1, _0802DCA8 @ =gBattlerControllerFuncs\n\ - lsls r0, r7, 2\n\ - adds r0, r1\n\ - ldr r1, _0802DCAC @ =sub_802D90C\n\ - str r1, [r0]\n\ - mov r0, r8\n\ - bl DestroyTask\n\ -_0802DC98:\n\ - add sp, 0x8\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0802DCA8: .4byte gBattlerControllerFuncs\n\ -_0802DCAC: .4byte sub_802D90C\n"); -} -#endif void sub_802DCB0(u8 taskId) { diff --git a/src/battle_main.c b/src/battle_main.c index 66140133c..061d1f102 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -1382,7 +1382,7 @@ 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_ShowCurrentAnimAudioOptions(void); void debug_sub_80125A0(void); void debug_sub_80125E4(void); void debug_sub_8012628(void); @@ -1482,7 +1482,7 @@ void debug_sub_80108B8(void) debug_sub_8012294(); debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); debug_sub_8012540(); - debug_nullsub_3(); + debug_ShowCurrentAnimAudioOptions(); gUnknown_Debug_030043A8 = 0; debug_sub_80125A0(); if (gUnknown_Debug_2023A76[0][0x22] == 8) @@ -1616,7 +1616,7 @@ void debug_sub_8010CAC(void) gSaveBlock2.optionsBattleSceneOff = (r5 & 1); gSaveBlock2.optionsSound = (r5 & 2) >> 1; SetPokemonCryStereo(gSaveBlock2.optionsSound); - debug_nullsub_3(); + debug_ShowCurrentAnimAudioOptions(); } } if (gMain.newKeysRaw == START_BUTTON) @@ -1694,7 +1694,7 @@ void debug_sub_8010CAC(void) debug_sub_8011E5C(); debug_sub_8011E74(); debug_sub_8012540(); - debug_nullsub_3(); + debug_ShowCurrentAnimAudioOptions(); debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); break; case 32: @@ -1702,7 +1702,7 @@ void debug_sub_8010CAC(void) debug_sub_8011E5C(); debug_sub_8011E74(); debug_sub_8012540(); - debug_nullsub_3(); + debug_ShowCurrentAnimAudioOptions(); debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); break; case 33: @@ -1755,7 +1755,7 @@ void debug_sub_8010CAC(void) debug_sub_8011E5C(); debug_sub_8011E74(); debug_sub_8012540(); - debug_nullsub_3(); + debug_ShowCurrentAnimAudioOptions(); debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); break; case 32: @@ -1763,7 +1763,7 @@ void debug_sub_8010CAC(void) debug_sub_8011E5C(); debug_sub_8011E74(); debug_sub_8012540(); - debug_nullsub_3(); + debug_ShowCurrentAnimAudioOptions(); debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); break; case 33: @@ -2218,7 +2218,12 @@ void debug_sub_8011EA0(u8 a) case 15: case 20: case 25: +// TODO: check other revisions +#if (ENGLISH && REVISION == 0) + debug_sub_8010A7C(0, 8); +#else debug_sub_8010A7C(0, 20); +#endif Text_InitWindow( &gUnknown_Debug_03004370, gBattleTextBuff1, @@ -2227,6 +2232,8 @@ void debug_sub_8011EA0(u8 a) gUnknown_Debug_821F424[a][2]); Text_PrintWindow8002F44(&gUnknown_Debug_03004370); ConvertIntToDecimalStringN(gBattleTextBuff1, gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a], 2, 3); +// TODO: check other revisions +#if !(ENGLISH && REVISION == 0) Text_InitWindow( &gUnknown_Debug_03004370, gBattleTextBuff1, @@ -2235,6 +2242,7 @@ void debug_sub_8011EA0(u8 a) 0); Text_PrintWindow8002F44(&gUnknown_Debug_03004370); gBattleTextBuff1[0] = EOS; +#endif StringAppend(gBattleTextBuff1, gSpeciesNames[gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a]]); Text_InitWindow( &gUnknown_Debug_03004370, @@ -2266,7 +2274,12 @@ void debug_sub_8011EA0(u8 a) case 17: case 22: case 27: +// TODO: check other revisions +#if (ENGLISH && REVISION == 0) + debug_sub_8010A7C(0, 11); +#else debug_sub_8010A7C(0, 24); +#endif Text_InitWindow( &gUnknown_Debug_03004370, gBattleTextBuff1, @@ -2275,6 +2288,8 @@ void debug_sub_8011EA0(u8 a) gUnknown_Debug_821F424[a][2]); Text_PrintWindow8002F44(&gUnknown_Debug_03004370); ConvertIntToDecimalStringN(gBattleTextBuff1, gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a], 2, 3); +// TODO: check other revisions +#if !(ENGLISH && REVISION == 0) Text_InitWindow( &gUnknown_Debug_03004370, gBattleTextBuff1, @@ -2283,6 +2298,7 @@ void debug_sub_8011EA0(u8 a) 0); Text_PrintWindow8002F44(&gUnknown_Debug_03004370); gBattleTextBuff1[0] = EOS; +#endif if (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a] != 0) StringAppend(gBattleTextBuff1, ItemId_GetName(gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a])); else @@ -2301,7 +2317,12 @@ void debug_sub_8011EA0(u8 a) case 19: case 24: case 29: +// TODO: check other revisions +#if (ENGLISH && REVISION == 0) + debug_sub_8010A7C(0, 2); +#else debug_sub_8010A7C(0, 4); +#endif Text_InitWindow( &gUnknown_Debug_03004370, gBattleTextBuff1, @@ -2374,7 +2395,12 @@ void debug_sub_8012294(void) if (r5 < 30) { +// TODO: check other revisions +#if (ENGLISH && REVISION == 0) + debug_sub_8010A7C(0, 10); +#else debug_sub_8010A7C(0, 24); +#endif Text_InitWindow( &gUnknown_Debug_03004370, gBattleTextBuff1, @@ -2383,6 +2409,8 @@ void debug_sub_8012294(void) gUnknown_Debug_821F564[gUnknown_Debug_030043A8][2]); Text_PrintWindow8002F44(&gUnknown_Debug_03004370); ConvertIntToDecimalStringN(gBattleTextBuff1, gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r5 / 5][gUnknown_Debug_030043A8], 2, 3); +// TODO: check other revisions +#if !(ENGLISH && REVISION == 0) Text_InitWindow( &gUnknown_Debug_03004370, gBattleTextBuff1, @@ -2391,6 +2419,7 @@ void debug_sub_8012294(void) 0); Text_PrintWindow8002F44(&gUnknown_Debug_03004370); gBattleTextBuff1[0] = EOS; +#endif StringAppend(gBattleTextBuff1, gMoveNames[gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r5 / 5][gUnknown_Debug_030043A8]]); Text_InitWindow( &gUnknown_Debug_03004370, @@ -2408,7 +2437,12 @@ void debug_sub_80123D8(u8 a) { if (a < 30) { +// TODO: check other revisions +#if (ENGLISH && REVISION == 0) + debug_sub_8010A7C(0, 7); +#else debug_sub_8010A7C(0, 18); +#endif Text_InitWindow( &gUnknown_Debug_03004370, gBattleTextBuff1, @@ -2424,7 +2458,12 @@ void debug_sub_80123D8(u8 a) gUnknown_Debug_821F58C[1], gUnknown_Debug_821F58C[2]); Text_PrintWindow8002F44(&gUnknown_Debug_03004370); +// TODO: check other revisions +#if (ENGLISH && REVISION == 0) + debug_sub_8010A7C(0, 7); +#else debug_sub_8010A7C(0, 18); +#endif Text_InitWindow( &gUnknown_Debug_03004370, gBattleTextBuff1, @@ -2473,8 +2512,50 @@ void debug_sub_8012540(void) Text_PrintWindow8002F44(&gUnknown_Debug_03004370); } -void debug_nullsub_3(void) +// TODO: check other revisions +#if (ENGLISH && REVISION == 0) +extern const u8 Str_821F64D[]; +extern const u8 Str_821F652[]; +extern const u8 Str_821F655[]; +extern const u8 Str_821F65A[]; +#endif + +void debug_ShowCurrentAnimAudioOptions(void) { +// TODO: check other revisions +#if (ENGLISH && REVISION == 0) + if (gSaveBlock2.optionsBattleSceneOff) + Text_InitWindow( + &gUnknown_Debug_03004370, + Str_821F652, + 418, + gUnknown_Debug_03004360 * 32 + 21, + 0); + else + Text_InitWindow( + &gUnknown_Debug_03004370, + Str_821F64D, + 418, + gUnknown_Debug_03004360 * 32 + 21, + 0); + Text_PrintWindow8002F44(&gUnknown_Debug_03004370); + + if (gSaveBlock2.optionsSound) + Text_InitWindow( + &gUnknown_Debug_03004370, + Str_821F65A, + 422, + gUnknown_Debug_03004360 * 32 + 24, + 0); + else + Text_InitWindow( + &gUnknown_Debug_03004370, + Str_821F655, + 422, + gUnknown_Debug_03004360 * 32 + 24, + 0); + Text_PrintWindow8002F44(&gUnknown_Debug_03004370); +#endif } extern const u32 gUnknown_Debug_821F680[][0x23]; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 32887efc1..db2e1af12 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5342,7 +5342,7 @@ static void atk23_getexp(void) u16 calculatedExp; s32 viaSentIn; - for (viaSentIn = 0, i = 0; i < 6; i++) + for (viaSentIn = 0, i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == SPECIES_NONE || GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0) continue; @@ -5572,288 +5572,68 @@ static void atk23_getexp(void) } } -#ifdef NONMATCHING static void atk24(void) { u16 HP_count = 0; - int i; - if (gBattleControllerExecFlags) {return;} - - for (i = 0; i < 6; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) - HP_count += GetMonData(&gPlayerParty[i], MON_DATA_HP); - } - - if (HP_count == 0) - gBattleOutcome |= B_OUTCOME_LOST; - - for (HP_count = 0, i = 0; i < 6; i++) - { - if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES) && !GetMonData(&gEnemyParty[i], MON_DATA_IS_EGG)) - HP_count += GetMonData(&gEnemyParty[i], MON_DATA_HP); - } - - if (!HP_count) - gBattleOutcome |= B_OUTCOME_WON; + s32 i; + s32 found1; + s32 found2; - if (!gBattleOutcome && (gBattleTypeFlags & BATTLE_TYPE_LINK)) + if (gBattleControllerExecFlags == 0) { - register int found1 asm("r2"); - register int found2 asm("r4"); - - //I can't for the love of god decompile that part - - for (found1 = 0, i = 0; i < gBattlersCount; i += 2) + for (i = 0; i < PARTY_SIZE; i++) { - if ((gHitMarker & HITMARKER_UNK(i)) && !gSpecialStatuses[i].flag40) - found1++; + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) + HP_count += GetMonData(&gPlayerParty[i], MON_DATA_HP); } - for (found2 = 0, i = 1; i < gBattlersCount; i += 2) + if (HP_count == 0) + gBattleOutcome |= B_OUTCOME_LOST; + + for (HP_count = 0, i = 0; i < PARTY_SIZE; i++) { - if ((gHitMarker & HITMARKER_UNK(i)) && !gSpecialStatuses[i].flag40) - found2++; + if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES) && !GetMonData(&gEnemyParty[i], MON_DATA_IS_EGG)) + HP_count += GetMonData(&gEnemyParty[i], MON_DATA_HP); } - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + if (HP_count == 0) + gBattleOutcome |= B_OUTCOME_WON; + + if (!gBattleOutcome && (gBattleTypeFlags & BATTLE_TYPE_LINK)) { - if (found2 + found1 > 1) - gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1); + for (found1 = 0, i = 0; i < gBattlersCount; i += 2) + { + if ((gHitMarker & HITMARKER_UNK(i)) && !gSpecialStatuses[i].flag40) + found1++; + } + + for (found2 = 0, i = 1; i < gBattlersCount; i += 2) + { + if ((gHitMarker & HITMARKER_UNK(i)) && !gSpecialStatuses[i].flag40) + found2++; + } + + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + if (found2 + found1 > 1) + gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1); + else + gBattlescriptCurrInstr += 5; + } else - gBattlescriptCurrInstr += 5; + { + if (found2 != 0 && found1 != 0) + gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1); + else + gBattlescriptCurrInstr += 5; + } } else { - if (found2 != 0 && found1 != 0) - gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1); - else - gBattlescriptCurrInstr += 5; + gBattlescriptCurrInstr += 5; } } - else - gBattlescriptCurrInstr += 5; - } -#else -NAKED -static void atk24(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - movs r6, 0\n\ - ldr r0, _08020AF0 @ =gBattleControllerExecFlags\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _080209C6\n\ - b _08020B46\n\ -_080209C6:\n\ - movs r5, 0\n\ -_080209C8:\n\ - movs r0, 0x64\n\ - adds r1, r5, 0\n\ - muls r1, r0\n\ - ldr r0, _08020AF4 @ =gPlayerParty\n\ - adds r4, r1, r0\n\ - adds r0, r4, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _080209F8\n\ - adds r0, r4, 0\n\ - movs r1, 0x2D\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - bne _080209F8\n\ - adds r0, r4, 0\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - adds r0, r6, r0\n\ - lsls r0, 16\n\ - lsrs r6, r0, 16\n\ -_080209F8:\n\ - adds r5, 0x1\n\ - cmp r5, 0x5\n\ - ble _080209C8\n\ - cmp r6, 0\n\ - bne _08020A0C\n\ - ldr r0, _08020AF8 @ =gBattleOutcome\n\ - ldrb r1, [r0]\n\ - movs r2, 0x2\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ -_08020A0C:\n\ - movs r6, 0\n\ - movs r5, 0\n\ -_08020A10:\n\ - movs r0, 0x64\n\ - adds r1, r5, 0\n\ - muls r1, r0\n\ - ldr r0, _08020AFC @ =gEnemyParty\n\ - adds r4, r1, r0\n\ - adds r0, r4, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _08020A40\n\ - adds r0, r4, 0\n\ - movs r1, 0x2D\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - bne _08020A40\n\ - adds r0, r4, 0\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - adds r0, r6, r0\n\ - lsls r0, 16\n\ - lsrs r6, r0, 16\n\ -_08020A40:\n\ - adds r5, 0x1\n\ - cmp r5, 0x5\n\ - ble _08020A10\n\ - ldr r2, _08020AF8 @ =gBattleOutcome\n\ - cmp r6, 0\n\ - bne _08020A54\n\ - ldrb r0, [r2]\n\ - movs r1, 0x1\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ -_08020A54:\n\ - ldrb r0, [r2]\n\ - cmp r0, 0\n\ - bne _08020B3E\n\ - ldr r2, _08020B00 @ =gBattleTypeFlags\n\ - ldrh r1, [r2]\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - mov r8, r2\n\ - cmp r0, 0\n\ - beq _08020B3E\n\ - movs r2, 0\n\ - movs r5, 0\n\ - ldr r0, _08020B04 @ =gBattlersCount\n\ - ldrb r3, [r0]\n\ - mov r12, r0\n\ - ldr r7, _08020B08 @ =gBattlescriptCurrInstr\n\ - cmp r2, r3\n\ - bge _08020AA0\n\ - ldr r0, _08020B0C @ =gHitMarker\n\ - movs r1, 0x80\n\ - lsls r1, 21\n\ - ldr r6, [r0]\n\ - adds r4, r3, 0\n\ - ldr r3, _08020B10 @ =gSpecialStatuses\n\ -_08020A84:\n\ - adds r0, r1, 0\n\ - lsls r0, r5\n\ - ands r0, r6\n\ - cmp r0, 0\n\ - beq _08020A98\n\ - ldrb r0, [r3]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08020A98\n\ - adds r2, 0x1\n\ -_08020A98:\n\ - adds r3, 0x28\n\ - adds r5, 0x2\n\ - cmp r5, r4\n\ - blt _08020A84\n\ -_08020AA0:\n\ - movs r4, 0\n\ - movs r5, 0x1\n\ - mov r0, r12\n\ - ldrb r3, [r0]\n\ - cmp r5, r3\n\ - bge _08020ADA\n\ - ldr r0, _08020B0C @ =gHitMarker\n\ - movs r1, 0x80\n\ - lsls r1, 21\n\ - mov r12, r1\n\ - ldr r1, [r0]\n\ - ldr r0, _08020B10 @ =gSpecialStatuses\n\ - adds r6, r3, 0\n\ - adds r3, r0, 0\n\ - adds r3, 0x14\n\ -_08020ABE:\n\ - mov r0, r12\n\ - lsls r0, r5\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08020AD2\n\ - ldrb r0, [r3]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08020AD2\n\ - adds r4, 0x1\n\ -_08020AD2:\n\ - adds r3, 0x28\n\ - adds r5, 0x2\n\ - cmp r5, r6\n\ - blt _08020ABE\n\ -_08020ADA:\n\ - mov r0, r8\n\ - ldrh r1, [r0]\n\ - movs r0, 0x40\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08020B14\n\ - adds r0, r4, r2\n\ - cmp r0, 0x1\n\ - bgt _08020B1C\n\ - b _08020B36\n\ - .align 2, 0\n\ -_08020AF0: .4byte gBattleControllerExecFlags\n\ -_08020AF4: .4byte gPlayerParty\n\ -_08020AF8: .4byte gBattleOutcome\n\ -_08020AFC: .4byte gEnemyParty\n\ -_08020B00: .4byte gBattleTypeFlags\n\ -_08020B04: .4byte gBattlersCount\n\ -_08020B08: .4byte gBattlescriptCurrInstr\n\ -_08020B0C: .4byte gHitMarker\n\ -_08020B10: .4byte gSpecialStatuses\n\ -_08020B14:\n\ - cmp r4, 0\n\ - beq _08020B36\n\ - cmp r2, 0\n\ - beq _08020B36\n\ -_08020B1C:\n\ - ldr r2, [r7]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - adds r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - adds r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - lsls r0, 24\n\ - adds r1, r0\n\ - str r1, [r7]\n\ - b _08020B46\n\ -_08020B36:\n\ - ldr r0, [r7]\n\ - adds r0, 0x5\n\ - str r0, [r7]\n\ - b _08020B46\n\ -_08020B3E:\n\ - ldr r1, _08020B50 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x5\n\ - str r0, [r1]\n\ -_08020B46:\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08020B50: .4byte gBattlescriptCurrInstr\n\ - .syntax divided\n"); -} -#endif // NONMATCHING static void MoveValuesCleanUp(void) { @@ -7213,7 +6993,7 @@ static void atk4F_jumpifcantswitch(void) to_cmp = r7; party = gPlayerParty; } - for (val = 0; val < 6; val++) + for (val = 0; val < PARTY_SIZE; val++) { if (GetMonData(&party[val], MON_DATA_HP) != 0 && GetMonData(&party[val], MON_DATA_SPECIES) != SPECIES_NONE @@ -9083,7 +8863,7 @@ static void atk61_drawpartystatussummary(void) else party = gEnemyParty; - for (i = 0; i < 6; i++) + for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&party[i], MON_DATA_SPECIES2) == 0 || GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG) { @@ -10569,7 +10349,7 @@ static void atk8F_forcerandomswitch(void) else { valid = 0; - for (i = 0; i < 6; i++) + for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE && !GetMonData(&party[i], MON_DATA_IS_EGG) @@ -11607,107 +11387,34 @@ static void atk9E_metronome(void) .word gBattlerTarget"); } #else -#ifdef NONMATCHING static void atk9E_metronome(void) { - // sMovesForbiddenToCopy - int i; - do + while (1) { - while ((gCurrentMove = (Random() & 0x1FF) + 1) > 0x162); - for (i = 0; sMovesForbiddenToCopy[i] != gCurrentMove && sMovesForbiddenToCopy[i] != 0xFFFF; i++); - } while (sMovesForbiddenToCopy[i] != 0xFFFF); + s32 i; - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; - gBattlerTarget = GetMoveTarget(gCurrentMove, 0); -} - -#else -NAKED -static void atk9E_metronome(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - ldr r7, _08027938 @ =gCurrentMove\n\ - movs r6, 0xB1\n\ - lsls r6, 1\n\ - ldr r5, _0802793C @ =sMovesForbiddenToCopy\n\ - ldr r0, _08027940 @ =gBattlescriptCurrInstr\n\ - mov r8, r0\n\ -_080278CA:\n\ - bl Random\n\ - ldr r2, _08027944 @ =0x000001ff\n\ - adds r1, r2, 0\n\ - ands r0, r1\n\ - adds r0, 0x1\n\ - strh r0, [r7]\n\ - cmp r0, r6\n\ - bhi _080278CA\n\ - movs r0, 0x3\n\ -_080278DE:\n\ - subs r0, 0x1\n\ - cmp r0, 0\n\ - bge _080278DE\n\ - ldr r4, _08027938 @ =gCurrentMove\n\ - ldrh r2, [r4]\n\ - ldr r3, _08027948 @ =0x0000ffff\n\ - subs r0, r5, 0x2\n\ -_080278EC:\n\ - adds r0, 0x2\n\ - ldrh r1, [r0]\n\ - cmp r1, r2\n\ - beq _080278F8\n\ - cmp r1, r3\n\ - bne _080278EC\n\ -_080278F8:\n\ - ldr r0, _08027948 @ =0x0000ffff\n\ - cmp r1, r0\n\ - bne _080278CA\n\ - ldr r2, _0802794C @ =gHitMarker\n\ - ldr r0, [r2]\n\ - ldr r1, _08027950 @ =0xfffffbff\n\ - ands r0, r1\n\ - str r0, [r2]\n\ - ldr r3, _08027954 @ =gBattleScriptsForMoveEffects\n\ - ldr r2, _08027958 @ =gBattleMoves\n\ - ldrh r1, [r4]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldrb r0, [r0]\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - ldr r0, [r0]\n\ - mov r1, r8\n\ - str r0, [r1]\n\ - ldrh r0, [r4]\n\ - movs r1, 0\n\ - bl GetMoveTarget\n\ - ldr r1, _0802795C @ =gBattlerTarget\n\ - strb r0, [r1]\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08027938: .4byte gCurrentMove\n\ -_0802793C: .4byte sMovesForbiddenToCopy\n\ -_08027940: .4byte gBattlescriptCurrInstr\n\ -_08027944: .4byte 0x000001ff\n\ -_08027948: .4byte 0x0000ffff\n\ -_0802794C: .4byte gHitMarker\n\ -_08027950: .4byte 0xfffffbff\n\ -_08027954: .4byte gBattleScriptsForMoveEffects\n\ -_08027958: .4byte gBattleMoves\n\ -_0802795C: .4byte gBattlerTarget\n\ - .syntax divided"); + gCurrentMove = (Random() & 0x1FF) + 1; + if (gCurrentMove >= 355) + continue; + for (i = 0; i < MAX_MON_MOVES; ++i); // redundant + i = -1; + while (1) + { + ++i; + if (sMovesForbiddenToCopy[i] == gCurrentMove) + break; + if (sMovesForbiddenToCopy[i] == METRONOME_FORBIDDEN_END) + break; + } + if (sMovesForbiddenToCopy[i] == METRONOME_FORBIDDEN_END) + { + gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); + gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; + gBattlerTarget = GetMoveTarget(gCurrentMove, 0); + return; + } + } } -#endif // NONMATCHING #endif static void atk9F_dmgtolevel(void) @@ -12379,7 +12086,7 @@ static void atkAE_healpartystatus(void) } } - for (i = 0; i < 6; i++) + for (i = 0; i < PARTY_SIZE; i++) { u16 species = GetMonData(&party[i], MON_DATA_SPECIES2); u8 abilityBit = GetMonData(&party[i], MON_DATA_ALT_ABILITY); @@ -12852,27 +12559,31 @@ static void atkC3_trysetfutureattack(void) } } -#ifdef NONMATCHING static void atkC4_trydobeatup(void) { - register struct Pokemon* party asm("r7"); - if (GetBattlerSide(gBattlerAttacker) == 0) + struct Pokemon *party; + + if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) party = gPlayerParty; else party = gEnemyParty; - if (gBattleMons[gBattlerTarget].hp == 0) + { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + } else { - while (gBattleCommunication[0] < 6) + u8 beforeLoop = gBattleCommunication[0]; + + for (;gBattleCommunication[0] < PARTY_SIZE; ++gBattleCommunication[0]) { - if (GetMonData(&party[gBattleCommunication[0]], MON_DATA_HP) && GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES2) - && GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES2) != SPECIES_EGG && !GetMonData(&party[gBattleCommunication[0]], MON_DATA_STATUS)) - break; - gBattleCommunication[0]++; + if (GetMonData(&party[gBattleCommunication[0]], MON_DATA_HP) + && GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES2) + && GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES2) != SPECIES_EGG + && !GetMonData(&party[gBattleCommunication[0]], MON_DATA_STATUS)) + break; } - if (gBattleCommunication[0] < 6) + if (gBattleCommunication[0] < PARTY_SIZE) { gBattleTextBuff1[0] = 0xFD; gBattleTextBuff1[1] = 4; @@ -12888,269 +12599,14 @@ static void atkC4_trydobeatup(void) gBattleMoveDamage = (gBattleMoveDamage / 50) + 2; if (gProtectStructs[gBattlerAttacker].helpingHand) gBattleMoveDamage = gBattleMoveDamage * 15 / 10; - - gBattleCommunication[0]++; + ++gBattleCommunication[0]; } - else if (gBattleCommunication[0] != 0) + else if (beforeLoop != 0) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 5); } } -#else -NAKED -static void atkC4_trydobeatup(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - ldr r0, _08029A8C @ =gBattlerAttacker\n\ - ldrb r0, [r0]\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - ldr r7, _08029A90 @ =gEnemyParty\n\ - cmp r0, 0\n\ - bne _08029A62\n\ - ldr r7, _08029A94 @ =gPlayerParty\n\ -_08029A62:\n\ - ldr r2, _08029A98 @ =gBattleMons\n\ - ldr r0, _08029A9C @ =gBattlerTarget\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r0, r2\n\ - ldrh r0, [r0, 0x28]\n\ - cmp r0, 0\n\ - bne _08029AA4\n\ - ldr r3, _08029AA0 @ =gBattlescriptCurrInstr\n\ - ldr r2, [r3]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - b _08029C40\n\ - .align 2, 0\n\ -_08029A8C: .4byte gBattlerAttacker\n\ -_08029A90: .4byte gEnemyParty\n\ -_08029A94: .4byte gPlayerParty\n\ -_08029A98: .4byte gBattleMons\n\ -_08029A9C: .4byte gBattlerTarget\n\ -_08029AA0: .4byte gBattlescriptCurrInstr\n\ -_08029AA4:\n\ - ldr r6, _08029BE0 @ =gBattleCommunication\n\ - ldrb r0, [r6]\n\ - mov r8, r0\n\ - cmp r0, 0x5\n\ - bls _08029AB0\n\ - b _08029C0C\n\ -_08029AB0:\n\ - adds r4, r6, 0\n\ - movs r5, 0x64\n\ -_08029AB4:\n\ - ldrb r0, [r4]\n\ - muls r0, r5\n\ - adds r0, r7, r0\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _08029AF8\n\ - ldrb r0, [r6]\n\ - muls r0, r5\n\ - adds r0, r7, r0\n\ - movs r1, 0x41\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _08029AF8\n\ - ldrb r0, [r4]\n\ - muls r0, r5\n\ - adds r0, r7, r0\n\ - movs r1, 0x41\n\ - bl GetMonData\n\ - movs r1, 0xCE\n\ - lsls r1, 1\n\ - cmp r0, r1\n\ - beq _08029AF8\n\ - ldrb r0, [r4]\n\ - muls r0, r5\n\ - adds r0, r7, r0\n\ - movs r1, 0x37\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _08029B08\n\ -_08029AF8:\n\ - ldrb r0, [r4]\n\ - adds r0, 0x1\n\ - strb r0, [r4]\n\ - adds r6, r4, 0\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x5\n\ - bls _08029AB4\n\ -_08029B08:\n\ - ldr r1, _08029BE0 @ =gBattleCommunication\n\ - mov r9, r1\n\ - ldrb r2, [r1]\n\ - cmp r2, 0x5\n\ - bhi _08029C0C\n\ - ldr r1, _08029BE4 @ =gBattleTextBuff1\n\ - movs r0, 0xFD\n\ - strb r0, [r1]\n\ - movs r0, 0x4\n\ - strb r0, [r1, 0x1]\n\ - ldr r6, _08029BE8 @ =gBattlerAttacker\n\ - ldrb r0, [r6]\n\ - strb r0, [r1, 0x2]\n\ - strb r2, [r1, 0x3]\n\ - movs r0, 0xFF\n\ - strb r0, [r1, 0x4]\n\ - ldr r1, _08029BEC @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x9\n\ - str r0, [r1]\n\ - ldr r2, _08029BF0 @ =gBattleMoveDamage\n\ - mov r8, r2\n\ - ldr r5, _08029BF4 @ =gBaseStats\n\ - mov r1, r9\n\ - ldrb r0, [r1]\n\ - movs r4, 0x64\n\ - muls r0, r4\n\ - adds r0, r7, r0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - lsls r1, r0, 3\n\ - subs r1, r0\n\ - lsls r1, 2\n\ - adds r1, r5\n\ - ldrb r3, [r1, 0x1]\n\ - mov r2, r8\n\ - str r3, [r2]\n\ - ldr r2, _08029BF8 @ =gBattleMoves\n\ - ldr r0, _08029BFC @ =gCurrentMove\n\ - ldrh r1, [r0]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldrb r0, [r0, 0x1]\n\ - muls r0, r3\n\ - mov r1, r8\n\ - str r0, [r1]\n\ - mov r2, r9\n\ - ldrb r0, [r2]\n\ - muls r0, r4\n\ - adds r0, r7, r0\n\ - movs r1, 0x38\n\ - bl GetMonData\n\ - lsls r0, 1\n\ - movs r1, 0x5\n\ - bl __udivsi3\n\ - adds r0, 0x2\n\ - mov r2, r8\n\ - ldr r1, [r2]\n\ - muls r0, r1\n\ - str r0, [r2]\n\ - ldr r3, _08029C00 @ =gBattleMons\n\ - ldr r1, _08029C04 @ =gBattlerTarget\n\ - ldrb r2, [r1]\n\ - movs r1, 0x58\n\ - muls r1, r2\n\ - adds r1, r3\n\ - ldrh r2, [r1]\n\ - lsls r1, r2, 3\n\ - subs r1, r2\n\ - lsls r1, 2\n\ - adds r1, r5\n\ - ldrb r1, [r1, 0x2]\n\ - bl __divsi3\n\ - mov r1, r8\n\ - str r0, [r1]\n\ - movs r1, 0x32\n\ - bl __divsi3\n\ - adds r2, r0, 0x2\n\ - mov r0, r8\n\ - str r2, [r0]\n\ - ldr r1, _08029C08 @ =gProtectStructs\n\ - ldrb r0, [r6]\n\ - lsls r0, 4\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - lsls r0, 28\n\ - cmp r0, 0\n\ - bge _08029BD4\n\ - lsls r0, r2, 4\n\ - subs r0, r2\n\ - movs r1, 0xA\n\ - bl __divsi3\n\ - mov r1, r8\n\ - str r0, [r1]\n\ -_08029BD4:\n\ - mov r2, r9\n\ - ldrb r0, [r2]\n\ - adds r0, 0x1\n\ - strb r0, [r2]\n\ - b _08029C46\n\ - .align 2, 0\n\ -_08029BE0: .4byte gBattleCommunication\n\ -_08029BE4: .4byte gBattleTextBuff1\n\ -_08029BE8: .4byte gBattlerAttacker\n\ -_08029BEC: .4byte gBattlescriptCurrInstr\n\ -_08029BF0: .4byte gBattleMoveDamage\n\ -_08029BF4: .4byte gBaseStats\n\ -_08029BF8: .4byte gBattleMoves\n\ -_08029BFC: .4byte gCurrentMove\n\ -_08029C00: .4byte gBattleMons\n\ -_08029C04: .4byte gBattlerTarget\n\ -_08029C08: .4byte gProtectStructs\n\ -_08029C0C:\n\ - mov r0, r8\n\ - cmp r0, 0\n\ - beq _08029C2C\n\ - ldr r3, _08029C28 @ =gBattlescriptCurrInstr\n\ - ldr r2, [r3]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - b _08029C40\n\ - .align 2, 0\n\ -_08029C28: .4byte gBattlescriptCurrInstr\n\ -_08029C2C:\n\ - ldr r3, _08029C54 @ =gBattlescriptCurrInstr\n\ - ldr r2, [r3]\n\ - ldrb r1, [r2, 0x5]\n\ - ldrb r0, [r2, 0x6]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x7]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x8]\n\ -_08029C40:\n\ - lsls r0, 24\n\ - orrs r1, r0\n\ - str r1, [r3]\n\ -_08029C46:\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08029C54: .4byte gBattlescriptCurrInstr\n\ - .syntax divided"); -} -#endif // NONMATCHING static void atkC5_setsemiinvulnerablebit(void) { @@ -13565,248 +13021,50 @@ static void atkDD_weightdamagecalculation(void) gBattlescriptCurrInstr++; } -#ifdef NONMATCHING static void atkDE_assistattackselect(void) { - u32 chooseable_moves_no = 0; - struct Pokemon* party; - int i, j; - u16* chooseable_moves; - if (GetBattlerPosition(gBattlerAttacker) & 1) + s32 chooseableMovesNo = 0; + struct Pokemon *party; + s32 monId, moveId; + u16 *movesArray = (u16 *)&gBattleStruct->assistMove; + + if (GET_BATTLER_SIDE(gBattlerAttacker) != B_SIDE_PLAYER) party = gEnemyParty; else party = gPlayerParty; - - for (i = 0; i < 6; i++) + for (monId = 0; monId < PARTY_SIZE; ++monId) { - if (i == gBattlerPartyIndexes[gBattlerAttacker]) - break; - if (!GetMonData(&party[i], MON_DATA_SPECIES2) || GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG) - break; - chooseable_moves = &gBattleStruct->assistMove[chooseable_moves_no]; - for (j = 0; j < 4; j++) + if (monId == gBattlerPartyIndexes[gBattlerAttacker] + || GetMonData(&party[monId], MON_DATA_SPECIES2) == SPECIES_NONE + || GetMonData(&party[monId], MON_DATA_SPECIES2) == SPECIES_EGG) + continue; + for (moveId = 0; moveId < MAX_MON_MOVES; ++moveId) { - int k; - u16 move = GetMonData(&party[i], MON_DATA_MOVE1 + i); + s32 i = 0; + u16 move = GetMonData(&party[monId], MON_DATA_MOVE1 + moveId); + if (IsMoveUnchoosable(move)) - break; - //sMovesForbiddenToCopy[k] - for (k = 0; ;k++) - { - if (sMovesForbiddenToCopy[k] == 0xFFFF) - { - if (move) - { - *chooseable_moves = move; - chooseable_moves++; - chooseable_moves_no++; - } - break; - } - if (sMovesForbiddenToCopy[k] == move) - break; - } + continue; + for (; sMovesForbiddenToCopy[i] != ASSIST_FORBIDDEN_END && move != sMovesForbiddenToCopy[i]; ++i); + if (sMovesForbiddenToCopy[i] != ASSIST_FORBIDDEN_END || move == MOVE_NONE) + continue; + movesArray[chooseableMovesNo] = move; + ++chooseableMovesNo; } } - if (chooseable_moves_no) + if (chooseableMovesNo) { gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - gRandomMove = gBattleStruct->assistMove[Random() % chooseable_moves_no]; + gRandomMove = movesArray[((Random() & 0xFF) * chooseableMovesNo) >> 8]; gBattlerTarget = GetMoveTarget(gRandomMove, 0); gBattlescriptCurrInstr += 5; } else + { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + } } -#else -NAKED -static void atkDE_assistattackselect(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, 0x8\n\ - movs r0, 0\n\ - mov r10, r0\n\ - ldr r0, _0802AB9C @ =gBattlerAttacker\n\ - ldrb r0, [r0]\n\ - bl GetBattlerPosition\n\ - movs r1, 0x1\n\ - ands r1, r0\n\ - ldr r0, _0802ABA0 @ =gPlayerParty\n\ - str r0, [sp]\n\ - cmp r1, 0\n\ - beq _0802AAAC\n\ - ldr r1, _0802ABA4 @ =gEnemyParty\n\ - str r1, [sp]\n\ -_0802AAAC:\n\ - movs r2, 0\n\ -_0802AAAE:\n\ - ldr r1, _0802ABA8 @ =gBattlerPartyIndexes\n\ - ldr r0, _0802AB9C @ =gBattlerAttacker\n\ - ldrb r0, [r0]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - adds r1, r2, 0x1\n\ - str r1, [sp, 0x4]\n\ - ldrh r0, [r0]\n\ - cmp r2, r0\n\ - beq _0802AB54\n\ - movs r0, 0x64\n\ - adds r6, r2, 0\n\ - muls r6, r0\n\ - ldr r0, [sp]\n\ - adds r4, r0, r6\n\ - adds r0, r4, 0\n\ - movs r1, 0x41\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _0802AB54\n\ - adds r0, r4, 0\n\ - movs r1, 0x41\n\ - bl GetMonData\n\ - movs r1, 0xCE\n\ - lsls r1, 1\n\ - cmp r0, r1\n\ - beq _0802AB54\n\ - movs r5, 0\n\ - ldr r1, _0802ABAC @ =0x0000ffff\n\ - mov r8, r1\n\ - mov r9, r6\n\ - mov r1, r10\n\ - lsls r0, r1, 1\n\ - ldr r1, _0802ABB0 @ =gSharedMem + 0x16024\n\ - adds r6, r0, r1\n\ -_0802AAF8:\n\ - movs r7, 0\n\ - adds r1, r5, 0\n\ - adds r1, 0xD\n\ - ldr r0, [sp]\n\ - add r0, r9\n\ - bl GetMonData\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - adds r0, r4, 0\n\ - bl IsMoveUnchoosable\n\ - lsls r0, 24\n\ - adds r1, r5, 0x1\n\ - cmp r0, 0\n\ - bne _0802AB4E\n\ - ldr r0, _0802ABB4 @ =sMovesForbiddenToCopy\n\ - ldrh r2, [r0]\n\ - adds r3, r0, 0\n\ - cmp r2, r8\n\ - beq _0802AB42\n\ - cmp r4, r2\n\ - beq _0802AB38\n\ - ldr r5, _0802ABAC @ =0x0000ffff\n\ - adds r2, r3, 0\n\ -_0802AB2A:\n\ - adds r2, 0x2\n\ - adds r7, 0x1\n\ - ldrh r0, [r2]\n\ - cmp r0, r5\n\ - beq _0802AB42\n\ - cmp r4, r0\n\ - bne _0802AB2A\n\ -_0802AB38:\n\ - lsls r0, r7, 1\n\ - adds r0, r3\n\ - ldrh r0, [r0]\n\ - cmp r0, r8\n\ - bne _0802AB4E\n\ -_0802AB42:\n\ - cmp r4, 0\n\ - beq _0802AB4E\n\ - strh r4, [r6]\n\ - adds r6, 0x2\n\ - movs r0, 0x1\n\ - add r10, r0\n\ -_0802AB4E:\n\ - adds r5, r1, 0\n\ - cmp r5, 0x3\n\ - ble _0802AAF8\n\ -_0802AB54:\n\ - ldr r2, [sp, 0x4]\n\ - cmp r2, 0x5\n\ - ble _0802AAAE\n\ - mov r1, r10\n\ - cmp r1, 0\n\ - beq _0802ABCC\n\ - ldr r2, _0802ABB8 @ =gHitMarker\n\ - ldr r0, [r2]\n\ - ldr r1, _0802ABBC @ =0xfffffbff\n\ - ands r0, r1\n\ - str r0, [r2]\n\ - ldr r4, _0802ABC0 @ =gRandomMove\n\ - bl Random\n\ - movs r1, 0xFF\n\ - ands r1, r0\n\ - mov r0, r10\n\ - muls r0, r1\n\ - asrs r0, 8\n\ - lsls r0, 1\n\ - ldr r1, _0802ABB0 @ =gSharedMem + 0x16024\n\ - adds r0, r1\n\ - ldrh r0, [r0]\n\ - strh r0, [r4]\n\ - ldrh r0, [r4]\n\ - movs r1, 0\n\ - bl GetMoveTarget\n\ - ldr r1, _0802ABC4 @ =gBattlerTarget\n\ - strb r0, [r1]\n\ - ldr r1, _0802ABC8 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x5\n\ - str r0, [r1]\n\ - b _0802ABE6\n\ - .align 2, 0\n\ -_0802AB9C: .4byte gBattlerAttacker\n\ -_0802ABA0: .4byte gPlayerParty\n\ -_0802ABA4: .4byte gEnemyParty\n\ -_0802ABA8: .4byte gBattlerPartyIndexes\n\ -_0802ABAC: .4byte 0x0000ffff\n\ -_0802ABB0: .4byte gSharedMem + 0x16024\n\ -_0802ABB4: .4byte sMovesForbiddenToCopy\n\ -_0802ABB8: .4byte gHitMarker\n\ -_0802ABBC: .4byte 0xfffffbff\n\ -_0802ABC0: .4byte gRandomMove\n\ -_0802ABC4: .4byte gBattlerTarget\n\ -_0802ABC8: .4byte gBattlescriptCurrInstr\n\ -_0802ABCC:\n\ - ldr r3, _0802ABF8 @ =gBattlescriptCurrInstr\n\ - ldr r2, [r3]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - lsls r0, 24\n\ - orrs r1, r0\n\ - str r1, [r3]\n\ -_0802ABE6:\n\ - add sp, 0x8\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0802ABF8: .4byte gBattlescriptCurrInstr\n\ - .syntax divided"); -} - -#endif // NONMATCHING - static void atkDF_trysetmagiccoat(void) { gBattlerTarget = gBattlerAttacker; @@ -13918,7 +13176,7 @@ static void atkE4_getsecretpowereffect(void) static void atkE5_pickup(void) { int i; - for (i = 0; i < 6; i++) + for (i = 0; i < PARTY_SIZE; i++) { u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); u16 held_item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); diff --git a/src/berry_blender.c b/src/berry_blender.c index 52669a316..c86b707b3 100644 --- a/src/berry_blender.c +++ b/src/berry_blender.c @@ -3277,7 +3277,7 @@ void debug_sub_80524BC(void) } // Partially fixes the clipping on longer names. -#if DEBUG_TRANSLATE && DEBUG +#if DEBUG_FIX # define BLENDER_DEBUG_BERRY_LEN 12 #else # define BLENDER_DEBUG_BERRY_LEN 6 diff --git a/src/contest_painting.c b/src/contest_painting.c index e3cc6cdae..af5eddf76 100644 --- a/src/contest_painting.c +++ b/src/contest_painting.c @@ -101,40 +101,18 @@ static void ContestPaintingPrintCaption(u8 arg0, u8 arg1); static void ContestPaintingInitBG(void); static void ContestPaintingInitVars(u8 arg0); static void VBlankCB_ContestPainting(void); -void sub_8106B90(); //should be static +static void sub_8106B90(u8 *a, u16 *b, u16 *c); static void sub_8107090(u8 arg0, u8 arg1); -NAKED -void sub_8106630(u32 arg0) +void sub_8106630(u32 contestWinnerId) { - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - ldr r2, _0810665C @ =gSharedMem + 0x15DE0\n\ - subs r4, r2, 0x2\n\ - subs r5, r2, 0x1\n\ - ldr r3, _08106660 @ =gSaveBlock1\n\ - subs r0, 0x1\n\ - lsls r1, r0, 5\n\ - adds r1, r3\n\ - ldr r3, _08106664 @ =0x00002dfc\n\ - adds r1, r3\n\ - ldm r1!, {r3,r6,r7}\n\ - stm r2!, {r3,r6,r7}\n\ - ldm r1!, {r3,r6,r7}\n\ - stm r2!, {r3,r6,r7}\n\ - ldm r1!, {r6,r7}\n\ - stm r2!, {r6,r7}\n\ - strb r0, [r4]\n\ - movs r0, 0\n\ - strb r0, [r5]\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0810665C: .4byte gSharedMem + 0x15DE0\n\ -_08106660: .4byte gSaveBlock1\n\ -_08106664: .4byte 0x00002dfc\n\ - .syntax divided\n"); + // probably fakematching + struct ContestWinner *ptr1 = (struct ContestWinner*)&ewram15DE0; // TODO: resolve messy struct duplicates + u8 *ptr2 = (u8*)&ewram15DDE; + u8 *ptr3 = (u8*)&ewram15DDF; + *ptr1 = gSaveBlock1.contestWinners[contestWinnerId - 1]; + *ptr2 = contestWinnerId - 1; + *ptr3 = 0; } void CB2_ContestPainting(void) @@ -346,7 +324,7 @@ static void sub_8106AC4(u16 species, u8 arg1) species, (u32)gUnknown_03005E8C->personality ); - sub_8106B90(gUnknown_081FAF4C[1], gUnknown_03005E90, gUnknown_03005E10); + sub_8106B90((u8*)gUnknown_081FAF4C[1], (u16*)gUnknown_03005E90, (u16*)gUnknown_03005E10); } else { @@ -359,18 +337,26 @@ static void sub_8106AC4(u16 species, u8 arg1) species, (u32)gUnknown_03005E8C->personality ); - sub_8106B90(gUnknown_081FAF4C[0], gUnknown_03005E90, gUnknown_03005E10); + sub_8106B90((u8*)gUnknown_081FAF4C[0], (u16*)gUnknown_03005E90, (u16*)gUnknown_03005E10); } } -#ifdef NONMATCHING -void sub_8106B90(u8 a[][8][8][4], u16 b[], u16 c[][8][8][8]) + +static void sub_8106B90(u8 *a, u16 *b, u16 *c) { u16 i; u16 j; u16 k; u16 l; + /* + Raw arithmetics are required to match this function. + At least it's the first known way to match it. The extreme + sensitivity of this match and Game Freak proving to not have + been a fan of C's advanced array features, preferring to + calculate dimensions manually (as seen in other functions), + tell that it may have been this way in the original code. + */ for (i = 0; i < 8; i++) { for (j = 0; j < 8; j++) @@ -379,128 +365,38 @@ void sub_8106B90(u8 a[][8][8][4], u16 b[], u16 c[][8][8][8]) { for (l = 0; l < 8; l++) { - //u8 *arr = a[i][j][k]; - //u8 r1 = arr[l / 2]; - u8 r1 = a[i][j][k][l / 2]; + /* + Parenthesis/group hack absolutely required to match regalloc. Remove any + unneeded parentheses and the function gets thrown off. See the comments + in CopyWallpaperTilemap for documentation on a similar behavior. + */ + u8 temp = ((u8*)a + ((((i << 3) + j) << 5) + (k << 2) + (l >> 1)))[0]; + /* + The shifts have to be there to match r0 and r2's order in one instruction: + add r5, r2, r0 + This also makes agbcc's expression order parsing even more super sensitive + and obscene when it comes to parentheses affecting regalloc regardless if + unnecessary, requiring j must be placed in the front to match, or else + regalloc breaks again and does this a few instructions above: + add r0, r3, r7 <- regswap + */ if (l & 1) - r1 /= 16; + temp /= 16; else - r1 %= 16; - //_08106BEA - if (r1 == 0) - c[i][k][j][l] = 0x8000; + temp %= 16; + + // Same order as above needs to be written here, or else this happens: + // add r0, r7, r1 <- regswap + if (temp == 0) + ((u16*)c + (((i << 3) + k) << 6) + ((j << 3)+l))[0] = 0x8000; else - c[i][k][j][l] = b[r1]; + ((u16*)c + (((i << 3) + k) << 6) + ((j << 3)+l))[0] = b[temp]; } } } } } -#else -NAKED -void sub_8106B90() -{ - 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, 0xC\n\ - mov r10, r0\n\ - mov r9, r1\n\ - str r2, [sp]\n\ - movs r0, 0\n\ -_08106BA4:\n\ - movs r3, 0\n\ - adds r1, r0, 0x1\n\ - str r1, [sp, 0x4]\n\ - lsls r0, 3\n\ - str r0, [sp, 0x8]\n\ -_08106BAE:\n\ - movs r1, 0\n\ - adds r2, r3, 0x1\n\ - mov r8, r2\n\ - ldr r7, [sp, 0x8]\n\ - adds r0, r7, r3\n\ - lsls r0, 5\n\ - mov r12, r0\n\ - lsls r4, r3, 3\n\ -_08106BBE:\n\ - movs r3, 0\n\ - lsls r0, r1, 2\n\ - adds r6, r1, 0x1\n\ - mov r2, r12\n\ - adds r5, r2, r0\n\ - ldr r7, [sp, 0x8]\n\ - adds r0, r7, r1\n\ - lsls r0, 7\n\ - ldr r1, [sp]\n\ - adds r2, r0, r1\n\ -_08106BD2:\n\ - lsrs r0, r3, 1\n\ - adds r0, r5, r0\n\ - add r0, r10\n\ - ldrb r1, [r0]\n\ - movs r0, 0x1\n\ - ands r0, r3\n\ - cmp r0, 0\n\ - beq _08106BE6\n\ - lsrs r1, 4\n\ - b _08106BEA\n\ -_08106BE6:\n\ - movs r0, 0xF\n\ - ands r1, r0\n\ -_08106BEA:\n\ - cmp r1, 0\n\ - bne _08106BFC\n\ - adds r0, r4, r3\n\ - lsls r0, 1\n\ - adds r0, r2\n\ - movs r7, 0x80\n\ - lsls r7, 8\n\ - adds r1, r7, 0\n\ - b _08106C08\n\ -_08106BFC:\n\ - adds r0, r4, r3\n\ - lsls r0, 1\n\ - adds r0, r2\n\ - lsls r1, 1\n\ - add r1, r9\n\ - ldrh r1, [r1]\n\ -_08106C08:\n\ - strh r1, [r0]\n\ - adds r0, r3, 0x1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - cmp r3, 0x7\n\ - bls _08106BD2\n\ - lsls r0, r6, 16\n\ - lsrs r1, r0, 16\n\ - cmp r1, 0x7\n\ - bls _08106BBE\n\ - mov r1, r8\n\ - lsls r0, r1, 16\n\ - lsrs r3, r0, 16\n\ - cmp r3, 0x7\n\ - bls _08106BAE\n\ - ldr r2, [sp, 0x4]\n\ - lsls r0, r2, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0x7\n\ - bls _08106BA4\n\ - add sp, 0xC\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\ - .syntax divided\n"); -} -#endif static void sub_8106C40(u8 arg0, u8 arg1) { diff --git a/src/data/graphics.c b/src/data/graphics.c index 9cb0a83d6..0e98195cd 100644 --- a/src/data/graphics.c +++ b/src/data/graphics.c @@ -10,10 +10,10 @@ const u8 gMonBackPic_CircledQuestionMark[] = INCBIN_U8("graphics/pokemon/circled const u16 gMonPalette_CircledQuestionMark[] = INCBIN_U16("graphics/pokemon/circled_question_mark/normal.gbapal.lz"); const u16 gMonShinyPalette_CircledQuestionMark[] = INCBIN_U16("graphics/pokemon/circled_question_mark/shiny.gbapal.lz"); -// The test menu debug battle tileset. This uses the old Crystal charmap and -// rendering method (it uses tiles instead of text). -// Oddly, the English version is in Japanese and the German version is in English. -#if DEBUG_TRANSLATE || GERMAN +// The test menu debug battle tileset. This uses the old Crystal +// charmap and rendering method (it uses tiles instead of text). +// The non-English releases use translated graphics. +#if DEBUG_FIX || !ENGLISH const u8 gDebugBattleCharmap_Gfx_lz[] = INCBIN_U8("graphics/debug/debug_battle_charmap_en.4bpp.lz"); const u8 gDebugBattleCharmap_Tilemap_lz[] = INCBIN_U8("graphics/debug/debug_battle_charmap_en.bin.lz"); const u8 gDebugBattleCharmap_Pal_lz[] = INCBIN_U8("graphics/debug/debug_battle_charmap_en.gbapal.lz"); diff --git a/src/debug/mori_debug_menu.c b/src/debug/mori_debug_menu.c index dfa2487a5..d5cae8352 100644 --- a/src/debug/mori_debug_menu.c +++ b/src/debug/mori_debug_menu.c @@ -42,10 +42,10 @@ const u8 Text_39B28B[] = _("10000 steps"); const u8 Text_39B297[] = _("MOVE TUTOR"); const u8 Text_39B2A2[] = _("Breed an egg"); const u8 Text_39B2AF[] = _("Long name"); -#ifdef GERMAN -const u8 Text_39B2B9[] = _("Delete {POKEBLOCK}"); +#if (ENGLISH && !DEBUG_FIX) +const u8 Text_39B2B9[] = _("ポロックけす"); #else -const u8 Text_39B2B9[] = DTR("ポロックけす", "Delete {POKEBLOCK}"); +const u8 Text_39B2B9[] = _("Delete {POKEBLOCK}"); #endif const struct MenuAction gMoriDebugMenuActions[] = diff --git a/src/debug/nakamura_debug_menu.c b/src/debug/nakamura_debug_menu.c index 32ac57dc2..e8f40f08e 100644 --- a/src/debug/nakamura_debug_menu.c +++ b/src/debug/nakamura_debug_menu.c @@ -100,7 +100,9 @@ static bool8 TopMenu_HandleJoypad(void) if (gMain.newKeys & A_BUTTON) { MenuFunc func = sNakamuraTopMenuActions[Menu_GetCursorPos()].func; +#if !(ENGLISH && REVISION == 0) Menu_DestroyCursor(); +#endif return func(); } @@ -739,6 +741,17 @@ static bool8 GiveAllDecorations(void) // FISHING POINTS (Feebas) // ======================================================= +#if (ENGLISH && REVISION == 0) +static const u8 Str_843E58D[] = _( + "つりばしょ R119\n" + " Y1\n" + " Y2\n" + " Y3\n" + "エンカウントばしょ\n" + "\n" + "\n" + "じぶんのまえ"); +#else static const u8 Str_843E58D[] = _( "Fishing location R119\n" " Y1\n" @@ -748,6 +761,7 @@ static const u8 Str_843E58D[] = _( "\n" "\n" "front of you"); +#endif static u16 FishingPoints_CountFishingTilesInMapThird(u8 a0) { @@ -974,7 +988,13 @@ static void NakaGenderTest_AdjustLevel(u8 i, s8 dirn) if (sNakaGenderTestData[i].level < 1) sNakaGenderTestData[i].level = 100; SetMonData(gPlayerParty + i, MON_DATA_EXP, gExperienceTables[gBaseStats[sNakaGenderTestData[i].species].growthRate] + sNakaGenderTestData[i].level); +// TODO: check other revisions +#if (ENGLISH && REVISION == 0) + CalculateMonStats(gPlayerParty + i); +#else + // Same function, but without the Shedninja specific code. Nakamura_NakaGenderTest_RecalcStats(gPlayerParty + i); +#endif } } @@ -1266,6 +1286,7 @@ static u8 SetPokeblock_CalcColor(u8 * dest, struct Pokeblock * pokeblock) } } if (pkblk[firstNonzeroFlavor] >= pkblk[lastNonzeroFlavor]) + // Suspiciously looks like a temp could've been here. lastNonzeroFlavor = firstNonzeroFlavor; if (lastNonzeroFlavor == 0) diff --git a/src/debug/nohara_debug_menu.c b/src/debug/nohara_debug_menu.c index 53501a52b..80527ad42 100644 --- a/src/debug/nohara_debug_menu.c +++ b/src/debug/nohara_debug_menu.c @@ -104,8 +104,13 @@ bool8 debug_sub_808F414(void) } } +#if (ENGLISH && REVISION == 0) +const u8 gUnknown_Debug_083C4980[] = _("ひみつがたを すぐみれるように ひだりキーで\n" + "データタイプを へんこうしますか? きりかえ"); +#else const u8 gUnknown_Debug_083C4980[] = _("Want to change data type{CLEAR_TO 143}Press Left\n" "to see secret type now?{CLEAR_TO 143}to switch"); +#endif const u8 gUnknown_Debug_083C49CA[] = _("Choose the TV data you wish to\n" "create to check a transmission。"); @@ -470,6 +475,11 @@ void debug_sub_808FA88(u8 a0, u8 a1) u8 leadMonIndex = GetLeadMonIndex(); u8 channel; +// This is garbage. +#define GF_ACCESS(x) ((struct x*)(&(gSaveBlock1.tvShows[a0]))) +#define TERU_ACCESS(x) show->x +#define DECLARE_TERU_POINTER TVShow * show = gSaveBlock1.tvShows + a0 + gSaveBlock1.tvShows[a0].common.kind = a1; gSaveBlock1.tvShows[a0].common.active = TRUE; for (i = 0; i < 0x22; i++) @@ -480,34 +490,135 @@ void debug_sub_808FA88(u8 a0, u8 a1) { case 2: case 4: - sub_80BE160(gSaveBlock1.tvShows + a0); + sub_80BE160(&gSaveBlock1.tvShows[a0]); break; case 3: - sub_80BE138(gSaveBlock1.tvShows + a0); + sub_80BE138(&gSaveBlock1.tvShows[a0]); break; } +#if (ENGLISH && REVISION == 0) switch (a1) { case TVSHOW_FAN_CLUB_LETTER: case TVSHOW_RECENT_HAPPENINGS: { - TVShow * show = gSaveBlock1.tvShows + a0; + GF_ACCESS(TVShowFanClubLetter)->species = SPECIES_BULBASAUR; + StringCopy(GF_ACCESS(TVShowFanClubLetter)->playerName, gSaveBlock2.playerName); + GF_ACCESS(TVShowFanClubLetter)->language = GAME_LANGUAGE; + break; + } + case TVSHOW_PKMN_FAN_CLUB_OPINIONS: + { + GF_ACCESS(TVShowFanclubOpinions)->var02 = 1; + StringCopy(GF_ACCESS(TVShowFanclubOpinions)->playerName, gSaveBlock2.playerName); + GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_NICKNAME, GF_ACCESS(TVShowFanclubOpinions)->var10); + GF_ACCESS(TVShowFanclubOpinions)->language = GAME_LANGUAGE; + GF_ACCESS(TVShowFanclubOpinions)->var0E = GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_LANGUAGE); + break; + } + case TVSHOW_UNKN_SHOWTYPE_04: + { + break; + } + case TVSHOW_NAME_RATER_SHOW: + { + GF_ACCESS(TVShowNameRaterShow)->species = GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_SPECIES); + GF_ACCESS(TVShowNameRaterShow)->var1C = 1; + StringCopy(GF_ACCESS(TVShowNameRaterShow)->trainerName, gSaveBlock2.playerName); + GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_NICKNAME, GF_ACCESS(TVShowNameRaterShow)->pokemonName); + GF_ACCESS(TVShowNameRaterShow)->language = GAME_LANGUAGE; + GF_ACCESS(TVShowNameRaterShow)->pokemonNameLanguage = GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_LANGUAGE); + break; + } + case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: + { + GF_ACCESS(TVShowBravoTrainerPokemonProfiles)->species = SPECIES_BULBASAUR; + StringCopy(GF_ACCESS(TVShowBravoTrainerPokemonProfiles)->playerName, gSaveBlock2.playerName); + GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_NICKNAME, GF_ACCESS(TVShowBravoTrainerPokemonProfiles)->pokemonNickname); + GF_ACCESS(TVShowBravoTrainerPokemonProfiles)->language = GAME_LANGUAGE; + GF_ACCESS(TVShowBravoTrainerPokemonProfiles)->var1f = GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_LANGUAGE); + break; + } + case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: + { + GF_ACCESS(TVShowBravoTrainerBattleTowerSpotlight)->species = SPECIES_BULBASAUR; + GF_ACCESS(TVShowBravoTrainerBattleTowerSpotlight)->defeatedSpecies = SPECIES_BULBASAUR; + StringCopy(GF_ACCESS(TVShowBravoTrainerBattleTowerSpotlight)->trainerName, gSaveBlock2.playerName); + StringCopy(GF_ACCESS(TVShowBravoTrainerBattleTowerSpotlight)->enemyTrainerName, gSaveBlock2.playerName); + GF_ACCESS(TVShowBravoTrainerBattleTowerSpotlight)->language = GAME_LANGUAGE; + break; + } + case TVSHOW_MASS_OUTBREAK: + { + GF_ACCESS(TVShowMassOutbreak)->species = SPECIES_BULBASAUR; + GF_ACCESS(TVShowMassOutbreak)->daysLeft = 1; + break; + } + case TVSHOW_POKEMON_TODAY_CAUGHT: + { + GF_ACCESS(TVShowPokemonToday)->species = SPECIES_BULBASAUR; + StringCopy(GF_ACCESS(TVShowPokemonToday)->playerName, gSaveBlock2.playerName); + GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_NICKNAME, GF_ACCESS(TVShowPokemonToday)->nickname); + GF_ACCESS(TVShowPokemonToday)->language = GAME_LANGUAGE; + GF_ACCESS(TVShowPokemonToday)->language2 = GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_LANGUAGE); + break; + } + case TVSHOW_SMART_SHOPPER: + { + StringCopy(GF_ACCESS(TVShowSmartShopper)->playerName, gSaveBlock2.playerName); + GF_ACCESS(TVShowSmartShopper)->language = GAME_LANGUAGE; + break; + } + case TVSHOW_POKEMON_TODAY_FAILED: + { + GF_ACCESS(TVShowPokemonTodayFailed)->species = SPECIES_BULBASAUR; + GF_ACCESS(TVShowPokemonTodayFailed)->species2 = SPECIES_BULBASAUR; + StringCopy(GF_ACCESS(TVShowPokemonTodayFailed)->playerName, gSaveBlock2.playerName); + GF_ACCESS(TVShowPokemonTodayFailed)->language = GAME_LANGUAGE; + break; + } + case TVSHOW_FISHING_ADVICE: + { + GF_ACCESS(TVShowPokemonAngler)->var04 = SPECIES_BULBASAUR; + StringCopy(GF_ACCESS(TVShowPokemonAngler)->playerName, gSaveBlock2.playerName); + GF_ACCESS(TVShowPokemonAngler)->language = GAME_LANGUAGE; + break; + } + case TVSHOW_WORLD_OF_MASTERS: + { + GF_ACCESS(TVShowWorldOfMasters)->var04 = SPECIES_BULBASAUR; + GF_ACCESS(TVShowWorldOfMasters)->var08 = SPECIES_BULBASAUR; + StringCopy(GF_ACCESS(TVShowWorldOfMasters)->playerName, gSaveBlock2.playerName); + GF_ACCESS(TVShowWorldOfMasters)->language = GAME_LANGUAGE; + break; + } + } +#else +// Murakawa must have really hated working with GF code. He devised his own, less complicated +// access method after US rev0. Also, this iteration of the code has his self inserts: TERUKUN, +// TERU, and TERUDA. Who all love Wigglytuff. + switch (a1) + { + case TVSHOW_FAN_CLUB_LETTER: + case TVSHOW_RECENT_HAPPENINGS: + { + DECLARE_TERU_POINTER; - show->fanclubLetter.species = SPECIES_BULBASAUR; - StringCopy(gSaveBlock1.tvShows[a0].fanclubLetter.playerName, gSaveBlock2.playerName); - show->fanclubLetter.language = GAME_LANGUAGE; + GF_ACCESS(TVShowFanClubLetter)->species = SPECIES_BULBASAUR; // Yet he didn't change Game Freak's lines. + StringCopy(GF_ACCESS(TVShowFanClubLetter)->playerName, gSaveBlock2.playerName); + TERU_ACCESS(fanclubLetter).language = GAME_LANGUAGE; break; } case TVSHOW_PKMN_FAN_CLUB_OPINIONS: { - TVShow * show = gSaveBlock1.tvShows + a0; + DECLARE_TERU_POINTER; - show->fanclubOpinions.var02 = 1; - StringCopy(gSaveBlock1.tvShows[a0].fanclubOpinions.playerName, gSaveBlock2.playerName); - GetMonData(gPlayerParty + leadMonIndex, MON_DATA_NICKNAME, gSaveBlock1.tvShows[a0].fanclubOpinions.var10); - show->fanclubOpinions.language = GAME_LANGUAGE; - show->fanclubOpinions.var0E = GetMonData(gPlayerParty + leadMonIndex, MON_DATA_LANGUAGE); + GF_ACCESS(TVShowFanclubOpinions)->var02 = 1; + StringCopy(GF_ACCESS(TVShowFanclubOpinions)->playerName, gSaveBlock2.playerName); + GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_NICKNAME, GF_ACCESS(TVShowFanclubOpinions)->var10); + TERU_ACCESS(fanclubOpinions).language = GAME_LANGUAGE; + TERU_ACCESS(fanclubOpinions).var0E = GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_LANGUAGE); break; } case TVSHOW_UNKN_SHOWTYPE_04: @@ -516,120 +627,118 @@ void debug_sub_808FA88(u8 a0, u8 a1) } case TVSHOW_NAME_RATER_SHOW: { - u16 species = GetMonData(gPlayerParty + leadMonIndex, MON_DATA_SPECIES); - TVShow * show = gSaveBlock1.tvShows + a0; + u16 species = GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_SPECIES); + DECLARE_TERU_POINTER; - show->nameRaterShow.species = species; - show->nameRaterShow.var1C = 1; - StringCopy(gSaveBlock1.tvShows[a0].nameRaterShow.trainerName, gSaveBlock2.playerName); - GetMonData(gPlayerParty + leadMonIndex, MON_DATA_NICKNAME, gSaveBlock1.tvShows[a0].nameRaterShow.pokemonName); - show->nameRaterShow.language = GAME_LANGUAGE; - show->nameRaterShow.pokemonNameLanguage = GetMonData(gPlayerParty + leadMonIndex, MON_DATA_LANGUAGE); + GF_ACCESS(TVShowNameRaterShow)->species = species; + GF_ACCESS(TVShowNameRaterShow)->var1C = 1; + StringCopy(GF_ACCESS(TVShowNameRaterShow)->trainerName, gSaveBlock2.playerName); + GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_NICKNAME, GF_ACCESS(TVShowNameRaterShow)->pokemonName); + TERU_ACCESS(nameRaterShow).language = GAME_LANGUAGE; + TERU_ACCESS(nameRaterShow).pokemonNameLanguage = GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_LANGUAGE); break; } case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: { - TVShow * show = gSaveBlock1.tvShows + a0; + DECLARE_TERU_POINTER; - show->bravoTrainer.species = SPECIES_BULBASAUR; - StringCopy(gSaveBlock1.tvShows[a0].bravoTrainer.playerName, gSaveBlock2.playerName); - GetMonData(gPlayerParty + leadMonIndex, MON_DATA_NICKNAME, gSaveBlock1.tvShows[a0].bravoTrainer.pokemonNickname); - show->bravoTrainer.language = GAME_LANGUAGE; - show->bravoTrainer.var1f = GetMonData(gPlayerParty + leadMonIndex, MON_DATA_LANGUAGE); + GF_ACCESS(TVShowBravoTrainerPokemonProfiles)->species = SPECIES_BULBASAUR; + StringCopy(GF_ACCESS(TVShowBravoTrainerPokemonProfiles)->playerName, gSaveBlock2.playerName); + GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_NICKNAME, GF_ACCESS(TVShowBravoTrainerPokemonProfiles)->pokemonNickname); + TERU_ACCESS(bravoTrainer).language = GAME_LANGUAGE; + TERU_ACCESS(bravoTrainer).var1f = GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_LANGUAGE); break; } case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: { - TVShow * show = gSaveBlock1.tvShows + a0; + DECLARE_TERU_POINTER; - show->bravoTrainerTower.species = SPECIES_BULBASAUR; - show->bravoTrainerTower.defeatedSpecies = SPECIES_BULBASAUR; - StringCopy(gSaveBlock1.tvShows[a0].bravoTrainerTower.trainerName, gSaveBlock2.playerName); - StringCopy(gSaveBlock1.tvShows[a0].bravoTrainerTower.enemyTrainerName, gSaveBlock2.playerName); - show->bravoTrainerTower.language = GAME_LANGUAGE; + GF_ACCESS(TVShowBravoTrainerBattleTowerSpotlight)->species = SPECIES_BULBASAUR; + GF_ACCESS(TVShowBravoTrainerBattleTowerSpotlight)->defeatedSpecies = SPECIES_BULBASAUR; + StringCopy(GF_ACCESS(TVShowBravoTrainerBattleTowerSpotlight)->trainerName, gSaveBlock2.playerName); + StringCopy(GF_ACCESS(TVShowBravoTrainerBattleTowerSpotlight)->enemyTrainerName, gSaveBlock2.playerName); + TERU_ACCESS(bravoTrainerTower).language = GAME_LANGUAGE; break; } case TVSHOW_MASS_OUTBREAK: { - TVShow * show = gSaveBlock1.tvShows + a0; - - show->massOutbreak.species = SPECIES_BULBASAUR; - show->massOutbreak.daysLeft = 1; + GF_ACCESS(TVShowMassOutbreak)->species = SPECIES_BULBASAUR; + GF_ACCESS(TVShowMassOutbreak)->daysLeft = 1; break; } case TVSHOW_POKEMON_TODAY_CAUGHT: { - TVShow * show = gSaveBlock1.tvShows + a0; + DECLARE_TERU_POINTER; u8 gUnknown_Debug_083C4C64[] = _("TERUKUN"); u8 gUnknown_Debug_083C4C6C[] = _("TERUTERUDA"); - show->pokemonToday.var12 = 255; - StringCopy(show->pokemonToday.playerName, gUnknown_Debug_083C4C64); - StringCopy(show->pokemonToday.nickname, gUnknown_Debug_083C4C6C); - show->pokemonToday.ball = ITEM_PREMIER_BALL; - show->pokemonToday.species = SPECIES_WIGGLYTUFF; - show->pokemonToday.language = GAME_LANGUAGE; - show->pokemonToday.language2 = GAME_LANGUAGE; + TERU_ACCESS(pokemonToday).var12 = 255; + StringCopy(TERU_ACCESS(pokemonToday).playerName, gUnknown_Debug_083C4C64); + StringCopy(TERU_ACCESS(pokemonToday).nickname, gUnknown_Debug_083C4C6C); + TERU_ACCESS(pokemonToday).ball = ITEM_PREMIER_BALL; + TERU_ACCESS(pokemonToday).species = SPECIES_WIGGLYTUFF; + TERU_ACCESS(pokemonToday).language = GAME_LANGUAGE; + TERU_ACCESS(pokemonToday).language2 = GAME_LANGUAGE; break; } case TVSHOW_SMART_SHOPPER: { - TVShow * show = gSaveBlock1.tvShows + a0; + DECLARE_TERU_POINTER; u8 gUnknown_Debug_083C4C64[] = _("TERUKUN"); int ii; for (ii = 0; ii < 3; ii++) - show->smartshopperShow.itemAmounts[ii] = 254; - show->smartshopperShow.priceReduced = TRUE; - show->smartshopperShow.shopLocation = 40; + TERU_ACCESS(smartshopperShow).itemAmounts[ii] = 254; + TERU_ACCESS(smartshopperShow).priceReduced = TRUE; + TERU_ACCESS(smartshopperShow).shopLocation = 40; for (ii = 0; ii < 3; ii++) - show->smartshopperShow.itemIds[ii] = ITEM_ENERGY_POWDER; - StringCopy(show->smartshopperShow.playerName, gUnknown_Debug_083C4C64); - show->smartshopperShow.language = GAME_LANGUAGE; + TERU_ACCESS(smartshopperShow).itemIds[ii] = ITEM_ENERGY_POWDER; + StringCopy(TERU_ACCESS(smartshopperShow).playerName, gUnknown_Debug_083C4C64); + TERU_ACCESS(smartshopperShow).language = GAME_LANGUAGE; break; } case TVSHOW_POKEMON_TODAY_FAILED: { - TVShow * show = gSaveBlock1.tvShows + a0; + DECLARE_TERU_POINTER; u8 gUnknown_Debug_083C4C64[] = _("TERUKUN"); - show->pokemonTodayFailed.species = SPECIES_WIGGLYTUFF; - show->pokemonTodayFailed.species2 = SPECIES_WIGGLYTUFF; - show->pokemonTodayFailed.var12 = 3; - show->pokemonTodayFailed.var10 = 0xff; - show->pokemonTodayFailed.var11 = 1; - StringCopy(show->pokemonTodayFailed.playerName, gUnknown_Debug_083C4C64); - show->pokemonTodayFailed.language = GAME_LANGUAGE; + TERU_ACCESS(pokemonTodayFailed).species = SPECIES_WIGGLYTUFF; + TERU_ACCESS(pokemonTodayFailed).species2 = SPECIES_WIGGLYTUFF; + TERU_ACCESS(pokemonTodayFailed).var12 = 3; + TERU_ACCESS(pokemonTodayFailed).var10 = 0xff; + TERU_ACCESS(pokemonTodayFailed).var11 = 1; + StringCopy(TERU_ACCESS(pokemonTodayFailed).playerName, gUnknown_Debug_083C4C64); + TERU_ACCESS(pokemonTodayFailed).language = GAME_LANGUAGE; break; } case TVSHOW_FISHING_ADVICE: { - TVShow * show = gSaveBlock1.tvShows + a0; + DECLARE_TERU_POINTER; u8 gUnknown_Debug_083C4C64[] = _("TERUKUN"); - show->pokemonAngler.var02 = 0xff; - show->pokemonAngler.var03 = 0; - show->pokemonAngler.var04 = 40; - StringCopy(show->pokemonAngler.playerName, gUnknown_Debug_083C4C64); - show->pokemonAngler.language = GAME_LANGUAGE; + TERU_ACCESS(pokemonAngler).var02 = 0xff; + TERU_ACCESS(pokemonAngler).var03 = 0; + TERU_ACCESS(pokemonAngler).var04 = 40; + StringCopy(TERU_ACCESS(pokemonAngler).playerName, gUnknown_Debug_083C4C64); + TERU_ACCESS(pokemonAngler).language = GAME_LANGUAGE; break; } case TVSHOW_WORLD_OF_MASTERS: { - TVShow * show = gSaveBlock1.tvShows + a0; + DECLARE_TERU_POINTER; u8 gUnknown_Debug_083C4C64[] = _("TERUKUN"); - show->worldOfMasters.var02 = 0xffff; - show->worldOfMasters.var06 = 0xffff; - show->worldOfMasters.var04 = 40; - show->worldOfMasters.var08 = 40; - show->worldOfMasters.var0a = 3; - StringCopy(show->worldOfMasters.playerName, gUnknown_Debug_083C4C64); - show->worldOfMasters.language = GAME_LANGUAGE; + TERU_ACCESS(worldOfMasters).var02 = 0xffff; + TERU_ACCESS(worldOfMasters).var06 = 0xffff; + TERU_ACCESS(worldOfMasters).var04 = 40; + TERU_ACCESS(worldOfMasters).var08 = 40; + TERU_ACCESS(worldOfMasters).var0a = 3; + StringCopy(TERU_ACCESS(worldOfMasters).playerName, gUnknown_Debug_083C4C64); + TERU_ACCESS(worldOfMasters).language = GAME_LANGUAGE; break; } - } +#endif } bool8 debug_sub_808FEBC(void) diff --git a/src/debug/start_menu_debug.c b/src/debug/start_menu_debug.c index 940f21ac7..ef83fc3f0 100644 --- a/src/debug/start_menu_debug.c +++ b/src/debug/start_menu_debug.c @@ -51,7 +51,8 @@ extern void Debug_SetUpFieldMove_Cut(void); extern void Debug_SetUpFieldMove_SecretPower(void); void debug_sub_8076BB4(u8); -void debug_sub_8077CF4(u8 x, u8 y); +void DebugMenu_DisplayBuildDate(u8 x, u8 y); +void DebugMenu_DisplayContinuousDate(u8 x, u8 y); u8 DebugMenu_807706C(void); u8 DebugMenu_807709C(void); void DebugMenu_807719C(void); @@ -133,7 +134,9 @@ u8 DebugMenu_EndSequenceDemo(void); u8 DebugMenu_RandomNumberTest(void); u8 DebugMenu_MeTooBackupMan(void); u8 DebugMenu_OpenMurakawa(void); +#if !(ENGLISH && REVISION == 0) u8 DebugMenu_OpenKiwa(void); +#endif u8 DebugMenu_8076CBC(void); u8 DebugMenu_8076CC0(void); u8 DebugMenu_8076CD4(void); @@ -204,7 +207,9 @@ const u8 Str_839B972[] = _("End sequence demo"); const u8 Str_839B984[] = _("Random number test"); const u8 Str_839B997[] = _("Me-too BackupMan"); const u8 Str_839B9A8[] = _("MURAKAWA"); +#if !(ENGLISH && REVISION == 0) const u8 Str_839B9B1[] = _("KINA(FONT)"); +#endif const struct MenuAction gDebug0x839B9BC[] = { @@ -260,18 +265,34 @@ const struct MenuAction gDebug0x839B9BC[] = { Str_839B984, DebugMenu_RandomNumberTest }, { Str_839B997, DebugMenu_MeTooBackupMan }, { Str_839B9A8, DebugMenu_OpenMurakawa }, +#if !(ENGLISH && REVISION == 0) { Str_839B9B1, DebugMenu_OpenKiwa }, +#endif }; +#if (ENGLISH && REVISION == 0) +const u8 gUnknown_Debug_839BB64[] = +{ + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x0e, 0x1f, 0x12, 0x13, 0x00, 0x08, 0x09, 0x0a, 0x1e, 0x10, 0x24, 0x0f, 0x00, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, + 0x1c, 0x1d, 0x14, 0x20, 0x21, 0x22, 0x23, 0x00, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x00, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x00, 0x11, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; +#else const u8 gUnknown_Debug_839BB64[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x0e, 0x1f, 0x12, 0x13, 0x00, 0x08, 0x09, 0x0a, 0x1e, 0x10, 0x24, 0x0f, 0x00, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x1c, 0x1d, 0x14, 0x20, 0x21, 0x22, 0x23, 0x00, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x00, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x00, 0x11, 0x33, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, }; +#endif -const u8 gUnknown_Debug_0839BBA4[] = _("Debugging Version"); -const u8 gUnknown_Debug_0839BBB6[] = _("{VERSION} Version"); -const u8 gUnknown_Debug_0839BBC1[] = _("Normal RTC compatible"); +#if ENGLISH +const u8 gDebugCreatedString[] = _("Created"); +const u8 gDebugContinuousString[] = _("Continuous play\n" + "available from"); +#else +const u8 gDebugRomString[] = _("Debugging Version"); +#endif +const u8 gDebugVersionString[] = _("{VERSION} Version"); +const u8 gDebugRTCString[] = _("Normal RTC compatible"); const u8 gTestMenu_TestMenuHeaderText[] = DTR("か の じっけん", "TEST MENU"); // 科の実験 (Test section) const u8 gTestMenu_Test2Text[] = DTR("じっけん2", "Test2"); @@ -345,6 +366,7 @@ extern const u8 Str_839BD4C[]; static u8 gUnknown_030006B8; +#ifndef ENGLISH struct DebugBuildDateInfo { s32 max; s32 digitMultiplier; @@ -353,6 +375,7 @@ struct DebugBuildDateInfo { }; static const struct DebugBuildDateInfo *gDebugBuildDate; +#endif static u8 gUnknown_030006C0; static u8 gUnknown_030006C1; static const u8 * gUnknown_030006C4; @@ -382,10 +405,17 @@ void debug_sub_8076B4C(void) // Initializes test menu void debug_sub_8076B68(void) { - Menu_PrintText(gUnknown_Debug_0839BBB6, 1, 1); - Menu_PrintText(gUnknown_Debug_0839BBC1, 1, 3); - Menu_PrintText(gUnknown_Debug_0839BBA4, 1, 9); - debug_sub_8077CF4(4, 11); + Menu_PrintText(gDebugVersionString, 1, 1); + Menu_PrintText(gDebugRTCString, 1, 3); +#if ENGLISH + Menu_PrintText(gDebugCreatedString, 1, 7); + DebugMenu_DisplayBuildDate(3, 9); + Menu_PrintText(gDebugContinuousString, 1, 12); + DebugMenu_DisplayContinuousDate(3, 16); +#else + Menu_PrintText(gDebugRomString, 1, 9); + DebugMenu_DisplayBuildDate(4, 11); +#endif debug_sub_8076AC8(0); CreateTask(debug_sub_8076BB4, 1); } @@ -699,6 +729,9 @@ void DebugMenu_8077048(void) u8 DebugMenu_807706C(void) { +#if (ENGLISH && REVISION == 0) + gUnknown_Debug_Murakawa2 = 1; +#endif InitMenuWindow(&gMenuTextWindowTemplate); DebugMenu_8077004(); DebugMenu_807719C(); @@ -710,6 +743,8 @@ u8 DebugMenu_807706C(void) u8 DebugMenu_807709C(void) { + u8 actionRet; + if (gMain.newKeys & DPAD_UP) { PlaySE(SE_SELECT); @@ -743,11 +778,21 @@ u8 DebugMenu_807709C(void) if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); - return gDebug0x839B9BC[gUnknown_030006C4[gUnknown_030006C0]].func(); + actionRet = gDebug0x839B9BC[gUnknown_030006C4[gUnknown_030006C0]].func(); +// TODO: see if this is in rev1+ +#if (ENGLISH && REVISION == 0) + if (actionRet == 1) + gUnknown_Debug_Murakawa2 = 0; +#endif + return actionRet; } if (gMain.newKeys & (B_BUTTON | START_BUTTON)) { CloseMenu(); +// TODO: see if this is in rev1+ +#if (ENGLISH && REVISION == 0) + gUnknown_Debug_Murakawa2 = 0; +#endif return TRUE; } return FALSE; @@ -1389,15 +1434,47 @@ u8 DebugMenu_8077C14(void) const u8 Str_839BFDC[] = DTR(" じかん ふん びょう", " HOURS MINUTES SECONDS"); +#if ENGLISH +const u8 ContinousDateTime[] = "2002 08 01 20:25"; +#else static const struct DebugBuildDateInfo gDebugBuildDateInfo[] = { { 99, 10, 2, 23 }, { 99, 10, 2, 26 } }; +#endif // Parses the version code in a highly inefficient and unsafe way. -void DebugMenu_ConvertBuildDate(const char *buildDateStr, u8 *out) +void DebugMenu_ConvertBuildDate(const u8 *buildDateStr, u8 *out) { - int i; + s32 i; +#if ENGLISH + u16 year; + u16 month; + u16 day; + u16 hour; + u16 minutes; + + for (year = 0, i = 0; i < 2; i++) + { + year *= 10; + year += (buildDateStr[i+2] - '0'); + } + + month = (buildDateStr[5] - '0') * 10 + (buildDateStr[6] - '0'); + day = (buildDateStr[8] - '0') * 10 + (buildDateStr[9] - '0'); + hour = (buildDateStr[11] - '0') * 10 + (buildDateStr[12] - '0'); + minutes = (buildDateStr[14] - '0') * 10 + (buildDateStr[15] - '0'); + + out = ConvertIntToDecimalStringN(out, year, STR_CONV_MODE_LEADING_ZEROS, 2); + *out++ = CHAR_SLASH; + out = ConvertIntToDecimalStringN(out, month, STR_CONV_MODE_LEADING_ZEROS, 2); + *out++ = CHAR_SLASH; + out = ConvertIntToDecimalStringN(out, day, STR_CONV_MODE_LEADING_ZEROS, 2); + *out++ = CHAR_SPACE; + out = ConvertIntToDecimalStringN(out, hour, STR_CONV_MODE_LEADING_ZEROS, 2); + *out++ = CHAR_COLON; + out = ConvertIntToDecimalStringN(out, minutes, STR_CONV_MODE_LEADING_ZEROS, 2); +#else // Prevents register allocation swap // Intended: r7 = out, r6 = gDebugBuildDate->numDigits // Observed: r6 = out, r7 = gDebugBuildDate->numDigits @@ -1408,8 +1485,8 @@ void DebugMenu_ConvertBuildDate(const char *buildDateStr, u8 *out) *out++ = CHAR_SPACE; for (i = 0; i < 2; i++, gDebugBuildDate++) { - int j; - int mul; + s32 j; + s32 mul; u32 date = 0; for (mul = gDebugBuildDate->digitMultiplier, j = 0; j < gDebugBuildDate->numDigits; j++, mul /= 10) date += (buildDateStr[gDebugBuildDate->offset + j] - '0') * mul; @@ -1421,14 +1498,23 @@ void DebugMenu_ConvertBuildDate(const char *buildDateStr, u8 *out) if (out[0] > 0xf6) // prevent special characters out[0] = 0xf6; out[1] = EOS; +#endif } -void debug_sub_8077CF4(u8 x, u8 y) +void DebugMenu_DisplayBuildDate(u8 x, u8 y) { DebugMenu_ConvertBuildDate(BuildDateTime, gStringVar4); Menu_PrintText(gStringVar4, x, y); } +#if ENGLISH +void DebugMenu_DisplayContinuousDate(u8 x, u8 y) +{ + DebugMenu_ConvertBuildDate(ContinousDateTime, gStringVar4); + Menu_PrintText(gStringVar4, x, y); +} +#endif + void DebugMenu_8077D24(const struct MenuAction *menuAction, u8 width, u8 itemCount) { Menu_EraseScreen(); @@ -2591,14 +2677,22 @@ u8 DebugMenu_PTime(void) return TRUE; } +#if (ENGLISH && REVISION == 0) +const u8 gDebug0x839C60C[] = _("switch DISP mode"); +#else const u8 gDebug0x839C60C[] = _("Set FLASH ERR"); +#endif void DebugMenu_8079058(u8 taskId) { switch (gTasks[taskId].data[0]) { case 0: +#if (ENGLISH && REVISION == 0) + gUnknown_Debug_Murakawa2 = 1; +#else gUnknown_Debug_03004BD0 = 0; +#endif Menu_DisplayDialogueFrame(); gTasks[taskId].data[0]++; break; @@ -2619,6 +2713,9 @@ void DebugMenu_8079058(u8 taskId) gUnknown_Debug_03004BD0 = 0; break; } +#if (ENGLISH && REVISION == 0) + gUnknown_Debug_Murakawa2 = 0; +#endif Menu_EraseScreen(); ScriptContext2_Disable(); DestroyTask(taskId); @@ -2634,13 +2731,17 @@ u8 DebugMenu_OpenMurakawa(void) return TRUE; } -const u8 Str_839C61A[] = _("abcde; abcde: ABCDE; ABCDE:\p" - "Tableaux des verbes du 2{SUPER_E} groupe.\p" - "La1{SUPER_RE} chose à apprendre c'est de lire.\p" - "Tableaux des verbes du 1{SUPER_ER} groupe.\p" - "“あいうえおかきくけコさしすせそたちつてとな”\n" - "<にぬネのはひふへほマみむめもやゆよらりるれろわャッ>\p" - "をんゃゅょアイウエオカキクケサシスルレロワ,"); +#if !(ENGLISH && REVISION == 0) +const u8 Str_839C61A[] = _( +#if GERMAN + "abcde; abcde: ABCDE; ABCDE:\p" +#endif + "Tableaux des verbes du 2{SUPER_E} groupe.\p" + "La1{SUPER_RE} chose à apprendre c'est de lire.\p" + "Tableaux des verbes du 1{SUPER_ER} groupe.\p" + "“あいうえおかきくけコさしすせそたちつてとな”\n" + "<にぬネのはひふへほマみむめもやゆよらりるれろわャッ>\p" + "をんゃゅょアイウエオカキクケサシスルレロワ,"); void DebugMenu_8079110(u8 taskId) { @@ -2672,5 +2773,6 @@ u8 DebugMenu_OpenKiwa(void) ScriptContext2_Enable(); // return TRUE; } +#endif #endif diff --git a/src/debug/taya_debug_window.c b/src/debug/taya_debug_window.c index 0b3afa28d..b76e5f794 100644 --- a/src/debug/taya_debug_window.c +++ b/src/debug/taya_debug_window.c @@ -439,37 +439,37 @@ void debug_sub_8090C44(void) Menu_PrintText(eTayaLuckyNumber.charbuf, 1, 3); } -#ifdef NONMATCHING -// mayday mayday bool8 debug_sub_8090C88(void) { bool8 r8 = TRUE; - if (gMain.newKeys & DPAD_LEFT && eTayaLuckyNumber.digit != 0) - { - eTayaLuckyNumber.digit--; - } - else if (gMain.newKeys & DPAD_RIGHT && eTayaLuckyNumber.digit < 4) - { - eTayaLuckyNumber.digit++; - } - else + do { + if (gMain.newKeys & DPAD_LEFT && eTayaLuckyNumber.digit != 0) + { + eTayaLuckyNumber.digit--; + break; + } + if (gMain.newKeys & DPAD_RIGHT && eTayaLuckyNumber.digit < 4) + { + eTayaLuckyNumber.digit++; + break; + } if (gMain.newAndRepeatedKeys & DPAD_UP) { u8 r4; eTayaLuckyNumber.tempLuckyId = eTayaLuckyNumber.curLuckyId; - eTayaLuckyNumber.charbuf0 = 10000; + eTayaLuckyNumber.digitDeltaMagnitude = 10000; for (r4 = 0; r4 < eTayaLuckyNumber.digit; r4++) - eTayaLuckyNumber.charbuf0 /= 10; - eTayaLuckyNumber.tempLuckyId += eTayaLuckyNumber.charbuf0; + eTayaLuckyNumber.digitDeltaMagnitude /= 10; + eTayaLuckyNumber.tempLuckyId += eTayaLuckyNumber.digitDeltaMagnitude; if (eTayaLuckyNumber.tempLuckyId > 0xFFFF) eTayaLuckyNumber.tempLuckyId = 0xFFFF; if (eTayaLuckyNumber.curLuckyId != eTayaLuckyNumber.tempLuckyId) { eTayaLuckyNumber.curLuckyId = eTayaLuckyNumber.tempLuckyId; - goto check; + break; } } if (gMain.newAndRepeatedKeys & DPAD_DOWN) @@ -477,16 +477,16 @@ bool8 debug_sub_8090C88(void) u8 r4; eTayaLuckyNumber.tempLuckyId = eTayaLuckyNumber.curLuckyId; - eTayaLuckyNumber.charbuf0 = 10000; + eTayaLuckyNumber.digitDeltaMagnitude = 10000; for (r4 = 0; r4 < eTayaLuckyNumber.digit; r4++) - eTayaLuckyNumber.charbuf0 /= 10; - eTayaLuckyNumber.tempLuckyId -= eTayaLuckyNumber.charbuf0; + eTayaLuckyNumber.digitDeltaMagnitude /= 10; + eTayaLuckyNumber.tempLuckyId -= eTayaLuckyNumber.digitDeltaMagnitude; if (eTayaLuckyNumber.tempLuckyId < 0) eTayaLuckyNumber.tempLuckyId = 0; if (eTayaLuckyNumber.curLuckyId != eTayaLuckyNumber.tempLuckyId) { eTayaLuckyNumber.curLuckyId = eTayaLuckyNumber.tempLuckyId; - goto check; + break; } } if (gMain.newKeys & B_BUTTON) @@ -501,193 +501,12 @@ bool8 debug_sub_8090C88(void) return TRUE; } r8 = FALSE; - } + } while (0); -check: if (r8) debug_sub_8090C44(); return FALSE; } -#else -NAKED bool8 debug_sub_8090C88(void) -{ - asm("\tpush\t{r4, r5, r6, r7, lr}\n" - "\tmov\tr7, r8\n" - "\tpush\t{r7}\n" - "\tadd\tsp, sp, #0xfffffffc\n" - "\tmov\tr0, #0x1\n" - "\tmov\tr8, r0\n" - "\tldr\tr2, ._59 @ gMain\n" - "\tldrh\tr1, [r2, #0x2e]\n" - "\tmov\tr0, #0x20\n" - "\tand\tr0, r0, r1\n" - "\tadd\tr3, r2, #0\n" - "\tcmp\tr0, #0\n" - "\tbeq\t._57\t@cond_branch\n" - "\tldr\tr1, ._59 + 4 @ gSharedMem\n" - "\tldrb\tr0, [r1]\n" - "\tcmp\tr0, #0\n" - "\tbeq\t._57\t@cond_branch\n" - "\tsub\tr0, r0, #0x1\n" - "\tstrb\tr0, [r1]\n" - "\tb\t._62\n" - "._60:\n" - "\t.align\t2, 0\n" - "._59:\n" - "\t.word\tgMain\n" - "\t.word\tgSharedMem\n" - "._67:\n" - "\tadd\tr0, r0, #0x1\n" - "\tstrb\tr0, [r1]\n" - "\tb\t._62\n" - "._77:\n" - "\tstrh\tr1, [r7, #0x8]\n" - "\tb\t._62\n" - "._79:\n" - "\tldr\tr0, ._64 @ gSharedMem\n" - "\tldrh\tr0, [r0, #0x8]\n" - "\tbl\tSetLotteryNumber16_Unused\n" - "._78:\n" - "\tbl\tCloseMenu\n" - "\tmov\tr0, #0x1\n" - "\tb\t._63\n" - "._65:\n" - "\t.align\t2, 0\n" - "._64:\n" - "\t.word\tgSharedMem\n" - "._57:\n" - "\tldrh\tr1, [r3, #0x2e]\n" - "\tmov\tr0, #0x10\n" - "\tand\tr0, r0, r1\n" - "\tcmp\tr0, #0\n" - "\tbeq\t._66\t@cond_branch\n" - "\tldr\tr1, ._81 @ gSharedMem\n" - "\tldrb\tr0, [r1]\n" - "\tcmp\tr0, #0x3\n" - "\tbls\t._67\t@cond_branch\n" - "._66:\n" - "\tldrh\tr1, [r3, #0x30]\n" - "\tmov\tr0, #0x40\n" - "\tand\tr0, r0, r1\n" - "\tcmp\tr0, #0\n" - "\tbeq\t._68\t@cond_branch\n" - "\tldr\tr0, ._81 @ gSharedMem\n" - "\tldrh\tr1, [r0, #0x8]\n" - "\tstr\tr1, [r0, #0xc]\n" - "\tldr\tr1, ._81 + 4 @ 0x2710\n" - "\tstrh\tr1, [r0, #0x10]\n" - "\tmov\tr4, #0x0\n" - "\tldrb\tr1, [r0]\n" - "\tadd\tr7, r0, #0\n" - "\tcmp\tr4, r1\n" - "\tbcs\t._69\t@cond_branch\n" - "\tadd\tr5, r7, #0\n" - "\tadd\tr6, r1, #0\n" - "._70:\n" - "\tldrh\tr0, [r5, #0x10]\n" - "\tmov\tr1, #0xa\n" - "\tstr\tr3, [sp]\n" - "\tbl\t__udivsi3\n" - "\tstrh\tr0, [r5, #0x10]\n" - "\tadd\tr0, r4, #1\n" - "\tlsl\tr0, r0, #0x18\n" - "\tlsr\tr4, r0, #0x18\n" - "\tldr\tr3, [sp]\n" - "\tcmp\tr4, r6\n" - "\tbcc\t._70\t@cond_branch\n" - "._69:\n" - "\tldrh\tr1, [r7, #0x10]\n" - "\tldr\tr0, [r7, #0xc]\n" - "\tadd\tr0, r0, r1\n" - "\tstr\tr0, [r7, #0xc]\n" - "\tldr\tr1, ._81 + 8 @ 0xffff\n" - "\tcmp\tr0, r1\n" - "\tble\t._71\t@cond_branch\n" - "\tstr\tr1, [r7, #0xc]\n" - "._71:\n" - "\tldrh\tr0, [r7, #0x8]\n" - "\tldr\tr1, [r7, #0xc]\n" - "\tcmp\tr0, r1\n" - "\tbne\t._77\t@cond_branch\n" - "._68:\n" - "\tldrh\tr1, [r3, #0x30]\n" - "\tmov\tr0, #0x80\n" - "\tand\tr0, r0, r1\n" - "\tcmp\tr0, #0\n" - "\tbeq\t._73\t@cond_branch\n" - "\tldr\tr0, ._81 @ gSharedMem\n" - "\tldrh\tr1, [r0, #0x8]\n" - "\tstr\tr1, [r0, #0xc]\n" - "\tldr\tr1, ._81 + 4 @ 0x2710\n" - "\tstrh\tr1, [r0, #0x10]\n" - "\tmov\tr4, #0x0\n" - "\tldrb\tr1, [r0]\n" - "\tadd\tr7, r0, #0\n" - "\tcmp\tr4, r1\n" - "\tbcs\t._74\t@cond_branch\n" - "\tadd\tr5, r7, #0\n" - "\tadd\tr6, r1, #0\n" - "._75:\n" - "\tldrh\tr0, [r5, #0x10]\n" - "\tmov\tr1, #0xa\n" - "\tstr\tr3, [sp]\n" - "\tbl\t__udivsi3\n" - "\tstrh\tr0, [r5, #0x10]\n" - "\tadd\tr0, r4, #1\n" - "\tlsl\tr0, r0, #0x18\n" - "\tlsr\tr4, r0, #0x18\n" - "\tldr\tr3, [sp]\n" - "\tcmp\tr4, r6\n" - "\tbcc\t._75\t@cond_branch\n" - "._74:\n" - "\tadd\tr2, r7, #0\n" - "\tldrh\tr1, [r2, #0x10]\n" - "\tldr\tr0, [r2, #0xc]\n" - "\tsub\tr0, r0, r1\n" - "\tstr\tr0, [r2, #0xc]\n" - "\tcmp\tr0, #0\n" - "\tbge\t._76\t@cond_branch\n" - "\tmov\tr0, #0x0\n" - "\tstr\tr0, [r2, #0xc]\n" - "._76:\n" - "\tldrh\tr0, [r2, #0x8]\n" - "\tldr\tr1, [r2, #0xc]\n" - "\tcmp\tr0, r1\n" - "\tbne\t._77\t@cond_branch\n" - "._73:\n" - "\tldrh\tr2, [r3, #0x2e]\n" - "\tmov\tr0, #0x2\n" - "\tand\tr0, r0, r2\n" - "\tcmp\tr0, #0\n" - "\tbne\t._78\t@cond_branch\n" - "\tmov\tr0, #0x1\n" - "\tand\tr0, r0, r2\n" - "\tcmp\tr0, #0\n" - "\tbne\t._79\t@cond_branch\n" - "\tmov\tr0, #0x0\n" - "\tmov\tr8, r0\n" - "._62:\n" - "\tmov\tr0, r8\n" - "\tcmp\tr0, #0\n" - "\tbeq\t._80\t@cond_branch\n" - "\tbl\tdebug_sub_8090C44\n" - "._80:\n" - "\tmov\tr0, #0x0\n" - "._63:\n" - "\tadd\tsp, sp, #0x4\n" - "\tpop\t{r3}\n" - "\tmov\tr8, r3\n" - "\tpop\t{r4, r5, r6, r7}\n" - "\tpop\t{r1}\n" - "\tbx\tr1\n" - "._82:\n" - "\t.align\t2, 0\n" - "._81:\n" - "\t.word\tgSharedMem\n" - "\t.word\t0x2710\n" - "\t.word\t0xffff"); -} -#endif // NONMATCHING bool8 TayaDebugMenu_PKMNLottery(void) { diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index 5d30cf2c6..64da15dc7 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -245,12 +245,21 @@ static const struct MenuAction sMenuActions_TopMenu[] = { {sString_ControlWORK, ControlWorks}, }; +#if (ENGLISH && REVISION == 0) +static const u8 sString_ContestMenuTitle[] = _("コンテスト"); + +static const u8 sString_Contest_PokemonNo[] = _("ポケモンナンバー"); +static const u8 sString_Contest_Personality[] = _("こせいらんすう"); +static const u8 sString_Contest_Type[] = _("コンテストしゅるい"); +static const u8 sString_Contest_PokeArt[] = _("ひょうじ"); +#else static const u8 sString_ContestMenuTitle[] = _("Contest"); static const u8 sString_Contest_PokemonNo[] = _("Pokémon No."); static const u8 sString_Contest_Personality[] = _("ID rnd. digit"); static const u8 sString_Contest_Type[] = _("Contest Type"); static const u8 sString_Contest_PokeArt[] = _("Poké Art"); +#endif static const struct MenuAction sMenuActions_ContestPicTest[] = { {sString_Contest_PokemonNo, DummyMenuAction}, @@ -259,12 +268,21 @@ static const struct MenuAction sMenuActions_ContestPicTest[] = { {sString_Contest_PokeArt, ContestGraphics_Show} }; +#if (ENGLISH && REVISION == 0) +static const u8 sString_Contest_ArtMuseumTitle[] = _("びじゅつかん"); + +static const u8 sString_Contest_ArtMuseum_PokemonNo[] = _("ポケモンナンバー"); +static const u8 sString_Contest_ArtMuseum_Personality[] = _("こせいらんすう"); +static const u8 sString_Contest_ArtMuseum_Type[] = _("タイトルしゅるい"); +static const u8 sString_Contest_ArtMuseum_PokeArt[] = _("ひょうじ"); +#else static const u8 sString_Contest_ArtMuseumTitle[] = _("Art Mus."); static const u8 sString_Contest_ArtMuseum_PokemonNo[] = _("Pokémon No."); static const u8 sString_Contest_ArtMuseum_Personality[] = _("ID rnd. digit"); static const u8 sString_Contest_ArtMuseum_Type[] = _("Title Type"); static const u8 sString_Contest_ArtMuseum_PokeArt[] = _("Poké Art"); +#endif static const struct MenuAction sMenuActions_ArtMuseumPicTest[] = { {sString_Contest_ArtMuseum_PokemonNo, DummyMenuAction}, @@ -273,12 +291,21 @@ static const struct MenuAction sMenuActions_ArtMuseumPicTest[] = { {sString_Contest_ArtMuseum_PokeArt, MuseumGraphics_Show} }; +#if (ENGLISH && REVISION == 0) +static const u8 sString_Contest_PreviewTitle[] = _("プレビュー"); + +static const u8 sString_Contest_Preview_PokemonNo[] = _("ポケモンナンバー"); +static const u8 sString_Contest_Preview_Personality[] = _("こせいらんすう"); +static const u8 sString_Contest_Preview_Type[] = _("しゅるい"); +static const u8 sString_Contest_Preview_PokeArt[] = _("ひょうじ"); +#else static const u8 sString_Contest_PreviewTitle[] = _("Preview"); static const u8 sString_Contest_Preview_PokemonNo[] = _("Pokémon No."); static const u8 sString_Contest_Preview_Personality[] = _("ID rnd. digit"); static const u8 sString_Contest_Preview_Type[] = _("Type"); static const u8 sString_Contest_Preview_PokeArt[] = _("Poké Art"); +#endif static const struct MenuAction sMenuActions_PreviewPicTest[] = { {sString_Contest_Preview_PokemonNo, DummyMenuAction}, @@ -287,10 +314,19 @@ static const struct MenuAction sMenuActions_PreviewPicTest[] = { {sString_Contest_Preview_PokeArt, PreviewGraphics_Show} }; +#if (ENGLISH && REVISION == 0) +static const u8 sString_TrickRelated[] = _("カラクリかんれん"); +#else static const u8 sString_TrickRelated[] = _("Trick related"); +#endif static const u8 sString_TrickRelated_Level[] = _("Level"); + +#if (ENGLISH && REVISION == 0) +static const u8 sString_TrickRelated_TrickMaster[] = _("MASTER"); +#else static const u8 sString_TrickRelated_TrickMaster[] = _("Trick Master"); +#endif static const struct MenuAction sMenuActions_TrickRelated[] = { {sString_TrickRelated_Level, TrickRelated_Level_InitSubmenu}, @@ -1841,6 +1877,17 @@ static const u16 gUnknown_Debug_083C478E[][9] = { {VAR_TEMP_9, VAR_TEMP_A, VAR_TEMP_B, VAR_TEMP_C, VAR_TEMP_D, VAR_TEMP_E, VAR_TEMP_F} }; +#if (ENGLISH && REVISION == 0) +static const u8 gUnknown_Debug_083C47B2[] = _("レベル"); +static const u8 gUnknown_Debug_083C47B8[] = _("シーン1"); +static const u8 gUnknown_Debug_083C47BF[] = _("シーン2"); +static const u8 gUnknown_Debug_083C47C6[] = _("シーン3"); +static const u8 gUnknown_Debug_083C47CD[] = _("シーン4"); +static const u8 gUnknown_Debug_083C47D4[] = _("シーン5"); +static const u8 gUnknown_Debug_083C47DB[] = _("シーン6"); +static const u8 gUnknown_Debug_083C47E2[] = _("シーン7"); +static const u8 gUnknown_Debug_083C47E9[] = _("シーン8"); +#else static const u8 gUnknown_Debug_083C47B2[] = _("Level"); static const u8 gUnknown_Debug_083C47B8[] = _("Scene1"); static const u8 gUnknown_Debug_083C47BF[] = _("Scene2"); @@ -1850,6 +1897,7 @@ static const u8 gUnknown_Debug_083C47D4[] = _("Scene5"); static const u8 gUnknown_Debug_083C47DB[] = _("Scene6"); static const u8 gUnknown_Debug_083C47E2[] = _("Scene7"); static const u8 gUnknown_Debug_083C47E9[] = _("Scene8"); +#endif static const struct MenuAction gUnknown_Debug_083C47F0[] = { {gUnknown_Debug_083C47B8, DummyMenuAction}, @@ -1862,7 +1910,11 @@ static const struct MenuAction gUnknown_Debug_083C47F0[] = { {gUnknown_Debug_083C47E9, DummyMenuAction} }; +#if (ENGLISH && REVISION == 0) +static const u8 gUnknown_Debug_083C4830[] = _("カラクリだいおう"); +#else static const u8 gUnknown_Debug_083C4830[] = _("Trick Master"); +#endif static const u8 gUnknown_Debug_083C483D[] = _("Hidden MASTER"); static const u8 gUnknown_Debug_083C484B[] = _("Inside the HOUSE"); @@ -1878,8 +1930,13 @@ static const struct MenuAction gUnknown_Debug_083C4888[] = { {gUnknown_Debug_083C4876, DummyMenuAction} }; +#if (ENGLISH && REVISION == 0) +static const u8 sDummyNickname[] = _("ポケモンめい"); +static const u8 sDummyTrainerName[] = _("ブリーダーめい"); +#else static const u8 sDummyNickname[] = _("PMNICKNAME"); static const u8 sDummyTrainerName[] = _("BREEDER"); +#endif bool8 InitTomomichiDebugWindow(void) { diff --git a/src/debug/watanabe_debug_menu.c b/src/debug/watanabe_debug_menu.c index c055781fb..205d4d5e3 100644 --- a/src/debug/watanabe_debug_menu.c +++ b/src/debug/watanabe_debug_menu.c @@ -1812,6 +1812,15 @@ const struct WatanabeDebugMenuItem gUnknown_Debug_083F8698[] = { {gUnknown_Debug_083F868F, {.type3 = 0x6}} }; +#if (ENGLISH && REVISION == 0) +const u8 gUnknown_Debug_083F86C8[] = _("ふつう"); +const u8 gUnknown_Debug_083F86CC[] = _("ねむり"); +const u8 gUnknown_Debug_083F86D0[] = _("どく"); +const u8 gUnknown_Debug_083F86D4[] = _("やけど"); +const u8 gUnknown_Debug_083F86D8[] = _("こおり"); +const u8 gUnknown_Debug_083F86DC[] = _("まひ"); +const u8 gUnknown_Debug_083F86E0[] = _("どくどく"); +#else const u8 gUnknown_Debug_083F86C8[] = _("ーーー"); const u8 gUnknown_Debug_083F86CC[] = _("SLP"); const u8 gUnknown_Debug_083F86D0[] = _("PSN"); @@ -1819,6 +1828,7 @@ const u8 gUnknown_Debug_083F86D4[] = _("BRN"); const u8 gUnknown_Debug_083F86D8[] = _("FRZ"); const u8 gUnknown_Debug_083F86DC[] = _("PAR"); const u8 gUnknown_Debug_083F86E0[] = _("PSN2"); +#endif const struct WatanabeDebugMenuItem gUnknown_Debug_083F86E8[] = { {gUnknown_Debug_083F86C8, {.type3 = 0x0}}, @@ -1830,8 +1840,13 @@ const struct WatanabeDebugMenuItem gUnknown_Debug_083F86E8[] = { {gUnknown_Debug_083F86E0, {.type3 = 0x80}} }; +#if (ENGLISH && REVISION == 0) +const u8 gUnknown_Debug_083F8720[] = _("ポケモンを てもちに くわえました"); +const u8 gUnknown_Debug_083F872A[] = _("ポケモンを ボックスに くわえました"); +#else const u8 gUnknown_Debug_083F8720[] = _("PKMN{RIGHT_ARROW}LIST"); const u8 gUnknown_Debug_083F872A[] = _("PKMN{RIGHT_ARROW}BOX"); +#endif void InitCreatePokemon(void) { u8 sp04[] = _("Create POKéMON LR:Shift START:Add"); @@ -2196,7 +2211,11 @@ void debug_80C5FFC(void) { u32 ivs; u8 sp10[] = DTR("たまご", "EGG"); +#if (ENGLISH && REVISION == 0) + u8 sp14[] = _("デバッグポケ1"); +#else u8 sp14[] = _("DebugーG"); +#endif u8 one; u16 ff; diff --git a/src/decoration.c b/src/decoration.c index 4dd7e0f12..1c6c4e18d 100644 --- a/src/decoration.c +++ b/src/decoration.c @@ -2403,8 +2403,6 @@ bool8 sub_80FFBDC(u16 metatileBehavior, const struct Decoration *decoration) return FALSE; } -// When behaviorBy is set, it is masked by 0xf000. This is the step that fails to match when built. -#ifdef NONMATCHING bool8 sub_80FFC24(u8 taskId, const struct Decoration *decoration) { u8 i; @@ -2536,540 +2534,6 @@ bool8 sub_80FFC24(u8 taskId, const struct Decoration *decoration) } return TRUE; } -#else -NAKED -bool8 sub_80FFC24(u8 taskId, const struct Decoration *decoration) -{ - asm(".syntax unified\n" - "\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0x24\n" - "\tstr r1, [sp]\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tmov r10, r0\n" - "\tldr r1, _080FFC60 @ =gTasks\n" - "\tlsls r0, 2\n" - "\tadd r0, r10\n" - "\tlsls r0, 3\n" - "\tadds r0, r1\n" - "\tldrb r2, [r0, 0x14]\n" - "\tstr r2, [sp, 0x4]\n" - "\tldrb r0, [r0, 0x12]\n" - "\tstr r0, [sp, 0x8]\n" - "\tldr r3, [sp]\n" - "\tldrb r0, [r3, 0x11]\n" - "\tadds r2, r1, 0\n" - "\tcmp r0, 0x4\n" - "\tbls _080FFC56\n" - "\tb _08100024\n" - "_080FFC56:\n" - "\tlsls r0, 2\n" - "\tldr r1, _080FFC64 @ =_080FFC68\n" - "\tadds r0, r1\n" - "\tldr r0, [r0]\n" - "\tmov pc, r0\n" - "\t.align 2, 0\n" - "_080FFC60: .4byte gTasks\n" - "_080FFC64: .4byte _080FFC68\n" - "\t.align 2, 0\n" - "_080FFC68:\n" - "\t.4byte _080FFC7C\n" - "\t.4byte _080FFC7C\n" - "\t.4byte _080FFD68\n" - "\t.4byte _080FFF1C\n" - "\t.4byte _080FFFA0\n" - "_080FFC7C:\n" - "\tmovs r6, 0\n" - "\tldr r0, [sp, 0x4]\n" - "\tcmp r6, r0\n" - "\tbcc _080FFC86\n" - "\tb _08100024\n" - "_080FFC86:\n" - "\tmov r1, r10\n" - "\tlsls r1, 2\n" - "\tstr r1, [sp, 0x1C]\n" - "_080FFC8C:\n" - "\tmov r2, r10\n" - "\tlsls r0, r2, 2\n" - "\tadd r0, r10\n" - "\tlsls r0, 3\n" - "\tldr r3, _080FFD64 @ =gTasks\n" - "\tadds r0, r3\n" - "\tldrh r0, [r0, 0xA]\n" - "\tsubs r0, r6\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tmov r9, r0\n" - "\tmovs r7, 0\n" - "\tadds r6, 0x1\n" - "\tstr r6, [sp, 0x14]\n" - "\tldr r0, [sp, 0x8]\n" - "\tcmp r7, r0\n" - "\tbcs _080FFD56\n" - "\tmov r1, r9\n" - "\tlsls r1, 16\n" - "\tstr r1, [sp, 0xC]\n" - "\tasrs r1, 16\n" - "\tmov r9, r1\n" - "_080FFCB8:\n" - "\tldr r0, [sp, 0x1C]\n" - "\tadd r0, r10\n" - "\tlsls r0, 3\n" - "\tldr r2, _080FFD64 @ =gTasks\n" - "\tadds r0, r2\n" - "\tldrh r0, [r0, 0x8]\n" - "\tadds r0, r7\n" - "\tlsls r0, 16\n" - "\tmov r8, r0\n" - "\tasrs r6, r0, 16\n" - "\tadds r0, r6, 0\n" - "\tmov r1, r9\n" - "\tbl MapGridGetMetatileBehaviorAt\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "\tldr r3, [sp, 0x4]\n" - "\tldr r1, [sp, 0x14]\n" - "\tsubs r0, r3, r1\n" - "\tldr r2, [sp, 0x8]\n" - "\tadds r1, r0, 0\n" - "\tmuls r1, r2\n" - "\tadds r1, r7\n" - "\tldr r3, [sp]\n" - "\tldr r0, [r3, 0x1C]\n" - "\tlsls r1, 1\n" - "\tadds r1, r0\n" - "\tmovs r2, 0x80\n" - "\tlsls r2, 2\n" - "\tadds r0, r2, 0\n" - "\tldrh r1, [r1]\n" - "\tadds r0, r1\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tbl GetBehaviorByMetatileId\n" - "\tmovs r3, 0xF0\n" - "\tlsls r3, 8\n" - "\tadds r1, r3, 0\n" - "\tadds r5, r1, 0\n" - "\tands r5, r0\n" - "\tadds r0, r4, 0\n" - "\tldr r1, [sp]\n" - "\tbl sub_80FFBDC\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbne _080FFD1A\n" - "\tb _080FFFF4\n" - "_080FFD1A:\n" - "\tmov r0, r10\n" - "\tadds r1, r6, 0\n" - "\tmov r2, r9\n" - "\tadds r3, r5, 0\n" - "\tbl sub_80FFB94\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbne _080FFD2E\n" - "\tb _080FFFF4\n" - "_080FFD2E:\n" - "\tmov r1, r8\n" - "\tlsrs r0, r1, 16\n" - "\tldr r2, [sp, 0xC]\n" - "\tlsrs r1, r2, 16\n" - "\tmovs r2, 0\n" - "\tbl GetObjectEventIdByXYZ\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "\tcmp r4, 0\n" - "\tbeq _080FFD4A\n" - "\tcmp r4, 0x10\n" - "\tbeq _080FFD4A\n" - "\tb _080FFFF4\n" - "_080FFD4A:\n" - "\tadds r0, r7, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r7, r0, 24\n" - "\tldr r3, [sp, 0x8]\n" - "\tcmp r7, r3\n" - "\tbcc _080FFCB8\n" - "_080FFD56:\n" - "\tldr r1, [sp, 0x14]\n" - "\tlsls r0, r1, 24\n" - "\tlsrs r6, r0, 24\n" - "\tldr r2, [sp, 0x4]\n" - "\tcmp r6, r2\n" - "\tbcc _080FFC8C\n" - "\tb _08100024\n" - "\t.align 2, 0\n" - "_080FFD64: .4byte gTasks\n" - "_080FFD68:\n" - "\tmovs r6, 0\n" - "\tmov r3, r10\n" - "\tlsls r3, 2\n" - "\tstr r3, [sp, 0x1C]\n" - "\tldr r0, [sp, 0x4]\n" - "\tsubs r0, 0x1\n" - "\tstr r0, [sp, 0x18]\n" - "\tcmp r6, r0\n" - "\tbge _080FFE54\n" - "\tadds r0, r3, 0\n" - "\tadd r0, r10\n" - "\tlsls r0, 3\n" - "\tstr r0, [sp, 0x10]\n" - "_080FFD82:\n" - "\tldr r1, [sp, 0x10]\n" - "\tadds r0, r1, r2\n" - "\tldrh r0, [r0, 0xA]\n" - "\tsubs r0, r6\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tmov r9, r0\n" - "\tmovs r7, 0\n" - "\tadds r6, 0x1\n" - "\tstr r6, [sp, 0x14]\n" - "\tldr r3, [sp, 0x8]\n" - "\tcmp r7, r3\n" - "\tbcs _080FFE48\n" - "\tlsls r0, 16\n" - "\tstr r0, [sp, 0x20]\n" - "_080FFDA0:\n" - "\tldr r1, [sp, 0x10]\n" - "\tadds r0, r1, r2\n" - "\tldrh r0, [r0, 0x8]\n" - "\tadds r0, r7\n" - "\tlsls r0, 16\n" - "\tmov r8, r0\n" - "\tasrs r6, r0, 16\n" - "\tmov r2, r9\n" - "\tlsls r1, r2, 16\n" - "\tadds r0, r6, 0\n" - "\tasrs r1, 16\n" - "\tbl MapGridGetMetatileBehaviorAt\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "\tldr r3, [sp, 0x4]\n" - "\tldr r1, [sp, 0x14]\n" - "\tsubs r0, r3, r1\n" - "\tldr r2, [sp, 0x8]\n" - "\tadds r1, r0, 0\n" - "\tmuls r1, r2\n" - "\tadds r1, r7\n" - "\tldr r3, [sp]\n" - "\tldr r0, [r3, 0x1C]\n" - "\tlsls r1, 1\n" - "\tadds r1, r0\n" - "\tmovs r2, 0x80\n" - "\tlsls r2, 2\n" - "\tadds r0, r2, 0\n" - "\tldrh r1, [r1]\n" - "\tadds r0, r1\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tbl GetBehaviorByMetatileId\n" - "\tmovs r3, 0xF0\n" - "\tlsls r3, 8\n" - "\tadds r1, r3, 0\n" - "\tadds r5, r1, 0\n" - "\tands r5, r0\n" - "\tadds r0, r4, 0\n" - "\tbl MetatileBehavior_IsNormal\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbne _080FFE0C\n" - "\tadds r0, r4, 0\n" - "\tadds r1, r5, 0\n" - "\tbl sub_80FFB6C\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbne _080FFE0C\n" - "\tb _080FFFF4\n" - "_080FFE0C:\n" - "\tmov r0, r10\n" - "\tadds r1, r6, 0\n" - "\tldr r3, [sp, 0x20]\n" - "\tasrs r2, r3, 16\n" - "\tadds r3, r5, 0\n" - "\tbl sub_80FFB94\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbne _080FFE22\n" - "\tb _080FFFF4\n" - "_080FFE22:\n" - "\tmov r1, r8\n" - "\tlsrs r0, r1, 16\n" - "\tldr r2, [sp, 0x20]\n" - "\tlsrs r1, r2, 16\n" - "\tmovs r2, 0\n" - "\tbl GetObjectEventIdByXYZ\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x10\n" - "\tbeq _080FFE3A\n" - "\tb _080FFFF4\n" - "_080FFE3A:\n" - "\tadds r0, r7, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r7, r0, 24\n" - "\tldr r2, _080FFF18 @ =gTasks\n" - "\tldr r3, [sp, 0x8]\n" - "\tcmp r7, r3\n" - "\tbcc _080FFDA0\n" - "_080FFE48:\n" - "\tldr r1, [sp, 0x14]\n" - "\tlsls r0, r1, 24\n" - "\tlsrs r6, r0, 24\n" - "\tldr r3, [sp, 0x18]\n" - "\tcmp r6, r3\n" - "\tblt _080FFD82\n" - "_080FFE54:\n" - "\tldr r0, [sp, 0x1C]\n" - "\tadd r0, r10\n" - "\tlsls r0, 3\n" - "\tadds r0, r2\n" - "\tldrh r0, [r0, 0xA]\n" - "\tldr r1, [sp, 0x4]\n" - "\tsubs r0, r1\n" - "\tadds r0, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tmov r9, r0\n" - "\tmovs r7, 0\n" - "\tldr r3, [sp, 0x8]\n" - "\tcmp r7, r3\n" - "\tbcc _080FFE74\n" - "\tb _08100024\n" - "_080FFE74:\n" - "\tlsls r0, 16\n" - "\tstr r0, [sp, 0x20]\n" - "_080FFE78:\n" - "\tldr r0, [sp, 0x1C]\n" - "\tadd r0, r10\n" - "\tlsls r0, 3\n" - "\tldr r1, _080FFF18 @ =gTasks\n" - "\tadds r0, r1\n" - "\tldrh r0, [r0, 0x8]\n" - "\tadds r0, r7\n" - "\tlsls r0, 16\n" - "\tmov r8, r0\n" - "\tasrs r6, r0, 16\n" - "\tmov r2, r9\n" - "\tlsls r1, r2, 16\n" - "\tadds r0, r6, 0\n" - "\tasrs r1, 16\n" - "\tbl MapGridGetMetatileBehaviorAt\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "\tldr r3, [sp]\n" - "\tldr r0, [r3, 0x1C]\n" - "\tlsls r1, r7, 1\n" - "\tadds r1, r0\n" - "\tmovs r2, 0x80\n" - "\tlsls r2, 2\n" - "\tadds r0, r2, 0\n" - "\tldrh r1, [r1]\n" - "\tadds r0, r1\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tbl GetBehaviorByMetatileId\n" - "\tmovs r3, 0xF0\n" - "\tlsls r3, 8\n" - "\tadds r1, r3, 0\n" - "\tadds r5, r1, 0\n" - "\tands r5, r0\n" - "\tadds r0, r4, 0\n" - "\tbl MetatileBehavior_IsNormal\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbne _080FFEDA\n" - "\tadds r0, r4, 0\n" - "\tbl MetatileBehavior_IsSecretBaseNorthWall\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbne _080FFEDA\n" - "\tb _080FFFF4\n" - "_080FFEDA:\n" - "\tmov r0, r10\n" - "\tadds r1, r6, 0\n" - "\tldr r3, [sp, 0x20]\n" - "\tasrs r2, r3, 16\n" - "\tadds r3, r5, 0\n" - "\tbl sub_80FFB94\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbne _080FFEF0\n" - "\tb _080FFFF4\n" - "_080FFEF0:\n" - "\tmov r1, r8\n" - "\tlsrs r0, r1, 16\n" - "\tldr r2, [sp, 0x20]\n" - "\tlsrs r1, r2, 16\n" - "\tmovs r2, 0\n" - "\tbl GetObjectEventIdByXYZ\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "\tcmp r4, 0\n" - "\tbeq _080FFF0A\n" - "\tcmp r4, 0x10\n" - "\tbne _080FFFF4\n" - "_080FFF0A:\n" - "\tadds r0, r7, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r7, r0, 24\n" - "\tldr r3, [sp, 0x8]\n" - "\tcmp r7, r3\n" - "\tbcc _080FFE78\n" - "\tb _08100024\n" - "\t.align 2, 0\n" - "_080FFF18: .4byte gTasks\n" - "_080FFF1C:\n" - "\tmovs r6, 0\n" - "\tldr r0, [sp, 0x4]\n" - "\tcmp r6, r0\n" - "\tbcc _080FFF26\n" - "\tb _08100024\n" - "_080FFF26:\n" - "\tmov r1, r10\n" - "\tlsls r0, r1, 2\n" - "\tadd r0, r10\n" - "\tlsls r1, r0, 3\n" - "\tldr r2, _080FFF9C @ =gTasks\n" - "\tadds r0, r1, r2\n" - "\tldrh r0, [r0, 0xA]\n" - "\tsubs r0, r6\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tmov r9, r0\n" - "\tmovs r7, 0\n" - "\tldr r3, [sp, 0x8]\n" - "\tcmp r7, r3\n" - "\tbcs _080FFF8C\n" - "\tadds r0, r2, 0\n" - "\tadds r1, r0\n" - "\tmov r8, r1\n" - "\tmov r1, r9\n" - "\tlsls r0, r1, 16\n" - "\tasrs r5, r0, 16\n" - "_080FFF50:\n" - "\tmov r2, r8\n" - "\tldrh r0, [r2, 0x8]\n" - "\tadds r0, r7\n" - "\tlsls r0, 16\n" - "\tasrs r4, r0, 16\n" - "\tadds r0, r4, 0\n" - "\tadds r1, r5, 0\n" - "\tbl MapGridGetMetatileBehaviorAt\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tbl MetatileBehavior_IsSecretBaseNorthWall\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbeq _080FFFF4\n" - "\tadds r0, r4, 0\n" - "\tadds r1, r5, 0x1\n" - "\tbl MapGridGetMetatileIdAt\n" - "\tmovs r1, 0xA3\n" - "\tlsls r1, 2\n" - "\tcmp r0, r1\n" - "\tbeq _080FFFF4\n" - "\tadds r0, r7, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r7, r0, 24\n" - "\tldr r3, [sp, 0x8]\n" - "\tcmp r7, r3\n" - "\tbcc _080FFF50\n" - "_080FFF8C:\n" - "\tadds r0, r6, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r6, r0, 24\n" - "\tldr r0, [sp, 0x4]\n" - "\tcmp r6, r0\n" - "\tbcc _080FFF26\n" - "\tb _08100024\n" - "\t.align 2, 0\n" - "_080FFF9C: .4byte gTasks\n" - "_080FFFA0:\n" - "\tmov r3, r10\n" - "\tlsls r1, r3, 2\n" - "\tadds r0, r1, r3\n" - "\tlsls r0, 3\n" - "\tadds r0, r2\n" - "\tldrh r0, [r0, 0xA]\n" - "\tmov r9, r0\n" - "\tmovs r7, 0\n" - "\tstr r1, [sp, 0x1C]\n" - "\tldr r0, [sp, 0x8]\n" - "\tcmp r7, r0\n" - "\tbcs _08100024\n" - "\tadds r6, r2, 0\n" - "\tmov r1, r9\n" - "\tlsls r1, 16\n" - "\tstr r1, [sp, 0x20]\n" - "_080FFFC0:\n" - "\tldr r0, [sp, 0x1C]\n" - "\tadd r0, r10\n" - "\tlsls r0, 3\n" - "\tadds r0, r6\n" - "\tldrh r0, [r0, 0x8]\n" - "\tadds r0, r7\n" - "\tlsls r0, 16\n" - "\tlsrs r5, r0, 16\n" - "\tasrs r0, 16\n" - "\tmov r2, r9\n" - "\tlsls r1, r2, 16\n" - "\tasrs r1, 16\n" - "\tbl MapGridGetMetatileBehaviorAt\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "\tldr r3, [sp]\n" - "\tldrb r0, [r3, 0x12]\n" - "\tcmp r0, 0x5\n" - "\tbne _080FFFF8\n" - "_080FFFE8:\n" - "\tadds r0, r4, 0\n" - "\tbl MetatileBehavior_IsLargeMatCenter\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbne _08100004\n" - "_080FFFF4:\n" - "\tmovs r0, 0\n" - "\tb _08100026\n" - "_080FFFF8:\n" - "\tadds r0, r4, 0\n" - "\tbl MetatileBehavior_IsSecretBaseLargeMatEdge\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbeq _080FFFE8\n" - "_08100004:\n" - "\tadds r0, r5, 0\n" - "\tldr r2, [sp, 0x20]\n" - "\tlsrs r1, r2, 16\n" - "\tmovs r2, 0\n" - "\tbl GetObjectEventIdByXYZ\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x10\n" - "\tbne _080FFFF4\n" - "\tadds r0, r7, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r7, r0, 24\n" - "\tldr r3, [sp, 0x8]\n" - "\tcmp r7, r3\n" - "\tbcc _080FFFC0\n" - "_08100024:\n" - "\tmovs r0, 0x1\n" - "_08100026:\n" - "\tadd sp, 0x24\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r1}\n" - "\tbx r1\n" - ".syntax divided\n"); -} -#endif void sub_8100038(u8 taskId) { @@ -3967,131 +3431,42 @@ void sub_81013B8(u8 a0, u8 a1, u8 a2, u8 a3) } } -#ifdef NONMATCHING void sub_8101460(u8 taskId) { u8 i; u8 xOff; u8 yOff; + u8 var1; + u32 var2; + gUnknown_02039234 = 0; if (sub_8101340(taskId) != TRUE) { - for (i=0; i<ewram_1f000.size; i++) + for (i = 0; i < ewram_1f000.size; i++) { - if (ewram_1f000.items[i] == 0) // This is using the wrong register! - { - continue; - } - sub_8101118(ewram_1f000.items[i], gUnknown_020391B4); - if (sub_8101200(taskId, i, gUnknown_020391B4) == TRUE) + var1 = ewram_1f000.items[i]; + if (var1 != 0) { - gUnknown_020391B4[0].decorId = i; - gUnknown_02039234++; - break; + sub_8101118(var1, gUnknown_020391B4); + if (sub_8101200(taskId, i, gUnknown_020391B4) == TRUE) + { + gUnknown_020391B4[0].decorId = i; + gUnknown_02039234++; + break; + } } } if (gUnknown_02039234 != 0) { xOff = ewram_1f000.pos[gUnknown_020391B4[0].decorId] >> 4; yOff = ewram_1f000.pos[gUnknown_020391B4[0].decorId] & 0xf; - sub_81013B8(xOff, yOff - gUnknown_020391B4[0].height + 1, xOff + gUnknown_020391B4[0].width - 1, yOff); + var1 = yOff - gUnknown_020391B4[0].height + 1; + var2 = gUnknown_020391B4[0].width + xOff - 1; + + sub_81013B8(xOff, var1, var2, yOff); } } } -#else -NAKED -void sub_8101460(u8 taskId) -{ - asm(".syntax unified\n" - "\tpush {r4-r7,lr}\n" - "\tlsls r0, 24\n" - "\tlsrs r6, r0, 24\n" - "\tldr r4, _081014B8 @ =gUnknown_02039234\n" - "\tmovs r0, 0\n" - "\tstrb r0, [r4]\n" - "\tadds r0, r6, 0\n" - "\tbl sub_8101340\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x1\n" - "\tbeq _08101504\n" - "\tmovs r5, 0\n" - "\tldr r0, _081014BC @ =ewram_1f000\n" - "\tldrb r1, [r0, 0x8]\n" - "\tcmp r5, r1\n" - "\tbcs _081014D2\n" - "\tadds r7, r4, 0\n" - "_08101486:\n" - "\tldr r0, [r0]\n" - "\tadds r0, r5\n" - "\tldrb r1, [r0] @ compiler incorrectly uses r0 for this and the next instruction\n" - "\tcmp r1, 0\n" - "\tbeq _081014C4\n" - "\tldr r4, _081014C0 @ =gUnknown_020391B4\n" - "\tadds r0, r1, 0\n" - "\tadds r1, r4, 0\n" - "\tbl sub_8101118\n" - "\tadds r0, r6, 0\n" - "\tadds r1, r5, 0\n" - "\tadds r2, r4, 0\n" - "\tbl sub_8101200\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x1\n" - "\tbne _081014C4\n" - "\tstrb r5, [r4]\n" - "\tldrb r0, [r7]\n" - "\tadds r0, 0x1\n" - "\tstrb r0, [r7]\n" - "\tb _081014D2\n" - "\t.align 2, 0\n" - "_081014B8: .4byte gUnknown_02039234\n" - "_081014BC: .4byte 0x201f000\n" - "_081014C0: .4byte gUnknown_020391B4\n" - "_081014C4:\n" - "\tadds r0, r5, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r5, r0, 24\n" - "\tldr r0, _0810150C @ =ewram_1f000\n" - "\tldrb r1, [r0, 0x8]\n" - "\tcmp r5, r1\n" - "\tbcc _08101486\n" - "_081014D2:\n" - "\tldr r0, _08101510 @ =gUnknown_02039234\n" - "\tldrb r0, [r0]\n" - "\tcmp r0, 0\n" - "\tbeq _08101504\n" - "\tldr r0, _0810150C @ =ewram_1f000\n" - "\tldr r2, _08101514 @ =gUnknown_020391B4\n" - "\tldrb r1, [r2]\n" - "\tldr r0, [r0, 0x4]\n" - "\tadds r0, r1\n" - "\tldrb r1, [r0]\n" - "\tlsrs r0, r1, 4\n" - "\tmovs r3, 0xF\n" - "\tands r3, r1\n" - "\tldrb r1, [r2, 0x2]\n" - "\tsubs r1, r3, r1\n" - "\tadds r1, 0x1\n" - "\tlsls r1, 24\n" - "\tlsrs r1, 24\n" - "\tldrb r2, [r2, 0x1]\n" - "\tadds r2, r0\n" - "\tsubs r2, 0x1\n" - "\tlsls r2, 24\n" - "\tlsrs r2, 24\n" - "\tbl sub_81013B8\n" - "_08101504:\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_0810150C: .4byte 0x201f000\n" - "_08101510: .4byte gUnknown_02039234\n" - "_08101514: .4byte gUnknown_020391B4\n" - ".syntax divided\n"); -} -#endif void sub_8101518(u8 taskId) { diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index cd6e67c8c..cb0bf760f 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -681,24 +681,16 @@ void SetPlayerAvatarTransitionFlags(u16 a) static void DoPlayerAvatarTransition(void) { u8 i; - u32 flags = gPlayerAvatar.unk1; + u8 flags = gPlayerAvatar.unk1; if (flags != 0) { - for (i = 0; i < 8; i++, flags >>= 1) + for (i = 0; i < ARRAY_COUNT(gUnknown_0830FC14); i++, flags >>= 1) { -#ifdef NONMATCHING if (flags & 1) { gUnknown_0830FC14[i](&gObjectEvents[gPlayerAvatar.objectEventId]); } -#else - if (flags & 1) - { - register void (*const *funcs)(struct ObjectEvent *) asm("r0") = gUnknown_0830FC14; - funcs[i](&gObjectEvents[gPlayerAvatar.objectEventId]); - } -#endif } gPlayerAvatar.unk1 = 0; } diff --git a/src/field_tasks.c b/src/field_tasks.c index a56de5746..abc4e1505 100644 --- a/src/field_tasks.c +++ b/src/field_tasks.c @@ -147,46 +147,46 @@ void ResetFieldTasksArgs(void) } } -const struct MetatileOffset gUnknown_08376384[][2] = { - {{ 0, 0, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Vertical0)}, { 0, 1, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Vertical1)}}, - {{ 0, -1, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Vertical0)}, { 0, 0, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Vertical1)}}, - {{ 0, 0, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Horizontal0)}, { 1, 0, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Horizontal1)}}, - {{ -1, 0, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Horizontal0)}, { 0, 0, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Horizontal1)}} +const struct MetatileOffset gUnknown_08376384[] = { + { 0, 0, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Vertical0)}, {0, 1, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Vertical1)}, + { 0, -1, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Vertical0)}, {0, 0, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Vertical1)}, + { 0, 0, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Horizontal0)}, {1, 0, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Horizontal1)}, + {-1, 0, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Horizontal0)}, {0, 0, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Horizontal1)} }; -const struct MetatileOffset gUnknown_083763A4[][2] = { - {{ 0, 0, METATILE_ID(Pacifidlog, SubmergedLogs_Vertical0)}, { 0, 1, METATILE_ID(Pacifidlog, SubmergedLogs_Vertical1)}}, - {{ 0, -1, METATILE_ID(Pacifidlog, SubmergedLogs_Vertical0)}, { 0, 0, METATILE_ID(Pacifidlog, SubmergedLogs_Vertical1)}}, - {{ 0, 0, METATILE_ID(Pacifidlog, SubmergedLogs_Horizontal0)}, { 1, 0, METATILE_ID(Pacifidlog, SubmergedLogs_Horizontal1)}}, - {{ -1, 0, METATILE_ID(Pacifidlog, SubmergedLogs_Horizontal0)}, { 0, 0, METATILE_ID(Pacifidlog, SubmergedLogs_Horizontal1)}} +const struct MetatileOffset gUnknown_083763A4[] = { + { 0, 0, METATILE_ID(Pacifidlog, SubmergedLogs_Vertical0)}, {0, 1, METATILE_ID(Pacifidlog, SubmergedLogs_Vertical1)}, + { 0, -1, METATILE_ID(Pacifidlog, SubmergedLogs_Vertical0)}, {0, 0, METATILE_ID(Pacifidlog, SubmergedLogs_Vertical1)}, + { 0, 0, METATILE_ID(Pacifidlog, SubmergedLogs_Horizontal0)}, {1, 0, METATILE_ID(Pacifidlog, SubmergedLogs_Horizontal1)}, + {-1, 0, METATILE_ID(Pacifidlog, SubmergedLogs_Horizontal0)}, {0, 0, METATILE_ID(Pacifidlog, SubmergedLogs_Horizontal1)} }; -const struct MetatileOffset gUnknown_083763C4[][2] = { - {{ 0, 0, METATILE_ID(Pacifidlog, FloatingLogs_Vertical0)}, { 0, 1, METATILE_ID(Pacifidlog, FloatingLogs_Vertical1)}}, - {{ 0, -1, METATILE_ID(Pacifidlog, FloatingLogs_Vertical0)}, { 0, 0, METATILE_ID(Pacifidlog, FloatingLogs_Vertical1)}}, - {{ 0, 0, METATILE_ID(Pacifidlog, FloatingLogs_Horizontal0)}, { 1, 0, METATILE_ID(Pacifidlog, FloatingLogs_Horizontal1)}}, - {{ -1, 0, METATILE_ID(Pacifidlog, FloatingLogs_Horizontal0)}, { 0, 0, METATILE_ID(Pacifidlog, FloatingLogs_Horizontal1)}} +const struct MetatileOffset gUnknown_083763C4[] = { + { 0, 0, METATILE_ID(Pacifidlog, FloatingLogs_Vertical0)}, {0, 1, METATILE_ID(Pacifidlog, FloatingLogs_Vertical1)}, + { 0, -1, METATILE_ID(Pacifidlog, FloatingLogs_Vertical0)}, {0, 0, METATILE_ID(Pacifidlog, FloatingLogs_Vertical1)}, + { 0, 0, METATILE_ID(Pacifidlog, FloatingLogs_Horizontal0)}, {1, 0, METATILE_ID(Pacifidlog, FloatingLogs_Horizontal1)}, + {-1, 0, METATILE_ID(Pacifidlog, FloatingLogs_Horizontal0)}, {0, 0, METATILE_ID(Pacifidlog, FloatingLogs_Horizontal1)} }; void DummyPerStepCallback(u8 taskId) {} -const struct MetatileOffset *sub_80695E0(const struct MetatileOffset a0[][2], s8 a1) +const struct MetatileOffset *sub_80695E0(const struct MetatileOffset *a0, u16 a1) { if (MetatileBehavior_IsPacifidlogVerticalLog1(a1)) { - return a0[0]; + return &a0[0 * 2]; } else if (MetatileBehavior_IsPacifidlogVerticalLog2(a1)) { - return a0[1]; + return &a0[1 * 2]; } else if (MetatileBehavior_IsPacifidlogHorizontalLog1(a1)) { - return a0[2]; + return &a0[2 * 2]; } else if (MetatileBehavior_IsPacifidlogHorizontalLog2(a1)) { - return a0[3]; + return &a0[3 * 2]; } else { @@ -194,95 +194,23 @@ const struct MetatileOffset *sub_80695E0(const struct MetatileOffset a0[][2], s8 } } -#ifdef NONMATCHING -void sub_8069638(const struct MetatileOffset offsets[][2], s16 x, s16 y, bool32 flag) +void sub_8069638(const struct MetatileOffset *offsets, s16 x, s16 y, bool32 flag) { - const struct MetatileOffset *offsetData = sub_80695E0(offsets, MapGridGetMetatileBehaviorAt(x, y)); - const struct MetatileOffset *offsetdata2 = offsetData; - if (offsetData != NULL) + offsets = sub_80695E0(offsets, MapGridGetMetatileBehaviorAt(x, y)); + if (offsets) { - MapGridSetMetatileIdAt(x + offsetData[0].x, y + offsetData[0].y, offsetData[0].tileId); + MapGridSetMetatileIdAt(x + offsets[0].x, y + offsets[0].y, offsets[0].tileId); if (flag) { - CurrentMapDrawMetatileAt(x + offsetData[0].x, y + offsetData[0].y); + CurrentMapDrawMetatileAt(x + offsets[0].x, y + offsets[0].y); } - MapGridSetMetatileIdAt(x + offsetdata2[1].x, y + offsetdata2[1].y, offsetdata2[1].tileId); + MapGridSetMetatileIdAt(x + offsets[1].x, y + offsets[1].y, offsets[1].tileId); if (flag) { - CurrentMapDrawMetatileAt(x + offsetdata2[1].x, y + offsetdata2[1].y); + CurrentMapDrawMetatileAt(x + offsets[1].x, y + offsets[1].y); } } } -#else -NAKED -void sub_8069638(const struct MetatileOffset offsets[][2], s16 x, s16 y, bool32 flag) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r8\n" - "\tpush {r7}\n" - "\tadds r5, r0, 0\n" - "\tmov r8, r3\n" - "\tlsls r1, 16\n" - "\tasrs r6, r1, 16\n" - "\tlsls r2, 16\n" - "\tasrs r7, r2, 16\n" - "\tadds r0, r6, 0\n" - "\tadds r1, r7, 0\n" - "\tbl MapGridGetMetatileBehaviorAt\n" - "\tadds r1, r0, 0\n" - "\tlsls r1, 16\n" - "\tlsrs r1, 16\n" - "\tadds r0, r5, 0\n" - "\tbl sub_80695E0\n" - "\tadds r4, r0, 0\n" - "\tadds r5, r4, 0\n" - "\tcmp r4, 0\n" - "\tbeq _080696B6\n" - "\tmovs r0, 0\n" - "\tldrsb r0, [r4, r0]\n" - "\tadds r0, r6, r0\n" - "\tmovs r1, 0x1\n" - "\tldrsb r1, [r4, r1]\n" - "\tadds r1, r7, r1\n" - "\tldrh r2, [r4, 0x2]\n" - "\tbl MapGridSetMetatileIdAt\n" - "\tmov r0, r8\n" - "\tcmp r0, 0\n" - "\tbeq _0806968E\n" - "\tmovs r0, 0\n" - "\tldrsb r0, [r4, r0]\n" - "\tadds r0, r6, r0\n" - "\tmovs r1, 0x1\n" - "\tldrsb r1, [r4, r1]\n" - "\tadds r1, r7, r1\n" - "\tbl CurrentMapDrawMetatileAt\n" - "_0806968E:\n" - "\tmovs r0, 0x4\n" - "\tldrsb r0, [r5, r0]\n" - "\tadds r0, r6, r0\n" - "\tmovs r1, 0x5\n" - "\tldrsb r1, [r5, r1]\n" - "\tadds r1, r7, r1\n" - "\tldrh r2, [r5, 0x6]\n" - "\tbl MapGridSetMetatileIdAt\n" - "\tmov r0, r8\n" - "\tcmp r0, 0\n" - "\tbeq _080696B6\n" - "\tmovs r0, 0x4\n" - "\tldrsb r0, [r5, r0]\n" - "\tadds r0, r6, r0\n" - "\tmovs r1, 0x5\n" - "\tldrsb r1, [r5, r1]\n" - "\tadds r1, r7, r1\n" - "\tbl CurrentMapDrawMetatileAt\n" - "_080696B6:\n" - "\tpop {r3}\n" - "\tmov r8, r3\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0"); -} -#endif void sub_80696C0(s16 x, s16 y, bool32 flag) { diff --git a/src/fieldmap.c b/src/fieldmap.c index 6ba284810..8be4b217c 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -460,7 +460,7 @@ void MapGridSetMetatileEntryAt(int x, int y, u16 metatile) } } -u32 GetBehaviorByMetatileId(u16 metatile) +u16 GetBehaviorByMetatileId(u16 metatile) { u16 *attributes; if (metatile < NUM_METATILES_IN_PRIMARY) diff --git a/src/libs/agb_flash_mx.c b/src/libs/agb_flash_mx.c index b4f710f36..5e2b0bce1 100644 --- a/src/libs/agb_flash_mx.c +++ b/src/libs/agb_flash_mx.c @@ -26,7 +26,7 @@ const struct FlashSetupInfo MX29L010 = 0 // appears to be unused }, { 3, 1 }, // wait state setup data -#if defined(GERMAN) && defined(SAPPHIRE) +#if (GERMAN && SAPPHIRE && !DEBUG) // OK, why !DEBUG? { { 0xBF, 0xD4 } } // ID #else { { 0xC2, 0x09 } } // ID diff --git a/src/main.c b/src/main.c index 433143b38..d8779b90c 100644 --- a/src/main.c +++ b/src/main.c @@ -27,12 +27,11 @@ static void IntrDummy(void); const u8 gGameVersion = GAME_VERSION; const u8 gGameLanguage = GAME_LANGUAGE; -// The debug menu expects this exact format. With the English build string, it -// will overflow on the title debug menu, outputting '9999ィ'. -#if defined(GERMAN) || DEBUG -const char BuildDateTime[] = "$Name: debug-Euro-2003-05-09-A $"; -#elif defined(ENGLISH) -const char BuildDateTime[] = "2002 10 15 20:34"; +// International versions of the debug menu use a different format. +#if defined(ENGLISH) +const u8 BuildDateTime[] = "2002 10 15 20:34"; +#elif defined(GERMAN) +const u8 BuildDateTime[] = "$Name: debug-Euro-2003-05-09-A $"; #endif const IntrFunc gIntrTableTemplate[] = diff --git a/src/mauville_man.c b/src/mauville_man.c index 6fa00b19e..96de37c79 100644 --- a/src/mauville_man.c +++ b/src/mauville_man.c @@ -707,9 +707,6 @@ static void Task_BardSong(u8 taskId) struct MauvilleManBard *bard = &gSaveBlock1.mauvilleMan.bard; u8 *str = gStringVar4 + task->tCharIndex; u16 wordLen = 0; - // Can't get it to match without hacking - u32 temp; - register s16 zero asm("r1"); while (*str != CHAR_SPACE && *str != CHAR_NEWLINE @@ -723,17 +720,20 @@ static void Task_BardSong(u8 taskId) gUnknown_020388BC = MACRO1(bard->songLyrics[task->tCurrWord]); else gUnknown_020388BC = MACRO1(bard->temporaryLyrics[task->tCurrWord]); - temp = gUnknown_03005DA0.var04 / wordLen; - zero = 0; - gUnknown_03005DA0.var04 = temp; + gUnknown_03005DA0.var04 /= wordLen; if (gUnknown_03005DA0.var04 <= 0) gUnknown_03005DA0.var04 = 1; task->tCurrWord++; if (task->data[2] == 0) + { task->tState = 3; + task->data[1] = 0; + } else + { task->tState = 5; - task->data[1] = zero; + task->data[1] = 0; + } } break; case 5: diff --git a/src/money.c b/src/money.c index 53800f854..bf93f6dd1 100644 --- a/src/money.c +++ b/src/money.c @@ -176,8 +176,32 @@ void sub_80B7AEC(u32 arg0, u8 right, u8 top) #endif } +#ifdef NONMATCHING +void Draw10000Sprite(u8 var1, u8 var2, s32 var3) +{ + // 2D/3D array manipulation off the wazoo. + // Converting to 2D/3D array casts makes it match less! + u16 i; + + CpuFastSet( + (void*)&gDecoration10000_Gfx[var3 * 0x100], + (void*)(VRAM + 0x8000 + (var2 * 0x3c0) + ((var1 + 1) * 0x20)), + 32); + CpuFastSet( + (void*)&gDecoration10000_Gfx[var3 * 0x100 + 0x80], + (void*)(VRAM + 0x8000 + ((var2 + 1) * 0x3c0) + ((var1 + 1) * 0x20)), + 32); + + for (i = 0; i < 4; i++) + { + u32 base = var2 * 0x20 + var1 + i; + ((u16 *)(VRAM + 0xF800))[base] = var2 * 0x1e + 1 + var1 + (u16)-4096; + ((u16 *)(VRAM + 0xF840))[base] = (var2 + 1) * 0x1e + 1 + var1 + (u16)-4096; + }; +} +#else NAKED -void Draw10000Sprite(u8 var1, u8 var2, int var3) +void Draw10000Sprite(u8 var1, u8 var2, s32 var3) { asm(".syntax unified\n\ push {r4-r7,lr}\n\ @@ -269,6 +293,7 @@ _080B7BE4: .4byte 0x0600f800\n\ _080B7BE8: .4byte 0x0600f840\n\ .syntax divided\n"); } +#endif void UpdateMoneyWindow(u32 amount, u8 x, u8 y) { diff --git a/src/pokemon_1.c b/src/pokemon_1.c index 1883c8754..aeeb6080d 100644 --- a/src/pokemon_1.c +++ b/src/pokemon_1.c @@ -1764,6 +1764,8 @@ void CalculateMonStats(struct Pokemon *mon) } #if DEBUG +// TODO: check other revisions +#if !(ENGLISH && REVISION == 0) void Nakamura_NakaGenderTest_RecalcStats(struct Pokemon *mon) { s32 currentHP = GetMonData(mon, MON_DATA_HP, NULL); @@ -1809,6 +1811,7 @@ void Nakamura_NakaGenderTest_RecalcStats(struct Pokemon *mon) SetMonData(mon, MON_DATA_HP, ¤tHP); } #endif +#endif void ExpandBoxMon(const struct BoxPokemon *src, struct Pokemon *dest) { diff --git a/src/pokemon_storage_system_4.c b/src/pokemon_storage_system_4.c index db35d60ea..6a1b78192 100644 --- a/src/pokemon_storage_system_4.c +++ b/src/pokemon_storage_system_4.c @@ -46,8 +46,8 @@ EWRAM_DATA struct UnkStruct_2000020 *gUnknown_020384EC = NULL; void sub_809900C(u8 boxId, s8 a1); s8 sub_8099D90(u8 boxId); void sub_8099EB0(u8 boxId, s8 a1); -void sub_8099F58(u16 *vdest, const u16 *src, s8 a2, u8 a3); -void sub_809A14C(u16 *vdest); +void CopyWallpaperTilemap(u16 *buffer, const u16 *tilemap, s8 direction, u8 offset); +void ClearLowestWallpaperTiles(u16 *buffer); void sub_809A23C(u8 boxId); void sub_809A3D0(u8 boxId, s8 a1); void sub_809A598(void); @@ -444,448 +444,169 @@ void sub_8099EB0(u8 boxId, s8 a1) if (a1) { gPokemonStorageSystemPtr->unk_08ba = gPokemonStorageSystemPtr->unk_08ba ? FALSE : TRUE; - sub_809A14C(BG_SCREEN_ADDR(26)); + ClearLowestWallpaperTiles(BG_SCREEN_ADDR(26)); } wallpaperTable = gWallpaperTable +gPokemonStorage.wallpaper[boxId]; LoadPalette(wallpaperTable->palettes, gPokemonStorageSystemPtr->unk_08ba * 0x30 + 0x40, 0x60); LZ77UnCompWram(wallpaperTable->tileMap, gPokemonStorageSystemPtr->unk_0d62); - sub_8099F58(BG_SCREEN_ADDR(26), gPokemonStorageSystemPtr->unk_0d62, a1, gPokemonStorageSystemPtr->unk_08ba); + CopyWallpaperTilemap(BG_SCREEN_ADDR(26), gPokemonStorageSystemPtr->unk_0d62, a1, gPokemonStorageSystemPtr->unk_08ba); LZ77UnCompVram(wallpaperTable->tiles, BG_CHAR_ADDR(2) + (gPokemonStorageSystemPtr->unk_08ba << 13)); } -#ifdef NONMATCHING -void sub_8099F58(u16 *vdest, const u16 *src, s8 a2, u8 a3) +/* + Copies the wallpaper rectangle tilemap to a buffer, + depending on the wallpaper type. + + - buffer : Where to copy the wallpaper to. + - tilemap : The wallpaper tilemap to copy. + - direction : The direction of the wallpaper. + - offset : The offset of the wallpaper tilemap. + + Also depends on stored BG2 X variable in PSS. +*/ +void CopyWallpaperTilemap(u16 *buffer, const u16 *tilemap, s8 direction, u8 offset) { - s16 r6; - s16 r3; - u16 sp0 = a3 << 8; - u16 sp4 = (a3 * 3 + 4) << 12; - u16 *r4; - u16 *r7; - u16 i; - u16 j; - s16 sp8 = ((gPokemonStorageSystemPtr->unk_08b4 >> 3) + 10 + a2 * 24) & 0x3f; - if (sp8 < 13) + u16 *dest; // For either all of the wallpaper tilemap, or the first half of it. + u16 *dest2; // The second half of wallpaper tilemap; used in case of two halves. + u16 *fillDest; // For blanking; used when direction is set. + + u16 x, y; // Temps for copying the tilemap. + + // Temps for copying the tile and palette metadata of the wallpaper. + u16 tileMeta; + u16 tileOffset = offset * 256; + u16 paletteMeta; + u16 paletteOffset = (offset * 3 + 4) << 12; + + s16 rectWidth; // The width of the wallpaper, or it's first half. + s16 rectWidth2; // Used in case of two halves. + s16 rectX = ((gPokemonStorageSystemPtr->unk_08b4 / 8 + 10) + (direction * 24)) & 0x3F; + + s16 fillX; // For blanking; used when direction is set. + + /* + Bull**** agbcc behavior discovered here + while attempting to match this function: + x + (y + z) is NOT the same as x + y + z. + Even though it SHOULDN'T make a difference. + + Rather, it's the same as x + z + y. That's + old codegen for you. + */ + if (rectX < 13) { - r6 = 20; - r3 = 0; - r4 = vdest + sp8 + 0x40; - r7 = NULL; + // Copy the wallpaper in full. + rectWidth = 20; + rectWidth2 = 0; + dest = buffer + (rectX + 64); + dest2 = NULL; } - else if (sp8 < 32) + else if (rectX < 32) { - r6 = 32 - sp8; - r3 = 20 - r6; - r4 = vdest + sp8 + 0x40; - r7 = vdest + 0x440; + // Split copying the wallpaper into two operations. + rectWidth = 32 - rectX; + rectWidth2 = 20 - rectWidth; + dest = buffer + (rectX + 64); + dest2 = buffer + 0x440; } - else if (sp8 < 45) + else if (rectX < 45) { - r6 = 20; - r3 = 0; - r4 = vdest + sp8 + 0x420; - r7 = NULL; + // Copy the wallpaper in full. + rectWidth = 20; + rectWidth2 = 0; + dest = buffer + (rectX + 0x420); + dest2 = NULL; } else { - r6 = 64 - sp8; - r3 = 20 - r6; - r4 = vdest + sp8 + 0x420; - r7 = vdest + 0x40; + // Split copying the wallpaper into two operations. + rectWidth = 64 - rectX; + rectWidth2 = 20 - rectWidth; + dest = buffer + (rectX + 0x420); + dest2 = buffer + 0x40; } - for (i = 0; i < 18; i++) + + for (y = 0; y < 18; y++) { - for (j = 0; j < r6; j++) + for(x = 0; x < rectWidth; x++) { - u16 tile = ((*src & 0xfff) + sp0) | ((*src & 0xf000) + sp4); - r4[j] = tile; - src++; + // Get the tile and palette metadata for each + // 2 bytes, and copy over into the buffer. + tileMeta = (*tilemap & 0xfff) + tileOffset; + paletteMeta = (*tilemap & 0xf000) + paletteOffset; + dest[x] = paletteMeta | tileMeta; + tilemap++; } - for (j = 0; j < r3; j++) + for(x = 0; x < rectWidth2; x++) { - u16 tile = ((*src & 0xfff) + sp0) | ((*src & 0xf000) + sp4); - r7[j] = tile; - src++; + // Repeat the same process again in case we need + // to copy halves. + tileMeta = (*tilemap & 0xfff) + tileOffset; + paletteMeta = (*tilemap & 0xf000) + paletteOffset; + dest2[x] = paletteMeta | tileMeta; + tilemap++; } - r4 += 0x20; - r7 += 0x20; + dest += 0x20; + dest2 += 0x20; } - if (a2) + + if (direction != 0) { - s16 r4_2; - u16 *r2; - if (a2 > 0) - r4_2 = (sp8 + 20) & 0x3f; + fillX = (direction > 0 ? rectX + 20 : rectX - 4) & 0x3F; + + if(fillX < 32) + fillDest = buffer + (fillX + 0x40); else - r4_2 = (sp8 - 4) & 0x3f; - r2 = r4_2 < 0x20 ? vdest + r4_2 + 0x40 : vdest + r4_2 + 0x420; - for (i = 0; i < 4; i++) + fillDest = buffer + (fillX + 0x420); + + for(x = 0; x < 4; x++) { - for (j = 0; j < 18; j++) + for(y = 0; y < 18; y++) { - *r2 = 0; - r2 += 0x20; + *fillDest = 0; // Blank the buffer. + fillDest += 0x20; } - r4_2++; - r4_2 &= 0x3f; - r2 = r4_2 < 0x20 ? vdest + r4_2 + 0x40 : vdest + r4_2 + 0x420; + // Needs to be one statement, or else it won't match. + // fillX = ++fillX & 0x3F; matches, but to have consistency + // with ClearLowestWallpaperTiles, which requires var + 1 + // instead for a similar operation, we'll use that. + fillX = (fillX + 1) & 0x3F; + + if (fillX < 32) + fillDest = buffer + (fillX + 0x40); + else + fillDest = buffer + (fillX + 0x420); } } } -#else -NAKED void sub_8099F58(u16 *vdest, const u16 *src, s8 a2, u8 a3) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0x20\n" - "\tmov r9, r0\n" - "\tadds r5, r1, 0\n" - "\tlsls r2, 24\n" - "\tlsls r3, 24\n" - "\tlsrs r3, 24\n" - "\tlsls r0, r3, 8\n" - "\tstr r0, [sp]\n" - "\tlsls r0, r3, 1\n" - "\tadds r0, r3\n" - "\tadds r0, 0x4\n" - "\tlsls r0, 28\n" - "\tlsrs r0, 16\n" - "\tstr r0, [sp, 0x4]\n" - "\tldr r0, _08099FB8 @ =gPokemonStorageSystemPtr\n" - "\tldr r0, [r0]\n" - "\tldr r1, _08099FBC @ =0x000008b4\n" - "\tadds r0, r1\n" - "\tldrh r1, [r0]\n" - "\tlsrs r1, 3\n" - "\tadds r1, 0xA\n" - "\tlsrs r0, r2, 24\n" - "\tmov r8, r0\n" - "\tasrs r2, 24\n" - "\tlsls r0, r2, 1\n" - "\tadds r0, r2\n" - "\tlsls r0, 3\n" - "\tadds r1, r0\n" - "\tmovs r0, 0x3F\n" - "\tands r1, r0\n" - "\tstr r1, [sp, 0x8]\n" - "\tadds r2, r1, 0\n" - "\tcmp r2, 0xC\n" - "\tbgt _08099FC0\n" - "\tmovs r6, 0x14\n" - "\tmovs r3, 0\n" - "\tlsls r0, r2, 1\n" - "\tadds r0, 0x80\n" - "\tmov r1, r9\n" - "\tadds r4, r1, r0\n" - "\tmovs r7, 0\n" - "\tb _0809A020\n" - "\t.align 2, 0\n" - "_08099FB8: .4byte gPokemonStorageSystemPtr\n" - "_08099FBC: .4byte 0x000008b4\n" - "_08099FC0:\n" - "\tcmp r2, 0x1F\n" - "\tbgt _08099FE6\n" - "\tmovs r0, 0x20\n" - "\tsubs r0, r2\n" - "\tlsls r0, 16\n" - "\tmovs r1, 0x14\n" - "\tlsrs r6, r0, 16\n" - "\tasrs r0, 16\n" - "\tsubs r1, r0\n" - "\tlsls r1, 16\n" - "\tlsrs r3, r1, 16\n" - "\tlsls r0, r2, 1\n" - "\tadds r0, 0x80\n" - "\tmov r2, r9\n" - "\tadds r4, r2, r0\n" - "\tmovs r7, 0x88\n" - "\tlsls r7, 4\n" - "\tadd r7, r9\n" - "\tb _0809A020\n" - "_08099FE6:\n" - "\tcmp r2, 0x2C\n" - "\tbgt _08099FFE\n" - "\tmovs r6, 0x14\n" - "\tmovs r3, 0\n" - "\tlsls r0, r2, 1\n" - "\tmovs r1, 0x84\n" - "\tlsls r1, 4\n" - "\tadds r0, r1\n" - "\tmov r2, r9\n" - "\tadds r4, r2, r0\n" - "\tmovs r7, 0\n" - "\tb _0809A020\n" - "_08099FFE:\n" - "\tmovs r0, 0x40\n" - "\tsubs r0, r2\n" - "\tlsls r0, 16\n" - "\tmovs r1, 0x14\n" - "\tlsrs r6, r0, 16\n" - "\tasrs r0, 16\n" - "\tsubs r1, r0\n" - "\tlsls r1, 16\n" - "\tlsrs r3, r1, 16\n" - "\tlsls r0, r2, 1\n" - "\tmovs r1, 0x84\n" - "\tlsls r1, 4\n" - "\tadds r0, r1\n" - "\tmov r2, r9\n" - "\tadds r4, r2, r0\n" - "\tmov r7, r9\n" - "\tadds r7, 0x80\n" - "_0809A020:\n" - "\tmovs r1, 0\n" - "\tmov r0, r8\n" - "\tlsls r0, 24\n" - "\tstr r0, [sp, 0x14]\n" - "\tlsls r0, r6, 16\n" - "\tasrs r0, 16\n" - "\tmov r8, r0\n" - "\tlsls r3, 16\n" - "\tstr r3, [sp, 0xC]\n" - "\tasrs r2, r3, 16\n" - "\tstr r2, [sp, 0x10]\n" - "_0809A036:\n" - "\tmovs r3, 0\n" - "\tadds r0, r4, 0\n" - "\tadds r0, 0x40\n" - "\tstr r0, [sp, 0x18]\n" - "\tadds r2, r7, 0\n" - "\tadds r2, 0x40\n" - "\tstr r2, [sp, 0x1C]\n" - "\tadds r1, 0x1\n" - "\tmov r10, r1\n" - "\tcmp r3, r8\n" - "\tbge _0809A07A\n" - "\tldr r0, _0809A0D4 @ =0x00000fff\n" - "\tmov r12, r0\n" - "\tmovs r6, 0xF0\n" - "\tlsls r6, 8\n" - "_0809A054:\n" - "\tldrh r2, [r5]\n" - "\tmov r0, r12\n" - "\tands r0, r2\n" - "\tldr r1, [sp]\n" - "\tadds r0, r1, r0\n" - "\tadds r1, r6, 0\n" - "\tands r1, r2\n" - "\tldr r2, [sp, 0x4]\n" - "\tadds r1, r2, r1\n" - "\torrs r1, r0\n" - "\tlsls r0, r3, 1\n" - "\tadds r0, r4\n" - "\tstrh r1, [r0]\n" - "\tadds r5, 0x2\n" - "\tadds r0, r3, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r3, r0, 16\n" - "\tcmp r3, r8\n" - "\tblt _0809A054\n" - "_0809A07A:\n" - "\tmovs r3, 0\n" - "\tldr r0, [sp, 0x10]\n" - "\tcmp r3, r0\n" - "\tbge _0809A0B4\n" - "\tldr r1, _0809A0D4 @ =0x00000fff\n" - "\tmov r12, r1\n" - "\tmovs r6, 0xF0\n" - "\tlsls r6, 8\n" - "\tldr r2, [sp, 0xC]\n" - "\tasrs r4, r2, 16\n" - "_0809A08E:\n" - "\tldrh r2, [r5]\n" - "\tmov r0, r12\n" - "\tands r0, r2\n" - "\tldr r1, [sp]\n" - "\tadds r0, r1, r0\n" - "\tadds r1, r6, 0\n" - "\tands r1, r2\n" - "\tldr r2, [sp, 0x4]\n" - "\tadds r1, r2, r1\n" - "\torrs r1, r0\n" - "\tlsls r0, r3, 1\n" - "\tadds r0, r7\n" - "\tstrh r1, [r0]\n" - "\tadds r5, 0x2\n" - "\tadds r0, r3, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r3, r0, 16\n" - "\tcmp r3, r4\n" - "\tblt _0809A08E\n" - "_0809A0B4:\n" - "\tldr r4, [sp, 0x18]\n" - "\tldr r7, [sp, 0x1C]\n" - "\tmov r1, r10\n" - "\tlsls r0, r1, 16\n" - "\tlsrs r1, r0, 16\n" - "\tcmp r1, 0x11\n" - "\tbls _0809A036\n" - "\tldr r0, [sp, 0x14]\n" - "\tasrs r2, r0, 24\n" - "\tcmp r2, 0\n" - "\tbeq _0809A13A\n" - "\tcmp r2, 0\n" - "\tble _0809A0D8\n" - "\tldr r1, [sp, 0x8]\n" - "\tadds r1, 0x14\n" - "\tb _0809A0DC\n" - "\t.align 2, 0\n" - "_0809A0D4: .4byte 0x00000fff\n" - "_0809A0D8:\n" - "\tldr r1, [sp, 0x8]\n" - "\tsubs r1, 0x4\n" - "_0809A0DC:\n" - "\tmovs r0, 0x3F\n" - "\tands r1, r0\n" - "\tadds r4, r1, 0\n" - "\tadds r0, r4, 0\n" - "\tcmp r0, 0x1F\n" - "\tbgt _0809A0EE\n" - "\tlsls r0, 1\n" - "\tadds r0, 0x80\n" - "\tb _0809A0F6\n" - "_0809A0EE:\n" - "\tlsls r0, 1\n" - "\tmovs r2, 0x84\n" - "\tlsls r2, 4\n" - "\tadds r0, r2\n" - "_0809A0F6:\n" - "\tmov r1, r9\n" - "\tadds r2, r1, r0\n" - "\tmovs r3, 0\n" - "\tmovs r6, 0\n" - "_0809A0FE:\n" - "\tmovs r1, 0\n" - "\tadds r5, r3, 0x1\n" - "\tlsls r3, r4, 16\n" - "_0809A104:\n" - "\tstrh r6, [r2]\n" - "\tadds r2, 0x40\n" - "\tadds r0, r1, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r1, r0, 16\n" - "\tcmp r1, 0x11\n" - "\tbls _0809A104\n" - "\tasrs r0, r3, 16\n" - "\tadds r4, r0, 0x1\n" - "\tmovs r0, 0x3F\n" - "\tands r4, r0\n" - "\tadds r0, r4, 0\n" - "\tcmp r0, 0x1F\n" - "\tbgt _0809A126\n" - "\tlsls r0, 1\n" - "\tadds r0, 0x80\n" - "\tb _0809A12E\n" - "_0809A126:\n" - "\tlsls r0, 1\n" - "\tmovs r2, 0x84\n" - "\tlsls r2, 4\n" - "\tadds r0, r2\n" - "_0809A12E:\n" - "\tmov r1, r9\n" - "\tadds r2, r1, r0\n" - "\tlsls r0, r5, 16\n" - "\tlsrs r3, r0, 16\n" - "\tcmp r3, 0x3\n" - "\tbls _0809A0FE\n" - "_0809A13A:\n" - "\tadd sp, 0x20\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0"); -} -#endif -#ifdef NONMATCHING -void sub_809A14C(u16 *vdest) +/* + Clears the lowest line of a wallpaper buffer. + Depends on stored BG2 X variable in PSS. + + - buffer : Wallpaper buffer. +*/ +void ClearLowestWallpaperTiles(u16 *buffer) { - u16 *r2; - u16 i; - int r3 = ((gPokemonStorageSystemPtr->unk_08b4 >> 3) + 30) & 0x3f; - r2 = vdest + (r3 < 0x20 ? r3 + 0x260 : r3 + 0x640); - for (i = 0; i < 0x2b; i++) - { - *r2++ = 0; - r3++; - r3 &= 0x3f; - if (r3 == 0) - r2 -= 0x420; - if (r3 == 0x20) - r2 += 0x3e0; - } -} -#else -NAKED void sub_809A14C(u16 *vdest) -{ - asm_unified("\tpush {r4-r6,lr}\n" - "\tadds r2, r0, 0\n" - "\tldr r0, _0809A174 @ =gPokemonStorageSystemPtr\n" - "\tldr r0, [r0]\n" - "\tldr r1, _0809A178 @ =0x000008b4\n" - "\tadds r0, r1\n" - "\tldrh r0, [r0]\n" - "\tlsrs r0, 3\n" - "\tadds r3, r0, 0\n" - "\tadds r3, 0x1E\n" - "\tmovs r0, 0x3F\n" - "\tands r3, r0\n" - "\tadds r0, r3, 0\n" - "\tcmp r0, 0x1F\n" - "\tbgt _0809A17C\n" - "\tlsls r0, 1\n" - "\tmovs r6, 0x98\n" - "\tlsls r6, 3\n" - "\tadds r0, r6\n" - "\tb _0809A184\n" - "\t.align 2, 0\n" - "_0809A174: .4byte gPokemonStorageSystemPtr\n" - "_0809A178: .4byte 0x000008b4\n" - "_0809A17C:\n" - "\tlsls r0, 1\n" - "\tmovs r1, 0xC8\n" - "\tlsls r1, 4\n" - "\tadds r0, r1\n" - "_0809A184:\n" - "\tadds r2, r0\n" - "\tmovs r0, 0\n" - "\tmovs r5, 0\n" - "\tmovs r4, 0x3F\n" - "_0809A18C:\n" - "\tstrh r5, [r2]\n" - "\tadds r2, 0x2\n" - "\tadds r3, 0x1\n" - "\tands r3, r4\n" - "\tadds r1, r3, 0\n" - "\tcmp r1, 0\n" - "\tbne _0809A19E\n" - "\tldr r6, _0809A1B8 @ =0xfffff7c0\n" - "\tadds r2, r6\n" - "_0809A19E:\n" - "\tcmp r1, 0x20\n" - "\tbne _0809A1A8\n" - "\tmovs r1, 0xF8\n" - "\tlsls r1, 3\n" - "\tadds r2, r1\n" - "_0809A1A8:\n" - "\tadds r0, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tcmp r0, 0x2B\n" - "\tbls _0809A18C\n" - "\tpop {r4-r6}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_0809A1B8: .4byte 0xfffff7c0"); + u16 x; + s16 rectX = ((gPokemonStorageSystemPtr->unk_08b4 / 8) + 30) & 0x3F; + + if (rectX < 32) + buffer += rectX + 0x260; + else + buffer += rectX + 0x640; + + for (x = 0; x < 44; x++) + { + *buffer++ = 0; + // Needs to be one statement in order to match. + rectX = (rectX + 1) & 0x3F; + if (rectX == 0) + buffer -= 0x420; + if (rectX == 32) + buffer += 0x3e0; + } } -#endif void sub_809A1BC(const u8 *a0, const u8 *text) { @@ -2234,73 +1955,79 @@ u8 sub_809C464(void) return r9; } -#ifdef NONMATCHING u8 sub_809C664(void) { - s8 r10 = sBoxCursorArea; - s8 r4 = sBoxCursorPosition; - u8 r8; - u8 r9; + u8 retVal; + bool8 gotoBox; + s8 cursorArea; + s8 cursorPosition; do { + cursorArea = sBoxCursorArea; + cursorPosition = sBoxCursorPosition; gPokemonStorageSystemPtr->unk_11df = 0; gPokemonStorageSystemPtr->unk_11de = 0; gPokemonStorageSystemPtr->unk_11e3 = 0; - r9 = FALSE; - r8 = 0; + gotoBox = FALSE; + retVal = 0; + if (JOY_REPT(DPAD_UP)) { - r4--; - if (r4 < 0) - r4 = 6; - if (r4 != sBoxCursorPosition) - r8 = 1; + if (--cursorPosition < 0) + cursorPosition = 6; + if (cursorPosition != sBoxCursorPosition) + retVal = 1; break; } + if (JOY_REPT(DPAD_DOWN)) { - r4++; - if (r4 > 6) - r4 = 0; - if (r4 != sBoxCursorPosition) - r8 = 1; + if (++cursorPosition > 6) + cursorPosition = 0; + if (cursorPosition != sBoxCursorPosition) + retVal = 1; break; } - if ((JOY_REPT(DPAD_LEFT)) && sBoxCursorPosition != 0) + + if (JOY_REPT(DPAD_LEFT) && sBoxCursorPosition != 0) { - r8 = 1; + retVal = 1; gPokemonStorageSystemPtr->unk_11e2 = sBoxCursorPosition; - r4 = 0; + cursorPosition = 0; break; } + if (JOY_REPT(DPAD_RIGHT)) { if (sBoxCursorPosition == 0) { - r8 = 1; - r4 = gPokemonStorageSystemPtr->unk_11e2; + retVal = 1; + cursorPosition = gPokemonStorageSystemPtr->unk_11e2; } else { - r8 = 6; - r10 = 0; - r4 = 0; + retVal = 6; + cursorArea = 0; + cursorPosition = 0; } break; } + if (JOY_NEW(A_BUTTON)) { if (sBoxCursorPosition == 6) { if (gPokemonStorageSystemPtr->unk_0005 == 1) return 4; - r9 = TRUE; + + gotoBox = TRUE; } else if (sub_809CAB0()) { - if (gUnknown_020384E9 == 0) + if (!gUnknown_020384E9) return 8; + switch (sub_809CE4C(0)) { case 1: @@ -2316,575 +2043,187 @@ u8 sub_809C664(void) } } } + if (JOY_NEW(B_BUTTON)) { if (gPokemonStorageSystemPtr->unk_0005 == 1) return 16; - r9 = TRUE; + + gotoBox = TRUE; } - if (r9) + + if (gotoBox) { - r8 = 6; - r10 = 0; - r4 = 0; + retVal = 6; + cursorArea = 0; + cursorPosition = 0; break; } + if (JOY_NEW(SELECT_BUTTON)) { sub_809CD88(); return 0; } } while (0); - if (r8) - sub_809AF18(r10, r4); - return r8; -} -#else -NAKED u8 sub_809C664(void) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tldr r0, _0809C6D8 @ =sBoxCursorArea\n" - "\tldrb r0, [r0]\n" - "\tmov r10, r0\n" - "\tldr r7, _0809C6DC @ =sBoxCursorPosition\n" - "\tldrb r4, [r7]\n" - "\tldr r2, _0809C6E0 @ =gPokemonStorageSystemPtr\n" - "\tldr r5, [r2]\n" - "\tldr r1, _0809C6E4 @ =0x000011df\n" - "\tadds r0, r5, r1\n" - "\tmovs r1, 0\n" - "\tstrb r1, [r0]\n" - "\tldr r3, _0809C6E8 @ =0x000011de\n" - "\tadds r0, r5, r3\n" - "\tstrb r1, [r0]\n" - "\tadds r3, 0x5\n" - "\tadds r0, r5, r3\n" - "\tstrb r1, [r0]\n" - "\tmov r9, r1\n" - "\tmov r8, r1\n" - "\tldr r1, _0809C6EC @ =gMain\n" - "\tldrh r3, [r1, 0x30]\n" - "\tmovs r0, 0x40\n" - "\tands r0, r3\n" - "\tadds r6, r7, 0\n" - "\tmov r12, r2\n" - "\tadds r2, r1, 0\n" - "\tcmp r0, 0\n" - "\tbeq _0809C6A8\n" - "\tb _0809C81C\n" - "_0809C6A8:\n" - "\tmovs r0, 0x80\n" - "\tands r0, r3\n" - "\tcmp r0, 0\n" - "\tbeq _0809C6F0\n" - "\tlsls r0, r4, 24\n" - "\tmovs r1, 0x80\n" - "\tlsls r1, 17\n" - "\tadds r0, r1\n" - "\tlsrs r4, r0, 24\n" - "\tasrs r0, 24\n" - "\tcmp r0, 0x6\n" - "\tble _0809C6C2\n" - "\tmovs r4, 0\n" - "_0809C6C2:\n" - "\tlsls r0, r4, 24\n" - "\tasrs r0, 24\n" - "\tmovs r1, 0\n" - "\tldrsb r1, [r6, r1]\n" - "\tcmp r0, r1\n" - "\tbne _0809C6D0\n" - "\tb _0809C83C\n" - "_0809C6D0:\n" - "\tmovs r2, 0x1\n" - "\tmov r8, r2\n" - "\tb _0809C842\n" - "\t.align 2, 0\n" - "_0809C6D8: .4byte sBoxCursorArea\n" - "_0809C6DC: .4byte sBoxCursorPosition\n" - "_0809C6E0: .4byte gPokemonStorageSystemPtr\n" - "_0809C6E4: .4byte 0x000011df\n" - "_0809C6E8: .4byte 0x000011de\n" - "_0809C6EC: .4byte gMain\n" - "_0809C6F0:\n" - "\tmovs r0, 0x20\n" - "\tands r0, r3\n" - "\tcmp r0, 0\n" - "\tbeq _0809C714\n" - "\tldrb r1, [r6]\n" - "\tmovs r0, 0\n" - "\tldrsb r0, [r6, r0]\n" - "\tcmp r0, 0\n" - "\tbeq _0809C714\n" - "\tmovs r3, 0x1\n" - "\tmov r8, r3\n" - "\tldr r2, _0809C710 @ =0x000011e2\n" - "\tadds r0, r5, r2\n" - "\tstrb r1, [r0]\n" - "\tmovs r4, 0\n" - "\tb _0809C83C\n" - "\t.align 2, 0\n" - "_0809C710: .4byte 0x000011e2\n" - "_0809C714:\n" - "\tldrh r1, [r2, 0x30]\n" - "\tmovs r0, 0x10\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _0809C748\n" - "\tmovs r0, 0\n" - "\tldrsb r0, [r6, r0]\n" - "\tcmp r0, 0\n" - "\tbne _0809C73C\n" - "\tmovs r3, 0x1\n" - "\tmov r8, r3\n" - "\tmov r1, r12\n" - "\tldr r0, [r1]\n" - "\tldr r2, _0809C738 @ =0x000011e2\n" - "\tadds r0, r2\n" - "\tldrb r4, [r0]\n" - "\tb _0809C83C\n" - "\t.align 2, 0\n" - "_0809C738: .4byte 0x000011e2\n" - "_0809C73C:\n" - "\tmovs r3, 0x6\n" - "\tmov r8, r3\n" - "\tmovs r0, 0\n" - "\tmov r10, r0\n" - "\tmovs r4, 0\n" - "\tb _0809C83C\n" - "_0809C748:\n" - "\tldrh r1, [r2, 0x2E]\n" - "\tmovs r0, 0x1\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _0809C7D0\n" - "\tmovs r0, 0\n" - "\tldrsb r0, [r6, r0]\n" - "\tcmp r0, 0x6\n" - "\tbne _0809C76E\n" - "\tmov r1, r12\n" - "\tldr r0, [r1]\n" - "\tldrb r0, [r0, 0x5]\n" - "\tcmp r0, 0x1\n" - "\tbne _0809C768\n" - "\tmovs r0, 0x4\n" - "\tb _0809C84C\n" - "_0809C768:\n" - "\tmovs r2, 0x1\n" - "\tmov r9, r2\n" - "\tb _0809C7D0\n" - "_0809C76E:\n" - "\tbl sub_809CAB0\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbeq _0809C7D0\n" - "\tldr r0, _0809C784 @ =gUnknown_020384E9\n" - "\tldrb r0, [r0]\n" - "\tcmp r0, 0\n" - "\tbne _0809C788\n" - "\tmovs r0, 0x8\n" - "\tb _0809C84C\n" - "\t.align 2, 0\n" - "_0809C784: .4byte gUnknown_020384E9\n" - "_0809C788:\n" - "\tmovs r0, 0\n" - "\tbl sub_809CE4C\n" - "\tsubs r0, 0x1\n" - "\tlsls r0, 24\n" - "\tasrs r0, 24\n" - "\tcmp r0, 0x4\n" - "\tbhi _0809C7D0\n" - "\tlsls r0, 2\n" - "\tldr r1, _0809C7A4 @ =_0809C7A8\n" - "\tadds r0, r1\n" - "\tldr r0, [r0]\n" - "\tmov pc, r0\n" - "\t.align 2, 0\n" - "_0809C7A4: .4byte _0809C7A8\n" - "\t.align 2, 0\n" - "_0809C7A8:\n" - "\t.4byte _0809C7BC\n" - "\t.4byte _0809C7C0\n" - "\t.4byte _0809C7C4\n" - "\t.4byte _0809C7C8\n" - "\t.4byte _0809C7CC\n" - "_0809C7BC:\n" - "\tmovs r0, 0xB\n" - "\tb _0809C84C\n" - "_0809C7C0:\n" - "\tmovs r0, 0xC\n" - "\tb _0809C84C\n" - "_0809C7C4:\n" - "\tmovs r0, 0xD\n" - "\tb _0809C84C\n" - "_0809C7C8:\n" - "\tmovs r0, 0xE\n" - "\tb _0809C84C\n" - "_0809C7CC:\n" - "\tmovs r0, 0xF\n" - "\tb _0809C84C\n" - "_0809C7D0:\n" - "\tldr r2, _0809C7EC @ =gMain\n" - "\tldrh r1, [r2, 0x2E]\n" - "\tmovs r0, 0x2\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _0809C7F8\n" - "\tldr r0, _0809C7F0 @ =gPokemonStorageSystemPtr\n" - "\tldr r0, [r0]\n" - "\tldrb r0, [r0, 0x5]\n" - "\tcmp r0, 0x1\n" - "\tbne _0809C7F4\n" - "\tmovs r0, 0x10\n" - "\tb _0809C84C\n" - "\t.align 2, 0\n" - "_0809C7EC: .4byte gMain\n" - "_0809C7F0: .4byte gPokemonStorageSystemPtr\n" - "_0809C7F4:\n" - "\tmovs r3, 0x1\n" - "\tmov r9, r3\n" - "_0809C7F8:\n" - "\tmov r0, r9\n" - "\tcmp r0, 0\n" - "\tbeq _0809C80A\n" - "\tmovs r1, 0x6\n" - "\tmov r8, r1\n" - "\tmovs r2, 0\n" - "\tmov r10, r2\n" - "\tmovs r4, 0\n" - "\tb _0809C83C\n" - "_0809C80A:\n" - "\tldrh r1, [r2, 0x2E]\n" - "\tmovs r0, 0x4\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _0809C83C\n" - "\tbl sub_809CD88\n" - "\tmovs r0, 0\n" - "\tb _0809C84C\n" - "_0809C81C:\n" - "\tlsls r0, r4, 24\n" - "\tmovs r3, 0xFF\n" - "\tlsls r3, 24\n" - "\tadds r0, r3\n" - "\tlsrs r4, r0, 24\n" - "\tcmp r0, 0\n" - "\tbge _0809C82C\n" - "\tmovs r4, 0x6\n" - "_0809C82C:\n" - "\tlsls r0, r4, 24\n" - "\tasrs r0, 24\n" - "\tmovs r1, 0\n" - "\tldrsb r1, [r7, r1]\n" - "\tcmp r0, r1\n" - "\tbeq _0809C83C\n" - "\tmovs r0, 0x1\n" - "\tmov r8, r0\n" - "_0809C83C:\n" - "\tmov r1, r8\n" - "\tcmp r1, 0\n" - "\tbeq _0809C84A\n" - "_0809C842:\n" - "\tmov r0, r10\n" - "\tadds r1, r4, 0\n" - "\tbl sub_809AF18\n" - "_0809C84A:\n" - "\tmov r0, r8\n" - "_0809C84C:\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r1}\n" - "\tbx r1"); + + if (retVal != 0) + { + sub_809AF18(cursorArea, cursorPosition); + } + + return retVal; } -#endif u8 sub_809C85C(void) { u8 retVal; - s8 var0; - register s8 var1 asm("r5"); // FAKEMATCHING: r5 and r6 become swapped without this register hack - - gPokemonStorageSystemPtr->unk_11df = 0; - gPokemonStorageSystemPtr->unk_11de = 0; - gPokemonStorageSystemPtr->unk_11e3 = 0; + s8 cursorArea; + s8 cursorPosition; - if (!(gMain.newAndRepeatedKeys & DPAD_UP)) + do { - if (gMain.newAndRepeatedKeys & DPAD_DOWN) + gPokemonStorageSystemPtr->unk_11df = 0; + gPokemonStorageSystemPtr->unk_11de = 0; + gPokemonStorageSystemPtr->unk_11e3 = 0; + + if (JOY_REPT(DPAD_UP)) { retVal = 1; - var0 = 0; - var1 = 2; + cursorArea = 3; + cursorPosition = 0; + gPokemonStorageSystemPtr->unk_11e3 = 1; + break; } - else + else if (JOY_REPT(DPAD_DOWN)) { - if (gMain.heldKeys & DPAD_LEFT) + retVal = 1; + cursorArea = 0; + cursorPosition = 2; + break; + } + + if (gMain.heldKeys & DPAD_LEFT) + return 10; + if (gMain.heldKeys & DPAD_RIGHT) + return 9; + + if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR) + { + if (gMain.heldKeys & L_BUTTON) return 10; - if (gMain.heldKeys & DPAD_RIGHT) + if (gMain.heldKeys & R_BUTTON) return 9; - if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR) - { - if (gMain.heldKeys & L_BUTTON) - return 10; - if (gMain.heldKeys & R_BUTTON) - return 9; - } - - if (gMain.newKeys & A_BUTTON) - { - sub_809A860(0); - sub_809CA8C(); - return 7; - } + } - if (gMain.newKeys & B_BUTTON) - return 16; + if (JOY_NEW(A_BUTTON)) + { + sub_809A860(FALSE); + sub_809CA8C(); + return 7; + } - if (gMain.newKeys & SELECT_BUTTON) - { - sub_809CD88(); - return 0; - } + if (JOY_NEW(B_BUTTON)) + return 16; - retVal = 0; + if (JOY_NEW(SELECT_BUTTON)) + { + sub_809CD88(); + return 0; } - } - else - { - retVal = 1; - var0 = 3; - var1 = 0; - gPokemonStorageSystemPtr->unk_11e3 = 1; - } - if (retVal) + retVal = 0; + } while (0); + + if (retVal != 0) { - if (var0 != 2) - sub_809A860(0); - sub_809AF18(var0, var1); - return retVal; + if (cursorArea != 2) + sub_809A860(FALSE); + sub_809AF18(cursorArea, cursorPosition); } return retVal; } -#ifdef NONMATCHING u8 sub_809C944(void) { - u8 r6; - s8 var0 = sBoxCursorArea; - s8 var1 = sBoxCursorPosition; - - gPokemonStorageSystemPtr->unk_11df = 0; - gPokemonStorageSystemPtr->unk_11de = 0; - gPokemonStorageSystemPtr->unk_11e3 = 0; + u8 retVal; + s8 cursorArea; + s8 cursorPosition; - if (!(gMain.newAndRepeatedKeys & DPAD_UP)) + do { - if (gMain.newAndRepeatedKeys & (DPAD_DOWN | START_BUTTON)) + cursorArea = sBoxCursorArea; + cursorPosition = sBoxCursorPosition; + gPokemonStorageSystemPtr->unk_11df = 0; + gPokemonStorageSystemPtr->unk_11de = 0; + gPokemonStorageSystemPtr->unk_11e3 = 0; + + if (JOY_REPT(DPAD_UP)) { - r6 = 1; - var0 = 2; - var1 = 0; + retVal = 1; + cursorArea = 0; + gPokemonStorageSystemPtr->unk_11de = -1; + if (sBoxCursorPosition == 0) + cursorPosition = 24; + else + cursorPosition = 29; + gPokemonStorageSystemPtr->unk_11e3 = 1; + break; + } + + if (JOY_REPT(DPAD_DOWN | START_BUTTON)) + { + retVal = 1; + cursorArea = 2; + cursorPosition = 0; gPokemonStorageSystemPtr->unk_11e3 = 1; + break; } - else if (gMain.newAndRepeatedKeys & DPAD_LEFT) + + if (JOY_REPT(DPAD_LEFT)) { - r6 = 1; - var1 -= 1; - if (var1 < 0) + retVal = 1; + if (--cursorPosition < 0) { gPokemonStorageSystemPtr->unk_11df = -1; - var1 = 1; + cursorPosition = 1; } + break; } - else if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + + if (JOY_REPT(DPAD_RIGHT)) { - r6 = 1; - var1 += 1; - if (var1 > 1) + retVal = 1; + if (++cursorPosition > 1) { gPokemonStorageSystemPtr->unk_11df = 1; - var1 = 0; + cursorPosition = 0; } + break; } - else if (gMain.newKeys & A_BUTTON) - { - return var1 == 0 ? 5 : 4; - } - else if (gMain.newKeys & B_BUTTON) - { + + if (JOY_NEW(A_BUTTON)) + return (cursorPosition == 0) ? 5 : 4; + if (JOY_NEW(B_BUTTON)) return 16; - } - else if (gMain.newKeys & SELECT_BUTTON) + + if (JOY_NEW(SELECT_BUTTON)) { sub_809CD88(); return 0; } - else - { - r6 = 0; - } - } - else - { - r6 = 1; - var0 = 0; - gPokemonStorageSystemPtr->unk_11de = -1; - var1 = !sBoxCursorPosition ? 24 : 29; - gPokemonStorageSystemPtr->unk_11e3 = 1; - } - if (r6) + retVal = 0; + } while (0); + + if (retVal != 0) { - sub_809AF18(var0, var1); + sub_809AF18(cursorArea, cursorPosition); } - return r6; + return retVal; } -#else -NAKED -u8 sub_809C944(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - ldr r0, _0809C988 @ =sBoxCursorArea\n\ - ldrb r0, [r0]\n\ - mov r12, r0\n\ - ldr r7, _0809C98C @ =sBoxCursorPosition\n\ - ldrb r3, [r7]\n\ - ldr r0, _0809C990 @ =gPokemonStorageSystemPtr\n\ - ldr r1, [r0]\n\ - ldr r0, _0809C994 @ =0x000011df\n\ - adds r5, r1, r0\n\ - movs r0, 0\n\ - strb r0, [r5]\n\ - ldr r2, _0809C998 @ =0x000011de\n\ - adds r4, r1, r2\n\ - strb r0, [r4]\n\ - adds r2, 0x5\n\ - adds r1, r2\n\ - strb r0, [r1]\n\ - ldr r6, _0809C99C @ =gMain\n\ - ldrh r2, [r6, 0x30]\n\ - movs r0, 0x40\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - bne _0809CA14\n\ - movs r0, 0x88\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - beq _0809C9A0\n\ - movs r6, 0x1\n\ - movs r0, 0x2\n\ - mov r12, r0\n\ - movs r3, 0\n\ - b _0809CA2A\n\ - .align 2, 0\n\ -_0809C988: .4byte sBoxCursorArea\n\ -_0809C98C: .4byte sBoxCursorPosition\n\ -_0809C990: .4byte gPokemonStorageSystemPtr\n\ -_0809C994: .4byte 0x000011df\n\ -_0809C998: .4byte 0x000011de\n\ -_0809C99C: .4byte gMain\n\ -_0809C9A0:\n\ - movs r0, 0x20\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - beq _0809C9C0\n\ - movs r6, 0x1\n\ - lsls r0, r3, 24\n\ - movs r1, 0xFF\n\ - lsls r1, 24\n\ - adds r0, r1\n\ - lsrs r3, r0, 24\n\ - cmp r0, 0\n\ - bge _0809CA2C\n\ - movs r0, 0xFF\n\ - strb r0, [r5]\n\ - movs r3, 0x1\n\ - b _0809CA2C\n\ -_0809C9C0:\n\ - movs r0, 0x10\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - beq _0809C9E0\n\ - movs r6, 0x1\n\ - lsls r0, r3, 24\n\ - movs r2, 0x80\n\ - lsls r2, 17\n\ - adds r0, r2\n\ - lsrs r3, r0, 24\n\ - asrs r0, 24\n\ - cmp r0, 0x1\n\ - ble _0809CA2C\n\ - strb r6, [r5]\n\ - movs r3, 0\n\ - b _0809CA2C\n\ -_0809C9E0:\n\ - ldrh r1, [r6, 0x2E]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0809C9F4\n\ - movs r0, 0x4\n\ - cmp r3, 0\n\ - bne _0809CA3A\n\ - movs r0, 0x5\n\ - b _0809CA3A\n\ -_0809C9F4:\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0809CA00\n\ - movs r0, 0x10\n\ - b _0809CA3A\n\ -_0809CA00:\n\ - movs r0, 0x4\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0809CA10\n\ - bl sub_809CD88\n\ - movs r0, 0\n\ - b _0809CA3A\n\ -_0809CA10:\n\ - movs r6, 0\n\ - b _0809CA38\n\ -_0809CA14:\n\ - movs r6, 0x1\n\ - movs r0, 0\n\ - mov r12, r0\n\ - movs r0, 0xFF\n\ - strb r0, [r4]\n\ - movs r0, 0\n\ - ldrsb r0, [r7, r0]\n\ - movs r3, 0x1D\n\ - cmp r0, 0\n\ - bne _0809CA2A\n\ - movs r3, 0x18\n\ -_0809CA2A:\n\ - strb r6, [r1]\n\ -_0809CA2C:\n\ - cmp r6, 0\n\ - beq _0809CA38\n\ - mov r0, r12\n\ - adds r1, r3, 0\n\ - bl sub_809AF18\n\ -_0809CA38:\n\ - adds r0, r6, 0\n\ -_0809CA3A:\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .syntax divided\n"); -} -#endif // NONMATCHING u8 sub_809CA40(void) { @@ -3113,44 +2452,46 @@ void sub_809CE84(void) gPokemonStorageSystemPtr->unk_11b9); } -#ifdef NONMATCHING // r4 and r5 are swapped throughout the entire function. s16 sub_809CF30(void) { int textId = -2; - if (!(gMain.newKeys & A_BUTTON)) + do { - if (gMain.newKeys & B_BUTTON) + if (!(JOY_NEW(A_BUTTON))) { - PlaySE(SE_SELECT); - textId++; - } + if (JOY_NEW(B_BUTTON)) + { + PlaySE(SE_SELECT); + textId++; + } - if (gMain.newKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - Menu_MoveCursor(-1); + if (JOY_NEW(DPAD_UP)) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(-1); + } + else if (JOY_NEW(DPAD_DOWN)) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(1); + } } - else if (gMain.newKeys & DPAD_DOWN) + else { - PlaySE(SE_SELECT); - Menu_MoveCursor(1); + textId = Menu_GetCursorPos(); } - } - else - { - textId = Menu_GetCursorPos(); - } - if (textId != -2) - { - Menu_DestroyCursor(); - Menu_EraseWindowRect( - gPokemonStorageSystemPtr->unk_11ba, - gPokemonStorageSystemPtr->unk_11bc, - 29, - 15); - } + if (textId != -2) + { + Menu_DestroyCursor(); + Menu_EraseWindowRect( + gPokemonStorageSystemPtr->unk_11ba, + gPokemonStorageSystemPtr->unk_11bc, + 29, + 15); + } + } while (0); if (textId >= 0) { @@ -3159,95 +2500,6 @@ s16 sub_809CF30(void) return textId; } -#else -NAKED -s16 sub_809CF30(void) -{ - asm(".syntax unified\n\ - push {r4,r5,lr}\n\ - movs r5, 0x2\n\ - negs r5, r5\n\ - ldr r4, _0809CF6C @ =gMain\n\ - ldrh r1, [r4, 0x2E]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0809CF86\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0809CF52\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - adds r5, 0x1\n\ -_0809CF52:\n\ - ldrh r1, [r4, 0x2E]\n\ - movs r0, 0x40\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0809CF70\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - bl Menu_MoveCursor\n\ - b _0809CF8E\n\ - .align 2, 0\n\ -_0809CF6C: .4byte gMain\n\ -_0809CF70:\n\ - movs r0, 0x80\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0809CF8E\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - movs r0, 0x1\n\ - bl Menu_MoveCursor\n\ - b _0809CF8E\n\ -_0809CF86:\n\ - bl Menu_GetCursorPos\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ -_0809CF8E:\n\ - movs r0, 0x2\n\ - negs r0, r0\n\ - cmp r5, r0\n\ - beq _0809CFB2\n\ - bl Menu_DestroyCursor\n\ - ldr r0, _0809CFD0 @ =gPokemonStorageSystemPtr\n\ - ldr r1, [r0]\n\ - ldr r2, _0809CFD4 @ =0x000011ba\n\ - adds r0, r1, r2\n\ - ldrb r0, [r0]\n\ - adds r2, 0x2\n\ - adds r1, r2\n\ - ldrb r1, [r1]\n\ - movs r2, 0x1D\n\ - movs r3, 0xF\n\ - bl Menu_EraseWindowRect\n\ -_0809CFB2:\n\ - cmp r5, 0\n\ - blt _0809CFC4\n\ - ldr r0, _0809CFD0 @ =gPokemonStorageSystemPtr\n\ - ldr r0, [r0]\n\ - lsls r1, r5, 3\n\ - ldr r2, _0809CFD8 @ =0x00001184\n\ - adds r0, r2\n\ - adds r0, r1\n\ - ldr r5, [r0]\n\ -_0809CFC4:\n\ - lsls r0, r5, 16\n\ - asrs r0, 16\n\ - pop {r4,r5}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_0809CFD0: .4byte gPokemonStorageSystemPtr\n\ -_0809CFD4: .4byte 0x000011ba\n\ -_0809CFD8: .4byte 0x00001184\n\ - .syntax divided\n"); -} -#endif // NONMATCHING void sub_809CFDC(struct UnkStruct_2000020 *arg0, struct UnkStruct_2000028 *arg1, u8 arg2) { diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 1079ec20b..ef4ee6c9e 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -97,12 +97,13 @@ static void DrawPokerusSurvivorDot(struct Pokemon *); static void sub_80A12D0(s8); static void sub_809FAC8(struct Pokemon *); static void SummaryScreenHandleLeftRightInput(u8, s8); -static void sub_809E8F0(); +static void sub_809E8F0(u8 taskId, s8 direction, u8 *moveIndexPtr); static void sub_80A1654(s8, u8); static void sub_80A1488(s8, u8); static void SummaryScreen_PrintPokemonInfo(struct Pokemon *); static void SummaryScreen_PrintPokemonSkills(struct Pokemon *); static void sub_80A1918(u8, u8); +static void sub_80A1C30(u8 a); static void SummaryScreen_DrawTypeIcon(u8, u8, u8, u8); static u16 GetMonMove(struct Pokemon *, u8); static void sub_80A04CC(u16); @@ -1208,184 +1209,57 @@ static void sub_809E83C(u8 taskId, s8 b) sub_80A2078(taskId); } -NAKED -static void sub_809E8F0(/*u8 taskId, s8 direction, u8 *c*/) +static void sub_809E8F0(u8 taskId, s8 direction, u8 *moveIndexPtr) { - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x8\n\ - adds r4, r1, 0\n\ - mov r9, r2\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r8, r0\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - movs r0, 0x1\n\ - str r0, [sp]\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - mov r1, r9\n\ - ldrb r6, [r1]\n\ - ldr r1, _0809E944 @ =gTasks\n\ - mov r2, r8\n\ - lsls r0, r2, 2\n\ - add r0, r8\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - ldrb r0, [r0, 0x8]\n\ - movs r2, 0\n\ - lsls r4, 24\n\ - asrs r4, 24\n\ - mov r10, r4\n\ - lsls r7, r0, 24\n\ -_0809E930:\n\ - lsls r0, r6, 24\n\ - asrs r0, 24\n\ - add r0, r10\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - asrs r1, r0, 24\n\ - cmp r0, r7\n\ - ble _0809E948\n\ - movs r6, 0\n\ - b _0809E94E\n\ - .align 2, 0\n\ -_0809E944: .4byte gTasks\n\ -_0809E948:\n\ - cmp r1, 0\n\ - bge _0809E94E\n\ - lsrs r6, r7, 24\n\ -_0809E94E:\n\ - lsls r4, r6, 24\n\ - lsrs r1, r4, 24\n\ - ldr r0, _0809EA10 @ =gSharedMem + 0x18010\n\ - str r2, [sp, 0x4]\n\ - bl GetMonMove\n\ - lsls r0, 16\n\ - adds r5, r4, 0\n\ - ldr r2, [sp, 0x4]\n\ - cmp r0, 0\n\ - bne _0809E97A\n\ - asrs r0, r5, 24\n\ - cmp r0, 0x4\n\ - beq _0809E97A\n\ - lsls r0, r2, 24\n\ - movs r3, 0x80\n\ - lsls r3, 17\n\ - adds r0, r3\n\ - lsrs r2, r0, 24\n\ - asrs r0, 24\n\ - cmp r0, 0x3\n\ - ble _0809E930\n\ -_0809E97A:\n\ - mov r1, r9\n\ - ldrb r0, [r1]\n\ - cmp r0, 0x4\n\ - bne _0809E996\n\ - asrs r0, r5, 24\n\ - cmp r0, 0x4\n\ - beq _0809E996\n\ - ldr r0, _0809EA14 @ =gSharedMem + 0x18000\n\ - adds r0, 0x7C\n\ - ldrh r0, [r0]\n\ - mov r2, r8\n\ - lsls r7, r2, 2\n\ - cmp r0, 0\n\ - beq _0809E9AC\n\ -_0809E996:\n\ - ldr r2, _0809EA18 @ =gTasks\n\ - mov r3, r8\n\ - lsls r1, r3, 2\n\ - adds r0, r1, r3\n\ - lsls r0, 3\n\ - adds r0, r2\n\ - movs r2, 0x22\n\ - ldrsh r0, [r0, r2]\n\ - adds r7, r1, 0\n\ - cmp r0, 0x1\n\ - bne _0809E9D0\n\ -_0809E9AC:\n\ - lsrs r4, r5, 24\n\ - movs r0, 0x2\n\ - adds r1, r4, 0\n\ - bl sub_80A1488\n\ - movs r0, 0x2\n\ - adds r1, r4, 0\n\ - bl sub_80A1654\n\ - ldr r1, _0809EA18 @ =gTasks\n\ - mov r3, r8\n\ - adds r0, r7, r3\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - movs r1, 0\n\ - strh r1, [r0, 0x22]\n\ - movs r0, 0\n\ - str r0, [sp]\n\ -_0809E9D0:\n\ - mov r1, r9\n\ - ldrb r0, [r1]\n\ - cmp r0, 0x4\n\ - beq _0809E9FE\n\ - asrs r0, r5, 24\n\ - cmp r0, 0x4\n\ - bne _0809E9FE\n\ - ldr r0, _0809EA14 @ =gSharedMem + 0x18000\n\ - adds r0, 0x7C\n\ - ldrh r0, [r0]\n\ - cmp r0, 0\n\ - bne _0809E9FE\n\ - movs r4, 0x2\n\ - negs r4, r4\n\ - lsrs r5, 24\n\ - adds r0, r4, 0\n\ - adds r1, r5, 0\n\ - bl sub_80A1488\n\ - adds r0, r4, 0\n\ - adds r1, r5, 0\n\ - bl sub_80A1654\n\ -_0809E9FE:\n\ - mov r2, r9\n\ - strb r6, [r2]\n\ - ldr r0, _0809EA1C @ =gSharedMem + 0x18079\n\ - cmp r9, r0\n\ - bne _0809EA20\n\ - movs r0, 0\n\ - bl sub_80A1C30\n\ - b _0809EA26\n\ - .align 2, 0\n\ -_0809EA10: .4byte gSharedMem + 0x18010\n\ -_0809EA14: .4byte gSharedMem + 0x18000\n\ -_0809EA18: .4byte gTasks\n\ -_0809EA1C: .4byte gSharedMem + 0x18079\n\ -_0809EA20:\n\ - movs r0, 0x1\n\ - bl sub_80A1C30\n\ -_0809EA26:\n\ - ldr r3, [sp]\n\ - cmp r3, 0\n\ - beq _0809EA34\n\ - ldr r0, _0809EA4C @ =gSharedMem + 0x18010\n\ - mov r1, r9\n\ - bl sub_80A0428\n\ -_0809EA34:\n\ - mov r0, r8\n\ - bl sub_80A2078\n\ - add sp, 0x8\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0809EA4C: .4byte gSharedMem + 0x18010\n\ - .syntax divided\n"); + s8 i; + s8 newMoveIndex; + s8 var; + bool8 bln; + + bln = TRUE; + PlaySE(SE_SELECT); + newMoveIndex = *moveIndexPtr; + var = (s8)gTasks[taskId].data[0]; + for (i = 0; i < MAX_MON_MOVES; i++) + { + newMoveIndex += direction; + if (newMoveIndex > var) + newMoveIndex = 0; + else if (newMoveIndex < 0) + newMoveIndex = var; + + if (GetMonMove(&pssData.loadedMon, newMoveIndex) != 0 || newMoveIndex == MAX_MON_MOVES) + break; + } + + if ((*moveIndexPtr == MAX_MON_MOVES + && newMoveIndex != MAX_MON_MOVES + && pssData.moveToLearn == 0) + || gTasks[taskId].data[13] == 1) + { + sub_80A1488(2, newMoveIndex); + sub_80A1654(2, newMoveIndex); + gTasks[taskId].data[13] = 0; + bln = FALSE; + } + if (*moveIndexPtr != MAX_MON_MOVES + && newMoveIndex == MAX_MON_MOVES + && pssData.moveToLearn == 0) + { + sub_80A1488(-2, newMoveIndex); + sub_80A1654(-2, newMoveIndex); + } + + *moveIndexPtr = newMoveIndex; + // Get rid of the 'flicker' effect(while idle) when scrolling. + if (moveIndexPtr == &pssData.selectedMoveIndex) + sub_80A1C30(0); + else + sub_80A1C30(1); + + if (bln) + sub_80A0428(&pssData.loadedMon, moveIndexPtr); + sub_80A2078(taskId); } static void SummaryScreenHandleAButton(u8 taskId) @@ -1702,35 +1576,38 @@ static void SummaryScreenHandleLeftRightInput(u8 taskId, s8 direction) } } -// direction should be implicitly casted to a u8 during the var1 assign but it is not in this code -#ifdef NONMATCHING void SummaryScreenHandleUpDownInput(u8 taskId, s8 direction) { s8 var3; - u8 var1 = direction; if (pssData.usingPC == TRUE) { if (pssData.page != PSS_PAGE_INFO) { - var1 = (direction == 1) ? 0 : 1; + if (direction == 1) + direction = 0; + else + direction = 1; } else { - var1 = (direction == 1) ? 2 : 3; + if (direction == 1) + direction = 2; + else + direction = 3; } - var3 = StorageSystemGetNextMonIndex(pssData.monList.boxMons, pssData.monIndex, pssData.maxMonIndex, var1); + var3 = StorageSystemGetNextMonIndex(pssData.monList.boxMons, pssData.monIndex, pssData.maxMonIndex, direction); } else { if (sub_80F9344() == TRUE && IsLinkDoubleBattle() == TRUE) { - var3 = sub_809F3CC(var1); + var3 = sub_809F3CC(direction); } else { - var3 = sub_809F284(var1); + var3 = sub_809F284(direction); } } @@ -1747,113 +1624,7 @@ void SummaryScreenHandleUpDownInput(u8 taskId, s8 direction) gTasks[taskId].func = sub_809F43C; } } -#else -NAKED -void SummaryScreenHandleUpDownInput(u8 taskId, s8 direction) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - lsls r1, 24\n\ - lsrs r4, r1, 24\n\ - ldr r0, _0809F1E4 @ =gSharedMem + 0x18000\n\ - ldrb r1, [r0, 0xE]\n\ - adds r2, r0, 0\n\ - cmp r1, 0x1\n\ - bne _0809F202\n\ - ldrb r0, [r2, 0xB]\n\ - cmp r0, 0\n\ - beq _0809F1E8\n\ - lsls r1, r4, 24\n\ - asrs r1, 24\n\ - movs r4, 0x1\n\ - eors r1, r4\n\ - negs r0, r1\n\ - orrs r0, r1\n\ - lsrs r4, r0, 31\n\ - b _0809F1F4\n\ - .align 2, 0\n\ -_0809F1E4: .4byte gSharedMem + 0x18000\n\ -_0809F1E8:\n\ - lsls r0, r4, 24\n\ - asrs r0, 24\n\ - movs r4, 0x3\n\ - cmp r0, 0x1\n\ - bne _0809F1F4\n\ - movs r4, 0x2\n\ -_0809F1F4:\n\ - ldr r0, [r2]\n\ - ldrb r1, [r2, 0x9]\n\ - ldrb r2, [r2, 0xA]\n\ - adds r3, r4, 0\n\ - bl StorageSystemGetNextMonIndex\n\ - b _0809F22C\n\ -_0809F202:\n\ - bl sub_80F9344\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bne _0809F224\n\ - bl IsLinkDoubleBattle\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bne _0809F224\n\ - lsls r0, r4, 24\n\ - asrs r0, 24\n\ - bl sub_809F3CC\n\ - b _0809F22C\n\ -_0809F224:\n\ - lsls r0, r4, 24\n\ - asrs r0, 24\n\ - bl sub_809F284\n\ -_0809F22C:\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - lsls r0, r4, 24\n\ - asrs r0, 24\n\ - movs r1, 0x1\n\ - negs r1, r1\n\ - cmp r0, r1\n\ - beq _0809F270\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - ldr r5, _0809F278 @ =gSharedMem + 0x18010\n\ - adds r0, r5, 0\n\ - bl GetMonStatusAndPokerus\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _0809F258\n\ - movs r0, 0x2\n\ - negs r0, r0\n\ - bl sub_80A12D0\n\ -_0809F258:\n\ - adds r0, r5, 0\n\ - subs r0, 0x10\n\ - strb r4, [r0, 0x9]\n\ - ldr r1, _0809F27C @ =gTasks\n\ - lsls r0, r6, 2\n\ - adds r0, r6\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - ldr r1, [r0]\n\ - str r1, [r5, 0x74]\n\ - ldr r1, _0809F280 @ =sub_809F43C\n\ - str r1, [r0]\n\ -_0809F270:\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0809F278: .4byte gSharedMem + 0x18010\n\ -_0809F27C: .4byte gTasks\n\ -_0809F280: .4byte sub_809F43C\n\ - .syntax divided\n"); -} -#endif // NONMATCHING -#ifdef NONMATCHING s8 sub_809F284(s8 a) { struct Pokemon *mons = pssData.monList.partyMons; @@ -1867,100 +1638,17 @@ s8 sub_809F284(s8 a) return -1; return pssData.monIndex + a; } - else + + // unlike Emerald, the do while needs to be inversed in order to match + while (1) { - do - { - r6 += a; - if (pssData.monIndex + r6 < 0 || pssData.monIndex + r6 > pssData.maxMonIndex) - return -1; - } while (GetMonData(&mons[pssData.monIndex + r6], MON_DATA_IS_EGG) != 0); - return pssData.monIndex + r6; + r6 += a; + if (pssData.monIndex + r6 < 0 || pssData.monIndex + r6 > pssData.maxMonIndex) + return -1; + if (GetMonData(&mons[pssData.monIndex + r6], MON_DATA_IS_EGG) == 0) + return pssData.monIndex + r6; } } -#else -NAKED -s8 sub_809F284(s8 a) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - ldr r0, _0809F2C0 @ =gSharedMem + 0x18000\n\ - ldr r7, [r0]\n\ - movs r6, 0\n\ - ldrb r1, [r0, 0xB]\n\ - adds r4, r0, 0\n\ - cmp r1, 0\n\ - bne _0809F2C4\n\ - lsls r0, r3, 24\n\ - asrs r2, r0, 24\n\ - movs r1, 0x1\n\ - negs r1, r1\n\ - adds r5, r0, 0\n\ - cmp r2, r1\n\ - bne _0809F2AC\n\ - ldrb r0, [r4, 0x9]\n\ - cmp r0, 0\n\ - beq _0809F2E4\n\ -_0809F2AC:\n\ - asrs r0, r5, 24\n\ - cmp r0, 0x1\n\ - bne _0809F2BA\n\ - ldrb r0, [r4, 0x9]\n\ - ldrb r1, [r4, 0xA]\n\ - cmp r0, r1\n\ - bcs _0809F2E4\n\ -_0809F2BA:\n\ - ldrb r0, [r4, 0x9]\n\ - adds r0, r3\n\ - b _0809F304\n\ - .align 2, 0\n\ -_0809F2C0: .4byte gSharedMem + 0x18000\n\ -_0809F2C4:\n\ - lsls r5, r3, 24\n\ -_0809F2C6:\n\ - lsls r0, r6, 24\n\ - asrs r0, 24\n\ - asrs r1, r5, 24\n\ - adds r0, r1\n\ - lsls r0, 24\n\ - ldr r4, _0809F2EC @ =gSharedMem + 0x18000\n\ - lsrs r6, r0, 24\n\ - asrs r0, 24\n\ - ldrb r2, [r4, 0x9]\n\ - adds r1, r0, r2\n\ - cmp r1, 0\n\ - blt _0809F2E4\n\ - ldrb r0, [r4, 0xA]\n\ - cmp r1, r0\n\ - ble _0809F2F0\n\ -_0809F2E4:\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - b _0809F308\n\ - .align 2, 0\n\ -_0809F2EC: .4byte gSharedMem + 0x18000\n\ -_0809F2F0:\n\ - movs r0, 0x64\n\ - muls r0, r1\n\ - adds r0, r7, r0\n\ - movs r1, 0x2D\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - bne _0809F2C6\n\ - ldrb r0, [r4, 0x9]\n\ - adds r0, r6\n\ -_0809F304:\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ -_0809F308:\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .syntax divided\n"); -} -#endif // NONMATCHING bool8 sub_809F310(struct Pokemon *mon) { @@ -2740,175 +2428,51 @@ static void sub_80A04CC(u16 move) } } -#ifdef NONMATCHING // The two vramAddr lines are non-matching. void sub_80A057C(u16 move) { - u8 appeal; - u8 jam; u8 i; - u16 *vramAddr = (u16 *)(VRAM + 0x6800); + u8 effectValue; + u16 *tilemap = (u16 *)(VRAM + 0x6800); + u16 tile; - if (move == 0xFFFF) return; - - appeal = gContestEffects[gContestMoves[move].effect].appeal; - if (appeal != 0xFF) - appeal = appeal / 10; - - for (i = 0; i < 8; i++) + // The function didn't change much between Ruby and Emerald, but unlike + // Emerald, shifts are oddly an absolute requirement to match. + if (move != 0xFFFF) { - u16 tile = 0x1039; - int and = 3; - int offset = 0x3CC / 2; - if (appeal != 0xFF && i < appeal) - tile = 0x103A; + effectValue = gContestEffects[gContestMoves[move].effect].appeal; + if (effectValue != 0xFF) + effectValue /= 10; - *(&vramAddr[((i >> 2) << 5) + (i & and)] + offset) = tile; - } - - if (move == 0xFFFF) return; + for (i = 0; i < 8; i++) + { + if (effectValue != 0xFF && i < effectValue) + tile = 0x103A; + else + tile = 0x1039; - jam = gContestEffects[gContestMoves[move].effect].jam; - if (jam != 0xFF) - { - jam = jam / 10; + // The offset number has to go first, or else, r1 gets swapped with r0. + tilemap[0x1E6 + ((i >> 2) << 5) + (i & 3)] = tile; + } } - for (i = 0; i < 8; i++) + if (move != 0xFFFF) { - u16 tile = 0x103D; - int and = 3; - int offset = 0x226; - if (jam != 0xFF && i < jam) + effectValue = gContestEffects[gContestMoves[move].effect].jam; + if (effectValue != 0xFF) + effectValue /= 10; + + for (i = 0; i < 8; i++) { - tile = 0x103C; - } + if (effectValue != 0xFF && i < effectValue) + tile = 0x103C; + else + tile = 0x103D; - *(&vramAddr[((i >> 2) << 5) + (i & and)] + offset) = tile; + // match order above + tilemap[0x226 + ((i >> 2) << 5) + (i & 3)] = tile; + } } } -#else -NAKED -void sub_80A057C(u16 move) -{ - 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, 16\n\ - lsrs r5, r0, 16\n\ - ldr r0, _080A0648 @ =0x06006800\n\ - mov r8, r0\n\ - ldr r0, _080A064C @ =0x0000ffff\n\ - cmp r5, r0\n\ - beq _080A063A\n\ - ldr r1, _080A0650 @ =gContestEffects\n\ - ldr r2, _080A0654 @ =gContestMoves\n\ - lsls r3, r5, 3\n\ - adds r0, r3, r2\n\ - ldrb r0, [r0]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r4, [r0, 0x1]\n\ - mov r10, r2\n\ - mov r9, r3\n\ - cmp r4, 0xFF\n\ - beq _080A05B8\n\ - adds r0, r4, 0\n\ - movs r1, 0xA\n\ - bl __udivsi3\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ -_080A05B8:\n\ - movs r2, 0\n\ - movs r7, 0x3\n\ - movs r6, 0xF3\n\ - lsls r6, 2\n\ -_080A05C0:\n\ - ldr r3, _080A0658 @ =0x00001039\n\ - cmp r4, 0xFF\n\ - beq _080A05CC\n\ - cmp r2, r4\n\ - bcs _080A05CC\n\ - adds r3, 0x1\n\ -_080A05CC:\n\ - lsrs r0, r2, 2\n\ - lsls r0, 5\n\ - adds r1, r2, 0\n\ - ands r1, r7\n\ - adds r1, r0\n" // start of nonmatching - "lsls r1, 1\n\ - add r1, r8\n\ - adds r1, r6\n\ - strh r3, [r1]\n\ - adds r0, r2, 0x1\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - cmp r2, 0x7\n\ - bls _080A05C0\n\ - ldr r0, _080A064C @ =0x0000ffff\n\ - cmp r5, r0\n\ - beq _080A063A\n\ - mov r0, r9\n\ - add r0, r10\n\ - ldrb r0, [r0]\n\ - lsls r0, 2\n\ - ldr r1, _080A0650 @ =gContestEffects\n\ - adds r0, r1\n\ - ldrb r4, [r0, 0x2]\n\ - cmp r4, 0xFF\n\ - beq _080A060C\n\ - adds r0, r4, 0\n\ - movs r1, 0xA\n\ - bl __udivsi3\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ -_080A060C:\n\ - movs r2, 0\n\ - movs r6, 0x3\n\ - ldr r5, _080A065C @ =0x0000044c\n\ -_080A0612:\n\ - ldr r3, _080A0660 @ =0x0000103d\n\ - cmp r4, 0xFF\n\ - beq _080A061E\n\ - cmp r2, r4\n\ - bcs _080A061E\n\ - subs r3, 0x1\n\ -_080A061E:\n\ - lsrs r0, r2, 2\n\ - lsls r0, 5\n\ - adds r1, r2, 0\n\ - ands r1, r6\n\ - adds r1, r0\n\ - lsls r1, 1\n\ - add r1, r8\n\ - adds r1, r5\n\ - strh r3, [r1]\n\ - adds r0, r2, 0x1\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - cmp r2, 0x7\n\ - bls _080A0612\n\ -_080A063A:\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\ -_080A0648: .4byte 0x06006800\n\ -_080A064C: .4byte 0x0000ffff\n\ -_080A0650: .4byte gContestEffects\n\ -_080A0654: .4byte gContestMoves\n\ -_080A0658: .4byte 0x00001039\n\ -_080A065C: .4byte 0x0000044c\n\ -_080A0660: .4byte 0x0000103d\n\ - .syntax divided\n"); -} -#endif // NONMATCHING bool8 PokemonSummaryScreen_CheckOT(struct Pokemon *mon) { @@ -3340,60 +2904,57 @@ static void DrawPokerusSurvivorDot(struct Pokemon *mon) } // Draws the 4 small navigation circles at the top of the pokemon summary screen. -// complex nonmatching -#ifdef NONMATCHING void DrawSummaryScreenNavigationDots(void) { u16 arr[8]; - u8 i = 0; - struct PokemonSummaryScreenStruct *SS = &pssData; - u16 var1 = 0x4040; - u16 var2 = 0x404A; + u8 i; + + // Shifting 1 bit instead of multiplying by 2 is required to match. for (i = 0; i < 4; i++) { - if (i < SS->firstPage) + if (i < pssData.firstPage) { - arr[i * 2] = var1; - arr[(i * 2) + 1] = var1 + 1; + arr[i << 1] = 0x4040; + arr[(i << 1) + 1] = 0x4040; } - else if (i > SS->lastPage) + else if (i > pssData.lastPage) { - arr[i * 2] = var2; - arr[(i * 2) + 1] = var2 + 1; + arr[i << 1] = 0x404A; + arr[(i << 1) + 1] = 0x404A; } else { - if (i < SS->page) + if (i < pssData.page) { - arr[i * 2] = 0x4046; - arr[(i * 2) + 1] = 0x4046 + 1; + arr[i << 1] = 0x4046; + arr[(i << 1) + 1] = 0x4046 + 1; } - if (i == SS->page) + if (i == pssData.page) { - if (i != SS->lastPage) + if (i != pssData.lastPage) { - arr[i * 2] = 0x4041; - arr[(i * 2) + 1] = 0x4041 + 1; + arr[i << 1] = 0x4041; + arr[(i << 1) + 1] = 0x4041 + 1; } else { - arr[i * 2] = 0x404B; - arr[(i * 2) + 1] = 0x404B + 1; + arr[i << 1] = 0x404B; + arr[(i << 1) + 1] = 0x404B + 1; } } - if (i > SS->page) + if (i > pssData.page) { - if (i != SS->lastPage) + if (i != pssData.lastPage) { - arr[i * 2] = 0x4043; - arr[(i * 2) + 1] = 0x4043 + 1; + arr[i << 1] = 0x4043; + arr[(i << 1) + 1] = 0x4043 + 1; } else { - arr[i * 2] = 0x4048; - arr[(i * 2) + 1] = 0x4048 + 1; + arr[i << 1] = 0x4048; + arr[(i << 1) + 1] = 0x4048 + 1; } } } @@ -3408,189 +2969,6 @@ void DrawSummaryScreenNavigationDots(void) DmaCopy16Defvars(3, arr, (void *)(VRAM + 0xE056), 16); } -#else -NAKED -void DrawSummaryScreenNavigationDots(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x10\n\ - movs r3, 0\n\ - ldr r6, _080A0F24 @ =gSharedMem + 0x18000\n\ - adds r5, r6, 0\n\ - ldr r1, _080A0F28 @ =0x00004040\n\ - mov r8, r1\n\ - ldr r2, _080A0F2C @ =0x0000404a\n\ - mov r10, r2\n\ -_080A0F02:\n\ - adds r0, r5, 0\n\ - adds r0, 0x75\n\ - ldrb r0, [r0]\n\ - cmp r3, r0\n\ - bcs _080A0F30\n\ - lsls r1, r3, 1\n\ - lsls r0, r3, 2\n\ - add r0, sp\n\ - mov r4, r8\n\ - strh r4, [r0]\n\ - adds r1, 0x1\n\ - lsls r1, 1\n\ - mov r7, sp\n\ - adds r0, r7, r1\n\ - strh r4, [r0]\n\ - b _080A0FE2\n\ - .align 2, 0\n\ -_080A0F24: .4byte gSharedMem + 0x18000\n\ -_080A0F28: .4byte 0x00004040\n\ -_080A0F2C: .4byte 0x0000404a\n\ -_080A0F30:\n\ - movs r0, 0x76\n\ - adds r0, r6\n\ - mov r12, r0\n\ - ldrb r1, [r0]\n\ - cmp r3, r1\n\ - bls _080A0F52\n\ - lsls r1, r3, 1\n\ - lsls r0, r3, 2\n\ - add r0, sp\n\ - mov r2, r10\n\ - strh r2, [r0]\n\ - adds r1, 0x1\n\ - lsls r1, 1\n\ - mov r4, sp\n\ - adds r0, r4, r1\n\ - strh r2, [r0]\n\ - b _080A0FE2\n\ -_080A0F52:\n\ - ldrb r4, [r5, 0xB]\n\ - cmp r3, r4\n\ - bcs _080A0F6E\n\ - lsls r1, r3, 1\n\ - lsls r0, r3, 2\n\ - mov r7, sp\n\ - adds r2, r7, r0\n\ - ldr r0, _080A0F88 @ =0x00004046\n\ - strh r0, [r2]\n\ - adds r1, 0x1\n\ - lsls r1, 1\n\ - add r1, sp\n\ - adds r0, 0x1\n\ - strh r0, [r1]\n\ -_080A0F6E:\n\ - cmp r3, r4\n\ - bne _080A0FA6\n\ - mov r0, r12\n\ - ldrb r0, [r0]\n\ - cmp r3, r0\n\ - beq _080A0F90\n\ - lsls r1, r3, 1\n\ - lsls r0, r3, 2\n\ - mov r4, sp\n\ - adds r2, r4, r0\n\ - ldr r0, _080A0F8C @ =0x00004041\n\ - b _080A0F9A\n\ - .align 2, 0\n\ -_080A0F88: .4byte 0x00004046\n\ -_080A0F8C: .4byte 0x00004041\n\ -_080A0F90:\n\ - lsls r1, r3, 1\n\ - lsls r0, r3, 2\n\ - mov r7, sp\n\ - adds r2, r7, r0\n\ - ldr r0, _080A0FC4 @ =0x0000404b\n\ -_080A0F9A:\n\ - strh r0, [r2]\n\ - adds r1, 0x1\n\ - lsls r1, 1\n\ - add r1, sp\n\ - adds r0, 0x1\n\ - strh r0, [r1]\n\ -_080A0FA6:\n\ - ldrb r0, [r5, 0xB]\n\ - cmp r3, r0\n\ - bls _080A0FE2\n\ - adds r0, r6, 0\n\ - adds r0, 0x76\n\ - ldrb r0, [r0]\n\ - cmp r3, r0\n\ - beq _080A0FCC\n\ - lsls r1, r3, 1\n\ - lsls r0, r3, 2\n\ - mov r4, sp\n\ - adds r2, r4, r0\n\ - ldr r0, _080A0FC8 @ =0x00004043\n\ - b _080A0FD6\n\ - .align 2, 0\n\ -_080A0FC4: .4byte 0x0000404b\n\ -_080A0FC8: .4byte 0x00004043\n\ -_080A0FCC:\n\ - lsls r1, r3, 1\n\ - lsls r0, r3, 2\n\ - mov r7, sp\n\ - adds r2, r7, r0\n\ - ldr r0, _080A1034 @ =0x00004048\n\ -_080A0FD6:\n\ - strh r0, [r2]\n\ - adds r1, 0x1\n\ - lsls r1, 1\n\ - add r1, sp\n\ - adds r0, 0x1\n\ - strh r0, [r1]\n\ -_080A0FE2:\n\ - adds r0, r3, 0x1\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - cmp r3, 0x3\n\ - bls _080A0F02\n\ - ldr r1, _080A1038 @ =0x0600e016\n\ - ldr r0, _080A103C @ =0x040000d4\n\ - mov r2, sp\n\ - str r2, [r0]\n\ - str r1, [r0, 0x4]\n\ - ldr r1, _080A1040 @ =0x80000008\n\ - str r1, [r0, 0x8]\n\ - ldr r0, [r0, 0x8]\n\ - movs r3, 0\n\ -_080A0FFE:\n\ - lsls r0, r3, 1\n\ - mov r4, sp\n\ - adds r1, r4, r0\n\ - ldrh r0, [r1]\n\ - adds r0, 0x10\n\ - strh r0, [r1]\n\ - adds r0, r3, 0x1\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - cmp r3, 0x7\n\ - bls _080A0FFE\n\ - ldr r1, _080A1044 @ =0x0600e056\n\ - ldr r0, _080A103C @ =0x040000d4\n\ - str r4, [r0]\n\ - str r1, [r0, 0x4]\n\ - ldr r1, _080A1040 @ =0x80000008\n\ - str r1, [r0, 0x8]\n\ - ldr r0, [r0, 0x8]\n\ - add sp, 0x10\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080A1034: .4byte 0x00004048\n\ -_080A1038: .4byte 0x0600e016\n\ -_080A103C: .4byte 0x040000d4\n\ -_080A1040: .4byte 0x80000008\n\ -_080A1044: .4byte 0x0600e056\n\ - .syntax divided\n"); -} -#endif // NONMATCHING NAKED void sub_80A1048(u8 taskId) @@ -4758,7 +4136,7 @@ static void sub_80A1BC0(struct Sprite *sprite) #define shared1A009 ((u8 *)(gSharedMem + 0x1A009)) -void sub_80A1C30(u8 a) +static void sub_80A1C30(u8 a) { u8 r3; @@ -4805,7 +4183,6 @@ u8 GetMonStatusAndPokerus(struct Pokemon *mon) return statusAilment; } -#ifdef NONMATCHING void sub_80A1D18(void) { struct Pokemon mon; @@ -4818,9 +4195,6 @@ void sub_80A1D18(void) if (statusAndPkrs) { statusAndPkrs2 = statusAndPkrs - 1; - - if (ewram1A000[29] == 0xFF) - ewram1A000[29] = CreateSprite(&sSpriteTemplate_StatusCondition, 64, 152, 0); } else { @@ -4828,65 +4202,10 @@ void sub_80A1D18(void) return; } + if (ewram1A000[29] == 0xFF) + ewram1A000[29] = CreateSprite(&sSpriteTemplate_StatusCondition, 64, 152, 0); StartSpriteAnim(&gSprites[ewram1A000[29]], statusAndPkrs2); } -#else -NAKED -void sub_80A1D18(void) -{ - asm(".syntax unified\n\ - push {r4,r5,lr}\n\ - sub sp, 0x64\n\ - mov r0, sp\n\ - bl SummaryScreen_GetPokemon\n\ - mov r0, sp\n\ - bl GetMonStatusAndPokerus\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0\n\ - beq _080A1D58\n\ - subs r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - ldr r4, _080A1D50 @ =gSharedMem + 0x1A01D\n\ - ldrb r0, [r4]\n\ - cmp r0, 0xFF\n\ - bne _080A1D60\n\ - ldr r0, _080A1D54 @ =sSpriteTemplate_StatusCondition\n\ - movs r1, 0x40\n\ - movs r2, 0x98\n\ - movs r3, 0\n\ - bl CreateSprite\n\ - strb r0, [r4]\n\ - b _080A1D60\n\ - .align 2, 0\n\ -_080A1D50: .4byte gSharedMem + 0x1A01D\n\ -_080A1D54: .4byte sSpriteTemplate_StatusCondition\n\ -_080A1D58:\n\ - movs r0, 0x1D\n\ - bl sub_80A18E4\n\ - b _080A1D74\n\ -_080A1D60:\n\ - ldr r0, _080A1D7C @ =gSharedMem + 0x1A01D\n\ - ldrb r1, [r0]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - ldr r1, _080A1D80 @ =gSprites\n\ - adds r0, r1\n\ - adds r1, r5, 0\n\ - bl StartSpriteAnim\n\ -_080A1D74:\n\ - add sp, 0x64\n\ - pop {r4,r5}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080A1D7C: .4byte gSharedMem + 0x1A01D\n\ -_080A1D80: .4byte gSprites\n\ - .syntax divided\n"); -} -#endif // NONMATCHING static void sub_80A1D84(struct Pokemon *mon) { diff --git a/src/roulette.c b/src/roulette.c index c4f6067a1..40acd41c8 100644 --- a/src/roulette.c +++ b/src/roulette.c @@ -1661,16 +1661,31 @@ void Task_Roulette_0(u8 taskid) #if DEBUG +#if (ENGLISH && REVISION == 0) + static const u8 gUnknown_Debug_0842510D[] = _("コインの かず STARTで きめて\nAーp1 Bーm1 R:Lー×10"); +#else + static const u8 gUnknown_Debug_0842510D[] = _("Set COIN and Press START\nAーp1 Bーm1 R:Lー×10"); +#endif + void debug_sub_812CDE4(u8 taskId) { +#if (ENGLISH && REVISION == 0) + u8 coinText[] = {0xFD, 0x02, 0xFF}; +#endif + if (gMain.newKeys & A_BUTTON) { gTasks[taskId].data[13]++; if (gTasks[taskId].data[13] == 10000) gTasks[taskId].data[13] = 0; ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4); +#if (ENGLISH && REVISION == 0) + StringExpandPlaceholders(gStringVar4, coinText); + Menu_PrintText(gStringVar4, 2, 1); +#else StringExpandPlaceholders(gStringVar4, gOtherText_Coins); MenuPrint_RightAligned(gStringVar4, 9, 1); +#endif } else if (gMain.newKeys & B_BUTTON) { @@ -1678,8 +1693,13 @@ void debug_sub_812CDE4(u8 taskId) if (gTasks[taskId].data[13] == -1) gTasks[taskId].data[13] = 9999; ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4); +#if (ENGLISH && REVISION == 0) + StringExpandPlaceholders(gStringVar4, coinText); + Menu_PrintText(gStringVar4, 2, 1); +#else StringExpandPlaceholders(gStringVar4, gOtherText_Coins); MenuPrint_RightAligned(gStringVar4, 9, 1); +#endif } else if (gMain.newKeys & R_BUTTON) { @@ -1687,8 +1707,13 @@ void debug_sub_812CDE4(u8 taskId) if (gTasks[taskId].data[13] > 9999) gTasks[taskId].data[13] -= 9999; ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4); +#if (ENGLISH && REVISION == 0) + StringExpandPlaceholders(gStringVar4, coinText); + Menu_PrintText(gStringVar4, 2, 1); +#else StringExpandPlaceholders(gStringVar4, gOtherText_Coins); MenuPrint_RightAligned(gStringVar4, 9, 1); +#endif } else if (gMain.newKeys & L_BUTTON) { @@ -1696,16 +1721,26 @@ void debug_sub_812CDE4(u8 taskId) if (gTasks[taskId].data[13] < 0) gTasks[taskId].data[13] += 9999; ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4); +#if (ENGLISH && REVISION == 0) + StringExpandPlaceholders(gStringVar4, coinText); + Menu_PrintText(gStringVar4, 2, 1); +#else StringExpandPlaceholders(gStringVar4, gOtherText_Coins); MenuPrint_RightAligned(gStringVar4, 9, 1); +#endif } else if (gMain.newKeys & START_BUTTON) { gSaveBlock1.coins = gTasks[taskId].data[13]; gTasks[taskId].func = Task_Roulette_0; ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4); +#if (ENGLISH && REVISION == 0) + StringExpandPlaceholders(gStringVar4, coinText); + Menu_PrintText(gStringVar4, 2, 1); +#else StringExpandPlaceholders(gStringVar4, gOtherText_Coins); MenuPrint_RightAligned(gStringVar4, 9, 1); +#endif unk_2039560 = 0; } else if (gMain.newKeys & SELECT_BUTTON) @@ -1713,22 +1748,30 @@ void debug_sub_812CDE4(u8 taskId) gSaveBlock1.coins = gTasks[taskId].data[13]; gTasks[taskId].func = Task_Roulette_0; ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4); +#if (ENGLISH && REVISION == 0) + StringExpandPlaceholders(gStringVar4, coinText); + Menu_PrintText(gStringVar4, 2, 1); +#else StringExpandPlaceholders(gStringVar4, gOtherText_Coins); MenuPrint_RightAligned(gStringVar4, 9, 1); +#endif unk_2039560 = 1; } } void debug_sub_812CFE8(u8 taskId) { - static const u8 gUnknown_Debug_0842510D[] = _("Set COIN and Press START\nAーp1 Bーm1 R:Lー×10"); gTasks[taskId].data[13] = gSaveBlock1.coins; if (Random() & 1) gSpecialVar_0x8004 |= 128; ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4); StringExpandPlaceholders(gStringVar4, gOtherText_Coins); Menu_DrawStdWindowFrame(0, 0, 9, 3); +#if (ENGLISH && REVISION == 0) + Menu_PrintText(gStringVar4, 2, 1); +#else MenuPrint_RightAligned(gStringVar4, 9, 1); +#endif Menu_DrawStdWindowFrame(0, 14, 29, 19); Menu_PrintText(gUnknown_Debug_0842510D, 1, 15); gTasks[taskId].func = debug_sub_812CDE4; diff --git a/src/roulette_gfx.c b/src/roulette_gfx.c index 83e5fb149..46188123b 100644 --- a/src/roulette_gfx.c +++ b/src/roulette_gfx.c @@ -1626,32 +1626,33 @@ void sub_81193D4(struct Sprite *sprite) eRoulette->var38 = sprite; } -#ifdef NONMATCHING void sub_811952C(struct Sprite *sprite) { - u8 i; u8 z; u16 o; - u8 h = 0; // r10 (sp+12) - u8 j = 5; // r9 (r9) - u8 p = 0; // sp+12 (sp+16) - u8 s[10] = {}; // sp+0 (sp+0) - u16 t = Random(); // sp+16 (r10) + u8 h = 0; + u8 j = 5; + u8 p = 0; + u8 i = 0; + u8 val; + u8 s[10] = {}; + u16 rand = Random(); - eRoulette->var7D = 1; + eRoulette->var7D = 1; eRoulette->var03_5 = TRUE; eRoulette->var03_6 = FALSE; - eRoulette->var7E = 255; - eRoulette->var88 = sprite->data[3]; - eRoulette->var98 = 0.0f; - eRoulette->var8C = gUnknown_083F8DF4[eRoulette->var04_0].var1C; - o = (eRoulette->var04_0 * 30 + 33) + (1 - eRoulette->var03_0) * 15; + eRoulette->var7E = 0xFF; + eRoulette->var88 = sprite->data[3]; + eRoulette->var98 = 0.0f; + eRoulette->var8C = gUnknown_083F8DF4[eRoulette->var04_0].var1C; + + o = (eRoulette->var04_0 * 30 + 33) + (0x1 - eRoulette->var03_0) * 15; for (i = 0; i < 4; i++) { if (o < sprite->data[3] && sprite->data[3] <= o + 90) { - sprite->data[0] = i << 1; - eRoulette->var03_0 = i & 1; + sprite->data[0] = i / 2; + eRoulette->var03_0 = i % 2; break; } if (i == 3) @@ -1662,358 +1663,52 @@ void sub_811952C(struct Sprite *sprite) } o += 90; } + if (eRoulette->var03_0) { if (sprite->data[0]) - { PlayCry1(SPECIES_TAILLOW, -63); - } else - { PlayCry1(SPECIES_TAILLOW, 63); - } } else { PlayCry1(SPECIES_SHROOMISH, -63); } - i = 2; + + val = 2; z = (eRoulette->var7F + 2) % 12; + if (eRoulette->var03_0 == 1 && eRoulette->var04_0 == 1) j += 6; else - j += i; - for (; i < j; i++) + j += val; + + for (i = val; i < j; i++) { if (!(eRoulette->var08 & gUnknown_083F8D90[z].var04)) { s[h++] = i; - if (!p && (gUnknown_083F8D90[z].var04 & gUnknown_083F8C00[eRoulette->var1B[eRoulette->var1A_0]].var00)) - { + if (p == 0 && (gUnknown_083F8D90[z].var04 & gUnknown_083F8C00[eRoulette->var1B[eRoulette->var1A_0]].var0C)) p = i; - } } - z = (z + 1) % 12; + z = (z + 1) % 0xC; } + if ((eRoulette->var03_0 + 1) & eRoulette->var02) { - if (p && (t & 0xFF) < 192) - { + if (p && (rand & 0xFF) < 0xc0) sprite->data[7] = p; - } else - { - sprite->data[7] = s[t % h]; - } + sprite->data[7] = s[rand % h]; } else { - sprite->data[7] = s[t % h]; + sprite->data[7] = s[rand % h]; } + sprite->callback = sub_8118CEC; } -#else -NAKED -void sub_811952C(struct Sprite *sprite) -{ - asm_unified("push {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 20\n" - "\tmov r8, r0\n" - "\tmovs r0, 0\n" - "\tmov r10, r0\n" - "\tmovs r1, 5\n" - "\tmov r9, r1\n" - "\tmovs r2, 0\n" - "\tstr r2, [sp, 12]\n" - "\tmov r0, sp\n" - "\tmovs r1, 0\n" - "\tmovs r2, 10\n" - "\tbl memset\n" - "\tbl Random\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tstr r0, [sp, 16]\n" - "\tldr r7, _08119610 @ =gSharedMem + 0x19000\n" - "\tadds r0, r7, 0\n" - "\tadds r0, 125\n" - "\tmovs r6, 1\n" - "\tstrb r6, [r0]\n" - "\tldrb r4, [r7, 3]\n" - "\tmovs r0, 32\n" - "\torrs r4, r0\n" - "\tmovs r0, 65\n" - "\tnegs r0, r0\n" - "\tands r4, r0\n" - "\tstrb r4, [r7, 3]\n" - "\tadds r1, r7, 0\n" - "\tadds r1, 126\n" - "\tmovs r0, 255\n" - "\tstrb r0, [r1]\n" - "\tadds r5, r7, 0\n" - "\tadds r5, 136\n" - "\tmov r3, r8\n" - "\tmovs r1, 52\n" - "\tldrsh r0, [r3, r1]\n" - "\tbl __floatsisf\n" - "\tstr r0, [r5]\n" - "\tadds r1, r7, 0\n" - "\tadds r1, 152\n" - "\tldr r0, _08119614 @ =0\n" - "\tstr r0, [r1]\n" - "\tadds r3, r7, 0\n" - "\tadds r3, 140\n" - "\tldr r2, _08119618 @ =gUnknown_083F8DF4\n" - "\tldrb r0, [r7, 4]\n" - "\tlsls r0, 30\n" - "\tlsrs r1, r0, 25\n" - "\tadds r2, 28\n" - "\tadds r1, r2\n" - "\tldr r1, [r1]\n" - "\tstr r1, [r3]\n" - "\tlsrs r0, 30\n" - "\tlsls r1, r0, 4\n" - "\tsubs r1, r0\n" - "\tlsls r1, 1\n" - "\tadds r1, 33\n" - "\tlsls r4, 27\n" - "\tlsrs r4, 27\n" - "\tsubs r6, r4\n" - "\tlsls r0, r6, 4\n" - "\tsubs r0, r6\n" - "\tadds r1, r0\n" - "\tlsls r1, 16\n" - "\tlsrs r1, 16\n" - "\tmov r5, r10\n" - "\tmov r3, r8\n" - "\tmovs r0, 52\n" - "\tldrsh r2, [r3, r0]\n" - "_081195C8:\n" - "\tcmp r1, r2\n" - "\tbge _081195D4\n" - "\tadds r0, r1, 0\n" - "\tadds r0, 90\n" - "\tcmp r2, r0\n" - "\tble _08119638\n" - "_081195D4:\n" - "\tcmp r5, 3\n" - "\tbeq _0811961C\n" - "\tadds r0, r1, 0\n" - "\tadds r0, 90\n" - "\tlsls r0, 16\n" - "\tlsrs r1, r0, 16\n" - "\tadds r0, r5, 1\n" - "\tlsls r0, 24\n" - "\tlsrs r5, r0, 24\n" - "\tcmp r5, 3\n" - "\tbls _081195C8\n" - "_081195EA:\n" - "\tldr r0, _08119610 @ =gSharedMem + 0x19000\n" - "\tldrb r1, [r0, 3]\n" - "\tmovs r0, 31\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _08119664\n" - "\tmov r1, r8\n" - "\tmovs r2, 46\n" - "\tldrsh r0, [r1, r2]\n" - "\tcmp r0, 0\n" - "\tbeq _08119658\n" - "\tmovs r0, 152\n" - "\tlsls r0, 1\n" - "\tmovs r1, 63\n" - "\tnegs r1, r1\n" - "\tbl PlayCry1\n" - "\tb _08119670\n" - "\t.align 2, 0\n" - "_08119610: .4byte gSharedMem + 0x19000\n" - "_08119614: .4byte 0\n" - "_08119618: .4byte gUnknown_083F8DF4\n" - "_0811961C:\n" - "\tmovs r0, 1\n" - "\tmov r3, r8\n" - "\tstrh r0, [r3, 46]\n" - "\tldr r2, _08119634 @ =gSharedMem + 0x19000\n" - "\tldrb r1, [r2, 3]\n" - "\tsubs r0, 33\n" - "\tands r0, r1\n" - "\tmovs r1, 1\n" - "\torrs r0, r1\n" - "\tstrb r0, [r2, 3]\n" - "\tb _081195EA\n" - "\t.align 2, 0\n" - "_08119634: .4byte gSharedMem + 0x19000\n" - "_08119638:\n" - "\tlsrs r0, r5, 1\n" - "\tmov r1, r8\n" - "\tstrh r0, [r1, 46]\n" - "\tldr r3, _08119654 @ =gSharedMem + 0x19000\n" - "\tmovs r1, 1\n" - "\tands r1, r5\n" - "\tldrb r2, [r3, 3]\n" - "\tmovs r0, 32\n" - "\tnegs r0, r0\n" - "\tands r0, r2\n" - "\torrs r0, r1\n" - "\tstrb r0, [r3, 3]\n" - "\tb _081195EA\n" - "\t.align 2, 0\n" - "_08119654: .4byte gSharedMem + 0x19000\n" - "_08119658:\n" - "\tmovs r0, 152\n" - "\tlsls r0, 1\n" - "\tmovs r1, 63\n" - "\tbl PlayCry1\n" - "\tb _08119670\n" - "_08119664:\n" - "\tmovs r0, 153\n" - "\tlsls r0, 1\n" - "\tmovs r1, 63\n" - "\tnegs r1, r1\n" - "\tbl PlayCry1\n" - "_08119670:\n" - "\tmovs r5, 2\n" - "\tldr r4, _081196A0 @ =gSharedMem + 0x19000\n" - "\tadds r0, r4, 0\n" - "\tadds r0, 127\n" - "\tldrb r0, [r0]\n" - "\tadds r0, 2\n" - "\tmovs r1, 12\n" - "\tbl __modsi3\n" - "\tlsls r0, 24\n" - "\tlsrs r3, r0, 24\n" - "\tldrb r1, [r4, 3]\n" - "\tmovs r0, 31\n" - "\tands r0, r1\n" - "\tcmp r0, 1\n" - "\tbne _081196A4\n" - "\tldrb r1, [r4, 4]\n" - "\tmovs r0, 3\n" - "\tands r0, r1\n" - "\tcmp r0, 1\n" - "\tbne _081196A4\n" - "\tmov r0, r9\n" - "\tadds r0, 6\n" - "\tb _081196A8\n" - "\t.align 2, 0\n" - "_081196A0: .4byte gSharedMem + 0x19000\n" - "_081196A4:\n" - "\tmov r2, r9\n" - "\tadds r0, r2, r5\n" - "_081196A8:\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tmov r9, r0\n" - "\tcmp r5, r9\n" - "\tbcs _0811970E\n" - "\tldr r6, _08119734 @ =gSharedMem + 0x19000\n" - "\tldr r7, _08119738 @ =gUnknown_083F8C00 + 12\n" - "_081196B6:\n" - "\tlsls r0, r3, 3\n" - "\tldr r1, _0811973C @ =gUnknown_083F8D90 + 4\n" - "\tadds r0, r1\n" - "\tldr r1, [r6, 8]\n" - "\tldr r2, [r0]\n" - "\tands r1, r2\n" - "\tcmp r1, 0\n" - "\tbne _081196F8\n" - "\tmov r0, r10\n" - "\tadds r1, r0, 1\n" - "\tlsls r1, 24\n" - "\tlsrs r1, 24\n" - "\tmov r10, r1\n" - "\tadd r0, sp\n" - "\tstrb r5, [r0]\n" - "\tldr r0, [sp, 12]\n" - "\tcmp r0, 0\n" - "\tbne _081196F8\n" - "\tldrb r0, [r6, 26]\n" - "\tlsls r0, 28\n" - "\tlsrs r0, 28\n" - "\tldr r1, _08119740 @ =gSharedMem + 0x1901b\n" - "\tadds r0, r1\n" - "\tldrb r1, [r0]\n" - "\tlsls r0, r1, 2\n" - "\tadds r0, r1\n" - "\tlsls r0, 2\n" - "\tadds r0, r7\n" - "\tldr r0, [r0]\n" - "\tands r2, r0\n" - "\tcmp r2, 0\n" - "\tbeq _081196F8\n" - "\tstr r5, [sp, 12]\n" - "_081196F8:\n" - "\tadds r0, r3, 1\n" - "\tmovs r1, 12\n" - "\tbl __modsi3\n" - "\tlsls r0, 24\n" - "\tlsrs r3, r0, 24\n" - "\tadds r0, r5, 1\n" - "\tlsls r0, 24\n" - "\tlsrs r5, r0, 24\n" - "\tcmp r5, r9\n" - "\tbcc _081196B6\n" - "_0811970E:\n" - "\tldrb r0, [r4, 3]\n" - "\tlsls r0, 27\n" - "\tlsrs r0, 27\n" - "\tadds r0, 1\n" - "\tldrb r1, [r4, 2]\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _08119756\n" - "\tldr r2, [sp, 12]\n" - "\tcmp r2, 0\n" - "\tbeq _08119744\n" - "\tmovs r0, 255\n" - "\tldr r3, [sp, 16]\n" - "\tands r0, r3\n" - "\tcmp r0, 191\n" - "\tbhi _08119744\n" - "\tmov r0, r8\n" - "\tstrh r2, [r0, 60]\n" - "\tb _08119766\n" - "\t.align 2, 0\n" - "_08119734: .4byte gSharedMem + 0x19000\n" - "_08119738: .4byte gUnknown_083F8C00 + 12\n" - "_0811973C: .4byte gUnknown_083F8D90 + 4\n" - "_08119740: .4byte gSharedMem + 0x1901b\n" - "_08119744:\n" - "\tldr r0, [sp, 16]\n" - "\tmov r1, r10\n" - "\tbl __modsi3\n" - "\tadd r0, sp\n" - "\tldrb r0, [r0]\n" - "\tmov r1, r8\n" - "\tstrh r0, [r1, 60]\n" - "\tb _08119766\n" - "_08119756:\n" - "\tldr r0, [sp, 16]\n" - "\tmov r1, r10\n" - "\tbl __modsi3\n" - "\tadd r0, sp\n" - "\tldrb r0, [r0]\n" - "\tmov r2, r8\n" - "\tstrh r0, [r2, 60]\n" - "_08119766:\n" - "\tldr r3, _0811977C @ =sub_8118CEC\n" - "\tmov r0, r8\n" - "\tstr r3, [r0, 28]\n" - "\tadd sp, 20\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_0811977C: .4byte sub_8118CEC"); -} -#endif const u16 gUnknown_083FA61E[] = { BLDALPHA_BLEND( 7, 9), diff --git a/src/save.c b/src/save.c index 3eeea88de..3b6cabe6a 100644 --- a/src/save.c +++ b/src/save.c @@ -738,7 +738,7 @@ u8 Save_WriteDataInternal(u8 saveType) return 0; } -#if DEBUG +#if (DEBUG && GERMAN) extern u32 gUnknown_Debug_03004BD0; #endif @@ -749,7 +749,7 @@ u8 Save_WriteData(u8 saveType) // TrySave Save_WriteDataInternal(saveType); if (!gDamagedSaveSectors -#if DEBUG +#if (DEBUG && GERMAN) && gUnknown_Debug_03004BD0 == 0 #endif ) diff --git a/src/save_failed_screen.c b/src/save_failed_screen.c index f5544bc65..9ef5f541c 100644 --- a/src/save_failed_screen.c +++ b/src/save_failed_screen.c @@ -155,7 +155,7 @@ static void CB2_WipeSave(void) gSaveFailedClockInfo[0] = TRUE; -#if DEBUG +#if (DEBUG && !(ENGLISH && REVISION == 0)) if (gUnknown_Debug_03004BD0 != 0) gDamagedSaveSectors = 1; #endif @@ -277,7 +277,7 @@ static bool8 IsSectorNonEmpty(u16 sector) ReadFlash(sector, 0, ptr, 4096); -#if DEBUG // Don't verify the sector wipe? +#if (DEBUG && !(ENGLISH && REVISION == 0)) // Don't verify the sector wipe? for (i = 0; i < 0x400; i++, ptr++) ; return gUnknown_Debug_03004BD0; diff --git a/src/secret_base.c b/src/secret_base.c index 21dd83dd2..b37da51d1 100644 --- a/src/secret_base.c +++ b/src/secret_base.c @@ -872,7 +872,11 @@ void sub_80BC6B0(u8 taskId) Menu_PrintText(gOtherText_Exit, 18, 2 * n + 2); DestroyVerticalScrollIndicator(BOTTOM_ARROW); if (n != 7) - Menu_BlankWindowRect(18, ((n << 25) + (1 << 26)) >> 24, 28, 18); // the shifts are needed to match + { + n++; + n--; + Menu_BlankWindowRect(18, n * 2 + 4, 28, 18); + } } else { diff --git a/src/slot_machine.c b/src/slot_machine.c index c03ae0dfa..c6cbdb1c8 100644 --- a/src/slot_machine.c +++ b/src/slot_machine.c @@ -5677,7 +5677,7 @@ void debug_sub_811B310(void) PRINT_NUMBER(eSlotMachine->unk6C, 10, 5); PRINT_NUMBER(eSlotMachine->unk10, 10, 7); -#if DEBUG_TRANSLATE +#if DEBUG_FIX #define OFFSET 24 // wider window #else #define OFFSET 20 @@ -5785,7 +5785,7 @@ static void debug_sub_811B654(u8 taskId) switch (task->data[0]) { case 0: -#if DEBUG_TRANSLATE +#if DEBUG_FIX Menu_DrawStdWindowFrame(0, 0, 28, 19); // wider window #else Menu_DrawStdWindowFrame(0, 0, 24, 19); diff --git a/src/text.c b/src/text.c index dbf74ab61..d963045df 100644 --- a/src/text.c +++ b/src/text.c @@ -6,6 +6,7 @@ #include "constants/songs.h" #include "sound.h" #include "string_util.h" +#include "start_menu.h" enum { @@ -2078,7 +2079,7 @@ static u8 sub_8002FA0(struct Window *win, const u8 *text) static u8 PrintNextChar(struct Window *win) { - u8 c = win->text[win->textIndex++]; + u32 c = win->text[win->textIndex++]; // Handle special control characters switch (c) @@ -2106,6 +2107,12 @@ static u8 PrintNextChar(struct Window *win) return HandleExtCtrlCode(win); } +// TODO: see if this is in rev1+ +#if (DEBUG && ENGLISH && REVISION == 0) + // Code related to the Murakawa task. + if ((gUnknown_Debug_03004BD0) && (!gUnknown_Debug_Murakawa2)) + c = win->textMode + CHAR_0; +#endif sPrintGlyphFuncs[win->textMode](win, c); return 1; } diff --git a/src/trade.c b/src/trade.c index 424a503bf..8d57cd60b 100644 --- a/src/trade.c +++ b/src/trade.c @@ -454,46 +454,38 @@ const u8 gTradeMonSpriteCoords[][2] = { {23, 18} // CANCEL }; -const u8 gTradeLevelDisplayCoords[2][6][2] = { - { - // Your party - {5, 4}, - {12, 4}, - {5, 9}, - {12, 9}, - {5, 14}, - {12, 14}, - }, - { - // Friend's party - {20, 4}, - {27, 4}, - {20, 9}, - {27, 9}, - {20, 14}, - {27, 14} - } +const u8 gTradeLevelDisplayCoords[][2] = { + // Your party + {5, 4}, + {12, 4}, + {5, 9}, + {12, 9}, + {5, 14}, + {12, 14}, + // Friend's party + {20, 4}, + {27, 4}, + {20, 9}, + {27, 9}, + {20, 14}, + {27, 14} }; -const u8 gTradeMonBoxCoords[2][6][2] = { - { - // Your party - {1, 3}, - {8, 3}, - {1, 8}, - {8, 8}, - {1, 13}, - {8, 13}, - }, - { - // Friend's party - {16, 3}, - {23, 3}, - {16, 8}, - {23, 8}, - {16, 13}, - {23, 13} - } +const u8 gTradeMonBoxCoords[][2] = { + // Your party + {1, 3}, + {8, 3}, + {1, 8}, + {8, 8}, + {1, 13}, + {8, 13}, + // Friend's party + {16, 3}, + {23, 3}, + {16, 8}, + {23, 8}, + {16, 13}, + {23, 13} }; const u8 gTradeUnknownSpriteCoords[][2][2] = { @@ -3054,71 +3046,15 @@ void sub_804A51C(u8 a0, u8 a1, u8 a2, u8 a3, u8 a4, u8 a5) #endif } -// simple nonmatching, supposedly from a CSE optimization -#ifdef NONMATCHING static void sub_804A6DC(u8 whichParty) { int i; - for (i = 0; i < gUnknown_03004824->partyCounts[whichParty]; i ++) + for (i = 0; i < gUnknown_03004824->partyCounts[whichParty]; i++) { - sub_804A51C(whichParty, i, gTradeLevelDisplayCoords[whichParty][i][0], gTradeLevelDisplayCoords[whichParty][i][1], gTradeMonBoxCoords[whichParty][i][0], gTradeMonBoxCoords[whichParty][i][1]); + int loc = i + whichParty * 6; + sub_804A51C(whichParty, i, gTradeLevelDisplayCoords[loc][0], gTradeLevelDisplayCoords[loc][1], gTradeMonBoxCoords[loc][0], gTradeMonBoxCoords[loc][1]); } } -#else -NAKED -static void sub_804A6DC(u8 whichParty) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tsub sp, 0x8\n" - "\tlsls r0, 24\n" - "\tlsrs r6, r0, 24\n" - "\tmovs r7, 0\n" - "\tldr r0, _0804A734 @ =gUnknown_03004824\n" - "\tldr r0, [r0]\n" - "\tadds r0, 0x42\n" - "\tadds r0, r6\n" - "\tldrb r0, [r0]\n" - "\tcmp r7, r0\n" - "\tbge _0804A72C\n" - "\tlsls r0, r6, 1\n" - "\tadds r0, r6\n" - "\tldr r1, _0804A738 @ =gTradeLevelDisplayCoords\n" - "\tlsls r0, 2\n" - "\tadds r5, r0, r1\n" - "\tldr r1, _0804A73C @ =gTradeMonBoxCoords\n" - "\tadds r4, r0, r1\n" - "_0804A702:\n" - "\tlsls r1, r7, 24\n" - "\tlsrs r1, 24\n" - "\tldrb r2, [r5]\n" - "\tldrb r3, [r5, 0x1]\n" - "\tldrb r0, [r4]\n" - "\tstr r0, [sp]\n" - "\tldrb r0, [r4, 0x1]\n" - "\tstr r0, [sp, 0x4]\n" - "\tadds r0, r6, 0\n" - "\tbl sub_804A51C\n" - "\tadds r5, 0x2\n" - "\tadds r4, 0x2\n" - "\tadds r7, 0x1\n" - "\tldr r0, _0804A734 @ =gUnknown_03004824\n" - "\tldr r0, [r0]\n" - "\tadds r0, 0x42\n" - "\tadds r0, r6\n" - "\tldrb r0, [r0]\n" - "\tcmp r7, r0\n" - "\tblt _0804A702\n" - "_0804A72C:\n" - "\tadd sp, 0x8\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_0804A734: .4byte gUnknown_03004824\n" - "_0804A738: .4byte gTradeLevelDisplayCoords\n" - "_0804A73C: .4byte gTradeMonBoxCoords"); -} -#endif static void sub_804A740(u8 whichParty) { @@ -3495,68 +3431,31 @@ static void sub_804B128(void) REG_BG2Y = dest.dy; } -// register swap with volatile, wtf !how -#ifdef NONMATCHING static void sub_804B1BC(void) { - REG_BG1VOFS = gUnknown_03004828->bg1vofs, REG_BG1HOFS = gUnknown_03004828->bg1hofs; - //temp = ; - //asm(""::"r"(gUnknown_03004828->bg2vofs)); - if (REG_DISPCNT % 8 == 0) + u16 dispcnt; + + REG_BG1VOFS = gUnknown_03004828->bg1vofs; + REG_BG1HOFS = gUnknown_03004828->bg1hofs; + + /* + A u16 cast allows for REG_DISPCNT storage to be swapped. + This is required for the function to match. + + You can see this less obfuscated in FireRed and Emerald, + since they use gflib's GPU manager for this instead. + */ + dispcnt = (*(u16 *)REG_ADDR_DISPCNT); + if ((dispcnt & 7) == DISPCNT_MODE_0) { - REG_BG2VOFS = gUnknown_03004828->bg2vofs, REG_BG2HOFS = gUnknown_03004828->bg2hofs; + REG_BG2VOFS = gUnknown_03004828->bg2vofs; + REG_BG2HOFS = gUnknown_03004828->bg2hofs; } else { sub_804B128(); } } -#else -NAKED static void sub_804B1BC(void) -{ - asm_unified("\tpush {lr}\n" - "\tldr r1, _0804B1FC @ =REG_BG1VOFS\n" - "\tldr r0, _0804B200 @ =gUnknown_03004828\n" - "\tldr r2, [r0]\n" - "\tmovs r3, 0x88\n" - "\tlsls r3, 1\n" - "\tadds r0, r2, r3\n" - "\tldrh r0, [r0]\n" - "\tstrh r0, [r1]\n" - "\tsubs r1, 0x2\n" - "\tadds r3, 0x2\n" - "\tadds r0, r2, r3\n" - "\tldrh r0, [r0]\n" - "\tstrh r0, [r1]\n" - "\tmovs r0, 0x80\n" - "\tlsls r0, 19\n" - "\tldrh r0, [r0]\n" - "\tmovs r1, 0x7\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbne _0804B208\n" - "\tldr r1, _0804B204 @ =REG_BG2VOFS\n" - "\tadds r3, 0x2\n" - "\tadds r0, r2, r3\n" - "\tldrh r0, [r0]\n" - "\tstrh r0, [r1]\n" - "\tsubs r1, 0x2\n" - "\tadds r3, 0x2\n" - "\tadds r0, r2, r3\n" - "\tldrh r0, [r0]\n" - "\tstrh r0, [r1]\n" - "\tb _0804B20C\n" - "\t.align 2, 0\n" - "_0804B1FC: .4byte REG_BG1VOFS\n" - "_0804B200: .4byte gUnknown_03004828\n" - "_0804B204: .4byte REG_BG2VOFS\n" - "_0804B208:\n" - "\tbl sub_804B128\n" - "_0804B20C:\n" - "\tpop {r0}\n" - "\tbx r0"); -} -#endif static void sub_804B210(void) { diff --git a/src/trainer_card.c b/src/trainer_card.c index b6eb28005..0e44c7cfc 100644 --- a/src/trainer_card.c +++ b/src/trainer_card.c @@ -816,19 +816,12 @@ bool8 TrainerCard_InitFlipAnimation(struct Task *task) return FALSE; } -/* bool8 TrainerCard_ScaleDownFlipAnimation(struct Task *task) { - u32 r7; - u16 r9; - u32 r6; - u32 r5; - u32 r4; - u32 r10; - u32 sp0; s16 i; + u32 r4, r5, r10, r7, r6, var_24, r9, var; - ewram0_2.var_4 = 0; + ewram0_2.var_4 = FALSE; task->data[1] += 3; if (task->data[1] > 79) task->data[1] = 79; @@ -837,183 +830,33 @@ bool8 TrainerCard_ScaleDownFlipAnimation(struct Task *task) r9 = 160 - r7; r4 = r9 - r7; r6 = -r7 << 16; - r5 = (160 << 16) / r4; - r5 -= 1 << 16; - r10 = r5 * r4 + r6; - sp0 = r5 / r4; + r5 = 0xA00000 / r4; + r5 += 0xFFFF0000; + var_24 = r6 + r5 * r4; + r10 = r5 / r4; r5 *= 2; - for (i = 0; i < r7; i++) - { - gScanlineEffectRegBuffers.filler0[i] = -4 - (u32)i; - } - //_08093B74 - for (; i < r9; i++) + for (i = 0; i < r7; + // WHAT?! + gScanlineEffectRegBuffers[0][i] = (u32)-i + -4, + i++); + for (; i < (s16)r9; i++) { - u16 var = r6 >> 16; + var = r6 >> 16; r6 += r5; - r5 -= sp0; - gScanlineEffectRegBuffers.filler0[i] = -4 + var; + r5 -= r10; + gScanlineEffectRegBuffers[0][i] = var + -4; } - for (; i < 160; i++) - gScanlineEffectRegBuffers.filler0[i] = -4 + (u16)(r10 >> 16); - ewram0_2.var_4 = 1; - if (task->data[1] > 0x4A) + for (var = var_24 >> 16; i < 160; + // WHAT?! + gScanlineEffectRegBuffers[0][i] = var + -4, + i++); + + ewram0_2.var_4 = TRUE; + if (task->data[1] > 74) task->data[0]++; - return FALSE; -} -*/ -NAKED -bool8 TrainerCard_ScaleDownFlipAnimation(struct Task *task) -{ - 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, 0x4\n\ - mov r8, r0\n\ - ldr r1, _08093BFC @ =gSharedMem\n\ - movs r0, 0\n\ - strb r0, [r1, 0x4]\n\ - mov r2, r8\n\ - ldrh r0, [r2, 0xA]\n\ - adds r0, 0x3\n\ - strh r0, [r2, 0xA]\n\ - lsls r0, 16\n\ - asrs r0, 16\n\ - cmp r0, 0x4F\n\ - ble _08093B18\n\ - movs r0, 0x4F\n\ - strh r0, [r2, 0xA]\n\ -_08093B18:\n\ - mov r4, r8\n\ - movs r0, 0xA\n\ - ldrsh r7, [r4, r0]\n\ - movs r0, 0xA0\n\ - subs r0, r7\n\ - mov r9, r0\n\ - subs r4, r0, r7\n\ - negs r0, r7\n\ - lsls r6, r0, 16\n\ - movs r0, 0xA0\n\ - lsls r0, 16\n\ - adds r1, r4, 0\n\ - bl __udivsi3\n\ - adds r5, r0, 0\n\ - ldr r1, _08093C00 @ =0xffff0000\n\ - adds r5, r1\n\ - adds r0, r5, 0\n\ - muls r0, r4\n\ - adds r0, r6\n\ - mov r10, r0\n\ - adds r0, r5, 0\n\ - adds r1, r4, 0\n\ - bl __udivsi3\n\ - str r0, [sp]\n\ - lsls r5, 1\n\ - movs r3, 0\n\ - cmp r3, r7\n\ - bcs _08093B74\n\ - ldr r2, _08093C04 @ =gScanlineEffectRegBuffers\n\ - mov r12, r2\n\ - ldr r0, _08093C08 @ =0x0000fffc\n\ - adds r4, r0, 0\n\ -_08093B5C:\n\ - lsls r0, r3, 16\n\ - asrs r0, 16\n\ - lsls r1, r0, 1\n\ - add r1, r12\n\ - subs r2, r4, r0\n\ - strh r2, [r1]\n\ - adds r0, 0x1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - asrs r0, 16\n\ - cmp r0, r7\n\ - bcc _08093B5C\n\ -_08093B74:\n\ - lsls r2, r3, 16\n\ - mov r1, r9\n\ - lsls r0, r1, 16\n\ - asrs r1, r0, 16\n\ - mov r4, r10\n\ - lsrs r7, r4, 16\n\ - cmp r2, r0\n\ - bge _08093BAE\n\ - ldr r0, _08093C04 @ =gScanlineEffectRegBuffers\n\ - mov r9, r0\n\ - ldr r4, _08093C08 @ =0x0000fffc\n\ - mov r12, r4\n\ - adds r4, r1, 0\n\ -_08093B8E:\n\ - lsrs r1, r6, 16\n\ - adds r6, r5\n\ - ldr r0, [sp]\n\ - subs r5, r0\n\ - asrs r2, 16\n\ - lsls r0, r2, 1\n\ - add r0, r9\n\ - add r1, r12\n\ - strh r1, [r0]\n\ - adds r2, 0x1\n\ - lsls r2, 16\n\ - lsrs r3, r2, 16\n\ - lsls r2, r3, 16\n\ - asrs r0, r2, 16\n\ - cmp r0, r4\n\ - blt _08093B8E\n\ -_08093BAE:\n\ - adds r1, r7, 0\n\ - lsls r0, r3, 16\n\ - asrs r0, 16\n\ - cmp r0, 0x9F\n\ - bgt _08093BD4\n\ - ldr r4, _08093C04 @ =gScanlineEffectRegBuffers\n\ - ldr r0, _08093C08 @ =0x0000fffc\n\ - adds r2, r1, r0\n\ -_08093BBE:\n\ - lsls r1, r3, 16\n\ - asrs r1, 16\n\ - lsls r0, r1, 1\n\ - adds r0, r4\n\ - strh r2, [r0]\n\ - adds r1, 0x1\n\ - lsls r1, 16\n\ - lsrs r3, r1, 16\n\ - asrs r1, 16\n\ - cmp r1, 0x9F\n\ - ble _08093BBE\n\ -_08093BD4:\n\ - movs r0, 0x1\n\ - ldr r1, _08093BFC @ =gSharedMem\n\ - strb r0, [r1, 0x4]\n\ - mov r2, r8\n\ - movs r4, 0xA\n\ - ldrsh r0, [r2, r4]\n\ - cmp r0, 0x4A\n\ - ble _08093BEA\n\ - ldrh r0, [r2, 0x8]\n\ - adds r0, 0x1\n\ - strh r0, [r2, 0x8]\n\ -_08093BEA:\n\ - movs r0, 0\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_08093BFC: .4byte gSharedMem\n\ -_08093C00: .4byte 0xffff0000\n\ -_08093C04: .4byte gScanlineEffectRegBuffers\n\ -_08093C08: .4byte 0x0000fffc\n\ - .syntax divided\n"); + return FALSE; } bool8 TrainerCard_SwitchToNewSide(struct Task *task) @@ -1028,154 +871,47 @@ bool8 TrainerCard_SwitchToNewSide(struct Task *task) return TRUE; } -NAKED bool8 TrainerCard_ScaleUpFlipAnimation(struct Task *task) { - 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, 0x4\n\ - mov r8, r0\n\ - ldr r1, _08093D40 @ =gSharedMem\n\ - movs r2, 0\n\ - strb r2, [r1, 0x4]\n\ - ldrh r0, [r0, 0xA]\n\ - subs r0, 0x3\n\ - mov r3, r8\n\ - strh r0, [r3, 0xA]\n\ - lsls r0, 16\n\ - cmp r0, 0\n\ - bgt _08093C5C\n\ - strh r2, [r3, 0xA]\n\ -_08093C5C:\n\ - mov r4, r8\n\ - movs r0, 0xA\n\ - ldrsh r7, [r4, r0]\n\ - movs r0, 0xA0\n\ - subs r0, r7\n\ - mov r9, r0\n\ - subs r4, r0, r7\n\ - negs r0, r7\n\ - lsls r6, r0, 16\n\ - movs r0, 0xA0\n\ - lsls r0, 16\n\ - adds r1, r4, 0\n\ - bl __udivsi3\n\ - adds r5, r0, 0\n\ - ldr r1, _08093D44 @ =0xffff0000\n\ - adds r5, r1\n\ - adds r0, r5, 0\n\ - muls r0, r4\n\ - adds r0, r6\n\ - mov r10, r0\n\ - adds r0, r5, 0\n\ - adds r1, r4, 0\n\ - bl __udivsi3\n\ - str r0, [sp]\n\ - lsrs r5, 1\n\ - movs r3, 0\n\ - cmp r3, r7\n\ - bcs _08093CB8\n\ - ldr r2, _08093D48 @ =gScanlineEffectRegBuffers\n\ - mov r12, r2\n\ - ldr r0, _08093D4C @ =0x0000fffc\n\ - adds r4, r0, 0\n\ -_08093CA0:\n\ - lsls r0, r3, 16\n\ - asrs r0, 16\n\ - lsls r1, r0, 1\n\ - add r1, r12\n\ - subs r2, r4, r0\n\ - strh r2, [r1]\n\ - adds r0, 0x1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - asrs r0, 16\n\ - cmp r0, r7\n\ - bcc _08093CA0\n\ -_08093CB8:\n\ - lsls r2, r3, 16\n\ - mov r1, r9\n\ - lsls r0, r1, 16\n\ - asrs r1, r0, 16\n\ - mov r4, r10\n\ - lsrs r7, r4, 16\n\ - cmp r2, r0\n\ - bge _08093CF2\n\ - ldr r0, _08093D48 @ =gScanlineEffectRegBuffers\n\ - mov r9, r0\n\ - ldr r3, _08093D4C @ =0x0000fffc\n\ - mov r12, r3\n\ - adds r4, r1, 0\n\ -_08093CD2:\n\ - lsrs r1, r6, 16\n\ - adds r6, r5\n\ - ldr r0, [sp]\n\ - adds r5, r0\n\ - asrs r2, 16\n\ - lsls r0, r2, 1\n\ - add r0, r9\n\ - add r1, r12\n\ - strh r1, [r0]\n\ - adds r2, 0x1\n\ - lsls r2, 16\n\ - lsrs r3, r2, 16\n\ - lsls r2, r3, 16\n\ - asrs r0, r2, 16\n\ - cmp r0, r4\n\ - blt _08093CD2\n\ -_08093CF2:\n\ - adds r1, r7, 0\n\ - lsls r0, r3, 16\n\ - asrs r0, 16\n\ - cmp r0, 0x9F\n\ - bgt _08093D18\n\ - ldr r4, _08093D48 @ =gScanlineEffectRegBuffers\n\ - ldr r0, _08093D4C @ =0x0000fffc\n\ - adds r2, r1, r0\n\ -_08093D02:\n\ - lsls r1, r3, 16\n\ - asrs r1, 16\n\ - lsls r0, r1, 1\n\ - adds r0, r4\n\ - strh r2, [r0]\n\ - adds r1, 0x1\n\ - lsls r1, 16\n\ - lsrs r3, r1, 16\n\ - asrs r1, 16\n\ - cmp r1, 0x9F\n\ - ble _08093D02\n\ -_08093D18:\n\ - movs r0, 0x1\n\ - ldr r1, _08093D40 @ =gSharedMem\n\ - strb r0, [r1, 0x4]\n\ - mov r2, r8\n\ - movs r3, 0xA\n\ - ldrsh r0, [r2, r3]\n\ - cmp r0, 0\n\ - bgt _08093D2E\n\ - ldrh r0, [r2, 0x8]\n\ - adds r0, 0x1\n\ - strh r0, [r2, 0x8]\n\ -_08093D2E:\n\ - movs r0, 0\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_08093D40: .4byte gSharedMem\n\ -_08093D44: .4byte 0xffff0000\n\ -_08093D48: .4byte gScanlineEffectRegBuffers\n\ -_08093D4C: .4byte 0x0000fffc\n\ - .syntax divided\n"); + s16 i; + u32 r4, r5, r10, r7, r6, var_24, r9, var; + + ewram0_2.var_4 = FALSE; + task->data[1] -= 3; + if (task->data[1] <= 0) + task->data[1] = 0; + + r7 = task->data[1]; + r9 = 160 - r7; + r4 = r9 - r7; + r6 = -r7 << 16; + r5 = 0xA00000 / r4; + r5 += 0xFFFF0000; + var_24 = r6 + r5 * r4; + r10 = r5 / r4; + r5 /= 2; + + for (i = 0; i < r7; + // WHAT?! + gScanlineEffectRegBuffers[0][i] = (u32)-i + -4, + i++); + for (; i < (s16)r9; i++) + { + var = r6 >> 16; + r6 += r5; + r5 += r10; + gScanlineEffectRegBuffers[0][i] = var + -4; + } + for (var = var_24 >> 16; i < 160; + // WHAT?! + gScanlineEffectRegBuffers[0][i] = var + -4, + i++); + + ewram0_2.var_4 = TRUE; + if (task->data[1] <= 0) + task->data[0]++; + + return FALSE; } bool8 TrainerCard_FinishFlipAnimation(struct Task *task) diff --git a/src/use_pokeblock.c b/src/use_pokeblock.c index e13369c0b..8fff9edee 100644 --- a/src/use_pokeblock.c +++ b/src/use_pokeblock.c @@ -40,7 +40,7 @@ static const u8 gUnknown_0840612C[] = { 0, 4, 3, 2, 1 }; -static const u8 *const sContextStatNames[] = { +static const u8 *const sContestStatNames[] = { OtherText_Coolness, OtherText_Toughness, OtherText_Smartness, @@ -683,12 +683,19 @@ static void Pokeblock_MenuWindowTextPrint(const u8 *message) Menu_PrintText(message, 1, 17); } -#ifdef NONMATCHING -static void Pokeblock_BufferEnhancedStatText(u8 *dest, u8 statID, s16 a2) +void Pokeblock_BufferEnhancedStatText(u8 *dest, u8 statId, s16 enhanced) { - if (a2 != 0) + if (enhanced) { - StringCopy(dest, sContextStatNames[statID]); + // This is a joke. + if (enhanced > 0) + enhanced = 0; + + if (enhanced < 0) + // matches, but can also be a variety of values too + { u8 unk = -unk; } // see water.c for a similar behavior + + StringCopy(dest, sContestStatNames[statId]); StringAppend(dest, gOtherText_WasEnhanced); } else @@ -696,49 +703,6 @@ static void Pokeblock_BufferEnhancedStatText(u8 *dest, u8 statID, s16 a2) StringCopy(dest, gOtherText_NothingChanged); } } -#else -NAKED -static void Pokeblock_BufferEnhancedStatText(u8 *dest, u8 a1, s16 a2) -{ - asm_unified("\tpush {r4,lr}\n" - "\tadds r4, r0, 0\n" - "\tlsls r1, 24\n" - "\tlsrs r3, r1, 24\n" - "\tlsls r2, 16\n" - "\tlsrs r0, r2, 16\n" - "\tasrs r2, 16\n" - "\tcmp r2, 0\n" - "\tbeq _08136DFC\n" - "\tcmp r2, 0\n" - "\tble _08136DD8\n" - "\tmovs r0, 0\n" - "_08136DD8:\n" - "\tlsls r0, 16\n" - "\tldr r1, _08136DF4 @ =sContextStatNames\n" - "\tlsls r0, r3, 2\n" - "\tadds r0, r1\n" - "\tldr r1, [r0]\n" - "\tadds r0, r4, 0\n" - "\tbl StringCopy\n" - "\tldr r1, _08136DF8 @ =gOtherText_WasEnhanced\n" - "\tadds r0, r4, 0\n" - "\tbl StringAppend\n" - "\tb _08136E04\n" - "\t.align 2, 0\n" - "_08136DF4: .4byte sContextStatNames\n" - "_08136DF8: .4byte gOtherText_WasEnhanced\n" - "_08136DFC:\n" - "\tldr r1, _08136E0C @ =gOtherText_NothingChanged\n" - "\tadds r0, r4, 0\n" - "\tbl StringCopy\n" - "_08136E04:\n" - "\tpop {r4}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_08136E0C: .4byte gOtherText_NothingChanged"); -} -#endif static void Pokeblock_GetMonContestStats(struct Pokemon *pokemon, u8 *data) { diff --git a/src/util.c b/src/util.c index 2e76cf4de..ed59ac241 100644 --- a/src/util.c +++ b/src/util.c @@ -152,10 +152,6 @@ void DoBgAffineSet(struct BgAffineDstData *dest, u32 texX, u32 texY, s16 scrX, s BgAffineSet(&src, dest, 1); } -#ifdef NONMATCHING - -// Functionally equivalent. -// Only the two yflip loops don't match. void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output) { u8 x, y; @@ -170,27 +166,22 @@ void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output) for (x = 0; x < w; x++) { - int tile = (*tilemap & 0x3ff) * 32; + u16 tile = (*tilemap & 0x3ff) * 32; int attr = *tilemap & 0xc00; if (attr == 0) { - void *src = tiles + tile; - void *dest = output; - int length = 32; - DmaCopy32(3, src, dest, length); + DmaCopy32Defvars(3, tiles + tile, output, 32); } else if (attr == 0x800) // yflip { for (i = 0; i < 8; i++) { - void *src = tiles; - void *dest = output; - int length = 4; - // this is likely wrong, but makes it closer to matching - src += tile + (7 - i) * 4; - dest += i * 4; - DmaCopy32(3, src, dest, length); + u8 requiredForMatching = 0; + + ++requiredForMatching; + --requiredForMatching; + DmaCopy32Defvars(3, tile + (7 - i) * 4 + tiles, output + i * 4, 4); } } else // xflip @@ -200,26 +191,22 @@ void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output) for (j = 0; j < 4; j++) { u8 i2 = i * 4; - xflip[i2 + (3-j)] = (tiles[tile + i2 + j] & 0xf) << 4; - xflip[i2 + (3-j)] |= tiles[tile + i2 + j] >> 4; + xflip[i2 + (3 - j)] = (tiles[tile + i2 + j] & 0xf) << 4; + xflip[i2 + (3 - j)] |= tiles[tile + i2 + j] >> 4; } } if (*tilemap & 0x800) // yflip { for (i = 0; i < 8; i++) { - void *src = xflip + (7-i) * 4; - void *dest = output + i*4; - int length = 4; - DmaCopy32(3, src, dest, length); + ++tile; + --tile; + DmaCopy32Defvars(3, (7 - i) * 4 + xflip, output + i * 4, 4); } } else { - void *src = xflip; - void *dest = output; - int length = 32; - DmaCopy32(3, src, dest, length); + DmaCopy32Defvars(3, xflip, output, 32); } } tilemap++; @@ -229,253 +216,6 @@ void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output) } } -#else - -NAKED void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output) -{ - asm("\n" - " .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, 0x3C\n" - " str r2, [sp, 0x20]\n" - " adds r4, r3, 0\n" - " ldr r7, [sp, 0x5C]\n" - " lsls r0, 24\n" - " lsls r1, 24\n" - " ldr r2, _08041008 @ =gSpriteDimensions\n" - " lsrs r1, 23\n" - " lsrs r0, 21\n" - " adds r1, r0\n" - " adds r0, r2, 0x1\n" - " adds r0, r1, r0\n" - " ldrb r0, [r0]\n" - " str r0, [sp, 0x24]\n" - " adds r1, r2\n" - " ldrb r1, [r1]\n" - " str r1, [sp, 0x28]\n" - " movs r1, 0\n" - " cmp r1, r0\n" - " bcc _08040FB4\n" - " b _08041136\n" - "_08040FB4:\n" - " movs r0, 0x20\n" - " ldr r2, [sp, 0x28]\n" - " subs r0, r2\n" - " lsls r0, 1\n" - " str r0, [sp, 0x2C]\n" - "_08040FBE:\n" - " movs r2, 0\n" - " adds r1, 0x1\n" - " str r1, [sp, 0x34]\n" - " ldr r3, [sp, 0x28]\n" - " cmp r2, r3\n" - " bcc _08040FCC\n" - " b _08041124\n" - "_08040FCC:\n" - " ldr r0, _0804100C @ =0x040000d4\n" - " mov r8, r0\n" - "_08040FD0:\n" - " ldrh r1, [r4]\n" - " ldr r0, _08041010 @ =0x000003ff\n" - " ands r0, r1\n" - " lsls r0, 5\n" - " mov r12, r0\n" - " movs r0, 0xC0\n" - " lsls r0, 4\n" - " ands r0, r1\n" - " mov r3, sp\n" - " strh r1, [r3, 0x38]\n" - " cmp r0, 0\n" - " bne _08041018\n" - " ldr r0, [sp, 0x20]\n" - " add r0, r12\n" - " mov r1, r8\n" - " str r0, [r1]\n" - " str r7, [r1, 0x4]\n" - " ldr r3, _08041014 @ =0x84000008\n" - " str r3, [r1, 0x8]\n" - " ldr r0, [r1, 0x8]\n" - " adds r4, 0x2\n" - " str r4, [sp, 0x30]\n" - " adds r7, 0x20\n" - " mov r10, r7\n" - " adds r2, 0x1\n" - " mov r9, r2\n" - " b _08041112\n" - " .align 2, 0\n" - "_08041008: .4byte gSpriteDimensions\n" - "_0804100C: .4byte 0x040000d4\n" - "_08041010: .4byte 0x000003ff\n" - "_08041014: .4byte 0x84000008\n" - "_08041018:\n" - " movs r1, 0x80\n" - " lsls r1, 4\n" - " cmp r0, r1\n" - " bne _08041068\n" - " movs r3, 0\n" - " adds r4, 0x2\n" - " str r4, [sp, 0x30]\n" - " movs r0, 0x20\n" - " adds r0, r7\n" - " mov r10, r0\n" - " adds r2, 0x1\n" - " mov r9, r2\n" - " ldr r4, _08041060 @ =0x040000d4\n" - " ldr r6, _08041064 @ =0x84000001\n" - " movs r5, 0x7\n" - "_08041036:\n" - " lsls r2, r3, 24\n" - " asrs r2, 24\n" - " subs r0, r5, r2\n" - " lsls r0, 2\n" - " add r0, r12\n" - " ldr r1, [sp, 0x20]\n" - " adds r0, r1, r0\n" - " lsls r1, r2, 2\n" - " adds r1, r7, r1\n" - " str r0, [r4]\n" - " str r1, [r4, 0x4]\n" - " str r6, [r4, 0x8]\n" - " ldr r0, [r4, 0x8]\n" - " adds r2, 0x1\n" - " lsls r2, 24\n" - " lsrs r3, r2, 24\n" - " asrs r2, 24\n" - " cmp r2, 0x7\n" - " ble _08041036\n" - " b _08041112\n" - " .align 2, 0\n" - "_08041060: .4byte 0x040000d4\n" - "_08041064: .4byte 0x84000001\n" - "_08041068:\n" - " movs r3, 0\n" - " adds r4, 0x2\n" - " str r4, [sp, 0x30]\n" - " movs r0, 0x20\n" - " adds r0, r7\n" - " mov r10, r0\n" - " adds r2, 0x1\n" - " mov r9, r2\n" - "_08041078:\n" - " movs r2, 0\n" - " lsls r4, r3, 24\n" - " lsls r0, r4, 2\n" - " lsrs r0, 24\n" - " adds r6, r0, 0x3\n" - " mov r1, r12\n" - " adds r5, r1, r0\n" - "_08041086:\n" - " lsls r1, r2, 24\n" - " asrs r1, 24\n" - " subs r0, r6, r1\n" - " mov r2, sp\n" - " adds r3, r2, r0\n" - " adds r0, r5, r1\n" - " ldr r2, [sp, 0x20]\n" - " adds r0, r2, r0\n" - " ldrb r2, [r0]\n" - " movs r0, 0xF\n" - " ands r0, r2\n" - " lsls r0, 4\n" - " lsrs r2, 4\n" - " orrs r0, r2\n" - " strb r0, [r3]\n" - " adds r1, 0x1\n" - " lsls r1, 24\n" - " lsrs r2, r1, 24\n" - " asrs r1, 24\n" - " cmp r1, 0x3\n" - " ble _08041086\n" - " movs r3, 0x80\n" - " lsls r3, 17\n" - " adds r0, r4, r3\n" - " lsrs r3, r0, 24\n" - " asrs r0, 24\n" - " cmp r0, 0x7\n" - " ble _08041078\n" - " movs r0, 0x80\n" - " lsls r0, 4\n" - " mov r1, sp\n" - " ldrh r1, [r1, 0x38]\n" - " ands r0, r1\n" - " cmp r0, 0\n" - " beq _08041104\n" - " movs r3, 0\n" - " ldr r4, _080410FC @ =0x040000d4\n" - " ldr r6, _08041100 @ =0x84000001\n" - " movs r5, 0x7\n" - "_080410D4:\n" - " lsls r1, r3, 24\n" - " asrs r1, 24\n" - " subs r0, r5, r1\n" - " lsls r0, 2\n" - " mov r3, sp\n" - " adds r2, r3, r0\n" - " lsls r0, r1, 2\n" - " adds r0, r7, r0\n" - " str r2, [r4]\n" - " str r0, [r4, 0x4]\n" - " str r6, [r4, 0x8]\n" - " ldr r0, [r4, 0x8]\n" - " adds r1, 0x1\n" - " lsls r1, 24\n" - " lsrs r3, r1, 24\n" - " asrs r1, 24\n" - " cmp r1, 0x7\n" - " ble _080410D4\n" - " b _08041112\n" - " .align 2, 0\n" - "_080410FC: .4byte 0x040000d4\n" - "_08041100: .4byte 0x84000001\n" - "_08041104:\n" - " mov r0, sp\n" - " mov r1, r8\n" - " str r0, [r1]\n" - " str r7, [r1, 0x4]\n" - " ldr r2, _08041148 @ =0x84000008\n" - " str r2, [r1, 0x8]\n" - " ldr r0, [r1, 0x8]\n" - "_08041112:\n" - " ldr r4, [sp, 0x30]\n" - " mov r7, r10\n" - " mov r3, r9\n" - " lsls r0, r3, 24\n" - " lsrs r2, r0, 24\n" - " ldr r0, [sp, 0x28]\n" - " cmp r2, r0\n" - " bcs _08041124\n" - " b _08040FD0\n" - "_08041124:\n" - " ldr r1, [sp, 0x2C]\n" - " adds r4, r1\n" - " ldr r2, [sp, 0x34]\n" - " lsls r0, r2, 24\n" - " lsrs r1, r0, 24\n" - " ldr r3, [sp, 0x24]\n" - " cmp r1, r3\n" - " bcs _08041136\n" - " b _08040FBE\n" - "_08041136:\n" - " add sp, 0x3C\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" - "_08041148: .4byte 0x84000008\n" - " .syntax divided\n" - ); -} - -#endif - int CountTrailingZeroBits(u32 value) { u8 i; |