decomp some more pokemon_3 thanks to jiang

This commit is contained in:
Seth Barberee
2023-08-04 14:34:06 -07:00
parent a6754cbae8
commit 23c23f5d33
9 changed files with 377 additions and 508 deletions

View File

@@ -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}

View File

@@ -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

36
include/luminous_cave.h Normal file
View File

@@ -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

View File

@@ -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;
};

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

75
src/pokemon_1.c Normal file
View File

@@ -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;
}
}
}
}

View File

@@ -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;
}