diff --git a/asm/macros/scrcmd.inc b/asm/macros/scrcmd.inc index ace0b42186..58d9cfb0ab 100644 --- a/asm/macros/scrcmd.inc +++ b/asm/macros/scrcmd.inc @@ -2508,9 +2508,9 @@ .short SCRCMD_1B3 .endm - .macro ScrCmd_1B4 arg0 - .short SCRCMD_1B4 - .short \arg0 + .macro CountMailInMailbox destVar + .short SCRCMD_COUNTMAILINMAILBOX + .short \destVar .endm .macro StartRankingsMachine machineID diff --git a/generated/game_records.txt b/generated/game_records.txt index 5131061978..960256c3c4 100644 --- a/generated/game_records.txt +++ b/generated/game_records.txt @@ -43,7 +43,7 @@ RECORD_FAINTED_IN_BATTLE RECORD_UNK_042 RECORD_UNK_043 RECORD_UNK_044 -RECORD_UNK_045 +RECORD_TIMES_MAIL_WRITTEN RECORD_UNK_046 RECORD_SPHERES_BURIED RECORD_WATCHED_TV diff --git a/generated/text_banks.txt b/generated/text_banks.txt index f5412df16b..c7cdf8a5cd 100644 --- a/generated/text_banks.txt +++ b/generated/text_banks.txt @@ -407,7 +407,7 @@ TEXT_BANK_ACUITY_LAKEFRONT TEXT_BANK_SAVE_CORRUPTED TEXT_BANK_UNK_0407 TEXT_BANK_MAILBOX -TEXT_BANK_UNK_0409 +TEXT_BANK_MAIL TEXT_BANK_UNK_0410 TEXT_BANK_UNK_0411 TEXT_BANK_SPECIES_NAME diff --git a/generated/trainer_score_events.txt b/generated/trainer_score_events.txt index 6d52dc63c1..d53450cdf5 100644 --- a/generated/trainer_score_events.txt +++ b/generated/trainer_score_events.txt @@ -1,6 +1,6 @@ TRAINER_SCORE_EVENT_BERRY_HARVESTED TRAINER_SCORE_EVENT_HONEY_USED -TRAINER_SCORE_EVENT_UNK_02 +TRAINER_SCORE_EVENT_MAIL_WRITTEN TRAINER_SCORE_EVENT_TV_INTERVIEW_GIVEN TRAINER_SCORE_EVENT_SIGNED_TRAINER_CARD TRAINER_SCORE_EVENT_UNK_05 diff --git a/include/applications/mail.h b/include/applications/mail.h new file mode 100644 index 0000000000..1b60e64974 --- /dev/null +++ b/include/applications/mail.h @@ -0,0 +1,54 @@ +#ifndef POKEPLATINUM_APPLICATIONS_MAIL_H +#define POKEPLATINUM_APPLICATIONS_MAIL_H + +#include "struct_defs/sentence.h" + +#include "game_options.h" +#include "mail.h" +#include "pokemon.h" +#include "savedata.h" +#include "string_gf.h" + +typedef struct MailAppArgs { + u16 writeMode; + u8 padding[2]; + BOOL mailWritten; + enum MailContext contextUnused; + u16 mailboxSlotUnused; + u8 partySlotUnused; + u8 mailType; + SaveData *saveData; + Mail *mail; + Mailbox *mailbox; +} MailAppArgs; + +typedef struct MailViewerAppArgs { + union { + u16 writeMode; + u16 result; + }; + u8 sentenceIndex; + u8 horizontalSelectionIndex; + Options *options; + u32 trainerID; + u8 padding; + u8 language; + u8 gameVersion; + u8 mailType; + String *trainerName; + MailIconData iconData[MAIL_MAX_ICONS]; + Sentence sentences[MAIL_MAX_SENTENCES]; +} MailViewerAppArgs; + +MailAppArgs *MailAppArgs_New_Write(SaveData *saveData, enum MailContext context, u8 partySlot, u8 mailType, enum HeapID heapID); +MailAppArgs *MailAppArgs_New_ReadFromMailbox(SaveData *saveData, enum MailContext context, u16 mailboxSlot, enum HeapID heapID); +MailAppArgs *MailAppArgs_New_ReadHeld(SaveData *saveData, Pokemon *mon, enum HeapID heapID); +MailAppArgs *MailAppArgs_New_Check(SaveData *saveData, u8 mailType, enum HeapID heapID); +BOOL MailApp_WasMailWritten(MailAppArgs *args); +BOOL MailApp_CopyWrittenMailToMailboxSlot(MailAppArgs *args, enum MailContext context, u8 slot); +BOOL MailApp_AddWrittenMailToMon(MailAppArgs *args, Pokemon *mon); +void MailAppArgs_Free(MailAppArgs *args); +int Mail_TransferFromMonToMailbox(Mailbox *mailbox, Pokemon *mon, enum HeapID heapID); +int Mail_TransferFromMailboxToMon(Mailbox *mailbox, u16 slot, Pokemon *mon, enum HeapID heapID); + +#endif // POKEPLATINUM_APPLICATIONS_MAIL_H diff --git a/include/applications/mail_viewer.h b/include/applications/mail_viewer.h new file mode 100644 index 0000000000..27007d3d61 --- /dev/null +++ b/include/applications/mail_viewer.h @@ -0,0 +1,18 @@ +#ifndef POKEPLATINUM_APPLICATIONS_MAIL_VIEWER_H +#define POKEPLATINUM_APPLICATIONS_MAIL_VIEWER_H + +#include "overlay_manager.h" + +enum MailViewerResult { + MAIL_VIEWER_RESULT_EDIT_SENTENCE_1 = 0, + MAIL_VIEWER_RESULT_EDIT_SENTENCE_2, + MAIL_VIEWER_RESULT_EDIT_SENTENCE_3, + MAIL_VIEWER_RESULT_CONFIRM, + MAIL_VIEWER_RESULT_CANCEL = 0xFFFF, +}; + +BOOL MailViewer_Init(ApplicationManager *appMan, int *state); +BOOL MailViewer_Main(ApplicationManager *appMan, int *state); +BOOL MailViewer_Exit(ApplicationManager *appMan, int *state); + +#endif // POKEPLATINUM_APPLICATIONS_MAIL_VIEWER_H diff --git a/include/applications/party_menu/defs.h b/include/applications/party_menu/defs.h index 65b022f7a4..bec5dd6ac0 100644 --- a/include/applications/party_menu/defs.h +++ b/include/applications/party_menu/defs.h @@ -5,7 +5,6 @@ #include "constants/pokemon.h" #include "struct_defs/function_ptr_pair.h" -#include "struct_defs/mail.h" #include "struct_defs/tv.h" #include "field/field_system_decl.h" @@ -19,6 +18,7 @@ #include "g3d_pipeline.h" #include "game_options.h" #include "grid_menu_cursor_position.h" +#include "mail.h" #include "menu.h" #include "message.h" #include "particle_system.h" @@ -77,7 +77,7 @@ enum PartyMenuExitCodes { PARTY_MENU_EXIT_CODE_GIVE_ITEM, PARTY_MENU_EXIT_CODE_OVERWRITE_MOVE_TM_HM, PARTY_MENU_EXIT_CODE_OVERWRITE_MOVE_LEVEL_UP, - PARTY_MENU_EXIT_CODE_MAIL, + PARTY_MENU_EXIT_CODE_WRITE_MAIL, PARTY_MENU_EXIT_CODE_READ_MAIL, PARTY_MENU_EXIT_CODE_EVOLVE_BY_ITEM, PARTY_MENU_EXIT_CODE_EVOLVE_BY_LEVEL, diff --git a/include/constants/heap.h b/include/constants/heap.h index ecc2ae05fb..ef9f4f39fb 100644 --- a/include/constants/heap.h +++ b/include/constants/heap.h @@ -42,8 +42,8 @@ enum HeapID { HEAP_ID_POKEDEX, HEAP_ID_OPTIONS_MENU, HEAP_ID_DRAWING, - HEAP_ID_40, - HEAP_ID_41, + HEAP_ID_MAIL, + HEAP_ID_MAIL_VIEWER, HEAP_ID_JOURNAL, HEAP_ID_43, HEAP_ID_POFFIN_CASE, @@ -160,6 +160,8 @@ enum HeapSize { HEAP_SIZE_DISTORTION_WORLD_WARP = 0x50000, HEAP_SIZE_UNDERGROUND = 0xE800, HEAP_SIZE_DRAWING = 0x40000, + HEAP_SIZE_MAIL = 0x1000, + HEAP_SIZE_MAIL_VIEWER = 0x20000, HEAP_SIZE_BOAT_CUTSCENE = 0x20000, HEAP_SIZE_EVOLUTION = 0x30000, HEAP_SIZE_GAME_START = 0x20000, diff --git a/include/constants/items.h b/include/constants/items.h index 16c611738d..e39ac5e5a5 100644 --- a/include/constants/items.h +++ b/include/constants/items.h @@ -51,7 +51,7 @@ #define FIRST_MAIL_IDX ITEM_GRASS_MAIL #define LAST_MAIL_IDX ITEM_BRICK_MAIL -#define NUM_MAILS (LAST_MAIL_IDX - FIRST_MAIL_IDX + 1) +#define NUM_MAIL_TYPES (LAST_MAIL_IDX - FIRST_MAIL_IDX + 1) #define MAIL_ID(__name) (ITEM_##__name##_MAIL - FIRST_MAIL_IDX) #define FIRST_BERRY_IDX ITEM_CHERI_BERRY diff --git a/include/data/scripts/scrcmd.h b/include/data/scripts/scrcmd.h index e85a95fcb8..fd301551d3 100644 --- a/include/data/scripts/scrcmd.h +++ b/include/data/scripts/scrcmd.h @@ -441,7 +441,7 @@ ScriptCommand(SCRCMD_STOREPARTYMONINTODAYCARE, ScrCm ScriptCommand(SCRCMD_SHOWOBJECT, ScrCmd_ShowObject) ScriptCommand(SCRCMD_HIDEOBJECT, ScrCmd_HideObject) ScriptCommand(SCRCMD_1B3, ScrCmd_1B3) -ScriptCommand(SCRCMD_1B4, ScrCmd_1B4) +ScriptCommand(SCRCMD_COUNTMAILINMAILBOX, ScrCmd_CountMailInMailbox) ScriptCommand(SCRCMD_STARTRANKINGSMACHINE, ScrCmd_StartRankingsMachine) ScriptCommand(SCRCMD_GETTIMEOFDAY, ScrCmd_GetTimeOfDay) ScriptCommand(SCRCMD_GETRANDOM, ScrCmd_GetRandom) diff --git a/include/item.h b/include/item.h index 4af295b52c..bfc36f451c 100644 --- a/include/item.h +++ b/include/item.h @@ -275,20 +275,20 @@ u8 Item_TMHMNumber(u16 item); u8 Item_IsMail(u16 item); /** - * @brief Get the mail number for a given item. + * @brief Get the mail type for a given item. * * @param item - * @return The mail number for the item, or ITEM_NONE if the item is not mail. + * @return The mail type for the item, or ITEM_NONE if the item is not mail. */ -u8 Item_MailNumber(u16 item); +u8 Item_GetMailType(u16 item); /** - * @brief Get the item for a given mail number. + * @brief Get the item for a given mail type. * * @param mail - * @return The item for the mail number, or ITEM_NONE if none exists. + * @return The item for the mail type, or ITEM_NONE if none exists. */ -u16 Item_ForMailNumber(u8 mail); +u16 Item_ForMailType(u8 mailType); /** * @brief Check if a given item is a berry. diff --git a/include/mail.h b/include/mail.h index e8fbf42b61..52e86f0062 100644 --- a/include/mail.h +++ b/include/mail.h @@ -1,34 +1,83 @@ #ifndef POKEPLATINUM_MAIL_H #define POKEPLATINUM_MAIL_H -#include "struct_defs/mail.h" +#include "constants/string.h" +#include "struct_defs/sentence.h" + +#include "charcode.h" #include "savedata.h" -void Mail_Init(Mail *mail); -BOOL Mail_IsEmpty(Mail *mail); +#define MAIL_TYPE_NONE 0xFFFF + +#define MAIL_MON_ICON_NONE 0xFFFF + +#define MAIL_MAX_SENTENCES 3 +#define MAIL_MAX_ICONS 3 + +#define MAILBOX_SIZE 20 + +enum MailContext { + MAIL_CONTEXT_MAILBOX = 0, + MAIL_CONTEXT_1_UNUSED, + MAIL_CONTEXT_WRITE, + MAIL_CONTEXT_CHECK, +}; + +enum MailIconDataType { + ICON_DATA_SPRITE_INDEX = 0, + ICON_DATA_PLTT_INDEX, + ICON_DATA_VALUE, +}; + +typedef union MailIconData { + struct { + u16 spriteIndex : 12; + u16 palIndex : 4; + } asStruct; + u16 asValue; +} MailIconData; + +typedef struct Mail { + u32 trainerID; + u8 trainerGender; + u8 language; + u8 gameVersion; + u8 mailType; + charcode_t trainerName[TRAINER_NAME_LEN + 1]; + MailIconData iconData[MAIL_MAX_ICONS]; + u16 platExclusiveFormIcons; + Sentence sentences[MAIL_MAX_SENTENCES]; +} Mail; + +typedef struct Mailbox { + Mail mail[MAILBOX_SIZE]; +} Mailbox; + +void Mail_Reset(Mail *mail); +BOOL Mail_IsValid(Mail *mail); Mail *Mail_New(enum HeapID heapID); void Mail_Copy(Mail *src, Mail *dest); -void sub_020281AC(Mail *mail, u8 mailType, u8 param2, SaveData *saveData); +void Mail_SetTrainerAndIconData(Mail *mail, u8 mailType, u8 selectedPartySlot, SaveData *saveData); u32 Mail_GetTrainerID(const Mail *mail); -u16 *Mail_GetTrainerName(Mail *mail); +charcode_t *Mail_GetTrainerName(Mail *mail); u8 Mail_GetTrainerGender(const Mail *mail); u8 Mail_GetMailType(const Mail *mail); void Mail_SetMailType(Mail *mail, const u8 mailType); u8 Mail_GetLanguage(const Mail *mail); u8 Mail_GetGameVersion(const Mail *mail); -u16 sub_02028328(const Mail *param0, u8 param1, u8 param2, u16 param3); -u16 sub_02028408(const Mail *param0); -Sentence *sub_0202840C(Mail *param0, u8 param1); -void sub_0202841C(Mail *param0, Sentence *param1, u8 param2); +u16 Mail_GetIconData(const Mail *mail, u8 index, enum MailIconDataType type, u16 platExclusiveFormIcons); +u16 Mail_GetPlatExclusiveFormIcons(const Mail *mail); +Sentence *Mail_GetSentence(Mail *mail, u8 index); +void Mail_SetSentence(Mail *mail, Sentence *sentence, u8 index); Mailbox *SaveData_GetMailbox(SaveData *saveData); int Mailbox_SaveSize(void); void Mailbox_Init(Mailbox *mailbox); -int Mail_GetEmptySlotInArray(Mailbox *mailbox, int param1); -void sub_02028470(Mailbox *mailbox, int param1, int slot); -void Mailbox_CopyMailToSlot(Mailbox *mailbox, int param1, int slot, Mail *src); -int sub_02028494(Mailbox *mailbox, int param1); -Mail *sub_020284A8(Mailbox *mailbox, int param1, int slot, enum HeapID heapID); -void sub_020284CC(Mailbox *mailbox, int param1, int param2, Mail *param3); +int Mail_GetEmptyMailSlot(Mailbox *mailbox, enum MailContext context); +void Mailbox_ClearMailAtSlot(Mailbox *mailbox, enum MailContext context, int slot); +void Mailbox_CopyMailToSlot(Mailbox *mailbox, enum MailContext context, int slot, Mail *src); +int Mailbox_CountMail(Mailbox *mailbox, enum MailContext context); +Mail *Mailbox_CopyMailAtSlot(Mailbox *mailbox, enum MailContext context, int slot, enum HeapID heapID); +void Mailbox_GetMailAtSlot(Mailbox *mailbox, enum MailContext context, int slot, Mail *out); #endif // POKEPLATINUM_MAIL_H diff --git a/include/overlay075/ov75_021D0D80.h b/include/overlay075/ov75_021D0D80.h deleted file mode 100644 index e201ebc06d..0000000000 --- a/include/overlay075/ov75_021D0D80.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef POKEPLATINUM_OV75_021D0D80_H -#define POKEPLATINUM_OV75_021D0D80_H - -#include "overlay_manager.h" - -int ov75_021D0D80(ApplicationManager *appMan, int *param1); -int ov75_021D0DF8(ApplicationManager *appMan, int *param1); -int ov75_021D0E10(ApplicationManager *appMan, int *param1); - -#endif // POKEPLATINUM_OV75_021D0D80_H diff --git a/include/start_menu.h b/include/start_menu.h index 159b3bd76a..f7d9fba499 100644 --- a/include/start_menu.h +++ b/include/start_menu.h @@ -1,5 +1,5 @@ -#ifndef POKEPLATINUM_UNK_0203A9C8_H -#define POKEPLATINUM_UNK_0203A9C8_H +#ifndef POKEPLATINUM_START_MENU_H +#define POKEPLATINUM_START_MENU_H #include "field/field_system_decl.h" #include "overlay005/sprite_resource_manager.h" @@ -53,6 +53,13 @@ enum StartMenuState { START_MENU_STATE_SAVED, }; +enum MailUsageType { + MAIL_GIVE_FROM_PARTY_MENU = 0, + MAIL_GIVE_FROM_BAG, + MAIL_READ_FROM_PARTY_MENU, + MAIL_READ_FROM_BAG, +}; + extern const u8 gAllSummaryScreenPages[]; BOOL FieldSystem_IsInValidLocation(FieldSystem *fieldSystem); @@ -65,10 +72,10 @@ BOOL StartMenu_ExitPartyMenu(FieldTask *fieldTask); BOOL StartMenu_ExitTownMap(FieldTask *fieldTask); BOOL StartMenu_FlyDestinationSelected(FieldTask *fieldTask); BOOL StartMenu_ExitJournal(FieldTask *fieldTask); -void *sub_0203C540(u16 param0, u8 param1, u8 param2); +void *StartMenu_BuildMailData(u16 itemID, u8 usageType, u8 partySlot); BOOL StartMenu_ExitMail(FieldTask *fieldTask); BOOL StartMenu_ExitPoffinCase(FieldTask *fieldTask); BOOL StartMenu_ExitPalPad(FieldTask *fieldTask); BOOL StartMenu_ExitVsRecorder(FieldTask *fieldTask); -#endif // POKEPLATINUM_UNK_0203A9C8_H +#endif // POKEPLATINUM_START_MENU_H diff --git a/include/struct_decls/struct_0209747C_decl.h b/include/struct_decls/struct_0209747C_decl.h deleted file mode 100644 index 6dd3f1ebb6..0000000000 --- a/include/struct_decls/struct_0209747C_decl.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_0209747C_DECL_H -#define POKEPLATINUM_STRUCT_0209747C_DECL_H - -typedef struct UnkStruct_0209747C_t UnkStruct_0209747C; - -#endif // POKEPLATINUM_STRUCT_0209747C_DECL_H diff --git a/include/struct_defs/daycare.h b/include/struct_defs/daycare.h index 8c248c0d7b..9a0c47656e 100644 --- a/include/struct_defs/daycare.h +++ b/include/struct_defs/daycare.h @@ -3,9 +3,10 @@ #include "constants/daycare.h" -#include "struct_defs/mail.h" #include "struct_defs/pokemon.h" +#include "mail.h" + typedef struct DaycareMail { Mail mail; u16 otName[TRAINER_NAME_LEN + 1]; diff --git a/include/struct_defs/mail.h b/include/struct_defs/mail.h deleted file mode 100644 index e0b7069ef6..0000000000 --- a/include/struct_defs/mail.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_MAIL_H -#define POKEPLATINUM_STRUCT_MAIL_H - -#include "constants/string.h" - -#include "struct_defs/sentence.h" -#include "struct_defs/union_02028328.h" - -#define MAILBOX_SIZE 20 - -typedef struct Mail { - u32 trainerID; - u8 trainerGender; - u8 language; - u8 gameVersion; - u8 mailType; - u16 trainerName[TRAINER_NAME_LEN + 1]; - UnkUnion_02028328 unk_18[3]; - u16 unk_1E; - Sentence unk_20[3]; -} Mail; - -typedef struct Mailbox { - Mail mail[MAILBOX_SIZE]; -} Mailbox; - -#endif // POKEPLATINUM_STRUCT_MAIL_H diff --git a/include/struct_defs/pokemon.h b/include/struct_defs/pokemon.h index 92985cdc92..e7c2c204a3 100644 --- a/include/struct_defs/pokemon.h +++ b/include/struct_defs/pokemon.h @@ -4,7 +4,10 @@ #include "constants/moves.h" #include "constants/string.h" +#include "struct_defs/seal_case.h" + #include "charcode.h" +#include "mail.h" // clang-format off /** @@ -125,9 +128,6 @@ typedef struct BoxPokemon { } BoxPokemon; // clang-format on -#include "struct_defs/mail.h" -#include "struct_defs/seal_case.h" - /** * @brief Party Pokemon data structure * This is used to store stats for a pokemon while it is in the players party. diff --git a/include/struct_defs/struct_02097728.h b/include/struct_defs/struct_02097728.h deleted file mode 100644 index 27100eb79e..0000000000 --- a/include/struct_defs/struct_02097728.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_02097728_H -#define POKEPLATINUM_STRUCT_02097728_H - -#include "struct_defs/mail.h" - -#include "savedata.h" - -typedef struct { - u16 unk_00; - u16 unk_02; - int unk_04; - int unk_08; - u16 unk_0C; - u8 unk_0E; - u8 unk_0F; - SaveData *saveData; - Mail *unk_14; - Mailbox *mailbox; -} UnkStruct_02097728; - -#endif // POKEPLATINUM_STRUCT_02097728_H diff --git a/include/struct_defs/struct_020978D8.h b/include/struct_defs/struct_020978D8.h deleted file mode 100644 index d8f133ff90..0000000000 --- a/include/struct_defs/struct_020978D8.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_020978D8_H -#define POKEPLATINUM_STRUCT_020978D8_H - -#include "struct_defs/sentence.h" -#include "struct_defs/union_02028328.h" - -#include "game_options.h" -#include "string_gf.h" - -typedef struct { - u16 unk_00; - u8 unk_02; - u8 unk_03; - Options *options; - u32 unk_08; - u8 unk_0C; - u8 language; - u8 gameVersion; - u8 mailType; - String *unk_10; - UnkUnion_02028328 unk_14[3]; - Sentence unk_1A[3]; -} UnkStruct_020978D8; - -#endif // POKEPLATINUM_STRUCT_020978D8_H diff --git a/include/struct_defs/union_02028328.h b/include/struct_defs/union_02028328.h deleted file mode 100644 index 7268453f53..0000000000 --- a/include/struct_defs/union_02028328.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef POKEPLATINUM_UNION_02028328_H -#define POKEPLATINUM_UNION_02028328_H - -typedef union { - struct { - u16 val1_0 : 12; - u16 val1_12 : 4; - }; - u16 val2; -} UnkUnion_02028328; - -#endif // POKEPLATINUM_UNION_02028328_H diff --git a/include/unk_02014A84.h b/include/unk_02014A84.h index fe3923b24a..eeb769aaf3 100644 --- a/include/unk_02014A84.h +++ b/include/unk_02014A84.h @@ -7,19 +7,19 @@ #include "string_gf.h" -void sub_02014A84(Sentence *sentence); -void sub_02014A9C(Sentence *sentence, u32 param1); +void Sentence_Init(Sentence *sentence); +void Sentence_InitWithType(Sentence *sentence, u32 type); void sub_02014AB4(Sentence *sentence); void sub_02014AC4(Sentence *sentence, int param1); -String *sub_02014B34(const Sentence *sentence, enum HeapID heapID); +String *Sentence_AsString(const Sentence *sentence, enum HeapID heapID); String *sub_02014BA0(const Sentence *sentence, u32 param1); -BOOL sub_02014BBC(const Sentence *sentence); +BOOL Sentence_IsValid(const Sentence *sentence); BOOL sub_02014BD0(const Sentence *sentence); u16 Sentence_GetWord(const Sentence *sentence, int slot); u32 sub_02014C80(const Sentence *sentence); u32 sub_02014C84(const Sentence *sentence); BOOL sub_02014C88(const Sentence *param0, const Sentence *param1); -void sub_02014CC0(Sentence *param0, const Sentence *param1); +void Sentence_Set(Sentence *param0, const Sentence *param1); u32 sub_02014CD4(u32 param0); void sub_02014CE0(Sentence *sentence, u32 param1, u32 param2); void Sentence_SetWord(Sentence *sentence, u32 index, u16 word); diff --git a/include/unk_02014D38.h b/include/unk_02014D38.h index 584c585b35..df8924c10d 100644 --- a/include/unk_02014D38.h +++ b/include/unk_02014D38.h @@ -15,7 +15,7 @@ void sub_02014DB8(u16 param0, String *param1); u16 sub_02014DFC(u32 param0, u32 param1); BOOL sub_02014E4C(u16 param0, u32 *param1, u32 *param2); u32 Sentence_SaveSize(void); -void Sentence_Init(void *param0); +void SentenceSaveData_Init(void *param0); UnkStruct_02014EC4 *sub_02014EC4(SaveData *saveData); BOOL sub_02014ED8(const UnkStruct_02014EC4 *param0, u32 param1); u32 sub_02014EE4(UnkStruct_02014EC4 *param0); diff --git a/include/unk_0203D1B8.h b/include/unk_0203D1B8.h index 5da19d7850..346b9bb871 100644 --- a/include/unk_0203D1B8.h +++ b/include/unk_0203D1B8.h @@ -5,13 +5,12 @@ #include "generated/items.h" #include "generated/pokemon_contest_types.h" -#include "struct_decls/struct_0209747C_decl.h" #include "struct_defs/choose_starter_data.h" #include "struct_defs/clear_game_player_info.h" #include "struct_defs/hall_of_fame_display_data.h" #include "struct_defs/struct_0203E348.h" -#include "struct_defs/struct_02097728.h" +#include "applications/mail.h" #include "applications/naming_screen.h" #include "applications/party_menu/defs.h" #include "applications/pc_boxes/pokemon_storage_session.h" @@ -31,6 +30,7 @@ #include "pokemon.h" #include "savedata.h" #include "trainer_case.h" +#include "unk_0209747C.h" void FieldSystem_StartBattleProcess(FieldSystem *fieldSystem, FieldBattleDTO *dto); void sub_0203D1E4(FieldSystem *fieldSystem, BagContext *param1); @@ -63,9 +63,9 @@ void sub_0203D874(FieldSystem *fieldSystem, UnkStruct_0209747C *param1); void FieldSystem_OpenTownMap(FieldSystem *fieldSystem, TownMapContext *townMapCtx); void *FieldSystem_OpenTownMapItem(FieldSystem *fieldSystem); void *FieldSystem_OpenOptionsMenu(FieldSystem *fieldSystem); -UnkStruct_02097728 *sub_0203D920(FieldSystem *fieldSystem, int param1, u8 param2, u8 mailType, int unusedHeapID); -UnkStruct_02097728 *sub_0203D94C(FieldSystem *fieldSystem, int param1, u8 param2, enum HeapID heapID); -UnkStruct_02097728 *sub_0203D984(FieldSystem *fieldSystem, Pokemon *param1, enum HeapID heapID); +MailAppArgs *FieldSystem_LaunchMailApp_Write(FieldSystem *fieldSystem, enum MailContext context, u8 partySlot, u8 mailType, int unusedHeapID); +MailAppArgs *FieldSystem_LaunchMailApp_Read(FieldSystem *fieldSystem, enum MailContext context, u8 mailType, enum HeapID heapID); +MailAppArgs *FieldSystem_LaunchMailApp_ReadHeld(FieldSystem *fieldSystem, Pokemon *param1, enum HeapID heapID); PoffinCaseAppData *FieldSystem_LaunchPoffinCaseApp(FieldSystem *fieldSystem, enum HeapID heapID); void sub_0203D9D8(FieldSystem *fieldSystem, UnkStruct_ov90_021D0D80 *param1); void sub_0203DAC0(FieldTask *param0, u16 *param1, SaveData *saveData, u16 param3, u16 param4); diff --git a/include/unk_0209747C.h b/include/unk_0209747C.h index 234f12d84e..b44b0911a5 100644 --- a/include/unk_0209747C.h +++ b/include/unk_0209747C.h @@ -2,12 +2,26 @@ #define POKEPLATINUM_UNK_0209747C_H #include "struct_decls/struct_02014EC4_decl.h" -#include "struct_decls/struct_0209747C_decl.h" #include "struct_defs/sentence.h" #include "pokedex.h" #include "savedata.h" +typedef struct UnkStruct_0209747C { + u8 unk_00; + u8 unk_01; + u8 unk_02; + u8 unk_03; + u8 unk_04; + u8 unk_05; + int unk_08; + const Pokedex *unk_0C; + const UnkStruct_02014EC4 *unk_10; + Sentence unk_14; + u16 unk_1C[2]; + u16 unk_20[2]; +} UnkStruct_0209747C; + UnkStruct_0209747C *sub_0209747C(u32 param0, u32 param1, SaveData *saveData, enum HeapID heapID); void sub_020974EC(UnkStruct_0209747C *param0); void sub_020974F4(UnkStruct_0209747C *param0, u16 param1); diff --git a/include/unk_02097624.h b/include/unk_02097624.h deleted file mode 100644 index 44033f74a7..0000000000 --- a/include/unk_02097624.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef POKEPLATINUM_UNK_02097624_H -#define POKEPLATINUM_UNK_02097624_H - -#include "struct_defs/mail.h" -#include "struct_defs/struct_02097728.h" - -#include "pokemon.h" -#include "savedata.h" - -UnkStruct_02097728 *sub_02097624(SaveData *saveData, int param1, u8 param2, u8 param3, enum HeapID heapID); -UnkStruct_02097728 *sub_0209767C(SaveData *saveData, int param1, u16 param2, enum HeapID heapID); -UnkStruct_02097728 *sub_020976BC(SaveData *saveData, Pokemon *param1, enum HeapID heapID); -UnkStruct_02097728 *sub_020976F4(SaveData *saveData, u8 param1, enum HeapID heapID); -BOOL sub_02097728(UnkStruct_02097728 *param0); -int sub_0209772C(UnkStruct_02097728 *param0, int param1, u8 param2); -int sub_02097750(UnkStruct_02097728 *param0, Pokemon *param1); -void sub_02097770(UnkStruct_02097728 *param0); -int sub_02097788(Mailbox *mailbox, Pokemon *mon, enum HeapID heapID); -int sub_020977E4(Mailbox *mailbox, u16 param1, Pokemon *param2, enum HeapID heapID); - -#endif // POKEPLATINUM_UNK_02097624_H diff --git a/include/unk_020998EC.h b/include/unk_020998EC.h index 9528f8e2a9..824cd9111b 100644 --- a/include/unk_020998EC.h +++ b/include/unk_020998EC.h @@ -1,10 +1,10 @@ #ifndef POKEPLATINUM_UNK_020998EC_H #define POKEPLATINUM_UNK_020998EC_H -#include "struct_decls/struct_0209747C_decl.h" #include "struct_decls/struct_020998EC_decl.h" #include "string_gf.h" +#include "unk_0209747C.h" UnkStruct_020998EC *sub_020998EC(u32 heapID, const UnkStruct_0209747C *param1); void sub_0209992C(UnkStruct_020998EC *param0); diff --git a/platinum.us/filesys.csv b/platinum.us/filesys.csv index ad8c6c2bb2..02b0d67188 100644 --- a/platinum.us/filesys.csv +++ b/platinum.us/filesys.csv @@ -208,7 +208,7 @@ res/prebuilt/graphic/hiden_effect.narc,/graphic/hiden_effect.narc res/prebuilt/graphic/imageclip.narc,/graphic/imageclip.narc res/prebuilt/graphic/library_tv.narc,/graphic/library_tv.narc res/prebuilt/graphic/lobby_news.narc,/graphic/lobby_news.narc -res/prebuilt/graphic/mail_gra.narc,/graphic/mail_gra.narc +res/graphics/mail/mail.narc,/graphic/mail_gra.narc res/graphics/start_menu/start_menu.narc,/graphic/menu_gra.narc res/graphics/signature_interface/signature_interface.narc,/graphic/mysign.narc res/graphics/main_menu/main_menu_graphics.narc,/graphic/mystery.narc diff --git a/platinum.us/filesys.sha1 b/platinum.us/filesys.sha1 index a17ecb5da6..f43f3069c5 100644 --- a/platinum.us/filesys.sha1 +++ b/platinum.us/filesys.sha1 @@ -207,7 +207,7 @@ e7266bd8b7095861b6e1fdaf4f13cb648a9c325d *res/prebuilt/graphic/footprint_board.n 24760aae84c838f66389e1de92bc1b1579f5d953 *res/prebuilt/graphic/imageclip.narc 4d1aac7d0014e2ffdfb6501b3f16ec2084d46e04 *res/prebuilt/graphic/library_tv.narc 44214e37e0345a75b00a1c01d46ca787cdba1fb8 *res/prebuilt/graphic/lobby_news.narc -428a40285a2c82705502962047f8cb9492ef3df1 *res/prebuilt/graphic/mail_gra.narc +428a40285a2c82705502962047f8cb9492ef3df1 *res/graphics/mail/mail.narc 1d70dd8856d2f85beb2d4e461cfaf7179153640a *res/graphics/start_menu/start_menu.narc 5ccc879d6b89822eff8adeb0637af9f06c7d640d *res/graphics/signature_interface/signature_interface.narc 0f05587c988da3072761675d31b6bf94c9928d65 *res/graphics/main_menu/main_menu_graphics.narc diff --git a/platinum.us/main.lsf b/platinum.us/main.lsf index 0488144942..fc00f8f1d7 100644 --- a/platinum.us/main.lsf +++ b/platinum.us/main.lsf @@ -335,7 +335,7 @@ Static main Object main.nef.p/src_unk_020972FC.c.o Object main.nef.p/src_berry_data.c.o Object main.nef.p/src_unk_0209747C.c.o - Object main.nef.p/src_unk_02097624.c.o + Object main.nef.p/src_applications_mail.c.o Object main.nef.p/src_unk_02097B18.c.o Object main.nef.p/src_egg_hatch.c.o Object main.nef.p/src_unk_020985E4.c.o @@ -1267,10 +1267,10 @@ Overlay options_menu Object main.nef.p/src_applications_options_menu.c.o } -Overlay overlay75 +Overlay mail_viewer { After main - Object main.nef.p/src_overlay075_ov75_021D0D80.c.o + Object main.nef.p/src_applications_mail_viewer.c.o } Overlay overlay76 diff --git a/platinum.us/sbins_shared.sha1 b/platinum.us/sbins_shared.sha1 index 4e7cd708c8..d26add248f 100644 --- a/platinum.us/sbins_shared.sha1 +++ b/platinum.us/sbins_shared.sha1 @@ -74,7 +74,7 @@ cf86b18a15a2b011fd0e7c98379a9fa228c3fc4c *trainer_case.sbin 39a79a31811cac6b1a90206e67624c0a3179bd46 *signature.sbin deecf01a5608b25883804ef30c9d4c3d0c904ee5 *rowan_intro.sbin 21e3d2a2fb36d739f4fd16792719bf6fa7b7e6aa *options_menu.sbin -88ceed815cb9a2ef6e0d2dcedd2fc126e717c165 *overlay75.sbin +88ceed815cb9a2ef6e0d2dcedd2fc126e717c165 *mail_viewer.sbin 13777fa8b44e026c4eb960cce2309451c4594726 *overlay76.sbin d7a304050d0049809b21cf75937e4d14aaf858c5 *game_opening.sbin 8571cf57764db093c9ce385586894659297b783e *choose_starter.sbin diff --git a/res/field/scripts/scripts_common.s b/res/field/scripts/scripts_common.s index a85f7233b6..2d102c1911 100644 --- a/res/field/scripts/scripts_common.s +++ b/res/field/scripts/scripts_common.s @@ -1055,7 +1055,7 @@ _0E83: _0EAB: CloseMessage - ScrCmd_1B4 VAR_RESULT + CountMailInMailbox VAR_RESULT GoToIfEq VAR_RESULT, 0, _0EC6 ScrCmd_1B3 GoTo _0ECF diff --git a/res/graphics/mail/air_mail.NSCR b/res/graphics/mail/air_mail.NSCR new file mode 100644 index 0000000000..2ba11aa63b Binary files /dev/null and b/res/graphics/mail/air_mail.NSCR differ diff --git a/res/graphics/mail/air_mail_tiles.png b/res/graphics/mail/air_mail_tiles.png new file mode 100644 index 0000000000..d4090a5f8a Binary files /dev/null and b/res/graphics/mail/air_mail_tiles.png differ diff --git a/res/graphics/mail/bloom_mail.NSCR b/res/graphics/mail/bloom_mail.NSCR new file mode 100644 index 0000000000..3c7a85dcb5 Binary files /dev/null and b/res/graphics/mail/bloom_mail.NSCR differ diff --git a/res/graphics/mail/bloom_mail_tiles.png b/res/graphics/mail/bloom_mail_tiles.png new file mode 100644 index 0000000000..a20e99856b Binary files /dev/null and b/res/graphics/mail/bloom_mail_tiles.png differ diff --git a/res/graphics/mail/brick_mail.NSCR b/res/graphics/mail/brick_mail.NSCR new file mode 100644 index 0000000000..2e91a133b8 Binary files /dev/null and b/res/graphics/mail/brick_mail.NSCR differ diff --git a/res/graphics/mail/brick_mail_tiles.png b/res/graphics/mail/brick_mail_tiles.png new file mode 100644 index 0000000000..72ad4f61e3 Binary files /dev/null and b/res/graphics/mail/brick_mail_tiles.png differ diff --git a/res/graphics/mail/bubble_mail.NSCR b/res/graphics/mail/bubble_mail.NSCR new file mode 100644 index 0000000000..907f200746 Binary files /dev/null and b/res/graphics/mail/bubble_mail.NSCR differ diff --git a/res/graphics/mail/bubble_mail_tiles.png b/res/graphics/mail/bubble_mail_tiles.png new file mode 100644 index 0000000000..74208b79d6 Binary files /dev/null and b/res/graphics/mail/bubble_mail_tiles.png differ diff --git a/res/graphics/mail/flame_mail.NSCR b/res/graphics/mail/flame_mail.NSCR new file mode 100644 index 0000000000..969c3a2cd5 Binary files /dev/null and b/res/graphics/mail/flame_mail.NSCR differ diff --git a/res/graphics/mail/flame_mail_tiles.png b/res/graphics/mail/flame_mail_tiles.png new file mode 100644 index 0000000000..862167cf48 Binary files /dev/null and b/res/graphics/mail/flame_mail_tiles.png differ diff --git a/res/graphics/mail/grass_mail.NSCR b/res/graphics/mail/grass_mail.NSCR new file mode 100644 index 0000000000..6982fabee2 Binary files /dev/null and b/res/graphics/mail/grass_mail.NSCR differ diff --git a/res/graphics/mail/grass_mail_tiles.png b/res/graphics/mail/grass_mail_tiles.png new file mode 100644 index 0000000000..5a8d335257 Binary files /dev/null and b/res/graphics/mail/grass_mail_tiles.png differ diff --git a/res/graphics/mail/heart_mail.NSCR b/res/graphics/mail/heart_mail.NSCR new file mode 100644 index 0000000000..a87e3ec7a7 Binary files /dev/null and b/res/graphics/mail/heart_mail.NSCR differ diff --git a/res/graphics/mail/heart_mail_tiles.png b/res/graphics/mail/heart_mail_tiles.png new file mode 100644 index 0000000000..209f0932b4 Binary files /dev/null and b/res/graphics/mail/heart_mail_tiles.png differ diff --git a/res/graphics/mail/interface.NSCR b/res/graphics/mail/interface.NSCR new file mode 100644 index 0000000000..89d5f1fffd Binary files /dev/null and b/res/graphics/mail/interface.NSCR differ diff --git a/res/graphics/mail/mail.order b/res/graphics/mail/mail.order new file mode 100644 index 0000000000..6cdefe4218 --- /dev/null +++ b/res/graphics/mail/mail.order @@ -0,0 +1,37 @@ +grass_mail_tiles.NCLR +flame_mail_tiles.NCLR +bubble_mail_tiles.NCLR +bloom_mail_tiles.NCLR +tunnel_mail_tiles.NCLR +steel_mail_tiles.NCLR +heart_mail_tiles.NCLR +snow_mail_tiles.NCLR +space_mail_tiles.NCLR +air_mail_tiles.NCLR +mosaic_mail_tiles.NCLR +brick_mail_tiles.NCLR +grass_mail_tiles.NCGR +flame_mail_tiles.NCGR +bubble_mail_tiles.NCGR +bloom_mail_tiles.NCGR +tunnel_mail_tiles.NCGR +steel_mail_tiles.NCGR +heart_mail_tiles.NCGR +snow_mail_tiles.NCGR +space_mail_tiles.NCGR +air_mail_tiles.NCGR +mosaic_mail_tiles.NCGR +brick_mail_tiles.NCGR +grass_mail.NSCR +flame_mail.NSCR +bubble_mail.NSCR +bloom_mail.NSCR +tunnel_mail.NSCR +steel_mail.NSCR +heart_mail.NSCR +snow_mail.NSCR +space_mail.NSCR +air_mail.NSCR +mosaic_mail.NSCR +brick_mail.NSCR +interface.NSCR diff --git a/res/graphics/mail/meson.build b/res/graphics/mail/meson.build new file mode 100644 index 0000000000..b8d9275c27 --- /dev/null +++ b/res/graphics/mail/meson.build @@ -0,0 +1,75 @@ +# if adding new mail files, make sure to add them to mail.order while keeping +# identical file types together (ie. new NCGRs should go with existing ones) + +mail_pngs = files( + 'grass_mail_tiles.png', + 'flame_mail_tiles.png', + 'bubble_mail_tiles.png', + 'bloom_mail_tiles.png', + 'tunnel_mail_tiles.png', + 'steel_mail_tiles.png', + 'heart_mail_tiles.png', + 'snow_mail_tiles.png', + 'space_mail_tiles.png', + 'air_mail_tiles.png', + 'mosaic_mail_tiles.png', + 'brick_mail_tiles.png', +) + +mail_nscrs = copy_gen.process(files( + 'grass_mail.NSCR', + 'flame_mail.NSCR', + 'bubble_mail.NSCR', + 'bloom_mail.NSCR', + 'tunnel_mail.NSCR', + 'steel_mail.NSCR', + 'heart_mail.NSCR', + 'snow_mail.NSCR', + 'space_mail.NSCR', + 'air_mail.NSCR', + 'mosaic_mail.NSCR', + 'brick_mail.NSCR', + 'interface.NSCR', +)) + +mail_nclrs = nclr_gen.process( + mail_pngs, + extra_args: [ + '-bitdepth', '4', + '-pcmp', + '-invertsize', + '-nopad', + ] +) + +mail_ncgrs = ncgr_gen.process( + mail_pngs, + extra_args: [ + '-convertTo4Bpp', + '-version101', + '-sopc', + ] +) + +mail_narc = custom_target('mail.narc', + output: [ + 'mail.narc', + 'mail.naix', + ], + input: [ + mail_nclrs, + mail_ncgrs, + mail_nscrs, + ], + command: [ + nitroarc_exe, + '--create', + '--index', + '--files-from', files('mail.order'), + '--file', '@OUTPUT0@', + '@PRIVATE_DIR@', + ], +) + +nitrofs_files += mail_narc +naix_headers += mail_narc[1] diff --git a/res/graphics/mail/mosaic_mail.NSCR b/res/graphics/mail/mosaic_mail.NSCR new file mode 100644 index 0000000000..800afdce29 Binary files /dev/null and b/res/graphics/mail/mosaic_mail.NSCR differ diff --git a/res/graphics/mail/mosaic_mail_tiles.png b/res/graphics/mail/mosaic_mail_tiles.png new file mode 100644 index 0000000000..73cbf6e902 Binary files /dev/null and b/res/graphics/mail/mosaic_mail_tiles.png differ diff --git a/res/graphics/mail/snow_mail.NSCR b/res/graphics/mail/snow_mail.NSCR new file mode 100644 index 0000000000..5412750ad4 Binary files /dev/null and b/res/graphics/mail/snow_mail.NSCR differ diff --git a/res/graphics/mail/snow_mail_tiles.png b/res/graphics/mail/snow_mail_tiles.png new file mode 100644 index 0000000000..5bc8937e2f Binary files /dev/null and b/res/graphics/mail/snow_mail_tiles.png differ diff --git a/res/graphics/mail/space_mail.NSCR b/res/graphics/mail/space_mail.NSCR new file mode 100644 index 0000000000..d65a9c03c6 Binary files /dev/null and b/res/graphics/mail/space_mail.NSCR differ diff --git a/res/graphics/mail/space_mail_tiles.png b/res/graphics/mail/space_mail_tiles.png new file mode 100644 index 0000000000..7315ece07d Binary files /dev/null and b/res/graphics/mail/space_mail_tiles.png differ diff --git a/res/graphics/mail/steel_mail.NSCR b/res/graphics/mail/steel_mail.NSCR new file mode 100644 index 0000000000..ed7a338c8c Binary files /dev/null and b/res/graphics/mail/steel_mail.NSCR differ diff --git a/res/graphics/mail/steel_mail_tiles.png b/res/graphics/mail/steel_mail_tiles.png new file mode 100644 index 0000000000..1b25138d0b Binary files /dev/null and b/res/graphics/mail/steel_mail_tiles.png differ diff --git a/res/graphics/mail/tunnel_mail.NSCR b/res/graphics/mail/tunnel_mail.NSCR new file mode 100644 index 0000000000..f1a7a28aed Binary files /dev/null and b/res/graphics/mail/tunnel_mail.NSCR differ diff --git a/res/graphics/mail/tunnel_mail_tiles.png b/res/graphics/mail/tunnel_mail_tiles.png new file mode 100644 index 0000000000..807b8ca669 Binary files /dev/null and b/res/graphics/mail/tunnel_mail_tiles.png differ diff --git a/res/graphics/meson.build b/res/graphics/meson.build index 2750f7cd92..edf99553d0 100644 --- a/res/graphics/meson.build +++ b/res/graphics/meson.build @@ -4,6 +4,7 @@ subdir('diploma') subdir('egg_hatch') subdir('frontier') subdir('item_icons') +subdir('mail') subdir('main_menu') subdir('map_popups') subdir('mining') diff --git a/res/prebuilt/graphic/mail_gra.narc b/res/prebuilt/graphic/mail_gra.narc deleted file mode 100644 index 775155bdb6..0000000000 Binary files a/res/prebuilt/graphic/mail_gra.narc and /dev/null differ diff --git a/res/prebuilt/graphic/meson.build b/res/prebuilt/graphic/meson.build index 2c5acdafc1..a70682d5d6 100644 --- a/res/prebuilt/graphic/meson.build +++ b/res/prebuilt/graphic/meson.build @@ -15,7 +15,6 @@ prebuilt_files = [ 'imageclip.narc', 'library_tv.narc', 'lobby_news.narc', - 'mail_gra.narc', 'ntag_gra.narc', 'nutmixer.narc', 'oekaki.narc', diff --git a/res/text/unk_0409.json b/res/text/mail.json similarity index 63% rename from res/text/unk_0409.json rename to res/text/mail.json index 3bb26e29e4..01021cceed 100644 --- a/res/text/unk_0409.json +++ b/res/text/mail.json @@ -2,19 +2,19 @@ "key": 59412, "messages": [ { - "id": "pl_msg_00000409_00000", + "id": "Mail_Text_Confirm", "en_US": "CONFIRM" }, { - "id": "pl_msg_00000409_00001", + "id": "Mail_Text_Cancel", "en_US": "CANCEL" }, { - "id": "pl_msg_00000409_00002", + "id": "Mail_Text_EnterPhraseOrWord", "en_US": "Please enter a phrase or word." }, { - "id": "pl_msg_00000409_00003", + "id": "Mail_Text_StopGivingMailPrompt", "en_US": [ "Stop giving the Pokémon\n", "Mail?" diff --git a/src/applications/mail.c b/src/applications/mail.c new file mode 100644 index 0000000000..a56f96b3fc --- /dev/null +++ b/src/applications/mail.c @@ -0,0 +1,374 @@ +#include "applications/mail.h" + +#include + +#include "constants/items.h" +#include "generated/game_records.h" +#include "generated/trainer_score_events.h" + +#include "applications/mail_viewer.h" +#include "overlay020/ov20_021D0D80.h" + +#include "game_records.h" +#include "heap.h" +#include "item.h" +#include "mail.h" +#include "overlay_manager.h" +#include "pokemon.h" +#include "save_player.h" +#include "savedata.h" +#include "string_gf.h" +#include "unk_02014A84.h" +#include "unk_0209747C.h" + +FS_EXTERN_OVERLAY(overlay20); +FS_EXTERN_OVERLAY(mail_viewer); + +typedef struct MailApp { + enum HeapID heapID; + u8 padding[4]; + UnkStruct_0209747C *unk_08; + ApplicationManager *appMan; + MailViewerAppArgs *viewerArgs; + Sentence selectedSentence; +} MailApp; + +enum MailAppState { + MAIL_STATE_OPEN_VIEWER = 0, + MAIL_STATE_VIEWING, + MAIL_STATE_EXIT, + MAIL_STATE_EDIT_SENTENCE_START, + MAIL_STATE_EDITING, +}; + +static BOOL MailApp_Init(ApplicationManager *appMan, int *state); +static BOOL MailApp_Main(ApplicationManager *appMan, int *state); +static BOOL MailApp_Exit(ApplicationManager *appMan, int *state); + +const ApplicationManagerTemplate gMailAppArgsTemplate = { + MailApp_Init, + MailApp_Main, + MailApp_Exit, + FS_OVERLAY_ID_NONE +}; + +MailAppArgs *MailAppArgs_New_Write(SaveData *saveData, enum MailContext context, u8 partySlot, u8 mailType, enum HeapID heapID) +{ + Mailbox *mailbox = SaveData_GetMailbox(saveData); + MailAppArgs *args = Heap_AllocAtEnd(heapID, sizeof(MailAppArgs)); + + MI_CpuClear8(args, sizeof(MailAppArgs)); + + args->mailType = mailType; + args->partySlotUnused = partySlot; + args->mailbox = mailbox; + args->writeMode = TRUE; + args->contextUnused = context; + args->mailboxSlotUnused = 0; + args->saveData = saveData; + args->mail = Mail_New(heapID); + + Mail_Reset(args->mail); + Mail_SetTrainerAndIconData(args->mail, MAIL_TYPE_NONE, partySlot, saveData); + + return args; +} + +MailAppArgs *MailAppArgs_New_ReadFromMailbox(SaveData *saveData, enum MailContext context, u16 mailboxSlot, enum HeapID heapID) +{ + MailAppArgs *args = Heap_AllocAtEnd(heapID, sizeof(MailAppArgs)); + MI_CpuClear8(args, sizeof(MailAppArgs)); + + args->writeMode = FALSE; + args->contextUnused = context; + args->mailboxSlotUnused = mailboxSlot; + args->saveData = saveData; + + Mailbox *mailbox = SaveData_GetMailbox(saveData); + + args->mailbox = mailbox; + args->mail = Mailbox_CopyMailAtSlot(mailbox, context, mailboxSlot, heapID); + + return args; +} + +MailAppArgs *MailAppArgs_New_ReadHeld(SaveData *saveData, Pokemon *mon, enum HeapID heapID) +{ + MailAppArgs *args = Heap_AllocAtEnd(heapID, sizeof(MailAppArgs)); + MI_CpuClear8(args, sizeof(MailAppArgs)); + + args->writeMode = FALSE; + args->saveData = saveData; + args->mail = Mail_New(heapID); + + Pokemon_GetValue(mon, MON_DATA_MAIL, args->mail); + return args; +} + +MailAppArgs *MailAppArgs_New_Check(SaveData *saveData, u8 mailType, enum HeapID heapID) +{ + MailAppArgs *args = Heap_AllocAtEnd(heapID, sizeof(MailAppArgs)); + MI_CpuClear8(args, sizeof(MailAppArgs)); + + args->writeMode = FALSE; + args->saveData = saveData; + args->mail = Mail_New(heapID); + + Mail_SetMailType(args->mail, mailType); + return args; +} + +BOOL MailApp_WasMailWritten(MailAppArgs *args) +{ + return args->mailWritten; +} + +BOOL MailApp_CopyWrittenMailToMailboxSlot(MailAppArgs *args, enum MailContext context, u8 slot) +{ + if (!MailApp_WasMailWritten(args)) { + return FALSE; + } + + Mailbox_CopyMailToSlot(args->mailbox, context, slot, args->mail); + return TRUE; +} + +BOOL MailApp_AddWrittenMailToMon(MailAppArgs *args, Pokemon *mon) +{ + if (!MailApp_WasMailWritten(args)) { + return FALSE; + } + + Pokemon_SetValue(mon, MON_DATA_MAIL, args->mail); + return TRUE; +} + +void MailAppArgs_Free(MailAppArgs *args) +{ + if (args->mail != NULL) { + Heap_Free(args->mail); + } + + Heap_Free(args); +} + +int Mail_TransferFromMonToMailbox(Mailbox *mailbox, Pokemon *mon, enum HeapID heapID) +{ + int item = ITEM_NONE; + int slot = Mail_GetEmptyMailSlot(mailbox, MAIL_CONTEXT_MAILBOX); + + if (slot == -1) { + return -1; + } + + Mail *mail = Mail_New(heapID); + + Pokemon_GetValue(mon, MON_DATA_MAIL, mail); + Mailbox_CopyMailToSlot(mailbox, MAIL_CONTEXT_MAILBOX, slot, mail); + Mail_Reset(mail); + Pokemon_SetValue(mon, MON_DATA_MAIL, mail); + Pokemon_SetValue(mon, MON_DATA_HELD_ITEM, &item); + Heap_Free(mail); + + return slot; +} + +int Mail_TransferFromMailboxToMon(Mailbox *mailbox, u16 slot, Pokemon *mon, enum HeapID heapID) +{ + int item = ITEM_NONE; + Mail *mail = Mailbox_CopyMailAtSlot(mailbox, MAIL_CONTEXT_MAILBOX, slot, heapID); + + if (mail == NULL) { + return -1; + } + + item = Item_ForMailType(Mail_GetMailType(mail)); + + Pokemon_SetValue(mon, MON_DATA_MAIL, mail); + Pokemon_SetValue(mon, MON_DATA_HELD_ITEM, &item); + Mailbox_ClearMailAtSlot(mailbox, MAIL_CONTEXT_MAILBOX, slot); + Heap_Free(mail); + + return slot; +} + +static MailViewerAppArgs *MailViewerAppArgs_New(Mail *mail, enum HeapID heapID) +{ + MailViewerAppArgs *args = Heap_Alloc(heapID, sizeof(MailViewerAppArgs)); + MI_CpuClear8(args, sizeof(MailViewerAppArgs)); + + args->writeMode = FALSE; + args->trainerID = Mail_GetTrainerID(mail); + args->trainerName = String_Init(TRAINER_NAME_LEN + 1, heapID); + + String_CopyChars(args->trainerName, Mail_GetTrainerName(mail)); + + args->mailType = Mail_GetMailType(mail); + args->language = Mail_GetLanguage(mail); + args->gameVersion = Mail_GetGameVersion(mail); + + for (u16 i = 0; i < MAIL_MAX_ICONS; i++) { + args->iconData[i].asValue = Mail_GetIconData(mail, i, ICON_DATA_VALUE, Mail_GetPlatExclusiveFormIcons(mail)); + } + + for (u16 i = 0; i < MAIL_MAX_SENTENCES; i++) { + Sentence_Set(&args->sentences[i], Mail_GetSentence(mail, i)); + } + + return args; +} + +static void MailViewerAppArgs_Free(MailViewerAppArgs *args) +{ + if (args->trainerName != NULL) { + String_Free(args->trainerName); + } + + Heap_Free(args); +} + +static void Mail_UpdateFromViewerArgs(Mail *mail, MailViewerAppArgs *args) +{ + for (u16 i = 0; i < MAIL_MAX_SENTENCES; i++) { + Mail_SetSentence(mail, &args->sentences[i], i); + } + + Mail_SetMailType(mail, args->mailType); +} + +static BOOL MailApp_RunSubApplication(ApplicationManager **appManPtr) +{ + if (*appManPtr && ApplicationManager_Exec(*appManPtr)) { + ApplicationManager_Free(*appManPtr); + *appManPtr = NULL; + return TRUE; + } + + return FALSE; +} + +static BOOL MailApp_Init(ApplicationManager *appMan, int *state) +{ + MailApp *mailApp = NULL; + MailAppArgs *args = ApplicationManager_Args(appMan); + + Heap_Create(HEAP_ID_APPLICATION, HEAP_ID_MAIL, HEAP_SIZE_MAIL); + mailApp = ApplicationManager_NewData(appMan, sizeof(MailApp), HEAP_ID_MAIL); + MI_CpuClear8(mailApp, sizeof(MailApp)); + + mailApp->heapID = HEAP_ID_MAIL; + mailApp->viewerArgs = MailViewerAppArgs_New(args->mail, mailApp->heapID); + mailApp->viewerArgs->options = SaveData_GetOptions(args->saveData); + + if (args->writeMode == TRUE) { + mailApp->viewerArgs->mailType = args->mailType; + } + + if (mailApp->viewerArgs->mailType >= NUM_MAIL_TYPES) { + mailApp->viewerArgs->mailType = 0; + } + + mailApp->viewerArgs->writeMode = args->writeMode; + + return TRUE; +} + +static BOOL MailApp_Main(ApplicationManager *appMan, int *state) +{ + MailApp *mailApp = ApplicationManager_Data(appMan); + MailAppArgs *args = ApplicationManager_Args(appMan); + + FS_EXTERN_OVERLAY(mail_viewer); + FS_EXTERN_OVERLAY(overlay20); + + static const ApplicationManagerTemplate mailViewerTemplate = { + MailViewer_Init, + MailViewer_Main, + MailViewer_Exit, + FS_OVERLAY_ID(mail_viewer), + }; + static const ApplicationManagerTemplate v3 = { + ov20_021D0D80, + ov20_021D0DF8, + ov20_021D0EA8, + FS_OVERLAY_ID(overlay20), + }; + + switch (*state) { + case MAIL_STATE_OPEN_VIEWER: + mailApp->viewerArgs->writeMode = args->writeMode; + mailApp->appMan = ApplicationManager_New(&mailViewerTemplate, mailApp->viewerArgs, mailApp->heapID); + *state = MAIL_STATE_VIEWING; + break; + case MAIL_STATE_VIEWING: + if (!MailApp_RunSubApplication(&mailApp->appMan)) { + break; + } + + switch (mailApp->viewerArgs->result) { + case MAIL_VIEWER_RESULT_CANCEL: + *state = MAIL_STATE_EXIT; + break; + case MAIL_VIEWER_RESULT_CONFIRM: + *state = MAIL_STATE_EXIT; + break; + default: + *state = MAIL_STATE_EDIT_SENTENCE_START; + break; + } + + break; + case MAIL_STATE_EXIT: + if (args->writeMode == TRUE) { + if (mailApp->viewerArgs->result == MAIL_VIEWER_RESULT_CONFIRM) { + Mail_UpdateFromViewerArgs(args->mail, mailApp->viewerArgs); + + GameRecords_IncrementTrainerScore(SaveData_GetGameRecords(args->saveData), TRAINER_SCORE_EVENT_MAIL_WRITTEN); + GameRecords_IncrementRecordValue(SaveData_GetGameRecords(args->saveData), RECORD_TIMES_MAIL_WRITTEN); + args->mailWritten = TRUE; + } else { + args->mailWritten = FALSE; + } + } + + return TRUE; + case MAIL_STATE_EDIT_SENTENCE_START: + mailApp->unk_08 = sub_0209747C(2, 0, args->saveData, mailApp->heapID); + + if (Sentence_IsValid(&mailApp->viewerArgs->sentences[mailApp->viewerArgs->sentenceIndex])) { + Sentence_Set(&mailApp->selectedSentence, &mailApp->viewerArgs->sentences[mailApp->viewerArgs->sentenceIndex]); + } else { + Sentence_InitWithType(&mailApp->selectedSentence, 3); + } + + sub_02097500(mailApp->unk_08, &mailApp->selectedSentence); + mailApp->appMan = ApplicationManager_New(&v3, mailApp->unk_08, mailApp->heapID); + *state = MAIL_STATE_EDITING; + break; + case MAIL_STATE_EDITING: + if (!MailApp_RunSubApplication(&mailApp->appMan)) { + break; + } + + if (sub_02097528(mailApp->unk_08) == 0) { + sub_02097540(mailApp->unk_08, &mailApp->viewerArgs->sentences[mailApp->viewerArgs->sentenceIndex]); + } + + sub_020974EC(mailApp->unk_08); + *state = MAIL_STATE_OPEN_VIEWER; + break; + } + + return FALSE; +} + +static BOOL MailApp_Exit(ApplicationManager *appMan, int *state) +{ + MailApp *mailApp = ApplicationManager_Data(appMan); + + MailViewerAppArgs_Free(mailApp->viewerArgs); + ApplicationManager_FreeData(appMan); + Heap_Destroy(mailApp->heapID); + + return TRUE; +} diff --git a/src/applications/mail_viewer.c b/src/applications/mail_viewer.c new file mode 100644 index 0000000000..d9fcf8e258 --- /dev/null +++ b/src/applications/mail_viewer.c @@ -0,0 +1,952 @@ +#include "applications/mail_viewer.h" + +#include + +#include "constants/narc.h" + +#include "applications/mail.h" + +#include "bg_window.h" +#include "enums.h" +#include "font.h" +#include "game_options.h" +#include "gx_layers.h" +#include "heap.h" +#include "menu.h" +#include "message.h" +#include "narc.h" +#include "network_icon.h" +#include "overlay_manager.h" +#include "palette.h" +#include "pokemon_icon.h" +#include "render_oam.h" +#include "render_text.h" +#include "render_window.h" +#include "screen_fade.h" +#include "sound_playback.h" +#include "sprite_system.h" +#include "string_gf.h" +#include "sys_task.h" +#include "sys_task_manager.h" +#include "system.h" +#include "text.h" +#include "unk_02014A84.h" +#include "vram_transfer.h" + +#include "res/fonts/pl_font.naix" +#include "res/graphics/mail/mail.naix" +#include "res/graphics/windows/pl_winframe.naix" +#include "res/pokemon/pl_poke_icon.naix" +#include "res/text/bank/mail.h" + +#define MAIL_SENTENCE_WINDOW_WIDTH 26 +#define MAIL_SENTENCE_WINDOW_HEIGHT 4 + +#define MAIL_CONFIRM_CANCEL_WINDOW_WIDTH 8 +#define MAIL_CONFIRM_CANCEL_WINDOW_HEIGHT 2 + +#define MAIL_OPTION_PALETTE_SLOT_START 34 + +#define BASE_TILE_MAIL_SENTENCE_WINDOW_1 (1023 - MAIL_SENTENCE_WINDOW_WIDTH * MAIL_SENTENCE_WINDOW_HEIGHT) +#define BASE_TILE_MAIL_SENTENCE_WINDOW_2 (BASE_TILE_MAIL_SENTENCE_WINDOW_1 - MAIL_SENTENCE_WINDOW_WIDTH * MAIL_SENTENCE_WINDOW_HEIGHT) +#define BASE_TILE_MAIL_SENTENCE_WINDOW_3 (BASE_TILE_MAIL_SENTENCE_WINDOW_2 - MAIL_SENTENCE_WINDOW_WIDTH * MAIL_SENTENCE_WINDOW_HEIGHT) +#define BASE_TILE_MAIL_CONFIRM_WINDOW (BASE_TILE_MAIL_SENTENCE_WINDOW_3 - MAIL_CONFIRM_CANCEL_WINDOW_WIDTH * MAIL_CONFIRM_CANCEL_WINDOW_HEIGHT) +#define BASE_TILE_MAIL_CANCEL_WINDOW (BASE_TILE_MAIL_CONFIRM_WINDOW - MAIL_CONFIRM_CANCEL_WINDOW_WIDTH * MAIL_CONFIRM_CANCEL_WINDOW_HEIGHT) +#define BASE_TILE_MAIL_MESSAGE_WINDOW (BASE_TILE_MAIL_CANCEL_WINDOW - MAIL_CONFIRM_CANCEL_WINDOW_WIDTH * MAIL_CONFIRM_CANCEL_WINDOW_HEIGHT) +#define BASE_TILE_MAIL_YES_NO_MENU (BASE_TILE_MAIL_MESSAGE_WINDOW - MESSAGE_WINDOW_TILE_COUNT) + +enum MailViewerMode { + MAIL_VIEWER_MODE_READ = 0, + MAIL_VIEWER_MODE_WRITE, + MAIL_VIEWER_MODE_CONFIRM_EMPTY, + MAIL_VIEWER_MODE_CANCEL, +}; + +enum MailViewerState { + MAIL_VIEWER_STATE_INIT = 0, + MAIL_VIEWER_STATE_INIT_GRAPHICS, + MAIL_VIEWER_STATE_FADE_IN, + MAIL_VIEWER_STATE_MAIN, + MAIL_VIEWER_STATE_FADE_OUT, + MAIL_VIEWER_STATE_EXIT, +}; + +enum MailViewerWindow { + MAIL_VIEWER_WINDOW_SENTENCE_1 = 0, + MAIL_VIEWER_WINDOW_SENTENCE_2, + MAIL_VIEWER_WINDOW_SENTENCE_3, + MAIL_VIEWER_WINDOW_CONFIRM, + MAIL_VIEWER_WINDOW_CANCEL, + MAIL_VIEWER_WINDOW_MESSAGE, + MAIL_VIEWER_WINDOW_COUNT, +}; + +enum VerticalSelectionIndex { + SELECTION_INDEX_SENTENCE_1 = 0, + SELECTION_INDEX_SENTENCE_2, + SELECTION_INDEX_SENTENCE_3, + SELECTION_INDEX_CONFIRM_CANCEL, + VERTICAL_SELECTION_INDEX_COUNT, +}; + +typedef struct MailViewerApp { + enum HeapID heapID; + int state; + u16 subState; + u16 frame; + u8 mode; + u8 initialMode; + u8 padding; + u8 printerID; + u8 textFrameDelay; + u8 verticalSelectionIndex; + u8 horizontalSelectionIndex; + u8 pauseGlowEffect; + u8 blendFraction; + u8 blendDirection; + u8 blendIndex; + u8 prevBlendIndex; + BgConfig *bgConfig; + MailViewerAppArgs *args; + MessageLoader *loader; + void *dummy[1]; + u8 padding2[8]; + PaletteData *paletteData; + void *backgroundNSCRBuffer; + void *interfaceNSCRBuffer; + NNSG2dScreenData *backgroundScreenData; + NNSG2dScreenData *interfaceScreenData; + Window windows[MAIL_VIEWER_WINDOW_COUNT]; + Menu *yesNoMenu; + SpriteSystem *spriteSys; + SpriteManager *spriteMan; + ManagedSprite *managedSprites[MAIL_MAX_ICONS]; +} MailViewerApp; + +typedef BOOL (*MailViewerModeFunc)(MailViewerApp *mailViewerApp); + +static BOOL Main(MailViewerApp *mailViewerApp); +static BOOL MailViewer_InitGraphics(MailViewerApp *mailViewerApp); +static BOOL MailViewer_FreeResources(MailViewerApp *mailViewerApp); +static void MailViewer_VBlankCallback(void *data); +static void MailViewer_InitBackgrounds(MailViewerApp *mailViewerApp); +static void MailViewer_TeardownBgs(MailViewerApp *mailViewerApp); +static void MailViewer_DrawMail(MailViewerApp *mailViewerApp); +static void MailViewer_FreeAssets(MailViewerApp *mailViewerApp); +static void MailViewer_AddWindows(MailViewerApp *mailViewerApp); +static void MailViewer_RemoveWindows(MailViewerApp *mailViewerApp); +static void MailViewer_PrintText(MailViewerApp *mailViewerApp); +static void MailViewer_InitSprites(MailViewerApp *mailViewerApp); +static void MailViewer_FreeSprites(MailViewerApp *mailViewerApp); + +int gDummy; // necessary for matching + +BOOL MailViewer_Init(ApplicationManager *appMan, int *state) +{ + MailViewerApp *mailViewerApp = (MailViewerApp *)ApplicationManager_Data(appMan); + + Heap_Create(HEAP_ID_APPLICATION, HEAP_ID_MAIL_VIEWER, HEAP_SIZE_MAIL_VIEWER); + mailViewerApp = ApplicationManager_NewData(appMan, sizeof(MailViewerApp), HEAP_ID_MAIL_VIEWER); + memset(mailViewerApp, 0, sizeof(MailViewerApp)); + + mailViewerApp->heapID = HEAP_ID_MAIL_VIEWER; + + mailViewerApp->args = (MailViewerAppArgs *)ApplicationManager_Args(appMan); + mailViewerApp->initialMode = mailViewerApp->mode = mailViewerApp->args->writeMode; + mailViewerApp->verticalSelectionIndex = mailViewerApp->args->sentenceIndex; + mailViewerApp->horizontalSelectionIndex = mailViewerApp->args->horizontalSelectionIndex; + mailViewerApp->prevBlendIndex = mailViewerApp->blendIndex = mailViewerApp->verticalSelectionIndex; + mailViewerApp->args->result = MAIL_VIEWER_RESULT_CANCEL; + mailViewerApp->textFrameDelay = Options_TextFrameDelay(mailViewerApp->args->options); + mailViewerApp->frame = Options_Frame(mailViewerApp->args->options); + + RenderControlFlags_SetCanABSpeedUpPrint(TRUE); + return TRUE; +} + +BOOL MailViewer_Main(ApplicationManager *appMan, int *state) +{ + MailViewerApp *mailViewerApp = (MailViewerApp *)ApplicationManager_Data(appMan); + + return !!Main(mailViewerApp); +} + +BOOL MailViewer_Exit(ApplicationManager *appMan, int *state) +{ + MailViewerApp *mailViewerApp = (MailViewerApp *)ApplicationManager_Data(appMan); + + RenderControlFlags_SetCanABSpeedUpPrint(FALSE); + + int heapID = mailViewerApp->heapID; + + ApplicationManager_FreeData(appMan); + Heap_Destroy(heapID); + + return TRUE; +} + +static BOOL MailViewer_AreSentencesEmpty(MailViewerApp *mailViewerApp) +{ + for (int i = 0; i < MAIL_MAX_SENTENCES; i++) { + if (Sentence_IsValid(&mailViewerApp->args->sentences[i])) { + return FALSE; + } + } + + return TRUE; +} + +static BOOL MailViewer_HandleInput_Read(MailViewerApp *unused) +{ + if (JOY_NEW(PAD_BUTTON_A | PAD_BUTTON_B)) { + Sound_PlayEffect(SEQ_SE_DP_PIRORIRO2); + return TRUE; + } + + return FALSE; +} + +static BOOL MailViewer_HandleInput_Write(MailViewerApp *mailViewerApp) +{ + BOOL selectionChanged = FALSE; + + if (JOY_NEW(PAD_BUTTON_A)) { + if (mailViewerApp->verticalSelectionIndex == SELECTION_INDEX_CONFIRM_CANCEL) { + if (mailViewerApp->horizontalSelectionIndex == 0) { + if (MailViewer_AreSentencesEmpty(mailViewerApp)) { + Sound_PlayEffect(SEQ_SE_DP_DECIDE); + mailViewerApp->mode = MAIL_VIEWER_MODE_CONFIRM_EMPTY; + return FALSE; + } else { + mailViewerApp->args->result = MAIL_VIEWER_RESULT_CONFIRM; + Sound_PlayEffect(SEQ_SE_DP_PIRORIRO2); + } + } else { + Sound_PlayEffect(SEQ_SE_DP_DECIDE); + mailViewerApp->mode = MAIL_VIEWER_MODE_CANCEL; + return FALSE; + } + + mailViewerApp->args->sentenceIndex = mailViewerApp->args->horizontalSelectionIndex = 0; + } else { + mailViewerApp->args->result = mailViewerApp->args->sentenceIndex = mailViewerApp->verticalSelectionIndex; + mailViewerApp->args->horizontalSelectionIndex = mailViewerApp->horizontalSelectionIndex; + Sound_PlayEffect(SEQ_SE_DP_DECIDE); + } + + return TRUE; + } else if (JOY_NEW(PAD_BUTTON_B)) { + Sound_PlayEffect(SEQ_SE_DP_DECIDE); + mailViewerApp->mode = MAIL_VIEWER_MODE_CANCEL; + return FALSE; + } + + if (JOY_NEW(PAD_BUTTON_START)) { + mailViewerApp->verticalSelectionIndex = SELECTION_INDEX_CONFIRM_CANCEL; + mailViewerApp->horizontalSelectionIndex = 0; + selectionChanged = TRUE; + } else if (JOY_NEW(PAD_KEY_DOWN)) { + mailViewerApp->verticalSelectionIndex = (mailViewerApp->verticalSelectionIndex + 1) % VERTICAL_SELECTION_INDEX_COUNT; + selectionChanged = TRUE; + } else if (JOY_NEW(PAD_KEY_UP)) { + mailViewerApp->verticalSelectionIndex = (mailViewerApp->verticalSelectionIndex + VERTICAL_SELECTION_INDEX_COUNT - 1) % VERTICAL_SELECTION_INDEX_COUNT; + selectionChanged = TRUE; + } else if (JOY_NEW(PAD_KEY_RIGHT | PAD_KEY_LEFT)) { + if (mailViewerApp->verticalSelectionIndex == SELECTION_INDEX_CONFIRM_CANCEL) { + mailViewerApp->horizontalSelectionIndex ^= 1; + selectionChanged = TRUE; + } + } else { + return FALSE; + } + + if (!selectionChanged) { + return FALSE; + } + + Sound_PlayEffect(SEQ_SE_CONFIRM); + + if (mailViewerApp->verticalSelectionIndex == SELECTION_INDEX_CONFIRM_CANCEL) { + mailViewerApp->blendIndex = mailViewerApp->verticalSelectionIndex + mailViewerApp->horizontalSelectionIndex; + } else { + mailViewerApp->blendIndex = mailViewerApp->verticalSelectionIndex; + } + + return FALSE; +} + +static BOOL MailViewer_HandleConfirmEmpty(MailViewerApp *mailViewerApp) +{ + switch (mailViewerApp->subState) { + case 0: + Window_DrawMessageBoxWithScrollCursor(&mailViewerApp->windows[MAIL_VIEWER_WINDOW_MESSAGE], TRUE, 1 + STANDARD_WINDOW_TILE_COUNT, 6); + Window_FillTilemap(&(mailViewerApp->windows[MAIL_VIEWER_WINDOW_MESSAGE]), PIXEL_FILL(15)); + + String *string = String_Init(38 * 2, mailViewerApp->heapID); + + MessageLoader_GetString(mailViewerApp->loader, Mail_Text_EnterPhraseOrWord, string); + Text_AddPrinterWithParamsAndColor(&mailViewerApp->windows[MAIL_VIEWER_WINDOW_MESSAGE], FONT_MESSAGE, string, 0, 0, TEXT_SPEED_INSTANT, TEXT_COLOR(1, 2, 15), NULL); + String_Free(string); + break; + case 1: + if (!JOY_NEW(PAD_BUTTON_A | PAD_BUTTON_B)) { + return FALSE; + } + + Window_EraseMessageBox(&mailViewerApp->windows[MAIL_VIEWER_WINDOW_MESSAGE], TRUE); + Window_ClearAndCopyToVRAM(&mailViewerApp->windows[MAIL_VIEWER_WINDOW_MESSAGE]); + + mailViewerApp->subState = 0; + mailViewerApp->mode = mailViewerApp->initialMode; + + return FALSE; + } + + mailViewerApp->subState++; + return FALSE; +} + +static void MailViewer_OpenYesNoMenu(MailViewerApp *mailViewerApp) +{ + static const WindowTemplate template = { + .bgLayer = BG_LAYER_MAIN_0, + .tilemapLeft = 25, + .tilemapTop = 13, + .width = YES_NO_MENU_TILE_W, + .height = YES_NO_MENU_TILE_H, + .palette = 3, + .baseTile = BASE_TILE_MAIL_YES_NO_MENU, + }; + + mailViewerApp->yesNoMenu = Menu_MakeYesNoChoice(mailViewerApp->bgConfig, &template, 1, 5, mailViewerApp->heapID); +} + +static int MailViewer_CheckYesNoMenuInput(MailViewerApp *mailViewerApp) +{ + switch (Menu_ProcessInputAndHandleExit(mailViewerApp->yesNoMenu, mailViewerApp->heapID)) { + case MENU_YES: + return 1; + case MENU_CANCEL: + return 0; + } + + return -1; +} + +static BOOL MailViewer_HandleCancel(MailViewerApp *mailViewerApp) +{ + switch (mailViewerApp->subState) { + case 0: + mailViewerApp->pauseGlowEffect = TRUE; + + Window_DrawMessageBoxWithScrollCursor(&mailViewerApp->windows[MAIL_VIEWER_WINDOW_MESSAGE], TRUE, 1 + STANDARD_WINDOW_TILE_COUNT, 6); + Window_FillTilemap(&(mailViewerApp->windows[MAIL_VIEWER_WINDOW_MESSAGE]), PIXEL_FILL(15)); + + String *string = String_Init(38 * 2, mailViewerApp->heapID); + MessageLoader_GetString(mailViewerApp->loader, Mail_Text_StopGivingMailPrompt, string); + mailViewerApp->printerID = Text_AddPrinterWithParamsAndColor(&mailViewerApp->windows[MAIL_VIEWER_WINDOW_MESSAGE], FONT_MESSAGE, string, 0, 0, mailViewerApp->textFrameDelay, TEXT_COLOR(1, 2, 15), NULL); + + String_Free(string); + PaletteData_Blend(mailViewerApp->paletteData, PLTTBUF_MAIN_BG, MAIL_OPTION_PALETTE_SLOT_START + mailViewerApp->prevBlendIndex, 1, 0, COLOR_WHITE); + + mailViewerApp->prevBlendIndex = mailViewerApp->blendIndex; + mailViewerApp->blendDirection = 0; + mailViewerApp->blendFraction = 0; + break; + case 1: + if (Text_IsPrinterActive(mailViewerApp->printerID)) { + return FALSE; + } + + MailViewer_OpenYesNoMenu(mailViewerApp); + break; + case 2: + int result = MailViewer_CheckYesNoMenuInput(mailViewerApp); + + if (result < 0) { + return FALSE; + } + + Window_EraseMessageBox(&mailViewerApp->windows[MAIL_VIEWER_WINDOW_MESSAGE], TRUE); + Window_ClearAndCopyToVRAM(&(mailViewerApp->windows[MAIL_VIEWER_WINDOW_MESSAGE])); + mailViewerApp->subState = 0; + + if (result) { + mailViewerApp->args->result = MAIL_VIEWER_RESULT_CANCEL; + return TRUE; + } else { + mailViewerApp->mode = mailViewerApp->initialMode; + mailViewerApp->pauseGlowEffect = FALSE; + return FALSE; + } + } + + mailViewerApp->subState++; + return FALSE; +} + +static BOOL Main(MailViewerApp *mailViewerApp) +{ + switch (mailViewerApp->state) { + case MAIL_VIEWER_STATE_INIT: + SetVBlankCallback(NULL, NULL); + DisableHBlank(); + GXLayers_DisableEngineALayers(); + GXLayers_DisableEngineBLayers(); + + GX_SetVisiblePlane(0); + GXS_SetVisiblePlane(0); + + SetScreenColorBrightness(DS_SCREEN_MAIN, COLOR_BLACK); + SetScreenColorBrightness(DS_SCREEN_SUB, COLOR_BLACK); + ResetVisibleHardwareWindows(DS_SCREEN_MAIN); + ResetVisibleHardwareWindows(DS_SCREEN_SUB); + break; + case MAIL_VIEWER_STATE_INIT_GRAPHICS: + if (!MailViewer_InitGraphics(mailViewerApp)) { + return FALSE; + } + + SetVBlankCallback(MailViewer_VBlankCallback, mailViewerApp); + GXLayers_EngineAToggleLayers(GX_PLANEMASK_OBJ, TRUE); + ResetScreenMasterBrightness(DS_SCREEN_MAIN); + + G2_SetBlendAlpha(GX_BLEND_PLANEMASK_BG2, GX_BLEND_PLANEMASK_BG3, 28, 4); + + PaletteData_StartFade(mailViewerApp->paletteData, PLTTBUF_MAIN_BG_F | PLTTBUF_MAIN_OBJ_F, 0xFFFF, -1, 16, 0, 0x0); + break; + case MAIL_VIEWER_STATE_FADE_IN: + if (mailViewerApp->spriteMan != NULL) { + SpriteSystem_DrawSprites(mailViewerApp->spriteMan); + } + + if (PaletteData_GetSelectedBuffersMask(mailViewerApp->paletteData)) { + return FALSE; + } + break; + case MAIL_VIEWER_STATE_MAIN: + static const MailViewerModeFunc funcs[] = { + [MAIL_VIEWER_MODE_READ] = MailViewer_HandleInput_Read, + [MAIL_VIEWER_MODE_WRITE] = MailViewer_HandleInput_Write, + [MAIL_VIEWER_MODE_CONFIRM_EMPTY] = MailViewer_HandleConfirmEmpty, + [MAIL_VIEWER_MODE_CANCEL] = MailViewer_HandleCancel, + }; + + if (mailViewerApp->spriteMan != NULL) { + SpriteSystem_DrawSprites(mailViewerApp->spriteMan); + } + + if (!funcs[mailViewerApp->mode](mailViewerApp)) { + return FALSE; + } + + PaletteData_StartFade(mailViewerApp->paletteData, PLTTBUF_MAIN_BG_F | PLTTBUF_MAIN_OBJ_F, 0xFFFF, -1, 0, 16, 0x0); + break; + case MAIL_VIEWER_STATE_FADE_OUT: + if (PaletteData_GetSelectedBuffersMask(mailViewerApp->paletteData)) { + if (mailViewerApp->spriteMan != NULL) { + SpriteSystem_DrawSprites(mailViewerApp->spriteMan); + } + + return FALSE; + } + + SetScreenColorBrightness(DS_SCREEN_MAIN, COLOR_BLACK); + SetScreenColorBrightness(DS_SCREEN_SUB, COLOR_BLACK); + SetVBlankCallback(NULL, NULL); + GXLayers_DisableEngineALayers(); + GXLayers_DisableEngineBLayers(); + + GX_SetVisiblePlane(0); + GXS_SetVisiblePlane(0); + break; + case MAIL_VIEWER_STATE_EXIT: + if (MailViewer_FreeResources(mailViewerApp)) { + return TRUE; + } + + return FALSE; + } + + mailViewerApp->state++; + return FALSE; +} + +static void MailViewer_VBlankCallback(void *data) +{ + MailViewerApp *mailViewerApp = (MailViewerApp *)data; + + if (mailViewerApp->paletteData != NULL) { + PaletteData_CommitFadedBuffers(mailViewerApp->paletteData); + } + + if (mailViewerApp->spriteSys != NULL) { + SpriteSystem_TransferOam(); + } + + NNS_GfdDoVramTransfer(); + Bg_RunScheduledUpdates(mailViewerApp->bgConfig); + + OS_SetIrqCheckFlag(OS_IE_V_BLANK); +} + +static void MailViewer_SelectedGlowEffectTask(SysTask *sysTask, void *data) +{ + MailViewerApp *mailViewerApp = (MailViewerApp *)data; + + if (mailViewerApp->paletteData == NULL) { + SysTask_Done(sysTask); + return; + } + + if (mailViewerApp->pauseGlowEffect) { + return; + } + + if (mailViewerApp->prevBlendIndex != mailViewerApp->blendIndex) { + PaletteData_Blend(mailViewerApp->paletteData, PLTTBUF_MAIN_BG, MAIL_OPTION_PALETTE_SLOT_START + mailViewerApp->prevBlendIndex, 1, 0, COLOR_WHITE); + mailViewerApp->prevBlendIndex = mailViewerApp->blendIndex; + mailViewerApp->blendDirection = 0; + mailViewerApp->blendFraction = 0; + } + + PaletteData_Blend(mailViewerApp->paletteData, PLTTBUF_MAIN_BG, MAIL_OPTION_PALETTE_SLOT_START + mailViewerApp->blendIndex, 1, mailViewerApp->blendFraction, COLOR_WHITE); + + if (mailViewerApp->blendDirection) { + if (mailViewerApp->blendFraction-- == 1) { + mailViewerApp->blendDirection ^= 1; + } + } else { + if (mailViewerApp->blendFraction++ == 12) { + mailViewerApp->blendDirection ^= 1; + } + } +} + +static BOOL MailViewer_InitGraphics(MailViewerApp *mailViewerApp) +{ + switch (mailViewerApp->subState) { + case 0: + MailViewer_InitBackgrounds(mailViewerApp); + break; + case 1: + MailViewer_DrawMail(mailViewerApp); + break; + case 2: + MailViewer_AddWindows(mailViewerApp); + MailViewer_PrintText(mailViewerApp); + break; + case 3: + MailViewer_InitSprites(mailViewerApp); + mailViewerApp->subState = 0; + return TRUE; + } + + mailViewerApp->subState++; + return FALSE; +} + +static BOOL MailViewer_FreeResources(MailViewerApp *mailViewerApp) +{ + MailViewer_FreeSprites(mailViewerApp); + + // bug: dummy is never initialized + // heap is destroyed soon after this so memory shouldn't leak + if (mailViewerApp->dummy != NULL) { + MessageLoader_Free(mailViewerApp->loader); + } + + MailViewer_RemoveWindows(mailViewerApp); + MailViewer_FreeAssets(mailViewerApp); + MailViewer_TeardownBgs(mailViewerApp); + + return TRUE; +} + +static void MailViewer_SetVRAMBanks(void) +{ + GXBanks banks = { + GX_VRAM_BG_128_A, + GX_VRAM_BGEXTPLTT_NONE, + GX_VRAM_SUB_BG_128_C, + GX_VRAM_SUB_BGEXTPLTT_NONE, + GX_VRAM_OBJ_64_E, + GX_VRAM_OBJEXTPLTT_NONE, + GX_VRAM_SUB_OBJ_16_I, + GX_VRAM_SUB_OBJEXTPLTT_NONE, + GX_VRAM_TEX_NONE, + GX_VRAM_TEXPLTT_NONE + }; + + GXLayers_SetBanks(&banks); +} + +static void MailViewer_InitBackgrounds(MailViewerApp *mailViewerApp) +{ + MailViewer_SetVRAMBanks(); + + mailViewerApp->bgConfig = BgConfig_New(mailViewerApp->heapID); + + GraphicsModes graphicsModes = { + .displayMode = GX_DISPMODE_GRAPHICS, + .mainBgMode = GX_BGMODE_0, + .subBgMode = GX_BGMODE_0, + .bg0As2DOr3D = GX_BG0_AS_2D + }; + + SetAllGraphicsModes(&graphicsModes); + + BgTemplate bgTemplates[] = { + { + .x = 0, + .y = 0, + .bufferSize = 0x800, + .baseTile = 0, + .screenSize = BG_SCREEN_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_16, + .screenBase = GX_BG_SCRBASE_0xf800, + .charBase = GX_BG_CHARBASE_0x10000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 0, + .areaOver = 0, + .mosaic = FALSE, + }, + { + .x = 0, + .y = 0, + .bufferSize = 0x800, + .baseTile = 0, + .screenSize = BG_SCREEN_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_16, + .screenBase = GX_BG_SCRBASE_0xf000, + .charBase = GX_BG_CHARBASE_0x00000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 1, + .areaOver = 0, + .mosaic = FALSE, + }, + { + .x = 0, + .y = 0, + .bufferSize = 0x800, + .baseTile = 0, + .screenSize = BG_SCREEN_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_16, + .screenBase = GX_BG_SCRBASE_0xe800, + .charBase = GX_BG_CHARBASE_0x00000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 2, + .areaOver = 0, + .mosaic = FALSE, + }, + { + .x = 0, + .y = 0, + .bufferSize = 0x800, + .baseTile = 0, + .screenSize = BG_SCREEN_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_16, + .screenBase = GX_BG_SCRBASE_0xe000, + .charBase = GX_BG_CHARBASE_0x00000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 3, + .areaOver = 0, + .mosaic = FALSE, + }, + { + .x = 0, + .y = 0, + .bufferSize = 0x800, + .baseTile = 0, + .screenSize = BG_SCREEN_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_16, + .screenBase = GX_BG_SCRBASE_0xf800, + .charBase = GX_BG_CHARBASE_0x00000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 0, + .areaOver = 0, + .mosaic = FALSE, + }, + }; + + Bg_InitFromTemplate(mailViewerApp->bgConfig, BG_LAYER_MAIN_0, &bgTemplates[0], BG_TYPE_STATIC); + Bg_InitFromTemplate(mailViewerApp->bgConfig, BG_LAYER_MAIN_1, &bgTemplates[1], BG_TYPE_STATIC); + Bg_InitFromTemplate(mailViewerApp->bgConfig, BG_LAYER_MAIN_2, &bgTemplates[2], BG_TYPE_STATIC); + Bg_InitFromTemplate(mailViewerApp->bgConfig, BG_LAYER_MAIN_3, &bgTemplates[3], BG_TYPE_STATIC); + Bg_InitFromTemplate(mailViewerApp->bgConfig, BG_LAYER_SUB_0, &bgTemplates[4], BG_TYPE_STATIC); + + Bg_ClearTilemap(mailViewerApp->bgConfig, BG_LAYER_MAIN_0); + Bg_ClearTilemap(mailViewerApp->bgConfig, BG_LAYER_MAIN_1); + Bg_ClearTilemap(mailViewerApp->bgConfig, BG_LAYER_MAIN_2); + Bg_ClearTilemap(mailViewerApp->bgConfig, BG_LAYER_MAIN_3); + Bg_ClearTilemap(mailViewerApp->bgConfig, BG_LAYER_SUB_0); + Bg_ClearTilesRange(BG_LAYER_MAIN_0, TILE_SIZE_4BPP, 0, mailViewerApp->heapID); + Bg_ClearTilesRange(BG_LAYER_MAIN_1, TILE_SIZE_4BPP, 0, mailViewerApp->heapID); + Bg_ClearTilesRange(BG_LAYER_MAIN_2, TILE_SIZE_4BPP, 0, mailViewerApp->heapID); + Bg_ClearTilesRange(BG_LAYER_MAIN_3, TILE_SIZE_4BPP, 0, mailViewerApp->heapID); + Bg_ClearTilesRange(BG_LAYER_SUB_0, TILE_SIZE_4BPP, 0, mailViewerApp->heapID); +} + +static void MailViewer_TeardownBgs(MailViewerApp *mailViewerApp) +{ + Bg_FreeTilemapBuffer(mailViewerApp->bgConfig, BG_LAYER_SUB_0); + Bg_FreeTilemapBuffer(mailViewerApp->bgConfig, BG_LAYER_MAIN_3); + Bg_FreeTilemapBuffer(mailViewerApp->bgConfig, BG_LAYER_MAIN_2); + Bg_FreeTilemapBuffer(mailViewerApp->bgConfig, BG_LAYER_MAIN_1); + Bg_FreeTilemapBuffer(mailViewerApp->bgConfig, BG_LAYER_MAIN_0); + Heap_Free(mailViewerApp->bgConfig); +} + +static void MailViewer_DrawMail(MailViewerApp *mailViewerApp) +{ + NNSG2dCharacterData *charData; + NNSG2dPaletteData *plttData; + int tilesNarcIndex = grass_mail_tiles_NCGR + mailViewerApp->args->mailType; + int screenDataNarcIndex = grass_mail_NSCR + mailViewerApp->args->mailType; + int plttNarcIndex = grass_mail_tiles_NCLR + mailViewerApp->args->mailType; + NARC *narc = NARC_ctor(NARC_INDEX_GRAPHIC__MAIL_GRA, mailViewerApp->heapID); + + LoadStandardWindowGraphics(mailViewerApp->bgConfig, BG_LAYER_MAIN_0, 1, 5, STANDARD_WINDOW_SYSTEM, mailViewerApp->heapID); + LoadMessageBoxGraphics(mailViewerApp->bgConfig, BG_LAYER_MAIN_0, 1 + STANDARD_WINDOW_TILE_COUNT, 6, mailViewerApp->frame, mailViewerApp->heapID); + + u32 size = NARC_GetMemberSize(narc, tilesNarcIndex); + void *narcMemberBuffer = Heap_AllocAtEnd(mailViewerApp->heapID, size); + NARC_ReadWholeMember(narc, tilesNarcIndex, (void *)narcMemberBuffer); + + NNS_G2dGetUnpackedCharacterData(narcMemberBuffer, &charData); + Bg_LoadTiles(mailViewerApp->bgConfig, BG_LAYER_MAIN_1, charData->pRawData, charData->szByte, 0); + Bg_LoadTiles(mailViewerApp->bgConfig, BG_LAYER_SUB_0, charData->pRawData, charData->szByte, 0); + Heap_Free(narcMemberBuffer); + + size = NARC_GetMemberSize(narc, plttNarcIndex); + narcMemberBuffer = Heap_AllocAtEnd(mailViewerApp->heapID, size); + NARC_ReadWholeMember(narc, plttNarcIndex, (void *)narcMemberBuffer); + + NNS_G2dGetUnpackedPaletteData(narcMemberBuffer, &plttData); + Bg_LoadPalette(BG_LAYER_SUB_0, plttData->pRawData, plttData->szByte, 0); + + mailViewerApp->paletteData = PaletteData_New(mailViewerApp->heapID); + + PaletteData_AllocBuffer(mailViewerApp->paletteData, PLTTBUF_MAIN_BG, PALETTE_SIZE_BYTES * 7, mailViewerApp->heapID); + PaletteData_AllocBuffer(mailViewerApp->paletteData, PLTTBUF_MAIN_OBJ, PALETTE_SIZE_BYTES * 3, mailViewerApp->heapID); + PaletteData_LoadBuffer(mailViewerApp->paletteData, plttData->pRawData, PLTTBUF_MAIN_BG, 0, PALETTE_SIZE_BYTES * 3); + + if (mailViewerApp->mode == MAIL_VIEWER_MODE_WRITE) { + PaletteData_LoadBuffer(mailViewerApp->paletteData, &((u16 *)plttData->pRawData)[PLTT_OFFSET(3) / sizeof(u16)], PLTTBUF_MAIN_BG, PLTT_OFFSET(1) / sizeof(u16), PALETTE_SIZE_BYTES); + } + + PaletteData_LoadBufferFromFileStart(mailViewerApp->paletteData, NARC_INDEX_POKETOOL__ICONGRA__PL_POKE_ICON, shared_pals_NCLR, mailViewerApp->heapID, PLTTBUF_MAIN_OBJ, PALETTE_SIZE_BYTES * 3, 0); + PaletteData_LoadBufferFromFileStart(mailViewerApp->paletteData, NARC_INDEX_GRAPHIC__PL_FONT, font_NCLR, mailViewerApp->heapID, PLTTBUF_MAIN_BG, PALETTE_SIZE_BYTES, (PALETTE_SIZE_BYTES / sizeof(u16)) * 3); + PaletteData_LoadBufferFromFileStart(mailViewerApp->paletteData, NARC_INDEX_GRAPHIC__PL_FONT, screen_indicators_NCLR, mailViewerApp->heapID, PLTTBUF_MAIN_BG, PALETTE_SIZE_BYTES, (PALETTE_SIZE_BYTES / sizeof(u16)) * 4); + PaletteData_LoadBufferFromFileStart(mailViewerApp->paletteData, NARC_INDEX_GRAPHIC__PL_WINFRAME, standard_system_NCLR, mailViewerApp->heapID, PLTTBUF_MAIN_BG, PALETTE_SIZE_BYTES, (PALETTE_SIZE_BYTES / sizeof(u16)) * 5); + PaletteData_LoadBufferFromFileStart(mailViewerApp->paletteData, NARC_INDEX_GRAPHIC__PL_WINFRAME, message_box_00_NCLR + mailViewerApp->frame, mailViewerApp->heapID, PLTTBUF_MAIN_BG, PALETTE_SIZE_BYTES, (PALETTE_SIZE_BYTES / sizeof(u16)) * 6); + PaletteData_Blend(mailViewerApp->paletteData, PLTTBUF_MAIN_BG, 0, (PALETTE_SIZE_BYTES / sizeof(u16)) * 7, 16, COLOR_BLACK); + PaletteData_Blend(mailViewerApp->paletteData, PLTTBUF_MAIN_OBJ, 0, (PALETTE_SIZE_BYTES / sizeof(u16)) * 3, 16, COLOR_BLACK); + PaletteData_SetAutoTransparent(mailViewerApp->paletteData, TRUE); + PaletteData_CommitFadedBuffers(mailViewerApp->paletteData); + Heap_Free(narcMemberBuffer); + + size = NARC_GetMemberSize(narc, screenDataNarcIndex); + mailViewerApp->backgroundNSCRBuffer = Heap_Alloc(mailViewerApp->heapID, size); + NARC_ReadWholeMember(narc, screenDataNarcIndex, (void *)mailViewerApp->backgroundNSCRBuffer); + NNS_G2dGetUnpackedScreenData(mailViewerApp->backgroundNSCRBuffer, &mailViewerApp->backgroundScreenData); + + size = NARC_GetMemberSize(narc, interface_NSCR); + mailViewerApp->interfaceNSCRBuffer = Heap_Alloc(mailViewerApp->heapID, size); + NARC_ReadWholeMember(narc, interface_NSCR, (void *)mailViewerApp->interfaceNSCRBuffer); + NNS_G2dGetUnpackedScreenData(mailViewerApp->interfaceNSCRBuffer, &mailViewerApp->interfaceScreenData); + + NARC_dtor(narc); + Bg_FillTilemapRect(mailViewerApp->bgConfig, BG_LAYER_SUB_0, TILEMAP_PALETTE_SHIFT(2) | 1, 0, 0, SCREEN_WIDTH_TILES, 32, TILEMAP_FILL_VAL_INCLUDES_PALETTE); + Bg_CopyToTilemapRect(mailViewerApp->bgConfig, BG_LAYER_MAIN_3, 0, 0, SCREEN_WIDTH_TILES, SCREEN_HEIGHT_TILES, mailViewerApp->backgroundScreenData->rawData, 0, 0, mailViewerApp->backgroundScreenData->screenWidth / TILE_WIDTH_PIXELS, mailViewerApp->backgroundScreenData->screenHeight / TILE_HEIGHT_PIXELS); + Bg_ScheduleTilemapTransfer(mailViewerApp->bgConfig, BG_LAYER_MAIN_3); + Bg_ScheduleTilemapTransfer(mailViewerApp->bgConfig, BG_LAYER_SUB_0); + + if (mailViewerApp->mode == MAIL_VIEWER_MODE_WRITE) { + Bg_CopyToTilemapRect(mailViewerApp->bgConfig, BG_LAYER_MAIN_2, 0, 0, SCREEN_WIDTH_TILES, SCREEN_HEIGHT_TILES, mailViewerApp->interfaceScreenData->rawData, 0, 0, mailViewerApp->interfaceScreenData->screenWidth / TILE_WIDTH_PIXELS, mailViewerApp->interfaceScreenData->screenHeight / TILE_HEIGHT_PIXELS); + Bg_ScheduleTilemapTransfer(mailViewerApp->bgConfig, BG_LAYER_MAIN_2); + + mailViewerApp->blendFraction = 0; + mailViewerApp->blendDirection = 0; + + SysTask_Start(MailViewer_SelectedGlowEffectTask, mailViewerApp, 0); + } +} + +static void MailViewer_FreeAssets(MailViewerApp *mailViewerApp) +{ + Heap_Free(mailViewerApp->interfaceNSCRBuffer); + Heap_Free(mailViewerApp->backgroundNSCRBuffer); + PaletteData_FreeBuffer(mailViewerApp->paletteData, PLTTBUF_MAIN_OBJ); + PaletteData_FreeBuffer(mailViewerApp->paletteData, PLTTBUF_MAIN_BG); + PaletteData_Free(mailViewerApp->paletteData); + + mailViewerApp->paletteData = NULL; + + G2_SetBlendAlpha(GX_BLEND_PLANEMASK_NONE, GX_BLEND_PLANEMASK_NONE, 31, 0); +} + +static void MailViewer_AddWindows(MailViewerApp *mailViewerApp) +{ + Window_Add(mailViewerApp->bgConfig, &mailViewerApp->windows[MAIL_VIEWER_WINDOW_SENTENCE_1], BG_LAYER_MAIN_1, 3, 3, MAIL_SENTENCE_WINDOW_WIDTH, MAIL_SENTENCE_WINDOW_HEIGHT, 1, BASE_TILE_MAIL_SENTENCE_WINDOW_1); + Window_Add(mailViewerApp->bgConfig, &mailViewerApp->windows[MAIL_VIEWER_WINDOW_SENTENCE_2], BG_LAYER_MAIN_1, 3, 3 + MAIL_SENTENCE_WINDOW_HEIGHT + 1, MAIL_SENTENCE_WINDOW_WIDTH, MAIL_SENTENCE_WINDOW_HEIGHT, 1, BASE_TILE_MAIL_SENTENCE_WINDOW_2); + Window_Add(mailViewerApp->bgConfig, &mailViewerApp->windows[MAIL_VIEWER_WINDOW_SENTENCE_3], BG_LAYER_MAIN_1, 3, 3 + (MAIL_SENTENCE_WINDOW_HEIGHT + 1) * 2, MAIL_SENTENCE_WINDOW_WIDTH, MAIL_SENTENCE_WINDOW_HEIGHT, 1, BASE_TILE_MAIL_SENTENCE_WINDOW_3); + Window_Add(mailViewerApp->bgConfig, &mailViewerApp->windows[MAIL_VIEWER_WINDOW_CONFIRM], BG_LAYER_MAIN_1, 21, 20, MAIL_CONFIRM_CANCEL_WINDOW_WIDTH, MAIL_CONFIRM_CANCEL_WINDOW_HEIGHT, 1, BASE_TILE_MAIL_CONFIRM_WINDOW); + Window_Add(mailViewerApp->bgConfig, &mailViewerApp->windows[MAIL_VIEWER_WINDOW_CANCEL], BG_LAYER_MAIN_1, 3, 20, MAIL_CONFIRM_CANCEL_WINDOW_WIDTH, MAIL_CONFIRM_CANCEL_WINDOW_HEIGHT, 1, BASE_TILE_MAIL_CANCEL_WINDOW); + Window_Add(mailViewerApp->bgConfig, &mailViewerApp->windows[MAIL_VIEWER_WINDOW_MESSAGE], BG_LAYER_MAIN_0, 2, 19, MESSAGE_WINDOW_TILE_W, MESSAGE_WINDOW_TILE_H, 4, BASE_TILE_MAIL_MESSAGE_WINDOW); + + for (int i = 0; i < MAIL_VIEWER_WINDOW_COUNT; i++) { + Window_FillTilemap(&(mailViewerApp->windows[i]), 0); + + if (i < MAIL_VIEWER_WINDOW_MESSAGE) { + Window_CopyToVRAM(&mailViewerApp->windows[i]); + } + } +} + +static void MailViewer_RemoveWindows(MailViewerApp *mailViewerApp) +{ + for (int i = 0; i < MAIL_VIEWER_WINDOW_COUNT; i++) { + Window_ClearAndCopyToVRAM(&mailViewerApp->windows[i]); + Window_Remove(&mailViewerApp->windows[i]); + } +} + +static void MailViewer_PrintText(MailViewerApp *mailViewerApp) +{ + for (int i = 0; i < MAIL_MAX_SENTENCES; i++) { + if (!Sentence_IsValid(&mailViewerApp->args->sentences[i])) { + continue; + } + + String *sentenceStr = Sentence_AsString(&mailViewerApp->args->sentences[i], mailViewerApp->heapID); + + Text_AddPrinterWithParamsAndColor(&mailViewerApp->windows[i], FONT_MESSAGE, sentenceStr, 0, 0, TEXT_SPEED_INSTANT, TEXT_COLOR(1, 2, 0), NULL); + String_Free(sentenceStr); + Window_CopyToVRAM(&mailViewerApp->windows[i]); + } + + if (mailViewerApp->mode == MAIL_VIEWER_MODE_WRITE) { + mailViewerApp->loader = MessageLoader_Init(MSG_LOADER_LOAD_ON_DEMAND, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_MAIL, mailViewerApp->heapID); + + String *string = String_Init(8 * 2, mailViewerApp->heapID); + + for (int i = 0; i < 2; i++) { + String_Clear(string); + MessageLoader_GetString(mailViewerApp->loader, Mail_Text_Confirm + i, string); + + int xOffset = 8 * TILE_WIDTH_PIXELS - Font_CalcStringWidth(FONT_MESSAGE, string, 0); + xOffset /= 2; + + Text_AddPrinterWithParamsAndColor(&mailViewerApp->windows[MAIL_VIEWER_WINDOW_CONFIRM + i], FONT_MESSAGE, string, xOffset, 2, TEXT_SPEED_INSTANT, TEXT_COLOR(1, 2, 0), NULL); + Window_CopyToVRAM(&mailViewerApp->windows[MAIL_VIEWER_WINDOW_CONFIRM + i]); + } + + String_Free(string); + } else { + Text_AddPrinterWithParamsAndColor(&mailViewerApp->windows[MAIL_VIEWER_WINDOW_CONFIRM], FONT_MESSAGE, mailViewerApp->args->trainerName, 0, 2, TEXT_SPEED_INSTANT, TEXT_COLOR(1, 2, 0), NULL); + Window_CopyToVRAM(&mailViewerApp->windows[MAIL_VIEWER_WINDOW_CONFIRM]); + } +} + +static void MailViewer_InitSprites(MailViewerApp *mailViewerApp) +{ + SpriteTemplate spriteTemplate; + + NetworkIcon_InitIfConnected(); + + if (mailViewerApp->mode == MAIL_VIEWER_MODE_WRITE) { + return; + } + + VramTransfer_New(32, mailViewerApp->heapID); + + mailViewerApp->spriteSys = SpriteSystem_Alloc(mailViewerApp->heapID); + mailViewerApp->spriteMan = SpriteManager_New(mailViewerApp->spriteSys); + + RenderOamTemplate oamTemplate = { + .mainOamStart = 0, + .mainOamCount = 7, + .mainAffineOamStart = 1, + .mainAffineOamCount = 1, + .subOamStart = 0, + .subOamCount = 1, + .subAffineOamStart = 1, + .subAffineOamCount = 1, + }; + + CharTransferTemplateWithModes transferTemplate = { + .maxTasks = 3, + .sizeMain = 1024, + .sizeSub = 0, + .modeMain = GX_OBJVRAMMODE_CHAR_1D_32K, + .modeSub = GX_OBJVRAMMODE_CHAR_1D_32K, + }; + + const SpriteResourceCapacities capacities = { + .asStruct = { + .charCapacity = 3, + .plttCapacity = 1, + .cellCapacity = 1, + .animCapacity = 1, + .mcellCapacity = 0, + .manimCapacity = 0, + } + }; + + SpriteSystem_Init(mailViewerApp->spriteSys, &oamTemplate, &transferTemplate, 32); + SpriteSystem_InitSprites(mailViewerApp->spriteSys, mailViewerApp->spriteMan, 3); + SpriteSystem_InitManagerWithCapacities(mailViewerApp->spriteSys, mailViewerApp->spriteMan, &capacities); + RenderOam_ClearMain(mailViewerApp->heapID); + + SpriteSystem_LoadPlttResObj(mailViewerApp->spriteSys, mailViewerApp->spriteMan, NARC_INDEX_POKETOOL__ICONGRA__PL_POKE_ICON, PokeIconPalettesFileIndex(), FALSE, 3, NNS_G2D_VRAM_TYPE_2DMAIN, 0); + SpriteSystem_LoadCellResObj(mailViewerApp->spriteSys, mailViewerApp->spriteMan, NARC_INDEX_POKETOOL__ICONGRA__PL_POKE_ICON, PokeIconCellsFileIndex(), FALSE, 0); + SpriteSystem_LoadAnimResObj(mailViewerApp->spriteSys, mailViewerApp->spriteMan, NARC_INDEX_POKETOOL__ICONGRA__PL_POKE_ICON, PokeIconAnimationFileIndex(), FALSE, 0); + + for (int i = 0; i < MAIL_MAX_ICONS; i++) { + if (mailViewerApp->args->iconData[i].asValue == MAIL_MON_ICON_NONE) { + break; + } + + SpriteSystem_LoadCharResObjWithHardwareMappingType(mailViewerApp->spriteSys, mailViewerApp->spriteMan, NARC_INDEX_POKETOOL__ICONGRA__PL_POKE_ICON, mailViewerApp->args->iconData[i].asStruct.spriteIndex, FALSE, NNS_G2D_VRAM_TYPE_2DMAIN, i); + MI_CpuClear8(&spriteTemplate, sizeof(SpriteTemplate)); + + spriteTemplate.x = 128 - 40 * i; + spriteTemplate.y = 160; + spriteTemplate.z = 0; + + spriteTemplate.animIdx = 0; + spriteTemplate.bgPriority = 2; + spriteTemplate.plttIdx = mailViewerApp->args->iconData[i].asStruct.palIndex; + spriteTemplate.vramTransfer = FALSE; + spriteTemplate.vramType = NNS_G2D_VRAM_TYPE_2DMAIN; + + spriteTemplate.resources[SPRITE_RESOURCE_CHAR] = i; + spriteTemplate.resources[SPRITE_RESOURCE_PLTT] = 0; + spriteTemplate.resources[SPRITE_RESOURCE_CELL] = 0; + spriteTemplate.resources[SPRITE_RESOURCE_ANIM] = 0; + spriteTemplate.resources[SPRITE_RESOURCE_MULTI_CELL] = SPRITE_RESOURCE_NONE; + spriteTemplate.resources[SPRITE_RESOURCE_MULTI_ANIM] = SPRITE_RESOURCE_NONE; + + mailViewerApp->managedSprites[i] = SpriteSystem_NewSprite(mailViewerApp->spriteSys, mailViewerApp->spriteMan, &spriteTemplate); + + if (mailViewerApp->args->iconData[i].asStruct.spriteIndex == icon_00000_NCGR) { + ManagedSprite_SetDrawFlag(mailViewerApp->managedSprites[i], FALSE); + } + } +} + +static void MailViewer_FreeSprites(MailViewerApp *mailViewerApp) +{ + if (mailViewerApp->mode == MAIL_VIEWER_MODE_READ) { + for (int i = 0; i < MAIL_MAX_ICONS; i++) { + if (mailViewerApp->managedSprites[i] != NULL) { + Sprite_DeleteAndFreeResources(mailViewerApp->managedSprites[i]); + } + } + + SpriteSystem_FreeResourcesAndManager(mailViewerApp->spriteSys, mailViewerApp->spriteMan); + SpriteSystem_Free(mailViewerApp->spriteSys); + VramTransfer_Free(); + } +} diff --git a/src/applications/party_menu/main.c b/src/applications/party_menu/main.c index 78264aa8c0..07b8bfbd26 100644 --- a/src/applications/party_menu/main.c +++ b/src/applications/party_menu/main.c @@ -2771,7 +2771,7 @@ static int ProcessItemApplication(PartyMenuApplication *application) switch (CheckItemUsageValidity(application)) { case 0: if (Item_IsMail(application->partyMenu->usedItemID) == TRUE) { - application->partyMenu->menuSelectionResult = PARTY_MENU_EXIT_CODE_MAIL; + application->partyMenu->menuSelectionResult = PARTY_MENU_EXIT_CODE_WRITE_MAIL; return PARTY_MENU_STATE_32; } @@ -2906,7 +2906,7 @@ static int ProcessPokemonItemSwap(PartyMenuApplication *application) if (Item_IsMail(application->partyMenu->usedItemID) == 1) { Bag_TryRemoveItem(application->partyMenu->bag, (u16)v5, 1, HEAP_ID_PARTY_MENU); SwapPokemonItem(application, mon, v4, v5); - application->partyMenu->menuSelectionResult = PARTY_MENU_EXIT_CODE_MAIL; + application->partyMenu->menuSelectionResult = PARTY_MENU_EXIT_CODE_WRITE_MAIL; return PARTY_MENU_STATE_32; } diff --git a/src/applications/party_menu/unk_02083370.c b/src/applications/party_menu/unk_02083370.c index dcbf345715..0b2c9ea968 100644 --- a/src/applications/party_menu/unk_02083370.c +++ b/src/applications/party_menu/unk_02083370.c @@ -5,6 +5,7 @@ #include "generated/items.h" +#include "applications/mail.h" #include "applications/party_menu/defs.h" #include "applications/party_menu/form_change.h" #include "applications/party_menu/main.h" @@ -29,7 +30,6 @@ #include "string_template.h" #include "system.h" #include "text.h" -#include "unk_02097624.h" #include "res/text/bank/party_menu.h" @@ -310,7 +310,7 @@ static int sub_0208384C(void *applicationPtr) application = applicationPtr; v1 = Party_GetPokemonBySlotIndex(application->partyMenu->party, application->currPartySlot); - if (sub_02097788(application->partyMenu->mailbox, v1, HEAP_ID_PARTY_MENU) != 0xFFFFFFFF) { + if (Mail_TransferFromMonToMailbox(application->partyMenu->mailbox, v1, HEAP_ID_PARTY_MENU) != 0xFFFFFFFF) { application->partyMembers[application->currPartySlot].heldItem = ITEM_NONE; PartyMenu_DrawMemberHeldItem(application, application->currPartySlot, application->partyMembers[application->currPartySlot].heldItem); PartyMenu_PrintLongMessage(application, PartyMenu_Text_MailWasSentToYourPC, FALSE); diff --git a/src/battle/battle_system.c b/src/battle/battle_system.c index 5a7ed406de..e3ecdaa6a2 100644 --- a/src/battle/battle_system.c +++ b/src/battle/battle_system.c @@ -1606,9 +1606,9 @@ u8 BattleMessage_PrintTrainerMessage(BattleSystem *battleSys, int trainerID, int String *string; if (msgType == TRMSG_WIN) { - string = sub_02014B34(&battleSys->trainers[battler].winMsg, HEAP_ID_BATTLE); + string = Sentence_AsString(&battleSys->trainers[battler].winMsg, HEAP_ID_BATTLE); } else { - string = sub_02014B34(&battleSys->trainers[battler].loseMsg, HEAP_ID_BATTLE); + string = Sentence_AsString(&battleSys->trainers[battler].loseMsg, HEAP_ID_BATTLE); } Window_FillTilemap(window, 0xFF); diff --git a/src/daycare_save.c b/src/daycare_save.c index b032c94df6..06d044d2f6 100644 --- a/src/daycare_save.c +++ b/src/daycare_save.c @@ -6,8 +6,7 @@ #include "constants/charcode.h" #include "constants/daycare.h" -#include "struct_defs/mail.h" - +#include "mail.h" #include "pokemon.h" #include "savedata.h" diff --git a/src/evolution.c b/src/evolution.c index c075f40d1c..5902a56368 100644 --- a/src/evolution.c +++ b/src/evolution.c @@ -10,7 +10,6 @@ #include "generated/species.h" #include "generated/trainer_score_events.h" -#include "struct_defs/mail.h" #include "struct_defs/seal_case.h" #include "struct_defs/sprite_animation_frame.h" #include "struct_defs/struct_0207C894.h" diff --git a/src/game_records.c b/src/game_records.c index cd81928ad7..8034a1336f 100644 --- a/src/game_records.c +++ b/src/game_records.c @@ -132,7 +132,7 @@ static u8 sUsesHighLimit[MAX_RECORDS] = { [RECORD_UNK_042] = FALSE, [RECORD_UNK_043] = FALSE, [RECORD_UNK_044] = FALSE, - [RECORD_UNK_045] = FALSE, + [RECORD_TIMES_MAIL_WRITTEN] = FALSE, [RECORD_UNK_046] = FALSE, [RECORD_SPHERES_BURIED] = FALSE, [RECORD_WATCHED_TV] = FALSE, @@ -260,7 +260,7 @@ static u32 GetRecordLimit(int id) static const u16 sTrainerScoreIncrements[MAX_TRAINER_SCORE_EVENTS] = { [TRAINER_SCORE_EVENT_BERRY_HARVESTED] = 1, [TRAINER_SCORE_EVENT_HONEY_USED] = 1, - [TRAINER_SCORE_EVENT_UNK_02] = 1, + [TRAINER_SCORE_EVENT_MAIL_WRITTEN] = 1, [TRAINER_SCORE_EVENT_TV_INTERVIEW_GIVEN] = 1, [TRAINER_SCORE_EVENT_SIGNED_TRAINER_CARD] = 1, [TRAINER_SCORE_EVENT_UNK_05] = 1, diff --git a/src/item.c b/src/item.c index 8c8bd7be1f..4645496fdd 100644 --- a/src/item.c +++ b/src/item.c @@ -3328,7 +3328,7 @@ u8 Item_TMHMNumber(u16 item) u8 Item_IsMail(u16 item) { - for (u32 i = 0; i < NUM_MAILS; i++) { + for (u32 i = 0; i < NUM_MAIL_TYPES; i++) { if (sMailItemIDs[i] == item) { return TRUE; } @@ -3337,9 +3337,9 @@ u8 Item_IsMail(u16 item) return FALSE; } -u8 Item_MailNumber(u16 item) +u8 Item_GetMailType(u16 item) { - for (u32 i = 0; i < NUM_MAILS; i++) { + for (u32 i = 0; i < NUM_MAIL_TYPES; i++) { if (sMailItemIDs[i] == item) { return i; } @@ -3348,13 +3348,13 @@ u8 Item_MailNumber(u16 item) return ITEM_NONE; } -u16 Item_ForMailNumber(u8 mail) +u16 Item_ForMailType(u8 mailType) { - if (mail >= NUM_MAILS) { + if (mailType >= NUM_MAIL_TYPES) { return ITEM_NONE; } - return sMailItemIDs[mail]; + return sMailItemIDs[mailType]; } u8 Item_IsBerry(u16 item) diff --git a/src/item_use_functions.c b/src/item_use_functions.c index 71a5d80c05..3cefcf38d6 100644 --- a/src/item_use_functions.c +++ b/src/item_use_functions.c @@ -7,8 +7,8 @@ #include "constants/savedata/vars_flags.h" #include "struct_decls/map_object.h" -#include "struct_defs/struct_02097728.h" +#include "applications/mail.h" #include "applications/party_menu/defs.h" #include "applications/party_menu/main.h" #include "applications/poffin_case/main.h" @@ -551,10 +551,10 @@ static void UseMailFromMenu(ItemMenuUseContext *usageContext, const ItemUseConte { FieldSystem *fieldSystem = FieldTask_GetFieldSystem(usageContext->fieldTask); StartMenu *menu = FieldTask_GetEnv(usageContext->fieldTask); - UnkStruct_02097728 *v2 = sub_0203D94C(fieldSystem, 3, Item_MailNumber(usageContext->item), HEAP_ID_FIELD2); + MailAppArgs *args = FieldSystem_LaunchMailApp_Read(fieldSystem, MAIL_CONTEXT_CHECK, Item_GetMailType(usageContext->item), HEAP_ID_FIELD2); - menu->additionalTaskContext = sub_0203C540(usageContext->item, 3, 0); - menu->taskData = v2; + menu->additionalTaskContext = StartMenu_BuildMailData(usageContext->item, MAIL_READ_FROM_BAG, 0); + menu->taskData = args; StartMenu_SetCallback(menu, StartMenu_ExitMail); } diff --git a/src/mail.c b/src/mail.c index 5baceb609e..45b3089283 100644 --- a/src/mail.c +++ b/src/mail.c @@ -1,16 +1,12 @@ #include "mail.h" #include -#include #include "constants/forms.h" #include "constants/items.h" #include "generated/genders.h" #include "generated/species.h" -#include "struct_defs/mail.h" -#include "struct_defs/union_02028328.h" - #include "charcode_util.h" #include "heap.h" #include "party.h" @@ -21,52 +17,54 @@ #include "trainer_info.h" #include "unk_02014A84.h" -static int Mail_GetEmptySlotInArray_(Mail *array, int arraySize); -static int Mail_GetEmptySlotCountInArray(Mail *array, int arraySize); -static Mail *Mailbox_GetMailFromSlot(Mailbox *mailbox, int param1, int slot); +#include "res/pokemon/pl_poke_icon.naix" +#include "res/pokemon/species_icon_palettes.h" + +#define IconTilesIndex(icon) (icon + icon_00000_NCGR) + +static int Mail_GetEmptySlot(Mail array[], int arraySize); +static int Mail_CountValidMail(Mail array[], int arraySize); +static Mail *GetMailAtMailboxSlot(Mailbox *mailbox, enum MailContext context, int slot); static const struct { - u16 unk_00; - u16 unk_02; + u16 baseSpriteIndex; + u16 formSpriteIndex; u16 species; u8 form; - u8 unk_07; -} Unk_020E5B0C[] = { - { 0x1EE, 0x21C, SPECIES_GIRATINA, GIRATINA_FORM_ORIGIN }, - { 0x1F3, 0x21D, SPECIES_SHAYMIN, SHAYMIN_FORM_SKY }, - { 0x1E6, 0x21E, SPECIES_ROTOM, ROTOM_FORM_HEAT }, - { 0x1E6, 0x21F, SPECIES_ROTOM, ROTOM_FORM_WASH }, - { 0x1E6, 0x220, SPECIES_ROTOM, ROTOM_FORM_FROST }, - { 0x1E6, 0x221, SPECIES_ROTOM, ROTOM_FORM_FAN }, - { 0x1E6, 0x222, SPECIES_ROTOM, ROTOM_FORM_MOW } +} sPlatExclusiveFormData[] = { + { .baseSpriteIndex = IconTilesIndex(SPECIES_GIRATINA), .formSpriteIndex = IconTilesIndex(ICON_GIRATINA_ORIGIN), .species = SPECIES_GIRATINA, .form = GIRATINA_FORM_ORIGIN }, + { .baseSpriteIndex = IconTilesIndex(SPECIES_SHAYMIN), .formSpriteIndex = IconTilesIndex(ICON_SHAYMIN_SKY), .species = SPECIES_SHAYMIN, .form = SHAYMIN_FORM_SKY }, + { .baseSpriteIndex = IconTilesIndex(SPECIES_ROTOM), .formSpriteIndex = IconTilesIndex(ICON_ROTOM_HEAT), .species = SPECIES_ROTOM, .form = ROTOM_FORM_HEAT }, + { .baseSpriteIndex = IconTilesIndex(SPECIES_ROTOM), .formSpriteIndex = IconTilesIndex(ICON_ROTOM_WASH), .species = SPECIES_ROTOM, .form = ROTOM_FORM_WASH }, + { .baseSpriteIndex = IconTilesIndex(SPECIES_ROTOM), .formSpriteIndex = IconTilesIndex(ICON_ROTOM_FROST), .species = SPECIES_ROTOM, .form = ROTOM_FORM_FROST }, + { .baseSpriteIndex = IconTilesIndex(SPECIES_ROTOM), .formSpriteIndex = IconTilesIndex(ICON_ROTOM_FAN), .species = SPECIES_ROTOM, .form = ROTOM_FORM_FAN }, + { .baseSpriteIndex = IconTilesIndex(SPECIES_ROTOM), .formSpriteIndex = IconTilesIndex(ICON_ROTOM_MOW), .species = SPECIES_ROTOM, .form = ROTOM_FORM_MOW } }; -void Mail_Init(Mail *mail) +void Mail_Reset(Mail *mail) { - int i; - mail->trainerID = 0; mail->trainerGender = GENDER_MALE; mail->language = gGameLanguage; mail->gameVersion = gGameVersion; - mail->mailType = 0xFFFF; + mail->mailType = MAIL_TYPE_NONE; - CharCode_FillWithEOS(mail->trainerName, 8); + CharCode_FillWithEOS(mail->trainerName, TRAINER_NAME_LEN + 1); - for (i = 0; i < 3; i++) { - mail->unk_18[i].val2 = 0xFFFF; + for (int i = 0; i < MAIL_MAX_ICONS; i++) { + mail->iconData[i].asValue = MAIL_MON_ICON_NONE; } - mail->unk_1E = 0; + mail->platExclusiveFormIcons = 0; - for (i = 0; i < 3; i++) { - sub_02014A84(&mail->unk_20[i]); + for (int i = 0; i < MAIL_MAX_SENTENCES; i++) { + Sentence_Init(&mail->sentences[i]); } } -BOOL Mail_IsEmpty(Mail *mail) +BOOL Mail_IsValid(Mail *mail) { - if ((mail->mailType >= 0) && (mail->mailType <= 11)) { + if (0 <= mail->mailType && mail->mailType <= NUM_MAIL_TYPES - 1) { return TRUE; } @@ -76,7 +74,7 @@ BOOL Mail_IsEmpty(Mail *mail) Mail *Mail_New(enum HeapID heapID) { Mail *mail = Heap_AllocAtEnd(heapID, sizeof(Mail)); - Mail_Init(mail); + Mail_Reset(mail); return mail; } @@ -86,49 +84,45 @@ void Mail_Copy(Mail *src, Mail *dest) MI_CpuCopy8(src, dest, sizeof(Mail)); } -void sub_020281AC(Mail *mail, u8 mailType, u8 param2, SaveData *saveData) +void Mail_SetTrainerAndIconData(Mail *mail, u8 mailType, u8 selectedPartySlot, SaveData *saveData) { - u8 i, v1, palIndex, j; - u16 species; - u32 spriteIndex, isEgg, form; - TrainerInfo *trainerInfo; - Pokemon *mon; + u32 isEgg; - Mail_Init(mail); + Mail_Reset(mail); mail->mailType = mailType; Party *party = SaveData_GetParty(saveData); - trainerInfo = SaveData_GetTrainerInfo(saveData); + TrainerInfo *trainerInfo = SaveData_GetTrainerInfo(saveData); CharCode_Copy(mail->trainerName, TrainerInfo_Name(trainerInfo)); - mail->trainerGender = (u8)TrainerInfo_Gender(trainerInfo); + mail->trainerGender = TrainerInfo_Gender(trainerInfo); mail->trainerID = TrainerInfo_ID(trainerInfo); - mail->unk_1E = 0; + mail->platExclusiveFormIcons = 0; - for (i = param2, v1 = 0; i < Party_GetCurrentCount(party); i++) { - mon = Party_GetPokemonBySlotIndex(party, i); - species = Pokemon_GetValue(mon, MON_DATA_SPECIES, NULL); + for (u8 slot = selectedPartySlot, i = 0; slot < Party_GetCurrentCount(party); slot++) { + Pokemon *mon = Party_GetPokemonBySlotIndex(party, slot); + u16 species = Pokemon_GetValue(mon, MON_DATA_SPECIES, NULL); isEgg = Pokemon_GetValue(mon, MON_DATA_IS_EGG, NULL); - form = Pokemon_GetValue(mon, MON_DATA_FORM, NULL); - spriteIndex = Pokemon_IconSpriteIndex(mon); - palIndex = PokeIconPaletteIndex(species, form, isEgg); + u32 form = Pokemon_GetValue(mon, MON_DATA_FORM, NULL); + u32 spriteIndex = Pokemon_IconSpriteIndex(mon); + u8 palIndex = PokeIconPaletteIndex(species, form, isEgg); - mail->unk_18[v1].val1_0 = (u16)spriteIndex; - mail->unk_18[v1].val1_12 = palIndex; + mail->iconData[i].asStruct.spriteIndex = spriteIndex; + mail->iconData[i].asStruct.palIndex = palIndex; - for (j = 0; j < NELEMS(Unk_020E5B0C); j++) { - if ((Unk_020E5B0C[j].unk_02 == mail->unk_18[v1].val1_0) && (Unk_020E5B0C[j].form == form)) { - mail->unk_18[v1].val1_0 = Unk_020E5B0C[j].unk_00; - mail->unk_18[v1].val1_12 = PokeIconPaletteIndex(species, 0, isEgg); - mail->unk_1E |= Unk_020E5B0C[j].form << (v1 * 5); + for (u8 j = 0; j < NELEMS(sPlatExclusiveFormData); j++) { + if (sPlatExclusiveFormData[j].formSpriteIndex == mail->iconData[i].asStruct.spriteIndex && sPlatExclusiveFormData[j].form == form) { + mail->iconData[i].asStruct.spriteIndex = sPlatExclusiveFormData[j].baseSpriteIndex; + mail->iconData[i].asStruct.palIndex = PokeIconPaletteIndex(species, 0, isEgg); + mail->platExclusiveFormIcons |= sPlatExclusiveFormData[j].form << (i * 5); break; } } - v1++; + i++; - if (v1 >= 3) { + if (i >= MAIL_MAX_ICONS) { break; } } @@ -139,9 +133,9 @@ u32 Mail_GetTrainerID(const Mail *mail) return mail->trainerID; } -u16 *Mail_GetTrainerName(Mail *mail) +charcode_t *Mail_GetTrainerName(Mail *mail) { - return &(mail->trainerName[0]); + return &mail->trainerName[0]; } u8 Mail_GetTrainerGender(const Mail *mail) @@ -156,7 +150,7 @@ u8 Mail_GetMailType(const Mail *mail) void Mail_SetMailType(Mail *mail, const u8 mailType) { - if (mailType >= NUM_MAILS) { + if (mailType >= NUM_MAIL_TYPES) { return; } @@ -173,62 +167,59 @@ u8 Mail_GetGameVersion(const Mail *mail) return mail->gameVersion; } -u16 sub_02028328(const Mail *mail, u8 param1, u8 param2, u16 param3) +u16 Mail_GetIconData(const Mail *mail, u8 index, enum MailIconDataType type, u16 platExclusiveFormIcons) { - UnkUnion_02028328 v0; - int i; + if (index < MAIL_MAX_ICONS) { + MailIconData iconData = mail->iconData[index]; - if (param1 < 3) { - v0 = mail->unk_18[param1]; - - for (i = 0; i < NELEMS(Unk_020E5B0C); i++) { - if ((Unk_020E5B0C[i].unk_00 == v0.val1_0) && (Unk_020E5B0C[i].form == ((param3 >> (param1 * 5)) & 0x1f))) { - v0.val1_0 = Unk_020E5B0C[i].unk_02; - v0.val1_12 = PokeIconPaletteIndex(Unk_020E5B0C[i].species, Unk_020E5B0C[i].form, FALSE); + for (int i = 0; i < NELEMS(sPlatExclusiveFormData); i++) { + if (sPlatExclusiveFormData[i].baseSpriteIndex == iconData.asStruct.spriteIndex && sPlatExclusiveFormData[i].form == ((platExclusiveFormIcons >> (index * 5)) & 0x1F)) { + iconData.asStruct.spriteIndex = sPlatExclusiveFormData[i].formSpriteIndex; + iconData.asStruct.palIndex = PokeIconPaletteIndex(sPlatExclusiveFormData[i].species, sPlatExclusiveFormData[i].form, FALSE); break; } } - if (v0.val1_0 > 546) { - v0.val1_0 = 7; - v0.val1_12 = 0; + if (iconData.asStruct.spriteIndex > IconTilesIndex(ICON_ROTOM_MOW)) { + iconData.asStruct.spriteIndex = icon_00000_NCGR; + iconData.asStruct.palIndex = 0; } - switch (param2) { - case 0: - return v0.val1_0; - case 1: - return v0.val1_12; - case 2: + switch (type) { + case ICON_DATA_SPRITE_INDEX: + return iconData.asStruct.spriteIndex; + case ICON_DATA_PLTT_INDEX: + return iconData.asStruct.palIndex; + case ICON_DATA_VALUE: default: - return v0.val2; + return iconData.asValue; } } else { return 0; } } -u16 sub_02028408(const Mail *param0) +u16 Mail_GetPlatExclusiveFormIcons(const Mail *mail) { - return param0->unk_1E; + return mail->platExclusiveFormIcons; } -Sentence *sub_0202840C(Mail *param0, u8 param1) +Sentence *Mail_GetSentence(Mail *mail, u8 index) { - if (param1 < 3) { - return &(param0->unk_20[param1]); + if (index < MAIL_MAX_SENTENCES) { + return &mail->sentences[index]; } else { - return &(param0->unk_20[0]); + return &mail->sentences[0]; } } -void sub_0202841C(Mail *param0, Sentence *param1, u8 param2) +void Mail_SetSentence(Mail *mail, Sentence *sentence, u8 index) { - if (param2 >= 3) { + if (index >= MAIL_MAX_SENTENCES) { return; } - sub_02014CC0(¶m0->unk_20[param2], param1); + Sentence_Set(&mail->sentences[index], sentence); } Mailbox *SaveData_GetMailbox(SaveData *saveData) @@ -243,98 +234,87 @@ int Mailbox_SaveSize(void) void Mailbox_Init(Mailbox *mailbox) { - int i = 0; - - for (i = 0; i < MAILBOX_SIZE; i++) { - Mail_Init(&mailbox->mail[i]); + for (int i = 0; i < MAILBOX_SIZE; i++) { + Mail_Reset(&mailbox->mail[i]); } } -int Mail_GetEmptySlotInArray(Mailbox *mailbox, int param1) +int Mail_GetEmptyMailSlot(Mailbox *mailbox, enum MailContext context) { - switch (param1) { - case 0: - return Mail_GetEmptySlotInArray_(mailbox->mail, MAILBOX_SIZE); - default: - return 0xFFFFFFFF; + if (context == MAIL_CONTEXT_MAILBOX) { + return Mail_GetEmptySlot(mailbox->mail, MAILBOX_SIZE); + } else { + return -1; } - - return 0xFFFFFFFF; } -void sub_02028470(Mailbox *mailbox, int param1, int slot) +void Mailbox_ClearMailAtSlot(Mailbox *mailbox, enum MailContext context, int slot) { - Mail *mail = Mailbox_GetMailFromSlot(mailbox, param1, slot); + Mail *mail = GetMailAtMailboxSlot(mailbox, context, slot); if (mail != NULL) { - Mail_Init(mail); + Mail_Reset(mail); } } -void Mailbox_CopyMailToSlot(Mailbox *mailbox, int param1, int slot, Mail *src) +void Mailbox_CopyMailToSlot(Mailbox *mailbox, enum MailContext context, int slot, Mail *src) { - Mail *dest = Mailbox_GetMailFromSlot(mailbox, param1, slot); + Mail *dest = GetMailAtMailboxSlot(mailbox, context, slot); if (dest != NULL) { Mail_Copy(src, dest); } } -int sub_02028494(Mailbox *mailbox, int param1) +int Mailbox_CountMail(Mailbox *mailbox, enum MailContext context) { - switch (param1) { - case 0: - return Mail_GetEmptySlotCountInArray(mailbox->mail, MAILBOX_SIZE); - default: + if (context == MAIL_CONTEXT_MAILBOX) { + return Mail_CountValidMail(mailbox->mail, MAILBOX_SIZE); + } else { return 0; } - - return 0; } -Mail *sub_020284A8(Mailbox *mailbox, int param1, int slot, enum HeapID heapID) +Mail *Mailbox_CopyMailAtSlot(Mailbox *mailbox, enum MailContext context, int slot, enum HeapID heapID) { - Mail *v0 = Mailbox_GetMailFromSlot(mailbox, param1, slot); - Mail *v1 = Mail_New(heapID); + Mail *mail = GetMailAtMailboxSlot(mailbox, context, slot); + Mail *ret = Mail_New(heapID); - if (v0 != NULL) { - Mail_Copy(v0, v1); + if (mail != NULL) { + Mail_Copy(mail, ret); } - return v1; + return ret; } -void sub_020284CC(Mailbox *mailbox, int param1, int param2, Mail *param3) +void Mailbox_GetMailAtSlot(Mailbox *mailbox, enum MailContext context, int slot, Mail *out) { - Mail *v0 = Mailbox_GetMailFromSlot(mailbox, param1, param2); + Mail *mail = GetMailAtMailboxSlot(mailbox, context, slot); - if (v0 == NULL) { - Mail_Init(param3); + if (mail == NULL) { + Mail_Reset(out); } else { - Mail_Copy(v0, param3); + Mail_Copy(mail, out); } } -static int Mail_GetEmptySlotInArray_(Mail *array, int arraySize) +static int Mail_GetEmptySlot(Mail array[], int arraySize) { - int i = 0; - - for (i = 0; i < arraySize; i++) { - if (!Mail_IsEmpty(&array[i])) { + for (int i = 0; i < arraySize; i++) { + if (!Mail_IsValid(&array[i])) { return i; } } - return 0xFFFFFFFF; + return -1; } -static int Mail_GetEmptySlotCountInArray(Mail *array, int arraySize) +static int Mail_CountValidMail(Mail array[], int arraySize) { - int i = 0; int count = 0; - for (i = 0; i < arraySize; i++) { - if (Mail_IsEmpty(&array[i])) { + for (int i = 0; i < arraySize; i++) { + if (Mail_IsValid(&array[i])) { count++; } } @@ -342,19 +322,12 @@ static int Mail_GetEmptySlotCountInArray(Mail *array, int arraySize) return count; } -static Mail *Mailbox_GetMailFromSlot(Mailbox *mailbox, int param1, int slot) +static Mail *GetMailAtMailboxSlot(Mailbox *mailbox, enum MailContext context, int slot) { Mail *mail = NULL; - switch (param1) { - case 0: - if (slot < MAILBOX_SIZE) { - mail = &(mailbox->mail[slot]); - } - - break; - default: - break; + if (context == MAIL_CONTEXT_MAILBOX && slot < MAILBOX_SIZE) { + mail = &mailbox->mail[slot]; } return mail; diff --git a/src/meson.build b/src/meson.build index 166c2f7268..abe24171f1 100644 --- a/src/meson.build +++ b/src/meson.build @@ -318,7 +318,7 @@ pokeplatinum_c = files( 'unk_020972FC.c', 'berry_data.c', 'unk_0209747C.c', - 'unk_02097624.c', + 'applications/mail.c', 'unk_02097B18.c', 'egg_hatch.c', 'unk_020985E4.c', @@ -800,7 +800,7 @@ pokeplatinum_c = files( 'applications/rowan_intro/rowan_intro_app.c', 'applications/rowan_intro/tv_app.c', 'applications/options_menu.c', - 'overlay075/ov75_021D0D80.c', + 'applications/mail_viewer.c', 'overlay076/ov76_0223B140.c', 'overlay076/ov76_0223B870.c', 'overlay076/ov76_0223D338.c', diff --git a/src/overlay005/script_message.c b/src/overlay005/script_message.c index c6f5342e58..333b062963 100644 --- a/src/overlay005/script_message.c +++ b/src/overlay005/script_message.c @@ -149,12 +149,12 @@ static void GetStringFromSentence(ScriptMessage *msgData, u16 sentenceType, u16 Sentence sentence; String *string; - sub_02014A84(&sentence); + Sentence_Init(&sentence); sub_02014CE0(&sentence, sentenceType, sentenceID); Sentence_SetWord(&sentence, 0, word1); Sentence_SetWord(&sentence, 1, word2); - string = sub_02014B34(&sentence, HEAP_ID_FIELD3); + string = Sentence_AsString(&sentence, HEAP_ID_FIELD3); String_Copy(msgData->msgBuf, string); String_Free(string); diff --git a/src/overlay020/ov20_021D0D80.c b/src/overlay020/ov20_021D0D80.c index cadb4232f4..eeb6abcded 100644 --- a/src/overlay020/ov20_021D0D80.c +++ b/src/overlay020/ov20_021D0D80.c @@ -3,7 +3,6 @@ #include #include -#include "struct_decls/struct_0209747C_decl.h" #include "struct_decls/struct_020998EC_decl.h" #include "struct_defs/sentence.h" diff --git a/src/overlay056/ov56_022561C0.c b/src/overlay056/ov56_022561C0.c index fe054a37ce..6cac4b1005 100644 --- a/src/overlay056/ov56_022561C0.c +++ b/src/overlay056/ov56_022561C0.c @@ -801,7 +801,7 @@ static void ov56_02256EE8(UnkStruct_ov56_02256468 *param0, u32 param1, Sentence v0->unk_00[*v2].unk_14 = *param2; v0->unk_00[*v2].unk_0C = param1; v0->unk_00[*v2].unk_10 = TrainerInfo_Gender(param3); - v0->unk_00[*v2].unk_04 = sub_02014B34(param2, HEAP_ID_89); + v0->unk_00[*v2].unk_04 = Sentence_AsString(param2, HEAP_ID_89); v0->unk_00[*v2].unk_08 = ov56_02256E5C(v1, param1, param0->unk_18, param0->unk_1C, param0->unk_10); (*v2)++; @@ -815,7 +815,7 @@ static int ov56_02256FC8(UnkStruct_ov56_02256468 *param0, Sentence *param1, int { int v0, v1; - if (!sub_02014BBC(param1)) { + if (!Sentence_IsValid(param1)) { return 0; } diff --git a/src/overlay062/ov62_02231690.c b/src/overlay062/ov62_02231690.c index ea82a5f897..dfc7149a8a 100644 --- a/src/overlay062/ov62_02231690.c +++ b/src/overlay062/ov62_02231690.c @@ -516,7 +516,7 @@ static void ov62_02231C78(UnkStruct_ov62_022323B8 *param0, UnkStruct_0208C06C *p v8 = sub_02030C28(v11, &v15, HEAP_ID_102); if (v8 == NULL) { - v8 = sub_02014B34(&v15, HEAP_ID_102); + v8 = Sentence_AsString(&v15, HEAP_ID_102); } Window_FillTilemap(v10, 0x00); diff --git a/src/overlay075/ov75_021D0D80.c b/src/overlay075/ov75_021D0D80.c deleted file mode 100644 index e98ce81896..0000000000 --- a/src/overlay075/ov75_021D0D80.c +++ /dev/null @@ -1,944 +0,0 @@ -#include "overlay075/ov75_021D0D80.h" - -#include -#include - -#include "constants/narc.h" - -#include "struct_defs/struct_020978D8.h" - -#include "bg_window.h" -#include "enums.h" -#include "font.h" -#include "game_options.h" -#include "gx_layers.h" -#include "heap.h" -#include "menu.h" -#include "message.h" -#include "narc.h" -#include "network_icon.h" -#include "overlay_manager.h" -#include "palette.h" -#include "pokemon_icon.h" -#include "render_oam.h" -#include "render_text.h" -#include "render_window.h" -#include "screen_fade.h" -#include "sound_playback.h" -#include "sprite_system.h" -#include "string_gf.h" -#include "sys_task.h" -#include "sys_task_manager.h" -#include "system.h" -#include "text.h" -#include "unk_02014A84.h" -#include "vram_transfer.h" - -enum { - UnkEnum_ov75_021D1598_00, - UnkEnum_ov75_021D1598_01, - UnkEnum_ov75_021D1598_02, - UnkEnum_ov75_021D1598_03, - UnkEnum_ov75_021D1598_04, - UnkEnum_ov75_021D1598_05, - UnkEnum_ov75_021D1598_06, - UnkEnum_ov75_021D1598_07, -}; - -enum { - UnkEnum_ov75_021D0E80_00, - UnkEnum_ov75_021D0E80_01, - UnkEnum_ov75_021D0E80_02, - UnkEnum_ov75_021D0E80_03 -} UnkEnum_ov75_021D0E80; - -typedef struct { - enum HeapID heapID; - int unk_04; - u16 unk_08; - u16 unk_0A; - u8 unk_0C; - u8 unk_0D; - u8 unk_0E; - u8 unk_0F; - u8 unk_10; - u8 unk_11; - u8 unk_12; - u8 unk_13; - u8 unk_14; - u8 unk_15; - u8 unk_16; - u8 unk_17; - BgConfig *unk_18; - UnkStruct_020978D8 *unk_1C; - MessageLoader *unk_20; - String *unk_24[3]; - PaletteData *unk_30; - void *unk_34; - void *unk_38; - NNSG2dScreenData *unk_3C; - NNSG2dScreenData *unk_40; - Window unk_44[6]; - Menu *unk_A4; - SpriteSystem *unk_A8; - SpriteManager *unk_AC; - ManagedSprite *unk_B0[3]; -} UnkStruct_ov75_021D1184; - -typedef int (*UnkFuncPtr_ov75_021D1184)(UnkStruct_ov75_021D1184 *); - -static int ov75_021D1184(UnkStruct_ov75_021D1184 *param0); -static int ov75_021D0E5C(UnkStruct_ov75_021D1184 *param0); -static int ov75_021D0E80(UnkStruct_ov75_021D1184 *param0); -static int ov75_021D108C(UnkStruct_ov75_021D1184 *param0); -static void ov75_021D1358(SysTask *param0, void *param1); -static int ov75_021D13E8(UnkStruct_ov75_021D1184 *param0); -static int ov75_021D1434(UnkStruct_ov75_021D1184 *param0); -static void ov75_021D131C(void *param0); -static void ov75_021D1460(void); -static void ov75_021D1480(UnkStruct_ov75_021D1184 *param0); -static void ov75_021D1564(UnkStruct_ov75_021D1184 *param0); -static void ov75_021D1598(UnkStruct_ov75_021D1184 *param0); -static void ov75_021D1868(UnkStruct_ov75_021D1184 *param0); -static void ov75_021D18A8(UnkStruct_ov75_021D1184 *param0); -static void ov75_021D19A8(UnkStruct_ov75_021D1184 *param0); -static void ov75_021D19C8(UnkStruct_ov75_021D1184 *param0); -static void ov75_021D1ADC(UnkStruct_ov75_021D1184 *param0); -static void ov75_021D1CB8(UnkStruct_ov75_021D1184 *param0); - -int ov75_021D0D80(ApplicationManager *appMan, int *param1) -{ - UnkStruct_020978D8 *v0; - UnkStruct_ov75_021D1184 *v1 = (UnkStruct_ov75_021D1184 *)ApplicationManager_Data(appMan); - - Heap_Create(HEAP_ID_APPLICATION, HEAP_ID_41, 0x20000); - v1 = ApplicationManager_NewData(appMan, sizeof(UnkStruct_ov75_021D1184), HEAP_ID_41); - memset(v1, 0, sizeof(UnkStruct_ov75_021D1184)); - - v1->heapID = HEAP_ID_41; - - v1->unk_1C = (UnkStruct_020978D8 *)ApplicationManager_Args(appMan); - v1->unk_0D = v1->unk_0C = v1->unk_1C->unk_00; - v1->unk_11 = v1->unk_1C->unk_02; - v1->unk_12 = v1->unk_1C->unk_03; - v1->unk_17 = v1->unk_16 = v1->unk_11; - v1->unk_1C->unk_00 = 0xFFFF; - v1->unk_10 = Options_TextFrameDelay(v1->unk_1C->options); - v1->unk_0A = Options_Frame(v1->unk_1C->options); - - RenderControlFlags_SetCanABSpeedUpPrint(TRUE); - return 1; -} - -int ov75_021D0DF8(ApplicationManager *appMan, int *param1) -{ - UnkStruct_ov75_021D1184 *v0 = (UnkStruct_ov75_021D1184 *)ApplicationManager_Data(appMan); - - if (ov75_021D1184(v0)) { - return 1; - } - - return 0; -} - -int ov75_021D0E10(ApplicationManager *appMan, int *param1) -{ - UnkStruct_ov75_021D1184 *v0 = (UnkStruct_ov75_021D1184 *)ApplicationManager_Data(appMan); - int heapID; - - RenderControlFlags_SetCanABSpeedUpPrint(FALSE); - - heapID = v0->heapID; - - ApplicationManager_FreeData(appMan); - Heap_Destroy(heapID); - - return 1; -} - -static BOOL ov75_021D0E34(UnkStruct_ov75_021D1184 *param0) -{ - int i = 0; - - for (i = 0; i < 3; i++) { - if (sub_02014BBC(¶m0->unk_1C->unk_1A[i])) { - return FALSE; - } - } - - return TRUE; -} - -static int ov75_021D0E5C(UnkStruct_ov75_021D1184 *param0) -{ - if (gSystem.pressedKeys & (PAD_BUTTON_A | PAD_BUTTON_B)) { - Sound_PlayEffect(SEQ_SE_DP_PIRORIRO2); - return 1; - } - - return 0; -} - -static int ov75_021D0E80(UnkStruct_ov75_021D1184 *param0) -{ - u8 v0 = 0; - - if (gSystem.pressedKeys & (PAD_BUTTON_A)) { - if (param0->unk_11 == 3) { - if (param0->unk_12 == 0) { - if (ov75_021D0E34(param0)) { - Sound_PlayEffect(SEQ_SE_DP_DECIDE); - param0->unk_0C = UnkEnum_ov75_021D0E80_02; - return 0; - } else { - param0->unk_1C->unk_00 = 3; - Sound_PlayEffect(SEQ_SE_DP_PIRORIRO2); - } - } else { - Sound_PlayEffect(SEQ_SE_DP_DECIDE); - param0->unk_0C = UnkEnum_ov75_021D0E80_03; - return 0; - } - - param0->unk_1C->unk_02 = param0->unk_1C->unk_03 = 0; - } else { - param0->unk_1C->unk_00 = param0->unk_1C->unk_02 = param0->unk_11; - param0->unk_1C->unk_03 = param0->unk_12; - Sound_PlayEffect(SEQ_SE_DP_DECIDE); - } - - return 1; - } else if (gSystem.pressedKeys & (PAD_BUTTON_B)) { - Sound_PlayEffect(SEQ_SE_DP_DECIDE); - param0->unk_0C = UnkEnum_ov75_021D0E80_03; - return 0; - } - - if (gSystem.pressedKeys & PAD_BUTTON_START) { - param0->unk_11 = 3; - param0->unk_12 = 0; - v0 = 1; - } else if (gSystem.pressedKeys & PAD_KEY_DOWN) { - param0->unk_11 = (param0->unk_11 + 1) % 4; - v0 = 1; - } else if (gSystem.pressedKeys & PAD_KEY_UP) { - param0->unk_11 = (param0->unk_11 + 4 - 1) % 4; - v0 = 1; - } else if (gSystem.pressedKeys & (PAD_KEY_RIGHT | PAD_KEY_LEFT)) { - if (param0->unk_11 == 3) { - param0->unk_12 ^= 1; - v0 = 1; - } - } else { - return 0; - } - - if (!v0) { - return 0; - } - - Sound_PlayEffect(SEQ_SE_CONFIRM); - - if (param0->unk_11 == 3) { - param0->unk_16 = param0->unk_11 + param0->unk_12; - } else { - param0->unk_16 = param0->unk_11; - } - - return 0; -} - -static int ov75_021D0FA0(UnkStruct_ov75_021D1184 *param0) -{ - String *v0 = NULL; - - switch (param0->unk_08) { - case 0: - Window_DrawMessageBoxWithScrollCursor(¶m0->unk_44[5], 1, 1 + 9, UnkEnum_ov75_021D1598_06); - Window_FillTilemap(&(param0->unk_44[5]), (15 << 4) | 15); - - v0 = String_Init(19 * 2 * 2, param0->heapID); - - MessageLoader_GetString(param0->unk_20, 2, v0); - Text_AddPrinterWithParamsAndColor(¶m0->unk_44[5], FONT_MESSAGE, v0, 0, 0, TEXT_SPEED_INSTANT, TEXT_COLOR(1, 2, 15), NULL); - String_Free(v0); - break; - case 1: - - if (!(gSystem.pressedKeys & (PAD_BUTTON_A | PAD_BUTTON_B))) { - return 0; - } - - Window_EraseMessageBox(¶m0->unk_44[5], 1); - Window_ClearAndCopyToVRAM(&(param0->unk_44[5])); - - param0->unk_08 = 0; - param0->unk_0C = param0->unk_0D; - - return 0; - } - - param0->unk_08++; - return 0; -} - -static void ov75_021D1040(UnkStruct_ov75_021D1184 *param0) -{ - static const WindowTemplate v0 = { - 0, 25, 13, 6, 4, UnkEnum_ov75_021D1598_03, 555 - }; - - param0->unk_A4 = Menu_MakeYesNoChoice(param0->unk_18, &v0, 1, UnkEnum_ov75_021D1598_05, param0->heapID); -} - -static int ov75_021D1064(UnkStruct_ov75_021D1184 *param0) -{ - switch (Menu_ProcessInputAndHandleExit(param0->unk_A4, param0->heapID)) { - case 0: - return 1; - case 0xfffffffe: - return 0; - } - - return -1; -} - -static int ov75_021D108C(UnkStruct_ov75_021D1184 *param0) -{ - int v0; - String *v1 = NULL; - - switch (param0->unk_08) { - case 0: - param0->unk_13 = 1; - - Window_DrawMessageBoxWithScrollCursor(¶m0->unk_44[5], 1, 1 + 9, UnkEnum_ov75_021D1598_06); - Window_FillTilemap(&(param0->unk_44[5]), (15 << 4) | 15); - - v1 = String_Init(19 * 2 * 2, param0->heapID); - MessageLoader_GetString(param0->unk_20, 3, v1); - param0->unk_0F = Text_AddPrinterWithParamsAndColor(¶m0->unk_44[5], FONT_MESSAGE, v1, 0, 0, param0->unk_10, TEXT_COLOR(1, 2, 15), NULL); - - String_Free(v1); - PaletteData_Blend(param0->unk_30, 0, 34 + param0->unk_17, 1, 0, 0x7FFF); - - param0->unk_17 = param0->unk_16; - param0->unk_15 = 0; - param0->unk_14 = 0; - break; - case 1: - if (Text_IsPrinterActive(param0->unk_0F)) { - return 0; - } - - ov75_021D1040(param0); - break; - case 2: - v0 = ov75_021D1064(param0); - - if (v0 < 0) { - return 0; - } - - Window_EraseMessageBox(¶m0->unk_44[5], 1); - Window_ClearAndCopyToVRAM(&(param0->unk_44[5])); - param0->unk_08 = 0; - - if (v0) { - param0->unk_1C->unk_00 = 0xFFFF; - return 1; - } else { - param0->unk_0C = param0->unk_0D; - param0->unk_13 = 0; - return 0; - } - } - - param0->unk_08++; - return 0; -} - -static int ov75_021D1184(UnkStruct_ov75_021D1184 *param0) -{ - switch (param0->unk_04) { - case 0: - SetVBlankCallback(NULL, NULL); - DisableHBlank(); - GXLayers_DisableEngineALayers(); - GXLayers_DisableEngineBLayers(); - - GX_SetVisiblePlane(0); - GXS_SetVisiblePlane(0); - - SetScreenColorBrightness(DS_SCREEN_MAIN, COLOR_BLACK); - SetScreenColorBrightness(DS_SCREEN_SUB, COLOR_BLACK); - ResetVisibleHardwareWindows(DS_SCREEN_MAIN); - ResetVisibleHardwareWindows(DS_SCREEN_SUB); - break; - case 1: - if (!ov75_021D13E8(param0)) { - return 0; - } - - SetVBlankCallback(ov75_021D131C, param0); - GXLayers_EngineAToggleLayers(GX_PLANEMASK_OBJ, 1); - ResetScreenMasterBrightness(DS_SCREEN_MAIN); - - G2_SetBlendAlpha(GX_BLEND_PLANEMASK_BG2, GX_BLEND_PLANEMASK_BG3, 28, 4); - - PaletteData_StartFade(param0->unk_30, 0x1 | 0x4, 0xFFFF, -1, 16, 0, 0x0); - break; - case 2: - if (param0->unk_AC != NULL) { - SpriteSystem_DrawSprites(param0->unk_AC); - } - - if (PaletteData_GetSelectedBuffersMask(param0->unk_30)) { - return 0; - } - break; - case 3: { - static const UnkFuncPtr_ov75_021D1184 v0[] = { - ov75_021D0E5C, - ov75_021D0E80, - ov75_021D0FA0, - ov75_021D108C, - }; - - if (param0->unk_AC != NULL) { - SpriteSystem_DrawSprites(param0->unk_AC); - } - - if (!v0[param0->unk_0C](param0)) { - return 0; - } - - PaletteData_StartFade(param0->unk_30, 0x1 | 0x4, 0xFFFF, -1, 0, 16, 0x0); - } break; - case 4: - if (PaletteData_GetSelectedBuffersMask(param0->unk_30)) { - if (param0->unk_AC != NULL) { - SpriteSystem_DrawSprites(param0->unk_AC); - } - - return 0; - } - - SetScreenColorBrightness(DS_SCREEN_MAIN, COLOR_BLACK); - SetScreenColorBrightness(DS_SCREEN_SUB, COLOR_BLACK); - SetVBlankCallback(NULL, NULL); - GXLayers_DisableEngineALayers(); - GXLayers_DisableEngineBLayers(); - - GX_SetVisiblePlane(0); - GXS_SetVisiblePlane(0); - break; - case 5: - if (ov75_021D1434(param0)) { - return 1; - } - - return 0; - } - - param0->unk_04++; - return 0; -} - -static void ov75_021D131C(void *param0) -{ - UnkStruct_ov75_021D1184 *v0 = (UnkStruct_ov75_021D1184 *)param0; - - if (v0->unk_30 != NULL) { - PaletteData_CommitFadedBuffers(v0->unk_30); - } - - if (v0->unk_A8 != NULL) { - SpriteSystem_TransferOam(); - } - - NNS_GfdDoVramTransfer(); - Bg_RunScheduledUpdates(v0->unk_18); - - OS_SetIrqCheckFlag(OS_IE_V_BLANK); -} - -static void ov75_021D1358(SysTask *param0, void *param1) -{ - UnkStruct_ov75_021D1184 *v0 = (UnkStruct_ov75_021D1184 *)param1; - - if (v0->unk_30 == NULL) { - SysTask_Done(param0); - return; - } - - if (v0->unk_13) { - return; - } - - if (v0->unk_17 != v0->unk_16) { - PaletteData_Blend(v0->unk_30, 0, 34 + v0->unk_17, 1, 0, 0x7FFF); - v0->unk_17 = v0->unk_16; - v0->unk_15 = 0; - v0->unk_14 = 0; - } - - PaletteData_Blend(v0->unk_30, 0, 34 + v0->unk_16, 1, v0->unk_14, 0x7FFF); - - if (v0->unk_15) { - if (v0->unk_14-- == 1) { - v0->unk_15 ^= 1; - } - } else { - if (v0->unk_14++ == 12) { - v0->unk_15 ^= 1; - } - } -} - -static int ov75_021D13E8(UnkStruct_ov75_021D1184 *param0) -{ - switch (param0->unk_08) { - case 0: - ov75_021D1480(param0); - break; - case 1: - ov75_021D1598(param0); - break; - case 2: - ov75_021D18A8(param0); - ov75_021D19C8(param0); - break; - case 3: - ov75_021D1ADC(param0); - param0->unk_08 = 0; - return 1; - } - - param0->unk_08++; - return 0; -} - -static int ov75_021D1434(UnkStruct_ov75_021D1184 *param0) -{ - ov75_021D1CB8(param0); - - if (param0->unk_24 != NULL) { - MessageLoader_Free(param0->unk_20); - } - - ov75_021D19A8(param0); - ov75_021D1868(param0); - ov75_021D1564(param0); - - return 1; -} - -static void ov75_021D1460(void) -{ - GXBanks v0 = { - GX_VRAM_BG_128_A, - GX_VRAM_BGEXTPLTT_NONE, - GX_VRAM_SUB_BG_128_C, - GX_VRAM_SUB_BGEXTPLTT_NONE, - GX_VRAM_OBJ_64_E, - GX_VRAM_OBJEXTPLTT_NONE, - GX_VRAM_SUB_OBJ_16_I, - GX_VRAM_SUB_OBJEXTPLTT_NONE, - GX_VRAM_TEX_NONE, - GX_VRAM_TEXPLTT_NONE - }; - - GXLayers_SetBanks(&v0); -} - -static void ov75_021D1480(UnkStruct_ov75_021D1184 *param0) -{ - int v0, v1; - - ov75_021D1460(); - - param0->unk_18 = BgConfig_New(param0->heapID); - - { - GraphicsModes v2 = { - GX_DISPMODE_GRAPHICS, - GX_BGMODE_0, - GX_BGMODE_0, - GX_BG0_AS_2D - }; - - SetAllGraphicsModes(&v2); - } - - { - BgTemplate v3[] = { - { - .x = 0, - .y = 0, - .bufferSize = 0x800, - .baseTile = 0, - .screenSize = BG_SCREEN_SIZE_256x256, - .colorMode = GX_BG_COLORMODE_16, - .screenBase = GX_BG_SCRBASE_0xf800, - .charBase = GX_BG_CHARBASE_0x10000, - .bgExtPltt = GX_BG_EXTPLTT_01, - .priority = 0, - .areaOver = 0, - .mosaic = FALSE, - }, - { - .x = 0, - .y = 0, - .bufferSize = 0x800, - .baseTile = 0, - .screenSize = BG_SCREEN_SIZE_256x256, - .colorMode = GX_BG_COLORMODE_16, - .screenBase = GX_BG_SCRBASE_0xf000, - .charBase = GX_BG_CHARBASE_0x00000, - .bgExtPltt = GX_BG_EXTPLTT_01, - .priority = 1, - .areaOver = 0, - .mosaic = FALSE, - }, - { - .x = 0, - .y = 0, - .bufferSize = 0x800, - .baseTile = 0, - .screenSize = BG_SCREEN_SIZE_256x256, - .colorMode = GX_BG_COLORMODE_16, - .screenBase = GX_BG_SCRBASE_0xe800, - .charBase = GX_BG_CHARBASE_0x00000, - .bgExtPltt = GX_BG_EXTPLTT_01, - .priority = 2, - .areaOver = 0, - .mosaic = FALSE, - }, - { - .x = 0, - .y = 0, - .bufferSize = 0x800, - .baseTile = 0, - .screenSize = BG_SCREEN_SIZE_256x256, - .colorMode = GX_BG_COLORMODE_16, - .screenBase = GX_BG_SCRBASE_0xe000, - .charBase = GX_BG_CHARBASE_0x00000, - .bgExtPltt = GX_BG_EXTPLTT_01, - .priority = 3, - .areaOver = 0, - .mosaic = FALSE, - }, - { - .x = 0, - .y = 0, - .bufferSize = 0x800, - .baseTile = 0, - .screenSize = BG_SCREEN_SIZE_256x256, - .colorMode = GX_BG_COLORMODE_16, - .screenBase = GX_BG_SCRBASE_0xf800, - .charBase = GX_BG_CHARBASE_0x00000, - .bgExtPltt = GX_BG_EXTPLTT_01, - .priority = 0, - .areaOver = 0, - .mosaic = FALSE, - }, - }; - - Bg_InitFromTemplate(param0->unk_18, BG_LAYER_MAIN_0, &(v3[0]), 0); - Bg_InitFromTemplate(param0->unk_18, BG_LAYER_MAIN_1, &(v3[1]), 0); - Bg_InitFromTemplate(param0->unk_18, BG_LAYER_MAIN_2, &(v3[2]), 0); - Bg_InitFromTemplate(param0->unk_18, BG_LAYER_MAIN_3, &(v3[3]), 0); - Bg_InitFromTemplate(param0->unk_18, BG_LAYER_SUB_0, &(v3[4]), 0); - } - - Bg_ClearTilemap(param0->unk_18, BG_LAYER_MAIN_0); - Bg_ClearTilemap(param0->unk_18, BG_LAYER_MAIN_1); - Bg_ClearTilemap(param0->unk_18, BG_LAYER_MAIN_2); - Bg_ClearTilemap(param0->unk_18, BG_LAYER_MAIN_3); - Bg_ClearTilemap(param0->unk_18, BG_LAYER_SUB_0); - Bg_ClearTilesRange(BG_LAYER_MAIN_0, 32, 0, param0->heapID); - Bg_ClearTilesRange(BG_LAYER_MAIN_1, 32, 0, param0->heapID); - Bg_ClearTilesRange(BG_LAYER_MAIN_2, 32, 0, param0->heapID); - Bg_ClearTilesRange(BG_LAYER_MAIN_3, 32, 0, param0->heapID); - Bg_ClearTilesRange(4, 32, 0, param0->heapID); -} - -static void ov75_021D1564(UnkStruct_ov75_021D1184 *param0) -{ - Bg_FreeTilemapBuffer(param0->unk_18, BG_LAYER_SUB_0); - Bg_FreeTilemapBuffer(param0->unk_18, BG_LAYER_MAIN_3); - Bg_FreeTilemapBuffer(param0->unk_18, BG_LAYER_MAIN_2); - Bg_FreeTilemapBuffer(param0->unk_18, BG_LAYER_MAIN_1); - Bg_FreeTilemapBuffer(param0->unk_18, BG_LAYER_MAIN_0); - Heap_Free(param0->unk_18); -} - -static void ov75_021D1598(UnkStruct_ov75_021D1184 *param0) -{ - void *v0; - u32 v1; - void *v2; - NNSG2dCharacterData *v3; - NNSG2dPaletteData *v4; - NARC *v5; - int v6 = 12 + param0->unk_1C->mailType; - int v7 = 24 + param0->unk_1C->mailType; - int v8 = 0 + param0->unk_1C->mailType; - v5 = NARC_ctor(NARC_INDEX_GRAPHIC__MAIL_GRA, param0->heapID); - - LoadStandardWindowGraphics(param0->unk_18, BG_LAYER_MAIN_0, 1, UnkEnum_ov75_021D1598_05, 0, param0->heapID); - LoadMessageBoxGraphics(param0->unk_18, BG_LAYER_MAIN_0, 1 + 9, UnkEnum_ov75_021D1598_06, param0->unk_0A, param0->heapID); - - v1 = NARC_GetMemberSize(v5, v6); - v2 = Heap_AllocAtEnd(param0->heapID, v1); - NARC_ReadWholeMember(v5, v6, (void *)v2); - - NNS_G2dGetUnpackedCharacterData(v2, &v3); - Bg_LoadTiles(param0->unk_18, 1, v3->pRawData, v3->szByte, 0); - Bg_LoadTiles(param0->unk_18, 4, v3->pRawData, v3->szByte, 0); - Heap_Free(v2); - - v1 = NARC_GetMemberSize(v5, v8); - v2 = Heap_AllocAtEnd(param0->heapID, v1); - NARC_ReadWholeMember(v5, v8, (void *)v2); - - NNS_G2dGetUnpackedPaletteData(v2, &v4); - Bg_LoadPalette(4, v4->pRawData, v4->szByte, 0); - - param0->unk_30 = PaletteData_New(param0->heapID); - - PaletteData_AllocBuffer(param0->unk_30, 0, 32 * UnkEnum_ov75_021D1598_07, param0->heapID); - PaletteData_AllocBuffer(param0->unk_30, 2, 32 * 3, param0->heapID); - PaletteData_LoadBuffer(param0->unk_30, v4->pRawData, 0, 0, 32 * 3); - - if (param0->unk_0C == 1) { - PaletteData_LoadBuffer(param0->unk_30, &(((u16 *)v4->pRawData)[16 * 3]), 0, 16, 32); - } - - PaletteData_LoadBufferFromFileStart(param0->unk_30, 19, 0, param0->heapID, 2, 32 * 3, 0); - PaletteData_LoadBufferFromFileStart(param0->unk_30, 14, 6, param0->heapID, 0, 32, 16 * UnkEnum_ov75_021D1598_03); - PaletteData_LoadBufferFromFileStart(param0->unk_30, 14, 7, param0->heapID, 0, 32, 16 * UnkEnum_ov75_021D1598_04); - PaletteData_LoadBufferFromFileStart(param0->unk_30, 38, 24, param0->heapID, 0, 32, 16 * UnkEnum_ov75_021D1598_05); - PaletteData_LoadBufferFromFileStart(param0->unk_30, 38, 25 + param0->unk_0A, param0->heapID, 0, 32, 16 * UnkEnum_ov75_021D1598_06); - PaletteData_Blend(param0->unk_30, 0, 0, 16 * UnkEnum_ov75_021D1598_07, 16, 0x0); - PaletteData_Blend(param0->unk_30, 2, 0, 16 * 3, 16, 0x0); - PaletteData_SetAutoTransparent(param0->unk_30, 1); - PaletteData_CommitFadedBuffers(param0->unk_30); - Heap_Free(v2); - - v1 = NARC_GetMemberSize(v5, v7); - param0->unk_34 = Heap_Alloc(param0->heapID, v1); - NARC_ReadWholeMember(v5, v7, (void *)param0->unk_34); - NNS_G2dGetUnpackedScreenData(param0->unk_34, &(param0->unk_3C)); - - v1 = NARC_GetMemberSize(v5, 36); - param0->unk_38 = Heap_Alloc(param0->heapID, v1); - NARC_ReadWholeMember(v5, 36, (void *)param0->unk_38); - NNS_G2dGetUnpackedScreenData(param0->unk_38, &(param0->unk_40)); - - NARC_dtor(v5); - Bg_FillTilemapRect(param0->unk_18, 4, 0x2001, 0, 0, 32, 32, 17); - Bg_CopyToTilemapRect(param0->unk_18, 3, 0, 0, 32, 24, param0->unk_3C->rawData, 0, 0, param0->unk_3C->screenWidth / 8, param0->unk_3C->screenHeight / 8); - Bg_ScheduleTilemapTransfer(param0->unk_18, 3); - Bg_ScheduleTilemapTransfer(param0->unk_18, 4); - - if (param0->unk_0C == 1) { - Bg_CopyToTilemapRect(param0->unk_18, 2, 0, 0, 32, 24, param0->unk_40->rawData, 0, 0, param0->unk_40->screenWidth / 8, param0->unk_40->screenHeight / 8); - Bg_ScheduleTilemapTransfer(param0->unk_18, 2); - - param0->unk_14 = 0; - param0->unk_15 = 0; - - SysTask_Start(ov75_021D1358, param0, 0); - } -} - -static void ov75_021D1868(UnkStruct_ov75_021D1184 *param0) -{ - Heap_Free(param0->unk_38); - Heap_Free(param0->unk_34); - PaletteData_FreeBuffer(param0->unk_30, 2); - PaletteData_FreeBuffer(param0->unk_30, 0); - PaletteData_Free(param0->unk_30); - - param0->unk_30 = NULL; - - G2_SetBlendAlpha(GX_BLEND_PLANEMASK_NONE, GX_BLEND_PLANEMASK_NONE, 31, 0); -} - -static void ov75_021D18A8(UnkStruct_ov75_021D1184 *param0) -{ - int v0 = 0; - - Window_Add(param0->unk_18, ¶m0->unk_44[0], 1, 3, 3, 26, 4, 1, 1023 - 26 * 4); - Window_Add(param0->unk_18, ¶m0->unk_44[1], 1, 3, 3 + 4 + 1, 26, 4, 1, (1023 - 26 * 4) - (26 * 4)); - Window_Add(param0->unk_18, ¶m0->unk_44[2], 1, 3, 3 + 4 + 1 + 4 + 1, 26, 4, 1, ((1023 - 26 * 4) - (26 * 4)) - (26 * 4)); - Window_Add(param0->unk_18, ¶m0->unk_44[3], 1, 21, 20, 8, 2, UnkEnum_ov75_021D1598_01, (((1023 - 26 * 4) - (26 * 4)) - (26 * 4)) - 8 * 2); - Window_Add(param0->unk_18, ¶m0->unk_44[4], 1, 3, 20, 8, 2, UnkEnum_ov75_021D1598_01, ((((1023 - 26 * 4) - (26 * 4)) - (26 * 4)) - 8 * 2) - 8 * 2); - Window_Add(param0->unk_18, ¶m0->unk_44[5], 0, 2, 19, 27, 4, UnkEnum_ov75_021D1598_04, (((((1023 - 26 * 4) - (26 * 4)) - (26 * 4)) - 8 * 2) - 8 * 2) - 8 * 2); - - for (v0 = 0; v0 < 6; v0++) { - Window_FillTilemap(&(param0->unk_44[v0]), 0); - - if (v0 < 5) { - Window_CopyToVRAM(¶m0->unk_44[v0]); - } - } -} - -static void ov75_021D19A8(UnkStruct_ov75_021D1184 *param0) -{ - int v0 = 0; - - for (v0 = 0; v0 < 6; v0++) { - Window_ClearAndCopyToVRAM(¶m0->unk_44[v0]); - Window_Remove(¶m0->unk_44[v0]); - } -} - -static void ov75_021D19C8(UnkStruct_ov75_021D1184 *param0) -{ - int v0 = 0; - String *v1; - - for (v0 = 0; v0 < 3; v0++) { - if (!sub_02014BBC(¶m0->unk_1C->unk_1A[v0])) { - continue; - } - - v1 = sub_02014B34(¶m0->unk_1C->unk_1A[v0], param0->heapID); - - Text_AddPrinterWithParamsAndColor(¶m0->unk_44[0 + v0], FONT_MESSAGE, v1, 0, 0, TEXT_SPEED_INSTANT, TEXT_COLOR(1, 2, 0), NULL); - String_Free(v1); - Window_CopyToVRAM(¶m0->unk_44[0 + v0]); - } - - if (param0->unk_0C == 1) { - String *v2; - int v3; - - param0->unk_20 = MessageLoader_Init(MSG_LOADER_LOAD_ON_DEMAND, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_UNK_0409, param0->heapID); - - v2 = String_Init(8 * 2, param0->heapID); - - for (v0 = 0; v0 < 2; v0++) { - String_Clear(v2); - MessageLoader_GetString(param0->unk_20, 0 + v0, v2); - - v3 = (8 * 8) - Font_CalcStringWidth(FONT_MESSAGE, v2, 0); - v3 /= 2; - - Text_AddPrinterWithParamsAndColor(¶m0->unk_44[3 + v0], FONT_MESSAGE, v2, v3, 2, TEXT_SPEED_INSTANT, TEXT_COLOR(1, 2, 0), NULL); - Window_CopyToVRAM(¶m0->unk_44[3 + v0]); - } - - String_Free(v2); - } else { - Text_AddPrinterWithParamsAndColor(¶m0->unk_44[3], FONT_MESSAGE, param0->unk_1C->unk_10, 0, 2, TEXT_SPEED_INSTANT, TEXT_COLOR(1, 2, 0), NULL); - Window_CopyToVRAM(¶m0->unk_44[3]); - } -} - -static void ov75_021D1ADC(UnkStruct_ov75_021D1184 *param0) -{ - int v0 = 0, v1 = 0; - SpriteTemplate v2; - - NetworkIcon_InitIfConnected(); - - if (param0->unk_0C == 1) { - return; - } - - VramTransfer_New(32, param0->heapID); - - param0->unk_A8 = SpriteSystem_Alloc(param0->heapID); - param0->unk_AC = SpriteManager_New(param0->unk_A8); - - { - RenderOamTemplate v3 = { - 0, - 7, - 1, - 1, - 0, - 1, - 1, - 1, - }; - CharTransferTemplateWithModes v4 = { - 3, - 1024, - 0, - GX_OBJVRAMMODE_CHAR_1D_32K, - GX_OBJVRAMMODE_CHAR_1D_32K, - }; - const SpriteResourceCapacities v5 = { - 3, - 1, - 1, - 1, - 0, - 0, - }; - - SpriteSystem_Init(param0->unk_A8, &v3, &v4, 32); - SpriteSystem_InitSprites(param0->unk_A8, param0->unk_AC, 3); - SpriteSystem_InitManagerWithCapacities(param0->unk_A8, param0->unk_AC, &v5); - RenderOam_ClearMain(param0->heapID); - } - - SpriteSystem_LoadPlttResObj(param0->unk_A8, param0->unk_AC, NARC_INDEX_POKETOOL__ICONGRA__PL_POKE_ICON, PokeIconPalettesFileIndex(), FALSE, 3, NNS_G2D_VRAM_TYPE_2DMAIN, 0); - SpriteSystem_LoadCellResObj(param0->unk_A8, param0->unk_AC, NARC_INDEX_POKETOOL__ICONGRA__PL_POKE_ICON, PokeIconCellsFileIndex(), FALSE, 0); - SpriteSystem_LoadAnimResObj(param0->unk_A8, param0->unk_AC, NARC_INDEX_POKETOOL__ICONGRA__PL_POKE_ICON, PokeIconAnimationFileIndex(), FALSE, 0); - - for (v0 = 0; v0 < 3; v0++) { - if (param0->unk_1C->unk_14[v0].val2 == 0xFFFF) { - break; - } - - SpriteSystem_LoadCharResObjWithHardwareMappingType(param0->unk_A8, param0->unk_AC, NARC_INDEX_POKETOOL__ICONGRA__PL_POKE_ICON, param0->unk_1C->unk_14[v0].val1_0, FALSE, NNS_G2D_VRAM_TYPE_2DMAIN, v0); - MI_CpuClear8(&v2, sizeof(SpriteTemplate)); - - v2.x = (16 * 8) - (40 * v0); - v2.y = 160; - v2.z = 0; - - v2.animIdx = 0; - v2.bgPriority = 2; - v2.plttIdx = param0->unk_1C->unk_14[v0].val1_12; - v2.vramTransfer = FALSE; - v2.vramType = NNS_G2D_VRAM_TYPE_2DMAIN; - - v2.resources[0] = v0; - v2.resources[1] = 0; - v2.resources[2] = 0; - v2.resources[3] = 0; - v2.resources[4] = SPRITE_RESOURCE_NONE; - v2.resources[5] = SPRITE_RESOURCE_NONE; - - param0->unk_B0[v0] = SpriteSystem_NewSprite(param0->unk_A8, param0->unk_AC, &v2); - - if (param0->unk_1C->unk_14[v0].val1_0 == 7) { - ManagedSprite_SetDrawFlag(param0->unk_B0[v0], 0); - } - } -} - -static void ov75_021D1CB8(UnkStruct_ov75_021D1184 *param0) -{ - int v0 = 0; - - if (param0->unk_0C == 0) { - for (v0 = 0; v0 < 3; v0++) { - if (param0->unk_B0[v0] != NULL) { - Sprite_DeleteAndFreeResources(param0->unk_B0[v0]); - } - } - - SpriteSystem_FreeResourcesAndManager(param0->unk_A8, param0->unk_AC); - SpriteSystem_Free(param0->unk_A8); - VramTransfer_Free(); - } -} diff --git a/src/overlay090/ov90_021D0D80.c b/src/overlay090/ov90_021D0D80.c index 5326fb9ecd..dad9141451 100644 --- a/src/overlay090/ov90_021D0D80.c +++ b/src/overlay090/ov90_021D0D80.c @@ -824,7 +824,7 @@ static void ov90_021D1A48(UnkStruct_ov90_021D0ECC *param0) String *v0; UnkStruct_ov90_021D17F8 *v1 = &(param0->unk_BC[param0->unk_0B * 3 + param0->unk_0C]); - v0 = sub_02014B34(&v1->unk_08, param0->heapID); + v0 = Sentence_AsString(&v1->unk_08, param0->heapID); Window_FillTilemap(¶m0->unk_6C[2], (0 << 4) | 0); Text_AddPrinterWithParamsAndColor(¶m0->unk_6C[2], FONT_SYSTEM, v0, 0, 4, TEXT_SPEED_INSTANT, TEXT_COLOR(1, 2, 0), NULL); diff --git a/src/overlay104/ov104_02231F74.c b/src/overlay104/ov104_02231F74.c index a516b2f8f4..6267488b65 100644 --- a/src/overlay104/ov104_02231F74.c +++ b/src/overlay104/ov104_02231F74.c @@ -169,12 +169,12 @@ static void GetStringFromSentence(String *msgBuf, u16 sentenceType, u16 sentence Sentence sentence; String *string; - sub_02014A84(&sentence); + Sentence_Init(&sentence); sub_02014CE0(&sentence, sentenceType, sentenceID); Sentence_SetWord(&sentence, 0, word1); Sentence_SetWord(&sentence, 1, word2); - string = sub_02014B34(&sentence, HEAP_ID_FIELD3); + string = Sentence_AsString(&sentence, HEAP_ID_FIELD3); String_Copy(msgBuf, string); String_Free(string); } diff --git a/src/pokemon.c b/src/pokemon.c index 5ca8fad1e2..189ae8d1ec 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -21,7 +21,6 @@ #include "generated/species_data_params.h" #include "struct_defs/chatot_cry.h" -#include "struct_defs/mail.h" #include "struct_defs/seal_case.h" #include "struct_defs/species_sprite_data.h" #include "struct_defs/sprite_animation_frame.h" diff --git a/src/savedata/save_table.c b/src/savedata/save_table.c index 3631b65614..e7d957d11d 100644 --- a/src/savedata/save_table.c +++ b/src/savedata/save_table.c @@ -80,7 +80,7 @@ const SaveTableEntry gSaveTable[] = { { SAVE_TABLE_ENTRY_MYSTERY_GIFT, SAVE_BLOCK_ID_NORMAL, (SaveEntrySizeFunc)MysteryGift_SaveSize, (SaveEntryInitFunc)MysteryGift_Init }, { SAVE_TABLE_ENTRY_PAL_PARK_TRANSFER, SAVE_BLOCK_ID_NORMAL, (SaveEntrySizeFunc)MigratedPokemon_SaveSize, (SaveEntryInitFunc)PalParkTransfer_Init }, { SAVE_TABLE_ENTRY_LINK_CONTEST_RECORDS, SAVE_BLOCK_ID_NORMAL, (SaveEntrySizeFunc)LinkContestRecords_SaveSize, (SaveEntryInitFunc)LinkContestRecords_Init }, - { SAVE_TABLE_ENTRY_SENTENCE, SAVE_BLOCK_ID_NORMAL, (SaveEntrySizeFunc)Sentence_SaveSize, (SaveEntryInitFunc)Sentence_Init }, + { SAVE_TABLE_ENTRY_SENTENCE, SAVE_BLOCK_ID_NORMAL, (SaveEntrySizeFunc)Sentence_SaveSize, (SaveEntryInitFunc)SentenceSaveData_Init }, { SAVE_TABLE_ENTRY_EMAIL, SAVE_BLOCK_ID_NORMAL, (SaveEntrySizeFunc)Email_SaveSize, (SaveEntryInitFunc)Email_Init }, { SAVE_TABLE_ENTRY_WIFI_QUESTIONS, SAVE_BLOCK_ID_NORMAL, (SaveEntrySizeFunc)WiFiQuestion_SaveSize, (SaveEntryInitFunc)WiFiQuestion_Init }, { SAVE_TABLE_ENTRY_PC_BOXES, SAVE_BLOCK_ID_BOXES, (SaveEntrySizeFunc)PCBoxes_SaveSize, (SaveEntryInitFunc)PCBoxes_Init }, diff --git a/src/savedata_misc.c b/src/savedata_misc.c index 61d9adacf3..36e0e4d307 100644 --- a/src/savedata_misc.c +++ b/src/savedata_misc.c @@ -27,7 +27,7 @@ void MiscSaveBlock_Init(MiscSaveBlock *miscSave) MI_CpuFill16(miscSave->rivalName, CHAR_EOS, TRAINER_NAME_LEN + 1); MI_CpuFill16(miscSave->tabletName, CHAR_EOS, TABLET_NAME_LEN + 1); - sub_02014A9C(&miscSave->introMsg, 4); + Sentence_InitWithType(&miscSave->introMsg, 4); miscSave->introMsg.id = 0; miscSave->introMsg.words[0] = sub_02014DFC(441, 99); diff --git a/src/scrcmd.c b/src/scrcmd.c index dd8e2b105a..3e9f76b826 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -35,7 +35,6 @@ #include "struct_defs/daycare.h" #include "struct_defs/dress_up_photo.h" #include "struct_defs/image_clips.h" -#include "struct_defs/mail.h" #include "struct_defs/seal_case.h" #include "struct_defs/special_encounter.h" #include "struct_defs/struct_02029C88.h" @@ -546,7 +545,7 @@ static BOOL ScrCmd_HatchEgg(ScriptContext *ctx); static BOOL ScrCmd_ShowObject(ScriptContext *ctx); static BOOL ScrCmd_HideObject(ScriptContext *ctx); static BOOL ScrCmd_1B3(ScriptContext *ctx); -static BOOL ScrCmd_1B4(ScriptContext *ctx); +static BOOL ScrCmd_CountMailInMailbox(ScriptContext *ctx); static BOOL ScrCmd_StartRankingsMachine(ScriptContext *ctx); static BOOL ScrCmd_GetTimeOfDay(ScriptContext *ctx); static BOOL ScrCmd_GetRandom(ScriptContext *ctx); @@ -4916,13 +4915,13 @@ static BOOL ScrCmd_1B3(ScriptContext *ctx) return TRUE; } -static BOOL ScrCmd_1B4(ScriptContext *ctx) +static BOOL ScrCmd_CountMailInMailbox(ScriptContext *ctx) { FieldSystem *fieldSystem = ctx->fieldSystem; u16 *destVar = ScriptContext_GetVarPointer(ctx); Mailbox *mailbox = SaveData_GetMailbox(fieldSystem->saveData); - *destVar = (u16)sub_02028494(mailbox, 0); + *destVar = Mailbox_CountMail(mailbox, MAIL_CONTEXT_MAILBOX); return FALSE; } diff --git a/src/start_menu.c b/src/start_menu.c index caea334192..cc0f238530 100644 --- a/src/start_menu.c +++ b/src/start_menu.c @@ -12,11 +12,10 @@ #include "generated/species.h" #include "generated/text_banks.h" -#include "struct_decls/struct_0209747C_decl.h" #include "struct_defs/sentence.h" -#include "struct_defs/struct_02097728.h" #include "applications/bag/application.h" +#include "applications/mail.h" #include "applications/party_menu/defs.h" #include "applications/party_menu/main.h" #include "applications/poffin_case/main.h" @@ -87,7 +86,6 @@ #include "unk_0206B9D8.h" #include "unk_020972FC.h" #include "unk_0209747C.h" -#include "unk_02097624.h" #include "vars_flags.h" #include "res/graphics/start_menu/start_menu.naix" @@ -106,11 +104,11 @@ enum StartMenuOption { START_MENU_OPTION_RETIRE, }; -typedef struct { +typedef struct MenuMailData { u16 itemID; - u8 slot; - u8 unk_03; -} UnkStruct_0203C540; + u8 partySlot; + u8 usageType; +} MenuMailData; typedef struct MenuEvolutionData { u8 slot; @@ -181,7 +179,7 @@ static BOOL StartMenu_ExitBerryTag(FieldTask *fieldTask); static void StartMenu_EvolveInit(FieldTask *fieldTask); static void StartMenu_Evolve(FieldTask *fieldTask); static BOOL StartMenu_SelectRetire(FieldTask *fieldTask); -static void sub_0203C668(FieldSystem *fieldSystem, StartMenu *menu, u8 mode); +static void StartMenu_ProcessGivenMail(FieldSystem *fieldSystem, StartMenu *menu, u8 mode); typedef struct StartMenuAction { u32 bankEntry; @@ -1035,24 +1033,22 @@ BOOL StartMenu_ExitPartyMenu(FieldTask *fieldTask) menu->taskData = summary; StartMenu_SetCallback(menu, StartMenu_ExitSummary); break; - case PARTY_MENU_EXIT_CODE_MAIL: - UnkStruct_02097728 *v8 = sub_0203D920(fieldSystem, 2, partyMenu->selectedMonSlot, Item_MailNumber(partyMenu->usedItemID), HEAP_ID_FIELD2); - menu->taskData = v8; + case PARTY_MENU_EXIT_CODE_WRITE_MAIL: + menu->taskData = FieldSystem_LaunchMailApp_Write(fieldSystem, MAIL_CONTEXT_WRITE, partyMenu->selectedMonSlot, Item_GetMailType(partyMenu->usedItemID), HEAP_ID_FIELD2); if (partyMenu->mode == PARTY_MENU_MODE_GIVE_ITEM_DONE) { - menu->additionalTaskContext = sub_0203C540(partyMenu->usedItemID, 0, partyMenu->selectedMonSlot); + menu->additionalTaskContext = StartMenu_BuildMailData(partyMenu->usedItemID, MAIL_GIVE_FROM_PARTY_MENU, partyMenu->selectedMonSlot); } else { - menu->additionalTaskContext = sub_0203C540(partyMenu->usedItemID, 1, partyMenu->selectedMonSlot); + menu->additionalTaskContext = StartMenu_BuildMailData(partyMenu->usedItemID, MAIL_GIVE_FROM_BAG, partyMenu->selectedMonSlot); } StartMenu_SetCallback(menu, StartMenu_ExitMail); break; case PARTY_MENU_EXIT_CODE_READ_MAIL: Pokemon *mon = Party_GetPokemonBySlotIndex(SaveData_GetParty(fieldSystem->saveData), partyMenu->selectedMonSlot); - UnkStruct_02097728 *v9 = sub_0203D984(fieldSystem, mon, HEAP_ID_FIELD2); - menu->taskData = v9; - menu->additionalTaskContext = sub_0203C540(partyMenu->usedItemID, 2, partyMenu->selectedMonSlot); + menu->taskData = FieldSystem_LaunchMailApp_ReadHeld(fieldSystem, mon, HEAP_ID_FIELD2); + menu->additionalTaskContext = StartMenu_BuildMailData(partyMenu->usedItemID, MAIL_READ_FROM_PARTY_MENU, partyMenu->selectedMonSlot); StartMenu_SetCallback(menu, StartMenu_ExitMail); break; @@ -1222,9 +1218,8 @@ static BOOL StartMenu_ExitBag(FieldTask *fieldTask) Heap_Free(menu->additionalTaskContext); if (Item_IsMail(item) == TRUE && Pokemon_GetValue(mon, MON_DATA_HELD_ITEM, NULL) == ITEM_NONE) { - UnkStruct_02097728 *v11 = sub_0203D920(fieldSystem, 2, slot, Item_MailNumber(item), HEAP_ID_FIELD2); - menu->taskData = v11; - menu->additionalTaskContext = sub_0203C540(item, 0, slot); + menu->taskData = FieldSystem_LaunchMailApp_Write(fieldSystem, MAIL_CONTEXT_WRITE, slot, Item_GetMailType(item), HEAP_ID_FIELD2); + menu->additionalTaskContext = StartMenu_BuildMailData(item, MAIL_GIVE_FROM_PARTY_MENU, slot); StartMenu_SetCallback(menu, StartMenu_ExitMail); } else { PartyMenu *partyMenu = Heap_Alloc(HEAP_ID_FIELD2, sizeof(PartyMenu)); @@ -1411,7 +1406,7 @@ static BOOL StartMenu_Chat(FieldTask *fieldTask) menu->taskData = sub_0209747C(2, 0, fieldSystem->saveData, HEAP_ID_FIELD2); Sentence sentence; - sub_02014A9C(&sentence, 4); + Sentence_InitWithType(&sentence, 4); sub_02097500(menu->taskData, &sentence); sub_0203D874(fieldSystem, (UnkStruct_0209747C *)menu->taskData); @@ -1617,48 +1612,48 @@ BOOL StartMenu_ExitJournal(FieldTask *fieldTask) return FALSE; } -void *sub_0203C540(u16 itemID, u8 param1, u8 slot) +void *StartMenu_BuildMailData(u16 itemID, u8 usageType, u8 partySlot) { - UnkStruct_0203C540 *v0 = Heap_Alloc(HEAP_ID_FIELD2, sizeof(UnkStruct_0203C540)); + MenuMailData *data = Heap_Alloc(HEAP_ID_FIELD2, sizeof(MenuMailData)); - v0->itemID = itemID; - v0->slot = slot; - v0->unk_03 = param1; + data->itemID = itemID; + data->partySlot = partySlot; + data->usageType = usageType; - return (void *)v0; + return (void *)data; } BOOL StartMenu_ExitMail(FieldTask *fieldTask) { FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); StartMenu *menu = FieldTask_GetEnv(fieldTask); - UnkStruct_0203C540 *v2 = menu->additionalTaskContext; + MenuMailData *data = menu->additionalTaskContext; - switch (v2->unk_03) { - case 3: - sub_02097770(menu->taskData); + switch (data->usageType) { + case MAIL_READ_FROM_BAG: + MailAppArgs_Free(menu->taskData); menu->taskData = FieldSystem_OpenBag(fieldSystem, &menu->itemUseCtx); StartMenu_SetCallback(menu, StartMenu_ExitBag); break; - case 2: - sub_02097770(menu->taskData); - menu->taskData = FieldSystem_OpenPartyMenu(fieldSystem, &menu->fieldMoveContext, v2->slot); + case MAIL_READ_FROM_PARTY_MENU: + MailAppArgs_Free(menu->taskData); + menu->taskData = FieldSystem_OpenPartyMenu(fieldSystem, &menu->fieldMoveContext, data->partySlot); StartMenu_SetCallback(menu, StartMenu_ExitPartyMenu); break; - case 0: - if (sub_02097728(menu->taskData) == 1) { - sub_0203C668(fieldSystem, menu, PARTY_MENU_MODE_GIVE_MAIL_DONE); + case MAIL_GIVE_FROM_PARTY_MENU: + if (MailApp_WasMailWritten(menu->taskData) == TRUE) { + StartMenu_ProcessGivenMail(fieldSystem, menu, PARTY_MENU_MODE_GIVE_MAIL_DONE); } else { - sub_02097770(menu->taskData); - menu->taskData = FieldSystem_OpenPartyMenu(fieldSystem, &menu->fieldMoveContext, v2->slot); + MailAppArgs_Free(menu->taskData); + menu->taskData = FieldSystem_OpenPartyMenu(fieldSystem, &menu->fieldMoveContext, data->partySlot); StartMenu_SetCallback(menu, StartMenu_ExitPartyMenu); } break; - case 1: - if (sub_02097728(menu->taskData) == 1) { - sub_0203C668(fieldSystem, menu, PARTY_MENU_MODE_GIVE_MAIL); + case MAIL_GIVE_FROM_BAG: + if (MailApp_WasMailWritten(menu->taskData) == TRUE) { + StartMenu_ProcessGivenMail(fieldSystem, menu, PARTY_MENU_MODE_GIVE_MAIL); } else { - sub_02097770(menu->taskData); + MailAppArgs_Free(menu->taskData); menu->taskData = FieldSystem_OpenBag(fieldSystem, &menu->itemUseCtx); StartMenu_SetCallback(menu, StartMenu_ExitBag); } @@ -1666,12 +1661,12 @@ BOOL StartMenu_ExitMail(FieldTask *fieldTask) } Heap_Free(menu->additionalTaskContext); - return 0; + return FALSE; } -static void sub_0203C668(FieldSystem *fieldSystem, StartMenu *menu, u8 mode) // TODO: +static void StartMenu_ProcessGivenMail(FieldSystem *fieldSystem, StartMenu *menu, u8 mode) { - UnkStruct_0203C540 *v0 = menu->additionalTaskContext; + MenuMailData *data = menu->additionalTaskContext; PartyMenu *partyMenu = Heap_Alloc(HEAP_ID_FIELD2, sizeof(PartyMenu)); memset(partyMenu, 0, sizeof(PartyMenu)); @@ -1681,13 +1676,13 @@ static void sub_0203C668(FieldSystem *fieldSystem, StartMenu *menu, u8 mode) // partyMenu->options = SaveData_GetOptions(fieldSystem->saveData); partyMenu->fieldMoveContext = &menu->fieldMoveContext; partyMenu->type = PARTY_MENU_TYPE_BASIC; - partyMenu->usedItemID = v0->itemID; - partyMenu->selectedMonSlot = v0->slot; + partyMenu->usedItemID = data->itemID; + partyMenu->selectedMonSlot = data->partySlot; partyMenu->mode = mode; partyMenu->fieldSystem = fieldSystem; - sub_02097750(menu->taskData, Party_GetPokemonBySlotIndex(partyMenu->party, v0->slot)); - sub_02097770(menu->taskData); + MailApp_AddWrittenMailToMon(menu->taskData, Party_GetPokemonBySlotIndex(partyMenu->party, data->partySlot)); + MailAppArgs_Free(menu->taskData); FieldSystem_StartChildProcess(fieldSystem, &gPokemonPartyAppTemplate, partyMenu); menu->taskData = partyMenu; diff --git a/src/unk_02014A84.c b/src/unk_02014A84.c index 482a2e1f75..ca5acc9c07 100644 --- a/src/unk_02014A84.c +++ b/src/unk_02014A84.c @@ -22,32 +22,28 @@ static const u16 Unk_020E5498[] = { 0x1C1 }; -void sub_02014A84(Sentence *sentence) +void Sentence_Init(Sentence *sentence) { - int v0; - sentence->type = 0xffff; - for (v0 = 0; v0 < 2; v0++) { - sentence->words[v0] = 0xffff; + for (int i = 0; i < 2; i++) { + sentence->words[i] = 0xffff; } } -void sub_02014A9C(Sentence *sentence, u32 param1) +void Sentence_InitWithType(Sentence *sentence, u32 type) { - int v0; - - sentence->type = param1; + sentence->type = type; sentence->id = 0; - for (v0 = 0; v0 < 2; v0++) { - sentence->words[v0] = 0xffff; + for (int i = 0; i < 2; i++) { + sentence->words[i] = 0xffff; } } void sub_02014AB4(Sentence *sentence) { - sub_02014A9C(sentence, 4); + Sentence_InitWithType(sentence, 4); sentence->id = 5; } @@ -70,7 +66,7 @@ void sub_02014AC4(Sentence *sentence, int param1) GF_ASSERT(param1 < NELEMS(v0)); if (param1 < NELEMS(v0)) { - sub_02014A9C(sentence, v0[param1].unk_00); + Sentence_InitWithType(sentence, v0[param1].unk_00); sentence->id = v0[param1].unk_01; if (v0[param1].unk_02 != -1) { @@ -85,30 +81,25 @@ void sub_02014AC4(Sentence *sentence, int param1) } } -String *sub_02014B34(const Sentence *sentence, enum HeapID heapID) +String *Sentence_AsString(const Sentence *sentence, enum HeapID heapID) { - String *v0; - StringTemplate *v1; - MessageLoader *v2; - int v3; + StringTemplate *template = StringTemplate_Default(heapID); - v1 = StringTemplate_Default(heapID); - - for (v3 = 0; v3 < 2; v3++) { - if (sentence->words[v3] != 0xffff) { - StringTemplate_SetCustomMessageWord(v1, v3, sentence->words[v3]); + for (int i = 0; i < 2; i++) { + if (sentence->words[i] != 0xffff) { + StringTemplate_SetCustomMessageWord(template, i, sentence->words[i]); } else { break; } } - v2 = MessageLoader_Init(MSG_LOADER_LOAD_ON_DEMAND, NARC_INDEX_MSGDATA__PL_MSG, Unk_020E5498[sentence->type], heapID); - v0 = MessageUtil_ExpandedString(v1, v2, sentence->id, heapID); + MessageLoader *loader = MessageLoader_Init(MSG_LOADER_LOAD_ON_DEMAND, NARC_INDEX_MSGDATA__PL_MSG, Unk_020E5498[sentence->type], heapID); + String *string = MessageUtil_ExpandedString(template, loader, sentence->id, heapID); - MessageLoader_Free(v2); - StringTemplate_Free(v1); + MessageLoader_Free(loader); + StringTemplate_Free(template); - return v0; + return string; } String *sub_02014BA0(const Sentence *sentence, u32 param1) @@ -116,7 +107,7 @@ String *sub_02014BA0(const Sentence *sentence, u32 param1) return MessageBank_GetNewStringFromNARC(26, Unk_020E5498[sentence->type], sentence->id, param1); } -BOOL sub_02014BBC(const Sentence *sentence) +BOOL Sentence_IsValid(const Sentence *sentence) { return sentence->type != 0xffff; } @@ -197,9 +188,9 @@ BOOL sub_02014C88(const Sentence *param0, const Sentence *param1) return 1; } -void sub_02014CC0(Sentence *param0, const Sentence *param1) +void Sentence_Set(Sentence *dest, const Sentence *src) { - *param0 = *param1; + *dest = *src; } u32 sub_02014CD4(u32 param0) diff --git a/src/unk_02014D38.c b/src/unk_02014D38.c index 064c709162..4f08142da8 100644 --- a/src/unk_02014D38.c +++ b/src/unk_02014D38.c @@ -231,7 +231,7 @@ u32 Sentence_SaveSize(void) return sizeof(UnkStruct_02014EC4); } -void Sentence_Init(void *param0) +void SentenceSaveData_Init(void *param0) { static const struct { u8 language; diff --git a/src/unk_020298BC.c b/src/unk_020298BC.c index 65ae808a11..d5aee56f3f 100644 --- a/src/unk_020298BC.c +++ b/src/unk_020298BC.c @@ -542,7 +542,7 @@ void DressUpPhoto_SetTitle(DressUpPhoto *photo, u16 word) { GF_ASSERT(DressUpPhoto_IsValid(photo)); - sub_02014A84(&photo->title); + Sentence_Init(&photo->title); Sentence_SetWord(&photo->title, 0, word); } diff --git a/src/unk_0202D05C.c b/src/unk_0202D05C.c index 2fd0368795..9dd3ede7df 100644 --- a/src/unk_0202D05C.c +++ b/src/unk_0202D05C.c @@ -374,7 +374,7 @@ u32 sub_0202D474(UnkStruct_0202D750 *param0) void sub_0202D478(SaveData *saveData, int param1, Sentence *param2) { BattleFrontier *frontier = SaveData_SaveTable(saveData, SAVE_TABLE_ENTRY_FRONTIER); - sub_02014CC0(&(frontier->unk_950.unk_168.unk_00[param1]), param2); + Sentence_Set(&(frontier->unk_950.unk_168.unk_00[param1]), param2); } Sentence *sub_0202D498(SaveData *saveData, int param1) diff --git a/src/unk_02030A80.c b/src/unk_02030A80.c index 3287df353d..fdd3c537ad 100644 --- a/src/unk_02030A80.c +++ b/src/unk_02030A80.c @@ -163,7 +163,7 @@ String *sub_02030C28(const UnkStruct_02030A80 *param0, Sentence *param1, enum He } if (v0 > 0) { - sub_02014A9C(param1, 4); + Sentence_InitWithType(param1, 4); param1->id = 0; param1->words[0] = sub_02014DFC(441, 99); param1->words[1] = 0xffff; diff --git a/src/unk_02033200.c b/src/unk_02033200.c index 703d284f4a..8cc37cc4de 100644 --- a/src/unk_02033200.c +++ b/src/unk_02033200.c @@ -90,7 +90,7 @@ void CommServerClient_Init(TrainerInfo *trainerInfo, BOOL param1) sCommServerClient->unk_1504 = 0x333; sCommServerClient->personalTrainerInfo = trainerInfo; - sub_02014A84((Sentence *)&sCommServerClient->unk_14EC); + Sentence_Init((Sentence *)&sCommServerClient->unk_14EC); sub_020334DC(param1); } diff --git a/src/unk_0203D1B8.c b/src/unk_0203D1B8.c index dec173f680..db6277799e 100644 --- a/src/unk_0203D1B8.c +++ b/src/unk_0203D1B8.c @@ -9,7 +9,6 @@ #include "generated/pokemon_contest_types.h" #include "generated/trainer_score_events.h" -#include "struct_decls/struct_0209747C_decl.h" #include "struct_defs/choose_starter_data.h" #include "struct_defs/clear_game_player_info.h" #include "struct_defs/dress_up_photo.h" @@ -24,12 +23,12 @@ #include "struct_defs/struct_0203E608.h" #include "struct_defs/struct_0203E6C0.h" #include "struct_defs/struct_0206BC70.h" -#include "struct_defs/struct_02097728.h" #include "applications/bag/application.h" #include "applications/diploma.h" #include "applications/frontier/records/main.h" #include "applications/journal_display/journal_controller.h" +#include "applications/mail.h" #include "applications/move_reminder.h" #include "applications/naming_screen.h" #include "applications/options_menu.h" @@ -126,7 +125,6 @@ #include "unk_020559DC.h" #include "unk_0205B33C.h" #include "unk_0209747C.h" -#include "unk_02097624.h" #include "vars_flags.h" #include "wifi_history_save_data.h" @@ -751,42 +749,42 @@ void *FieldSystem_OpenOptionsMenu(FieldSystem *fieldSystem) return optionsMenu; } -extern const ApplicationManagerTemplate Unk_020F64B0; +extern const ApplicationManagerTemplate gMailAppArgsTemplate; -static void sub_0203D910(FieldSystem *fieldSystem, UnkStruct_02097728 *param1) +static void LaunchMailApp(FieldSystem *fieldSystem, MailAppArgs *mailAppArgs) { - FieldSystem_StartChildProcess(fieldSystem, &Unk_020F64B0, param1); + FieldSystem_StartChildProcess(fieldSystem, &gMailAppArgsTemplate, mailAppArgs); } -UnkStruct_02097728 *sub_0203D920(FieldSystem *fieldSystem, int param1, u8 param2, u8 mailType, int unusedHeapID) +MailAppArgs *FieldSystem_LaunchMailApp_Write(FieldSystem *fieldSystem, enum MailContext context, u8 partySlot, u8 mailType, int unusedHeapID) { - UnkStruct_02097728 *v0 = sub_02097624(FieldSystem_GetSaveData(fieldSystem), param1, param2, mailType, HEAP_ID_FIELD2); - sub_0203D910(fieldSystem, v0); + MailAppArgs *mailAppArgs = MailAppArgs_New_Write(FieldSystem_GetSaveData(fieldSystem), context, partySlot, mailType, HEAP_ID_FIELD2); + LaunchMailApp(fieldSystem, mailAppArgs); - return v0; + return mailAppArgs; } -UnkStruct_02097728 *sub_0203D94C(FieldSystem *fieldSystem, int param1, u8 param2, enum HeapID heapID) +MailAppArgs *FieldSystem_LaunchMailApp_Read(FieldSystem *fieldSystem, enum MailContext context, u8 param2, enum HeapID heapID) { - UnkStruct_02097728 *v0; + MailAppArgs *mailAppArgs; - if (param1 == 3) { - v0 = sub_020976F4(FieldSystem_GetSaveData(fieldSystem), param2, heapID); + if (context == MAIL_CONTEXT_CHECK) { + mailAppArgs = MailAppArgs_New_Check(FieldSystem_GetSaveData(fieldSystem), param2, heapID); } else { - v0 = sub_0209767C(FieldSystem_GetSaveData(fieldSystem), param1, param2, heapID); + mailAppArgs = MailAppArgs_New_ReadFromMailbox(FieldSystem_GetSaveData(fieldSystem), context, param2, heapID); } - sub_0203D910(fieldSystem, v0); + LaunchMailApp(fieldSystem, mailAppArgs); - return v0; + return mailAppArgs; } -UnkStruct_02097728 *sub_0203D984(FieldSystem *fieldSystem, Pokemon *param1, enum HeapID heapID) +MailAppArgs *FieldSystem_LaunchMailApp_ReadHeld(FieldSystem *fieldSystem, Pokemon *mon, enum HeapID heapID) { - UnkStruct_02097728 *v0 = sub_020976BC(FieldSystem_GetSaveData(fieldSystem), param1, heapID); - sub_0203D910(fieldSystem, v0); + MailAppArgs *mailAppArgs = MailAppArgs_New_ReadHeld(FieldSystem_GetSaveData(fieldSystem), mon, heapID); + LaunchMailApp(fieldSystem, mailAppArgs); - return v0; + return mailAppArgs; } static void OpenPoffinCaseApp(FieldSystem *fieldSystem, PoffinCaseAppData *poffinCaseAppData) diff --git a/src/unk_0205B33C.c b/src/unk_0205B33C.c index 6d613eee46..512e699f80 100644 --- a/src/unk_0205B33C.c +++ b/src/unk_0205B33C.c @@ -1208,7 +1208,7 @@ int sub_0205BF44(UnkStruct_0205B43C *param0, StringTemplate *param1) return 166; } - if (!sub_02014BBC(¶m0->unk_178)) { + if (!Sentence_IsValid(¶m0->unk_178)) { return 167; } @@ -1250,7 +1250,7 @@ static void sub_0205BFF0(UnkStruct_0205B4F8 *param0) void sub_0205C010(UnkStruct_0205B43C *param0, Sentence *param1) { - sub_02014CC0(¶m0->unk_178, param1); + Sentence_Set(¶m0->unk_178, param1); param0->unk_180 = 1; } diff --git a/src/unk_0205C22C.c b/src/unk_0205C22C.c index 43c532ffd2..3066d7b120 100644 --- a/src/unk_0205C22C.c +++ b/src/unk_0205C22C.c @@ -492,7 +492,7 @@ static void sub_0205C8DC(UnkStruct_0205C924 *param0) param0->unk_04 = NULL; param0->unk_08 = NULL; - sub_02014A9C(¶m0->unk_14, 0); + Sentence_InitWithType(¶m0->unk_14, 0); param0->unk_10 = 0; param0->unk_0C = 0; diff --git a/src/unk_020722AC.c b/src/unk_020722AC.c index 4d5e7d2577..4ed79051f4 100644 --- a/src/unk_020722AC.c +++ b/src/unk_020722AC.c @@ -1,9 +1,7 @@ #include #include -#include "struct_defs/mail.h" -#include "struct_defs/struct_02097728.h" - +#include "applications/mail.h" #include "applications/party_menu/defs.h" #include "applications/party_menu/main.h" #include "field/field_system.h" @@ -40,7 +38,6 @@ #include "system.h" #include "text.h" #include "unk_0203D1B8.h" -#include "unk_02097624.h" typedef struct { u8 unk_00; @@ -101,7 +98,7 @@ typedef struct { Window unk_184; Window unk_194; ScrollPrompts *unk_1A4; - UnkStruct_02097728 *unk_1A8; + MailAppArgs *unk_1A8; Mailbox *mailbox; Bag *bag; PartyMenu *partyMenu; @@ -908,7 +905,7 @@ static void sub_02072F30(UnkStruct_02072334 *param0, SaveData *saveData, enum He mail = Mail_New(heapID); for (i = 0; i < MAILBOX_SIZE; i++) { - sub_020284CC(mailbox, 0, i, mail); + Mailbox_GetMailAtSlot(mailbox, MAIL_CONTEXT_MAILBOX, i, mail); v7 = &(param0->unk_1C[i]); v8 = &(param0->unk_1C[param0->unk_19]); @@ -917,14 +914,14 @@ static void sub_02072F30(UnkStruct_02072334 *param0, SaveData *saveData, enum He v7->unk_00 = i; - if (!Mail_IsEmpty(mail)) { + if (!Mail_IsValid(mail)) { continue; } v7->unk_01 = 1; v7->trainerGender = Mail_GetTrainerGender(mail); v7->mailType = Mail_GetMailType(mail); - v7->item = Item_ForMailNumber(v7->mailType); + v7->item = Item_ForMailType(v7->mailType); String_CopyChars(v7->unk_08, Mail_GetTrainerName(mail)); @@ -967,7 +964,7 @@ static BOOL sub_02073060(UnkStruct_02072334 *param0) Bag_TryAddItem(param0->bag, v0->item, 1, param0->heapID); } - sub_02028470(param0->mailbox, 0, param0->unk_18); + Mailbox_ClearMailAtSlot(param0->mailbox, MAIL_CONTEXT_MAILBOX, param0->unk_18); sub_02073020(param0, param0->unk_18); sub_02072EB8(v0, param0->unk_18); @@ -989,7 +986,7 @@ static void sub_020730B8(UnkStruct_02072334 *param0, u8 param1, BOOL param2) v1 = SaveData_GetParty(FieldSystem_GetSaveData(param0->fieldSystem)); v2 = Party_GetPokemonBySlotIndex(v1, param1); - sub_020977E4(param0->mailbox, param0->unk_18, v2, param0->heapID); + Mail_TransferFromMailboxToMon(param0->mailbox, param0->unk_18, v2, param0->heapID); if (param2) { if (Bag_CanFitItem(param0->bag, v0->item, 1, param0->heapID)) { @@ -1234,9 +1231,9 @@ static int sub_020735E8(UnkStruct_02072334 *param0) switch (param0->unk_12) { case 0: if (param0->unk_1C[param0->unk_18].unk_01) { - param0->unk_1A8 = sub_0203D94C(param0->fieldSystem, 0, param0->unk_18, param0->heapID); + param0->unk_1A8 = FieldSystem_LaunchMailApp_Read(param0->fieldSystem, MAIL_CONTEXT_MAILBOX, param0->unk_18, param0->heapID); } else { - param0->unk_1A8 = sub_0203D920(param0->fieldSystem, 0, param0->unk_17, param0->unk_1C[param0->unk_18].mailType, param0->heapID); + param0->unk_1A8 = FieldSystem_LaunchMailApp_Write(param0->fieldSystem, MAIL_CONTEXT_MAILBOX, param0->unk_17, param0->unk_1C[param0->unk_18].mailType, param0->heapID); } param0->unk_12++; @@ -1246,16 +1243,16 @@ static int sub_020735E8(UnkStruct_02072334 *param0) break; } - if (sub_02097728(param0->unk_1A8)) { + if (MailApp_WasMailWritten(param0->unk_1A8)) { param0->unk_1C[param0->unk_18].unk_01 = 1; - sub_0209772C(param0->unk_1A8, 0, param0->unk_1C[param0->unk_18].unk_00); + MailApp_CopyWrittenMailToMailboxSlot(param0->unk_1A8, MAIL_CONTEXT_MAILBOX, param0->unk_1C[param0->unk_18].unk_00); v0 = 2; } else { v0 = 1; } - sub_02097770(param0->unk_1A8); + MailAppArgs_Free(param0->unk_1A8); param0->unk_12 = 0; return v0; } diff --git a/src/unk_0209747C.c b/src/unk_0209747C.c index 8b03d5f212..711422ee90 100644 --- a/src/unk_0209747C.c +++ b/src/unk_0209747C.c @@ -4,7 +4,6 @@ #include #include "struct_decls/struct_02014EC4_decl.h" -#include "struct_decls/struct_0209747C_decl.h" #include "struct_defs/sentence.h" #include "game_options.h" @@ -17,21 +16,6 @@ #include "unk_02014D38.h" #include "vars_flags.h" -struct UnkStruct_0209747C_t { - u8 unk_00; - u8 unk_01; - u8 unk_02; - u8 unk_03; - u8 unk_04; - u8 unk_05; - int unk_08; - const Pokedex *unk_0C; - const UnkStruct_02014EC4 *unk_10; - Sentence unk_14; - u16 unk_1C[2]; - u16 unk_20[2]; -}; - UnkStruct_0209747C *sub_0209747C(u32 param0, u32 param1, SaveData *saveData, enum HeapID heapID) { UnkStruct_0209747C *v0 = Heap_Alloc(heapID, sizeof(UnkStruct_0209747C)); @@ -47,7 +31,7 @@ UnkStruct_0209747C *sub_0209747C(u32 param0, u32 param1, SaveData *saveData, enu v0->unk_08 = Options_Frame(SaveData_GetOptions(saveData)); if (param0 == 2) { - sub_02014A9C(&v0->unk_14, 3); + Sentence_InitWithType(&v0->unk_14, 3); } else { int v1; @@ -114,7 +98,7 @@ void sub_02097534(const UnkStruct_0209747C *param0, u16 *param1) void sub_02097540(const UnkStruct_0209747C *param0, Sentence *param1) { - sub_02014CC0(param1, &(param0->unk_14)); + Sentence_Set(param1, &(param0->unk_14)); } u32 sub_02097550(const UnkStruct_0209747C *param0) diff --git a/src/unk_02097624.c b/src/unk_02097624.c deleted file mode 100644 index 40db43f3f3..0000000000 --- a/src/unk_02097624.c +++ /dev/null @@ -1,383 +0,0 @@ -#include -#include - -#include "constants/items.h" -#include "generated/game_records.h" -#include "generated/trainer_score_events.h" - -#include "struct_defs/mail.h" -#include "struct_defs/struct_02097728.h" -#include "struct_defs/struct_020978D8.h" - -#include "overlay020/ov20_021D0D80.h" -#include "overlay075/ov75_021D0D80.h" - -#include "game_records.h" -#include "heap.h" -#include "item.h" -#include "mail.h" -#include "overlay_manager.h" -#include "pokemon.h" -#include "save_player.h" -#include "savedata.h" -#include "string_gf.h" -#include "unk_02014A84.h" -#include "unk_0209747C.h" - -FS_EXTERN_OVERLAY(overlay20); -FS_EXTERN_OVERLAY(overlay75); - -typedef struct { - enum HeapID heapID; - u16 unk_04; - u16 unk_06; - void *unk_08; - ApplicationManager *appMan; - UnkStruct_020978D8 *unk_10; - Sentence unk_14; -} UnkStruct_02097944; - -static int sub_02097944(ApplicationManager *appMan, int *param1); -static int sub_020979A8(ApplicationManager *appMan, int *param1); -static int sub_02097AF8(ApplicationManager *appMan, int *param1); -BOOL sub_02097728(UnkStruct_02097728 *param0); -int sub_0209772C(UnkStruct_02097728 *param0, int param1, u8 param2); -int sub_02097750(UnkStruct_02097728 *param0, Pokemon *param1); -void sub_02097770(UnkStruct_02097728 *param0); -void sub_020978D8(UnkStruct_020978D8 *param0); -void sub_020978F0(Mail *param0, UnkStruct_020978D8 *param1); - -const ApplicationManagerTemplate Unk_020F64B0 = { - sub_02097944, - sub_020979A8, - sub_02097AF8, - 0xFFFFFFFF -}; - -UnkStruct_02097728 *sub_02097624(SaveData *saveData, int param1, u8 param2, u8 param3, enum HeapID heapID) -{ - UnkStruct_02097728 *v0; - int v2; - - Mailbox *mailbox = SaveData_GetMailbox(saveData); - v0 = Heap_AllocAtEnd(heapID, sizeof(UnkStruct_02097728)); - - MI_CpuClear8(v0, sizeof(UnkStruct_02097728)); - - v0->unk_0F = param3; - v0->unk_0E = param2; - v0->mailbox = mailbox; - v0->unk_00 = 1; - v0->unk_08 = param1; - v0->unk_0C = 0; - v0->saveData = saveData; - v0->unk_14 = Mail_New(heapID); - - Mail_Init(v0->unk_14); - sub_020281AC(v0->unk_14, 0xFFFF, param2, saveData); - - return v0; -} - -UnkStruct_02097728 *sub_0209767C(SaveData *saveData, int param1, u16 param2, enum HeapID heapID) -{ - UnkStruct_02097728 *v0 = Heap_AllocAtEnd(heapID, sizeof(UnkStruct_02097728)); - MI_CpuClear8(v0, sizeof(UnkStruct_02097728)); - - v0->unk_00 = 0; - v0->unk_08 = param1; - v0->unk_0C = param2; - v0->saveData = saveData; - - Mailbox *mailbox = SaveData_GetMailbox(saveData); - - v0->mailbox = mailbox; - v0->unk_14 = sub_020284A8(mailbox, param1, param2, heapID); - - return v0; -} - -UnkStruct_02097728 *sub_020976BC(SaveData *saveData, Pokemon *param1, enum HeapID heapID) -{ - UnkStruct_02097728 *v0 = Heap_AllocAtEnd(heapID, sizeof(UnkStruct_02097728)); - MI_CpuClear8(v0, sizeof(UnkStruct_02097728)); - - v0->unk_00 = 0; - v0->saveData = saveData; - v0->unk_14 = Mail_New(heapID); - - Pokemon_GetValue(param1, MON_DATA_MAIL, v0->unk_14); - return v0; -} - -UnkStruct_02097728 *sub_020976F4(SaveData *saveData, u8 param1, enum HeapID heapID) -{ - UnkStruct_02097728 *v0 = Heap_AllocAtEnd(heapID, sizeof(UnkStruct_02097728)); - MI_CpuClear8(v0, sizeof(UnkStruct_02097728)); - - v0->unk_00 = 0; - v0->saveData = saveData; - v0->unk_14 = Mail_New(heapID); - - Mail_SetMailType(v0->unk_14, param1); - return v0; -} - -BOOL sub_02097728(UnkStruct_02097728 *param0) -{ - return param0->unk_04; -} - -int sub_0209772C(UnkStruct_02097728 *param0, int param1, u8 param2) -{ - if (!sub_02097728(param0)) { - return 0; - } - - Mailbox_CopyMailToSlot(param0->mailbox, param1, param2, param0->unk_14); - return 1; -} - -int sub_02097750(UnkStruct_02097728 *param0, Pokemon *param1) -{ - if (!sub_02097728(param0)) { - return 0; - } - - Pokemon_SetValue(param1, MON_DATA_MAIL, param0->unk_14); - return 1; -} - -void sub_02097770(UnkStruct_02097728 *param0) -{ - if (param0->unk_14 != NULL) { - Heap_Free(param0->unk_14); - } - - Heap_Free(param0); -} - -int sub_02097788(Mailbox *mailbox, Pokemon *mon, enum HeapID heapID) -{ - int item = ITEM_NONE; - int slot = Mail_GetEmptySlotInArray(mailbox, 0); - - if (slot == 0xFFFFFFFF) { - return 0xFFFFFFFF; - } - - Mail *mail = Mail_New(heapID); - - Pokemon_GetValue(mon, MON_DATA_MAIL, mail); - Mailbox_CopyMailToSlot(mailbox, 0, slot, mail); - Mail_Init(mail); - Pokemon_SetValue(mon, MON_DATA_MAIL, mail); - Pokemon_SetValue(mon, MON_DATA_HELD_ITEM, &item); - Heap_Free(mail); - - return slot; -} - -int sub_020977E4(Mailbox *mailbox, u16 param1, Pokemon *mon, enum HeapID heapID) -{ - int item = 0; - Mail *mail = sub_020284A8(mailbox, 0, param1, heapID); - - if (mail == NULL) { - return 0xFFFFFFFF; - } - - item = Item_ForMailNumber(Mail_GetMailType(mail)); - - Pokemon_SetValue(mon, MON_DATA_MAIL, mail); - Pokemon_SetValue(mon, MON_DATA_HELD_ITEM, &item); - sub_02028470(mailbox, 0, param1); - Heap_Free(mail); - - return param1; -} - -static UnkStruct_020978D8 *sub_02097834(const Mail *mail, enum HeapID heapID) -{ - u16 i; - UnkStruct_020978D8 *v1 = Heap_Alloc(heapID, sizeof(UnkStruct_020978D8)); - MI_CpuClear8(v1, sizeof(UnkStruct_020978D8)); - - v1->unk_00 = 0; - v1->unk_08 = Mail_GetTrainerID(mail); - v1->unk_10 = String_Init(8, heapID); - - String_CopyChars(v1->unk_10, Mail_GetTrainerName((Mail *)mail)); - - v1->mailType = Mail_GetMailType(mail); - v1->language = Mail_GetLanguage(mail); - v1->gameVersion = Mail_GetGameVersion(mail); - - for (i = 0; i < 3; i++) { - v1->unk_14[i].val2 = sub_02028328(mail, i, 2, sub_02028408(mail)); - } - - for (i = 0; i < 3; i++) { - sub_02014CC0(&v1->unk_1A[i], sub_0202840C((Mail *)mail, i)); - } - - return v1; -} - -void sub_020978D8(UnkStruct_020978D8 *param0) -{ - if (param0->unk_10 != NULL) { - String_Free(param0->unk_10); - } - - Heap_Free(param0); -} - -void sub_020978F0(Mail *param0, UnkStruct_020978D8 *param1) -{ - u16 v0; - - for (v0 = 0; v0 < 3; v0++) { - sub_0202841C(param0, ¶m1->unk_1A[v0], v0); - } - - Mail_SetMailType(param0, param1->mailType); -} - -static BOOL sub_02097920(ApplicationManager **appManPtr) -{ - if (*appManPtr) { - if (ApplicationManager_Exec(*appManPtr)) { - ApplicationManager_Free(*appManPtr); - *appManPtr = NULL; - return 1; - } - } - - return 0; -} - -static int sub_02097944(ApplicationManager *appMan, int *param1) -{ - UnkStruct_02097944 *v0 = NULL; - UnkStruct_02097728 *v1 = (UnkStruct_02097728 *)ApplicationManager_Args(appMan); - - Heap_Create(HEAP_ID_APPLICATION, HEAP_ID_40, 0x1000); - v0 = ApplicationManager_NewData(appMan, sizeof(UnkStruct_02097944), HEAP_ID_40); - MI_CpuClear8(v0, sizeof(UnkStruct_02097944)); - - v0->heapID = HEAP_ID_40; - v0->unk_10 = sub_02097834(v1->unk_14, v0->heapID); - v0->unk_10->options = SaveData_GetOptions(v1->saveData); - - if (v1->unk_00 == 1) { - v0->unk_10->mailType = v1->unk_0F; - } - - if (v0->unk_10->mailType >= NUM_MAILS) { - v0->unk_10->mailType = 0; - } - - v0->unk_10->unk_00 = v1->unk_00; - - return 1; -} - -static int sub_020979A8(ApplicationManager *appMan, int *param1) -{ - UnkStruct_02097944 *v0 = ApplicationManager_Data(appMan); - UnkStruct_02097728 *v1 = (UnkStruct_02097728 *)ApplicationManager_Args(appMan); - - FS_EXTERN_OVERLAY(overlay75); - FS_EXTERN_OVERLAY(overlay20); - - static const ApplicationManagerTemplate v2 = { - ov75_021D0D80, - ov75_021D0DF8, - ov75_021D0E10, - FS_OVERLAY_ID(overlay75), - }; - static const ApplicationManagerTemplate v3 = { - ov20_021D0D80, - ov20_021D0DF8, - ov20_021D0EA8, - FS_OVERLAY_ID(overlay20), - }; - - switch (*param1) { - case 0: - v0->unk_10->unk_00 = v1->unk_00; - v0->appMan = ApplicationManager_New(&v2, v0->unk_10, v0->heapID); - *param1 = 1; - break; - case 1: - if (!sub_02097920(&v0->appMan)) { - break; - } - - switch (v0->unk_10->unk_00) { - case 0xFFFF: - *param1 = 2; - break; - case 3: - *param1 = 2; - break; - default: - *param1 = 3; - break; - } - break; - case 2: - if (v1->unk_00 == 1) { - if (v0->unk_10->unk_00 == 3) { - sub_020978F0(v1->unk_14, v0->unk_10); - - GameRecords_IncrementTrainerScore(SaveData_GetGameRecords(v1->saveData), TRAINER_SCORE_EVENT_UNK_02); - GameRecords_IncrementRecordValue(SaveData_GetGameRecords(v1->saveData), RECORD_UNK_045); - v1->unk_04 = 1; - } else { - v1->unk_04 = 0; - } - } - - return 1; - case 3: - v0->unk_08 = sub_0209747C(2, 0, v1->saveData, v0->heapID); - - if (sub_02014BBC(&(v0->unk_10->unk_1A[v0->unk_10->unk_02]))) { - sub_02014CC0(&(v0->unk_14), &(v0->unk_10->unk_1A[v0->unk_10->unk_02])); - } else { - sub_02014A9C(&(v0->unk_14), 3); - } - - sub_02097500(v0->unk_08, &(v0->unk_14)); - v0->appMan = ApplicationManager_New(&v3, v0->unk_08, v0->heapID); - *param1 = 4; - break; - case 4: - if (!sub_02097920(&v0->appMan)) { - break; - } - - if (sub_02097528(v0->unk_08) == 0) { - sub_02097540(v0->unk_08, &(v0->unk_10->unk_1A[v0->unk_10->unk_02])); - } - - sub_020974EC(v0->unk_08); - *param1 = 0; - break; - } - - return 0; -} - -static int sub_02097AF8(ApplicationManager *appMan, int *param1) -{ - UnkStruct_02097944 *v0 = ApplicationManager_Data(appMan); - - sub_020978D8(v0->unk_10); - ApplicationManager_FreeData(appMan); - Heap_Destroy(v0->heapID); - - return 1; -} diff --git a/src/unk_020998EC.c b/src/unk_020998EC.c index 8ec40683e2..72e6cc61f4 100644 --- a/src/unk_020998EC.c +++ b/src/unk_020998EC.c @@ -5,7 +5,6 @@ #include "struct_decls/struct_02014D38_decl.h" #include "struct_decls/struct_02014EC4_decl.h" -#include "struct_decls/struct_0209747C_decl.h" #include "struct_decls/struct_020998EC_decl.h" #include "heap.h" diff --git a/src/unk_0209ACF4.c b/src/unk_0209ACF4.c index 7c3adee4ab..f48cd18231 100644 --- a/src/unk_0209ACF4.c +++ b/src/unk_0209ACF4.c @@ -3,7 +3,6 @@ #include #include -#include "struct_decls/struct_0209747C_decl.h" #include "struct_defs/sentence.h" #include "field/field_system.h" @@ -136,19 +135,19 @@ static BOOL sub_0209AE14(FieldTask *param0) switch (v0->unk_64) { case 0: - sub_02014CC0(&(v0->unk_48), sub_0202D498(v0->fieldSystem->saveData, 0)); + Sentence_Set(&(v0->unk_48), sub_0202D498(v0->fieldSystem->saveData, 0)); v0->unk_54 = 3; break; case 1: - sub_02014CC0(&(v0->unk_48), sub_0202D498(v0->fieldSystem->saveData, 1)); + Sentence_Set(&(v0->unk_48), sub_0202D498(v0->fieldSystem->saveData, 1)); v0->unk_54 = 3; break; case 2: - sub_02014CC0(&(v0->unk_48), sub_0202D498(v0->fieldSystem->saveData, 2)); + Sentence_Set(&(v0->unk_48), sub_0202D498(v0->fieldSystem->saveData, 2)); v0->unk_54 = 3; break; case 3: - sub_02014CC0(&(v0->unk_48), sub_0202D498(v0->fieldSystem->saveData, 3)); + Sentence_Set(&(v0->unk_48), sub_0202D498(v0->fieldSystem->saveData, 3)); v0->unk_54 = 3; break; case 4: diff --git a/src/unk_0209B344.c b/src/unk_0209B344.c index 4642bb1a77..886830b6d0 100644 --- a/src/unk_0209B344.c +++ b/src/unk_0209B344.c @@ -3,7 +3,6 @@ #include #include -#include "struct_decls/struct_0209747C_decl.h" #include "struct_defs/sentence.h" #include "field/field_system.h" @@ -43,7 +42,7 @@ void sub_0209B344(FieldTask *param0, u16 *param1) v1->unk_14 = SaveData_MiscSaveBlock(fieldSystem->saveData); v1->unk_20 = param1; - sub_02014A9C(&v1->unk_08, 4); + Sentence_InitWithType(&v1->unk_08, 4); MiscSaveBlock_IntroMsg(v1->unk_14, &v1->unk_08); sub_02097520(v1->unk_10);