diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/battle/anim/heated_rock.c | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/src/battle/anim/heated_rock.c b/src/battle/anim/heated_rock.c new file mode 100644 index 000000000..1d59669cf --- /dev/null +++ b/src/battle/anim/heated_rock.c @@ -0,0 +1,205 @@ +#include "global.h" +#include "battle_anim.h" +#include "rom_8077ABC.h" + +extern s16 gBattleAnimArgs[8]; +extern u8 gBattleAnimBankAttacker; +extern u8 gBattleAnimBankTarget; +extern u16 gBattleTypeFlags; + +void sub_80D59B0(struct Sprite *); +static void sub_80D5A74(struct Sprite *); + +// heated_rock (moves heated rock sprites) +// Used in Eruption. + +void sub_80D58FC(struct Sprite *sprite) +{ + sub_80D59B0(sprite); + + if (sprite->invisible) + { + gTasks[sprite->data[6]].data[sprite->data[7]]--; + DestroySprite(sprite); + } +} + +u16 sub_80D5940(u8 spriteId) +{ + u16 var1 = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y + gSprites[spriteId].centerToCornerVecY; + + if (GetBankSide(gBattleAnimBankAttacker) == 0) + { + var1 = ((var1 << 16) + 0x4A0000) >> 16; + } + else + { + var1 = ((var1 << 16) + 0x2C0000) >> 16; + } + + return var1; +} + +void sub_80D5994(struct Sprite *sprite, s16 x, s16 y) +{ + sprite->data[0] = 0; + sprite->data[1] = 0; + sprite->data[2] = (u16)sprite->pos1.x * 8; + sprite->data[3] = (u16)sprite->pos1.y * 8; + sprite->data[4] = x * 8; + sprite->data[5] = y * 8; +} + +#ifdef NONMATCHING +void sub_80D59B0(struct Sprite *sprite) +{ + int var1; + int var2; + + if (++sprite->data[0] > 2) + { + sprite->data[0] = 0; + ++sprite->data[1]; + sprite->data[3] += ((u16)sprite->data[1] * (u16)sprite->data[1]); + } + + var1 = (u16)sprite->data[4] + (u16)sprite->data[2]; + sprite->data[2] = var1; + var1 = (s16)var1 >> 3; + sprite->pos1.x = var1; + + var2 = (u16)sprite->data[5] + (u16)sprite->data[3]; + sprite->data[3] = var2; + var2 = (s16)var2 >> 3; + sprite->pos1.y = var2; + + if ((u32)((var1 + 8) << 16) > 0x1000000 || var2 < -8 || var2 > 120) + { + sprite->invisible = 1; + } +} +#else +__attribute__((naked)) +void sub_80D59B0(struct Sprite *sprite) +{ + asm(".syntax unified\n\ + push {lr}\n\ + adds r2, r0, 0\n\ + ldrh r0, [r2, 0x2E]\n\ + adds r0, 0x1\n\ + strh r0, [r2, 0x2E]\n\ + lsls r0, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x2\n\ + ble _080D59DA\n\ + movs r0, 0\n\ + strh r0, [r2, 0x2E]\n\ + ldrh r0, [r2, 0x30]\n\ + adds r0, 0x1\n\ + strh r0, [r2, 0x30]\n\ + ldrh r0, [r2, 0x30]\n\ + adds r1, r0, 0\n\ + muls r1, r0\n\ + adds r0, r1, 0\n\ + ldrh r3, [r2, 0x34]\n\ + adds r0, r3\n\ + strh r0, [r2, 0x34]\n\ +_080D59DA:\n\ + ldrh r0, [r2, 0x36]\n\ + ldrh r1, [r2, 0x32]\n\ + adds r0, r1\n\ + strh r0, [r2, 0x32]\n\ + lsls r0, 16\n\ + asrs r0, 19\n\ + strh r0, [r2, 0x20]\n\ + ldrh r1, [r2, 0x38]\n\ + ldrh r3, [r2, 0x34]\n\ + adds r1, r3\n\ + strh r1, [r2, 0x34]\n\ + lsls r1, 16\n\ + asrs r3, r1, 19\n\ + strh r3, [r2, 0x22]\n\ + adds r0, 0x8\n\ + lsls r0, 16\n\ + movs r1, 0x80\n\ + lsls r1, 17\n\ + cmp r0, r1\n\ + bhi _080D5A10\n\ + adds r1, r3, 0\n\ + movs r0, 0x8\n\ + negs r0, r0\n\ + cmp r1, r0\n\ + blt _080D5A10\n\ + cmp r1, 0x78\n\ + ble _080D5A1C\n\ +_080D5A10:\n\ + adds r0, r2, 0\n\ + adds r0, 0x3E\n\ + ldrb r1, [r0]\n\ + movs r2, 0x4\n\ + orrs r1, r2\n\ + strb r1, [r0]\n\ +_080D5A1C:\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +void sub_80D5A20(struct Sprite *sprite) +{ + sprite->pos1.x = gBattleAnimArgs[0]; + sprite->pos1.y = gBattleAnimArgs[1]; + + sprite->data[0] = 0; + sprite->data[1] = 0; + sprite->data[2] = 0; + sprite->data[6] = gBattleAnimArgs[2]; + sprite->data[7] = gBattleAnimArgs[3]; + + sprite->oam.tileNum += gBattleAnimArgs[4] * 16; + sprite->callback = sub_80D5A74; +} + +static void sub_80D5A74(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + if (sprite->data[6] != 0) + { + sprite->data[6]--; + return; + } + + sprite->data[0]++; + // fall through + case 1: + sprite->pos1.y += 8; + if (sprite->pos1.y >= sprite->data[7]) + { + sprite->pos1.y = sprite->data[7]; + sprite->data[0]++; + } + break; + case 2: + if (++sprite->data[1] > 1) + { + sprite->data[1] = 0; + if ((++sprite->data[2] & 1) != 0) + { + sprite->pos2.y = -3; + } + else + { + sprite->pos2.y = 3; + } + } + + if (++sprite->data[3] > 16) + { + move_anim_8072740(sprite); + } + break; + } +} |