diff options
author | jiangzhengwenjz <jiangzhengwenjzw@qq.com> | 2019-11-08 01:16:42 +0800 |
---|---|---|
committer | jiangzhengwenjz <jiangzhengwenjzw@qq.com> | 2019-11-09 12:26:53 +0800 |
commit | 253ffec0352404ae2ffe5635a5b648d39d8d6b7e (patch) | |
tree | b6443f1ffc68441ec39a94d76932b6feb46a8ce3 | |
parent | 5fa2f4f18b11188dce2e3761fd3c2f6a40cdf2c8 (diff) |
poison
-rw-r--r-- | asm/poison.s | 362 | ||||
-rw-r--r-- | data/battle_anim_effects_misc.s | 7 | ||||
-rw-r--r-- | include/battle_anim.h | 1 | ||||
-rw-r--r-- | ld_script.txt | 3 | ||||
-rw-r--r-- | src/poison.c | 298 |
5 files changed, 306 insertions, 365 deletions
diff --git a/asm/poison.s b/asm/poison.s deleted file mode 100644 index 0028cf7d8..000000000 --- a/asm/poison.s +++ /dev/null @@ -1,362 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start sub_80B1620 -sub_80B1620: @ 80B1620 - push {r4,r5,lr} - adds r5, r0, 0 - ldr r4, _080B1674 @ =gBattleAnimArgs - movs r1, 0x6 - ldrsh r0, [r4, r1] - cmp r0, 0 - bne _080B1636 - adds r0, r5, 0 - movs r1, 0x2 - bl StartSpriteAnim -_080B1636: - adds r0, r5, 0 - movs r1, 0x1 - bl InitSpritePosToAnimAttacker - ldrh r0, [r4, 0x4] - strh r0, [r5, 0x2E] - ldr r4, _080B1678 @ =gBattleAnimTarget - ldrb r0, [r4] - movs r1, 0x2 - bl GetBattlerSpriteCoord - lsls r0, 24 - lsrs r0, 24 - strh r0, [r5, 0x32] - ldrb r0, [r4] - movs r1, 0x3 - bl GetBattlerSpriteCoord - lsls r0, 24 - lsrs r0, 24 - strh r0, [r5, 0x36] - ldr r0, _080B167C @ =0x0000ffe2 - strh r0, [r5, 0x38] - adds r0, r5, 0 - bl InitAnimArcTranslation - ldr r0, _080B1680 @ =sub_80B1684 - str r0, [r5, 0x1C] - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_080B1674: .4byte gBattleAnimArgs -_080B1678: .4byte gBattleAnimTarget -_080B167C: .4byte 0x0000ffe2 -_080B1680: .4byte sub_80B1684 - thumb_func_end sub_80B1620 - - thumb_func_start sub_80B1684 -sub_80B1684: @ 80B1684 - push {r4,lr} - adds r4, r0, 0 - bl TranslateAnimHorizontalArc - lsls r0, 24 - cmp r0, 0 - beq _080B1698 - adds r0, r4, 0 - bl DestroyAnimSprite -_080B1698: - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_80B1684 - - thumb_func_start sub_80B16A0 -sub_80B16A0: @ 80B16A0 - push {r4-r6,lr} - sub sp, 0x4 - adds r4, r0, 0 - ldr r5, _080B1714 @ =gBattleAnimArgs - movs r1, 0x6 - ldrsh r0, [r5, r1] - cmp r0, 0 - bne _080B16B8 - adds r0, r4, 0 - movs r1, 0x2 - bl StartSpriteAnim -_080B16B8: - adds r0, r4, 0 - movs r1, 0x1 - bl InitSpritePosToAnimAttacker - ldr r0, _080B1718 @ =gBattleAnimTarget - ldrb r0, [r0] - mov r6, sp - adds r6, 0x2 - movs r1, 0x1 - mov r2, sp - adds r3, r6, 0 - bl SetAverageBattlerPositions - ldr r0, _080B171C @ =gBattleAnimAttacker - ldrb r0, [r0] - bl GetBattlerSide - lsls r0, 24 - cmp r0, 0 - beq _080B16E6 - ldrh r0, [r5, 0x8] - negs r0, r0 - strh r0, [r5, 0x8] -_080B16E6: - ldrh r0, [r5, 0x4] - strh r0, [r4, 0x2E] - mov r1, sp - ldrh r0, [r5, 0x8] - ldrh r1, [r1] - adds r0, r1 - strh r0, [r4, 0x32] - ldrh r0, [r5, 0xA] - ldrh r6, [r6] - adds r0, r6 - strh r0, [r4, 0x36] - ldr r0, _080B1720 @ =0x0000ffe2 - strh r0, [r4, 0x38] - adds r0, r4, 0 - bl InitAnimArcTranslation - ldr r0, _080B1724 @ =sub_80B1728 - str r0, [r4, 0x1C] - add sp, 0x4 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_080B1714: .4byte gBattleAnimArgs -_080B1718: .4byte gBattleAnimTarget -_080B171C: .4byte gBattleAnimAttacker -_080B1720: .4byte 0x0000ffe2 -_080B1724: .4byte sub_80B1728 - thumb_func_end sub_80B16A0 - - thumb_func_start sub_80B1728 -sub_80B1728: @ 80B1728 - push {r4,lr} - adds r4, r0, 0 - bl TranslateAnimHorizontalArc - lsls r0, 24 - cmp r0, 0 - beq _080B173C - adds r0, r4, 0 - bl DestroyAnimSprite -_080B173C: - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_80B1728 - - thumb_func_start sub_80B1744 -sub_80B1744: @ 80B1744 - push {r4,r5,lr} - adds r4, r0, 0 - ldr r5, _080B1790 @ =gBattleAnimArgs - ldrh r0, [r5, 0x4] - strh r0, [r4, 0x2E] - ldrh r0, [r4, 0x20] - strh r0, [r4, 0x30] - ldrh r1, [r5] - adds r0, r1 - strh r0, [r4, 0x32] - ldrh r0, [r4, 0x22] - strh r0, [r4, 0x34] - ldrh r1, [r5, 0x2] - adds r0, r1 - strh r0, [r4, 0x36] - adds r0, r4, 0 - bl InitSpriteDataForLinearTranslation - movs r1, 0x30 - ldrsh r0, [r4, r1] - movs r2, 0x4 - ldrsh r1, [r5, r2] - bl __divsi3 - strh r0, [r4, 0x38] - movs r1, 0x32 - ldrsh r0, [r4, r1] - movs r2, 0x4 - ldrsh r1, [r5, r2] - bl __divsi3 - strh r0, [r4, 0x3A] - ldr r0, _080B1794 @ =sub_80B1798 - str r0, [r4, 0x1C] - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_080B1790: .4byte gBattleAnimArgs -_080B1794: .4byte sub_80B1798 - thumb_func_end sub_80B1744 - - thumb_func_start sub_80B1798 -sub_80B1798: @ 80B1798 - push {r4,lr} - adds r4, r0, 0 - bl TranslateSpriteLinearFixedPoint - ldrh r0, [r4, 0x30] - ldrh r1, [r4, 0x38] - subs r0, r1 - strh r0, [r4, 0x30] - ldrh r0, [r4, 0x32] - ldrh r1, [r4, 0x3A] - subs r0, r1 - strh r0, [r4, 0x32] - movs r1, 0x2E - ldrsh r0, [r4, r1] - cmp r0, 0 - bne _080B17BE - adds r0, r4, 0 - bl DestroyAnimSprite -_080B17BE: - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_80B1798 - - thumb_func_start sub_80B17C4 -sub_80B17C4: @ 80B17C4 - push {r4,lr} - adds r4, r0, 0 - ldr r0, _080B1824 @ =gBattleAnimTarget - ldrb r0, [r0] - adds r2, r4, 0 - adds r2, 0x20 - adds r3, r4, 0 - adds r3, 0x22 - movs r1, 0x1 - bl SetAverageBattlerPositions - ldr r0, _080B1828 @ =gBattleAnimAttacker - ldrb r0, [r0] - bl GetBattlerSide - lsls r0, 24 - cmp r0, 0 - beq _080B17F0 - ldr r1, _080B182C @ =gBattleAnimArgs - ldrh r0, [r1] - negs r0, r0 - strh r0, [r1] -_080B17F0: - ldr r0, _080B182C @ =gBattleAnimArgs - ldrh r2, [r0] - ldrh r1, [r4, 0x20] - adds r2, r1 - strh r2, [r4, 0x20] - ldrh r1, [r0, 0x2] - ldrh r3, [r4, 0x22] - adds r1, r3 - strh r1, [r4, 0x22] - ldrh r3, [r0, 0x8] - strh r3, [r4, 0x2E] - ldrh r0, [r0, 0x4] - adds r2, r0 - strh r2, [r4, 0x32] - adds r1, r3 - strh r1, [r4, 0x36] - ldr r0, _080B1830 @ =StartAnimLinearTranslation - str r0, [r4, 0x1C] - ldr r1, _080B1834 @ =DestroyAnimSprite - adds r0, r4, 0 - bl StoreSpriteCallbackInData6 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080B1824: .4byte gBattleAnimTarget -_080B1828: .4byte gBattleAnimAttacker -_080B182C: .4byte gBattleAnimArgs -_080B1830: .4byte StartAnimLinearTranslation -_080B1834: .4byte DestroyAnimSprite - thumb_func_end sub_80B17C4 - - thumb_func_start sub_80B1838 -sub_80B1838: @ 80B1838 - push {r4,r5,lr} - adds r4, r0, 0 - ldr r5, _080B1850 @ =gBattleAnimArgs - movs r1, 0x4 - ldrsh r0, [r5, r1] - cmp r0, 0 - bne _080B1854 - adds r0, r4, 0 - movs r1, 0x1 - bl InitSpritePosToAnimTarget - b _080B188A - .align 2, 0 -_080B1850: .4byte gBattleAnimArgs -_080B1854: - ldr r0, _080B1894 @ =gBattleAnimTarget - ldrb r0, [r0] - adds r2, r4, 0 - adds r2, 0x20 - adds r3, r4, 0 - adds r3, 0x22 - movs r1, 0x1 - bl SetAverageBattlerPositions - ldr r0, _080B1898 @ =gBattleAnimAttacker - ldrb r0, [r0] - bl GetBattlerSide - lsls r0, 24 - cmp r0, 0 - beq _080B187A - ldrh r0, [r5] - negs r0, r0 - strh r0, [r5] -_080B187A: - ldrh r0, [r5] - ldrh r1, [r4, 0x20] - adds r0, r1 - strh r0, [r4, 0x20] - ldrh r0, [r5, 0x2] - ldrh r1, [r4, 0x22] - adds r0, r1 - strh r0, [r4, 0x22] -_080B188A: - ldr r0, _080B189C @ =sub_80B18A0 - str r0, [r4, 0x1C] - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_080B1894: .4byte gBattleAnimTarget -_080B1898: .4byte gBattleAnimAttacker -_080B189C: .4byte sub_80B18A0 - thumb_func_end sub_80B1838 - - thumb_func_start sub_80B18A0 -sub_80B18A0: @ 80B18A0 - push {r4,lr} - adds r4, r0, 0 - ldrh r0, [r4, 0x2E] - adds r0, 0xB - movs r1, 0xFF - ands r0, r1 - strh r0, [r4, 0x2E] - movs r1, 0x2E - ldrsh r0, [r4, r1] - movs r1, 0x4 - bl Sin - strh r0, [r4, 0x24] - ldrh r0, [r4, 0x30] - adds r0, 0x30 - strh r0, [r4, 0x30] - lsls r0, 16 - asrs r0, 24 - negs r0, r0 - strh r0, [r4, 0x26] - adds r0, r4, 0 - adds r0, 0x3F - ldrb r1, [r0] - movs r0, 0x20 - ands r0, r1 - cmp r0, 0 - beq _080B18DC - adds r0, r4, 0 - bl DestroyAnimSprite -_080B18DC: - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_80B18A0 - - .align 2, 0 @ Don't pad with nop. diff --git a/data/battle_anim_effects_misc.s b/data/battle_anim_effects_misc.s index 6eed66f09..1aa9f6e7a 100644 --- a/data/battle_anim_effects_misc.s +++ b/data/battle_anim_effects_misc.s @@ -139,7 +139,10 @@ gUnknown_83E5898:: @ 83E5898 .incbin "baserom.gba", 0x3E5898, 0xC0 gUnknown_83E5958:: @ 83E5958 - .incbin "baserom.gba", 0x3E5958, 0x188 + .incbin "baserom.gba", 0x3E5958, 0x120 + +gUnknown_83E5A78:: @ 83E5A78 + .incbin "baserom.gba", 0x3E5A78, 0x68 gUnknown_83E5AE0:: @ 83E5AE0 .incbin "baserom.gba", 0x3E5AE0, 0xA8 @@ -199,4 +202,4 @@ gUnknown_83E652C:: @ 83E652C .incbin "baserom.gba", 0x3E652C, 0x78 gUnknown_83E65A4:: @ 83E65A4 - .incbin "baserom.gba", 0x3E65A4, 0x544 + .incbin "baserom.gba", 0x3E65A4, 0x3F0 diff --git a/include/battle_anim.h b/include/battle_anim.h index 9db123f91..bbfecc1e2 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -355,6 +355,7 @@ void sub_80B2868(u8 taskId); // water.s extern const union AnimCmd *const gUnknown_83E5958[]; +extern const union AnimCmd *const gUnknown_83E5A78[]; // fire.s extern const union AnimCmd *const gUnknown_83E5D48[]; diff --git a/ld_script.txt b/ld_script.txt index 1f9ad0b45..9cd32b6a7 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -161,7 +161,7 @@ SECTIONS { asm/electric.o(.text); asm/ice.o(.text); asm/fighting.o(.text); - asm/poison.o(.text); + src/poison.o(.text); src/flying.o(.text); src/psychic.o(.text); src/bug.o(.text); @@ -450,6 +450,7 @@ SECTIONS { src/pokemon_size_record.o(.rodata); data/item_use.o(.rodata); data/battle_anim_effects_misc.o(.rodata); + src/poison.o(.rodata); src/flying.o(.rodata); src/psychic.o(.rodata); src/bug.o(.rodata); diff --git a/src/poison.c b/src/poison.c new file mode 100644 index 000000000..4f83fd50c --- /dev/null +++ b/src/poison.c @@ -0,0 +1,298 @@ +#include "global.h" +#include "battle_anim.h" +#include "trig.h" + +static void sub_80B1620(struct Sprite *sprite); +static void sub_80B16A0(struct Sprite *sprite); +static void sub_80B1744(struct Sprite *sprite); +static void sub_80B17C4(struct Sprite *sprite); +static void AnimBubbleEffect(struct Sprite *sprite); +static void sub_80B1684(struct Sprite *sprite); +static void sub_80B1728(struct Sprite *sprite); +static void sub_80B1798(struct Sprite *sprite); +static void AnimBubbleEffectStep(struct Sprite *sprite); + +static const union AnimCmd gUnknown_83E6994[] = +{ + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(8, 5), + ANIMCMD_FRAME(16, 5), + ANIMCMD_FRAME(24, 5), + ANIMCMD_END, +}; + +static const union AnimCmd *const gUnknown_83E69A8[] = +{ + gUnknown_83E6994, +}; + +const struct SpriteTemplate gUnknown_83E69AC = +{ + .tileTag = ANIM_TAG_TOXIC_BUBBLE, + .paletteTag = ANIM_TAG_TOXIC_BUBBLE, + .oam = &gOamData_83ACA18, + .anims = gUnknown_83E69A8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSpriteOnMonPos, +}; + +static const union AnimCmd gUnknown_83E69C4[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_83E69CC[] = +{ + ANIMCMD_FRAME(4, 1), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_83E69D4[] = +{ + ANIMCMD_FRAME(8, 1), + ANIMCMD_END, +}; + +static const union AnimCmd *const gUnknown_83E69DC[] = +{ + gUnknown_83E69C4, +}; + +static const union AnimCmd *const gUnknown_83E69E0[] = +{ + gUnknown_83E69CC, +}; + +static const union AnimCmd *const gUnknown_83E69E4[] = +{ + gUnknown_83E69D4, +}; + +static const union AffineAnimCmd gUnknown_83E69E8[] = +{ + AFFINEANIMCMD_FRAME(0x160, 0x160, 0, 0), + AFFINEANIMCMD_FRAME(0xFFF6, 0xFFF6, 0, 10), + AFFINEANIMCMD_FRAME(0xA, 0xA, 0, 10), + AFFINEANIMCMD_JUMP(0), +}; + +static const union AffineAnimCmd gUnknown_83E6A08[] = +{ + AFFINEANIMCMD_FRAME(0xEC, 0xEC, 0, 0), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd *const gUnknown_83E6A18[] = +{ + gUnknown_83E69E8, +}; + +static const union AffineAnimCmd *const gUnknown_83E6A1C[] = +{ + gUnknown_83E6A08, +}; + +const struct SpriteTemplate gUnknown_83E6A20 = +{ + .tileTag = ANIM_TAG_POISON_BUBBLE, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gOamData_83ACA90, + .anims = gUnknown_83E69DC, + .images = NULL, + .affineAnims = gUnknown_83E6A18, + .callback = sub_80B1620, +}; + +const struct SpriteTemplate gUnknown_83E6A38 = +{ + .tileTag = ANIM_TAG_POISON_BUBBLE, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gOamData_83ACA90, + .anims = gUnknown_83E69DC, + .images = NULL, + .affineAnims = gUnknown_83E6A18, + .callback = sub_80B16A0, +}; + +const struct SpriteTemplate gUnknown_83E6A50 = +{ + .tileTag = ANIM_TAG_POISON_BUBBLE, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gOamData_83ACA30, + .anims = gUnknown_83E69E4, + .images = NULL, + .affineAnims = gUnknown_83E6A1C, + .callback = sub_80B1744, +}; + +static const union AffineAnimCmd gUnknown_83E6A68[] = +{ + AFFINEANIMCMD_FRAME(0xFFF0, 0x10, 0, 6), + AFFINEANIMCMD_FRAME(0x10, 0xFFF0, 0, 6), + AFFINEANIMCMD_JUMP(0), +}; + +static const union AffineAnimCmd *const gUnknown_83E6A80[] = +{ + gUnknown_83E6A68, +}; + +const struct SpriteTemplate gUnknown_83E6A84 = +{ + .tileTag = ANIM_TAG_POISON_BUBBLE, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gOamData_83ACA90, + .anims = gUnknown_83E69E0, + .images = NULL, + .affineAnims = gUnknown_83E6A80, + .callback = sub_80B17C4, +}; + +static const union AffineAnimCmd gUnknown_83E6A9C[] = +{ + AFFINEANIMCMD_FRAME(0x9C, 0x9C, 0, 0), + AFFINEANIMCMD_FRAME(0x5, 0x5, 0, 20), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd *const gUnknown_83E6AB4[] = +{ + gUnknown_83E6A9C, +}; + +const struct SpriteTemplate gPoisonBubbleSpriteTemplate = +{ + .tileTag = ANIM_TAG_POISON_BUBBLE, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gOamData_83ACA30, + .anims = gUnknown_83E69DC, + .images = NULL, + .affineAnims = gUnknown_83E6AB4, + .callback = AnimBubbleEffect, +}; + +const struct SpriteTemplate gWaterBubbleSpriteTemplate = +{ + .tileTag = ANIM_TAG_SMALL_BUBBLES, + .paletteTag = ANIM_TAG_SMALL_BUBBLES, + .oam = &gOamData_83ACB50, + .anims = gUnknown_83E5A78, + .images = NULL, + .affineAnims = gUnknown_83E6AB4, + .callback = AnimBubbleEffect, +}; + +static void sub_80B1620(struct Sprite *sprite) +{ + if (!gBattleAnimArgs[3]) + StartSpriteAnim(sprite, 2); + InitSpritePosToAnimAttacker(sprite, 1); + sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2); + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3); + sprite->data[5] = -30; + InitAnimArcTranslation(sprite); + sprite->callback = sub_80B1684; +} + +static void sub_80B1684(struct Sprite *sprite) +{ + if (TranslateAnimHorizontalArc(sprite)) + DestroyAnimSprite(sprite); +} + +static void sub_80B16A0(struct Sprite *sprite) +{ + s16 l1, l2; + + if (!gBattleAnimArgs[3]) + StartSpriteAnim(sprite, 2); + InitSpritePosToAnimAttacker(sprite, 1); + SetAverageBattlerPositions(gBattleAnimTarget, 1, &l1, &l2); + if (GetBattlerSide(gBattleAnimAttacker)) + gBattleAnimArgs[4] = -gBattleAnimArgs[4]; + sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[2] = l1 + gBattleAnimArgs[4]; + sprite->data[4] = l2 + gBattleAnimArgs[5]; + sprite->data[5] = -30; + InitAnimArcTranslation(sprite); + sprite->callback = sub_80B1728; +} + +static void sub_80B1728(struct Sprite *sprite) +{ + if (TranslateAnimHorizontalArc(sprite)) + DestroyAnimSprite(sprite); +} + +static void sub_80B1744(struct Sprite *sprite) +{ + sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[0]; + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[1]; + InitSpriteDataForLinearTranslation(sprite); + sprite->data[5] = sprite->data[1] / gBattleAnimArgs[2]; + sprite->data[6] = sprite->data[2] / gBattleAnimArgs[2]; + sprite->callback = sub_80B1798; +} + +static void sub_80B1798(struct Sprite *sprite) +{ + TranslateSpriteLinearFixedPoint(sprite); + sprite->data[1] -= sprite->data[5]; + sprite->data[2] -= sprite->data[6]; + if (!sprite->data[0]) + DestroyAnimSprite(sprite); +} + +static void sub_80B17C4(struct Sprite *sprite) +{ + SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &sprite->pos1.x, &sprite->pos1.y); + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += gBattleAnimArgs[1]; + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[2]; + sprite->data[4] = sprite->pos1.y + sprite->data[0]; + sprite->callback = StartAnimLinearTranslation; + StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); +} + +// Animates a bubble by rising upward, swaying side to side, and +// enlarging the sprite. This is used as an after-effect by poison-type +// moves, along with MOVE_BUBBLE, and MOVE_BUBBLEBEAM. +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +// arg 2: 0 = single-target, 1 = multi-target +static void AnimBubbleEffect(struct Sprite *sprite) +{ + if (!gBattleAnimArgs[2]) + { + InitSpritePosToAnimTarget(sprite, TRUE); + } + else + { + SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &sprite->pos1.x, &sprite->pos1.y); + + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += gBattleAnimArgs[1]; + } + sprite->callback = AnimBubbleEffectStep; +} + +static void AnimBubbleEffectStep(struct Sprite *sprite) +{ + sprite->data[0] = (sprite->data[0] + 0xB) & 0xFF; + sprite->pos2.x = Sin(sprite->data[0], 4); + sprite->data[1] += 0x30; + sprite->pos2.y = -(sprite->data[1] >> 8); + if (sprite->affineAnimEnded) + DestroyAnimSprite(sprite); +} |