diff options
author | Marcus Huderle <huderlem@gmail.com> | 2017-11-21 21:47:48 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-11-21 21:47:48 -0800 |
commit | 4dd1f17ac37986c668792df7e0ba075d39b8f2a1 (patch) | |
tree | e7072bb3a7ee9d720698307f25e198888be15af4 | |
parent | 75cef1d9b80094ef5b875efac3ae0f0cb1ada165 (diff) | |
parent | e404d27e64305859e058d95946547143656b9a50 (diff) |
Merge pull request #471 from sceptillion/pc_screen_effect
partially decompile pc_screen_effect
-rwxr-xr-x | asm/pc_screen_effect.s | 179 | ||||
-rwxr-xr-x | data/pc_screen_effect.s | 16 | ||||
-rw-r--r-- | ld_script.txt | 2 | ||||
-rw-r--r-- | src/field/pc_screen_effect.c | 128 |
4 files changed, 130 insertions, 195 deletions
diff --git a/asm/pc_screen_effect.s b/asm/pc_screen_effect.s index d549d85e1..3c4f96e32 100755 --- a/asm/pc_screen_effect.s +++ b/asm/pc_screen_effect.s @@ -6,185 +6,6 @@ .text - thumb_func_start sub_80C5CD4 -sub_80C5CD4: @ 80C5CD4 - push {r4-r7,lr} - sub sp, 0x28 - adds r7, r0, 0 - ldr r0, _080C5D64 @ =gUnknown_083D1898 - ldr r1, [r0, 0x4] - ldr r0, [r0] - str r0, [sp, 0x18] - str r1, [sp, 0x1C] - ldr r0, _080C5D68 @ =gUnknown_083D18A0 - ldr r1, [r0, 0x4] - ldr r0, [r0] - str r0, [sp, 0x20] - str r1, [sp, 0x24] - mov r1, sp - ldr r0, _080C5D6C @ =gSpriteTemplate_83D18A8 - 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, _080C5D70 @ =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, 0x1 - strh r0, [r7, 0xC] - strh r6, [r7, 0xA] - strh r6, [r7, 0x8] - 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 _080C5D4E - movs r0, 0x10 - strh r0, [r7, 0x4] -_080C5D4E: - ldrh r0, [r7, 0x6] - cmp r0, 0 - bne _080C5D58 - movs r0, 0x14 - strh r0, [r7, 0x6] -_080C5D58: - ldr r0, _080C5D74 @ =gUnknown_020387EC - str r7, [r0] - movs r4, 0 - ldr r5, _080C5D78 @ =gSprites - b _080C5D94 - .align 2, 0 -_080C5D64: .4byte gUnknown_083D1898 -_080C5D68: .4byte gUnknown_083D18A0 -_080C5D6C: .4byte gSpriteTemplate_83D18A8 -_080C5D70: .4byte 0xffff0000 -_080C5D74: .4byte gUnknown_020387EC -_080C5D78: .4byte gSprites -_080C5D7C: - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r5 - ldrh r1, [r7, 0x4] - cmp r4, 0x3 - bhi _080C5D8C - negs r1, r1 -_080C5D8C: - strh r1, [r0, 0x2E] - adds r0, r4, 0x1 - lsls r0, 16 - lsrs r4, r0, 16 -_080C5D94: - cmp r4, 0x7 - bhi _080C5DB2 - lsls r1, r4, 5 - adds r1, 0x8 - lsls r1, 16 - asrs r1, 16 - mov r0, sp - movs r2, 0x50 - movs r3, 0 - bl CreateSprite - lsls r0, 24 - lsrs r1, r0, 24 - cmp r1, 0x40 - bne _080C5D7C -_080C5DB2: - ldr r1, _080C5DC8 @ =REG_BLDCNT - movs r0, 0xBF - strh r0, [r1] - adds r1, 0x4 - movs r0, 0x10 - strh r0, [r1] - add sp, 0x28 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080C5DC8: .4byte REG_BLDCNT - thumb_func_end sub_80C5CD4 - - thumb_func_start sub_80C5DCC -sub_80C5DCC: @ 80C5DCC - push {r4,lr} - ldr r4, _080C5E10 @ =gUnknown_020387EC - ldr r1, [r4] - ldrh r0, [r1, 0x8] - cmp r0, 0 - bne _080C5DF0 - ldr r0, [r1, 0x10] - ldr r2, _080C5E14 @ =0x0000ffff - movs r1, 0x10 - bl BlendPalettes - ldr r0, _080C5E18 @ =sub_80C603C - bl sub_80C61B0 - ldr r1, [r4] - ldrh r0, [r1, 0x8] - adds r0, 0x1 - strh r0, [r1, 0x8] -_080C5DF0: - ldr r1, [r4] - ldrh r0, [r1, 0xA] - cmp r0, 0x7 - bls _080C5E0A - ldrh r0, [r1, 0x6] - ldrh r2, [r1, 0xC] - adds r0, r2 - movs r2, 0 - strh r0, [r1, 0xC] - lsls r0, 16 - asrs r0, 16 - cmp r0, 0x4F - bgt _080C5E1C -_080C5E0A: - movs r0, 0 - b _080C5E2E - .align 2, 0 -_080C5E10: .4byte gUnknown_020387EC -_080C5E14: .4byte 0x0000ffff -_080C5E18: .4byte sub_80C603C -_080C5E1C: - movs r0, 0x50 - strh r0, [r1, 0xC] - ldr r0, _080C5E34 @ =REG_BLDCNT - strh r2, [r0] - adds r0, 0x4 - strh r2, [r0] - bl ClearGpuRegBits - movs r0, 0x1 -_080C5E2E: - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_080C5E34: .4byte REG_BLDCNT - thumb_func_end sub_80C5DCC - thumb_func_start sub_80C5E38 sub_80C5E38: @ 80C5E38 push {r4-r7,lr} diff --git a/data/pc_screen_effect.s b/data/pc_screen_effect.s index 4f860213a..c33957945 100755 --- a/data/pc_screen_effect.s +++ b/data/pc_screen_effect.s @@ -4,22 +4,6 @@ .section .rodata .align 2 -gUnknown_083D1898:: @ 83D1898 - obj_tiles gUnknownGfx_083D190C, 0x80, 0 - - .align 2 -gUnknown_083D18A0:: @ 83D18A0 - obj_pal gUnknownPal_083D18EC, 0x0000 - - .align 2 -gSpriteTemplate_83D18A8:: @ 83D18A8 - spr_template 0, 0, gOamData_83D18D8, gSpriteAnimTable_83D18E8, NULL, gDummySpriteAffineAnimTable, sub_80C60CC - - .align 2 -gSpriteTemplate_83D18C0:: @ 83D18C0 - spr_template 0, 0, gOamData_83D18D8, gSpriteAnimTable_83D18E8, NULL, gDummySpriteAffineAnimTable, sub_80C6130 - - .align 2 gOamData_83D18D8:: @ 83D18D8 .2byte 0x4000 .2byte 0x4000 diff --git a/ld_script.txt b/ld_script.txt index 631ec894a..67b7d23e2 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -158,6 +158,7 @@ SECTIONS { src/script_pokemon_util_80C4BF0.o(.text); src/field/field_poison.o(.text); src/pokemon/pokemon_size_record.o(.text); + src/field/pc_screen_effect.o(.text); asm/pc_screen_effect.o(.text); src/field/fldeff_secretpower.o(.text); src/field/fldeff_secret_base_pc.o(.text); @@ -407,6 +408,7 @@ SECTIONS { src/field/tv.o(.rodata); data/contest_link_80C2020.o(.rodata); src/pokemon/pokemon_size_record.o(.rodata); + src/field/pc_screen_effect.o(.rodata); data/pc_screen_effect.o(.rodata); data/fldeff_secretpower.o(.rodata); data/fldeff_decoration.o(.rodata); diff --git a/src/field/pc_screen_effect.c b/src/field/pc_screen_effect.c new file mode 100644 index 000000000..364fca0aa --- /dev/null +++ b/src/field/pc_screen_effect.c @@ -0,0 +1,128 @@ +#include "global.h" +#include "main.h" +#include "palette.h" +#include "sprite.h" + +struct UnkStruct +{ + /*0x00*/ u16 tileTag; + /*0x02*/ u16 paletteTag; + /*0x04*/ u16 unk04; + /*0x06*/ u16 unk06; + /*0x08*/ u16 unk08; + /*0x0A*/ u16 unk0A; + /*0x0C*/ s16 unk0C; + /*0x10*/ u32 selectedPalettes; +}; + +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); + +extern const struct OamData gOamData_83D18D8; + +extern const union AnimCmd *const gSpriteAnimTable_83D18E8[]; + +extern const u16 gUnknownPal_083D18EC[16]; + +extern const u8 gUnknownGfx_083D190C[128]; + +extern struct UnkStruct *gUnknown_020387EC; + +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 UnkStruct *unkStruct) +{ + u16 i; + + struct SpriteSheet sprSheet = gUnknown_083D1898; + struct SpritePalette sprPalette = gUnknown_083D18A0; + struct SpriteTemplate sprTemplate = gSpriteTemplate_83D18A8; + + sprSheet.tag = unkStruct->tileTag; + sprTemplate.tileTag = unkStruct->tileTag; + sprPalette.tag = unkStruct->paletteTag; + sprTemplate.paletteTag = unkStruct->paletteTag; + + LoadSpriteSheet(&sprSheet); + LoadSpritePalette(&sprPalette); + + unkStruct->unk0C = 1; + unkStruct->unk0A = 0; + unkStruct->unk08 = 0; + unkStruct->selectedPalettes = ~(0x10000 << IndexOfSpritePaletteTag(unkStruct->paletteTag)) & 0xFFFF0000; + + if (unkStruct->unk04 == 0) + unkStruct->unk04 = 16; + + if (unkStruct->unk06 == 0) + unkStruct->unk06 = 20; + + gUnknown_020387EC = unkStruct; + + for (i = 0; i < 8; i++) + { + u8 spriteId = CreateSprite(&sprTemplate, 32 * i + 8, 80, 0); + if (spriteId == MAX_SPRITES) + break; + gSprites[spriteId].data[0] = (i < 4) ? -unkStruct->unk04 : unkStruct->unk04; + } + + REG_BLDCNT = 191; + REG_BLDY = 16; +} + +bool8 sub_80C5DCC(void) +{ + if (gUnknown_020387EC->unk08 == 0) + { + BlendPalettes(gUnknown_020387EC->selectedPalettes, 0x10, 0xFFFF); + sub_80C61B0(sub_80C603C); + gUnknown_020387EC->unk08++; + } + + if (gUnknown_020387EC->unk0A < 8) + return FALSE; + + gUnknown_020387EC->unk0C += gUnknown_020387EC->unk06; + + if (gUnknown_020387EC->unk0C >= 80) + { + gUnknown_020387EC->unk0C = 80; + REG_BLDCNT = 0; + REG_BLDY = 0; + ClearGpuRegBits(); + return TRUE; + } + else + { + return FALSE; + } +} |