mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2024-12-26 19:54:21 +01:00
204 lines
4.7 KiB
C
204 lines
4.7 KiB
C
#include "global.h"
|
|
#include "mail.h"
|
|
#include "constants/items.h"
|
|
#include "pokemon.h"
|
|
#include "pokemon_icon.h"
|
|
#include "constants/species.h"
|
|
#include "text.h"
|
|
#include "international_string_util.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 + 1; 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 - 1; i++)
|
|
gSaveBlock1Ptr->mail[id].playerName[i] = gSaveBlock2Ptr->playerName[i];
|
|
gSaveBlock1Ptr->mail[id].playerName[i] = EOS;
|
|
PadNameString(gSaveBlock1Ptr->mail[id].playerName, CHAR_SPACE);
|
|
|
|
for (i = 0; i < TRAINER_ID_LENGTH; 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)
|
|
{
|
|
if (species == SPECIES_UNOWN)
|
|
{
|
|
u32 species = GetUnownLetterByPersonality(personality) + 30000;
|
|
return species;
|
|
}
|
|
|
|
return 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;
|
|
u8 newHeldItem[2];
|
|
u8 newMailId;
|
|
|
|
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;
|
|
}
|
|
}
|