summaryrefslogtreecommitdiff
path: root/src/daycare.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/daycare.c')
-rw-r--r--src/daycare.c151
1 files changed, 30 insertions, 121 deletions
diff --git a/src/daycare.c b/src/daycare.c
index cded18207..64eac981e 100644
--- a/src/daycare.c
+++ b/src/daycare.c
@@ -4,6 +4,9 @@
#include "species.h"
#include "items.h"
#include "string_util.h"
+#include "mail_data.h"
+#include "name_string_util.h"
+#include "pokemon_storage_system.h"
extern u8 gLastFieldPokeMenuOpened;
@@ -35,7 +38,7 @@ u8 Daycare_CountPokemon(struct BoxPokemon *daycare_data)
return count;
}
-void sub_8041324(struct BoxPokemon * box_pokemon, struct RecordMixing_UnknownStruct * void_pointer)
+void sub_8041324(struct BoxPokemon * box_pokemon, struct DayCareMailEtc * void_pointer)
{
u8 i;
u8 specCount;
@@ -47,17 +50,17 @@ void sub_8041324(struct BoxPokemon * box_pokemon, struct RecordMixing_UnknownStr
specCount ++;
if (GetBoxMonData(&box_pokemon[i], MON_DATA_HELD_ITEM) == ITEM_NONE)
{
- void_pointer->unk74[i] = 0;
+ void_pointer->extra.rc.unk74[i] = 0;
} else
{
- void_pointer->unk74[i] = 1;
+ void_pointer->extra.rc.unk74[i] = 1;
}
} else
{
- void_pointer->unk74[i] = 1;
+ void_pointer->extra.rc.unk74[i] = 1;
}
}
- void_pointer->unk70 = specCount;
+ void_pointer->extra.rc.unk70 = specCount;
}
s8 Daycare_FindEmptySpot(struct BoxPokemon * daycare_data)
@@ -71,126 +74,32 @@ s8 Daycare_FindEmptySpot(struct BoxPokemon * daycare_data)
return -1;
}
-/*void Daycare_SendPokemon(struct Pokemon * mon, struct BoxPokemon * daycare_data){ // unfinished
+void Daycare_SendPokemon(struct Pokemon * mon, struct DayCareData * daycare_data){ // unfinished
s8 empty_slot;
+ u8 mail;
+ u8 *names;
- empty_slot = Daycare_FindEmptySpot(daycare_data);
- if(MonHasMail(mon) != 0){ // if the mon holds a mail?
- u8 empty_slot_times_56 = empty_slot * 56;
- u8 * something2 = ((u8 *) (daycare_data + 2)) + empty_slot_times_56 + 36;
- StringCopy(something2, gSaveBlock2.playerName);
- PadNameString(something2, 0xFC);
- something2 += 8;
- GetMonNick(mon, something2);
- u8 pokerus = GetMonData(mon, MON_DATA_64);
- something1 += (u8 * daycare_data)
-}*/
-
-__attribute__((naked))
-void Daycare_SendPokemon()
-{
- // strange stack usage - happens because THUMB ARM only allows R0-R7 to be pushed/popped:
- // all registers in reglist must be Lo registers, except that PUSH can include the LR, and POP can include the PC
- // the ldm/stm section probably copies some struct, but I'm not sure how the code would look
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- mov r7, r9\n\
- mov r6, r8\n\
- push {r6,r7}\n\
- adds r7, r0, 0\n\
- mov r8, r1\n\
- mov r0, r8\n\
- bl Daycare_FindEmptySpot\n\
- lsls r0, 24\n\
- lsrs r4, r0, 24\n\
- mov r9, r4\n\
- adds r0, r7, 0\n\
- bl MonHasMail\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _0804144A\n\
- lsls r0, r4, 24\n\
- asrs r0, 24\n\
- lsls r4, r0, 3\n\
- subs r4, r0\n\
- lsls r4, 3\n\
- adds r5, r4, 0\n\
- adds r5, 0xA0\n\
- add r5, r8\n\
- adds r6, r5, 0\n\
- adds r6, 0x24\n\
- ldr r1, _08041490 @ =gSaveBlock2\n\
- adds r0, r6, 0\n\
- bl StringCopy\n\
- adds r0, r6, 0\n\
- movs r1, 0xFC\n\
- bl PadNameString\n\
- adds r6, 0x8\n\
- adds r0, r7, 0\n\
- adds r1, r6, 0\n\
- bl GetMonNick\n\
- adds r0, r7, 0\n\
- movs r1, 0x40\n\
- bl GetMonData\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- add r4, r8\n\
- ldr r2, _08041494 @ =gSaveBlock1\n\
- lsls r1, r0, 3\n\
- adds r1, r0\n\
- lsls r1, 2\n\
- adds r1, r2\n\
- adds r4, 0xA0\n\
- ldr r0, _08041498 @ =0x00002b4c\n\
- adds r1, r0\n\
- ldm r1!, {r0,r2,r3}\n\
- stm r4!, {r0,r2,r3}\n\
- ldm r1!, {r0,r2,r3}\n\
- stm r4!, {r0,r2,r3}\n\
- ldm r1!, {r0,r2,r3}\n\
- stm r4!, {r0,r2,r3}\n\
- adds r0, r7, 0\n\
- bl TakeMailFromMon\n\
-_0804144A:\n\
- mov r2, r9\n\
- lsls r4, r2, 24\n\
- asrs r4, 24\n\
- lsls r5, r4, 2\n\
- adds r4, r5, r4\n\
- lsls r4, 4\n\
- add r4, r8\n\
- adds r0, r4, 0\n\
- adds r1, r7, 0\n\
- movs r2, 0x50\n\
- bl memcpy\n\
- adds r0, r4, 0\n\
- bl BoxMonRestorePP\n\
- movs r0, 0x88\n\
- lsls r0, 1\n\
- add r0, r8\n\
- adds r0, r5\n\
- movs r1, 0\n\
- str r1, [r0]\n\
- adds r0, r7, 0\n\
- bl ZeroMonData\n\
- bl party_compaction\n\
- bl CalculatePlayerPartyCount\n\
- pop {r3,r4}\n\
- mov r8, r3\n\
- mov r9, r4\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
-_08041490: .4byte gSaveBlock2\n\
-_08041494: .4byte gSaveBlock1\n\
-_08041498: .4byte 0x00002b4c\n\
- .syntax divided\n");
+ empty_slot = Daycare_FindEmptySpot(daycare_data->mons);
+ if(MonHasMail(mon)) {
+ StringCopy((names = daycare_data->mail.data[empty_slot].names), gSaveBlock2.playerName);
+ PadNameString(names, 0xFC);
+ names += 8;
+ GetMonNick(mon, names);
+ mail = GetMonData(mon, MON_DATA_MAIL);
+ daycare_data->mail.data[empty_slot].mail = gSaveBlock1.mail[mail];
+ TakeMailFromMon(mon);
+ }
+ daycare_data->mons[empty_slot] = mon->box;
+ BoxMonRestorePP(&daycare_data->mons[empty_slot]);
+ daycare_data->mail.extra.unk70[empty_slot] = 0;
+ ZeroMonData(mon);
+ party_compaction();
+ CalculatePlayerPartyCount();
}
void Daycare_SendPokemon_Special()
{
- Daycare_SendPokemon(gPlayerParty + gLastFieldPokeMenuOpened, gSaveBlock1.daycareData);
+ Daycare_SendPokemon(gPlayerParty + gLastFieldPokeMenuOpened, &gSaveBlock1.daycareData);
}
void sub_80417F4(u8 *);
@@ -235,7 +144,7 @@ void sub_804151C(struct Pokemon * mon)
}
__attribute__((naked))
-u16 sub_8041570(struct BoxPokemon * daycare_data, u8 a2){
+u16 sub_8041570(struct DayCareData * daycare_data, u8 a2){
asm(".syntax unified\n\
push {r4-r7,lr}\n\
mov r7, r9\n\
@@ -339,7 +248,7 @@ extern u8 gSpecialVar_0x8004;
u16 sub_8041648()
{
- return sub_8041570(gSaveBlock1.daycareData, gSpecialVar_0x8004);
+ return sub_8041570(&gSaveBlock1.daycareData, gSpecialVar_0x8004);
}
u8 Daycare_GetLevelAfterSteps(struct BoxPokemon * mon, u32 steps){