From 0310be30079c657f3a21da64683bdf9ac1d4d394 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 14 Nov 2017 23:25:07 +0100 Subject: [PATCH] more of daycare done --- asm/daycare.s | 141 ++------------------------------------------ include/daycare.h | 6 +- include/egg_hatch.h | 10 ++++ src/daycare.c | 53 +++++++++++++++++ src/egg_hatch.c | 1 + 5 files changed, 72 insertions(+), 139 deletions(-) create mode 100644 include/egg_hatch.h diff --git a/asm/daycare.s b/asm/daycare.s index ca36fab257..5d6b09c8ea 100644 --- a/asm/daycare.s +++ b/asm/daycare.s @@ -7,137 +7,6 @@ - - thumb_func_start sub_8070AC4 -sub_8070AC4: @ 8070AC4 - push {r4-r7,lr} - sub sp, 0x4 - adds r6, r0, 0 - movs r7, 0 - movs r5, 0 -_08070ACE: - movs r0, 0x8C - adds r4, r5, 0 - muls r4, r0 - adds r0, r6, r4 - movs r1, 0x5 - bl GetBoxMonData - cmp r0, 0 - beq _08070AEE - adds r1, r6, 0 - adds r1, 0x88 - adds r1, r4 - ldr r0, [r1] - adds r0, 0x1 - str r0, [r1] - adds r7, 0x1 -_08070AEE: - adds r5, 0x1 - cmp r5, 0x1 - bls _08070ACE - movs r1, 0x8C - lsls r1, 1 - adds r0, r6, r1 - ldr r0, [r0] - cmp r0, 0 - bne _08070B34 - cmp r7, 0x2 - bne _08070B34 - subs r1, 0x4 - adds r0, r6, r1 - ldrb r0, [r0] - cmp r0, 0xFF - bne _08070B34 - adds r0, r6, 0 - bl daycare_relationship_score - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - bl Random - lsls r0, 16 - lsrs r0, 16 - movs r1, 0x64 - muls r0, r1 - ldr r1, =0x0000ffff - bl __udivsi3 - cmp r4, r0 - bls _08070B34 - bl TriggerPendingDaycareEgg -_08070B34: - movs r0, 0x8E - lsls r0, 1 - adds r1, r6, r0 - ldrb r0, [r1] - adds r0, 0x1 - strb r0, [r1] - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0xFF - bne _08070BC0 - bl GetEggStepsToSubtract - lsls r0, 24 - lsrs r6, r0, 24 - movs r5, 0 - ldr r0, =gPlayerPartyCount - ldrb r0, [r0] - cmp r5, r0 - bcs _08070BC0 - ldr r4, =gPlayerParty -_08070B5C: - adds r0, r4, 0 - movs r1, 0x2D - bl GetMonData - cmp r0, 0 - beq _08070BB4 - adds r0, r4, 0 - movs r1, 0x4 - bl GetMonData - cmp r0, 0 - bne _08070BB4 - adds r0, r4, 0 - movs r1, 0x20 - bl GetMonData - adds r1, r0, 0 - str r1, [sp] - cmp r0, 0 - beq _08070BA8 - cmp r0, r6 - bcc _08070B98 - subs r0, r6 - b _08070B9A - .pool -_08070B98: - subs r0, r1, 0x1 -_08070B9A: - str r0, [sp] - adds r0, r4, 0 - movs r1, 0x20 - mov r2, sp - bl SetMonData - b _08070BB4 -_08070BA8: - ldr r0, =gSpecialVar_0x8004 - strh r5, [r0] - movs r0, 0x1 - b _08070BC2 - .pool -_08070BB4: - adds r4, 0x64 - adds r5, 0x1 - ldr r0, =gPlayerPartyCount - ldrb r0, [r0] - cmp r5, r0 - bcc _08070B5C -_08070BC0: - movs r0, 0 -_08070BC2: - add sp, 0x4 - pop {r4-r7} - pop {r1} - bx r1 - .pool - thumb_func_end sub_8070AC4 - thumb_func_start sub_8070BD0 sub_8070BD0: @ 8070BD0 push {lr} @@ -145,7 +14,7 @@ sub_8070BD0: @ 8070BD0 ldr r0, [r0] ldr r1, =0x00003030 adds r0, r1 - bl sub_8070AC4 + bl _DoEggActions_CheckHatch lsls r0, 24 lsrs r0, 24 pop {r1} @@ -332,8 +201,8 @@ _08070D46: bx r1 thumb_func_end sub_8070D1C - thumb_func_start daycare_relationship_score -daycare_relationship_score: @ 8070D4C + thumb_func_start GetDaycareCompatibilityScore +GetDaycareCompatibilityScore: @ 8070D4C push {r4-r7,lr} mov r7, r10 mov r6, r9 @@ -481,7 +350,7 @@ _08070E5C: pop {r4-r7} pop {r1} bx r1 - thumb_func_end daycare_relationship_score + thumb_func_end GetDaycareCompatibilityScore thumb_func_start daycare_relationship_score_from_savegame daycare_relationship_score_from_savegame: @ 8070E6C @@ -490,7 +359,7 @@ daycare_relationship_score_from_savegame: @ 8070E6C ldr r0, [r0] ldr r1, =0x00003030 adds r0, r1 - bl daycare_relationship_score + bl GetDaycareCompatibilityScore lsls r0, 24 lsrs r0, 24 pop {r1} diff --git a/include/daycare.h b/include/daycare.h index 101746736c..460b7c1830 100644 --- a/include/daycare.h +++ b/include/daycare.h @@ -1,6 +1,6 @@ -#ifndef GUARD_DAYCARE -#define GUARD_DAYCARE +#ifndef GUARD_DAYCARE_H +#define GUARD_DAYCARE_H #define EGG_HATCH_LEVEL 5 -#endif // GUARD_DAYCARE +#endif // GUARD_DAYCARE_H diff --git a/include/egg_hatch.h b/include/egg_hatch.h new file mode 100644 index 0000000000..862d339474 --- /dev/null +++ b/include/egg_hatch.h @@ -0,0 +1,10 @@ +#ifndef GUARD_EGG_HATCH_H +#define GUARD_EGG_HATCH_H + +void ScriptHatchMon(void); +bool8 sub_8071614(void); +void EggHatch(void); +u8 GetEggStepsToSubtract(void); +u16 sub_80722E0(void); + +#endif // GUARD_EGG_HATCH_H diff --git a/src/daycare.c b/src/daycare.c index e497d4592b..0baee1acc7 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -10,6 +10,7 @@ #include "rng.h" #include "main.h" #include "moves.h" +#include "egg_hatch.h" #define EGG_MOVES_ARRAY_COUNT 10 #define EGG_LVL_UP_MOVES_ARRAY_COUNT 50 @@ -22,6 +23,7 @@ extern u16 ItemIdToBattleMoveId(u16); // this file's functions static void ClearDaycareMonMisc(struct DaycareMiscMon *misc); void SetInitialEggData(struct Pokemon *mon, u16 species, struct DayCare *daycare); +u8 GetDaycareCompatibilityScore(struct DayCare *daycare); // RAM buffers used to assist with BuildEggMoveset() EWRAM_DATA static u16 sHatchedEggLevelUpMoves[EGG_LVL_UP_MOVES_ARRAY_COUNT] = {0}; @@ -818,3 +820,54 @@ void GiveEggFromDaycare(void) { _GiveEggFromDaycare(&gSaveBlock1Ptr->daycare); } + +bool8 _DoEggActions_CheckHatch(struct DayCare *daycare) +{ + u32 i, validEggs = 0; + + for (i = 0; i < DAYCARE_MON_COUNT; i++) + { + if (GetBoxMonData(&daycare->mons[i].mon, MON_DATA_SANITY_BIT2)) + daycare->mons[i].steps++, validEggs++; + } + + // try to trigger poke sex + if (daycare->offspringPersonality == 0 && validEggs == 2 && (daycare->mons[1].steps & 0xFF) == 0xFF) + { + u8 loveScore = GetDaycareCompatibilityScore(daycare); + if (loveScore > (Random() * 100u) / USHRT_MAX) + TriggerPendingDaycareEgg(); + } + + if (++daycare->stepCounter == 255) // hatch an egg + { + u32 steps; + u8 toSub = GetEggStepsToSubtract(); + + for (i = 0; i < gPlayerPartyCount; i++) + { + if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) + continue; + if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_BIT1)) + continue; + + steps = GetMonData(&gPlayerParty[i], MON_DATA_FRIENDSHIP); + if (steps != 0) // subtract needed steps + { + if (steps >= toSub) + steps -= toSub; + else + steps -= 1; + + SetMonData(&gPlayerParty[i], MON_DATA_FRIENDSHIP, &steps); + } + else // hatch the egg + { + gSpecialVar_0x8004 = i; + return TRUE; + } + } + } + + return FALSE; // no hatching +} diff --git a/src/egg_hatch.c b/src/egg_hatch.c index 468138eb1a..8c74ce68d2 100644 --- a/src/egg_hatch.c +++ b/src/egg_hatch.c @@ -1,5 +1,6 @@ #include "global.h" #include "pokemon.h" +#include "egg_hatch.h" #include "pokedex.h" #include "items.h" #include "script.h"