mirror of
https://github.com/pret/pmd-red.git
synced 2026-08-28 11:44:30 -05:00
decomp some more pokemon_3 thanks to jiang
This commit is contained in:
442
asm/pokemon_3.s
442
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}
|
||||
|
||||
13
include/constants/evolution_status.h
Normal file
13
include/constants/evolution_status.h
Normal 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
36
include/luminous_cave.h
Normal 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
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
75
src/pokemon_1.c
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
218
src/pokemon_3.c
218
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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user