From 1ebc745b7fc598feb758dbe5b32d5716a474fa37 Mon Sep 17 00:00:00 2001 From: Thomas Winwood Date: Sun, 17 Jun 2018 22:42:19 +0100 Subject: Decompile sub_80DDB6C --- asm/ghost.s | 50 -------------------------------------------------- ld_script.txt | 1 + src/ghost.c | 21 +++++++++++++++++++++ 3 files changed, 22 insertions(+), 50 deletions(-) create mode 100644 src/ghost.c diff --git a/asm/ghost.s b/asm/ghost.s index 59671ec7f..55f803a42 100644 --- a/asm/ghost.s +++ b/asm/ghost.s @@ -7,56 +7,6 @@ @ ghost - thumb_func_start sub_80DDB6C -sub_80DDB6C: @ 80DDB6C - push {r4,r5,lr} - adds r4, r0, 0 - movs r1, 0x1 - bl InitAnimSpritePos - ldr r0, _080DDBC8 @ =gBattleAnimArgs - ldrh r0, [r0, 0x4] - strh r0, [r4, 0x2E] - ldrh r0, [r4, 0x20] - strh r0, [r4, 0x30] - ldr r5, _080DDBCC @ =gAnimBankTarget - ldrb r0, [r5] - movs r1, 0x2 - bl GetBattlerSpriteCoord - lsls r0, 24 - lsrs r0, 24 - strh r0, [r4, 0x32] - ldrh r0, [r4, 0x22] - strh r0, [r4, 0x34] - ldrb r0, [r5] - movs r1, 0x3 - bl GetBattlerSpriteCoord - lsls r0, 24 - lsrs r0, 24 - strh r0, [r4, 0x36] - adds r0, r4, 0 - bl sub_8078BD4 - ldr r0, _080DDBD0 @ =sub_80DDBD8 - str r0, [r4, 0x1C] - movs r0, 0x10 - strh r0, [r4, 0x3A] - ldr r1, _080DDBD4 @ =REG_BLDCNT - movs r2, 0xFD - lsls r2, 6 - adds r0, r2, 0 - strh r0, [r1] - adds r1, 0x2 - ldrh r0, [r4, 0x3A] - strh r0, [r1] - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_080DDBC8: .4byte gBattleAnimArgs -_080DDBCC: .4byte gAnimBankTarget -_080DDBD0: .4byte sub_80DDBD8 -_080DDBD4: .4byte REG_BLDCNT - thumb_func_end sub_80DDB6C - thumb_func_start sub_80DDBD8 sub_80DDBD8: @ 80DDBD8 push {r4,lr} diff --git a/ld_script.txt b/ld_script.txt index dbecbe3f1..be3885add 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -289,6 +289,7 @@ SECTIONS { src/battle/anim/bug.o(.text); src/battle/anim/rock.o(.text); src/battle/anim/ghost.o(.text); + src/ghost.o(.text); asm/ghost.o(.text); src/battle/anim/dragon.o(.text); src/battle/anim/dark.o(.text); diff --git a/src/ghost.c b/src/ghost.c new file mode 100644 index 000000000..07a9061c6 --- /dev/null +++ b/src/ghost.c @@ -0,0 +1,21 @@ +#include "global.h" +#include "rom_8077ABC.h" + +extern s16 gBattleAnimArgs[]; +extern u8 gAnimBankTarget; + +void sub_80DDBD8(struct Sprite *); + +void sub_80DDB6C(struct Sprite *sprite) { + InitAnimSpritePos(sprite, 1); + sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2); + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3); + sub_8078BD4(sprite); + sprite->callback = sub_80DDBD8; + sprite->data[6] = 0x10; + REG_BLDCNT = 0x3F40; + REG_BLDALPHA = sprite->data[6]; +} \ No newline at end of file -- cgit v1.2.3 From ba16882b301fa964207257648b2522bec6458341 Mon Sep 17 00:00:00 2001 From: Thomas Winwood Date: Mon, 18 Jun 2018 00:49:11 +0100 Subject: Decompile sub_80DDBD8 --- asm/ghost.s | 59 ----------------------------------------------------------- src/ghost.c | 27 +++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 59 deletions(-) diff --git a/asm/ghost.s b/asm/ghost.s index 55f803a42..acdc6c171 100644 --- a/asm/ghost.s +++ b/asm/ghost.s @@ -7,65 +7,6 @@ @ ghost - thumb_func_start sub_80DDBD8 -sub_80DDBD8: @ 80DDBD8 - push {r4,lr} - adds r4, r0, 0 - bl sub_80DDCC8 - adds r0, r4, 0 - bl TranslateAnimSpriteByDeltas - lsls r0, 24 - cmp r0, 0 - beq _080DDBF8 - ldr r0, _080DDBF4 @ =sub_80DDC4C - str r0, [r4, 0x1C] - b _080DDC42 - .align 2, 0 -_080DDBF4: .4byte sub_80DDC4C -_080DDBF8: - movs r1, 0x38 - ldrsh r0, [r4, r1] - movs r1, 0xA - bl Sin - ldrh r1, [r4, 0x24] - adds r0, r1 - strh r0, [r4, 0x24] - movs r1, 0x38 - ldrsh r0, [r4, r1] - movs r1, 0xF - bl Cos - ldrh r1, [r4, 0x26] - adds r0, r1 - strh r0, [r4, 0x26] - ldrh r2, [r4, 0x38] - adds r0, r2, 0x5 - movs r1, 0xFF - ands r0, r1 - strh r0, [r4, 0x38] - ldrh r0, [r4, 0x38] - lsls r2, 16 - asrs r2, 16 - cmp r2, 0 - beq _080DDC30 - cmp r2, 0xC4 - ble _080DDC42 -_080DDC30: - lsls r0, 16 - cmp r0, 0 - ble _080DDC42 - ldr r0, _080DDC48 @ =gUnknown_0202F7D2 - movs r1, 0 - ldrsb r1, [r0, r1] - movs r0, 0xC4 - bl PlaySE12WithPanning -_080DDC42: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080DDC48: .4byte gUnknown_0202F7D2 - thumb_func_end sub_80DDBD8 - thumb_func_start sub_80DDC4C sub_80DDC4C: @ 80DDC4C push {r4,lr} diff --git a/src/ghost.c b/src/ghost.c index 07a9061c6..6c3f11f61 100644 --- a/src/ghost.c +++ b/src/ghost.c @@ -1,10 +1,15 @@ #include "global.h" #include "rom_8077ABC.h" +#include "sound.h" +#include "trig.h" extern s16 gBattleAnimArgs[]; extern u8 gAnimBankTarget; +extern u8 gUnknown_0202F7D2; void sub_80DDBD8(struct Sprite *); +void sub_80DDC4C(struct Sprite *); +void sub_80DDCC8(struct Sprite *); void sub_80DDB6C(struct Sprite *sprite) { InitAnimSpritePos(sprite, 1); @@ -18,4 +23,26 @@ void sub_80DDB6C(struct Sprite *sprite) { sprite->data[6] = 0x10; REG_BLDCNT = 0x3F40; REG_BLDALPHA = sprite->data[6]; +} + +void sub_80DDBD8(struct Sprite *sprite) { + s16 r0; + s16 r2; + sub_80DDCC8(sprite); + if (TranslateAnimSpriteByDeltas(sprite)) { + sprite->callback = sub_80DDC4C; + return; + } + sprite->pos2.x += Sin(sprite->data[5], 10); + sprite->pos2.y += Cos(sprite->data[5], 15); + r2 = sprite->data[5]; + sprite->data[5] = (sprite->data[5] + 5) & 0xFF; + r0 = sprite->data[5]; + if (r2 != 0) { + if (r2 <= 0xC4) + return; + } + if (r0 <= 0) + return; + PlaySE12WithPanning(0xC4, gUnknown_0202F7D2); } \ No newline at end of file -- cgit v1.2.3 From 093d767eb6a943a5ef19fee69ab24398c3f7fa7b Mon Sep 17 00:00:00 2001 From: Thomas Winwood Date: Mon, 18 Jun 2018 07:14:06 +0100 Subject: Decompile sub_80DDC4C (I didn't actually do this one, shinny did) --- asm/ghost.s | 65 ------------------------------------------------------------- src/ghost.c | 28 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 65 deletions(-) diff --git a/asm/ghost.s b/asm/ghost.s index acdc6c171..0ba071e60 100644 --- a/asm/ghost.s +++ b/asm/ghost.s @@ -7,71 +7,6 @@ @ ghost - thumb_func_start sub_80DDC4C -sub_80DDC4C: @ 80DDC4C - push {r4,lr} - adds r4, r0, 0 - movs r0, 0x1 - strh r0, [r4, 0x2E] - adds r0, r4, 0 - bl TranslateAnimSpriteByDeltas - movs r1, 0x38 - ldrsh r0, [r4, r1] - movs r1, 0xA - bl Sin - ldrh r1, [r4, 0x24] - adds r0, r1 - strh r0, [r4, 0x24] - movs r1, 0x38 - ldrsh r0, [r4, r1] - movs r1, 0xF - bl Cos - ldrh r1, [r4, 0x26] - adds r0, r1 - strh r0, [r4, 0x26] - ldrh r2, [r4, 0x38] - adds r0, r2, 0x5 - movs r1, 0xFF - ands r0, r1 - strh r0, [r4, 0x38] - ldrh r0, [r4, 0x38] - lsls r2, 16 - asrs r2, 16 - cmp r2, 0 - beq _080DDC92 - cmp r2, 0xC4 - ble _080DDC9E -_080DDC92: - lsls r0, 16 - cmp r0, 0 - ble _080DDC9E - movs r0, 0xC4 - bl PlaySE -_080DDC9E: - movs r1, 0x3A - ldrsh r0, [r4, r1] - cmp r0, 0 - bne _080DDCBC - adds r2, r4, 0 - adds r2, 0x3E - ldrb r0, [r2] - movs r1, 0x4 - orrs r0, r1 - strb r0, [r2] - ldr r0, _080DDCB8 @ =sub_807861C - str r0, [r4, 0x1C] - b _080DDCC2 - .align 2, 0 -_080DDCB8: .4byte sub_807861C -_080DDCBC: - adds r0, r4, 0 - bl sub_80DDCC8 -_080DDCC2: - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_80DDC4C - thumb_func_start sub_80DDCC8 sub_80DDCC8: @ 80DDCC8 push {r4,lr} diff --git a/src/ghost.c b/src/ghost.c index 6c3f11f61..042707bfb 100644 --- a/src/ghost.c +++ b/src/ghost.c @@ -45,4 +45,32 @@ void sub_80DDBD8(struct Sprite *sprite) { if (r0 <= 0) return; PlaySE12WithPanning(0xC4, gUnknown_0202F7D2); +} + +void sub_80DDC4C(struct Sprite *sprite) +{ + s16 r2; + s16 r0; + sprite->data[0] = 1; + TranslateAnimSpriteByDeltas(sprite); + sprite->pos2.x += Sin(sprite->data[5],10); + sprite->pos2.y += Cos(sprite->data[5],15); + + r2 = sprite->data[5]; + sprite->data[5] = (sprite->data[5] + 5) & 0xFF; + r0 = sprite->data[5]; + + if(r2 == 0 || r2 > 0xC4) + { + if(r0 > 0) + PlaySE(0xC4); + } + + if(sprite->data[6] == 0) + { + sprite->invisible = TRUE; + sprite->callback = sub_807861C; + } + else + sub_80DDCC8(sprite); } \ No newline at end of file -- cgit v1.2.3 From 346b9deadcbbd1f11a1e1081dca540211e1bc0fa Mon Sep 17 00:00:00 2001 From: Thomas Winwood Date: Mon, 18 Jun 2018 07:15:14 +0100 Subject: Decompile sub_80DDCC8 (I didn't actually do this one, shinny did) --- asm/ghost.s | 80 ------------------------------------------------------------- src/ghost.c | 34 ++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 80 deletions(-) diff --git a/asm/ghost.s b/asm/ghost.s index 0ba071e60..699a3c13e 100644 --- a/asm/ghost.s +++ b/asm/ghost.s @@ -7,86 +7,6 @@ @ ghost - thumb_func_start sub_80DDCC8 -sub_80DDCC8: @ 80DDCC8 - push {r4,lr} - adds r3, r0, 0 - ldrh r2, [r3, 0x3A] - movs r1, 0x3A - ldrsh r0, [r3, r1] - cmp r0, 0xFF - ble _080DDCEC - adds r0, r2, 0x1 - strh r0, [r3, 0x3A] - lsls r0, 16 - ldr r1, _080DDCE8 @ =0x010d0000 - cmp r0, r1 - bne _080DDD4C - movs r0, 0 - b _080DDD4A - .align 2, 0 -_080DDCE8: .4byte 0x010d0000 -_080DDCEC: - ldrh r1, [r3, 0x3C] - adds r4, r1, 0x1 - strh r4, [r3, 0x3C] - movs r0, 0xFF - ands r0, r1 - cmp r0, 0 - bne _080DDD4C - ldr r1, _080DDD10 @ =0xffffff00 - ands r1, r4 - strh r1, [r3, 0x3C] - movs r0, 0x80 - lsls r0, 1 - ands r0, r1 - cmp r0, 0 - beq _080DDD14 - adds r0, r2, 0x1 - b _080DDD16 - .align 2, 0 -_080DDD10: .4byte 0xffffff00 -_080DDD14: - subs r0, r2, 0x1 -_080DDD16: - strh r0, [r3, 0x3A] - ldr r2, _080DDD54 @ =REG_BLDALPHA - ldrh r1, [r3, 0x3A] - movs r0, 0x10 - subs r0, r1 - lsls r0, 8 - orrs r0, r1 - strh r0, [r2] - movs r2, 0x3A - ldrsh r0, [r3, r2] - cmp r0, 0 - beq _080DDD32 - cmp r0, 0x10 - bne _080DDD3E -_080DDD32: - ldrh r0, [r3, 0x3C] - movs r2, 0x80 - lsls r2, 1 - adds r1, r2, 0 - eors r0, r1 - strh r0, [r3, 0x3C] -_080DDD3E: - movs r1, 0x3A - ldrsh r0, [r3, r1] - cmp r0, 0 - bne _080DDD4C - movs r0, 0x80 - lsls r0, 1 -_080DDD4A: - strh r0, [r3, 0x3A] -_080DDD4C: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080DDD54: .4byte REG_BLDALPHA - thumb_func_end sub_80DDCC8 - thumb_func_start sub_80DDD58 sub_80DDD58: @ 80DDD58 push {r4,lr} diff --git a/src/ghost.c b/src/ghost.c index 042707bfb..6c7e36190 100644 --- a/src/ghost.c +++ b/src/ghost.c @@ -73,4 +73,38 @@ void sub_80DDC4C(struct Sprite *sprite) } else sub_80DDCC8(sprite); +} + +void sub_80DDCC8(struct Sprite *sprite) +{ + + s16 r0; + if(sprite->data[6] > 0xFF) + { + if(++sprite->data[6] == 0x10d) + sprite->data[6] = 0; + return; + } + + r0 = sprite->data[7]; + sprite->data[7]++; + + if((r0 & 0xFF) == 0) + { + sprite->data[7] &= 0xff00; + if((sprite->data[7] & 0x100) != 0) + sprite->data[6]++; + else + sprite->data[6]--; + } + else + return; + + REG_BLDALPHA = ((16 - sprite->data[6]) << 8) | sprite->data[6]; + if(sprite->data[6] == 0 || sprite->data[6] == 16) + { + sprite->data[7] ^= 0x100; + } + if(sprite->data[6] == 0) + sprite->data[6] = 0x100; } \ No newline at end of file -- cgit v1.2.3 From 67c8820a607da664acb4d1513f2fa6db8941548c Mon Sep 17 00:00:00 2001 From: Thomas Winwood Date: Mon, 18 Jun 2018 07:17:19 +0100 Subject: Decompile sub_80DDD58 (I didn't actually do this one, shinny did) --- asm/ghost.s | 17 ----------------- src/ghost.c | 8 ++++++++ 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/asm/ghost.s b/asm/ghost.s index 699a3c13e..3aa77a273 100644 --- a/asm/ghost.s +++ b/asm/ghost.s @@ -7,23 +7,6 @@ @ ghost - thumb_func_start sub_80DDD58 -sub_80DDD58: @ 80DDD58 - push {r4,lr} - adds r4, r0, 0 - movs r1, 0x1 - bl sub_8078764 - ldr r1, _080DDD74 @ =sub_80DDD78 - str r1, [r4, 0x1C] - adds r0, r4, 0 - bl _call_via_r1 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080DDD74: .4byte sub_80DDD78 - thumb_func_end sub_80DDD58 - thumb_func_start sub_80DDD78 sub_80DDD78: @ 80DDD78 push {r4,lr} diff --git a/src/ghost.c b/src/ghost.c index 6c7e36190..c14a60fdf 100644 --- a/src/ghost.c +++ b/src/ghost.c @@ -10,6 +10,7 @@ extern u8 gUnknown_0202F7D2; void sub_80DDBD8(struct Sprite *); void sub_80DDC4C(struct Sprite *); void sub_80DDCC8(struct Sprite *); +void sub_80DDD78(struct Sprite *); void sub_80DDB6C(struct Sprite *sprite) { InitAnimSpritePos(sprite, 1); @@ -107,4 +108,11 @@ void sub_80DDCC8(struct Sprite *sprite) } if(sprite->data[6] == 0) sprite->data[6] = 0x100; +} + +void sub_80DDD58(struct Sprite *sprite) +{ + sub_8078764(sprite, 1); + sprite->callback = sub_80DDD78; + sub_80DDD78(sprite); } \ No newline at end of file -- cgit v1.2.3 From a08baefa117414a69afa7dcff41c740c1ae59715 Mon Sep 17 00:00:00 2001 From: Thomas Winwood Date: Mon, 18 Jun 2018 09:45:40 +0100 Subject: Decompile sub_80DDD78 --- asm/ghost.s | 63 ------------------------------------------------------------- src/ghost.c | 20 ++++++++++++++++++++ 2 files changed, 20 insertions(+), 63 deletions(-) diff --git a/asm/ghost.s b/asm/ghost.s index 3aa77a273..2e1b27cd4 100644 --- a/asm/ghost.s +++ b/asm/ghost.s @@ -7,69 +7,6 @@ @ ghost - thumb_func_start sub_80DDD78 -sub_80DDD78: @ 80DDD78 - push {r4,lr} - adds r4, r0, 0 - movs r1, 0x2E - ldrsh r0, [r4, r1] - movs r1, 0x20 - bl Sin - strh r0, [r4, 0x24] - movs r1, 0x2E - ldrsh r0, [r4, r1] - movs r1, 0x8 - bl Cos - strh r0, [r4, 0x26] - ldrh r0, [r4, 0x2E] - subs r0, 0x41 - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x82 - bhi _080DDDAC - ldrb r0, [r4, 0x5] - movs r1, 0xD - negs r1, r1 - ands r1, r0 - movs r0, 0x8 - b _080DDDB6 -_080DDDAC: - ldrb r0, [r4, 0x5] - movs r1, 0xD - negs r1, r1 - ands r1, r0 - movs r0, 0x4 -_080DDDB6: - orrs r1, r0 - strb r1, [r4, 0x5] - ldrh r0, [r4, 0x2E] - adds r0, 0x13 - movs r1, 0xFF - ands r0, r1 - strh r0, [r4, 0x2E] - ldrh r0, [r4, 0x32] - adds r0, 0x50 - strh r0, [r4, 0x32] - lsls r0, 16 - asrs r0, 24 - ldrh r1, [r4, 0x26] - adds r0, r1 - strh r0, [r4, 0x26] - ldrh r0, [r4, 0x3C] - adds r0, 0x1 - strh r0, [r4, 0x3C] - lsls r0, 16 - asrs r0, 16 - cmp r0, 0x3D - bne _080DDDE8 - adds r0, r4, 0 - bl DestroyAnimSprite -_080DDDE8: - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_80DDD78 - thumb_func_start sub_80DDDF0 sub_80DDDF0: @ 80DDDF0 push {r4,r5,lr} diff --git a/src/ghost.c b/src/ghost.c index c14a60fdf..a78ac7de3 100644 --- a/src/ghost.c +++ b/src/ghost.c @@ -1,4 +1,5 @@ #include "global.h" +#include "battle_anim.h" #include "rom_8077ABC.h" #include "sound.h" #include "trig.h" @@ -115,4 +116,23 @@ void sub_80DDD58(struct Sprite *sprite) sub_8078764(sprite, 1); sprite->callback = sub_80DDD78; sub_80DDD78(sprite); +} + +void sub_80DDD78(struct Sprite *sprite) { + u16 temp1; + sprite->pos2.x = Sin(sprite->data[0], 32); + sprite->pos2.y = Cos(sprite->data[0], 8); + temp1 = sprite->data[0] - 65; + if (temp1 <= 130) { + sprite->oam.priority = 2; + } else { + sprite->oam.priority = 1; + } + sprite->data[0] = (sprite->data[0] + 0x13) & 0xFF; + sprite->data[2] += 80; + sprite->pos2.y += sprite->data[2] >> 8; + sprite->data[7] += 1; + if (sprite->data[7] == 0x3D) { + DestroyAnimSprite(sprite); + } } \ No newline at end of file -- cgit v1.2.3 From 3237628ea71fdf645160481e62ed52a5579c3d74 Mon Sep 17 00:00:00 2001 From: Thomas Winwood Date: Mon, 18 Jun 2018 15:13:35 +0100 Subject: Decompile sub_80DDDF0 --- asm/ghost.s | 67 ------------------------------------------------------------- src/ghost.c | 16 +++++++++++++++ 2 files changed, 16 insertions(+), 67 deletions(-) diff --git a/asm/ghost.s b/asm/ghost.s index 2e1b27cd4..d04599b70 100644 --- a/asm/ghost.s +++ b/asm/ghost.s @@ -7,73 +7,6 @@ @ ghost - thumb_func_start sub_80DDDF0 -sub_80DDDF0: @ 80DDDF0 - push {r4,r5,lr} - adds r5, r0, 0 - lsls r5, 24 - lsrs r5, 24 - ldr r1, _080DDE68 @ =REG_BLDCNT - movs r2, 0xFD - lsls r2, 6 - adds r0, r2, 0 - strh r0, [r1] - adds r1, 0x2 - movs r2, 0x80 - lsls r2, 5 - adds r0, r2, 0 - strh r0, [r1] - movs r0, 0 - bl GetAnimBattlerSpriteId - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - adds r0, r4, 0 - movs r1, 0x1 - bl sub_8078E70 - adds r0, r4, 0 - movs r1, 0x80 - movs r2, 0x80 - movs r3, 0 - bl obj_id_set_rotscale - ldr r1, _080DDE6C @ =gSprites - lsls r0, r4, 4 - adds r0, r4 - lsls r0, 2 - adds r0, r1 - adds r0, 0x3E - ldrb r2, [r0] - movs r1, 0x5 - negs r1, r1 - ands r1, r2 - strb r1, [r0] - ldr r1, _080DDE70 @ =gTasks - lsls r0, r5, 2 - adds r0, r5 - lsls r0, 3 - adds r0, r1 - movs r2, 0 - movs r1, 0x80 - strh r1, [r0, 0x8] - ldr r1, _080DDE74 @ =gBattleAnimArgs - ldrh r1, [r1] - strh r1, [r0, 0xA] - strh r2, [r0, 0xC] - movs r1, 0x10 - strh r1, [r0, 0xE] - ldr r1, _080DDE78 @ =sub_80DDE7C - str r1, [r0] - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_080DDE68: .4byte REG_BLDCNT -_080DDE6C: .4byte gSprites -_080DDE70: .4byte gTasks -_080DDE74: .4byte gBattleAnimArgs -_080DDE78: .4byte sub_80DDE7C - thumb_func_end sub_80DDDF0 - thumb_func_start sub_80DDE7C sub_80DDE7C: @ 80DDE7C push {lr} diff --git a/src/ghost.c b/src/ghost.c index a78ac7de3..6591ad5af 100644 --- a/src/ghost.c +++ b/src/ghost.c @@ -12,6 +12,7 @@ void sub_80DDBD8(struct Sprite *); void sub_80DDC4C(struct Sprite *); void sub_80DDCC8(struct Sprite *); void sub_80DDD78(struct Sprite *); +void sub_80DDE7C(u8 taskId); void sub_80DDB6C(struct Sprite *sprite) { InitAnimSpritePos(sprite, 1); @@ -135,4 +136,19 @@ void sub_80DDD78(struct Sprite *sprite) { if (sprite->data[7] == 0x3D) { DestroyAnimSprite(sprite); } +} + +void sub_80DDDF0(u8 r5) { + u8 r4; + REG_BLDCNT = 0x3F40; + REG_BLDALPHA = 0x1000; + r4 = GetAnimBattlerSpriteId(0); + sub_8078E70(r4, 1); + obj_id_set_rotscale(r4, 0x80, 0x80, 0); + gSprites[r4].invisible = FALSE; + gTasks[r5].data[0] = 0x80; + gTasks[r5].data[1] = *gBattleAnimArgs; + gTasks[r5].data[2] = 0; + gTasks[r5].data[3] = 0x10; + gTasks[r5].func = &sub_80DDE7C; } \ No newline at end of file -- cgit v1.2.3 From 41a5fc73fd85701aa761b22f7068e590d926bea0 Mon Sep 17 00:00:00 2001 From: Thomas Winwood Date: Mon, 18 Jun 2018 15:34:48 +0100 Subject: Decompile sub_80DDE7C --- asm/ghost.s | 44 -------------------------------------------- src/ghost.c | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 44 deletions(-) diff --git a/asm/ghost.s b/asm/ghost.s index d04599b70..ce914c248 100644 --- a/asm/ghost.s +++ b/asm/ghost.s @@ -7,50 +7,6 @@ @ ghost - thumb_func_start sub_80DDE7C -sub_80DDE7C: @ 80DDE7C - push {lr} - lsls r0, 24 - lsrs r0, 24 - ldr r2, _080DDEC4 @ =gTasks - lsls r1, r0, 2 - adds r1, r0 - lsls r1, 3 - adds r3, r1, r2 - ldrh r0, [r3, 0x1C] - adds r0, 0x1 - strh r0, [r3, 0x1C] - lsls r0, 16 - asrs r0, 16 - cmp r0, 0x3 - bne _080DDEBE - movs r0, 0 - strh r0, [r3, 0x1C] - ldrh r1, [r3, 0xC] - adds r1, 0x1 - strh r1, [r3, 0xC] - ldrh r0, [r3, 0xE] - subs r0, 0x1 - strh r0, [r3, 0xE] - ldr r2, _080DDEC8 @ =REG_BLDALPHA - lsls r0, 8 - orrs r1, r0 - strh r1, [r2] - movs r1, 0xC - ldrsh r0, [r3, r1] - cmp r0, 0x9 - bne _080DDEBE - ldr r0, _080DDECC @ =sub_80DDED0 - str r0, [r3] -_080DDEBE: - pop {r0} - bx r0 - .align 2, 0 -_080DDEC4: .4byte gTasks -_080DDEC8: .4byte REG_BLDALPHA -_080DDECC: .4byte sub_80DDED0 - thumb_func_end sub_80DDE7C - thumb_func_start sub_80DDED0 sub_80DDED0: @ 80DDED0 push {r4-r6,lr} diff --git a/src/ghost.c b/src/ghost.c index 6591ad5af..e77f26fb1 100644 --- a/src/ghost.c +++ b/src/ghost.c @@ -13,6 +13,7 @@ void sub_80DDC4C(struct Sprite *); void sub_80DDCC8(struct Sprite *); void sub_80DDD78(struct Sprite *); void sub_80DDE7C(u8 taskId); +void sub_80DDED0(u8 taskId); void sub_80DDB6C(struct Sprite *sprite) { InitAnimSpritePos(sprite, 1); @@ -151,4 +152,17 @@ void sub_80DDDF0(u8 r5) { gTasks[r5].data[2] = 0; gTasks[r5].data[3] = 0x10; gTasks[r5].func = &sub_80DDE7C; +} + +void sub_80DDE7C(u8 taskId) { + gTasks[taskId].data[10] += 1; + if (gTasks[taskId].data[10] == 3) { + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[2] += 1; + gTasks[taskId].data[3] -= 1; + REG_BLDALPHA = gTasks[taskId].data[3] << 8 | gTasks[taskId].data[2]; + if (gTasks[taskId].data[2] != 9) + return; + gTasks[taskId].func = &sub_80DDED0; + } } \ No newline at end of file -- cgit v1.2.3 From ef31712404dc6336569b273e01f44d0ebdd31860 Mon Sep 17 00:00:00 2001 From: Thomas Winwood Date: Wed, 20 Jun 2018 11:45:16 +0100 Subject: Decompile sub_80DDED0 --- asm/ghost.s | 58 ---------------------------------------------------------- src/ghost.c | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+), 58 deletions(-) diff --git a/asm/ghost.s b/asm/ghost.s index ce914c248..66d0effef 100644 --- a/asm/ghost.s +++ b/asm/ghost.s @@ -7,64 +7,6 @@ @ ghost - thumb_func_start sub_80DDED0 -sub_80DDED0: @ 80DDED0 - push {r4-r6,lr} - lsls r0, 24 - lsrs r0, 24 - adds r5, r0, 0 - ldr r1, _080DDEF4 @ =gTasks - lsls r0, r5, 2 - adds r0, r5 - lsls r0, 3 - adds r4, r0, r1 - ldrh r1, [r4, 0xA] - movs r2, 0xA - ldrsh r0, [r4, r2] - cmp r0, 0 - ble _080DDEF8 - subs r0, r1, 0x1 - strh r0, [r4, 0xA] - b _080DDF36 - .align 2, 0 -_080DDEF4: .4byte gTasks -_080DDEF8: - movs r0, 0 - bl GetAnimBattlerSpriteId - lsls r0, 24 - lsrs r1, r0, 24 - ldrh r0, [r4, 0x8] - adds r0, 0x8 - movs r6, 0 - strh r0, [r4, 0x8] - lsls r0, 16 - asrs r0, 16 - cmp r0, 0xFF - bgt _080DDF22 - movs r0, 0x8 - ldrsh r2, [r4, r0] - adds r0, r1, 0 - adds r1, r2, 0 - movs r3, 0 - bl obj_id_set_rotscale - b _080DDF36 -_080DDF22: - adds r0, r1, 0 - bl sub_8078F40 - adds r0, r5, 0 - bl DestroyAnimVisualTask - ldr r0, _080DDF3C @ =REG_BLDCNT - strh r6, [r0] - adds r0, 0x2 - strh r6, [r0] -_080DDF36: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_080DDF3C: .4byte REG_BLDCNT - thumb_func_end sub_80DDED0 - thumb_func_start sub_80DDF40 sub_80DDF40: @ 80DDF40 push {r4-r6,lr} diff --git a/src/ghost.c b/src/ghost.c index e77f26fb1..092677523 100644 --- a/src/ghost.c +++ b/src/ghost.c @@ -165,4 +165,22 @@ void sub_80DDE7C(u8 taskId) { return; gTasks[taskId].func = &sub_80DDED0; } +} + +void sub_80DDED0(u8 taskId) { + u8 r1; + if (gTasks[taskId].data[1] > 0) { + gTasks[taskId].data[1] -= 1; + return; + } + r1 = GetAnimBattlerSpriteId(0); + gTasks[taskId].data[0] += 8; + if (gTasks[taskId].data[0] <= 0xFF) { + obj_id_set_rotscale(r1, gTasks[taskId].data[0], gTasks[taskId].data[0], 0); + return; + } + sub_8078F40(r1); + DestroyAnimVisualTask(taskId); + REG_BLDCNT = 0; + REG_BLDALPHA = 0; } \ No newline at end of file -- cgit v1.2.3 From 6afdc9b4b1ec9215e58d562bd5db2b8dfd3df466 Mon Sep 17 00:00:00 2001 From: Thomas Winwood Date: Wed, 20 Jun 2018 12:37:55 +0100 Subject: Decompile sub_80DDF40 --- asm/ghost.s | 82 ------------------------------------------------------------- src/ghost.c | 19 ++++++++++++++ 2 files changed, 19 insertions(+), 82 deletions(-) diff --git a/asm/ghost.s b/asm/ghost.s index 66d0effef..267d12f62 100644 --- a/asm/ghost.s +++ b/asm/ghost.s @@ -7,88 +7,6 @@ @ ghost - thumb_func_start sub_80DDF40 -sub_80DDF40: @ 80DDF40 - push {r4-r6,lr} - mov r6, r9 - mov r5, r8 - push {r5,r6} - sub sp, 0x4 - adds r4, r0, 0 - ldrh r5, [r4, 0x20] - ldrh r6, [r4, 0x22] - ldr r0, _080DDFDC @ =gAnimBankAttacker - mov r8, r0 - ldrb r0, [r0] - movs r1, 0x2 - bl GetBattlerSpriteCoord - lsls r0, 24 - lsrs r0, 24 - movs r1, 0 - mov r9, r1 - strh r0, [r4, 0x20] - mov r1, r8 - ldrb r0, [r1] - movs r1, 0x3 - bl GetBattlerSpriteCoord - lsls r0, 24 - lsrs r0, 24 - strh r0, [r4, 0x22] - mov r1, r9 - strh r1, [r4, 0x2E] - ldr r2, _080DDFE0 @ =gBattleAnimArgs - ldrh r1, [r2] - strh r1, [r4, 0x30] - ldrh r1, [r2, 0x2] - strh r1, [r4, 0x32] - ldrh r1, [r2, 0x4] - strh r1, [r4, 0x34] - ldrh r1, [r4, 0x20] - lsls r1, 4 - strh r1, [r4, 0x36] - lsls r0, 4 - strh r0, [r4, 0x38] - lsls r5, 16 - asrs r5, 16 - movs r1, 0x20 - ldrsh r0, [r4, r1] - subs r5, r0 - lsls r5, 4 - movs r0, 0 - ldrsh r1, [r2, r0] - lsls r1, 1 - adds r0, r5, 0 - str r2, [sp] - bl __divsi3 - strh r0, [r4, 0x3A] - lsls r6, 16 - asrs r6, 16 - movs r1, 0x22 - ldrsh r0, [r4, r1] - subs r6, r0 - lsls r6, 4 - ldr r2, [sp] - movs r0, 0 - ldrsh r1, [r2, r0] - lsls r1, 1 - adds r0, r6, 0 - bl __divsi3 - strh r0, [r4, 0x3C] - ldr r0, _080DDFE4 @ =sub_80DDFE8 - str r0, [r4, 0x1C] - add sp, 0x4 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_080DDFDC: .4byte gAnimBankAttacker -_080DDFE0: .4byte gBattleAnimArgs -_080DDFE4: .4byte sub_80DDFE8 - thumb_func_end sub_80DDF40 - thumb_func_start sub_80DDFE8 sub_80DDFE8: @ 80DDFE8 push {r4,r5,lr} diff --git a/src/ghost.c b/src/ghost.c index 092677523..e854036f0 100644 --- a/src/ghost.c +++ b/src/ghost.c @@ -7,6 +7,7 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankTarget; extern u8 gUnknown_0202F7D2; +extern u8 gAnimBankAttacker; void sub_80DDBD8(struct Sprite *); void sub_80DDC4C(struct Sprite *); @@ -14,6 +15,7 @@ void sub_80DDCC8(struct Sprite *); void sub_80DDD78(struct Sprite *); void sub_80DDE7C(u8 taskId); void sub_80DDED0(u8 taskId); +void sub_80DDFE8(struct Sprite *); void sub_80DDB6C(struct Sprite *sprite) { InitAnimSpritePos(sprite, 1); @@ -183,4 +185,21 @@ void sub_80DDED0(u8 taskId) { DestroyAnimVisualTask(taskId); REG_BLDCNT = 0; REG_BLDALPHA = 0; +} + +void sub_80DDF40(struct Sprite *sprite) { + u16 r5, r6; + r5 = sprite->pos1.x; + r6 = sprite->pos1.y; + sprite->pos1.x = GetBattlerSpriteCoord(gAnimBankAttacker, 2); + sprite->pos1.y = GetBattlerSpriteCoord(gAnimBankAttacker, 3); + sprite->data[0] = 0; + sprite->data[1] = gBattleAnimArgs[0]; + sprite->data[2] = gBattleAnimArgs[1]; + sprite->data[3] = gBattleAnimArgs[2]; + sprite->data[4] = sprite->pos1.x << 4; + sprite->data[5] = sprite->pos1.y << 4; + sprite->data[6] = (((s16)r5 - sprite->pos1.x) << 4) / (gBattleAnimArgs[0] << 1); + sprite->data[7] = (((s16)r6 - sprite->pos1.y) << 4) / (gBattleAnimArgs[0] << 1); + sprite->callback = &sub_80DDFE8; } \ No newline at end of file -- cgit v1.2.3 From 195d759f7c24910512c7758b2927cef943f83444 Mon Sep 17 00:00:00 2001 From: Thomas Winwood Date: Wed, 20 Jun 2018 16:12:12 +0100 Subject: Decompile sub_80DDFE8 --- asm/ghost.s | 140 ------------------------------------------------------------ src/ghost.c | 41 ++++++++++++++++++ 2 files changed, 41 insertions(+), 140 deletions(-) diff --git a/asm/ghost.s b/asm/ghost.s index 267d12f62..201f97af5 100644 --- a/asm/ghost.s +++ b/asm/ghost.s @@ -7,146 +7,6 @@ @ ghost - thumb_func_start sub_80DDFE8 -sub_80DDFE8: @ 80DDFE8 - push {r4,r5,lr} - adds r5, r0, 0 - movs r1, 0x2E - ldrsh r0, [r5, r1] - cmp r0, 0x1 - beq _080DE032 - cmp r0, 0x1 - bgt _080DDFFE - cmp r0, 0 - beq _080DE008 - b _080DE0F6 -_080DDFFE: - cmp r0, 0x2 - beq _080DE09C - cmp r0, 0x3 - beq _080DE0F0 - b _080DE0F6 -_080DE008: - ldrh r0, [r5, 0x3A] - ldrh r2, [r5, 0x36] - adds r0, r2 - strh r0, [r5, 0x36] - ldrh r1, [r5, 0x3C] - ldrh r2, [r5, 0x38] - adds r1, r2 - strh r1, [r5, 0x38] - lsls r0, 16 - asrs r0, 20 - strh r0, [r5, 0x20] - lsls r1, 16 - asrs r1, 20 - strh r1, [r5, 0x22] - ldrh r0, [r5, 0x30] - subs r0, 0x1 - strh r0, [r5, 0x30] - lsls r0, 16 - cmp r0, 0 - bgt _080DE0F6 - b _080DE0E2 -_080DE032: - ldrh r0, [r5, 0x32] - subs r0, 0x1 - strh r0, [r5, 0x32] - lsls r0, 16 - cmp r0, 0 - bgt _080DE0F6 - ldr r4, _080DE098 @ =gAnimBankTarget - ldrb r0, [r4] - movs r1, 0x2 - bl GetBattlerSpriteCoord - lsls r0, 24 - lsrs r0, 24 - strh r0, [r5, 0x30] - ldrb r0, [r4] - movs r1, 0x3 - bl GetBattlerSpriteCoord - lsls r0, 24 - lsrs r0, 24 - strh r0, [r5, 0x32] - ldrh r0, [r5, 0x20] - lsls r0, 4 - strh r0, [r5, 0x36] - ldrh r0, [r5, 0x22] - lsls r0, 4 - strh r0, [r5, 0x38] - movs r1, 0x30 - ldrsh r0, [r5, r1] - movs r2, 0x20 - ldrsh r1, [r5, r2] - subs r0, r1 - lsls r0, 4 - movs r2, 0x34 - ldrsh r1, [r5, r2] - bl __divsi3 - strh r0, [r5, 0x3A] - movs r1, 0x32 - ldrsh r0, [r5, r1] - movs r2, 0x22 - ldrsh r1, [r5, r2] - subs r0, r1 - lsls r0, 4 - movs r2, 0x34 - ldrsh r1, [r5, r2] - bl __divsi3 - strh r0, [r5, 0x3C] - b _080DE0E2 - .align 2, 0 -_080DE098: .4byte gAnimBankTarget -_080DE09C: - ldrh r0, [r5, 0x3A] - ldrh r1, [r5, 0x36] - adds r0, r1 - strh r0, [r5, 0x36] - ldrh r1, [r5, 0x3C] - ldrh r2, [r5, 0x38] - adds r1, r2 - strh r1, [r5, 0x38] - lsls r0, 16 - asrs r0, 20 - strh r0, [r5, 0x20] - lsls r1, 16 - asrs r1, 20 - strh r1, [r5, 0x22] - ldrh r0, [r5, 0x34] - subs r0, 0x1 - strh r0, [r5, 0x34] - lsls r0, 16 - cmp r0, 0 - bgt _080DE0F6 - ldr r4, _080DE0EC @ =gAnimBankTarget - ldrb r0, [r4] - movs r1, 0x2 - bl GetBattlerSpriteCoord - lsls r0, 24 - lsrs r0, 24 - strh r0, [r5, 0x20] - ldrb r0, [r4] - movs r1, 0x3 - bl GetBattlerSpriteCoord - lsls r0, 24 - lsrs r0, 24 - strh r0, [r5, 0x22] -_080DE0E2: - ldrh r0, [r5, 0x2E] - adds r0, 0x1 - strh r0, [r5, 0x2E] - b _080DE0F6 - .align 2, 0 -_080DE0EC: .4byte gAnimBankTarget -_080DE0F0: - adds r0, r5, 0 - bl move_anim_8074EE0 -_080DE0F6: - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end sub_80DDFE8 - thumb_func_start sub_80DE0FC sub_80DE0FC: @ 80DE0FC push {r4,lr} diff --git a/src/ghost.c b/src/ghost.c index e854036f0..d44df6818 100644 --- a/src/ghost.c +++ b/src/ghost.c @@ -202,4 +202,45 @@ void sub_80DDF40(struct Sprite *sprite) { sprite->data[6] = (((s16)r5 - sprite->pos1.x) << 4) / (gBattleAnimArgs[0] << 1); sprite->data[7] = (((s16)r6 - sprite->pos1.y) << 4) / (gBattleAnimArgs[0] << 1); sprite->callback = &sub_80DDFE8; +} + +void sub_80DDFE8(struct Sprite *sprite) { + switch (sprite->data[0]) { + case 0: + sprite->data[4] += sprite->data[6]; + sprite->data[5] += sprite->data[7]; + sprite->pos1.x = sprite->data[4] >> 4; + sprite->pos1.y = sprite->data[5] >> 4; + sprite->data[1] -= 1; + if (sprite->data[1] > 0) + break; + sprite->data[0] += 1; + break; + case 1: + sprite->data[2] -= 1; + if (sprite->data[2] > 0) + break; + sprite->data[1] = GetBattlerSpriteCoord(gAnimBankTarget, 2); + sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 3); + sprite->data[4] = sprite->pos1.x << 4; + sprite->data[5] = sprite->pos1.y << 4; + sprite->data[6] = ((sprite->data[1] - sprite->pos1.x) << 4) / sprite->data[3]; + sprite->data[7] = ((sprite->data[2] - sprite->pos1.y) << 4) / sprite->data[3]; + sprite->data[0] += 1; + break; + case 2: + sprite->data[4] += sprite->data[6]; + sprite->data[5] += sprite->data[7]; + sprite->pos1.x = sprite->data[4] >> 4; + sprite->pos1.y = sprite->data[5] >> 4; + sprite->data[3] -= 1; + if (sprite->data[3] > 0) + break; + sprite->pos1.x = GetBattlerSpriteCoord(gAnimBankTarget, 2); + sprite->pos1.y = GetBattlerSpriteCoord(gAnimBankTarget, 3); + sprite->data[0] += 1; + break; + case 3: + move_anim_8074EE0(sprite); + } } \ No newline at end of file -- cgit v1.2.3 From 413b8dbd46d992cd50a267fcac3767ce16e9bd3b Mon Sep 17 00:00:00 2001 From: Thomas Winwood Date: Wed, 20 Jun 2018 16:14:56 +0100 Subject: Decompile sub_80DE0FC --- asm/ghost.s | 15 --------------- src/ghost.c | 6 ++++++ 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/asm/ghost.s b/asm/ghost.s index 201f97af5..046a2fb53 100644 --- a/asm/ghost.s +++ b/asm/ghost.s @@ -7,21 +7,6 @@ @ ghost - thumb_func_start sub_80DE0FC -sub_80DE0FC: @ 80DE0FC - push {r4,lr} - adds r4, r0, 0 - movs r1, 0x1 - bl sub_8078764 - ldr r0, _080DE110 @ =sub_80DE114 - str r0, [r4, 0x1C] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080DE110: .4byte sub_80DE114 - thumb_func_end sub_80DE0FC - thumb_func_start sub_80DE114 sub_80DE114: @ 80DE114 push {r4-r6,lr} diff --git a/src/ghost.c b/src/ghost.c index d44df6818..fdb2e52fa 100644 --- a/src/ghost.c +++ b/src/ghost.c @@ -16,6 +16,7 @@ void sub_80DDD78(struct Sprite *); void sub_80DDE7C(u8 taskId); void sub_80DDED0(u8 taskId); void sub_80DDFE8(struct Sprite *); +void sub_80DE114(struct Sprite *); void sub_80DDB6C(struct Sprite *sprite) { InitAnimSpritePos(sprite, 1); @@ -243,4 +244,9 @@ void sub_80DDFE8(struct Sprite *sprite) { case 3: move_anim_8074EE0(sprite); } +} + +void sub_80DE0FC(struct Sprite *sprite) { + sub_8078764(sprite, 1); + sprite->callback = &sub_80DE114; } \ No newline at end of file -- cgit v1.2.3 From d291ac9053837459191a55a8a48d4537d831648b Mon Sep 17 00:00:00 2001 From: Thomas Winwood Date: Fri, 22 Jun 2018 13:53:44 +0100 Subject: Nonmatch sub_80DE114 --- asm/ghost.s | 89 --------------------------------------------------------- src/ghost.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 94 insertions(+), 90 deletions(-) diff --git a/asm/ghost.s b/asm/ghost.s index 046a2fb53..3042f48d3 100644 --- a/asm/ghost.s +++ b/asm/ghost.s @@ -7,95 +7,6 @@ @ ghost - thumb_func_start sub_80DE114 -sub_80DE114: @ 80DE114 - push {r4-r6,lr} - adds r3, r0, 0 - movs r5, 0 - movs r6, 0 - adds r0, 0x3F - ldrb r1, [r0] - movs r0, 0x10 - ands r0, r1 - cmp r0, 0 - beq _080DE1AA - adds r1, r3, 0 - adds r1, 0x3E - ldrb r2, [r1] - movs r0, 0x4 - ands r0, r2 - adds r4, r1, 0 - cmp r0, 0 - bne _080DE13E - movs r0, 0x4 - orrs r0, r2 - strb r0, [r4] -_080DE13E: - movs r1, 0x2E - ldrsh r0, [r3, r1] - cmp r0, 0 - beq _080DE14E - cmp r0, 0x1 - beq _080DE158 - movs r6, 0x1 - b _080DE162 -_080DE14E: - movs r1, 0x30 - ldrsh r0, [r3, r1] - cmp r0, 0x2 - bne _080DE162 - b _080DE166 -_080DE158: - movs r1, 0x30 - ldrsh r0, [r3, r1] - cmp r0, 0x4 - bne _080DE162 - movs r5, 0x1 -_080DE162: - cmp r5, 0 - beq _080DE198 -_080DE166: - ldrb r2, [r4] - lsls r0, r2, 29 - lsrs r0, 31 - movs r1, 0x1 - eors r1, r0 - lsls r1, 2 - movs r0, 0x5 - negs r0, r0 - ands r0, r2 - orrs r0, r1 - strb r0, [r4] - ldrh r0, [r3, 0x32] - adds r0, 0x1 - movs r1, 0 - strh r0, [r3, 0x32] - strh r1, [r3, 0x30] - lsls r0, 16 - asrs r0, 16 - cmp r0, 0x5 - bne _080DE1AA - strh r1, [r3, 0x32] - ldrh r0, [r3, 0x2E] - adds r0, 0x1 - strh r0, [r3, 0x2E] - b _080DE1AA -_080DE198: - cmp r6, 0 - beq _080DE1A4 - adds r0, r3, 0 - bl DestroyAnimSprite - b _080DE1AA -_080DE1A4: - ldrh r0, [r3, 0x30] - adds r0, 0x1 - strh r0, [r3, 0x30] -_080DE1AA: - pop {r4-r6} - pop {r0} - bx r0 - thumb_func_end sub_80DE114 - thumb_func_start sub_80DE1B0 sub_80DE1B0: @ 80DE1B0 push {r4-r6,lr} diff --git a/src/ghost.c b/src/ghost.c index fdb2e52fa..16f4241c0 100644 --- a/src/ghost.c +++ b/src/ghost.c @@ -249,4 +249,97 @@ void sub_80DDFE8(struct Sprite *sprite) { void sub_80DE0FC(struct Sprite *sprite) { sub_8078764(sprite, 1); sprite->callback = &sub_80DE114; -} \ No newline at end of file +} + +#ifdef NONMATCHING /* I couldn't do this one. */ +void sub_80DE114(struct Sprite *sprite) {} +#else +NAKED +void sub_80DE114(struct Sprite *sprite) { + asm_unified("\tpush {r4-r6,lr}\n" + "\tadds r3, r0, 0\n" + "\tmovs r5, 0\n" + "\tmovs r6, 0\n" + "\tadds r0, 0x3F\n" + "\tldrb r1, [r0]\n" + "\tmovs r0, 0x10\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _080DE1AA\n" + "\tadds r1, r3, 0\n" + "\tadds r1, 0x3E\n" + "\tldrb r2, [r1]\n" + "\tmovs r0, 0x4\n" + "\tands r0, r2\n" + "\tadds r4, r1, 0\n" + "\tcmp r0, 0\n" + "\tbne _080DE13E\n" + "\tmovs r0, 0x4\n" + "\torrs r0, r2\n" + "\tstrb r0, [r4]\n" + "_080DE13E:\n" + "\tmovs r1, 0x2E\n" + "\tldrsh r0, [r3, r1]\n" + "\tcmp r0, 0\n" + "\tbeq _080DE14E\n" + "\tcmp r0, 0x1\n" + "\tbeq _080DE158\n" + "\tmovs r6, 0x1\n" + "\tb _080DE162\n" + "_080DE14E:\n" + "\tmovs r1, 0x30\n" + "\tldrsh r0, [r3, r1]\n" + "\tcmp r0, 0x2\n" + "\tbne _080DE162\n" + "\tb _080DE166\n" + "_080DE158:\n" + "\tmovs r1, 0x30\n" + "\tldrsh r0, [r3, r1]\n" + "\tcmp r0, 0x4\n" + "\tbne _080DE162\n" + "\tmovs r5, 0x1\n" + "_080DE162:\n" + "\tcmp r5, 0\n" + "\tbeq _080DE198\n" + "_080DE166:\n" + "\tldrb r2, [r4]\n" + "\tlsls r0, r2, 29\n" + "\tlsrs r0, 31\n" + "\tmovs r1, 0x1\n" + "\teors r1, r0\n" + "\tlsls r1, 2\n" + "\tmovs r0, 0x5\n" + "\tnegs r0, r0\n" + "\tands r0, r2\n" + "\torrs r0, r1\n" + "\tstrb r0, [r4]\n" + "\tldrh r0, [r3, 0x32]\n" + "\tadds r0, 0x1\n" + "\tmovs r1, 0\n" + "\tstrh r0, [r3, 0x32]\n" + "\tstrh r1, [r3, 0x30]\n" + "\tlsls r0, 16\n" + "\tasrs r0, 16\n" + "\tcmp r0, 0x5\n" + "\tbne _080DE1AA\n" + "\tstrh r1, [r3, 0x32]\n" + "\tldrh r0, [r3, 0x2E]\n" + "\tadds r0, 0x1\n" + "\tstrh r0, [r3, 0x2E]\n" + "\tb _080DE1AA\n" + "_080DE198:\n" + "\tcmp r6, 0\n" + "\tbeq _080DE1A4\n" + "\tadds r0, r3, 0\n" + "\tbl DestroyAnimSprite\n" + "\tb _080DE1AA\n" + "_080DE1A4:\n" + "\tldrh r0, [r3, 0x30]\n" + "\tadds r0, 0x1\n" + "\tstrh r0, [r3, 0x30]\n" + "_080DE1AA:\n" + "\tpop {r4-r6}\n" + "\tpop {r0}\n" + "\tbx r0\n"); +} +#endif \ No newline at end of file -- cgit v1.2.3 From f9ea9e4fafb8b975bb3708fd2059c93f6d4d96f0 Mon Sep 17 00:00:00 2001 From: Thomas Winwood Date: Fri, 22 Jun 2018 14:29:43 +0100 Subject: Decompile sub_80DE1B0 --- asm/ghost.s | 143 ------------------------------------------------------------ src/ghost.c | 33 +++++++++++++- 2 files changed, 32 insertions(+), 144 deletions(-) diff --git a/asm/ghost.s b/asm/ghost.s index 3042f48d3..e5f239b5c 100644 --- a/asm/ghost.s +++ b/asm/ghost.s @@ -7,149 +7,6 @@ @ ghost - thumb_func_start sub_80DE1B0 -sub_80DE1B0: @ 80DE1B0 - push {r4-r6,lr} - lsls r0, 24 - lsrs r4, r0, 24 - lsls r0, r4, 2 - adds r0, r4 - lsls r0, 3 - ldr r1, _080DE1DC @ =gTasks - adds r5, r0, r1 - movs r0, 0x1 - bl duplicate_obj_of_side_rel2move_in_transparent_mode - movs r6, 0 - movs r1, 0 - strh r0, [r5, 0x8] - lsls r0, 16 - cmp r0, 0 - bge _080DE1E0 - adds r0, r4, 0 - bl DestroyAnimVisualTask - b _080DE2C0 - .align 2, 0 -_080DE1DC: .4byte gTasks -_080DE1E0: - strh r1, [r5, 0xA] - movs r0, 0xF - strh r0, [r5, 0xC] - movs r0, 0x2 - strh r0, [r5, 0xE] - strh r1, [r5, 0x10] - ldr r1, _080DE244 @ =REG_BLDCNT - movs r2, 0xFD - lsls r2, 6 - adds r0, r2, 0 - strh r0, [r1] - ldr r2, _080DE248 @ =REG_BLDALPHA - ldrh r0, [r5, 0xE] - lsls r0, 8 - ldrh r1, [r5, 0xC] - orrs r0, r1 - strh r0, [r2] - ldr r4, _080DE24C @ =gSprites - movs r0, 0x8 - ldrsh r1, [r5, r0] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r4 - movs r1, 0x50 - strh r1, [r0, 0x2E] - ldr r0, _080DE250 @ =gAnimBankTarget - ldrb r0, [r0] - bl GetBattlerSide - lsls r0, 24 - cmp r0, 0 - bne _080DE258 - movs r2, 0x8 - ldrsh r1, [r5, r2] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r4 - ldr r1, _080DE254 @ =0x0000ff70 - strh r1, [r0, 0x30] - movs r0, 0x8 - ldrsh r1, [r5, r0] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r4 - movs r1, 0x70 - b _080DE276 - .align 2, 0 -_080DE244: .4byte REG_BLDCNT -_080DE248: .4byte REG_BLDALPHA -_080DE24C: .4byte gSprites -_080DE250: .4byte gAnimBankTarget -_080DE254: .4byte 0x0000ff70 -_080DE258: - movs r2, 0x8 - ldrsh r1, [r5, r2] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r4 - movs r1, 0x90 - strh r1, [r0, 0x30] - movs r0, 0x8 - ldrsh r1, [r5, r0] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r4 - ldr r1, _080DE2C8 @ =0x0000ff90 -_080DE276: - strh r1, [r0, 0x32] - ldr r4, _080DE2CC @ =gSprites - movs r2, 0x8 - ldrsh r1, [r5, r2] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r4 - movs r2, 0 - strh r2, [r0, 0x34] - movs r0, 0x8 - ldrsh r1, [r5, r0] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r4 - strh r2, [r0, 0x36] - movs r2, 0x8 - ldrsh r1, [r5, r2] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r4 - ldr r1, _080DE2D0 @ =SpriteCallbackDummy - bl StoreSpriteCallbackInData - movs r0, 0x8 - ldrsh r1, [r5, r0] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r4, 0x1C - adds r0, r4 - ldr r1, _080DE2D4 @ =sub_8078394 - str r1, [r0] - ldr r0, _080DE2D8 @ =sub_80DE2DC - str r0, [r5] -_080DE2C0: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_080DE2C8: .4byte 0x0000ff90 -_080DE2CC: .4byte gSprites -_080DE2D0: .4byte SpriteCallbackDummy -_080DE2D4: .4byte sub_8078394 -_080DE2D8: .4byte sub_80DE2DC - thumb_func_end sub_80DE1B0 - thumb_func_start sub_80DE2DC sub_80DE2DC: @ 80DE2DC push {r4,lr} diff --git a/src/ghost.c b/src/ghost.c index 16f4241c0..0c547a43f 100644 --- a/src/ghost.c +++ b/src/ghost.c @@ -17,6 +17,7 @@ void sub_80DDE7C(u8 taskId); void sub_80DDED0(u8 taskId); void sub_80DDFE8(struct Sprite *); void sub_80DE114(struct Sprite *); +void sub_80DE2DC(u8 taskId); void sub_80DDB6C(struct Sprite *sprite) { InitAnimSpritePos(sprite, 1); @@ -342,4 +343,34 @@ void sub_80DE114(struct Sprite *sprite) { "\tpop {r0}\n" "\tbx r0\n"); } -#endif \ No newline at end of file +#endif + +void sub_80DE1B0(u8 taskId) { + struct Task *task; + + task = &gTasks[taskId]; + task->data[0] = duplicate_obj_of_side_rel2move_in_transparent_mode(1); + if (task->data[0] < 0) { + DestroyAnimVisualTask(taskId); + return; + } + task->data[1] = 0; + task->data[2] = 15; + task->data[3] = 2; + task->data[4] = 0; + REG_BLDCNT = 0x3F40; + REG_BLDALPHA = (task->data[3] << 8) | task->data[2]; + gSprites[task->data[0]].data[0] = 80; + if (GetBattlerSide(gAnimBankTarget) == 0) { + gSprites[task->data[0]].data[1] = 0xff70; + gSprites[task->data[0]].data[2] = 0x70; + } else { + gSprites[task->data[0]].data[1] = 0x90; + gSprites[task->data[0]].data[2] = 0xff90; + } + gSprites[task->data[0]].data[3] = 0; + gSprites[task->data[0]].data[4] = 0; + StoreSpriteCallbackInData(&gSprites[task->data[0]], SpriteCallbackDummy); + gSprites[task->data[0]].callback = &sub_8078394; + task->func = &sub_80DE2DC; +} \ No newline at end of file -- cgit v1.2.3 From 6bf9718737e6863ee66336549a7da450233a8df9 Mon Sep 17 00:00:00 2001 From: Thomas Winwood Date: Fri, 22 Jun 2018 15:47:46 +0100 Subject: Decompile sub_80DE2DC --- asm/ghost.s | 111 ------------------------------------------------------------ src/ghost.c | 37 ++++++++++++++++++++ 2 files changed, 37 insertions(+), 111 deletions(-) diff --git a/asm/ghost.s b/asm/ghost.s index e5f239b5c..d529715c5 100644 --- a/asm/ghost.s +++ b/asm/ghost.s @@ -7,117 +7,6 @@ @ ghost - thumb_func_start sub_80DE2DC -sub_80DE2DC: @ 80DE2DC - push {r4,lr} - lsls r0, 24 - lsrs r2, r0, 24 - lsls r0, r2, 2 - adds r0, r2 - lsls r0, 3 - ldr r1, _080DE300 @ =gTasks - adds r4, r0, r1 - movs r1, 0x10 - ldrsh r0, [r4, r1] - cmp r0, 0x1 - beq _080DE37C - cmp r0, 0x1 - bgt _080DE304 - cmp r0, 0 - beq _080DE30A - b _080DE3A6 - .align 2, 0 -_080DE300: .4byte gTasks -_080DE304: - cmp r0, 0x2 - beq _080DE3A0 - b _080DE3A6 -_080DE30A: - ldrh r1, [r4, 0xA] - adds r1, 0x1 - strh r1, [r4, 0xA] - movs r0, 0x3 - ands r0, r1 - strh r0, [r4, 0x12] - cmp r0, 0x1 - bne _080DE328 - ldrh r1, [r4, 0xC] - movs r2, 0xC - ldrsh r0, [r4, r2] - cmp r0, 0 - ble _080DE328 - subs r0, r1, 0x1 - strh r0, [r4, 0xC] -_080DE328: - movs r1, 0x12 - ldrsh r0, [r4, r1] - cmp r0, 0x3 - bne _080DE33E - ldrh r1, [r4, 0xE] - movs r2, 0xE - ldrsh r0, [r4, r2] - cmp r0, 0xF - bgt _080DE33E - adds r0, r1, 0x1 - strh r0, [r4, 0xE] -_080DE33E: - ldr r2, _080DE374 @ =REG_BLDALPHA - ldrh r0, [r4, 0xE] - lsls r0, 8 - ldrh r1, [r4, 0xC] - orrs r0, r1 - strh r0, [r2] - ldr r1, [r4, 0xC] - movs r0, 0x80 - lsls r0, 13 - cmp r1, r0 - bne _080DE3A6 - movs r1, 0xA - ldrsh r0, [r4, r1] - cmp r0, 0x50 - ble _080DE3A6 - movs r2, 0x8 - ldrsh r1, [r4, r2] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - ldr r1, _080DE378 @ =gSprites - adds r0, r1 - bl obj_delete_but_dont_free_vram - movs r0, 0x1 - strh r0, [r4, 0x10] - b _080DE3A6 - .align 2, 0 -_080DE374: .4byte REG_BLDALPHA -_080DE378: .4byte gSprites -_080DE37C: - ldrh r0, [r4, 0x14] - adds r0, 0x1 - movs r1, 0 - strh r0, [r4, 0x14] - lsls r0, 16 - asrs r0, 16 - cmp r0, 0x1 - ble _080DE3A6 - ldr r0, _080DE39C @ =REG_BLDCNT - strh r1, [r0] - adds r0, 0x2 - strh r1, [r0] - ldrh r0, [r4, 0x10] - adds r0, 0x1 - strh r0, [r4, 0x10] - b _080DE3A6 - .align 2, 0 -_080DE39C: .4byte REG_BLDCNT -_080DE3A0: - adds r0, r2, 0 - bl DestroyAnimVisualTask -_080DE3A6: - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_80DE2DC - thumb_func_start sub_80DE3AC sub_80DE3AC: @ 80DE3AC push {lr} diff --git a/src/ghost.c b/src/ghost.c index 0c547a43f..3a13f0b7c 100644 --- a/src/ghost.c +++ b/src/ghost.c @@ -373,4 +373,41 @@ void sub_80DE1B0(u8 taskId) { StoreSpriteCallbackInData(&gSprites[task->data[0]], SpriteCallbackDummy); gSprites[task->data[0]].callback = &sub_8078394; task->func = &sub_80DE2DC; +} + +void sub_80DE2DC(u8 taskId) { + struct Task *task; + + task = &gTasks[taskId]; + switch (task->data[4]) { + case 0: + task->data[1] += 1; + task->data[5] = task->data[1] & 3; + if (task->data[5] == 1) { + if (task->data[2] > 0) + task->data[2] -= 1; + } + if (task->data[5] == 3) { + if (task->data[3] <= 15) + task->data[3] += 1; + } + REG_BLDALPHA = (task->data[3] << 8) | task->data[2]; + if (task->data[3] != 16 || task->data[2] != 0) + break; + if (task->data[1] <= 80) + break; + obj_delete_but_dont_free_vram(&gSprites[task->data[0]]); + task->data[4] = 1; + break; + case 1: + task->data[6] += 1; + if (task->data[6] <= 1) + break; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + task->data[4] += 1; + break; + case 2: + DestroyAnimVisualTask(taskId); + } } \ No newline at end of file -- cgit v1.2.3 From 7f185ce187271334796162b95e1a378d0edabbd3 Mon Sep 17 00:00:00 2001 From: Thomas Winwood Date: Fri, 22 Jun 2018 15:54:01 +0100 Subject: Decompile sub_80DE3AC --- asm/ghost.s | 22 ---------------------- src/ghost.c | 10 ++++++++++ 2 files changed, 10 insertions(+), 22 deletions(-) diff --git a/asm/ghost.s b/asm/ghost.s index d529715c5..36487210d 100644 --- a/asm/ghost.s +++ b/asm/ghost.s @@ -7,28 +7,6 @@ @ ghost - thumb_func_start sub_80DE3AC -sub_80DE3AC: @ 80DE3AC - push {lr} - lsls r0, 24 - lsrs r0, 24 - lsls r1, r0, 2 - adds r1, r0 - lsls r1, 3 - ldr r2, _080DE3CC @ =gTasks - adds r1, r2 - movs r2, 0 - strh r2, [r1, 0x26] - ldr r2, _080DE3D0 @ =sub_80DE3D4 - str r2, [r1] - bl _call_via_r2 - pop {r0} - bx r0 - .align 2, 0 -_080DE3CC: .4byte gTasks -_080DE3D0: .4byte sub_80DE3D4 - thumb_func_end sub_80DE3AC - thumb_func_start sub_80DE3D4 sub_80DE3D4: @ 80DE3D4 push {r4-r7,lr} diff --git a/src/ghost.c b/src/ghost.c index 3a13f0b7c..c5d19e082 100644 --- a/src/ghost.c +++ b/src/ghost.c @@ -18,6 +18,7 @@ void sub_80DDED0(u8 taskId); void sub_80DDFE8(struct Sprite *); void sub_80DE114(struct Sprite *); void sub_80DE2DC(u8 taskId); +void sub_80DE3D4(u8 taskId); void sub_80DDB6C(struct Sprite *sprite) { InitAnimSpritePos(sprite, 1); @@ -410,4 +411,13 @@ void sub_80DE2DC(u8 taskId) { case 2: DestroyAnimVisualTask(taskId); } +} + +void sub_80DE3AC(u8 taskId) { + struct Task *task; + + task = &gTasks[taskId]; + task->data[15] = 0; + task->func = &sub_80DE3D4; + sub_80DE3D4(taskId); } \ No newline at end of file -- cgit v1.2.3 From 9542764ca1ba1a698a7fcb5e2efe7f975eeaba3f Mon Sep 17 00:00:00 2001 From: Thomas Winwood Date: Sat, 23 Jun 2018 17:08:29 +0100 Subject: Move everything into battle/anim/ghost.c --- ld_script.txt | 1 - src/battle/anim/ghost.c | 415 +++++++++++++++++++++++++++++++++++++++++++++++ src/ghost.c | 423 ------------------------------------------------ 3 files changed, 415 insertions(+), 424 deletions(-) delete mode 100644 src/ghost.c diff --git a/ld_script.txt b/ld_script.txt index be3885add..dbecbe3f1 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -289,7 +289,6 @@ SECTIONS { src/battle/anim/bug.o(.text); src/battle/anim/rock.o(.text); src/battle/anim/ghost.o(.text); - src/ghost.o(.text); asm/ghost.o(.text); src/battle/anim/dragon.o(.text); src/battle/anim/dark.o(.text); diff --git a/src/battle/anim/ghost.c b/src/battle/anim/ghost.c index fd33d4782..c83f5f444 100755 --- a/src/battle/anim/ghost.c +++ b/src/battle/anim/ghost.c @@ -1,15 +1,28 @@ #include "global.h" +#include "sound.h" +#include "trig.h" #include "rom_8077ABC.h" #include "battle_anim.h" extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; +extern u8 gUnknown_0202F7D2; void sub_80DDB6C(struct Sprite *sprite); +void sub_80DDBD8(struct Sprite *); +void sub_80DDC4C(struct Sprite *); +void sub_80DDCC8(struct Sprite *); void sub_80DDD58(struct Sprite *sprite); +void sub_80DDD78(struct Sprite *); +void sub_80DDE7C(u8 taskId); +void sub_80DDED0(u8 taskId); void sub_80DDF40(struct Sprite *sprite); +void sub_80DDFE8(struct Sprite *); void sub_80DE0FC(struct Sprite *sprite); +void sub_80DE114(struct Sprite *); +void sub_80DE2DC(u8 taskId); +void sub_80DE3D4(u8 taskId); void sub_80DE7B8(struct Sprite *sprite); void sub_80DEF3C(struct Sprite *sprite); void sub_80DF0B8(struct Sprite *sprite); @@ -189,3 +202,405 @@ const struct SpriteTemplate gSpriteTemplate_83DAF98 = .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_80DF49C, }; + +void sub_80DDB6C(struct Sprite *sprite) { + InitAnimSpritePos(sprite, 1); + sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2); + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3); + sub_8078BD4(sprite); + sprite->callback = sub_80DDBD8; + sprite->data[6] = 0x10; + REG_BLDCNT = 0x3F40; + REG_BLDALPHA = sprite->data[6]; +} + +void sub_80DDBD8(struct Sprite *sprite) { + s16 r0; + s16 r2; + sub_80DDCC8(sprite); + if (TranslateAnimSpriteByDeltas(sprite)) { + sprite->callback = sub_80DDC4C; + return; + } + sprite->pos2.x += Sin(sprite->data[5], 10); + sprite->pos2.y += Cos(sprite->data[5], 15); + r2 = sprite->data[5]; + sprite->data[5] = (sprite->data[5] + 5) & 0xFF; + r0 = sprite->data[5]; + if (r2 != 0) { + if (r2 <= 0xC4) + return; + } + if (r0 <= 0) + return; + PlaySE12WithPanning(0xC4, gUnknown_0202F7D2); +} + +void sub_80DDC4C(struct Sprite *sprite) +{ + s16 r2; + s16 r0; + sprite->data[0] = 1; + TranslateAnimSpriteByDeltas(sprite); + sprite->pos2.x += Sin(sprite->data[5],10); + sprite->pos2.y += Cos(sprite->data[5],15); + + r2 = sprite->data[5]; + sprite->data[5] = (sprite->data[5] + 5) & 0xFF; + r0 = sprite->data[5]; + + if(r2 == 0 || r2 > 0xC4) + { + if(r0 > 0) + PlaySE(0xC4); + } + + if(sprite->data[6] == 0) + { + sprite->invisible = TRUE; + sprite->callback = sub_807861C; + } + else + sub_80DDCC8(sprite); +} + +void sub_80DDCC8(struct Sprite *sprite) +{ + + s16 r0; + if(sprite->data[6] > 0xFF) + { + if(++sprite->data[6] == 0x10d) + sprite->data[6] = 0; + return; + } + + r0 = sprite->data[7]; + sprite->data[7]++; + + if((r0 & 0xFF) == 0) + { + sprite->data[7] &= 0xff00; + if((sprite->data[7] & 0x100) != 0) + sprite->data[6]++; + else + sprite->data[6]--; + } + else + return; + + REG_BLDALPHA = ((16 - sprite->data[6]) << 8) | sprite->data[6]; + if(sprite->data[6] == 0 || sprite->data[6] == 16) + { + sprite->data[7] ^= 0x100; + } + if(sprite->data[6] == 0) + sprite->data[6] = 0x100; +} + +void sub_80DDD58(struct Sprite *sprite) +{ + sub_8078764(sprite, 1); + sprite->callback = sub_80DDD78; + sub_80DDD78(sprite); +} + +void sub_80DDD78(struct Sprite *sprite) { + u16 temp1; + sprite->pos2.x = Sin(sprite->data[0], 32); + sprite->pos2.y = Cos(sprite->data[0], 8); + temp1 = sprite->data[0] - 65; + if (temp1 <= 130) { + sprite->oam.priority = 2; + } else { + sprite->oam.priority = 1; + } + sprite->data[0] = (sprite->data[0] + 0x13) & 0xFF; + sprite->data[2] += 80; + sprite->pos2.y += sprite->data[2] >> 8; + sprite->data[7] += 1; + if (sprite->data[7] == 0x3D) { + DestroyAnimSprite(sprite); + } +} + +void sub_80DDDF0(u8 r5) { + u8 r4; + REG_BLDCNT = 0x3F40; + REG_BLDALPHA = 0x1000; + r4 = GetAnimBattlerSpriteId(0); + sub_8078E70(r4, 1); + obj_id_set_rotscale(r4, 0x80, 0x80, 0); + gSprites[r4].invisible = FALSE; + gTasks[r5].data[0] = 0x80; + gTasks[r5].data[1] = *gBattleAnimArgs; + gTasks[r5].data[2] = 0; + gTasks[r5].data[3] = 0x10; + gTasks[r5].func = &sub_80DDE7C; +} + +void sub_80DDE7C(u8 taskId) { + gTasks[taskId].data[10] += 1; + if (gTasks[taskId].data[10] == 3) { + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[2] += 1; + gTasks[taskId].data[3] -= 1; + REG_BLDALPHA = gTasks[taskId].data[3] << 8 | gTasks[taskId].data[2]; + if (gTasks[taskId].data[2] != 9) + return; + gTasks[taskId].func = &sub_80DDED0; + } +} + +void sub_80DDED0(u8 taskId) { + u8 r1; + if (gTasks[taskId].data[1] > 0) { + gTasks[taskId].data[1] -= 1; + return; + } + r1 = GetAnimBattlerSpriteId(0); + gTasks[taskId].data[0] += 8; + if (gTasks[taskId].data[0] <= 0xFF) { + obj_id_set_rotscale(r1, gTasks[taskId].data[0], gTasks[taskId].data[0], 0); + return; + } + sub_8078F40(r1); + DestroyAnimVisualTask(taskId); + REG_BLDCNT = 0; + REG_BLDALPHA = 0; +} + +void sub_80DDF40(struct Sprite *sprite) { + u16 r5, r6; + r5 = sprite->pos1.x; + r6 = sprite->pos1.y; + sprite->pos1.x = GetBattlerSpriteCoord(gAnimBankAttacker, 2); + sprite->pos1.y = GetBattlerSpriteCoord(gAnimBankAttacker, 3); + sprite->data[0] = 0; + sprite->data[1] = gBattleAnimArgs[0]; + sprite->data[2] = gBattleAnimArgs[1]; + sprite->data[3] = gBattleAnimArgs[2]; + sprite->data[4] = sprite->pos1.x << 4; + sprite->data[5] = sprite->pos1.y << 4; + sprite->data[6] = (((s16)r5 - sprite->pos1.x) << 4) / (gBattleAnimArgs[0] << 1); + sprite->data[7] = (((s16)r6 - sprite->pos1.y) << 4) / (gBattleAnimArgs[0] << 1); + sprite->callback = &sub_80DDFE8; +} + +void sub_80DDFE8(struct Sprite *sprite) { + switch (sprite->data[0]) { + case 0: + sprite->data[4] += sprite->data[6]; + sprite->data[5] += sprite->data[7]; + sprite->pos1.x = sprite->data[4] >> 4; + sprite->pos1.y = sprite->data[5] >> 4; + sprite->data[1] -= 1; + if (sprite->data[1] > 0) + break; + sprite->data[0] += 1; + break; + case 1: + sprite->data[2] -= 1; + if (sprite->data[2] > 0) + break; + sprite->data[1] = GetBattlerSpriteCoord(gAnimBankTarget, 2); + sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 3); + sprite->data[4] = sprite->pos1.x << 4; + sprite->data[5] = sprite->pos1.y << 4; + sprite->data[6] = ((sprite->data[1] - sprite->pos1.x) << 4) / sprite->data[3]; + sprite->data[7] = ((sprite->data[2] - sprite->pos1.y) << 4) / sprite->data[3]; + sprite->data[0] += 1; + break; + case 2: + sprite->data[4] += sprite->data[6]; + sprite->data[5] += sprite->data[7]; + sprite->pos1.x = sprite->data[4] >> 4; + sprite->pos1.y = sprite->data[5] >> 4; + sprite->data[3] -= 1; + if (sprite->data[3] > 0) + break; + sprite->pos1.x = GetBattlerSpriteCoord(gAnimBankTarget, 2); + sprite->pos1.y = GetBattlerSpriteCoord(gAnimBankTarget, 3); + sprite->data[0] += 1; + break; + case 3: + move_anim_8074EE0(sprite); + } +} + +void sub_80DE0FC(struct Sprite *sprite) { + sub_8078764(sprite, 1); + sprite->callback = &sub_80DE114; +} + +#ifdef NONMATCHING /* I couldn't do this one. */ +void sub_80DE114(struct Sprite *sprite) {} +#else +NAKED +void sub_80DE114(struct Sprite *sprite) { + asm_unified("\tpush {r4-r6,lr}\n" + "\tadds r3, r0, 0\n" + "\tmovs r5, 0\n" + "\tmovs r6, 0\n" + "\tadds r0, 0x3F\n" + "\tldrb r1, [r0]\n" + "\tmovs r0, 0x10\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _080DE1AA\n" + "\tadds r1, r3, 0\n" + "\tadds r1, 0x3E\n" + "\tldrb r2, [r1]\n" + "\tmovs r0, 0x4\n" + "\tands r0, r2\n" + "\tadds r4, r1, 0\n" + "\tcmp r0, 0\n" + "\tbne _080DE13E\n" + "\tmovs r0, 0x4\n" + "\torrs r0, r2\n" + "\tstrb r0, [r4]\n" + "_080DE13E:\n" + "\tmovs r1, 0x2E\n" + "\tldrsh r0, [r3, r1]\n" + "\tcmp r0, 0\n" + "\tbeq _080DE14E\n" + "\tcmp r0, 0x1\n" + "\tbeq _080DE158\n" + "\tmovs r6, 0x1\n" + "\tb _080DE162\n" + "_080DE14E:\n" + "\tmovs r1, 0x30\n" + "\tldrsh r0, [r3, r1]\n" + "\tcmp r0, 0x2\n" + "\tbne _080DE162\n" + "\tb _080DE166\n" + "_080DE158:\n" + "\tmovs r1, 0x30\n" + "\tldrsh r0, [r3, r1]\n" + "\tcmp r0, 0x4\n" + "\tbne _080DE162\n" + "\tmovs r5, 0x1\n" + "_080DE162:\n" + "\tcmp r5, 0\n" + "\tbeq _080DE198\n" + "_080DE166:\n" + "\tldrb r2, [r4]\n" + "\tlsls r0, r2, 29\n" + "\tlsrs r0, 31\n" + "\tmovs r1, 0x1\n" + "\teors r1, r0\n" + "\tlsls r1, 2\n" + "\tmovs r0, 0x5\n" + "\tnegs r0, r0\n" + "\tands r0, r2\n" + "\torrs r0, r1\n" + "\tstrb r0, [r4]\n" + "\tldrh r0, [r3, 0x32]\n" + "\tadds r0, 0x1\n" + "\tmovs r1, 0\n" + "\tstrh r0, [r3, 0x32]\n" + "\tstrh r1, [r3, 0x30]\n" + "\tlsls r0, 16\n" + "\tasrs r0, 16\n" + "\tcmp r0, 0x5\n" + "\tbne _080DE1AA\n" + "\tstrh r1, [r3, 0x32]\n" + "\tldrh r0, [r3, 0x2E]\n" + "\tadds r0, 0x1\n" + "\tstrh r0, [r3, 0x2E]\n" + "\tb _080DE1AA\n" + "_080DE198:\n" + "\tcmp r6, 0\n" + "\tbeq _080DE1A4\n" + "\tadds r0, r3, 0\n" + "\tbl DestroyAnimSprite\n" + "\tb _080DE1AA\n" + "_080DE1A4:\n" + "\tldrh r0, [r3, 0x30]\n" + "\tadds r0, 0x1\n" + "\tstrh r0, [r3, 0x30]\n" + "_080DE1AA:\n" + "\tpop {r4-r6}\n" + "\tpop {r0}\n" + "\tbx r0\n"); +} +#endif + +void sub_80DE1B0(u8 taskId) { + struct Task *task; + + task = &gTasks[taskId]; + task->data[0] = duplicate_obj_of_side_rel2move_in_transparent_mode(1); + if (task->data[0] < 0) { + DestroyAnimVisualTask(taskId); + return; + } + task->data[1] = 0; + task->data[2] = 15; + task->data[3] = 2; + task->data[4] = 0; + REG_BLDCNT = 0x3F40; + REG_BLDALPHA = (task->data[3] << 8) | task->data[2]; + gSprites[task->data[0]].data[0] = 80; + if (GetBattlerSide(gAnimBankTarget) == 0) { + gSprites[task->data[0]].data[1] = 0xff70; + gSprites[task->data[0]].data[2] = 0x70; + } else { + gSprites[task->data[0]].data[1] = 0x90; + gSprites[task->data[0]].data[2] = 0xff90; + } + gSprites[task->data[0]].data[3] = 0; + gSprites[task->data[0]].data[4] = 0; + StoreSpriteCallbackInData(&gSprites[task->data[0]], SpriteCallbackDummy); + gSprites[task->data[0]].callback = &sub_8078394; + task->func = &sub_80DE2DC; +} + +void sub_80DE2DC(u8 taskId) { + struct Task *task; + + task = &gTasks[taskId]; + switch (task->data[4]) { + case 0: + task->data[1] += 1; + task->data[5] = task->data[1] & 3; + if (task->data[5] == 1) { + if (task->data[2] > 0) + task->data[2] -= 1; + } + if (task->data[5] == 3) { + if (task->data[3] <= 15) + task->data[3] += 1; + } + REG_BLDALPHA = (task->data[3] << 8) | task->data[2]; + if (task->data[3] != 16 || task->data[2] != 0) + break; + if (task->data[1] <= 80) + break; + obj_delete_but_dont_free_vram(&gSprites[task->data[0]]); + task->data[4] = 1; + break; + case 1: + task->data[6] += 1; + if (task->data[6] <= 1) + break; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + task->data[4] += 1; + break; + case 2: + DestroyAnimVisualTask(taskId); + } +} + +void sub_80DE3AC(u8 taskId) { + struct Task *task; + + task = &gTasks[taskId]; + task->data[15] = 0; + task->func = &sub_80DE3D4; + sub_80DE3D4(taskId); +} diff --git a/src/ghost.c b/src/ghost.c deleted file mode 100644 index c5d19e082..000000000 --- a/src/ghost.c +++ /dev/null @@ -1,423 +0,0 @@ -#include "global.h" -#include "battle_anim.h" -#include "rom_8077ABC.h" -#include "sound.h" -#include "trig.h" - -extern s16 gBattleAnimArgs[]; -extern u8 gAnimBankTarget; -extern u8 gUnknown_0202F7D2; -extern u8 gAnimBankAttacker; - -void sub_80DDBD8(struct Sprite *); -void sub_80DDC4C(struct Sprite *); -void sub_80DDCC8(struct Sprite *); -void sub_80DDD78(struct Sprite *); -void sub_80DDE7C(u8 taskId); -void sub_80DDED0(u8 taskId); -void sub_80DDFE8(struct Sprite *); -void sub_80DE114(struct Sprite *); -void sub_80DE2DC(u8 taskId); -void sub_80DE3D4(u8 taskId); - -void sub_80DDB6C(struct Sprite *sprite) { - InitAnimSpritePos(sprite, 1); - sprite->data[0] = gBattleAnimArgs[2]; - sprite->data[1] = sprite->pos1.x; - sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2); - sprite->data[3] = sprite->pos1.y; - sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3); - sub_8078BD4(sprite); - sprite->callback = sub_80DDBD8; - sprite->data[6] = 0x10; - REG_BLDCNT = 0x3F40; - REG_BLDALPHA = sprite->data[6]; -} - -void sub_80DDBD8(struct Sprite *sprite) { - s16 r0; - s16 r2; - sub_80DDCC8(sprite); - if (TranslateAnimSpriteByDeltas(sprite)) { - sprite->callback = sub_80DDC4C; - return; - } - sprite->pos2.x += Sin(sprite->data[5], 10); - sprite->pos2.y += Cos(sprite->data[5], 15); - r2 = sprite->data[5]; - sprite->data[5] = (sprite->data[5] + 5) & 0xFF; - r0 = sprite->data[5]; - if (r2 != 0) { - if (r2 <= 0xC4) - return; - } - if (r0 <= 0) - return; - PlaySE12WithPanning(0xC4, gUnknown_0202F7D2); -} - -void sub_80DDC4C(struct Sprite *sprite) -{ - s16 r2; - s16 r0; - sprite->data[0] = 1; - TranslateAnimSpriteByDeltas(sprite); - sprite->pos2.x += Sin(sprite->data[5],10); - sprite->pos2.y += Cos(sprite->data[5],15); - - r2 = sprite->data[5]; - sprite->data[5] = (sprite->data[5] + 5) & 0xFF; - r0 = sprite->data[5]; - - if(r2 == 0 || r2 > 0xC4) - { - if(r0 > 0) - PlaySE(0xC4); - } - - if(sprite->data[6] == 0) - { - sprite->invisible = TRUE; - sprite->callback = sub_807861C; - } - else - sub_80DDCC8(sprite); -} - -void sub_80DDCC8(struct Sprite *sprite) -{ - - s16 r0; - if(sprite->data[6] > 0xFF) - { - if(++sprite->data[6] == 0x10d) - sprite->data[6] = 0; - return; - } - - r0 = sprite->data[7]; - sprite->data[7]++; - - if((r0 & 0xFF) == 0) - { - sprite->data[7] &= 0xff00; - if((sprite->data[7] & 0x100) != 0) - sprite->data[6]++; - else - sprite->data[6]--; - } - else - return; - - REG_BLDALPHA = ((16 - sprite->data[6]) << 8) | sprite->data[6]; - if(sprite->data[6] == 0 || sprite->data[6] == 16) - { - sprite->data[7] ^= 0x100; - } - if(sprite->data[6] == 0) - sprite->data[6] = 0x100; -} - -void sub_80DDD58(struct Sprite *sprite) -{ - sub_8078764(sprite, 1); - sprite->callback = sub_80DDD78; - sub_80DDD78(sprite); -} - -void sub_80DDD78(struct Sprite *sprite) { - u16 temp1; - sprite->pos2.x = Sin(sprite->data[0], 32); - sprite->pos2.y = Cos(sprite->data[0], 8); - temp1 = sprite->data[0] - 65; - if (temp1 <= 130) { - sprite->oam.priority = 2; - } else { - sprite->oam.priority = 1; - } - sprite->data[0] = (sprite->data[0] + 0x13) & 0xFF; - sprite->data[2] += 80; - sprite->pos2.y += sprite->data[2] >> 8; - sprite->data[7] += 1; - if (sprite->data[7] == 0x3D) { - DestroyAnimSprite(sprite); - } -} - -void sub_80DDDF0(u8 r5) { - u8 r4; - REG_BLDCNT = 0x3F40; - REG_BLDALPHA = 0x1000; - r4 = GetAnimBattlerSpriteId(0); - sub_8078E70(r4, 1); - obj_id_set_rotscale(r4, 0x80, 0x80, 0); - gSprites[r4].invisible = FALSE; - gTasks[r5].data[0] = 0x80; - gTasks[r5].data[1] = *gBattleAnimArgs; - gTasks[r5].data[2] = 0; - gTasks[r5].data[3] = 0x10; - gTasks[r5].func = &sub_80DDE7C; -} - -void sub_80DDE7C(u8 taskId) { - gTasks[taskId].data[10] += 1; - if (gTasks[taskId].data[10] == 3) { - gTasks[taskId].data[10] = 0; - gTasks[taskId].data[2] += 1; - gTasks[taskId].data[3] -= 1; - REG_BLDALPHA = gTasks[taskId].data[3] << 8 | gTasks[taskId].data[2]; - if (gTasks[taskId].data[2] != 9) - return; - gTasks[taskId].func = &sub_80DDED0; - } -} - -void sub_80DDED0(u8 taskId) { - u8 r1; - if (gTasks[taskId].data[1] > 0) { - gTasks[taskId].data[1] -= 1; - return; - } - r1 = GetAnimBattlerSpriteId(0); - gTasks[taskId].data[0] += 8; - if (gTasks[taskId].data[0] <= 0xFF) { - obj_id_set_rotscale(r1, gTasks[taskId].data[0], gTasks[taskId].data[0], 0); - return; - } - sub_8078F40(r1); - DestroyAnimVisualTask(taskId); - REG_BLDCNT = 0; - REG_BLDALPHA = 0; -} - -void sub_80DDF40(struct Sprite *sprite) { - u16 r5, r6; - r5 = sprite->pos1.x; - r6 = sprite->pos1.y; - sprite->pos1.x = GetBattlerSpriteCoord(gAnimBankAttacker, 2); - sprite->pos1.y = GetBattlerSpriteCoord(gAnimBankAttacker, 3); - sprite->data[0] = 0; - sprite->data[1] = gBattleAnimArgs[0]; - sprite->data[2] = gBattleAnimArgs[1]; - sprite->data[3] = gBattleAnimArgs[2]; - sprite->data[4] = sprite->pos1.x << 4; - sprite->data[5] = sprite->pos1.y << 4; - sprite->data[6] = (((s16)r5 - sprite->pos1.x) << 4) / (gBattleAnimArgs[0] << 1); - sprite->data[7] = (((s16)r6 - sprite->pos1.y) << 4) / (gBattleAnimArgs[0] << 1); - sprite->callback = &sub_80DDFE8; -} - -void sub_80DDFE8(struct Sprite *sprite) { - switch (sprite->data[0]) { - case 0: - sprite->data[4] += sprite->data[6]; - sprite->data[5] += sprite->data[7]; - sprite->pos1.x = sprite->data[4] >> 4; - sprite->pos1.y = sprite->data[5] >> 4; - sprite->data[1] -= 1; - if (sprite->data[1] > 0) - break; - sprite->data[0] += 1; - break; - case 1: - sprite->data[2] -= 1; - if (sprite->data[2] > 0) - break; - sprite->data[1] = GetBattlerSpriteCoord(gAnimBankTarget, 2); - sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 3); - sprite->data[4] = sprite->pos1.x << 4; - sprite->data[5] = sprite->pos1.y << 4; - sprite->data[6] = ((sprite->data[1] - sprite->pos1.x) << 4) / sprite->data[3]; - sprite->data[7] = ((sprite->data[2] - sprite->pos1.y) << 4) / sprite->data[3]; - sprite->data[0] += 1; - break; - case 2: - sprite->data[4] += sprite->data[6]; - sprite->data[5] += sprite->data[7]; - sprite->pos1.x = sprite->data[4] >> 4; - sprite->pos1.y = sprite->data[5] >> 4; - sprite->data[3] -= 1; - if (sprite->data[3] > 0) - break; - sprite->pos1.x = GetBattlerSpriteCoord(gAnimBankTarget, 2); - sprite->pos1.y = GetBattlerSpriteCoord(gAnimBankTarget, 3); - sprite->data[0] += 1; - break; - case 3: - move_anim_8074EE0(sprite); - } -} - -void sub_80DE0FC(struct Sprite *sprite) { - sub_8078764(sprite, 1); - sprite->callback = &sub_80DE114; -} - -#ifdef NONMATCHING /* I couldn't do this one. */ -void sub_80DE114(struct Sprite *sprite) {} -#else -NAKED -void sub_80DE114(struct Sprite *sprite) { - asm_unified("\tpush {r4-r6,lr}\n" - "\tadds r3, r0, 0\n" - "\tmovs r5, 0\n" - "\tmovs r6, 0\n" - "\tadds r0, 0x3F\n" - "\tldrb r1, [r0]\n" - "\tmovs r0, 0x10\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _080DE1AA\n" - "\tadds r1, r3, 0\n" - "\tadds r1, 0x3E\n" - "\tldrb r2, [r1]\n" - "\tmovs r0, 0x4\n" - "\tands r0, r2\n" - "\tadds r4, r1, 0\n" - "\tcmp r0, 0\n" - "\tbne _080DE13E\n" - "\tmovs r0, 0x4\n" - "\torrs r0, r2\n" - "\tstrb r0, [r4]\n" - "_080DE13E:\n" - "\tmovs r1, 0x2E\n" - "\tldrsh r0, [r3, r1]\n" - "\tcmp r0, 0\n" - "\tbeq _080DE14E\n" - "\tcmp r0, 0x1\n" - "\tbeq _080DE158\n" - "\tmovs r6, 0x1\n" - "\tb _080DE162\n" - "_080DE14E:\n" - "\tmovs r1, 0x30\n" - "\tldrsh r0, [r3, r1]\n" - "\tcmp r0, 0x2\n" - "\tbne _080DE162\n" - "\tb _080DE166\n" - "_080DE158:\n" - "\tmovs r1, 0x30\n" - "\tldrsh r0, [r3, r1]\n" - "\tcmp r0, 0x4\n" - "\tbne _080DE162\n" - "\tmovs r5, 0x1\n" - "_080DE162:\n" - "\tcmp r5, 0\n" - "\tbeq _080DE198\n" - "_080DE166:\n" - "\tldrb r2, [r4]\n" - "\tlsls r0, r2, 29\n" - "\tlsrs r0, 31\n" - "\tmovs r1, 0x1\n" - "\teors r1, r0\n" - "\tlsls r1, 2\n" - "\tmovs r0, 0x5\n" - "\tnegs r0, r0\n" - "\tands r0, r2\n" - "\torrs r0, r1\n" - "\tstrb r0, [r4]\n" - "\tldrh r0, [r3, 0x32]\n" - "\tadds r0, 0x1\n" - "\tmovs r1, 0\n" - "\tstrh r0, [r3, 0x32]\n" - "\tstrh r1, [r3, 0x30]\n" - "\tlsls r0, 16\n" - "\tasrs r0, 16\n" - "\tcmp r0, 0x5\n" - "\tbne _080DE1AA\n" - "\tstrh r1, [r3, 0x32]\n" - "\tldrh r0, [r3, 0x2E]\n" - "\tadds r0, 0x1\n" - "\tstrh r0, [r3, 0x2E]\n" - "\tb _080DE1AA\n" - "_080DE198:\n" - "\tcmp r6, 0\n" - "\tbeq _080DE1A4\n" - "\tadds r0, r3, 0\n" - "\tbl DestroyAnimSprite\n" - "\tb _080DE1AA\n" - "_080DE1A4:\n" - "\tldrh r0, [r3, 0x30]\n" - "\tadds r0, 0x1\n" - "\tstrh r0, [r3, 0x30]\n" - "_080DE1AA:\n" - "\tpop {r4-r6}\n" - "\tpop {r0}\n" - "\tbx r0\n"); -} -#endif - -void sub_80DE1B0(u8 taskId) { - struct Task *task; - - task = &gTasks[taskId]; - task->data[0] = duplicate_obj_of_side_rel2move_in_transparent_mode(1); - if (task->data[0] < 0) { - DestroyAnimVisualTask(taskId); - return; - } - task->data[1] = 0; - task->data[2] = 15; - task->data[3] = 2; - task->data[4] = 0; - REG_BLDCNT = 0x3F40; - REG_BLDALPHA = (task->data[3] << 8) | task->data[2]; - gSprites[task->data[0]].data[0] = 80; - if (GetBattlerSide(gAnimBankTarget) == 0) { - gSprites[task->data[0]].data[1] = 0xff70; - gSprites[task->data[0]].data[2] = 0x70; - } else { - gSprites[task->data[0]].data[1] = 0x90; - gSprites[task->data[0]].data[2] = 0xff90; - } - gSprites[task->data[0]].data[3] = 0; - gSprites[task->data[0]].data[4] = 0; - StoreSpriteCallbackInData(&gSprites[task->data[0]], SpriteCallbackDummy); - gSprites[task->data[0]].callback = &sub_8078394; - task->func = &sub_80DE2DC; -} - -void sub_80DE2DC(u8 taskId) { - struct Task *task; - - task = &gTasks[taskId]; - switch (task->data[4]) { - case 0: - task->data[1] += 1; - task->data[5] = task->data[1] & 3; - if (task->data[5] == 1) { - if (task->data[2] > 0) - task->data[2] -= 1; - } - if (task->data[5] == 3) { - if (task->data[3] <= 15) - task->data[3] += 1; - } - REG_BLDALPHA = (task->data[3] << 8) | task->data[2]; - if (task->data[3] != 16 || task->data[2] != 0) - break; - if (task->data[1] <= 80) - break; - obj_delete_but_dont_free_vram(&gSprites[task->data[0]]); - task->data[4] = 1; - break; - case 1: - task->data[6] += 1; - if (task->data[6] <= 1) - break; - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - task->data[4] += 1; - break; - case 2: - DestroyAnimVisualTask(taskId); - } -} - -void sub_80DE3AC(u8 taskId) { - struct Task *task; - - task = &gTasks[taskId]; - task->data[15] = 0; - task->func = &sub_80DE3D4; - sub_80DE3D4(taskId); -} \ No newline at end of file -- cgit v1.2.3 From 5bce0fec056737c1a562cc2be738a868e02117ba Mon Sep 17 00:00:00 2001 From: Thomas Winwood Date: Sat, 23 Jun 2018 19:06:06 +0100 Subject: Remove clothing from sub_80DE114 --- src/battle/anim/ghost.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/battle/anim/ghost.c b/src/battle/anim/ghost.c index c83f5f444..98710c679 100755 --- a/src/battle/anim/ghost.c +++ b/src/battle/anim/ghost.c @@ -436,9 +436,7 @@ void sub_80DE0FC(struct Sprite *sprite) { sprite->callback = &sub_80DE114; } -#ifdef NONMATCHING /* I couldn't do this one. */ -void sub_80DE114(struct Sprite *sprite) {} -#else +/* NONMATCHING */ NAKED void sub_80DE114(struct Sprite *sprite) { asm_unified("\tpush {r4-r6,lr}\n" @@ -527,7 +525,6 @@ void sub_80DE114(struct Sprite *sprite) { "\tpop {r0}\n" "\tbx r0\n"); } -#endif void sub_80DE1B0(u8 taskId) { struct Task *task; -- cgit v1.2.3 From 31c322c77b2e5628ebe5c5c9c4b34c8beb8f40cb Mon Sep 17 00:00:00 2001 From: Thomas Winwood Date: Sun, 24 Jun 2018 16:11:22 +0100 Subject: Respond to formatting feedback --- src/battle/anim/ghost.c | 156 ++++++++++++++++++++++++++---------------------- 1 file changed, 85 insertions(+), 71 deletions(-) diff --git a/src/battle/anim/ghost.c b/src/battle/anim/ghost.c index 98710c679..85879c86c 100755 --- a/src/battle/anim/ghost.c +++ b/src/battle/anim/ghost.c @@ -1,5 +1,6 @@ #include "global.h" #include "sound.h" +#include "constants/songs.h" #include "trig.h" #include "rom_8077ABC.h" #include "battle_anim.h" @@ -203,7 +204,8 @@ const struct SpriteTemplate gSpriteTemplate_83DAF98 = .callback = sub_80DF49C, }; -void sub_80DDB6C(struct Sprite *sprite) { +void sub_80DDB6C(struct Sprite *sprite) +{ InitAnimSpritePos(sprite, 1); sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = sprite->pos1.x; @@ -212,16 +214,18 @@ void sub_80DDB6C(struct Sprite *sprite) { sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3); sub_8078BD4(sprite); sprite->callback = sub_80DDBD8; - sprite->data[6] = 0x10; + sprite->data[6] = 16; REG_BLDCNT = 0x3F40; REG_BLDALPHA = sprite->data[6]; } -void sub_80DDBD8(struct Sprite *sprite) { +void sub_80DDBD8(struct Sprite *sprite) +{ s16 r0; s16 r2; sub_80DDCC8(sprite); - if (TranslateAnimSpriteByDeltas(sprite)) { + if (TranslateAnimSpriteByDeltas(sprite)) + { sprite->callback = sub_80DDC4C; return; } @@ -230,13 +234,11 @@ void sub_80DDBD8(struct Sprite *sprite) { r2 = sprite->data[5]; sprite->data[5] = (sprite->data[5] + 5) & 0xFF; r0 = sprite->data[5]; - if (r2 != 0) { - if (r2 <= 0xC4) - return; - } + if (r2 != 0 && r2 <= 196) + return; if (r0 <= 0) return; - PlaySE12WithPanning(0xC4, gUnknown_0202F7D2); + PlaySE12WithPanning(SE_W109, gUnknown_0202F7D2); } void sub_80DDC4C(struct Sprite *sprite) @@ -252,11 +254,9 @@ void sub_80DDC4C(struct Sprite *sprite) sprite->data[5] = (sprite->data[5] + 5) & 0xFF; r0 = sprite->data[5]; - if(r2 == 0 || r2 > 0xC4) - { + if(r2 == 0 || r2 > 196) if(r0 > 0) - PlaySE(0xC4); - } + PlaySE(SE_W109); if(sprite->data[6] == 0) { @@ -292,11 +292,9 @@ void sub_80DDCC8(struct Sprite *sprite) else return; - REG_BLDALPHA = ((16 - sprite->data[6]) << 8) | sprite->data[6]; + REG_BLDALPHA = BLDALPHA_BLEND(sprite->data[6], 16 - sprite->data[6]); if(sprite->data[6] == 0 || sprite->data[6] == 16) - { sprite->data[7] ^= 0x100; - } if(sprite->data[6] == 0) sprite->data[6] = 0x100; } @@ -308,72 +306,78 @@ void sub_80DDD58(struct Sprite *sprite) sub_80DDD78(sprite); } -void sub_80DDD78(struct Sprite *sprite) { +void sub_80DDD78(struct Sprite *sprite) +{ u16 temp1; sprite->pos2.x = Sin(sprite->data[0], 32); sprite->pos2.y = Cos(sprite->data[0], 8); temp1 = sprite->data[0] - 65; - if (temp1 <= 130) { + if (temp1 <= 130) sprite->oam.priority = 2; - } else { + else sprite->oam.priority = 1; - } - sprite->data[0] = (sprite->data[0] + 0x13) & 0xFF; + sprite->data[0] = (sprite->data[0] + 19) & 0xFF; sprite->data[2] += 80; sprite->pos2.y += sprite->data[2] >> 8; sprite->data[7] += 1; - if (sprite->data[7] == 0x3D) { + if (sprite->data[7] == 61) DestroyAnimSprite(sprite); - } } -void sub_80DDDF0(u8 r5) { - u8 r4; +void sub_80DDDF0(u8 taskId) +{ + u8 spriteId; REG_BLDCNT = 0x3F40; REG_BLDALPHA = 0x1000; - r4 = GetAnimBattlerSpriteId(0); - sub_8078E70(r4, 1); - obj_id_set_rotscale(r4, 0x80, 0x80, 0); - gSprites[r4].invisible = FALSE; - gTasks[r5].data[0] = 0x80; - gTasks[r5].data[1] = *gBattleAnimArgs; - gTasks[r5].data[2] = 0; - gTasks[r5].data[3] = 0x10; - gTasks[r5].func = &sub_80DDE7C; + spriteId = GetAnimBattlerSpriteId(0); + sub_8078E70(spriteId, 1); + obj_id_set_rotscale(spriteId, 128, 128, 0); + gSprites[spriteId].invisible = FALSE; + gTasks[taskId].data[0] = 128; + gTasks[taskId].data[1] = *gBattleAnimArgs; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 16; + gTasks[taskId].func = sub_80DDE7C; } -void sub_80DDE7C(u8 taskId) { +void sub_80DDE7C(u8 taskId) +{ gTasks[taskId].data[10] += 1; - if (gTasks[taskId].data[10] == 3) { + if (gTasks[taskId].data[10] == 3) + { gTasks[taskId].data[10] = 0; gTasks[taskId].data[2] += 1; gTasks[taskId].data[3] -= 1; REG_BLDALPHA = gTasks[taskId].data[3] << 8 | gTasks[taskId].data[2]; if (gTasks[taskId].data[2] != 9) return; - gTasks[taskId].func = &sub_80DDED0; + gTasks[taskId].func = sub_80DDED0; } } -void sub_80DDED0(u8 taskId) { - u8 r1; - if (gTasks[taskId].data[1] > 0) { +void sub_80DDED0(u8 taskId) +{ + u8 spriteId; + if (gTasks[taskId].data[1] > 0) + { gTasks[taskId].data[1] -= 1; return; } - r1 = GetAnimBattlerSpriteId(0); + spriteId = GetAnimBattlerSpriteId(0); gTasks[taskId].data[0] += 8; - if (gTasks[taskId].data[0] <= 0xFF) { - obj_id_set_rotscale(r1, gTasks[taskId].data[0], gTasks[taskId].data[0], 0); + if (gTasks[taskId].data[0] <= 0xFF) + { + obj_id_set_rotscale(spriteId, gTasks[taskId].data[0], gTasks[taskId].data[0], 0); return; } - sub_8078F40(r1); + sub_8078F40(spriteId); DestroyAnimVisualTask(taskId); REG_BLDCNT = 0; REG_BLDALPHA = 0; } -void sub_80DDF40(struct Sprite *sprite) { +void sub_80DDF40(struct Sprite *sprite) +{ u16 r5, r6; r5 = sprite->pos1.x; r6 = sprite->pos1.y; @@ -387,11 +391,13 @@ void sub_80DDF40(struct Sprite *sprite) { sprite->data[5] = sprite->pos1.y << 4; sprite->data[6] = (((s16)r5 - sprite->pos1.x) << 4) / (gBattleAnimArgs[0] << 1); sprite->data[7] = (((s16)r6 - sprite->pos1.y) << 4) / (gBattleAnimArgs[0] << 1); - sprite->callback = &sub_80DDFE8; + sprite->callback = sub_80DDFE8; } -void sub_80DDFE8(struct Sprite *sprite) { - switch (sprite->data[0]) { +void sub_80DDFE8(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { case 0: sprite->data[4] += sprite->data[6]; sprite->data[5] += sprite->data[7]; @@ -428,17 +434,20 @@ void sub_80DDFE8(struct Sprite *sprite) { break; case 3: move_anim_8074EE0(sprite); + break; } } -void sub_80DE0FC(struct Sprite *sprite) { +void sub_80DE0FC(struct Sprite *sprite) +{ sub_8078764(sprite, 1); - sprite->callback = &sub_80DE114; + sprite->callback = sub_80DE114; } /* NONMATCHING */ NAKED -void sub_80DE114(struct Sprite *sprite) { +void sub_80DE114(struct Sprite *sprite) +{ asm_unified("\tpush {r4-r6,lr}\n" "\tadds r3, r0, 0\n" "\tmovs r5, 0\n" @@ -526,12 +535,14 @@ void sub_80DE114(struct Sprite *sprite) { "\tbx r0\n"); } -void sub_80DE1B0(u8 taskId) { +void sub_80DE1B0(u8 taskId) +{ struct Task *task; task = &gTasks[taskId]; task->data[0] = duplicate_obj_of_side_rel2move_in_transparent_mode(1); - if (task->data[0] < 0) { + if (task->data[0] < 0) + { DestroyAnimVisualTask(taskId); return; } @@ -542,36 +553,39 @@ void sub_80DE1B0(u8 taskId) { REG_BLDCNT = 0x3F40; REG_BLDALPHA = (task->data[3] << 8) | task->data[2]; gSprites[task->data[0]].data[0] = 80; - if (GetBattlerSide(gAnimBankTarget) == 0) { - gSprites[task->data[0]].data[1] = 0xff70; - gSprites[task->data[0]].data[2] = 0x70; - } else { - gSprites[task->data[0]].data[1] = 0x90; - gSprites[task->data[0]].data[2] = 0xff90; + if (GetBattlerSide(gAnimBankTarget) == 0) + { + gSprites[task->data[0]].data[1] = -144; + gSprites[task->data[0]].data[2] = 112; + } + else + { + gSprites[task->data[0]].data[1] = 144; + gSprites[task->data[0]].data[2] = -112; } gSprites[task->data[0]].data[3] = 0; gSprites[task->data[0]].data[4] = 0; StoreSpriteCallbackInData(&gSprites[task->data[0]], SpriteCallbackDummy); - gSprites[task->data[0]].callback = &sub_8078394; - task->func = &sub_80DE2DC; + gSprites[task->data[0]].callback = sub_8078394; + task->func = sub_80DE2DC; } -void sub_80DE2DC(u8 taskId) { +void sub_80DE2DC(u8 taskId) +{ struct Task *task; task = &gTasks[taskId]; - switch (task->data[4]) { + switch (task->data[4]) + { case 0: task->data[1] += 1; task->data[5] = task->data[1] & 3; - if (task->data[5] == 1) { + if (task->data[5] == 1) if (task->data[2] > 0) task->data[2] -= 1; - } - if (task->data[5] == 3) { + if (task->data[5] == 3) if (task->data[3] <= 15) task->data[3] += 1; - } REG_BLDALPHA = (task->data[3] << 8) | task->data[2]; if (task->data[3] != 16 || task->data[2] != 0) break; @@ -581,8 +595,7 @@ void sub_80DE2DC(u8 taskId) { task->data[4] = 1; break; case 1: - task->data[6] += 1; - if (task->data[6] <= 1) + if (++task->data[6] <= 1) break; REG_BLDCNT = 0; REG_BLDALPHA = 0; @@ -593,11 +606,12 @@ void sub_80DE2DC(u8 taskId) { } } -void sub_80DE3AC(u8 taskId) { +void sub_80DE3AC(u8 taskId) +{ struct Task *task; task = &gTasks[taskId]; task->data[15] = 0; - task->func = &sub_80DE3D4; + task->func = sub_80DE3D4; sub_80DE3D4(taskId); } -- cgit v1.2.3