summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Huderle <huderlem@gmail.com>2018-04-22 17:44:36 -0700
committerGitHub <noreply@github.com>2018-04-22 17:44:36 -0700
commitbebd556adeee3e6d64a7dd5aac2c08edb3907b10 (patch)
treefae1e693e01fcb2e81effab4d357d2474161f14f
parente739b7087b8d06149e1a067ead971c1e6cbf385d (diff)
parentb9e256c05071021e138bb4de2ad014beb73fc2af (diff)
Merge pull request #600 from PikalaxALT/pc_screen_effect
Pc screen effect
-rw-r--r--asm/pc_screen_effect.s546
-rw-r--r--data/pc_screen_effect.s27
-rw-r--r--ld_script.txt3
-rw-r--r--src/pc_screen_effect.c259
4 files changed, 219 insertions, 616 deletions
diff --git a/asm/pc_screen_effect.s b/asm/pc_screen_effect.s
deleted file mode 100644
index 9d36df66c..000000000
--- a/asm/pc_screen_effect.s
+++ /dev/null
@@ -1,546 +0,0 @@
- .include "constants/gba_constants.inc"
- .include "include/macros.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start sub_80C5E38
-sub_80C5E38: @ 80C5E38
- push {r4-r7,lr}
- sub sp, 0x28
- adds r7, r0, 0
- ldr r0, _080C5EC8 @ =gUnknown_083D1898
- ldr r1, [r0, 0x4]
- ldr r0, [r0]
- str r0, [sp, 0x18]
- str r1, [sp, 0x1C]
- ldr r0, _080C5ECC @ =gUnknown_083D18A0
- ldr r1, [r0, 0x4]
- ldr r0, [r0]
- str r0, [sp, 0x20]
- str r1, [sp, 0x24]
- mov r1, sp
- ldr r0, _080C5ED0 @ =gSpriteTemplate_83D18C0
- ldm r0!, {r2-r4}
- stm r1!, {r2-r4}
- ldm r0!, {r2-r4}
- stm r1!, {r2-r4}
- ldrh r3, [r7]
- lsls r2, r3, 16
- add r0, sp, 0x18
- ldrh r1, [r0, 0x4]
- orrs r1, r2
- str r1, [r0, 0x4]
- mov r1, sp
- movs r6, 0
- strh r3, [r1]
- ldrh r2, [r7, 0x2]
- ldr r5, _080C5ED4 @ =0xffff0000
- add r4, sp, 0x20
- ldr r1, [r4, 0x4]
- ands r1, r5
- orrs r1, r2
- str r1, [r4, 0x4]
- mov r1, sp
- strh r2, [r1, 0x2]
- bl LoadSpriteSheet
- adds r0, r4, 0
- bl LoadSpritePalette
- movs r0, 0x50
- strh r0, [r7, 0xC]
- strh r6, [r7, 0x8]
- strh r6, [r7, 0xA]
- ldrh r0, [r7, 0x2]
- bl IndexOfSpritePaletteTag
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0x80
- lsls r1, 9
- lsls r1, r0
- bics r5, r1
- str r5, [r7, 0x10]
- ldrh r0, [r7, 0x4]
- cmp r0, 0
- bne _080C5EB2
- movs r0, 0x10
- strh r0, [r7, 0x4]
-_080C5EB2:
- ldrh r0, [r7, 0x6]
- cmp r0, 0
- bne _080C5EBC
- movs r0, 0x14
- strh r0, [r7, 0x6]
-_080C5EBC:
- ldr r0, _080C5ED8 @ =gUnknown_020387EC
- str r7, [r0]
- movs r5, 0
- ldr r6, _080C5EDC @ =gSprites
- b _080C5F4A
- .align 2, 0
-_080C5EC8: .4byte gUnknown_083D1898
-_080C5ECC: .4byte gUnknown_083D18A0
-_080C5ED0: .4byte gSpriteTemplate_83D18C0
-_080C5ED4: .4byte 0xffff0000
-_080C5ED8: .4byte gUnknown_020387EC
-_080C5EDC: .4byte gSprites
-_080C5EE0:
- lsls r2, r3, 4
- adds r1, r2, r3
- lsls r1, 2
- adds r1, r6
- ldrh r0, [r7, 0x4]
- strh r0, [r1, 0x2E]
- movs r0, 0x1
- strh r0, [r1, 0x30]
- ldr r1, _080C5EF4 @ =gSprites
- b _080C5F2A
- .align 2, 0
-_080C5EF4: .4byte gSprites
-_080C5EF8:
- lsls r1, r5, 21
- movs r0, 0x80
- lsls r0, 16
- adds r1, r0
- asrs r1, 16
- mov r0, sp
- movs r2, 0x50
- movs r3, 0
- bl CreateSprite
- lsls r0, 24
- lsrs r3, r0, 24
- cmp r3, 0x40
- beq _080C5F6E
- lsls r2, r3, 4
- adds r1, r2, r3
- lsls r1, 2
- adds r1, r6
- ldrh r0, [r7, 0x4]
- negs r0, r0
- strh r0, [r1, 0x2E]
- ldr r0, _080C5F88 @ =0x0000ffff
- strh r0, [r1, 0x30]
- ldr r1, _080C5F8C @ =gSprites
- lsls r4, r5, 5
-_080C5F2A:
- adds r0, r2, r3
- lsls r0, 2
- adds r0, r1
- adds r1, r4, 0
- adds r1, 0x8
- movs r2, 0
- strh r1, [r0, 0x32]
- strh r2, [r0, 0x36]
- adds r0, 0x3E
- ldrb r1, [r0]
- movs r2, 0x4
- orrs r1, r2
- strb r1, [r0]
- adds r0, r5, 0x1
- lsls r0, 16
- lsrs r5, r0, 16
-_080C5F4A:
- cmp r5, 0x7
- bhi _080C5F6E
- cmp r5, 0x3
- bhi _080C5EF8
- lsls r4, r5, 5
- adds r1, r4, 0
- subs r1, 0x70
- lsls r1, 16
- asrs r1, 16
- mov r0, sp
- movs r2, 0x50
- movs r3, 0
- bl CreateSprite
- lsls r0, 24
- lsrs r3, r0, 24
- cmp r3, 0x40
- bne _080C5EE0
-_080C5F6E:
- ldr r1, _080C5F90 @ =REG_BLDCNT
- movs r0, 0xFF
- strh r0, [r1]
- adds r1, 0x4
- movs r0, 0x10
- strh r0, [r1]
- ldr r0, _080C5F94 @ =sub_80C6078
- bl sub_80C61B0
- add sp, 0x28
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_080C5F88: .4byte 0x0000ffff
-_080C5F8C: .4byte gSprites
-_080C5F90: .4byte REG_BLDCNT
-_080C5F94: .4byte sub_80C6078
- thumb_func_end sub_80C5E38
-
- thumb_func_start sub_80C5F98
-sub_80C5F98: @ 80C5F98
- push {r4,lr}
- ldr r4, _080C5FB0 @ =gUnknown_020387EC
- ldr r2, [r4]
- ldrh r0, [r2, 0x8]
- cmp r0, 0x1
- beq _080C5FEC
- cmp r0, 0x1
- bgt _080C5FB4
- cmp r0, 0
- beq _080C5FBA
- b _080C602C
- .align 2, 0
-_080C5FB0: .4byte gUnknown_020387EC
-_080C5FB4:
- cmp r0, 0x2
- beq _080C6008
- b _080C602C
-_080C5FBA:
- ldrh r0, [r2, 0xC]
- ldrh r1, [r2, 0x6]
- subs r0, r1
- strh r0, [r2, 0xC]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x1
- bgt _080C6034
- ldr r0, [r2, 0x10]
- ldr r2, _080C5FE4 @ =0x0000ffff
- movs r1, 0x10
- bl BlendPalettes
- ldr r0, _080C5FE8 @ =sub_80C603C
- bl SetHBlankCallback
- ldr r1, [r4]
- movs r0, 0x1
- strh r0, [r1, 0xC]
- b _080C6000
- .align 2, 0
-_080C5FE4: .4byte 0x0000ffff
-_080C5FE8: .4byte sub_80C603C
-_080C5FEC:
- ldrh r0, [r2, 0xA]
- cmp r0, 0x8
- bne _080C6034
- movs r0, 0x1
- negs r0, r0
- movs r1, 0x10
- movs r2, 0
- bl BlendPalettes
- ldr r1, [r4]
-_080C6000:
- ldrh r0, [r1, 0x8]
- adds r0, 0x1
- strh r0, [r1, 0x8]
- b _080C6034
-_080C6008:
- ldr r0, _080C6030 @ =REG_BLDCNT
- movs r1, 0
- strh r1, [r0]
- adds r0, 0x4
- strh r1, [r0]
- ldrh r0, [r2]
- bl FreeSpriteTilesByTag
- ldr r0, [r4]
- ldrh r0, [r0, 0x2]
- bl FreeSpritePaletteByTag
- bl ClearGpuRegBits
- ldr r1, [r4]
- ldrh r0, [r1, 0x8]
- adds r0, 0x1
- strh r0, [r1, 0x8]
-_080C602C:
- movs r0, 0x1
- b _080C6036
- .align 2, 0
-_080C6030: .4byte REG_BLDCNT
-_080C6034:
- movs r0, 0
-_080C6036:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_80C5F98
-
- thumb_func_start sub_80C603C
-sub_80C603C: @ 80C603C
- push {lr}
- sub sp, 0x4
- mov r2, sp
- ldr r0, _080C6060 @ =REG_VCOUNT
- ldrh r1, [r0]
- movs r3, 0xFF
- adds r0, r3, 0
- ands r0, r1
- strh r0, [r2]
- mov r0, sp
- ldrh r0, [r0]
- cmp r0, 0x50
- bne _080C6068
- ldr r1, _080C6064 @ =REG_BLDCNT
- movs r0, 0x8F
- strh r0, [r1]
- b _080C606C
- .align 2, 0
-_080C6060: .4byte REG_VCOUNT
-_080C6064: .4byte REG_BLDCNT
-_080C6068:
- ldr r0, _080C6074 @ =REG_BLDCNT
- strh r3, [r0]
-_080C606C:
- add sp, 0x4
- pop {r0}
- bx r0
- .align 2, 0
-_080C6074: .4byte REG_BLDCNT
- thumb_func_end sub_80C603C
-
- thumb_func_start sub_80C6078
-sub_80C6078: @ 80C6078
- push {lr}
- sub sp, 0x4
- mov r2, sp
- ldr r0, _080C60B0 @ =REG_VCOUNT
- ldrh r1, [r0]
- movs r0, 0xFF
- ands r0, r1
- strh r0, [r2]
- mov r0, sp
- ldrh r1, [r0]
- ldr r0, _080C60B4 @ =gUnknown_020387EC
- ldr r0, [r0]
- movs r3, 0xC
- ldrsh r2, [r0, r3]
- movs r0, 0x50
- subs r0, r2
- cmp r1, r0
- ble _080C60BC
- mov r0, sp
- ldrh r1, [r0]
- adds r0, r2, 0
- adds r0, 0x50
- cmp r1, r0
- bge _080C60BC
- ldr r1, _080C60B8 @ =REG_BLDY
- movs r0, 0
- b _080C60C0
- .align 2, 0
-_080C60B0: .4byte REG_VCOUNT
-_080C60B4: .4byte gUnknown_020387EC
-_080C60B8: .4byte REG_BLDY
-_080C60BC:
- ldr r1, _080C60C8 @ =REG_BLDY
- movs r0, 0x10
-_080C60C0:
- strh r0, [r1]
- add sp, 0x4
- pop {r0}
- bx r0
- .align 2, 0
-_080C60C8: .4byte REG_BLDY
- thumb_func_end sub_80C6078
-
- thumb_func_start sub_80C60CC
-sub_80C60CC: @ 80C60CC
- push {r4,lr}
- adds r2, r0, 0
- ldrh r0, [r2, 0x2E]
- ldrh r1, [r2, 0x20]
- adds r0, r1
- strh r0, [r2, 0x20]
- adds r0, 0x8
- lsls r0, 16
- movs r1, 0x80
- lsls r1, 17
- cmp r0, r1
- bls _080C611C
- adds r0, r2, 0
- bl DestroySprite
- ldr r4, _080C6124 @ =gUnknown_020387EC
- ldr r1, [r4]
- ldrh r0, [r1, 0xA]
- adds r0, 0x1
- strh r0, [r1, 0xA]
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0x8
- bne _080C611C
- ldrh r0, [r1]
- bl FreeSpriteTilesByTag
- ldr r0, [r4]
- ldrh r0, [r0, 0x2]
- bl FreeSpritePaletteByTag
- ldr r0, [r4]
- ldr r0, [r0, 0x10]
- ldr r2, _080C6128 @ =0x0000ffff
- movs r1, 0
- bl BlendPalettes
- ldr r0, _080C612C @ =sub_80C6078
- bl SetHBlankCallback
-_080C611C:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080C6124: .4byte gUnknown_020387EC
-_080C6128: .4byte 0x0000ffff
-_080C612C: .4byte sub_80C6078
- thumb_func_end sub_80C60CC
-
- thumb_func_start sub_80C6130
-sub_80C6130: @ 80C6130
- push {r4,r5,lr}
- adds r2, r0, 0
- movs r1, 0x36
- ldrsh r0, [r2, r1]
- cmp r0, 0
- bne _080C61AA
- ldr r1, _080C6184 @ =gUnknown_020387EC
- ldr r0, [r1]
- movs r3, 0xC
- ldrsh r4, [r0, r3]
- adds r5, r1, 0
- cmp r4, 0x1
- bne _080C61AA
- ldrh r0, [r2, 0x2E]
- ldrh r1, [r2, 0x20]
- adds r0, r1
- strh r0, [r2, 0x20]
- adds r0, 0xF
- lsls r0, 16
- movs r1, 0x87
- lsls r1, 17
- cmp r0, r1
- bhi _080C616C
- adds r3, r2, 0
- adds r3, 0x3E
- ldrb r1, [r3]
- movs r0, 0x5
- negs r0, r0
- ands r0, r1
- strb r0, [r3]
-_080C616C:
- movs r3, 0x30
- ldrsh r0, [r2, r3]
- cmp r0, 0
- ble _080C6188
- movs r0, 0x20
- ldrsh r1, [r2, r0]
- movs r3, 0x32
- ldrsh r0, [r2, r3]
- cmp r1, r0
- blt _080C6196
- b _080C6194
- .align 2, 0
-_080C6184: .4byte gUnknown_020387EC
-_080C6188:
- movs r0, 0x20
- ldrsh r1, [r2, r0]
- movs r3, 0x32
- ldrsh r0, [r2, r3]
- cmp r1, r0
- bgt _080C6196
-_080C6194:
- strh r4, [r2, 0x36]
-_080C6196:
- movs r1, 0x36
- ldrsh r0, [r2, r1]
- cmp r0, 0
- beq _080C61AA
- ldr r0, [r5]
- ldrh r1, [r0, 0xA]
- adds r1, 0x1
- strh r1, [r0, 0xA]
- ldrh r0, [r2, 0x32]
- strh r0, [r2, 0x20]
-_080C61AA:
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end sub_80C6130
-
- thumb_func_start sub_80C61B0
-sub_80C61B0: @ 80C61B0
- push {r4-r6,lr}
- ldr r2, _080C61F0 @ =INTR_CHECK
- ldrh r1, [r2]
- movs r5, 0x2
- orrs r1, r5
- strh r1, [r2]
- ldr r3, _080C61F4 @ =REG_DISPSTAT
- ldrh r1, [r3]
- movs r2, 0x10
- orrs r1, r2
- strh r1, [r3]
- ldr r4, _080C61F8 @ =0x04000208
- ldrh r2, [r4]
- movs r6, 0
- strh r6, [r4]
- ldr r3, _080C61FC @ =0x04000200
- ldrh r1, [r3]
- orrs r1, r5
- strh r1, [r3]
- strh r2, [r4]
- ldr r2, _080C6200 @ =gMain
- ldrh r1, [r2, 0x1C]
- orrs r1, r5
- ldrh r3, [r2, 0x1C]
- orrs r1, r6
- strh r1, [r2, 0x1C]
- bl SetHBlankCallback
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_080C61F0: .4byte INTR_CHECK
-_080C61F4: .4byte REG_DISPSTAT
-_080C61F8: .4byte 0x04000208
-_080C61FC: .4byte 0x04000200
-_080C6200: .4byte gMain
- thumb_func_end sub_80C61B0
-
- thumb_func_start ClearGpuRegBits
-ClearGpuRegBits: @ 80C6204
- push {r4,r5,lr}
- ldr r3, _080C6248 @ =INTR_CHECK
- ldrh r1, [r3]
- ldr r2, _080C624C @ =0x0000fffd
- adds r0, r2, 0
- ands r0, r1
- strh r0, [r3]
- ldr r3, _080C6250 @ =REG_DISPSTAT
- ldrh r1, [r3]
- ldr r0, _080C6254 @ =0x0000ffef
- ands r0, r1
- strh r0, [r3]
- ldr r4, _080C6258 @ =0x04000208
- ldrh r3, [r4]
- movs r0, 0
- strh r0, [r4]
- ldr r5, _080C625C @ =0x04000200
- ldrh r1, [r5]
- adds r0, r2, 0
- ands r0, r1
- strh r0, [r5]
- strh r3, [r4]
- ldr r0, _080C6260 @ =gMain
- ldrh r1, [r0, 0x1C]
- ands r2, r1
- ldrh r1, [r0, 0x1C]
- strh r2, [r0, 0x1C]
- movs r0, 0
- bl SetHBlankCallback
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080C6248: .4byte INTR_CHECK
-_080C624C: .4byte 0x0000fffd
-_080C6250: .4byte REG_DISPSTAT
-_080C6254: .4byte 0x0000ffef
-_080C6258: .4byte 0x04000208
-_080C625C: .4byte 0x04000200
-_080C6260: .4byte gMain
- thumb_func_end ClearGpuRegBits
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/data/pc_screen_effect.s b/data/pc_screen_effect.s
deleted file mode 100644
index 1d6571149..000000000
--- a/data/pc_screen_effect.s
+++ /dev/null
@@ -1,27 +0,0 @@
- .include "include/macros.inc"
- .include "constants/constants.inc"
-
- .section .rodata
-
- .align 2
-gOamData_83D18D8:: @ 83D18D8
- .2byte 0x4000
- .2byte 0x4000
- .2byte 0x0000
-
- .align 2
-gSpriteAnim_83D18E0:: @ 83D18E0
- obj_image_anim_frame 0, 5
- obj_image_anim_end
-
- .align 2
-gSpriteAnimTable_83D18E8:: @ 83D18E8
- .4byte gSpriteAnim_83D18E0
-
- .align 2
-gUnknownPal_083D18EC::
- .incbin "graphics/unknown/unknown_3D18EC.gbapal"
-
- .align 2
-gUnknownGfx_083D190C::
- .incbin "graphics/unknown/unknown_3D190C.4bpp"
diff --git a/ld_script.txt b/ld_script.txt
index 219dd51ed..d3f41018a 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -165,7 +165,6 @@ SECTIONS {
src/field_poison.o(.text);
src/pokemon_size_record.o(.text);
src/pc_screen_effect.o(.text);
- asm/pc_screen_effect.o(.text);
src/fldeff_secretpower.o(.text);
src/fldeff_secret_base_pc.o(.text);
src/fldeff_decoration.o(.text);
@@ -600,7 +599,7 @@ SECTIONS {
data/contest_link_80C2020.o(.rodata);
src/pokemon_size_record.o(.rodata);
src/pc_screen_effect.o(.rodata);
- data/pc_screen_effect.o(.rodata);
+ src/pc_screen_effect.o(.data);
src/fldeff_secretpower.o(.rodata);
src/fldeff_decoration.o(.rodata);
src/fldeff_recordmixing.o(.rodata);
diff --git a/src/pc_screen_effect.c b/src/pc_screen_effect.c
index dcc3bc9c9..0e417b5f4 100644
--- a/src/pc_screen_effect.c
+++ b/src/pc_screen_effect.c
@@ -4,56 +4,48 @@
#include "sprite.h"
#include "pc_screen_effect.h"
-void sub_80C603C(void);
-void sub_80C6078(void);
-void sub_80C60CC(struct Sprite *);
-void sub_80C6130(struct Sprite *);
-void sub_80C61B0(IntrFunc);
-void ClearGpuRegBits(void);
+static void sub_80C603C(void);
+static void sub_80C6078(void);
+static void sub_80C60CC(struct Sprite *);
+static void sub_80C6130(struct Sprite *);
+static void HBlankIntrOn(IntrFunc);
+static void HBlankIntrOff(void);
-extern const struct OamData gOamData_83D18D8;
+struct OamData gOamData_83D18D8 = {
+ .shape = ST_OAM_H_RECTANGLE,
+ .size = 1
+};
-extern const union AnimCmd *const gSpriteAnimTable_83D18E8[];
+union AnimCmd gSpriteAnim_83D18E0[] = {
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END
+};
-extern const u16 gUnknownPal_083D18EC[16];
+const union AnimCmd *gSpriteAnimTable_83D18E8[] = {
+ gSpriteAnim_83D18E0
+};
-extern const u8 gUnknownGfx_083D190C[128];
+u16 gUnknownPal_083D18EC[] = INCBIN_U16("graphics/unknown/unknown_3D18EC.gbapal");
+u8 gUnknownGfx_083D190C[] = INCBIN_U8("graphics/unknown/unknown_3D190C.4bpp");
EWRAM_DATA struct PCScreenEffectStruct *gUnknown_020387EC = NULL;
-const struct SpriteSheet gUnknown_083D1898 = { gUnknownGfx_083D190C, sizeof(gUnknownGfx_083D190C), 0 };
-
-const struct SpritePalette gUnknown_083D18A0 = { gUnknownPal_083D18EC, 0 };
-
-const struct SpriteTemplate gSpriteTemplate_83D18A8 =
-{
- 0,
- 0,
- &gOamData_83D18D8,
- gSpriteAnimTable_83D18E8,
- NULL,
- gDummySpriteAffineAnimTable,
- sub_80C60CC,
-};
-
-const struct SpriteTemplate gSpriteTemplate_83D18C0 =
-{
- 0,
- 0,
- &gOamData_83D18D8,
- gSpriteAnimTable_83D18E8,
- NULL,
- gDummySpriteAffineAnimTable,
- sub_80C6130,
-};
-
void sub_80C5CD4(struct PCScreenEffectStruct *unkStruct)
{
u16 i;
- struct SpriteSheet sprSheet = gUnknown_083D1898;
- struct SpritePalette sprPalette = gUnknown_083D18A0;
- struct SpriteTemplate sprTemplate = gSpriteTemplate_83D18A8;
+ struct SpriteSheet sprSheet = { gUnknownGfx_083D190C, sizeof(gUnknownGfx_083D190C), 0 };
+ struct SpritePalette sprPalette = { gUnknownPal_083D18EC, 0 };
+ struct SpriteTemplate sprTemplate =
+ {
+ 0,
+ 0,
+ &gOamData_83D18D8,
+ gSpriteAnimTable_83D18E8,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ sub_80C60CC,
+ };
sprSheet.tag = unkStruct->tileTag;
sprTemplate.tileTag = unkStruct->tileTag;
@@ -93,7 +85,7 @@ bool8 sub_80C5DCC(void)
if (gUnknown_020387EC->unk08 == 0)
{
BlendPalettes(gUnknown_020387EC->selectedPalettes, 0x10, 0xFFFF);
- sub_80C61B0(sub_80C603C);
+ HBlankIntrOn(sub_80C603C);
gUnknown_020387EC->unk08++;
}
@@ -107,7 +99,7 @@ bool8 sub_80C5DCC(void)
gUnknown_020387EC->unk0C = 80;
REG_BLDCNT = 0;
REG_BLDY = 0;
- ClearGpuRegBits();
+ HBlankIntrOff();
return TRUE;
}
else
@@ -115,3 +107,188 @@ bool8 sub_80C5DCC(void)
return FALSE;
}
}
+
+void sub_80C5E38(struct PCScreenEffectStruct * a0)
+{
+ u16 i;
+ u8 spriteId;
+
+ struct SpriteSheet spriteSheet = { gUnknownGfx_083D190C, sizeof(gUnknownGfx_083D190C), 0 };
+ struct SpritePalette spritePalette = { gUnknownPal_083D18EC, 0 };
+ struct SpriteTemplate spriteTemplate =
+ {
+ 0,
+ 0,
+ &gOamData_83D18D8,
+ gSpriteAnimTable_83D18E8,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ sub_80C6130,
+ };
+
+ spriteSheet.tag = a0->tileTag;
+ spriteTemplate.tileTag = a0->tileTag;
+ spritePalette.tag = a0->paletteTag;
+ spriteTemplate.paletteTag = a0->paletteTag;
+
+ LoadSpriteSheet(&spriteSheet);
+ LoadSpritePalette(&spritePalette);
+
+ a0->unk0C = 0x50;
+ a0->unk08 = 0;
+ a0->unk0A = 0;
+ a0->selectedPalettes = 0xffff0000 & ~(0x10000 << IndexOfSpritePaletteTag(a0->paletteTag));
+ if (a0->unk04 == 0)
+ a0->unk04 = 16;
+ if (a0->unk06 == 0)
+ a0->unk06 = 20;
+ gUnknown_020387EC = a0;
+
+ for (i = 0; i < 8; i++)
+ {
+ if (i < 4)
+ {
+ spriteId = CreateSprite(&spriteTemplate, i * 32 - 0x70, 0x50, 0);
+ if (spriteId == MAX_SPRITES)
+ break;
+ gSprites[spriteId].data[0] = a0->unk04;
+ gSprites[spriteId].data[1] = 1;
+ }
+ else
+ {
+ // Fakematching
+ spriteId = CreateSprite(&spriteTemplate, ((i << 21) + (0x80 << 16)) >> 16, 0x50, 0);
+ if (spriteId == MAX_SPRITES)
+ break;
+ gSprites[spriteId].data[0] = -a0->unk04;
+ gSprites[spriteId].data[1] = -1;
+ }
+ gSprites[spriteId].data[2] = i * 32 + 8;
+ gSprites[spriteId].data[4] = 0;
+ gSprites[spriteId].invisible = TRUE;
+ }
+ REG_BLDCNT = BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_DARKEN;
+ REG_BLDY = 16;
+ HBlankIntrOn(sub_80C6078);
+}
+
+bool8 sub_80C5F98(void)
+{
+ switch (gUnknown_020387EC->unk08)
+ {
+ case 0:
+ gUnknown_020387EC->unk0C -= gUnknown_020387EC->unk06;
+ if (gUnknown_020387EC->unk0C < 2)
+ {
+ BlendPalettes(gUnknown_020387EC->selectedPalettes, 0x10, 0xFFFF);
+ SetHBlankCallback(sub_80C603C);
+ gUnknown_020387EC->unk0C = 1;
+ gUnknown_020387EC->unk08++;
+ }
+ break;
+ case 1:
+ if (gUnknown_020387EC->unk0A == 8)
+ {
+ BlendPalettes(0xFFFFFFFF, 16, 0);
+ gUnknown_020387EC->unk08++;
+ }
+ break;
+ case 2:
+ REG_BLDCNT = 0;
+ REG_BLDY = 0;
+ FreeSpriteTilesByTag(gUnknown_020387EC->tileTag);
+ FreeSpritePaletteByTag(gUnknown_020387EC->paletteTag);
+ HBlankIntrOff();
+ gUnknown_020387EC->unk08++;
+ return TRUE;
+ default:
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void sub_80C603C(void)
+{
+ vu16 vcount = REG_VCOUNT & 0xFF;
+ if (vcount == 0x50)
+ REG_BLDCNT = BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_LIGHTEN;
+ else
+ REG_BLDCNT = BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_DARKEN;
+}
+
+static void sub_80C6078(void)
+{
+ vu16 vcount = REG_VCOUNT & 0xFF;
+ if (vcount > 0x50 - gUnknown_020387EC->unk0C && vcount < 0x50 + gUnknown_020387EC->unk0C)
+ REG_BLDY = 0;
+ else
+ REG_BLDY = 16;
+}
+
+static void sub_80C60CC(struct Sprite *sprite)
+{
+ sprite->pos1.x += sprite->data[0];
+ if (sprite->pos1.x < -0x08 || sprite->pos1.x > 0xf8)
+ {
+ DestroySprite(sprite);
+ gUnknown_020387EC->unk0A++;
+ if (gUnknown_020387EC->unk0A == 8)
+ {
+ FreeSpriteTilesByTag(gUnknown_020387EC->tileTag);
+ FreeSpritePaletteByTag(gUnknown_020387EC->paletteTag);
+ BlendPalettes(gUnknown_020387EC->selectedPalettes, 0, 0xffff);
+ SetHBlankCallback(sub_80C6078);
+ }
+ }
+}
+
+static void sub_80C6130(struct Sprite *sprite)
+{
+ if (sprite->data[4] == 0 && gUnknown_020387EC->unk0C == 1)
+ {
+ sprite->pos1.x += sprite->data[0];
+ if (sprite->pos1.x > -0x10 && sprite->pos1.x < 0x100)
+ sprite->invisible = FALSE;
+ if (sprite->data[1] > 0)
+ {
+ if (sprite->pos1.x >= sprite->data[2])
+ sprite->data[4] = 1;
+ }
+ else
+ {
+ if (sprite->pos1.x <= sprite->data[2])
+ sprite->data[4] = 1;
+ }
+ if (sprite->data[4])
+ {
+ gUnknown_020387EC->unk0A++;
+ sprite->pos1.x = sprite->data[2];
+ }
+ }
+}
+
+static void HBlankIntrOn(IntrFunc cb)
+{
+ u16 imeBak;
+ INTR_CHECK |= INTR_FLAG_HBLANK;
+ REG_DISPSTAT |= DISPSTAT_HBLANK_INTR;
+ imeBak = REG_IME;
+ REG_IME = 0;
+ REG_IE |= INTR_FLAG_HBLANK;
+ REG_IME = imeBak;
+ gMain.intrCheck |= INTR_FLAG_HBLANK;
+ SetHBlankCallback(cb);
+}
+
+static void HBlankIntrOff(void)
+{
+ u16 imeBak;
+ INTR_CHECK &= ~INTR_FLAG_HBLANK;
+ REG_DISPSTAT &= ~DISPSTAT_HBLANK_INTR;
+ imeBak = REG_IME;
+ REG_IME = 0;
+ REG_IE &= ~INTR_FLAG_HBLANK;
+ REG_IME = imeBak;
+ gMain.intrCheck &= ~INTR_FLAG_HBLANK;
+ SetHBlankCallback(NULL);
+}