diff options
author | PikalaxALT <PikalaxALT@users.noreply.github.com> | 2019-10-15 10:01:46 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-10-15 10:01:46 -0400 |
commit | 407fc23f3f86d5caf665d9bca14e498273ae4dae (patch) | |
tree | 08bb2e084faf2b6308d1d396b6d674be1bec922b | |
parent | f3ee5e7511f429026680a1ffee82d18a313d9d32 (diff) | |
parent | 91af78857269212ee25fbaf19b3405fa2c7ec9ef (diff) |
Merge pull request #121 from PikalaxALT/mail
Decompile mail
-rw-r--r-- | asm/mail.s | 1041 | ||||
-rw-r--r-- | asm/party_menu.s | 2 | ||||
-rw-r--r-- | baserom.ips | bin | 1695486 -> 1693953 bytes | |||
-rw-r--r-- | data/data_835B488.s | 21 | ||||
-rw-r--r-- | data/graphics.s | 39 | ||||
-rw-r--r-- | data/strings.s | 2 | ||||
-rw-r--r-- | include/graphics.h | 38 | ||||
-rw-r--r-- | include/mail.h | 5 | ||||
-rw-r--r-- | include/player_pc.h | 1 | ||||
-rw-r--r-- | include/pokemon_icon.h | 2 | ||||
-rw-r--r-- | include/strings.h | 3 | ||||
-rw-r--r-- | ld_script.txt | 3 | ||||
-rw-r--r-- | src/item_use.c | 2 | ||||
-rw-r--r-- | src/mail.c | 738 | ||||
-rw-r--r-- | src/player_pc.c | 2 | ||||
-rw-r--r-- | sym_ewram.txt | 6 |
16 files changed, 831 insertions, 1074 deletions
diff --git a/asm/mail.s b/asm/mail.s deleted file mode 100644 index e5b265df2..000000000 --- a/asm/mail.s +++ /dev/null @@ -1,1041 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start sub_80BEBEC -sub_80BEBEC: @ 80BEBEC - push {r4-r7,lr} - sub sp, 0x4 - adds r5, r0, 0 - adds r7, r1, 0 - lsls r2, 24 - lsrs r6, r2, 24 - ldr r4, _080BEC38 @ =gUnknown_20399C4 - ldr r0, _080BEC3C @ =0x000020fc - bl AllocZeroed - str r0, [r4] - adds r0, 0xED - movs r1, 0x2 - strb r1, [r0] - ldr r0, [r4] - adds r0, 0xEE - movs r1, 0x1 - strb r1, [r0] - ldr r2, [r4] - adds r1, r2, 0 - adds r1, 0xF0 - ldr r0, _080BEC40 @ =CopyEasyChatWord - str r0, [r1] - adds r1, 0x4 - ldr r0, _080BEC44 @ =ConvertEasyChatWordsToString - str r0, [r1] - ldrh r1, [r5, 0x20] - adds r0, r1, 0 - subs r0, 0x79 - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0xB - bhi _080BEC48 - subs r1, 0x79 - adds r0, r2, 0 - adds r0, 0xEA - strb r1, [r0] - b _080BEC52 - .align 2, 0 -_080BEC38: .4byte gUnknown_20399C4 -_080BEC3C: .4byte 0x000020fc -_080BEC40: .4byte CopyEasyChatWord -_080BEC44: .4byte ConvertEasyChatWordsToString -_080BEC48: - adds r1, r2, 0 - adds r1, 0xEA - movs r0, 0 - strb r0, [r1] - movs r6, 0 -_080BEC52: - ldr r0, _080BEC78 @ =gUnknown_20399C4 - ldr r0, [r0] - adds r1, r0, 0 - adds r1, 0xEE - ldrb r1, [r1] - cmp r1, 0 - beq _080BEC64 - cmp r1, 0x1 - beq _080BEC80 -_080BEC64: - adds r2, r0, 0 - adds r2, 0xF8 - adds r0, 0xEA - ldrb r1, [r0] - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 2 - ldr r1, _080BEC7C @ =gUnknown_83EEAC4 - b _080BEC90 - .align 2, 0 -_080BEC78: .4byte gUnknown_20399C4 -_080BEC7C: .4byte gUnknown_83EEAC4 -_080BEC80: - adds r2, r0, 0 - adds r2, 0xF8 - adds r0, 0xEA - ldrb r1, [r0] - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 2 - ldr r1, _080BECC8 @ =gUnknown_83EEB68 -_080BEC90: - adds r0, r1 - str r0, [r2] - ldrh r0, [r5, 0x1E] - mov r1, sp - bl MailSpeciesToSpecies - lsls r0, 16 - ldr r1, _080BECCC @ =0xffff0000 - adds r0, r1 - movs r1, 0xCD - lsls r1, 17 - cmp r0, r1 - bhi _080BECE4 - ldr r0, _080BECD0 @ =gUnknown_20399C4 - ldr r1, [r0] - adds r2, r1, 0 - adds r2, 0xEA - ldrb r2, [r2] - adds r3, r0, 0 - cmp r2, 0x6 - beq _080BECD4 - cmp r2, 0x9 - beq _080BECDC - adds r1, 0xEB - movs r0, 0 - strb r0, [r1] - b _080BECF0 - .align 2, 0 -_080BECC8: .4byte gUnknown_83EEB68 -_080BECCC: .4byte 0xffff0000 -_080BECD0: .4byte gUnknown_20399C4 -_080BECD4: - adds r1, 0xEB - movs r0, 0x1 - strb r0, [r1] - b _080BECF0 -_080BECDC: - adds r1, 0xEB - movs r0, 0x2 - strb r0, [r1] - b _080BECF0 -_080BECE4: - ldr r0, _080BED10 @ =gUnknown_20399C4 - ldr r1, [r0] - adds r1, 0xEB - movs r2, 0 - strb r2, [r1] - adds r3, r0, 0 -_080BECF0: - ldr r1, [r3] - adds r0, r1, 0 - adds r0, 0xE4 - str r5, [r0] - subs r0, 0x8 - str r7, [r0] - adds r0, 0xC - strb r6, [r0] - ldr r0, _080BED14 @ =sub_80BF110 - bl SetMainCallback2 - add sp, 0x4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080BED10: .4byte gUnknown_20399C4 -_080BED14: .4byte sub_80BF110 - thumb_func_end sub_80BEBEC - - thumb_func_start sub_80BED18 -sub_80BED18: @ 80BED18 - push {r4-r6,lr} - sub sp, 0xC - ldr r0, _080BED38 @ =gMain - movs r1, 0x87 - lsls r1, 3 - adds r0, r1 - ldrb r0, [r0] - cmp r0, 0x12 - bls _080BED2C - b _080BF102 -_080BED2C: - lsls r0, 2 - ldr r1, _080BED3C @ =_080BED40 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_080BED38: .4byte gMain -_080BED3C: .4byte _080BED40 - .align 2, 0 -_080BED40: - .4byte _080BED8C - .4byte _080BEDBC - .4byte _080BEDD4 - .4byte _080BEDDA - .4byte _080BEDE0 - .4byte _080BEDE6 - .4byte _080BEE40 - .4byte _080BEE78 - .4byte _080BEE88 - .4byte _080BEEB8 - .4byte _080BEEC6 - .4byte _080BEF14 - .4byte _080BEF28 - .4byte _080BEFE8 - .4byte _080BF000 - .4byte _080BF01C - .4byte _080BF026 - .4byte _080BF040 - .4byte _080BF0A4 -_080BED8C: - movs r0, 0 - bl SetVBlankCallback - bl ScanlineEffect_Stop - movs r0, 0 - movs r1, 0 - bl SetGpuReg - ldr r0, _080BEDB0 @ =gPlayerPcMenuManager - ldrb r0, [r0, 0x9] - cmp r0, 0 - bne _080BEDB4 - movs r0, 0x22 - bl HelpSystem_SetSomeVariable2 - b _080BF0F4 - .align 2, 0 -_080BEDB0: .4byte gPlayerPcMenuManager -_080BEDB4: - movs r0, 0x1E - bl HelpSystem_SetSomeVariable2 - b _080BF0F4 -_080BEDBC: - add r1, sp, 0x8 - movs r0, 0 - strh r0, [r1] - movs r1, 0xE0 - lsls r1, 19 - ldr r2, _080BEDD0 @ =0x01000200 - add r0, sp, 0x8 - bl CpuSet - b _080BF0F4 - .align 2, 0 -_080BEDD0: .4byte 0x01000200 -_080BEDD4: - bl ResetPaletteFade - b _080BF0F4 -_080BEDDA: - bl ResetTasks - b _080BF0F4 -_080BEDE0: - bl ResetSpriteData - b _080BF0F4 -_080BEDE6: - bl FreeAllSpritePalettes - bl ResetTempTileDataBuffers - movs r0, 0x10 - movs r1, 0 - bl SetGpuReg - movs r0, 0x12 - movs r1, 0 - bl SetGpuReg - movs r0, 0x14 - movs r1, 0 - bl SetGpuReg - movs r0, 0x16 - movs r1, 0 - bl SetGpuReg - movs r0, 0x1A - movs r1, 0 - bl SetGpuReg - movs r0, 0x18 - movs r1, 0 - bl SetGpuReg - movs r0, 0x1C - movs r1, 0 - bl SetGpuReg - movs r0, 0x1E - movs r1, 0 - bl SetGpuReg - movs r0, 0x50 - movs r1, 0 - bl SetGpuReg - movs r0, 0x52 - movs r1, 0 - bl SetGpuReg - b _080BF0F4 -_080BEE40: - movs r0, 0 - bl ResetBgsAndClearDma3BusyFlags - ldr r1, _080BEE6C @ =gUnknown_83EE998 - movs r0, 0 - movs r2, 0x3 - bl InitBgsFromTemplates - ldr r4, _080BEE70 @ =gUnknown_20399C4 - ldr r1, [r4] - adds r1, 0xFC - movs r0, 0x1 - bl SetBgTilemapBuffer - ldr r1, [r4] - ldr r0, _080BEE74 @ =0x000010fc - adds r1, r0 - movs r0, 0x2 - bl SetBgTilemapBuffer - b _080BF0F4 - .align 2, 0 -_080BEE6C: .4byte gUnknown_83EE998 -_080BEE70: .4byte gUnknown_20399C4 -_080BEE74: .4byte 0x000010fc -_080BEE78: - ldr r0, _080BEE84 @ =gUnknown_83EE9A4 - bl InitWindows - bl DeactivateAllTextPrinters - b _080BF0F4 - .align 2, 0 -_080BEE84: .4byte gUnknown_83EE9A4 -_080BEE88: - ldr r2, _080BEEB0 @ =gUnknown_83EE9C8 - ldr r0, _080BEEB4 @ =gUnknown_20399C4 - ldr r0, [r0] - adds r0, 0xEA - ldrb r1, [r0] - lsls r0, r1, 2 - adds r0, r1 - lsls r0, 2 - adds r2, 0x4 - adds r0, r2 - ldr r1, [r0] - movs r0, 0 - str r0, [sp] - movs r0, 0x1 - movs r2, 0 - movs r3, 0 - bl DecompressAndCopyTileDataToVram - b _080BF0F4 - .align 2, 0 -_080BEEB0: .4byte gUnknown_83EE9C8 -_080BEEB4: .4byte gUnknown_20399C4 -_080BEEB8: - bl FreeTempTileDataBuffersIfPossible - lsls r0, 24 - cmp r0, 0 - bne _080BEEC4 - b _080BF0F4 -_080BEEC4: - b _080BF102 -_080BEEC6: - movs r5, 0x1E - str r5, [sp] - movs r4, 0x14 - str r4, [sp, 0x4] - movs r0, 0 - movs r1, 0 - movs r2, 0 - movs r3, 0 - bl FillBgTilemapBufferRect_Palette0 - str r5, [sp] - str r4, [sp, 0x4] - movs r0, 0x2 - movs r1, 0x1 - movs r2, 0 - movs r3, 0 - bl FillBgTilemapBufferRect_Palette0 - ldr r2, _080BEF0C @ =gUnknown_83EE9C8 - ldr r0, _080BEF10 @ =gUnknown_20399C4 - ldr r0, [r0] - adds r0, 0xEA - ldrb r1, [r0] - lsls r0, r1, 2 - adds r0, r1 - lsls r0, 2 - adds r2, 0x8 - adds r0, r2 - ldr r1, [r0] - movs r0, 0x1 - movs r2, 0 - movs r3, 0 - bl CopyToBgTilemapBuffer - b _080BF0F4 - .align 2, 0 -_080BEF0C: .4byte gUnknown_83EE9C8 -_080BEF10: .4byte gUnknown_20399C4 -_080BEF14: - movs r0, 0 - bl CopyBgTilemapBufferToVram - movs r0, 0x1 - bl CopyBgTilemapBufferToVram - movs r0, 0x2 - bl CopyBgTilemapBufferToVram - b _080BF0F4 -_080BEF28: - movs r0, 0 - bl stdpal_get - movs r1, 0xF0 - movs r2, 0x20 - bl LoadPalette - ldr r6, _080BEFD0 @ =gPlttBufferUnfaded - ldr r4, _080BEFD4 @ =gUnknown_83EE9C8 - ldr r0, _080BEFD8 @ =gUnknown_20399C4 - ldr r3, [r0] - adds r3, 0xEA - ldrb r1, [r3] - lsls r0, r1, 2 - adds r0, r1 - lsls r0, 2 - adds r0, r4 - ldrh r1, [r0, 0x10] - movs r2, 0xFA - lsls r2, 1 - adds r0, r6, r2 - strh r1, [r0] - ldr r5, _080BEFDC @ =gPlttBufferFaded - ldrb r1, [r3] - lsls r0, r1, 2 - adds r0, r1 - lsls r0, 2 - adds r0, r4 - ldrh r0, [r0, 0x10] - adds r2, r5, r2 - strh r0, [r2] - ldrb r1, [r3] - lsls r0, r1, 2 - adds r0, r1 - lsls r0, 2 - adds r0, r4 - ldrh r1, [r0, 0x12] - movs r2, 0xFB - lsls r2, 1 - adds r0, r6, r2 - strh r1, [r0] - ldrb r1, [r3] - lsls r0, r1, 2 - adds r0, r1 - lsls r0, 2 - adds r0, r4 - ldrh r0, [r0, 0x12] - adds r2, r5, r2 - strh r0, [r2] - ldrb r1, [r3] - lsls r0, r1, 2 - adds r0, r1 - lsls r0, 2 - adds r0, r4 - ldr r0, [r0] - movs r1, 0 - movs r2, 0x20 - bl LoadPalette - ldr r1, _080BEFE0 @ =gUnknown_83EE9C0 - ldr r0, _080BEFE4 @ =gSaveBlock2Ptr - ldr r2, [r0] - ldrb r0, [r2, 0x8] - lsls r0, 2 - adds r0, r1 - ldrh r0, [r0] - strh r0, [r6, 0x14] - ldrb r0, [r2, 0x8] - lsls r0, 2 - adds r0, r1 - ldrh r0, [r0] - strh r0, [r5, 0x14] - ldrb r0, [r2, 0x8] - lsls r0, 2 - adds r1, 0x2 - adds r0, r1 - ldrh r0, [r0] - strh r0, [r6, 0x16] - ldrb r0, [r2, 0x8] - lsls r0, 2 - adds r0, r1 - ldrh r0, [r0] - strh r0, [r5, 0x16] - b _080BF0F4 - .align 2, 0 -_080BEFD0: .4byte gPlttBufferUnfaded -_080BEFD4: .4byte gUnknown_83EE9C8 -_080BEFD8: .4byte gUnknown_20399C4 -_080BEFDC: .4byte gPlttBufferFaded -_080BEFE0: .4byte gUnknown_83EE9C0 -_080BEFE4: .4byte gSaveBlock2Ptr -_080BEFE8: - ldr r0, _080BEFFC @ =gUnknown_20399C4 - ldr r0, [r0] - adds r0, 0xE8 - ldrb r0, [r0] - cmp r0, 0 - bne _080BEFF6 - b _080BF0F4 -_080BEFF6: - bl sub_80BF13C - b _080BF0F4 - .align 2, 0 -_080BEFFC: .4byte gUnknown_20399C4 -_080BF000: - ldr r0, _080BF018 @ =gUnknown_20399C4 - ldr r0, [r0] - adds r0, 0xE8 - ldrb r0, [r0] - cmp r0, 0 - beq _080BF0F4 - bl sub_80BF224 - bl RunTextPrinters - b _080BF0F4 - .align 2, 0 -_080BF018: .4byte gUnknown_20399C4 -_080BF01C: - bl sub_8058244 - cmp r0, 0x1 - bne _080BF0F4 - b _080BF102 -_080BF026: - ldr r0, _080BF038 @ =sub_80BF354 - bl SetVBlankCallback - ldr r2, _080BF03C @ =gPaletteFade - ldrb r0, [r2, 0x8] - movs r1, 0x80 - orrs r0, r1 - strb r0, [r2, 0x8] - b _080BF0F4 - .align 2, 0 -_080BF038: .4byte sub_80BF354 -_080BF03C: .4byte gPaletteFade -_080BF040: - ldr r5, _080BF064 @ =gUnknown_20399C4 - ldr r0, [r5] - adds r0, 0xE4 - ldr r0, [r0] - ldrh r0, [r0, 0x1E] - bl sub_8096FD4 - lsls r0, 16 - lsrs r4, r0, 16 - ldr r0, [r5] - adds r0, 0xEB - ldrb r0, [r0] - cmp r0, 0x1 - beq _080BF068 - cmp r0, 0x2 - beq _080BF080 - b _080BF0F4 - .align 2, 0 -_080BF064: .4byte gUnknown_20399C4 -_080BF068: - adds r0, r4, 0 - bl sub_80970E0 - ldr r1, _080BF07C @ =SpriteCallbackDummy - movs r0, 0 - str r0, [sp] - str r0, [sp, 0x4] - adds r0, r4, 0 - movs r2, 0x60 - b _080BF092 - .align 2, 0 -_080BF07C: .4byte SpriteCallbackDummy -_080BF080: - adds r0, r4, 0 - bl sub_80970E0 - ldr r1, _080BF0A0 @ =SpriteCallbackDummy - movs r0, 0 - str r0, [sp] - str r0, [sp, 0x4] - adds r0, r4, 0 - movs r2, 0x28 -_080BF092: - movs r3, 0x80 - bl sub_8096ECC - ldr r1, [r5] - adds r1, 0xEC - strb r0, [r1] - b _080BF0F4 - .align 2, 0 -_080BF0A0: .4byte SpriteCallbackDummy -_080BF0A4: - movs r1, 0x82 - lsls r1, 5 - movs r0, 0 - bl SetGpuReg - movs r0, 0 - bl ShowBg - movs r0, 0x1 - bl ShowBg - movs r0, 0x2 - bl ShowBg - movs r0, 0x1 - negs r0, r0 - movs r1, 0 - str r1, [sp] - movs r2, 0x10 - movs r3, 0 - bl BeginNormalPaletteFade - ldr r2, _080BF0E8 @ =gPaletteFade - ldrb r1, [r2, 0x8] - movs r0, 0x7F - ands r0, r1 - strb r0, [r2, 0x8] - ldr r0, _080BF0EC @ =gUnknown_20399C4 - ldr r0, [r0] - adds r0, 0xE0 - ldr r1, _080BF0F0 @ =sub_80BF394 - str r1, [r0] - movs r0, 0x1 - b _080BF104 - .align 2, 0 -_080BF0E8: .4byte gPaletteFade -_080BF0EC: .4byte gUnknown_20399C4 -_080BF0F0: .4byte sub_80BF394 -_080BF0F4: - ldr r1, _080BF10C @ =gMain - movs r0, 0x87 - lsls r0, 3 - adds r1, r0 - ldrb r0, [r1] - adds r0, 0x1 - strb r0, [r1] -_080BF102: - movs r0, 0 -_080BF104: - add sp, 0xC - pop {r4-r6} - pop {r1} - bx r1 - .align 2, 0 -_080BF10C: .4byte gMain - thumb_func_end sub_80BED18 - - thumb_func_start sub_80BF110 -sub_80BF110: @ 80BF110 - push {lr} -_080BF112: - bl sub_80BED18 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080BF12C - ldr r0, _080BF128 @ =sub_80BF368 - bl SetMainCallback2 - b _080BF138 - .align 2, 0 -_080BF128: .4byte sub_80BF368 -_080BF12C: - bl MenuHelpers_LinkSomething - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080BF112 -_080BF138: - pop {r0} - bx r0 - thumb_func_end sub_80BF110 - - thumb_func_start sub_80BF13C -sub_80BF13C: @ 80BF13C - push {r4-r7,lr} - movs r6, 0 - movs r5, 0 - ldr r2, _080BF1E0 @ =gUnknown_20399C4 - ldr r0, [r2] - adds r0, 0xF8 - ldr r0, [r0] - ldrb r0, [r0] - cmp r5, r0 - bcs _080BF19C - adds r7, r2, 0 -_080BF152: - movs r0, 0x1A - muls r0, r5 - ldr r2, [r7] - adds r0, r2, r0 - adds r1, r2, 0 - adds r1, 0xE4 - lsls r3, r6, 1 - ldr r1, [r1] - adds r1, r3 - adds r2, 0xF8 - ldr r2, [r2] - ldr r2, [r2, 0x8] - lsls r4, r5, 2 - adds r2, r4, r2 - ldr r2, [r2] - lsls r2, 30 - lsrs r2, 30 - movs r3, 0x1 - bl ConvertEasyChatWordsToString - ldr r0, [r7] - adds r0, 0xF8 - ldr r1, [r0] - ldr r0, [r1, 0x8] - adds r4, r0 - ldr r0, [r4] - lsls r0, 30 - lsrs r0, 30 - adds r0, r6, r0 - lsls r0, 24 - lsrs r6, r0, 24 - adds r0, r5, 0x1 - lsls r0, 16 - lsrs r5, r0, 16 - ldrb r1, [r1] - cmp r5, r1 - bcc _080BF152 -_080BF19C: - ldr r4, _080BF1E0 @ =gUnknown_20399C4 - ldr r1, [r4] - adds r0, r1, 0 - adds r0, 0xEE - ldrb r0, [r0] - cmp r0, 0 - bne _080BF1E8 - adds r0, r1, 0 - adds r0, 0xD0 - adds r1, 0xE4 - ldr r1, [r1] - adds r1, 0x12 - bl StringCopy - ldr r1, _080BF1E4 @ =gUnknown_841E234 - bl StringCopy - ldr r0, [r4] - adds r0, 0xD0 - bl StringLength - ldr r2, [r4] - adds r1, r2, 0 - adds r1, 0xF8 - ldr r1, [r1] - lsls r0, 16 - lsrs r0, 13 - subs r0, 0x60 - ldrb r1, [r1, 0x2] - subs r1, r0 - adds r2, 0xE9 - strb r1, [r2] - b _080BF21E - .align 2, 0 -_080BF1E0: .4byte gUnknown_20399C4 -_080BF1E4: .4byte gUnknown_841E234 -_080BF1E8: - adds r0, r1, 0 - adds r0, 0xD0 - adds r1, 0xE4 - ldr r1, [r1] - adds r1, 0x12 - bl StringCopy - ldr r0, [r4] - adds r0, 0xD0 - bl StringLength - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x5 - bhi _080BF210 - ldr r0, [r4] - adds r0, 0xD0 - movs r1, 0x1 - bl ConvertInternationalString -_080BF210: - ldr r0, [r4] - adds r1, r0, 0 - adds r1, 0xF8 - ldr r1, [r1] - ldrb r1, [r1, 0x2] - adds r0, 0xE9 - strb r1, [r0] -_080BF21E: - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_80BF13C - - thumb_func_start sub_80BF224 -sub_80BF224: @ 80BF224 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0xC - movs r7, 0 - movs r0, 0 - bl PutWindowTilemap - movs r0, 0x1 - bl PutWindowTilemap - movs r0, 0 - movs r1, 0 - bl FillWindowPixelBuffer - movs r0, 0x1 - movs r1, 0 - bl FillWindowPixelBuffer - movs r6, 0 - ldr r0, _080BF348 @ =gUnknown_20399C4 - mov r9, r0 - ldr r0, [r0] - adds r0, 0xF8 - ldr r0, [r0] - ldrb r0, [r0] - cmp r6, r0 - bcs _080BF2CE - mov r8, r9 -_080BF260: - mov r0, r8 - ldr r1, [r0] - movs r0, 0x1A - muls r0, r6 - adds r5, r1, r0 - ldrb r0, [r5] - cmp r0, 0xFF - beq _080BF2BA - cmp r0, 0 - beq _080BF2BA - adds r0, r1, 0 - adds r0, 0xF8 - ldr r1, [r0] - ldr r0, [r1, 0x8] - lsls r4, r6, 2 - adds r0, r4, r0 - ldr r2, [r0] - lsls r2, 24 - lsrs r2, 26 - ldrb r0, [r1, 0x4] - adds r2, r0 - lsls r2, 24 - lsrs r2, 24 - ldrb r3, [r1, 0x3] - adds r3, r7, r3 - lsls r3, 24 - lsrs r3, 24 - ldr r0, _080BF34C @ =gUnknown_83EE9BC - str r0, [sp] - movs r0, 0 - str r0, [sp, 0x4] - str r5, [sp, 0x8] - movs r1, 0x1 - bl AddTextPrinterParameterized3 - mov r1, r8 - ldr r0, [r1] - adds r0, 0xF8 - ldr r0, [r0] - ldr r0, [r0, 0x8] - adds r4, r0 - ldrb r0, [r4, 0x1] - adds r0, r7, r0 - lsls r0, 24 - lsrs r7, r0, 24 -_080BF2BA: - adds r0, r6, 0x1 - lsls r0, 16 - lsrs r6, r0, 16 - mov r1, r9 - ldr r0, [r1] - adds r0, 0xF8 - ldr r0, [r0] - ldrb r0, [r0] - cmp r6, r0 - bcc _080BF260 -_080BF2CE: - ldr r4, _080BF350 @ =gUnknown_841E234 - movs r0, 0x1 - adds r1, r4, 0 - movs r2, 0 - bl GetStringWidth - mov r9, r0 - ldr r5, _080BF348 @ =gUnknown_20399C4 - ldr r0, [r5] - adds r1, r0, 0 - adds r1, 0xE9 - ldrb r2, [r1] - adds r0, 0xF8 - ldr r0, [r0] - ldrb r3, [r0, 0x1] - ldr r0, _080BF34C @ =gUnknown_83EE9BC - mov r8, r0 - str r0, [sp] - movs r6, 0 - str r6, [sp, 0x4] - str r4, [sp, 0x8] - movs r0, 0x1 - movs r1, 0x1 - bl AddTextPrinterParameterized3 - ldr r1, [r5] - adds r0, r1, 0 - adds r0, 0xE9 - ldrb r2, [r0] - add r2, r9 - lsls r2, 24 - lsrs r2, 24 - adds r0, 0xF - ldr r0, [r0] - ldrb r3, [r0, 0x1] - mov r0, r8 - str r0, [sp] - str r6, [sp, 0x4] - adds r0, r1, 0 - adds r0, 0xD0 - str r0, [sp, 0x8] - movs r0, 0x1 - movs r1, 0x1 - bl AddTextPrinterParameterized3 - movs r0, 0 - movs r1, 0x3 - bl CopyWindowToVram - movs r0, 0x1 - movs r1, 0x3 - bl CopyWindowToVram - add sp, 0xC - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080BF348: .4byte gUnknown_20399C4 -_080BF34C: .4byte gUnknown_83EE9BC -_080BF350: .4byte gUnknown_841E234 - thumb_func_end sub_80BF224 - - thumb_func_start sub_80BF354 -sub_80BF354: @ 80BF354 - push {lr} - bl LoadOam - bl ProcessSpriteCopyRequests - bl TransferPlttBuffer - pop {r0} - bx r0 - thumb_func_end sub_80BF354 - - thumb_func_start sub_80BF368 -sub_80BF368: @ 80BF368 - push {r4,lr} - ldr r4, _080BF390 @ =gUnknown_20399C4 - ldr r0, [r4] - adds r0, 0xEB - ldrb r0, [r0] - cmp r0, 0 - beq _080BF37E - bl AnimateSprites - bl BuildOamBuffer -_080BF37E: - ldr r0, [r4] - adds r0, 0xE0 - ldr r0, [r0] - bl _call_via_r0 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080BF390: .4byte gUnknown_20399C4 - thumb_func_end sub_80BF368 - - thumb_func_start sub_80BF394 -sub_80BF394: @ 80BF394 - push {lr} - bl UpdatePaletteFade - lsls r0, 24 - cmp r0, 0 - bne _080BF3AA - ldr r0, _080BF3B0 @ =gUnknown_20399C4 - ldr r0, [r0] - adds r0, 0xE0 - ldr r1, _080BF3B4 @ =sub_80BF3B8 - str r1, [r0] -_080BF3AA: - pop {r0} - bx r0 - .align 2, 0 -_080BF3B0: .4byte gUnknown_20399C4 -_080BF3B4: .4byte sub_80BF3B8 - thumb_func_end sub_80BF394 - - thumb_func_start sub_80BF3B8 -sub_80BF3B8: @ 80BF3B8 - push {lr} - sub sp, 0x4 - ldr r0, _080BF3E8 @ =gMain - ldrh r1, [r0, 0x2E] - movs r0, 0x3 - ands r0, r1 - cmp r0, 0 - beq _080BF3E2 - movs r0, 0x1 - negs r0, r0 - movs r1, 0 - str r1, [sp] - movs r2, 0 - movs r3, 0x10 - bl BeginNormalPaletteFade - ldr r0, _080BF3EC @ =gUnknown_20399C4 - ldr r0, [r0] - adds r0, 0xE0 - ldr r1, _080BF3F0 @ =sub_80BF3F4 - str r1, [r0] -_080BF3E2: - add sp, 0x4 - pop {r0} - bx r0 - .align 2, 0 -_080BF3E8: .4byte gMain -_080BF3EC: .4byte gUnknown_20399C4 -_080BF3F0: .4byte sub_80BF3F4 - thumb_func_end sub_80BF3B8 - - thumb_func_start sub_80BF3F4 -sub_80BF3F4: @ 80BF3F4 - push {r4,lr} - bl UpdatePaletteFade - lsls r0, 24 - cmp r0, 0 - bne _080BF460 - ldr r4, _080BF468 @ =gUnknown_20399C4 - ldr r0, [r4] - adds r0, 0xDC - ldr r0, [r0] - bl SetMainCallback2 - ldr r0, [r4] - adds r1, r0, 0 - adds r1, 0xEB - ldrb r1, [r1] - cmp r1, 0x2 - bgt _080BF442 - cmp r1, 0x1 - blt _080BF442 - adds r0, 0xE4 - ldr r0, [r0] - ldrh r0, [r0, 0x1E] - bl sub_8096FD4 - lsls r0, 16 - lsrs r0, 16 - bl sub_8097168 - ldr r0, [r4] - adds r0, 0xEC - ldrb r1, [r0] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - ldr r1, _080BF46C @ =gSprites - adds r0, r1 - bl sub_8097070 -_080BF442: - ldr r4, _080BF468 @ =gUnknown_20399C4 - ldr r0, [r4] - ldr r2, _080BF470 @ =0x000020fc - movs r1, 0 - bl memset - bl ResetPaletteFade - bl FreeAllWindowBuffers - ldr r0, [r4] - bl Free - movs r0, 0 - str r0, [r4] -_080BF460: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080BF468: .4byte gUnknown_20399C4 -_080BF46C: .4byte gSprites -_080BF470: .4byte 0x000020fc - thumb_func_end sub_80BF3F4 - - .align 2, 0 @ Don't pad with nop. diff --git a/asm/party_menu.s b/asm/party_menu.s index 58c6e3732..5ebea0f54 100644 --- a/asm/party_menu.s +++ b/asm/party_menu.s @@ -10642,7 +10642,7 @@ sub_8123D84: @ 8123D84 adds r0, r1 ldr r1, _08123DC8 @ =sub_8123DCC movs r2, 0x1 - bl sub_80BEBEC + bl ReadMail pop {r0} bx r0 .align 2, 0 diff --git a/baserom.ips b/baserom.ips Binary files differindex 28e1c0918..59b01f31f 100644 --- a/baserom.ips +++ b/baserom.ips diff --git a/data/data_835B488.s b/data/data_835B488.s index 2766f0eeb..a1893150d 100644 --- a/data/data_835B488.s +++ b/data/data_835B488.s @@ -961,27 +961,6 @@ gUnknown_83EE8D0:: @ 83EE8D0 gUnknown_83EE958:: @ 83EE958 .incbin "baserom.gba", 0x3EE958, 0x40 -gUnknown_83EE998:: @ 83EE998 - .incbin "baserom.gba", 0x3EE998, 0xC - -gUnknown_83EE9A4:: @ 83EE9A4 - .incbin "baserom.gba", 0x3EE9A4, 0x18 - -gUnknown_83EE9BC:: @ 83EE9BC - .incbin "baserom.gba", 0x3EE9BC, 0x4 - -gUnknown_83EE9C0:: @ 83EE9C0 - .incbin "baserom.gba", 0x3EE9C0, 0x8 - -gUnknown_83EE9C8:: @ 83EE9C8 - .incbin "baserom.gba", 0x3EE9C8, 0xFC - -gUnknown_83EEAC4:: @ 83EEAC4 - .incbin "baserom.gba", 0x3EEAC4, 0xA4 - -gUnknown_83EEB68:: @ 83EEB68 - .incbin "baserom.gba", 0x3EEB68, 0x90 - .section .rodata.83EEC98 .include "data/text/map_section_names.inc" diff --git a/data/graphics.s b/data/graphics.s index 1116f7241..78c955d0f 100644 --- a/data/graphics.s +++ b/data/graphics.s @@ -15932,9 +15932,42 @@ gGhostPalette:: @ 8E93B14 gGhostFrontPic:: @ 8E93B38 .incbin "baserom.gba", 0xE93B38, 0x368 -gUnknown_8E93EA0:: @ 8E93EA0 - .incbin "baserom.gba", 0xE93EA0, 0x180 @UNKNOWN - +gFile_graphics_mail_orange_palette_pal:: @ 8E93EA0 + .incbin "graphics/mail/orange/palette.gbapal" + +gFile_graphics_mail_harbor_palette_pal:: @ 8E93EC0 + .incbin "graphics/mail/harbor/palette.gbapal" + +gFile_graphics_mail_glitter_palette_pal:: @ 8E93EE0 + .incbin "graphics/mail/glitter/palette.gbapal" + +gFile_graphics_mail_mech_palette_pal:: @ 8E93F00 + .incbin "graphics/mail/mech/palette.gbapal" + +gFile_graphics_mail_wood_palette_pal:: @ 8E93F20 + .incbin "graphics/mail/wood/palette.gbapal" + +gFile_graphics_mail_wave_palette_pal:: @ 8E93F40 + .incbin "graphics/mail/wave/palette.gbapal" + +gFile_graphics_mail_bead_palette_pal:: @ 8E93F60 + .incbin "graphics/mail/bead/palette.gbapal" + +gFile_graphics_mail_shadow_palette_pal:: @ 8E93F80 + .incbin "graphics/mail/shadow/palette.gbapal" + +gFile_graphics_mail_tropic_palette_pal:: @ 8E93FA0 + .incbin "graphics/mail/tropic/palette.gbapal" + +gFile_graphics_mail_dream_palette_pal:: @ 8E93FC0 + .incbin "graphics/mail/dream/palette.gbapal" + +gFile_graphics_mail_fab_palette_pal:: @ 8E93FE0 + .incbin "graphics/mail/fab/palette.gbapal" + +gFile_graphics_mail_retro_palette_pal:: @ 8E94000 + .incbin "graphics/mail/retro/palette.gbapal" + .align 2 gFile_graphics_mail_orange_tiles_sheet:: @ 8E94020 .incbin "graphics/mail/orange/tiles.4bpp.lz" diff --git a/data/strings.s b/data/strings.s index 52abc36de..f9fea0e1d 100644 --- a/data/strings.s +++ b/data/strings.s @@ -4402,7 +4402,7 @@ gUnknown_841E20D:: @ 841E20D gUnknown_841E21E:: @ 841E21E .string "Take good care of {STR_VAR_3}!$" -gUnknown_841E234:: @ 841E234 +gText_From:: @ 841E234 .string "From $" gUnknown_841E23A:: @ 841E23A diff --git a/include/graphics.h b/include/graphics.h index 1c0612fd1..9af673992 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -1036,4 +1036,42 @@ extern const u32 gBerryPouchBgPal0FemaleOverride[]; extern const u32 gBerryPouchSpritePalette[]; extern const u8 gBerryPouchBg1Tilemap[]; +// mail +extern const u16 gFile_graphics_mail_orange_palette_pal[]; +extern const u16 gFile_graphics_mail_harbor_palette_pal[]; +extern const u16 gFile_graphics_mail_glitter_palette_pal[]; +extern const u16 gFile_graphics_mail_mech_palette_pal[]; +extern const u16 gFile_graphics_mail_wood_palette_pal[]; +extern const u16 gFile_graphics_mail_wave_palette_pal[]; +extern const u16 gFile_graphics_mail_bead_palette_pal[]; +extern const u16 gFile_graphics_mail_shadow_palette_pal[]; +extern const u16 gFile_graphics_mail_tropic_palette_pal[]; +extern const u16 gFile_graphics_mail_dream_palette_pal[]; +extern const u16 gFile_graphics_mail_fab_palette_pal[]; +extern const u16 gFile_graphics_mail_retro_palette_pal[]; +extern const u32 gFile_graphics_mail_orange_tiles_sheet[]; +extern const u32 gFile_graphics_mail_harbor_tiles_sheet[]; +extern const u32 gFile_graphics_mail_glitter_tiles_sheet[]; +extern const u32 gFile_graphics_mail_mech_tiles_sheet[]; +extern const u32 gFile_graphics_mail_wood_tiles_sheet[]; +extern const u32 gFile_graphics_mail_wave_tiles_sheet[]; +extern const u32 gFile_graphics_mail_bead_tiles_sheet[]; +extern const u32 gFile_graphics_mail_shadow_tiles_sheet[]; +extern const u32 gFile_graphics_mail_tropic_tiles_sheet[]; +extern const u32 gFile_graphics_mail_dream_tiles_sheet[]; +extern const u32 gFile_graphics_mail_fab_tiles_sheet[]; +extern const u32 gFile_graphics_mail_retro_tiles_sheet[]; +extern const u32 gFile_graphics_mail_orange_map_tilemap[]; +extern const u32 gFile_graphics_mail_harbor_map_tilemap[]; +extern const u32 gFile_graphics_mail_glitter_map_tilemap[]; +extern const u32 gFile_graphics_mail_mech_map_tilemap[]; +extern const u32 gFile_graphics_mail_wood_map_tilemap[]; +extern const u32 gFile_graphics_mail_wave_map_tilemap[]; +extern const u32 gFile_graphics_mail_bead_map_tilemap[]; +extern const u32 gFile_graphics_mail_shadow_map_tilemap[]; +extern const u32 gFile_graphics_mail_tropic_map_tilemap[]; +extern const u32 gFile_graphics_mail_dream_map_tilemap[]; +extern const u32 gFile_graphics_mail_fab_map_tilemap[]; +extern const u32 gFile_graphics_mail_retro_map_tilemap[]; + #endif //GUARD_GRAPHICS_H diff --git a/include/mail.h b/include/mail.h index 3ba731c66..ca2fbfcc8 100644 --- a/include/mail.h +++ b/include/mail.h @@ -18,7 +18,10 @@ || itemId == ITEM_FAB_MAIL \ || itemId == ITEM_RETRO_MAIL)) +#define FIRST_MAIL_IDX ITEM_ORANGE_MAIL -void sub_80BEBEC(struct MailStruct * mail, void (* callback)(void), u8 a2); +#define ITEM_TO_MAIL(itemId) (itemId - FIRST_MAIL_IDX) + +void ReadMail(struct MailStruct * mail, void (*savedCallback)(void), bool8 messageExists); #endif // GUARD_MAIL_H diff --git a/include/player_pc.h b/include/player_pc.h index ecaf023e5..a1ebcddaa 100644 --- a/include/player_pc.h +++ b/include/player_pc.h @@ -19,6 +19,7 @@ struct PlayerPCItemPageStruct }; // Exported RAM declarations +extern struct PlayerPCItemPageStruct gPlayerPcMenuManager; // Exported ROM declarations diff --git a/include/pokemon_icon.h b/include/pokemon_icon.h index 60da74bcb..d5aab71de 100644 --- a/include/pokemon_icon.h +++ b/include/pokemon_icon.h @@ -17,5 +17,7 @@ u8 sub_8096ECC(u16, void (*)(struct Sprite *), s16, s16, u8, bool32); void sub_8097070(struct Sprite *); u16 GetUnownLetterByPersonality(u32 personality); u8 UpdateMonIconFrame(struct Sprite *sprite); +void sub_80970E0(u16 iconId); +void sub_8097168(u16 iconId); #endif // GUARD_POKEMON_ICON_H diff --git a/include/strings.h b/include/strings.h index 2c2756eb5..8f3da98cf 100644 --- a/include/strings.h +++ b/include/strings.h @@ -472,4 +472,7 @@ extern const u8 gSaveStatName_Badges[]; extern const u8 gSaveStatName_Pokedex[]; extern const u8 gSaveStatName_Time[]; +// mail +extern const u8 gText_From[]; + #endif //GUARD_STRINGS_H diff --git a/ld_script.txt b/ld_script.txt index 928176cd1..ef17deaf6 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -175,7 +175,7 @@ SECTIONS { asm/bike.o(.text); asm/easy_chat.o(.text); asm/mon_markings.o(.text); - asm/mail.o(.text); + src/mail.o(.text); src/menu_helpers.o(.text); asm/script_pokemon_util_80BF8FC.o(.text); src/heal_location.o(.text); @@ -437,6 +437,7 @@ SECTIONS { src/battle_anim_utility_funcs.o(.rodata); src/battle_intro.o(.rodata); data/data_835B488.o(.rodata.83E7CFC); + src/mail.o(.rodata); src/heal_location.o(.rodata); data/data_835B488.o(.rodata.83EEC98); src/battle_ai_script_commands.o(.rodata); diff --git a/src/item_use.c b/src/item_use.c index 3a189d84a..98817f2d7 100644 --- a/src/item_use.c +++ b/src/item_use.c @@ -191,7 +191,7 @@ void sub_80A1208(void) struct MailStruct mail; mail.itemId = gSpecialVar_ItemId; - sub_80BEBEC(&mail, CB2_BagMenuFromStartMenu, 0); + ReadMail(&mail, CB2_BagMenuFromStartMenu, 0); } void FieldUseFunc_MachBike(u8 taskId) diff --git a/src/mail.c b/src/mail.c new file mode 100644 index 000000000..f6b7e2c4d --- /dev/null +++ b/src/mail.c @@ -0,0 +1,738 @@ +#include "global.h" +#include "malloc.h" +#include "bg.h" +#include "scanline_effect.h" +#include "palette.h" +#include "gpu_regs.h" +#include "window.h" +#include "text_window.h" +#include "main.h" +#include "easy_chat.h" +#include "mail.h" +#include "task.h" +#include "menu.h" +#include "mail_data.h" +#include "player_pc.h" +#include "overworld.h" +#include "help_system.h" +#include "menu_helpers.h" +#include "new_menu_helpers.h" +#include "graphics.h" +#include "pokemon_icon.h" +#include "string_util.h" +#include "strings.h" +#include "constants/items.h" +#include "constants/species.h" + +enum MailIconParam +{ + MAIL_ICON_NONE = 0, + MAIL_ICON_BEAD, + MAIL_ICON_DREAM +}; + +struct MailEcWordLayout +{ + u32 numWordsInLine:2; + u32 lineXoffset:6; + u32 lineHeight:8; +}; + +struct MailAttrStruct +{ + u8 numRows; + u8 nameY; + u8 nameX; + u8 messageTop; + u8 messageLeft; + const struct MailEcWordLayout * linesLayout; +}; + +struct MailGfxData +{ + const void * pal; + const void * tiles; + const void * map; + u32 size; + u16 textpals[2]; +}; + +struct MailViewResources { + u8 messageLinesBuffer[8][26]; + u8 authorNameBuffer[12]; + void (*savedCallback)(void); + void (*showMailCallback)(void); + struct MailStruct *mail; + bool8 messageExists; + u8 nameX; + u8 mailType; + u8 monIconType; + u8 monIconSpriteId; + u8 unused; + u8 mailArrangementType; + void (*copyEasyChatWord)(u8 *dest, u16 word); + void (*convertEasyChatWordsToString)(u8 *dest, const u16 *src, u16 length1, u16 length2); + const struct MailAttrStruct * messageLayout; + u16 bg1TilemapBuffer[BG_SCREEN_SIZE]; + u16 bg2TilemapBuffer[BG_SCREEN_SIZE]; +}; + +static EWRAM_DATA struct MailViewResources * sMailViewResources = NULL; + +static void CB2_InitMailView(void); +static void BufferMailMessage(void); +static void AddMailMessagePrinters(void); +static void VBlankCB_ShowMail(void); +static void CB2_RunShowMailCB(void); +static void ShowMailCB_WaitFadeIn(void); +static void ShowMailCB_WaitButton(void); +static void ShowMailCB_Teardown(void); + +static const struct BgTemplate sBgTemplates[] = { + { + .bg = 0, + .charBaseIndex = 2, + .mapBaseIndex = 31, + .screenSize = 0, + .paletteMode = 0, + .priority = 0, + .baseTile = 0x000 + }, { + .bg = 1, + .charBaseIndex = 0, + .mapBaseIndex = 30, + .screenSize = 0, + .paletteMode = 0, + .priority = 1, + .baseTile = 0x000 + }, { + .bg = 2, + .charBaseIndex = 0, + .mapBaseIndex = 29, + .screenSize = 0, + .paletteMode = 0, + .priority = 2, + .baseTile = 0x000 + } +}; + +static const struct WindowTemplate sWindowTemplates[] = { + { + .bg = 0, + .tilemapLeft = 3, + .tilemapTop = 4, + .width = 24, + .height = 10, + .paletteNum = 15, + .baseBlock = 0x001 + }, { + .bg = 0, + .tilemapLeft = 15, + .tilemapTop = 15, + .width = 13, + .height = 3, + .paletteNum = 15, + .baseBlock = 0x0F2 + }, DUMMY_WIN_TEMPLATE +}; + +static const u8 sTextColor[] = { 0, 10, 11 }; + +static const u16 sGenderPals[][2] = { + { RGB(13, 22, 26), RGB(05, 13, 20) }, + { RGB(28, 15, 17), RGB(20, 06, 14) } +}; + +static const struct MailGfxData sGfxHeaders[] = { + [ITEM_TO_MAIL(ITEM_ORANGE_MAIL)] = { + .pal = gFile_graphics_mail_orange_palette_pal, + .tiles = gFile_graphics_mail_orange_tiles_sheet, + .map = gFile_graphics_mail_orange_map_tilemap, + .size = 0x2c0, + .textpals = { RGB(10, 10, 10), RGB(25, 25, 25) } + }, + [ITEM_TO_MAIL(ITEM_HARBOR_MAIL)] = { + .pal = gFile_graphics_mail_harbor_palette_pal, + .tiles = gFile_graphics_mail_harbor_tiles_sheet, + .map = gFile_graphics_mail_harbor_map_tilemap, + .size = 0x2e0, + .textpals = { RGB(31, 31, 31), RGB(17, 17, 17) } + }, + [ITEM_TO_MAIL(ITEM_GLITTER_MAIL)] = { + .pal = gFile_graphics_mail_glitter_palette_pal, + .tiles = gFile_graphics_mail_glitter_tiles_sheet, + .map = gFile_graphics_mail_glitter_map_tilemap, + .size = 0x400, + .textpals = { RGB(10, 10, 10), RGB(25, 25, 25) } + }, + [ITEM_TO_MAIL(ITEM_MECH_MAIL)] = { + .pal = gFile_graphics_mail_mech_palette_pal, + .tiles = gFile_graphics_mail_mech_tiles_sheet, + .map = gFile_graphics_mail_mech_map_tilemap, + .size = 0x1e0, + .textpals = { RGB(31, 31, 31), RGB(17, 17, 17) } + }, + [ITEM_TO_MAIL(ITEM_WOOD_MAIL)] = { + .pal = gFile_graphics_mail_wood_palette_pal, + .tiles = gFile_graphics_mail_wood_tiles_sheet, + .map = gFile_graphics_mail_wood_map_tilemap, + .size = 0x2e0, + .textpals = { RGB(31, 31, 31), RGB(17, 17, 17) } + }, + [ITEM_TO_MAIL(ITEM_WAVE_MAIL)] = { + .pal = gFile_graphics_mail_wave_palette_pal, + .tiles = gFile_graphics_mail_wave_tiles_sheet, + .map = gFile_graphics_mail_wave_map_tilemap, + .size = 0x300, + .textpals = { RGB(10, 10, 10), RGB(25, 25, 25) } + }, + [ITEM_TO_MAIL(ITEM_BEAD_MAIL)] = { + .pal = gFile_graphics_mail_bead_palette_pal, + .tiles = gFile_graphics_mail_bead_tiles_sheet, + .map = gFile_graphics_mail_bead_map_tilemap, + .size = 0x140, + .textpals = { RGB(31, 31, 31), RGB(17, 17, 17) } + }, + [ITEM_TO_MAIL(ITEM_SHADOW_MAIL)] = { + .pal = gFile_graphics_mail_shadow_palette_pal, + .tiles = gFile_graphics_mail_shadow_tiles_sheet, + .map = gFile_graphics_mail_shadow_map_tilemap, + .size = 0x300, + .textpals = { RGB(31, 31, 31), RGB(17, 17, 17) } + }, + [ITEM_TO_MAIL(ITEM_TROPIC_MAIL)] = { + .pal = gFile_graphics_mail_tropic_palette_pal, + .tiles = gFile_graphics_mail_tropic_tiles_sheet, + .map = gFile_graphics_mail_tropic_map_tilemap, + .size = 0x220, + .textpals = { RGB(10, 10, 10), RGB(25, 25, 25) } + }, + [ITEM_TO_MAIL(ITEM_DREAM_MAIL)] = { + .pal = gFile_graphics_mail_dream_palette_pal, + .tiles = gFile_graphics_mail_dream_tiles_sheet, + .map = gFile_graphics_mail_dream_map_tilemap, + .size = 0x340, + .textpals = { RGB(10, 10, 10), RGB(25, 25, 25) } + }, + [ITEM_TO_MAIL(ITEM_FAB_MAIL)] = { + .pal = gFile_graphics_mail_fab_palette_pal, + .tiles = gFile_graphics_mail_fab_tiles_sheet, + .map = gFile_graphics_mail_fab_map_tilemap, + .size = 0x2a0, + .textpals = { RGB(10, 10, 10), RGB(25, 25, 25) } + }, + [ITEM_TO_MAIL(ITEM_RETRO_MAIL)] = { + .pal = gFile_graphics_mail_retro_palette_pal, + .tiles = gFile_graphics_mail_retro_tiles_sheet, + .map = gFile_graphics_mail_retro_map_tilemap, + .size = 0x520, + .textpals = { RGB(10, 10, 10), RGB(25, 25, 25) } + } +}; + +static const struct MailEcWordLayout sLayout_3x3[] = { + { .numWordsInLine = 3, .lineXoffset = 0, .lineHeight = 16 }, + { .numWordsInLine = 3, .lineXoffset = 0, .lineHeight = 16 }, + { .numWordsInLine = 3, .lineXoffset = 0, .lineHeight = 16 } +}; + +static const struct MailAttrStruct sMessageLayouts_3x3[] = { + [ITEM_TO_MAIL(ITEM_ORANGE_MAIL)] = { + .numRows = 3, + .nameY = 0, + .nameX = 0, + .messageTop = 2, + .messageLeft = 4, + .linesLayout = sLayout_3x3 + }, + [ITEM_TO_MAIL(ITEM_HARBOR_MAIL)] = { + .numRows = 3, + .nameY = 0, + .nameX = 0, + .messageTop = 2, + .messageLeft = 4, + .linesLayout = sLayout_3x3 + }, + [ITEM_TO_MAIL(ITEM_GLITTER_MAIL)] = { + .numRows = 3, + .nameY = 0, + .nameX = 0, + .messageTop = 2, + .messageLeft = 4, + .linesLayout = sLayout_3x3 + }, + [ITEM_TO_MAIL(ITEM_MECH_MAIL)] = { + .numRows = 3, + .nameY = 0, + .nameX = 0, + .messageTop = 2, + .messageLeft = 4, + .linesLayout = sLayout_3x3 + }, + [ITEM_TO_MAIL(ITEM_WOOD_MAIL)] = { + .numRows = 3, + .nameY = 0, + .nameX = 0, + .messageTop = 2, + .messageLeft = 4, + .linesLayout = sLayout_3x3 + }, + [ITEM_TO_MAIL(ITEM_WAVE_MAIL)] = { + .numRows = 3, + .nameY = 0, + .nameX = 0, + .messageTop = 2, + .messageLeft = 4, + .linesLayout = sLayout_3x3 + }, + [ITEM_TO_MAIL(ITEM_BEAD_MAIL)] = { + .numRows = 3, + .nameY = 0, + .nameX = 0, + .messageTop = 2, + .messageLeft = 4, + .linesLayout = sLayout_3x3 + }, + [ITEM_TO_MAIL(ITEM_SHADOW_MAIL)] = { + .numRows = 3, + .nameY = 0, + .nameX = 0, + .messageTop = 2, + .messageLeft = 4, + .linesLayout = sLayout_3x3 + }, + [ITEM_TO_MAIL(ITEM_TROPIC_MAIL)] = { + .numRows = 3, + .nameY = 0, + .nameX = 0, + .messageTop = 2, + .messageLeft = 4, + .linesLayout = sLayout_3x3 + }, + [ITEM_TO_MAIL(ITEM_DREAM_MAIL)] = { + .numRows = 3, + .nameY = 0, + .nameX = 0, + .messageTop = 2, + .messageLeft = 4, + .linesLayout = sLayout_3x3 + }, + [ITEM_TO_MAIL(ITEM_FAB_MAIL)] = { + .numRows = 3, + .nameY = 8, + .nameX = 0, + .messageTop = 2, + .messageLeft = 4, + .linesLayout = sLayout_3x3 + }, + [ITEM_TO_MAIL(ITEM_RETRO_MAIL)] = { + .numRows = 3, + .nameY = 0, + .nameX = 0, + .messageTop = 2, + .messageLeft = 0, + .linesLayout = sLayout_3x3 + }, +}; + +static const struct MailEcWordLayout sLayout_5x2[] = { + { .numWordsInLine = 2, .lineXoffset = 0, .lineHeight = 16 }, + { .numWordsInLine = 2, .lineXoffset = 0, .lineHeight = 16 }, + { .numWordsInLine = 2, .lineXoffset = 0, .lineHeight = 16 }, + { .numWordsInLine = 2, .lineXoffset = 0, .lineHeight = 16 }, + { .numWordsInLine = 1, .lineXoffset = 0, .lineHeight = 16 } +}; + +static const struct MailAttrStruct sMessageLayouts_5x2[] = { + [ITEM_TO_MAIL(ITEM_ORANGE_MAIL)] = { + .numRows = 5, + .nameY = 0, + .nameX = 8, + .messageTop = 3, + .messageLeft = 8, + .linesLayout = sLayout_5x2 + }, + [ITEM_TO_MAIL(ITEM_HARBOR_MAIL)] = { + .numRows = 5, + .nameY = 3, + .nameX = 14, + .messageTop = 3, + .messageLeft = 8, + .linesLayout = sLayout_5x2 + }, + [ITEM_TO_MAIL(ITEM_GLITTER_MAIL)] = { + .numRows = 5, + .nameY = 0, + .nameX = 16, + .messageTop = 3, + .messageLeft = 8, + .linesLayout = sLayout_5x2 + }, + [ITEM_TO_MAIL(ITEM_MECH_MAIL)] = { + .numRows = 5, + .nameY = 0, + .nameX = 14, + .messageTop = 3, + .messageLeft = 8, + .linesLayout = sLayout_5x2 + }, + [ITEM_TO_MAIL(ITEM_WOOD_MAIL)] = { + .numRows = 5, + .nameY = 3, + .nameX = 12, + .messageTop = 3, + .messageLeft = 8, + .linesLayout = sLayout_5x2 + }, + [ITEM_TO_MAIL(ITEM_WAVE_MAIL)] = { + .numRows = 5, + .nameY = 0, + .nameX = 18, + .messageTop = 3, + .messageLeft = 8, + .linesLayout = sLayout_5x2 + }, + [ITEM_TO_MAIL(ITEM_BEAD_MAIL)] = { + .numRows = 5, + .nameY = 0, + .nameX = 20, + .messageTop = 3, + .messageLeft = 8, + .linesLayout = sLayout_5x2 + }, + [ITEM_TO_MAIL(ITEM_SHADOW_MAIL)] = { + .numRows = 5, + .nameY = 6, + .nameX = 20, + .messageTop = 3, + .messageLeft = 8, + .linesLayout = sLayout_5x2 + }, + [ITEM_TO_MAIL(ITEM_TROPIC_MAIL)] = { + .numRows = 5, + .nameY = 0, + .nameX = 16, + .messageTop = 3, + .messageLeft = 8, + .linesLayout = sLayout_5x2 + }, + [ITEM_TO_MAIL(ITEM_DREAM_MAIL)] = { + .numRows = 5, + .nameY = 0, + .nameX = 14, + .messageTop = 3, + .messageLeft = 8, + .linesLayout = sLayout_5x2 + }, + [ITEM_TO_MAIL(ITEM_FAB_MAIL)] = { + .numRows = 5, + .nameY = 8, + .nameX = 16, + .messageTop = 3, + .messageLeft = 8, + .linesLayout = sLayout_5x2 + }, + [ITEM_TO_MAIL(ITEM_RETRO_MAIL)] = { + .numRows = 5, + .nameY = 0, + .nameX = 16, + .messageTop = 3, + .messageLeft = 8, + .linesLayout = sLayout_5x2 + }, +}; + +void ReadMail(struct MailStruct * mail, void (*savedCallback)(void), bool8 messageExists) +{ + u16 sp0; + u16 species; + sMailViewResources = AllocZeroed(sizeof(struct MailViewResources)); + sMailViewResources->unused = 2; + sMailViewResources->mailArrangementType = 1; + sMailViewResources->copyEasyChatWord = CopyEasyChatWord; + sMailViewResources->convertEasyChatWordsToString = ConvertEasyChatWordsToString; + if (IS_ITEM_MAIL(mail->itemId)) + { + sMailViewResources->mailType = ITEM_TO_MAIL(mail->itemId); + } + else + { + sMailViewResources->mailType = ITEM_TO_MAIL(ITEM_ORANGE_MAIL); + messageExists = FALSE; + } + switch (sMailViewResources->mailArrangementType) + { + case 0: + default: + sMailViewResources->messageLayout = &sMessageLayouts_3x3[sMailViewResources->mailType]; + break; + case 1: + sMailViewResources->messageLayout = &sMessageLayouts_5x2[sMailViewResources->mailType]; + break; + } + species = MailSpeciesToSpecies(mail->species, &sp0); + if (species != SPECIES_NONE && species < NUM_SPECIES) + { + switch (sMailViewResources->mailType) + { + default: + sMailViewResources->monIconType = MAIL_ICON_NONE; + break; + case ITEM_TO_MAIL(ITEM_BEAD_MAIL): + sMailViewResources->monIconType = MAIL_ICON_BEAD; + break; + case ITEM_TO_MAIL(ITEM_DREAM_MAIL): + sMailViewResources->monIconType = MAIL_ICON_DREAM; + break; + } + } + else + { + sMailViewResources->monIconType = MAIL_ICON_NONE; + } + sMailViewResources->mail = mail; + sMailViewResources->savedCallback = savedCallback; + sMailViewResources->messageExists = messageExists; + SetMainCallback2(CB2_InitMailView); +} + +static bool8 DoInitMailView(void) +{ + u16 iconId; + + switch (gMain.state) + { + case 0: + SetVBlankCallback(NULL); + ScanlineEffect_Stop(); + SetGpuReg(REG_OFFSET_DISPCNT, 0); + if (gPlayerPcMenuManager.unk_9 == 0) + HelpSystem_SetSomeVariable2(34); + else + HelpSystem_SetSomeVariable2(30); + break; + case 1: + CpuFill16(0, (void *)OAM, OAM_SIZE); + break; + case 2: + ResetPaletteFade(); + break; + case 3: + ResetTasks(); + break; + case 4: + ResetSpriteData(); + break; + case 5: + FreeAllSpritePalettes(); + ResetTempTileDataBuffers(); + SetGpuReg(REG_OFFSET_BG0HOFS, 0); + SetGpuReg(REG_OFFSET_BG0VOFS, 0); + SetGpuReg(REG_OFFSET_BG1HOFS, 0); + SetGpuReg(REG_OFFSET_BG1VOFS, 0); + SetGpuReg(REG_OFFSET_BG2VOFS, 0); + SetGpuReg(REG_OFFSET_BG2HOFS, 0); + SetGpuReg(REG_OFFSET_BG3HOFS, 0); + SetGpuReg(REG_OFFSET_BG3VOFS, 0); + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + break; + case 6: + ResetBgsAndClearDma3BusyFlags(FALSE); + InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates)); + SetBgTilemapBuffer(1, sMailViewResources->bg1TilemapBuffer); + SetBgTilemapBuffer(2, sMailViewResources->bg2TilemapBuffer); + break; + case 7: + InitWindows(sWindowTemplates); + DeactivateAllTextPrinters(); + break; + case 8: + DecompressAndCopyTileDataToVram(1, sGfxHeaders[sMailViewResources->mailType].tiles, 0, 0x000, 0); + break; + case 9: + if (FreeTempTileDataBuffersIfPossible()) + return FALSE; + break; + case 10: + FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20); + FillBgTilemapBufferRect_Palette0(2, 0x001, 0, 0, 30, 20); + CopyToBgTilemapBuffer(1, sGfxHeaders[sMailViewResources->mailType].map, 0, 0x000); + break; + case 11: + CopyBgTilemapBufferToVram(0); + CopyBgTilemapBufferToVram(1); + CopyBgTilemapBufferToVram(2); + break; + case 12: + LoadPalette(stdpal_get(0), 0xF0, 0x20); + gPlttBufferUnfaded[15 * 16 + 10] = sGfxHeaders[sMailViewResources->mailType].textpals[0]; + gPlttBufferFaded[15 * 16 + 10] = sGfxHeaders[sMailViewResources->mailType].textpals[0]; + gPlttBufferUnfaded[15 * 16 + 11] = sGfxHeaders[sMailViewResources->mailType].textpals[1]; + gPlttBufferFaded[15 * 16 + 11] = sGfxHeaders[sMailViewResources->mailType].textpals[1]; + LoadPalette(sGfxHeaders[sMailViewResources->mailType].pal, 0x00, 0x20); + gPlttBufferUnfaded[0 * 16 + 10] = sGenderPals[gSaveBlock2Ptr->playerGender][0]; + gPlttBufferFaded[0 * 16 + 10] = sGenderPals[gSaveBlock2Ptr->playerGender][0]; + gPlttBufferUnfaded[0 * 16 + 11] = sGenderPals[gSaveBlock2Ptr->playerGender][1]; + gPlttBufferFaded[0 * 16 + 11] = sGenderPals[gSaveBlock2Ptr->playerGender][1]; + break; + case 13: + if (sMailViewResources->messageExists) + BufferMailMessage(); + break; + case 14: + if (sMailViewResources->messageExists) + { + AddMailMessagePrinters(); + RunTextPrinters(); + } + break; + case 15: + if (sub_8058244() == TRUE) + return FALSE; + break; + case 16: + SetVBlankCallback(VBlankCB_ShowMail); + gPaletteFade.bufferTransferDisabled = TRUE; + break; + case 17: + iconId = sub_8096FD4(sMailViewResources->mail->species); + switch (sMailViewResources->monIconType) + { + case MAIL_ICON_BEAD: + sub_80970E0(iconId); + sMailViewResources->monIconSpriteId = sub_8096ECC(iconId, SpriteCallbackDummy, 0x60, 0x80, 0, FALSE); + break; + case MAIL_ICON_DREAM: + sub_80970E0(iconId); + sMailViewResources->monIconSpriteId = sub_8096ECC(iconId, SpriteCallbackDummy, 0x28, 0x80, 0, FALSE); + break; + } + break; + case 18: + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); + ShowBg(0); + ShowBg(1); + ShowBg(2); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + gPaletteFade.bufferTransferDisabled = FALSE; + sMailViewResources->showMailCallback = ShowMailCB_WaitFadeIn; + return TRUE; + default: + return FALSE; + } + gMain.state++; + return FALSE; +} + +static void CB2_InitMailView(void) +{ + do + { + if (DoInitMailView() == TRUE) + { + SetMainCallback2(CB2_RunShowMailCB); + break; + } + } while (MenuHelpers_LinkSomething() != TRUE); +} + +static void BufferMailMessage(void) +{ + u16 i; + u8 j = 0; + for (i = 0; i < sMailViewResources->messageLayout->numRows; i++) + { + ConvertEasyChatWordsToString(sMailViewResources->messageLinesBuffer[i], &sMailViewResources->mail->words[j], sMailViewResources->messageLayout->linesLayout[i].numWordsInLine, 1); + j += sMailViewResources->messageLayout->linesLayout[i].numWordsInLine; + } + if (sMailViewResources->mailArrangementType == 0) + { + StringCopy(StringCopy(sMailViewResources->authorNameBuffer, sMailViewResources->mail->playerName), gText_From); // ??? + sMailViewResources->nameX = sMailViewResources->messageLayout->nameX + 0x60 - 8 * StringLength(sMailViewResources->authorNameBuffer); + } + else + { + StringCopy(sMailViewResources->authorNameBuffer, sMailViewResources->mail->playerName); + if (StringLength(sMailViewResources->authorNameBuffer) < 6) + ConvertInternationalString(sMailViewResources->authorNameBuffer, LANGUAGE_JAPANESE); + sMailViewResources->nameX = sMailViewResources->messageLayout->nameX; + } +} + +static void AddMailMessagePrinters(void) +{ + u8 y = 0; + u16 i; + u32 width; + + PutWindowTilemap(0); + PutWindowTilemap(1); + FillWindowPixelBuffer(0, PIXEL_FILL(0)); + FillWindowPixelBuffer(1, PIXEL_FILL(0)); + for (i = 0; i < sMailViewResources->messageLayout->numRows; i++) + { + if (sMailViewResources->messageLinesBuffer[i][0] != EOS && sMailViewResources->messageLinesBuffer[i][0] != CHAR_SPACE) + { + AddTextPrinterParameterized3(0, 1, sMailViewResources->messageLayout->linesLayout[i].lineXoffset + sMailViewResources->messageLayout->messageLeft, y + sMailViewResources->messageLayout->messageTop, sTextColor, 0, sMailViewResources->messageLinesBuffer[i]); + y += sMailViewResources->messageLayout->linesLayout[i].lineHeight; + } + } + width = GetStringWidth(1, gText_From, 0); + AddTextPrinterParameterized3(1, 1, sMailViewResources->nameX, sMailViewResources->messageLayout->nameY, sTextColor, 0, gText_From); + AddTextPrinterParameterized3(1, 1, sMailViewResources->nameX + width, sMailViewResources->messageLayout->nameY, sTextColor, 0, sMailViewResources->authorNameBuffer); + CopyWindowToVram(0, 3); + CopyWindowToVram(1, 3); +} + +static void VBlankCB_ShowMail(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void CB2_RunShowMailCB(void) +{ + if (sMailViewResources->monIconType != MAIL_ICON_NONE) + { + AnimateSprites(); + BuildOamBuffer(); + } + sMailViewResources->showMailCallback(); +} + +static void ShowMailCB_WaitFadeIn(void) +{ + if (!UpdatePaletteFade()) + sMailViewResources->showMailCallback = ShowMailCB_WaitButton; +} + +static void ShowMailCB_WaitButton(void) +{ + if (JOY_NEW(A_BUTTON | B_BUTTON)) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + sMailViewResources->showMailCallback = ShowMailCB_Teardown; + } +} + +static void ShowMailCB_Teardown(void) +{ + if (!UpdatePaletteFade()) + { + SetMainCallback2(sMailViewResources->savedCallback); + switch (sMailViewResources->monIconType) + { + case MAIL_ICON_BEAD: + case MAIL_ICON_DREAM: + sub_8097168(sub_8096FD4(sMailViewResources->mail->species)); + sub_8097070(&gSprites[sMailViewResources->monIconSpriteId]); + break; + } + *sMailViewResources = (struct MailViewResources){}; + ResetPaletteFade(); + FreeAllWindowBuffers(); + FREE_AND_SET_NULL(sMailViewResources); + } +} diff --git a/src/player_pc.c b/src/player_pc.c index b1929b9ed..bb073e3a6 100644 --- a/src/player_pc.c +++ b/src/player_pc.c @@ -566,7 +566,7 @@ static void Task_WaitFadeAndReadSelectedMail(u8 taskId) { MailboxPC_DestroyListMenuBuffer(); CleanupOverworldWindowsAndTilemaps(); - sub_80BEBEC(&SELECTED_MAIL, CB2_SetCbToReturnToMailbox, 1); + ReadMail(&SELECTED_MAIL, CB2_SetCbToReturnToMailbox, 1); DestroyTask(taskId); } } diff --git a/sym_ewram.txt b/sym_ewram.txt index 0633da5bf..f837f1ae0 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -869,9 +869,9 @@ gUnknown_20399BC: @ 20399BC gUnknown_20399C0: @ 20399C0 .space 0x4 -gUnknown_20399C4: @ 20399C4 - .space 0x4 - + .align 2 + .include "src/mail.o" + .align 2 .include "src/menu_helpers.o" .align 2 |