diff --git a/asm/pokemon_3.s b/asm/pokemon_3.s index c625c3bf3..55354d1ca 100644 --- a/asm/pokemon_3.s +++ b/asm/pokemon_3.s @@ -5,448 +5,6 @@ .text - thumb_func_start sub_808F468 -sub_808F468: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x20 - mov r8, r0 - adds r4, r1, 0 - lsls r2, 24 - lsrs r2, 24 - str r2, [sp, 0x14] - movs r0, 0 - strh r0, [r4, 0x4] - movs r0, 0x1 - str r0, [sp, 0x18] - add r7, sp, 0xC -_0808F488: - ldr r1, [sp, 0x18] - lsls r0, r1, 16 - asrs r0, 16 - cmp r0, 0x41 - bne _0808F49C - movs r0, 0x41 - adds r1, r7, 0 - bl GetPokemonEvolveConditions - b _0808F4A2 -_0808F49C: - adds r1, r7, 0 - bl GetPokemonEvolveConditions -_0808F4A2: - ldrh r0, [r7, 0x2] - cmp r0, 0 - beq _0808F4B6 - mov r2, r8 - movs r3, 0x8 - ldrsh r1, [r2, r3] - movs r2, 0 - ldrsh r0, [r7, r2] - cmp r1, r0 - beq _0808F4C2 -_0808F4B6: - ldr r3, [sp, 0x18] - adds r3, 0x1 - str r3, [sp, 0x18] - ldr r0, _0808F4D4 - cmp r3, r0 - ble _0808F488 -_0808F4C2: - movs r0, 0xD4 - lsls r0, 1 - ldr r1, [sp, 0x18] - cmp r1, r0 - bne _0808F4D8 - movs r0, 0x4 - strh r0, [r4, 0x4] - b _0808F6EC - .align 2, 0 -_0808F4D4: .4byte 0x000001a7 -_0808F4D8: - movs r2, 0x1 - str r2, [sp, 0x18] - movs r3, 0x8 - mov r10, r3 -_0808F4E0: - movs r0, 0 - mov r9, r0 - ldr r1, [sp, 0x18] - lsls r0, r1, 16 - asrs r0, 16 - str r0, [sp, 0x1C] - adds r1, r7, 0 - bl GetPokemonEvolveConditions - ldrh r0, [r7, 0x2] - cmp r0, 0 - bne _0808F4FA - b _0808F6DE -_0808F4FA: - mov r2, r8 - movs r3, 0x8 - ldrsh r1, [r2, r3] - movs r2, 0 - ldrsh r0, [r7, r2] - cmp r1, r0 - beq _0808F50A - b _0808F6DE -_0808F50A: - ldr r0, [sp, 0x1C] - bl GetFriendArea - lsls r0, 24 - lsrs r5, r0, 24 - mov r3, r8 - movs r1, 0x8 - ldrsh r0, [r3, r1] - bl GetFriendArea - lsls r0, 24 - lsrs r6, r0, 24 - adds r0, r5, 0 - mov r1, sp - movs r2, 0 - movs r3, 0 - bl sub_8092638 - mov r0, sp - ldrb r0, [r0, 0x4] - cmp r0, 0 - bne _0808F544 - ldrh r0, [r4, 0x4] - movs r1, 0x20 - orrs r0, r1 - strh r0, [r4, 0x4] - movs r2, 0x1 - mov r9, r2 - b _0808F566 -_0808F544: - mov r0, sp - movs r3, 0x2 - ldrsh r1, [r0, r3] - cmp r5, r6 - bne _0808F550 - subs r1, 0x1 -_0808F550: - mov r0, sp - movs r2, 0 - ldrsh r0, [r0, r2] - cmp r0, r1 - bgt _0808F566 - ldrh r0, [r4, 0x4] - movs r1, 0x40 - orrs r0, r1 - strh r0, [r4, 0x4] - movs r3, 0x1 - mov r9, r3 -_0808F566: - ldrh r0, [r7, 0x2] - cmp r0, 0x1 - bne _0808F588 - ldrh r2, [r4, 0x4] - ands r0, r2 - cmp r0, 0 - beq _0808F576 - b _0808F6DE -_0808F576: - mov r0, r8 - ldrb r1, [r0, 0x3] - movs r3, 0x4 - ldrsh r0, [r7, r3] - cmp r1, r0 - bge _0808F5E6 - movs r0, 0x2 - orrs r0, r2 - b _0808F5C8 -_0808F588: - cmp r0, 0x2 - bne _0808F5A8 - mov r2, r8 - movs r3, 0x14 - ldrsh r1, [r2, r3] - movs r2, 0x4 - ldrsh r0, [r7, r2] - cmp r1, r0 - bge _0808F5E6 - ldrh r0, [r4, 0x4] - movs r1, 0x10 - orrs r0, r1 - strh r0, [r4, 0x4] - movs r3, 0x1 - mov r9, r3 - b _0808F5E6 -_0808F5A8: - cmp r0, 0x3 - bne _0808F5E6 - ldr r0, [sp, 0x14] - cmp r0, 0 - beq _0808F5D0 - ldrb r0, [r4] - movs r2, 0x4 - ldrsh r1, [r7, r2] - cmp r0, r1 - beq _0808F5E6 - ldrb r0, [r4, 0x1] - cmp r0, r1 - beq _0808F5E6 - ldrh r0, [r4, 0x4] - mov r3, r10 - orrs r0, r3 -_0808F5C8: - strh r0, [r4, 0x4] - movs r0, 0x1 - mov r9, r0 - b _0808F5E6 -_0808F5D0: - ldrb r0, [r7, 0x4] - bl FindItemInInventory - cmp r0, 0 - bge _0808F5E6 - ldrh r0, [r4, 0x4] - mov r1, r10 - orrs r0, r1 - strh r0, [r4, 0x4] - movs r2, 0x1 - mov r9, r2 -_0808F5E6: - ldrh r0, [r7, 0x6] - cmp r0, 0x4 - bne _0808F604 - ldr r3, [sp, 0x14] - cmp r3, 0 - beq _0808F600 - ldrb r0, [r4] - cmp r0, 0x76 - beq _0808F6CA - ldrb r0, [r4, 0x1] - cmp r0, 0x76 - beq _0808F6CA - b _0808F666 -_0808F600: - movs r0, 0x76 - b _0808F672 -_0808F604: - cmp r0, 0x5 - bne _0808F614 - mov r3, r8 - ldrb r0, [r3, 0x18] - ldrb r1, [r3, 0x1A] - cmp r0, r1 - bhi _0808F6CA - b _0808F6DE -_0808F614: - cmp r0, 0x6 - bne _0808F624 - mov r2, r8 - ldrb r0, [r2, 0x18] - ldrb r3, [r2, 0x1A] - cmp r0, r3 - bcc _0808F6CA - b _0808F6DE -_0808F624: - cmp r0, 0x7 - bne _0808F634 - mov r1, r8 - ldrb r0, [r1, 0x18] - ldrb r2, [r1, 0x1A] - cmp r0, r2 - beq _0808F6CA - b _0808F6DE -_0808F634: - cmp r0, 0x8 - bne _0808F650 - ldr r3, [sp, 0x14] - cmp r3, 0 - beq _0808F64C - ldrb r0, [r4] - cmp r0, 0x30 - beq _0808F6CA - ldrb r0, [r4, 0x1] - cmp r0, 0x30 - beq _0808F6CA - b _0808F666 -_0808F64C: - movs r0, 0x30 - b _0808F672 -_0808F650: - cmp r0, 0x9 - bne _0808F684 - ldr r3, [sp, 0x14] - cmp r3, 0 - beq _0808F670 - ldrb r0, [r4] - cmp r0, 0x31 - beq _0808F6CA - ldrb r0, [r4, 0x1] - cmp r0, 0x31 - beq _0808F6CA -_0808F666: - ldrh r0, [r4, 0x4] - mov r1, r10 - orrs r0, r1 - strh r0, [r4, 0x4] - b _0808F6DE -_0808F670: - movs r0, 0x31 -_0808F672: - bl FindItemInInventory - cmp r0, 0 - bge _0808F6CA - ldrh r0, [r4, 0x4] - mov r2, r10 - orrs r0, r2 - strh r0, [r4, 0x4] - b _0808F6DE -_0808F684: - cmp r0, 0xB - bne _0808F694 - ldrb r1, [r4, 0x2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _0808F6CA - b _0808F6DE -_0808F694: - cmp r0, 0xC - bne _0808F6A4 - ldrb r1, [r4, 0x2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _0808F6CA - b _0808F6DE -_0808F6A4: - cmp r0, 0xA - bne _0808F6CA - ldr r3, [sp, 0x14] - cmp r3, 0 - beq _0808F6BC - ldrb r0, [r4] - cmp r0, 0x2F - beq _0808F6CA - ldrb r0, [r4, 0x1] - cmp r0, 0x2F - beq _0808F6CA - b _0808F6DE -_0808F6BC: - movs r0, 0x2F - bl FindItemInInventory - cmp r0, 0 - bge _0808F6CA - movs r0, 0x1 - mov r9, r0 -_0808F6CA: - mov r1, r9 - cmp r1, 0 - bne _0808F6DE - ldrh r0, [r4, 0x4] - movs r1, 0x1 - orrs r0, r1 - strh r0, [r4, 0x4] - mov r2, sp - ldrh r2, [r2, 0x1C] - strh r2, [r4, 0x6] -_0808F6DE: - ldr r3, [sp, 0x18] - adds r3, 0x1 - str r3, [sp, 0x18] - ldr r0, _0808F6FC - cmp r3, r0 - bgt _0808F6EC - b _0808F4E0 -_0808F6EC: - add sp, 0x20 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0808F6FC: .4byte 0x000001a7 - thumb_func_end sub_808F468 - - thumb_func_start sub_808F700 -sub_808F700: - push {r4,lr} - sub sp, 0x8 - mov r4, sp - mov r1, sp - movs r2, 0 - bl sub_808F468 - ldrh r1, [r4, 0x4] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _0808F71C - movs r0, 0x1 - b _0808F72A -_0808F71C: - movs r0, 0x4 - ands r0, r1 - cmp r0, 0 - bne _0808F728 - movs r0, 0 - b _0808F72A -_0808F728: - movs r0, 0x2 -_0808F72A: - add sp, 0x8 - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_808F700 - - thumb_func_start sub_808F734 -sub_808F734: - push {r4-r7,lr} - sub sp, 0x58 - adds r5, r0, 0 - lsls r4, r1, 16 - asrs r4, 16 - movs r6, 0 - mov r0, sp - adds r1, r5, 0 - movs r2, 0x58 - bl memcpy - adds r0, r5, 0 - adds r1, r4, 0 - bl sub_808F798 - adds r7, r0, 0 - movs r0, 0x9E - lsls r0, 1 - cmp r4, r0 - bne _0808F782 - mov r0, sp - strb r6, [r0, 0x2] - add r0, sp, 0x28 - strb r6, [r0] - add r4, sp, 0x4C - ldr r5, _0808F794 - adds r0, r5, 0 - bl GetMonSpecies - adds r1, r0, 0 - adds r0, r4, 0 - movs r2, 0xA - bl BoundedCopyStringtoBuffer - mov r0, sp - adds r1, r5, 0 - bl sub_808F798 - adds r6, r0, 0 -_0808F782: - cmp r6, 0 - beq _0808F78A - bl sub_8097848 -_0808F78A: - adds r0, r7, 0 - add sp, 0x58 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_0808F794: .4byte 0x0000013d - thumb_func_end sub_808F734 - thumb_func_start sub_808F798 sub_808F798: push {r4-r6,lr} diff --git a/include/constants/evolution_status.h b/include/constants/evolution_status.h new file mode 100644 index 000000000..103c01e86 --- /dev/null +++ b/include/constants/evolution_status.h @@ -0,0 +1,13 @@ +#ifndef GUARD_CONSTANTS_EVOLUTION_STATUS_H +#define GUARD_CONSTANTS_EVOLUTION_STATUS_H + + +#define EVOLUTION_GOOD 1 +#define EVOLUTION_LACK_LEVEL 1 << 1 +#define EVOLUTION_NO_MORE 1 << 2 +#define EVOLUTION_LACK_ITEM 1 << 3 +#define EVOLUTION_LACK_IQ 1 << 4 +#define EVOLUTION_LACK_FRIEND_AREA 1 << 5 +#define EVOLUTION_LACK_ROOM 1 << 6 + +#endif // GUARD_CONSTANTS_EVOLUTION_STATUS_H diff --git a/include/luminous_cave.h b/include/luminous_cave.h new file mode 100644 index 000000000..7e3a5a7ee --- /dev/null +++ b/include/luminous_cave.h @@ -0,0 +1,36 @@ +#ifndef GUARD_LUMINOUS_CAVE_H +#define GUARD_LUMINOUS_CAVE_H + +#include "menu.h" +#include "text.h" + +struct unkStruct_203B2B0 +{ + // size: 0x174 + bool8 evolutionComplete; + struct EvolveStatus evolveStatus; + struct PokemonStruct *pokeStruct; + /* 0x10 */ bool8 pokeRenamed; + /* 0x14 */ u32 evoItem1_InvIndex; // inventory index of item + /* 0x18 */ u32 evoItem2_InvIndex; // inventory index of item + struct Item chosenItem; + u32 state; + u32 fallbackState; + u32 menuAction1; + u32 menuAction2; + u32 menuAction3; + struct MenuItem unk34[8]; + u16 unk74[0x8]; + struct MenuStruct unk84; + u8 fillD4[0x104 - 0xD4]; + struct OpenedFile *unk104; + u8 *unk108; + u16 unk10C; + u16 unk10E; + u8 unk110; + u8 unk111; + u8 unk112; + struct UnkTextStruct2 unk114[4]; +}; + +#endif // GUARD_LUMINOUS_CAVE_H diff --git a/include/pokemon.h b/include/pokemon.h index 408752444..b27c6f1a4 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -104,13 +104,13 @@ struct unkStruct_203B45C struct PreEvolution { /* 0x0 */ s16 evolveFrom; - /* 0x2 */ s16 evolveType; + /* 0x2 */ u16 evolveType; }; // size: 0x4 struct EvolutionRequirements { - /* 0x0 */ u16 mainRequirement; + /* 0x0 */ s16 mainRequirement; /* 0x2 */ u16 additionalRequirement; }; diff --git a/include/pokemon_3.h b/include/pokemon_3.h index 87f7cc7ec..76fc1295e 100644 --- a/include/pokemon_3.h +++ b/include/pokemon_3.h @@ -1,10 +1,21 @@ #ifndef GUARD_POKEMON_3_H #define GUARD_POKEMON_3_H +struct EvolveStatus +{ + u8 evoItem1; + u8 evoItem2; + u8 unk6; + u16 evolutionConditionStatus; + s16 targetEvolveSpecies; +}; + s16 GetBaseSpeciesNoUnown(s16 index); bool8 TacticsTargetLeader(u8 tactic); bool8 HasIQForSkill(s32 pokeIQ, u8 IQSkillIndex); void SetIQSkill(u8 *param_1, u32 skillIndex); bool8 IsIQSkillSet(u8 *IQSkillFlags, u32 IQSkill); +void sub_808F468(struct PokemonStruct *param_1, struct EvolveStatus *evolveStatus, u8 param_3); +u32 sub_808F734(struct PokemonStruct *pokemon, s16 _species); #endif diff --git a/src/dungeon_ai_leader.c b/src/dungeon_ai_leader.c index 581905f4b..feb07657b 100644 --- a/src/dungeon_ai_leader.c +++ b/src/dungeon_ai_leader.c @@ -6,6 +6,7 @@ #include "dungeon_ai_targeting.h" #include "dungeon_leader.h" #include "dungeon_visibility.h" +#include "pokemon.h" #include "pokemon_3.h" bool8 TargetLeader(struct Entity *pokemon) diff --git a/src/luminous_cave.c b/src/luminous_cave.c index be176eadc..2ed6da597 100644 --- a/src/luminous_cave.c +++ b/src/luminous_cave.c @@ -1,9 +1,12 @@ #include "global.h" #include "constants/bg_music.h" #include "constants/colors.h" +#include "constants/evolution_status.h" +#include "input.h" #include "item.h" #include "memory.h" #include "pokemon.h" +#include "pokemon_3.h" #include "random.h" #include "text1.h" #include "text2.h" @@ -15,40 +18,7 @@ #include "code_8012A18_1.h" #include "code_801B3C0.h" #include "code_80118A4.h" - -struct unkStruct_203B2B0 -{ - // size: 0x174 - bool8 evolutionComplete; - u8 fill1[0x3]; - u8 evoItem1_itemIndex; - u8 evoItem2_ItemIndex; - u8 unk6; - u16 evolutionConditionStatus; - /* 0xA */ s16 targetSpecies; // species # of the evolved pokemon (what we are evolving to) - struct PokemonStruct *pokeStruct; - /* 0x10 */ bool8 pokeRenamed; - /* 0x14 */ u32 evoItem1_InvIndex; // inventory index of item - /* 0x18 */ u32 evoItem2_InvIndex; // inventory index of item - struct Item chosenItem; - u32 state; - u32 fallbackState; - u32 menuAction1; - u32 menuAction2; - u32 menuAction3; - struct MenuItem unk34[8]; - u16 unk74[0x8]; - struct MenuStruct unk84; - u8 fillD4[0x104 - 0xD4]; - struct OpenedFile *unk104; - u8 *unk108; - u16 unk10C; - u16 unk10E; - u8 unk110; - u8 unk111; - u8 unk112; - struct UnkTextStruct2 unk114[4]; -}; +#include "luminous_cave.h" EWRAM_DATA_2 struct unkStruct_203B2B0 *gUnknown_203B2B0 = {0}; extern struct UnkTextStruct2 gUnknown_80DCA00; @@ -195,10 +165,10 @@ extern void nullsub_104(); void sub_8024DBC(void); void sub_8024E30(void); void sub_801AEE4(u32, u32); -void sub_808F734(struct PokemonStruct *, s16); +u32 sub_801602C(u32 r0, u8 *name); +extern s32 sub_80144A4(s32 *); +extern s32 sub_801A8AC(void); extern void sub_8099690(u32); -extern void sub_808F468(struct PokemonStruct *, u8 *, u32); - bool8 LuminousCave_HasOnly1Member(void); enum @@ -226,17 +196,6 @@ enum LUMINOUS_CAVE_CANT_EVOLVE_YET = 0x1D, }; -enum evolutionStatus -{ - EVOLUTION_GOOD = 1, - EVOLUTION_LACK_LEVEL = 1 << 1, - EVOLUTION_NO_MORE = 1 << 2, - EVOLUTION_LACK_ITEM = 1 << 3, - EVOLUTION_LACK_IQ = 1 << 4, - EVOLUTION_LACK_FRIEND_AREA = 1 << 5, - EVOLUTION_LACK_ROOM = 1 << 6, -}; - u32 sub_802465C(void) { struct OpenedFile *faceFile; @@ -436,19 +395,19 @@ void UpdateLuminousCaveDialogue(void) case LUMINOUS_CAVE_LET_US_BEGIN: sub_8025254(); - if((gUnknown_203B2B0->evolutionConditionStatus & EVOLUTION_GOOD)) + if((gUnknown_203B2B0->evolveStatus.evolutionConditionStatus & EVOLUTION_GOOD)) gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_CHANGED_APPEARANCE; - else if(gUnknown_203B2B0->evolutionConditionStatus == EVOLUTION_NO_MORE) + else if(gUnknown_203B2B0->evolveStatus.evolutionConditionStatus == EVOLUTION_NO_MORE) gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_CANT_EVOLVE_ANYMORE; - else if(gUnknown_203B2B0->evolutionConditionStatus == EVOLUTION_LACK_LEVEL) + else if(gUnknown_203B2B0->evolveStatus.evolutionConditionStatus == EVOLUTION_LACK_LEVEL) gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_LACK_LEVEL; - else if(gUnknown_203B2B0->evolutionConditionStatus == EVOLUTION_LACK_IQ) + else if(gUnknown_203B2B0->evolveStatus.evolutionConditionStatus == EVOLUTION_LACK_IQ) gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_LACK_IQ; - else if(gUnknown_203B2B0->evolutionConditionStatus == EVOLUTION_LACK_FRIEND_AREA) + else if(gUnknown_203B2B0->evolveStatus.evolutionConditionStatus == EVOLUTION_LACK_FRIEND_AREA) gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_LACK_FRIEND_AREA; - else if(gUnknown_203B2B0->evolutionConditionStatus == EVOLUTION_LACK_ROOM) + else if(gUnknown_203B2B0->evolveStatus.evolutionConditionStatus == EVOLUTION_LACK_ROOM) gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_LACK_ROOM; - else if(gUnknown_203B2B0->evolutionConditionStatus == EVOLUTION_LACK_ITEM) + else if(gUnknown_203B2B0->evolveStatus.evolutionConditionStatus == EVOLUTION_LACK_ITEM) gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_LACK_ITEM; else gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_CANT_EVOLVE_YET; @@ -464,11 +423,11 @@ void UpdateLuminousCaveDialogue(void) case LUMINOUS_CAVE_EVOLVED: monName = GetMonSpecies(gUnknown_203B2B0->pokeStruct->speciesNum); strcpy(gAvailablePokemonNames,monName); - monName = GetMonSpecies(gUnknown_203B2B0->targetSpecies); + monName = GetMonSpecies(gUnknown_203B2B0->evolveStatus.targetEvolveSpecies); strcpy(gAvailablePokemonNames + 0x50,monName); gUnknown_203B2B0->evolutionComplete = TRUE; sub_80977D0(); - sub_808F734(gUnknown_203B2B0->pokeStruct,gUnknown_203B2B0->targetSpecies); + sub_808F734(gUnknown_203B2B0->pokeStruct,gUnknown_203B2B0->evolveStatus.targetEvolveSpecies); nullsub_104(); gUnknown_203B2B0->pokeStruct = GetPlayerPokemonStruct(); if (gUnknown_203B2B0->evoItem1_InvIndex != INVENTORY_SIZE) { @@ -874,20 +833,20 @@ void LuminousCave_AdvancetoFallbackState(void) void sub_8025254(void) { if(gUnknown_203B2B0->evoItem1_InvIndex == INVENTORY_SIZE) - gUnknown_203B2B0->evoItem1_itemIndex = 0; + gUnknown_203B2B0->evolveStatus.evoItem1 = 0; else { - gUnknown_203B2B0->evoItem1_itemIndex = gTeamInventoryRef->teamItems[gUnknown_203B2B0->evoItem1_InvIndex].id; + gUnknown_203B2B0->evolveStatus.evoItem1 = gTeamInventoryRef->teamItems[gUnknown_203B2B0->evoItem1_InvIndex].id; } if(gUnknown_203B2B0->evoItem2_InvIndex == INVENTORY_SIZE) - gUnknown_203B2B0->evoItem2_ItemIndex = 0; + gUnknown_203B2B0->evolveStatus.evoItem2 = 0; else { - gUnknown_203B2B0->evoItem2_ItemIndex = gTeamInventoryRef->teamItems[gUnknown_203B2B0->evoItem2_InvIndex].id; + gUnknown_203B2B0->evolveStatus.evoItem2 = gTeamInventoryRef->teamItems[gUnknown_203B2B0->evoItem2_InvIndex].id; } - gUnknown_203B2B0->unk6 = RandInt(0xFF); - sub_808F468(gUnknown_203B2B0->pokeStruct, &gUnknown_203B2B0->evoItem1_itemIndex, 1); + gUnknown_203B2B0->evolveStatus.unk6 = RandInt(0xFF); + sub_808F468(gUnknown_203B2B0->pokeStruct, &gUnknown_203B2B0->evolveStatus, 1); } bool8 LuminousCave_HasOnly1Member(void) diff --git a/src/pokemon_1.c b/src/pokemon_1.c new file mode 100644 index 000000000..ff10f023d --- /dev/null +++ b/src/pokemon_1.c @@ -0,0 +1,75 @@ +#include "global.h" +#include "pokemon.h" + +extern struct MonsterDataEntry *gMonsterParameters; +extern bool8 *gFriendAreas; +void SetDefaultIQSkills(u8 *param_1, bool8 enableSelfCurer); +void sub_808E490(struct Move* a1, s32 species); +void BoundedCopyStringtoBuffer(u8 *, u8 *, u32); +void sub_80980B4(s32); +u8 sub_80923D4(s32); + +#define DUNGEON_JOIN_LOCATION_LEADER 64 +#define DUNGEON_JOIN_LOCATION_PARTNER 65 + + void sub_808CE74(s16 _species, bool8 _isLeader, u8* name) + { + struct PokemonStruct pokemon; + struct PokemonStruct *temp; + u8 name_buffer[20]; + u32 friendArea; + s32 i; + s32 species = _species; + bool32 isLeader = _isLeader << 24; + + pokemon.unk0 = 3; + if (isLeader) { + pokemon.isTeamLeader = TRUE; + pokemon.dungeonLocation.id = DUNGEON_JOIN_LOCATION_LEADER; + } + else { + pokemon.isTeamLeader = FALSE; + pokemon.dungeonLocation.id = DUNGEON_JOIN_LOCATION_PARTNER; + } + pokemon.unkHasNextStage = 1; + pokemon.pokeHP = GetBaseHP(species); + pokemon.offense.att[0] = GetBaseOffensiveStat(species, 0); + pokemon.offense.att[1] = GetBaseOffensiveStat(species, 1); + pokemon.offense.def[0] = GetBaseDefensiveStat(species, 0); + pokemon.offense.def[1] = GetBaseDefensiveStat(species, 1); + pokemon.IQ = 1; + pokemon.unkC[0].unk0 = 0; + pokemon.unkC[1].unk0 = 0; + SetDefaultIQSkills((u8*)&pokemon.IQSkills, FALSE); + pokemon.speciesNum = species; + pokemon.heldItem.id = ITEM_NOTHING; + pokemon.heldItem.quantity = 0; + pokemon.unk1C = 0; + pokemon.unk24 = 0; + pokemon.dungeonLocation.floor = 0; + sub_808E490(pokemon.moves, species); + + if (name == NULL) { + CopyMonsterNametoBuffer(name_buffer, species); + BoundedCopyStringtoBuffer(pokemon.name, name_buffer, POKEMON_NAME_LENGTH); + } + else { + s32 j; + for (j = 0; j < POKEMON_NAME_LENGTH; j++) { + pokemon.name[j] = name[j]; + } + } + friendArea = gMonsterParameters[species].friendArea; + for (i = 0; i < NUM_MONSTERS; i++) { + temp = &gRecruitedPokemonRef->pokemon[i]; + if (!((u8)gRecruitedPokemonRef->pokemon[i].unk0 & 1)) { + u8 speciesFriendArea = sub_80923D4(i); + if (speciesFriendArea == friendArea) { + gRecruitedPokemonRef->pokemon[i] = pokemon; + gFriendAreas[speciesFriendArea] = TRUE; + sub_80980B4(species); + break; + } + } + } + } diff --git a/src/pokemon_3.c b/src/pokemon_3.c index 929ce3495..133eca18e 100644 --- a/src/pokemon_3.c +++ b/src/pokemon_3.c @@ -1,11 +1,16 @@ #include "global.h" -#include "pokemon_3.h" #include "pokemon.h" +#include "pokemon_3.h" #include "random.h" +#include "constants/evolve_type.h" +#include "constants/evolution_status.h" #include "constants/iq_skill.h" #include "constants/tactic.h" #include "sprite.h" +#include "text_util.h" +#include "friend_area.h" +#include "luminous_cave.h" extern u8 *gIQSkillNames[]; extern u32 gIQSkillDescriptions[]; @@ -53,7 +58,11 @@ extern void sub_808F448(struct unkStruct_8094924*, struct unkStruct_808E6F4*); extern void sub_80941FC(struct unkStruct_8094924*, void*); extern void sub_809447C(struct unkStruct_8094924*, void*); extern void sub_808F428(struct unkStruct_8094924*, struct unkStruct_808E6F4*); +s16 GetPokemonEvolveConditions(s16 index, struct unkEvolve *r1); +void sub_8092638(u8 friendArea, struct unkStruct_8092638 *param_2, u8 param_3, u8 param_4); +u32 sub_808F798(struct PokemonStruct *, s16); +void sub_8097848(void); bool8 sub_808E668(s16 species, s16* a2, s16* a3) { @@ -903,3 +912,210 @@ void sub_808F448(struct unkStruct_8094924* a1, struct unkStruct_808E6F4* a2) SaveIntegerBits(a1, &a2->unk0, 10); SaveIntegerBits(a1, &a2->unk2, 5); } + +void sub_808F468(struct PokemonStruct *param_1, struct EvolveStatus *evolveStatus, u8 param_3) +{ + bool8 evolFlag; + u8 friendArea; + u8 uVar2; + s32 numPokemon; + struct unkStruct_8092638 local_40; // sp 0x0 + struct unkEvolve evolveConditions; // r7 + s32 index, index2; +#ifndef NONMATCHING + register s32 defaultReason asm("sl"); +#else + s32 defaultReason; +#endif + + evolveStatus->evolutionConditionStatus = 0; + for(index = MONSTER_BULBASAUR; index < 0x1A8; index++) + { + if ((s16)index == MONSTER_ALAKAZAM) { + GetPokemonEvolveConditions(MONSTER_ALAKAZAM, &evolveConditions); + } + else { + GetPokemonEvolveConditions(index, &evolveConditions); + } + if(((evolveConditions.preEvolution.evolveType != EVOLVE_TYPE_NONE) && (param_1->speciesNum == evolveConditions.preEvolution.evolveFrom))) + break; + }; + if (index == 0x1a8) { + evolveStatus->evolutionConditionStatus = EVOLUTION_NO_MORE; + } + else { + for(index = MONSTER_BULBASAUR, defaultReason = EVOLUTION_LACK_ITEM; index < 0x1A8; index++) + { + evolFlag = FALSE; + index2 = (s16)index; + GetPokemonEvolveConditions(index2, &evolveConditions); + if ((evolveConditions.preEvolution.evolveType == EVOLVE_TYPE_NONE) || (param_1->speciesNum != evolveConditions.preEvolution.evolveFrom)) continue; + friendArea = ((u8 (*)(s32))GetFriendArea)(index2); // UB + uVar2 = GetFriendArea(param_1->speciesNum); + sub_8092638(friendArea,&local_40,0,0); + if (!local_40.hasFriendArea) { + evolveStatus->evolutionConditionStatus |= EVOLUTION_LACK_FRIEND_AREA; + evolFlag = TRUE; + } + else { + numPokemon = local_40.unk2; + if (friendArea == uVar2) { + numPokemon--; + } + if (local_40.numPokemon <= numPokemon) { + evolveStatus->evolutionConditionStatus |= EVOLUTION_LACK_ROOM; + evolFlag = TRUE; + } + } + if (evolveConditions.preEvolution.evolveType == EVOLVE_TYPE_LEVEL) { + if ((evolveStatus->evolutionConditionStatus & EVOLUTION_GOOD)) continue; + if (param_1->unkHasNextStage < evolveConditions.evolutionRequirements.mainRequirement) { + evolveStatus->evolutionConditionStatus |= EVOLUTION_LACK_LEVEL; + evolFlag = TRUE; + } + } + else if (evolveConditions.preEvolution.evolveType == EVOLVE_TYPE_IQ) { + if (param_1->IQ < evolveConditions.evolutionRequirements.mainRequirement) { + evolveStatus->evolutionConditionStatus |= EVOLUTION_LACK_IQ; + evolFlag = TRUE; + } + } + else if (evolveConditions.preEvolution.evolveType == EVOLVE_TYPE_ITEM) { + if (param_3 != 0) { + if ((evolveStatus->evoItem1 != evolveConditions.evolutionRequirements.mainRequirement) && + (evolveStatus->evoItem2 != evolveConditions.evolutionRequirements.mainRequirement)) { + evolveStatus->evolutionConditionStatus |= defaultReason; + evolFlag = TRUE; + } + } + else + { + if (FindItemInInventory(evolveConditions.evolutionRequirements.mainRequirement) < 0) { + evolveStatus->evolutionConditionStatus |= defaultReason; + evolFlag = TRUE; + } + } + } + if (evolveConditions.evolutionRequirements.additionalRequirement == 4) { + if (param_3 != 0) { + if ((evolveStatus->evoItem1 != ITEM_LINK_CABLE) && (evolveStatus->evoItem2 != ITEM_LINK_CABLE)) + { + evolveStatus->evolutionConditionStatus |= defaultReason; + continue; + } + } + else + { + if (-1 < FindItemInInventory(ITEM_LINK_CABLE)) goto _0808F6CA; + evolveStatus->evolutionConditionStatus |= defaultReason; + continue; + } + } + else if (evolveConditions.evolutionRequirements.additionalRequirement == 5) { + if ((param_1->offense).att[0] > (param_1->offense).def[0]) goto _0808F6CA; + else continue; + } + else if (evolveConditions.evolutionRequirements.additionalRequirement == 6) { + if ((param_1->offense).att[0] < (param_1->offense).def[0]) goto _0808F6CA; + else continue; + } + else if (evolveConditions.evolutionRequirements.additionalRequirement == 7) { + if ((param_1->offense).att[0] == (param_1->offense).def[0]) goto _0808F6CA; + else continue; + } + else if (evolveConditions.evolutionRequirements.additionalRequirement == 8) + { + if (param_3 != 0) { + if ((evolveStatus->evoItem1 != ITEM_SUN_RIBBON) && (evolveStatus->evoItem2 != ITEM_SUN_RIBBON)) + { + evolveStatus->evolutionConditionStatus |= defaultReason; + continue; + } + else goto _0808F6CA; + } + else { + if (-1 < FindItemInInventory(ITEM_SUN_RIBBON)) goto _0808F6CA; + evolveStatus->evolutionConditionStatus |= defaultReason; + continue; + } + } + else if (evolveConditions.evolutionRequirements.additionalRequirement == 9) { + if (param_3 != 0) { + if ((evolveStatus->evoItem1 != ITEM_LUNAR_RIBBON) && (evolveStatus->evoItem2 != ITEM_LUNAR_RIBBON)) + { + evolveStatus->evolutionConditionStatus |= defaultReason; + continue; + } + else goto _0808F6CA; + } + else + { + if (-1 < FindItemInInventory(ITEM_LUNAR_RIBBON)) goto _0808F6CA; + evolveStatus->evolutionConditionStatus |= defaultReason; + continue; + } + } + else if (evolveConditions.evolutionRequirements.additionalRequirement == 0xb) { + if ((evolveStatus->unk6 & 1) == 0) goto _0808F6CA; + else continue; + } + else if (evolveConditions.evolutionRequirements.additionalRequirement == 0xc) { + if ((evolveStatus->unk6 & 1)) goto _0808F6CA; + else continue; + } + else if (evolveConditions.evolutionRequirements.additionalRequirement == 10) { + if (param_3 != 0) { + if ((evolveStatus->evoItem1 == ITEM_BEAUTY_SCARF) || (evolveStatus->evoItem2 == ITEM_BEAUTY_SCARF)) goto _0808F6CA; + else continue; + } + else + { + if ( FindItemInInventory(ITEM_BEAUTY_SCARF) < 0) evolFlag = TRUE; + } + } + _0808F6CA: + if (!evolFlag) { + evolveStatus->evolutionConditionStatus |= EVOLUTION_GOOD; + evolveStatus->targetEvolveSpecies = index2; + } + } + } +} + +u8 sub_808F700(struct PokemonStruct *pokemon) +{ + struct EvolveStatus evolveStatus; + + sub_808F468(pokemon, &evolveStatus, 0); + if ((evolveStatus.evolutionConditionStatus & EVOLUTION_GOOD)) { + return 1; + } + else if ((evolveStatus.evolutionConditionStatus & EVOLUTION_NO_MORE)) { + return 2; + } + else { + return 0; + } +} + +u32 sub_808F734(struct PokemonStruct *pokemon, s16 _species) +{ + u32 uVar1; + int iVar3; + struct PokemonStruct pokeStruct; + s32 species = _species; + + iVar3 = 0; + pokeStruct = *pokemon; + uVar1 = sub_808F798(pokemon, species); + if (species == MONSTER_NINJASK) { + pokeStruct.isTeamLeader = FALSE; + pokeStruct.heldItem.id = ITEM_NOTHING; + BoundedCopyStringtoBuffer(pokeStruct.name, GetMonSpecies(MONSTER_SHEDINJA),POKEMON_NAME_LENGTH); + iVar3 = sub_808F798(&pokeStruct,MONSTER_SHEDINJA); + } + if (iVar3 != 0) { + sub_8097848(); + } + return uVar1; +}