diff options
-rw-r--r-- | include/global.h | 2 | ||||
-rw-r--r-- | include/pokemon.h | 4 | ||||
-rw-r--r-- | src/daycare.c | 149 | ||||
-rw-r--r-- | src/pokemon_1.c | 4 |
4 files changed, 45 insertions, 114 deletions
diff --git a/include/global.h b/include/global.h index d5535a9c7..3f30544a8 100644 --- a/include/global.h +++ b/include/global.h @@ -550,7 +550,7 @@ struct DayCareMailEtc struct DayCareMail data[2]; union { struct DayCareMailExtra rc; - u32 unk70[2]; + u32 steps[2]; } extra; }; diff --git a/include/pokemon.h b/include/pokemon.h index 594295b40..7d94dbb7d 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -93,6 +93,8 @@ #define MON_DATA_SPATK2 87 #define MON_DATA_SPDEF2 88 +#define MAX_LEVEL 100 + #define MON_MALE 0x00 #define MON_FEMALE 0xFE #define MON_GENDERLESS 0xFF @@ -510,7 +512,7 @@ void sub_803ADE8(struct Pokemon *mon, struct UnknownPokemonStruct *src); void sub_803AF78(struct Pokemon *mon, struct UnknownPokemonStruct *dest); u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon); void CalculateMonStats(struct Pokemon *mon); -void sub_803B4B4(struct Pokemon *src, struct Pokemon *dest); +void sub_803B4B4(const struct BoxPokemon *src, struct Pokemon *dest); u8 GetLevelFromMonExp(struct Pokemon *mon); u8 GetLevelFromBoxMonExp(struct BoxPokemon *boxMon); u16 GiveMoveToMon(struct Pokemon *mon, u16 move); diff --git a/src/daycare.c b/src/daycare.c index 64eac981e..2f30c1479 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -3,6 +3,7 @@ #include "pokemon.h" #include "species.h" #include "items.h" +#include "text.h" #include "string_util.h" #include "mail_data.h" #include "name_string_util.h" @@ -91,7 +92,7 @@ void Daycare_SendPokemon(struct Pokemon * mon, struct DayCareData * daycare_data } daycare_data->mons[empty_slot] = mon->box; BoxMonRestorePP(&daycare_data->mons[empty_slot]); - daycare_data->mail.extra.unk70[empty_slot] = 0; + daycare_data->mail.extra.steps[empty_slot] = 0; ZeroMonData(mon); party_compaction(); CalculatePlayerPartyCount(); @@ -102,18 +103,18 @@ void Daycare_SendPokemon_Special() Daycare_SendPokemon(gPlayerParty + gLastFieldPokeMenuOpened, &gSaveBlock1.daycareData); } -void sub_80417F4(u8 *); +void sub_80417F4(struct MailStruct *); -void sub_80414C0(struct BoxPokemon * daycare_data) +void sub_80414C0(struct DayCareData * daycare_data) { - u32 second_species; - if((GetBoxMonData(&daycare_data[1], MON_DATA_SPECIES) != 0) && ((second_species = GetBoxMonData(&daycare_data[0], MON_DATA_SPECIES)) == 0)){ - daycare_data[0] = daycare_data[1]; - ZeroBoxMonData(&daycare_data[1]); - memcpy(daycare_data + 2, (u8 *) (daycare_data + 1) + 0x88, 0x38); - *((u32 *)(daycare_data) + 68) = *((u32 *)(daycare_data) + 69); - *((u32 *)(daycare_data) + 69) = second_species; - sub_80417F4((u8 *) (daycare_data + 1) + 0x88); + if((GetBoxMonData(&daycare_data->mons[1], MON_DATA_SPECIES) != 0) && GetBoxMonData(&daycare_data->mons[0], MON_DATA_SPECIES) == 0) + { + daycare_data->mons[0] = daycare_data->mons[1]; + ZeroBoxMonData(&daycare_data->mons[1]); + daycare_data->mail.data[0] = daycare_data->mail.data[1]; + daycare_data->mail.extra.steps[0] = daycare_data->mail.extra.steps[1]; + daycare_data->mail.extra.steps[1] = 0; + sub_80417F4(&daycare_data->mail.data[1].mail); } } @@ -143,105 +144,33 @@ void sub_804151C(struct Pokemon * mon) CalculateMonStats(mon); } -__attribute__((naked)) -u16 sub_8041570(struct DayCareData * daycare_data, u8 a2){ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - sub sp, 0x68\n\ - adds r5, r0, 0\n\ - lsls r1, 24\n\ - lsrs r4, r1, 24\n\ - lsls r7, r4, 2\n\ - adds r0, r7, r4\n\ - lsls r0, 4\n\ - adds r6, r5, r0\n\ - ldr r1, _08041640 @ =gStringVar1\n\ - adds r0, r6, 0\n\ - bl GetBoxMonNick\n\ - adds r0, r6, 0\n\ - movs r1, 0xB\n\ - bl GetBoxMonData\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - mov r9, r0\n\ - adds r0, r6, 0\n\ - mov r1, sp\n\ - bl sub_803B4B4\n\ - mov r0, sp\n\ - movs r1, 0x38\n\ - bl GetMonData\n\ - cmp r0, 0x64\n\ - beq _080415D8\n\ - mov r0, sp\n\ - movs r1, 0x19\n\ - bl GetMonData\n\ - movs r2, 0x88\n\ - lsls r2, 1\n\ - adds r1, r5, r2\n\ - adds r1, r7\n\ - ldr r1, [r1]\n\ - adds r0, r1\n\ - str r0, [sp, 0x64]\n\ - add r2, sp, 0x64\n\ - mov r0, sp\n\ - movs r1, 0x19\n\ - bl SetMonData\n\ - mov r0, sp\n\ - bl sub_804151C\n\ -_080415D8:\n\ - ldr r0, _08041644 @ =gPlayerParty\n\ - movs r1, 0xFA\n\ - lsls r1, 1\n\ - adds r1, r0\n\ - mov r8, r1\n\ - mov r0, r8\n\ - mov r1, sp\n\ - movs r2, 0x64\n\ - bl memcpy\n\ - lsls r0, r4, 3\n\ - subs r0, r4\n\ - lsls r1, r0, 3\n\ - adds r0, r5, r1\n\ - adds r0, 0xC0\n\ - ldrh r0, [r0]\n\ - cmp r0, 0\n\ - beq _08041610\n\ - adds r4, r1, 0\n\ - adds r4, 0xA0\n\ - adds r4, r5, r4\n\ - mov r0, r8\n\ - adds r1, r4, 0\n\ - bl GiveMailToMon2\n\ - adds r0, r4, 0\n\ - bl sub_80417F4\n\ -_08041610:\n\ - bl party_compaction\n\ - adds r0, r6, 0\n\ - bl ZeroBoxMonData\n\ - movs r2, 0x88\n\ - lsls r2, 1\n\ - adds r0, r5, r2\n\ - adds r0, r7\n\ - movs r1, 0\n\ - str r1, [r0]\n\ - adds r0, r5, 0\n\ - bl sub_80414C0\n\ - bl CalculatePlayerPartyCount\n\ - mov r0, r9\n\ - add sp, 0x68\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_08041640: .4byte gStringVar1\n\ -_08041644: .4byte gPlayerParty\n\ - .syntax divided"); +u16 sub_8041570(struct DayCareData * daycare_data, u8 a2) +{ + u16 species; + u32 experience; + struct Pokemon pokemon; + + GetBoxMonNick(&daycare_data->mons[a2], gStringVar1); + species = GetBoxMonData(&daycare_data->mons[a2], MON_DATA_SPECIES); + sub_803B4B4(&daycare_data->mons[a2], &pokemon); + if (GetMonData(&pokemon, MON_DATA_LEVEL) != MAX_LEVEL) + { + experience = GetMonData(&pokemon, MON_DATA_EXP) + daycare_data->mail.extra.steps[a2]; + SetMonData(&pokemon, MON_DATA_EXP, (u8 *)&experience); + sub_804151C(&pokemon); + } + gPlayerParty[PARTY_SIZE - 1] = pokemon; + if (daycare_data->mail.data[a2].mail.itemId) + { + GiveMailToMon2(&gPlayerParty[PARTY_SIZE - 1], &daycare_data->mail.data[a2].mail); + sub_80417F4(&daycare_data->mail.data[a2].mail); + } + party_compaction(); + ZeroBoxMonData(&daycare_data->mons[a2]); + daycare_data->mail.extra.steps[a2] = 0; + sub_80414C0(daycare_data); + CalculatePlayerPartyCount(); + return species; } extern u8 gSpecialVar_0x8004; diff --git a/src/pokemon_1.c b/src/pokemon_1.c index c65bfa185..5cfd2c794 100644 --- a/src/pokemon_1.c +++ b/src/pokemon_1.c @@ -467,10 +467,10 @@ void CalculateMonStats(struct Pokemon *mon) SetMonData(mon, MON_DATA_HP, (u8 *)¤tHP); } -void sub_803B4B4(struct Pokemon *src, struct Pokemon *dest) +void sub_803B4B4(const struct BoxPokemon *src, struct Pokemon *dest) { u32 value = 0; - memcpy(&dest->box, &src->box, sizeof(struct BoxPokemon)); + dest->box = *src; SetMonData(dest, MON_DATA_STATUS, (u8 *)&value); SetMonData(dest, MON_DATA_HP, (u8 *)&value); SetMonData(dest, MON_DATA_MAX_HP, (u8 *)&value); |