summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/pokemon_special_anim.s508
-rw-r--r--src/pokemon_special_anim.c228
2 files changed, 228 insertions, 508 deletions
diff --git a/asm/pokemon_special_anim.s b/asm/pokemon_special_anim.s
index 76488e170..676222f30 100644
--- a/asm/pokemon_special_anim.s
+++ b/asm/pokemon_special_anim.s
@@ -5,514 +5,6 @@
.text
- thumb_func_start sub_811CBE4
-sub_811CBE4: @ 811CBE4
- push {r4-r6,lr}
- sub sp, 0x4
- lsls r0, 24
- lsrs r6, r0, 24
- adds r0, r6, 0
- movs r1, 0
- bl GetWordTaskArg
- adds r5, r0, 0
- adds r0, 0x91
- ldrb r0, [r0]
- cmp r0, 0
- bne _0811CC1C
- ldr r0, _0811CC14 @ =gMain
- ldrh r1, [r0, 0x2C]
- movs r0, 0x2
- ands r0, r1
- cmp r0, 0
- beq _0811CC1C
- ldr r1, _0811CC18 @ =sub_811CF88
- adds r0, r6, 0
- bl sub_811C718
- b _0811CD5A
- .align 2, 0
-_0811CC14: .4byte gMain
-_0811CC18: .4byte sub_811CF88
-_0811CC1C:
- adds r0, r5, 0
- adds r0, 0x92
- ldrh r1, [r0]
- adds r4, r0, 0
- cmp r1, 0x9
- bls _0811CC2A
- b _0811CD5A
-_0811CC2A:
- lsls r0, r1, 2
- ldr r1, _0811CC34 @ =_0811CC38
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_0811CC34: .4byte _0811CC38
- .align 2, 0
-_0811CC38:
- .4byte _0811CC60
- .4byte _0811CC7C
- .4byte _0811CCAC
- .4byte _0811CCC0
- .4byte _0811CCCC
- .4byte _0811CCE0
- .4byte _0811CCF0
- .4byte _0811CCF8
- .4byte _0811CD0C
- .4byte _0811CD38
-_0811CC60:
- movs r0, 0
- bl SetVBlankCallback
- adds r0, r5, 0
- adds r0, 0xA8
- adds r1, r5, 0
- adds r1, 0x98
- ldrh r1, [r1]
- bl sub_811D184
- movs r0, 0
- bl sub_811D830
- b _0811CD2A
-_0811CC7C:
- bl sub_811D280
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0
- bne _0811CD5A
- movs r1, 0x1
- negs r1, r1
- str r0, [sp]
- adds r0, r1, 0
- movs r2, 0x10
- movs r3, 0
- bl BeginNormalPaletteFade
- ldrh r0, [r4]
- adds r0, 0x1
- strh r0, [r4]
- ldr r0, _0811CCA8 @ =sub_811C6E8
- bl SetVBlankCallback
- b _0811CD5A
- .align 2, 0
-_0811CCA8: .4byte sub_811C6E8
-_0811CCAC:
- ldr r0, _0811CCBC @ =gPaletteFade
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- bne _0811CD5A
- b _0811CD2A
- .align 2, 0
-_0811CCBC: .4byte gPaletteFade
-_0811CCC0:
- adds r0, r5, 0
- adds r0, 0x9C
- ldrb r0, [r0]
- bl sub_811D948
- b _0811CD2A
-_0811CCCC:
- adds r0, r5, 0
- adds r0, 0x96
- ldrh r0, [r0]
- adds r1, r5, 0
- adds r1, 0x9C
- ldrb r1, [r1]
- movs r2, 0
- bl sub_811DC54
- b _0811CD2A
-_0811CCE0:
- bl sub_811DD90
- lsls r0, 24
- cmp r0, 0
- bne _0811CD5A
- bl sub_811D2A8
- b _0811CD2A
-_0811CCF0:
- movs r0, 0x8
- bl sub_811D2EC
- b _0811CD2A
-_0811CCF8:
- bl sub_811D4EC
- lsls r0, 24
- cmp r0, 0
- bne _0811CD5A
- adds r1, r5, 0
- adds r1, 0x91
- movs r0, 0x1
- strb r0, [r1]
- b _0811CD2A
-_0811CD0C:
- ldr r0, _0811CD34 @ =gMain
- ldrh r1, [r0, 0x2E]
- movs r0, 0x3
- ands r0, r1
- cmp r0, 0
- beq _0811CD5A
- movs r1, 0x1
- negs r1, r1
- movs r0, 0
- str r0, [sp]
- adds r0, r1, 0
- movs r2, 0
- movs r3, 0x10
- bl BeginNormalPaletteFade
-_0811CD2A:
- ldrh r0, [r4]
- adds r0, 0x1
- strh r0, [r4]
- b _0811CD5A
- .align 2, 0
-_0811CD34: .4byte gMain
-_0811CD38:
- ldr r0, _0811CD64 @ =gPaletteFade
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- bne _0811CD5A
- ldr r0, [r5, 0x4]
- bl SetMainCallback2
- bl sub_811D29C
- adds r0, r5, 0
- bl Free
- adds r0, r6, 0
- bl DestroyTask
-_0811CD5A:
- add sp, 0x4
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_0811CD64: .4byte gPaletteFade
- thumb_func_end sub_811CBE4
-
- thumb_func_start sub_811CD68
-sub_811CD68: @ 811CD68
- push {r4-r6,lr}
- sub sp, 0x4
- lsls r0, 24
- lsrs r6, r0, 24
- adds r0, r6, 0
- movs r1, 0
- bl GetWordTaskArg
- adds r5, r0, 0
- ldr r0, _0811CD90 @ =gMain
- ldrh r1, [r0, 0x2E]
- movs r0, 0x2
- ands r0, r1
- cmp r0, 0
- beq _0811CD98
- ldr r1, _0811CD94 @ =sub_811CF88
- adds r0, r6, 0
- bl sub_811C718
- b _0811CE3E
- .align 2, 0
-_0811CD90: .4byte gMain
-_0811CD94: .4byte sub_811CF88
-_0811CD98:
- adds r4, r5, 0
- adds r4, 0x92
- ldrh r0, [r4]
- cmp r0, 0x1
- beq _0811CDD2
- cmp r0, 0x1
- bgt _0811CDAC
- cmp r0, 0
- beq _0811CDB6
- b _0811CE3E
-_0811CDAC:
- cmp r0, 0x2
- beq _0811CE00
- cmp r0, 0x3
- beq _0811CE24
- b _0811CE3E
-_0811CDB6:
- movs r0, 0
- bl SetVBlankCallback
- adds r0, r5, 0
- adds r0, 0xA8
- adds r1, r5, 0
- adds r1, 0x98
- ldrh r1, [r1]
- bl sub_811D184
- movs r0, 0x3
- bl sub_811D830
- b _0811CE16
-_0811CDD2:
- bl sub_811D280
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0
- bne _0811CE3E
- movs r1, 0x1
- negs r1, r1
- str r0, [sp]
- adds r0, r1, 0
- movs r2, 0x10
- movs r3, 0
- bl BeginNormalPaletteFade
- ldrh r0, [r4]
- adds r0, 0x1
- strh r0, [r4]
- ldr r0, _0811CDFC @ =sub_811C6E8
- bl SetVBlankCallback
- b _0811CE3E
- .align 2, 0
-_0811CDFC: .4byte sub_811C6E8
-_0811CE00:
- ldr r0, _0811CE20 @ =gPaletteFade
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
- lsls r0, 24
- lsrs r1, r0, 24
- cmp r1, 0
- bne _0811CE3E
- adds r0, r5, 0
- adds r0, 0x9E
- strh r1, [r0]
-_0811CE16:
- ldrh r0, [r4]
- adds r0, 0x1
- strh r0, [r4]
- b _0811CE3E
- .align 2, 0
-_0811CE20: .4byte gPaletteFade
-_0811CE24:
- adds r1, r5, 0
- adds r1, 0x9E
- ldrh r0, [r1]
- adds r0, 0x1
- strh r0, [r1]
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0x14
- bls _0811CE3E
- ldr r1, _0811CE48 @ =sub_811CE4C
- adds r0, r6, 0
- bl sub_811C718
-_0811CE3E:
- add sp, 0x4
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_0811CE48: .4byte sub_811CE4C
- thumb_func_end sub_811CD68
-
- thumb_func_start sub_811CE4C
-sub_811CE4C: @ 811CE4C
- push {r4-r6,lr}
- lsls r0, 24
- lsrs r6, r0, 24
- adds r0, r6, 0
- movs r1, 0
- bl GetWordTaskArg
- adds r5, r0, 0
- adds r0, 0x91
- ldrb r0, [r0]
- cmp r0, 0
- bne _0811CE88
- ldr r0, _0811CE80 @ =gMain
- ldrh r1, [r0, 0x2E]
- movs r0, 0x2
- ands r0, r1
- cmp r0, 0
- beq _0811CE88
- bl sub_811D5B0
- ldr r1, _0811CE84 @ =sub_811CF88
- adds r0, r6, 0
- bl sub_811C718
- b _0811CF7E
- .align 2, 0
-_0811CE80: .4byte gMain
-_0811CE84: .4byte sub_811CF88
-_0811CE88:
- adds r0, r5, 0
- adds r0, 0x92
- ldrh r1, [r0]
- adds r4, r0, 0
- cmp r1, 0x9
- bhi _0811CF7E
- lsls r0, r1, 2
- ldr r1, _0811CEA0 @ =_0811CEA4
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_0811CEA0: .4byte _0811CEA4
- .align 2, 0
-_0811CEA4:
- .4byte _0811CECC
- .4byte _0811CEE0
- .4byte _0811CEEC
- .4byte _0811CEFC
- .4byte _0811CF02
- .4byte _0811CF0E
- .4byte _0811CF14
- .4byte _0811CF28
- .4byte _0811CF46
- .4byte _0811CF6C
-_0811CECC:
- adds r0, r5, 0
- adds r0, 0x96
- ldrh r0, [r0]
- bl sub_811DCF0
- adds r1, r5, 0
- adds r1, 0x9E
- movs r0, 0
- strh r0, [r1]
- b _0811CF5E
-_0811CEE0:
- bl sub_811D2A8
- movs r0, 0x7
- bl sub_811D2EC
- b _0811CF5E
-_0811CEEC:
- bl sub_811D4EC
- lsls r0, 24
- cmp r0, 0
- bne _0811CF7E
- bl sub_811D2D0
- b _0811CF5E
-_0811CEFC:
- bl sub_811D6EC
- b _0811CF5E
-_0811CF02:
- bl sub_811D6FC
- lsls r0, 24
- cmp r0, 0
- bne _0811CF7E
- b _0811CF5E
-_0811CF0E:
- bl sub_811D5A0
- b _0811CF5E
-_0811CF14:
- bl sub_811D5C0
- lsls r0, 24
- lsrs r1, r0, 24
- cmp r1, 0
- bne _0811CF7E
- adds r0, r5, 0
- adds r0, 0x9E
- strh r1, [r0]
- b _0811CF5E
-_0811CF28:
- adds r1, r5, 0
- adds r1, 0x9E
- ldrh r0, [r1]
- adds r0, 0x1
- strh r0, [r1]
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0x1E
- bls _0811CF7E
- bl sub_811D2A8
- movs r0, 0x9
- bl sub_811D2EC
- b _0811CF5E
-_0811CF46:
- bl sub_811D4EC
- lsls r0, 24
- cmp r0, 0
- bne _0811CF7E
- ldr r0, _0811CF68 @ =0x00000101
- bl PlayFanfare
- adds r1, r5, 0
- adds r1, 0x91
- movs r0, 0x1
- strb r0, [r1]
-_0811CF5E:
- ldrh r0, [r4]
- adds r0, 0x1
- strh r0, [r4]
- b _0811CF7E
- .align 2, 0
-_0811CF68: .4byte 0x00000101
-_0811CF6C:
- bl IsFanfareTaskInactive
- lsls r0, 24
- cmp r0, 0
- beq _0811CF7E
- ldr r1, _0811CF84 @ =sub_811CF88
- adds r0, r6, 0
- bl sub_811C718
-_0811CF7E:
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_0811CF84: .4byte sub_811CF88
- thumb_func_end sub_811CE4C
-
- thumb_func_start sub_811CF88
-sub_811CF88: @ 811CF88
- push {r4-r6,lr}
- lsls r0, 24
- lsrs r6, r0, 24
- adds r0, r6, 0
- movs r1, 0
- bl GetWordTaskArg
- adds r5, r0, 0
- adds r4, r5, 0
- adds r4, 0x92
- ldrh r0, [r4]
- cmp r0, 0
- beq _0811CFA8
- cmp r0, 0x1
- beq _0811CFC8
- b _0811D008
-_0811CFA8:
- ldr r0, _0811CFC4 @ =sub_811C6E8
- bl SetVBlankCallback
- movs r0, 0x1
- negs r0, r0
- movs r1, 0x10
- movs r2, 0
- bl BlendPalettes
- ldrh r0, [r4]
- adds r0, 0x1
- strh r0, [r4]
- b _0811D008
- .align 2, 0
-_0811CFC4: .4byte sub_811C6E8
-_0811CFC8:
- ldr r0, _0811D010 @ =gPaletteFade
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- bne _0811D008
- adds r0, r5, 0
- adds r0, 0xA4
- ldr r0, [r0]
- cmp r0, 0x1
- bne _0811CFE8
- bl IsCryFinished
- lsls r0, 24
- cmp r0, 0
- beq _0811D008
-_0811CFE8:
- ldr r0, _0811D014 @ =gUnknown_203B090
- adds r1, r5, 0
- adds r1, 0x91
- ldrb r1, [r1]
- str r1, [r0]
- ldr r0, [r5, 0x4]
- bl SetMainCallback2
- adds r0, r6, 0
- bl DestroyTask
- bl sub_811D29C
- adds r0, r5, 0
- bl Free
-_0811D008:
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_0811D010: .4byte gPaletteFade
-_0811D014: .4byte gUnknown_203B090
- thumb_func_end sub_811CF88
-
thumb_func_start sub_811D018
sub_811D018: @ 811D018
push {r4,lr}
diff --git a/src/pokemon_special_anim.c b/src/pokemon_special_anim.c
index 244b9bdde..542e0ffb3 100644
--- a/src/pokemon_special_anim.c
+++ b/src/pokemon_special_anim.c
@@ -30,6 +30,7 @@ struct PokemonSpecialAnim
/*0x00a8*/ u8 field_00a8[0x2834];
}; // size=0x28dc
+EWRAM_DATA bool32 gUnknown_203B090 = FALSE;
EWRAM_DATA u8 gUnknown_203B094 = 0;
struct PokemonSpecialAnim * sub_811C5D4(u8 slotId, u16 itemId, MainCallback callback);
@@ -54,11 +55,17 @@ void sub_811D4D4(void);
bool8 sub_811D4EC(void);
void sub_811D4FC(void);
bool8 sub_811D530(void);
+void sub_811D5A0(void);
+void sub_811D5B0(void);
+bool8 sub_811D5C0(void);
+void sub_811D6EC(void);
+bool8 sub_811D6FC(void);
bool8 sub_811D754(void);
void sub_811D830(u8 a0);
void sub_811D948(u8 closeness);
bool8 sub_811D9A8(void);
void sub_811DC54(u16 itemId, u8 closeness, u8 a2);
+void sub_811DCF0(u16 itemId);
bool8 sub_811DD90(void);
void sub_811E040(void);
@@ -410,3 +417,224 @@ void sub_811CA20(u8 taskId)
break;
}
}
+
+void sub_811CBE4(u8 taskId)
+{
+ struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);
+
+ if (!ptr->cancelDisabled && JOY_HELD(B_BUTTON))
+ {
+ sub_811C718(taskId, sub_811CF88);
+ return;
+ }
+
+ switch (ptr->state)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ sub_811D184(ptr->field_00a8, ptr->animType);
+ sub_811D830(0);
+ ptr->state++;
+ break;
+ case 1:
+ if (!sub_811D280())
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK);
+ ptr->state++;
+ SetVBlankCallback(sub_811C6E8);
+ }
+ break;
+ case 2:
+ if (!gPaletteFade.active)
+ {
+ ptr->state++;
+ }
+ break;
+ case 3:
+ sub_811D948(ptr->closeness);
+ ptr->state++;
+ break;
+ case 4:
+ sub_811DC54(ptr->itemId, ptr->closeness, 0);
+ ptr->state++;
+ break;
+ case 5:
+ if (!sub_811DD90())
+ {
+ sub_811D2A8();
+ ptr->state++;
+ }
+ break;
+ case 6:
+ sub_811D2EC(8);
+ ptr->state++;
+ break;
+ case 7:
+ if (!sub_811D4EC())
+ {
+ ptr->cancelDisabled = TRUE;
+ ptr->state++;
+ }
+ break;
+ case 8:
+ if (JOY_NEW(A_BUTTON | B_BUTTON))
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK);
+ ptr->state++;
+ }
+ break;
+ case 9:
+ if (!gPaletteFade.active)
+ {
+ SetMainCallback2(ptr->savedCallback);
+ sub_811D29C();
+ Free(ptr);
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+void sub_811CD68(u8 taskId)
+{
+ struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);
+
+ if (JOY_NEW(B_BUTTON))
+ {
+ sub_811C718(taskId, sub_811CF88);
+ return;
+ }
+
+ switch (ptr->state)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ sub_811D184(ptr->field_00a8, ptr->animType);
+ sub_811D830(3);
+ ptr->state++;
+ break;
+ case 1:
+ if (!sub_811D280())
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK);
+ ptr->state++;
+ SetVBlankCallback(sub_811C6E8);
+ }
+ break;
+ case 2:
+ if (!gPaletteFade.active)
+ {
+ ptr->field_009e = 0;
+ ptr->state++;
+ }
+ break;
+ case 3:
+ ptr->field_009e++;
+ if (ptr->field_009e > 20)
+ {
+ sub_811C718(taskId, sub_811CE4C);
+ }
+ break;
+ }
+}
+
+void sub_811CE4C(u8 taskId)
+{
+ struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);
+
+ if (!ptr->cancelDisabled && JOY_NEW(B_BUTTON))
+ {
+ sub_811D5B0();
+ sub_811C718(taskId, sub_811CF88);
+ return;
+ }
+
+ switch (ptr->state)
+ {
+ case 0:
+ sub_811DCF0(ptr->itemId);
+ ptr->field_009e = 0;
+ ptr->state++;
+ break;
+ case 1:
+ sub_811D2A8();
+ sub_811D2EC(7);
+ ptr->state++;
+ break;
+ case 2:
+ if (!sub_811D4EC())
+ {
+ sub_811D2D0();
+ ptr->state++;
+ }
+ break;
+ case 3:
+ sub_811D6EC();
+ ptr->state++;
+ break;
+ case 4:
+ if (!sub_811D6FC())
+ {
+ ptr->state++;
+ }
+ break;
+ case 5:
+ sub_811D5A0();
+ ptr->state++;
+ break;
+ case 6:
+ if (!sub_811D5C0())
+ {
+ ptr->field_009e = 0;
+ ptr->state++;
+ }
+ break;
+ case 7:
+ ptr->field_009e++;
+ if (ptr->field_009e > 30)
+ {
+ sub_811D2A8();
+ sub_811D2EC(9);
+ ptr->state++;
+ }
+ break;
+ case 8:
+ if (!sub_811D4EC())
+ {
+ PlayFanfare(MUS_FANFA1);
+ ptr->cancelDisabled = TRUE;
+ ptr->state++;
+ }
+ break;
+ case 9:
+ if (IsFanfareTaskInactive())
+ {
+ sub_811C718(taskId, sub_811CF88);
+ }
+ break;
+ }
+}
+
+void sub_811CF88(u8 taskId)
+{
+ struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);
+
+ switch (ptr->state)
+ {
+ case 0:
+ SetVBlankCallback(sub_811C6E8);
+ BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK);
+ ptr->state++;
+ break;
+ case 1:
+ if (!gPaletteFade.active && (ptr->field_00a4 != 1 || IsCryFinished()))
+ {
+ gUnknown_203B090 = ptr->cancelDisabled;
+ SetMainCallback2(ptr->savedCallback);
+ DestroyTask(taskId);
+ sub_811D29C();
+ Free(ptr);
+ }
+ break;
+ }
+}