diff options
author | garak <garakmon@gmail.com> | 2018-08-23 22:15:03 -0400 |
---|---|---|
committer | garak <garakmon@gmail.com> | 2018-08-23 22:15:03 -0400 |
commit | 9f0bbcdd6f7fe3d18320ec692478b4fdfc313e68 (patch) | |
tree | 53517a7a6c2ac343a1105801206f3aab0f80fc07 /src | |
parent | bbe876153c2a0903a30b37734874bf63ca6d8a10 (diff) |
non match a couple, split gUnknown_083D9DC4
Diffstat (limited to 'src')
-rw-r--r-- | src/battle/anim/ice.c | 338 |
1 files changed, 151 insertions, 187 deletions
diff --git a/src/battle/anim/ice.c b/src/battle/anim/ice.c index d072b7712..798c47fdb 100644 --- a/src/battle/anim/ice.c +++ b/src/battle/anim/ice.c @@ -373,19 +373,18 @@ const struct SpriteTemplate gBattleAnimSpriteTemplate_83D9DAC = .callback = sub_80D8700, }; -// bitfield array -const u32 gUnknown_083D9DC4[] = -{ - 0x2001E064, - 0x0001E055, - 0x1011E0F2, - 0x1021E042, - 0x0031E0B6, - 0x2001E03C, - 0x0011E0D6, - 0x1001E071, - 0x1031E0D2, - 0x0021E026, +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 union AffineAnimCmd gSpriteAffineAnim_83D9DEC[] = @@ -1403,200 +1402,107 @@ static void sub_80D8700(struct Sprite *sprite) sprite->callback = sub_80D8874; } -/* -// (Probably) not equivalent +#ifdef NONMATCHING +// functionally correct, but there appears to be an unused local variable causing +// switch case 1 to not match static void sub_80D8874(struct Sprite *sprite) { - s16 r0, r3; - s8 r1; + int value; + register s16 value2 asm("r5"); - // is this a temp var? - if ((sprite->data[7] & 0xFF) != 1) // cmp 1 + switch (sprite->data[7] & 0xFF) { - // - if ((sprite->data[7] & 0xFF) <= 1) // cmp 2 - { - // - if ((sprite->data[7] & 0xFF) != 0) // cmp 3 - { - // _AD0 - return; - } - // _896 (else?) - TranslateAnimLinear(sprite); - sprite->pos2.x += ((sprite->data[5] * 2 + gSineTable[0]) >> 4); - - if (sprite->data[6] != 0) // cmp 5 - { - // ... - r0 = sprite->data[5] - 8; - } - else // == - { - // _8C4 - r0 = sprite->data[5] + 8; - } - // _8C8 - sprite->data[5] = r0 & 0xFF; + case 0: + TranslateAnimLinear(sprite); + value = gSineTable[sprite->data[5]]; + sprite->pos2.x += value >> 4; + if (sprite->data[6]) + sprite->data[5] = (sprite->data[5] - 8) & 0xFF; + else + sprite->data[5] = (sprite->data[5] + 8) & 0xFF; - if (sprite->data[0] >= 0) // cmp 6 - { - // _AD0 - return; - } - // < _8D6 (else?) - // is this a temp var? + if (sprite->data[0] <= 0) + { + value2 = 80; + sprite->data[0] = value2; sprite->pos1.x = GetBattlerSpriteCoord(gAnimBankTarget, 0); - sprite->data[1] = GetBattlerSpriteCoord(gAnimBankTarget, 0); - sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 0); - - // is sprite->pos2.y + sprite->pos1.y also a temp var??? + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = sprite->pos1.x; sprite->pos1.y += sprite->pos2.y; - sprite->data[3] = sprite->pos2.y + sprite->pos1.y; - sprite->data[4] = sprite->pos2.y + sprite->pos1.y + 0x1D; - - sprite->data[7] += 1; - - if ((gMain.inBattle & 2) != 0 - || (gBanksBySide[gAnimBankTarget] & 1) != 0) // cmp 7 || cmp 8 - { - // ... + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = sprite->pos1.y + 29; + sprite->data[7]++; + if (gMain.inBattle && gBanksBySide[gAnimBankTarget] & 1) sprite->data[5] = 204; - } else - { - // _938 - sprite->data[5] = 80; - } - // _93A - sprite->pos2.y = 0; + sprite->data[5] = value2; - sprite->pos2.x = (sprite->data[5] * 2 + gSineTable[0]) >> 3; + sprite->pos2.y = 0; + value = gSineTable[sprite->data[5]]; + sprite->pos2.x = value >> 3; sprite->data[5] = (sprite->data[5] + 2) & 0xFF; - InitAnimLinearTranslation(sprite); - - return; } - else // > - { - // _88E // could this be an else if? - if ((sprite->data[7] & 0xFF) == 2) // cmp 4 - { - // _A94 - if (TranslateAnimLinear(sprite) != 0) // cmp 15 - { - if ((sprite->oam.affineMode & 1) != 0) // cmp 16 - { - //... - FreeOamMatrix(sprite->oam.matrixNum); - sprite->oam.affineMode = (sprite->oam.affineMode & -4); - } - // _AC2 - DestroySprite(sprite); // &sprite? - gAnimVisualTaskCount--; - - return; - } // else? - return; - } - else - { - // _894 - return; - } - } - } - else // == - { - // _968 + break; + case 1: TranslateAnimLinear(sprite); - - sprite->pos2.x += (sprite->data[5] * 2 + gSineTable[0]) >> 3; // ??? - sprite->pos2.y += (-3 * gSineTable[(sprite->data[5] + 64) << 1]) >> 8; // which one of these is closer? - - if ((gMain.inBattle & 2) != 0) // cmp 9 + value = gSineTable[sprite->data[5]]; + sprite->pos2.x += value >> 3; + sprite->pos2.y += (gSineTable[sprite->data[5] + 0x40] * -3) >> 8; + if (gMain.inBattle) { - // - r3 = sprite->data[5]; - - if ((u16)(sprite->data[5] - 64) <= 0x7F) // cmp 10 - { - // ... - r1 = sprite->data[7]; - } + u16 var0 = sprite->data[5] - 0x40; + if (var0 <= 0x7F) + sprite->oam.priority = sprite->data[7] >> 8; else - { - // _9D4 - r1 = sprite->data[7] + 1; - } - // _9DC - sprite->oam.priority = (sprite->oam.priority & -13) | (r1 & 3) << 2; - r0 = r3 + 4; + sprite->oam.priority = (sprite->data[7] >> 8) + 1; + + sprite->data[5] = (sprite->data[5] + 4) & 0xFF; } - else // == + else { - // _9F2 - if ((u16)(sprite->data[5] - 64) <= 0x7F) // cmp 11 - { - // ... &spite->subpriority ??? - r1 = sprite->subpriority; - r0 = 128; - } - else // > - { - // _A06 - r1 = sprite->subpriority; - r0 = 140; - } - // _A0C // *r1 ??? - sprite->subpriority = r0; - r0 = sprite->data[5] - 4; - } - // _A12 - sprite->data[5] = r0 & 0xFF; - sprite->data[0] = 768; - - sprite->pos1.x = sprite->pos2.x + sprite->pos1.x;//+= sprite->pos2.x; - sprite->data[1] = sprite->pos2.x + sprite->pos1.x; - - sprite->pos1.y = sprite->pos2.y + sprite->pos1.y; - sprite->data[3] = sprite->pos2.y + sprite->pos1.y; + u16 var0 = sprite->data[5] - 0x40; + if (var0 <= 0x7F) + sprite->subpriority = 128; + else + sprite->subpriority = 140; - sprite->data[4] = sprite->pos2.y + sprite->pos1.y + 4; + sprite->data[5] = (sprite->data[5] - 4) & 0xFF; + } - if (sprite->data[0] <= 0) // cmp 12 + if (sprite->data[0] <= 0) { - // - if ((gMain.inBattle & 2) != 0 - || (gBanksBySide[gAnimBankTarget] & 1) != 0) // cmp 13 || cmp 14 - { - // - r0 = 0x80 << 1; - } + 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 && gBanksBySide[gAnimBankTarget] & 1) + sprite->data[2] = 0x100; else + sprite->data[2] = -0x10; + + sprite->data[7]++; + sprite->pos2.x = sprite->pos2.y = 0; + sub_8078BD4(sprite); + } + break; + case 2: + if (TranslateAnimLinear(sprite)) + { + if (sprite->oam.affineMode & 1) { - // _A78 - r0 = 0xFFF0; + FreeOamMatrix(sprite->oam.matrixNum); + sprite->oam.affineMode = ST_OAM_AFFINE_OFF; } - // _A7A - sprite->data[2] = r0; - sprite->data[7] += 1; - - sprite->pos2.y = 0; - sprite->pos1.x = 0; - sub_8078BD4(sprite); + DestroySprite(sprite); + gAnimVisualTaskCount--; } - // _AD0 - return; + break; } - - // _AD0 / return - return; } -*/ - +#else NAKED static void sub_80D8874(struct Sprite *sprite) { asm_unified("\tpush {r4-r6,lr}\n" @@ -1910,6 +1816,7 @@ NAKED static void sub_80D8874(struct Sprite *sprite) "\t.align 2, 0\n" "_080D8AD8: .4byte gAnimVisualTaskCount"); } +#endif // NONMATCHING void sub_80D8ADC(u8 taskId) { @@ -1963,9 +1870,10 @@ static void sub_80D8AF8(u8 taskId) } } + /* -// -void sub_80D8BA8(u8 a1, u8 a2, u8 a3, u8 a4)//(u8 spriteId, u8 taskId, u8 a3)//(u8 taskId) +// possibly equivalent, possibly not +bool8 sub_80D8BA8(u8 a1, u8 a2, u8 a3, u8 a4)//(u8 spriteId, u8 taskId, u8 a3)//(u8 taskId) { // //struct Task *task = &gTasks[a2]; @@ -1973,19 +1881,74 @@ void sub_80D8BA8(u8 a1, u8 a2, u8 a3, u8 a4)//(u8 spriteId, u8 taskId, u8 a3)//( //task->data[3]++; //u8 r5bank = ; - if (gUnknown_083D9DC4[a1+0x3] >> 4 != 2 - || IsAnimBankSpriteVisible(GetBattlerAtPosition(gUnknown_083D9DC4[a1+0x2]))) + //const struct SpriteTemplate *spriteTemplate; + u8 spriteId; + + 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]))) { - // + //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]) + { + case 0: + // + r7 -= sub_807A100(GetBattlerAtPosition(gUnknown_083D9DC4[a1][2]), 1) / 6; + r6 -= sub_807A100(GetBattlerAtPosition(gUnknown_083D9DC4[a1][2]), 0) / 6; + break; + case 1: + // + r7 += sub_807A100(GetBattlerAtPosition(gUnknown_083D9DC4[a1][2]), 1) / 6; + r6 += sub_807A100(GetBattlerAtPosition(gUnknown_083D9DC4[a1][2]), 0) / 6; + } } + else { - // _C94 + // _94 + r7 = gUnknown_083D9DC4[a1][0]; + r6 = gUnknown_083D9DC4[a1][1]; + } + + spriteId = CreateSprite(&gSpriteTemplate_83D9E3C, r7 - r6, -0x8, 0x12); + + if (spriteId != 0x40) + { + // + 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 TRUE; } - // _CA6 + + return FALSE; + } -*/ +//*/ +//* NAKED bool8 sub_80D8BA8(u8 a1, u8 a2, u8 a3, u8 a4) { asm_unified("\tpush {r4-r7,lr}\n" @@ -2165,6 +2128,7 @@ NAKED bool8 sub_80D8BA8(u8 a1, u8 a2, u8 a3, u8 a4) "\tpop {r1}\n" "\tbx r1"); } +//*/ static void sub_80D8D1C(struct Sprite *sprite) { |