diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/daycare.c | 2 | ||||
-rw-r--r-- | src/decompress.c | 2 | ||||
-rw-r--r-- | src/mail_data.c | 182 | ||||
-rw-r--r-- | src/menu2.c | 2 | ||||
-rw-r--r-- | src/multiboot.c | 8 | ||||
-rw-r--r-- | src/play_time.c | 2 | ||||
-rw-r--r-- | src/save_location.c | 1 |
7 files changed, 186 insertions, 13 deletions
diff --git a/src/daycare.c b/src/daycare.c index 35670465a..7a2cb0698 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -5,7 +5,7 @@ #include "string_util.h" #include "constants/species.h" #include "constants/items.h" -#include "mail.h" +#include "mail_data.h" #include "pokemon_storage_system.h" #include "event_data.h" #include "random.h" diff --git a/src/decompress.c b/src/decompress.c index ddc86b5b7..826c2ee94 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -79,7 +79,6 @@ void HandleLoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *des isFrontPic = TRUE; // frontPic else isFrontPic = FALSE; // backPic - LoadSpecialPokePic(src, dest, species, personality, isFrontPic); } @@ -94,7 +93,6 @@ void LoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 i = SPECIES_UNOWN; else i += SPECIES_UNOWN_B - 1; - if (!isFrontPic) LZ77UnCompWram(gMonBackPicTable[i].data, dest); else diff --git a/src/mail_data.c b/src/mail_data.c new file mode 100644 index 000000000..5d6c93419 --- /dev/null +++ b/src/mail_data.c @@ -0,0 +1,182 @@ +#include "global.h" +#include "text.h" +#include "mail.h" +#include "mail_data.h" +#include "constants/species.h" +#include "constants/items.h" +#include "pokemon_icon.h" + +void ClearMailData(void) +{ + u8 i; + + for (i = 0; i < MAIL_COUNT; i++) + ClearMailStruct(&gSaveBlock1Ptr->mail[i]); +} + +void ClearMailStruct(struct MailStruct *mail) +{ + s32 i; + + for (i = 0; i < MAIL_WORDS_COUNT; i++) + mail->words[i] = 0xFFFF; + for (i = 0; i < PLAYER_NAME_LENGTH; i++) + mail->playerName[i] = EOS; + for (i = 0; i < 4; i++) + mail->trainerId[i] = 0; + mail->species = SPECIES_BULBASAUR; + mail->itemId = ITEM_NONE; +} + +bool8 MonHasMail(struct Pokemon *mon) +{ + u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM); + if (ItemIsMail(heldItem) && GetMonData(mon, MON_DATA_MAIL) != 0xFF) + return TRUE; + else + return FALSE; +} + +u8 GiveMailToMon(struct Pokemon *mon, u16 itemId) +{ + u8 heldItem[2]; + u8 id, i; + u16 species; + u32 personality; + + heldItem[0] = itemId; + heldItem[1] = itemId >> 8; + for (id = 0; id < PARTY_SIZE; id++) + { + if (gSaveBlock1Ptr->mail[id].itemId == 0) + { + for (i = 0; i < MAIL_WORDS_COUNT; i++) + gSaveBlock1Ptr->mail[id].words[i] = 0xFFFF; + for (i = 0; i < PLAYER_NAME_LENGTH - 1 && gSaveBlock2Ptr->playerName[i] != EOS; i++) + gSaveBlock1Ptr->mail[id].playerName[i] = gSaveBlock2Ptr->playerName[i]; + for (; i <= 5; i++) + gSaveBlock1Ptr->mail[id].playerName[i] = CHAR_SPACE; + gSaveBlock1Ptr->mail[id].playerName[i] = EOS; + for (i = 0; i < 4; i++) + gSaveBlock1Ptr->mail[id].trainerId[i] = gSaveBlock2Ptr->playerTrainerId[i]; + species = GetBoxMonData(&mon->box, MON_DATA_SPECIES); + personality = GetBoxMonData(&mon->box, MON_DATA_PERSONALITY); + gSaveBlock1Ptr->mail[id].species = SpeciesToMailSpecies(species, personality); + gSaveBlock1Ptr->mail[id].itemId = itemId; + SetMonData(mon, MON_DATA_MAIL, &id); + SetMonData(mon, MON_DATA_HELD_ITEM, heldItem); + return id; + } + } + return 0xFF; +} + +u16 SpeciesToMailSpecies(u16 species, u32 personality) +{ + return species == 0xC9 ? ((GetUnownLetterByPersonality(personality) << 16) + 0x75300000) >> 16 : species; +} + +u16 MailSpeciesToSpecies(u16 mailSpecies, u16 *buffer) +{ + u16 result; + + if (mailSpecies >= 30000 && mailSpecies < (30000 + UNOWN_FORM_COUNT)) + { + result = SPECIES_UNOWN; + *buffer = mailSpecies - 30000; + } + else + { + result = mailSpecies; + } + return result; +} + +u8 GiveMailToMon2(struct Pokemon *mon, struct MailStruct *mail) +{ + u8 heldItem[2]; + u16 itemId = mail->itemId; + u8 mailId = GiveMailToMon(mon, itemId); + + if (mailId == 0xFF) + return 0xFF; + gSaveBlock1Ptr->mail[mailId] = *mail; + SetMonData(mon, MON_DATA_MAIL, &mailId); + heldItem[0] = itemId; + heldItem[1] = itemId >> 8; + + SetMonData(mon, MON_DATA_HELD_ITEM, heldItem); + + return mailId; +} + +static bool32 DummyMailFunc(void) +{ + return FALSE; +} + +void TakeMailFromMon(struct Pokemon *mon) +{ + u8 heldItem[2]; + u8 mailId; + + if (MonHasMail(mon)) + { + mailId = GetMonData(mon, MON_DATA_MAIL); + gSaveBlock1Ptr->mail[mailId].itemId = ITEM_NONE; + mailId = 0xFF; + heldItem[0] = ITEM_NONE; + heldItem[1] = ITEM_NONE << 8; + SetMonData(mon, MON_DATA_MAIL, &mailId); + SetMonData(mon, MON_DATA_HELD_ITEM, heldItem); + } +} + +void ClearMailItemId(u8 mailId) +{ + gSaveBlock1Ptr->mail[mailId].itemId = ITEM_NONE; +} + +u8 TakeMailFromMon2(struct Pokemon *mon) +{ + u8 i, newMailId; + u8 newHeldItem[2]; + + newHeldItem[0] = ITEM_NONE; + newHeldItem[1] = ITEM_NONE << 8; + newMailId = 0xFF; + for (i = PARTY_SIZE; i < MAIL_COUNT; i++) + { + if (gSaveBlock1Ptr->mail[i].itemId == ITEM_NONE) + { + memcpy(&gSaveBlock1Ptr->mail[i], &gSaveBlock1Ptr->mail[GetMonData(mon, MON_DATA_MAIL)], sizeof(struct MailStruct)); + gSaveBlock1Ptr->mail[GetMonData(mon, MON_DATA_MAIL)].itemId = ITEM_NONE; + SetMonData(mon, MON_DATA_MAIL, &newMailId); + SetMonData(mon, MON_DATA_HELD_ITEM, newHeldItem); + return i; + } + } + return 0xFF; +} + +bool8 ItemIsMail(u16 itemId) +{ + switch (itemId) + { + case ITEM_ORANGE_MAIL: + case ITEM_HARBOR_MAIL: + case ITEM_GLITTER_MAIL: + case ITEM_MECH_MAIL: + case ITEM_WOOD_MAIL: + case ITEM_WAVE_MAIL: + case ITEM_BEAD_MAIL: + case ITEM_SHADOW_MAIL: + case ITEM_TROPIC_MAIL: + case ITEM_DREAM_MAIL: + case ITEM_FAB_MAIL: + case ITEM_RETRO_MAIL: + return TRUE; + default: + return FALSE; + } +} diff --git a/src/menu2.c b/src/menu2.c index 9a1846c7e..ffe5865e4 100644 --- a/src/menu2.c +++ b/src/menu2.c @@ -820,7 +820,7 @@ u8 sub_812EA78(u16 species, u32 personality, u8 a2) { if (species == SPECIES_UNOWN) { - u8 unownLetter = GetUnownLetterByPersonality(personality); + u8 unownLetter = GetUnownLetterByPersonalityLoByte(personality); switch (unownLetter) { case 0: diff --git a/src/multiboot.c b/src/multiboot.c index 25b729dfd..cfc9821d2 100644 --- a/src/multiboot.c +++ b/src/multiboot.c @@ -23,9 +23,7 @@ void MultiBootInit(struct MultiBootParam *mp) int MultiBootMain(struct MultiBootParam *mp) { - int i; - int j; - int k; + int i, j, k; if (MultiBootCheckComplete(mp)) { @@ -260,9 +258,7 @@ output_burst: static int MultiBootSend(struct MultiBootParam *mp, u16 data) { - int i; - - i = REG_SIOCNT & (SIO_MULTI_BUSY | SIO_MULTI_SD | SIO_MULTI_SI); + int i = REG_SIOCNT & (SIO_MULTI_BUSY | SIO_MULTI_SD | SIO_MULTI_SI); if (i != SIO_MULTI_SD) { MultiBootInit(mp); diff --git a/src/play_time.c b/src/play_time.c index cb70a57c4..04f4b2040 100644 --- a/src/play_time.c +++ b/src/play_time.c @@ -12,7 +12,6 @@ enum void PlayTimeCounter_Reset(void) { sPlayTimeCounterState = STOPPED; - gSaveBlock2Ptr->playTimeHours = 0; gSaveBlock2Ptr->playTimeMinutes = 0; gSaveBlock2Ptr->playTimeSeconds = 0; @@ -22,7 +21,6 @@ void PlayTimeCounter_Reset(void) void PlayTimeCounter_Start(void) { sPlayTimeCounterState = RUNNING; - if (gSaveBlock2Ptr->playTimeHours > 999) PlayTimeCounter_SetToMax(); } diff --git a/src/save_location.c b/src/save_location.c index 71561c899..9b679c7ee 100644 --- a/src/save_location.c +++ b/src/save_location.c @@ -12,7 +12,6 @@ static bool32 IsCurMapInLocationList(const u16 *list) if (list[i] == locSum) return TRUE; } - return FALSE; } |