more documentation of pokemonStruct based on other decomp func tries

This commit is contained in:
Seth Barberee 2023-08-04 15:59:55 -07:00
parent 23c23f5d33
commit 4f21cb26ea
7 changed files with 113 additions and 188 deletions

View File

@ -20,7 +20,7 @@ struct Offense
// size: 0x4
struct unkPokeSubStruct_C
{
u8 unk0;
u8 level;
u8 fill1[3];
};
@ -29,17 +29,16 @@ struct PokemonStruct
{
u16 unk0; // recruited??
/* 0x2 */ bool8 isTeamLeader;
/* 0x3 */ u8 unkHasNextStage; // set to a random value?
/* 0x3 */ u8 level;
/* 0x4 */ struct DungeonLocation dungeonLocation;
/* 0x8 */ s16 speciesNum; // species #
struct unkPokeSubStruct_C unkC[2];
/* 0x14 */ s16 IQ;
/* 0x16 */ u16 pokeHP;
/* 0x18 */ struct Offense offense;
u32 unk1C;
/* 0x1C */ u32 currExp;
/* 0x20 */ u32 IQSkills;
u8 unk24;
u8 fill25[3];
/* 0x24 */ u8 tacticIndex;
/* 0x28 */ struct BulkItem heldItem;
/* 0x2C */ struct Move moves[MAX_MON_MOVES];
/* 0x4C */ u8 name[POKEMON_NAME_LENGTH];
@ -56,7 +55,7 @@ struct unkStruct_808E6F4
struct EvolveStage
{
/* 0x0 */ s16 speciesNum;
/* 0x2 */ u8 unkHasNextStage;
/* 0x2 */ u8 level;
};
// size: 0x24
@ -70,24 +69,23 @@ struct unkStruct_8094184
struct PokemonStruct2
{
u16 unk0; // corresponds to unk0 in PokemonStruct
/* 0x2 */ bool8 isTeamLeader; // unk2
/* 0x3 */ u8 unkHasNextStage; // unk3
/* 0x4 */ struct DungeonLocation dungeonLocation; // unk4
/* 0x8 */ u16 IQ; // IQ (other offset)
/* 0x2 */ bool8 isTeamLeader;
/* 0x3 */ u8 level;
/* 0x4 */ struct DungeonLocation dungeonLocation;
/* 0x8 */ u16 IQ;
s16 unkA;
u16 unkC;
/* 0xE */ s16 speciesNum; // speciesNum (other offset)
/* 0xE */ s16 speciesNum;
u16 unk10; // pokeHP
u16 unk12; // pokeHP
/* 0x14 */ struct Offense offense; // offense (other offset)
u32 unk18; // unk1C
/* 0x18 */ u32 currExp;
/* 0x1C */ struct unkStruct_8094184 moves;
/* 0x40 */ struct Item itemSlot; // heldItem
u32 unk44; // some struct
u32 unk48; // some struct (same type as 44)
/* 0x4C */ u32 IQSkills; // unk20
u8 unk50; // unk24
u8 fill51[3];
/* 0x50 */ u8 tacticIndex;
struct unkStruct_808E6F4 unk54;
/* 0x58 */ u8 name[POKEMON_NAME_LENGTH]; // name (other offset)
};

View File

@ -346,7 +346,7 @@ u32 sub_80954CC(u8 *a, u32 b)
memset(temp, 0, sizeof(struct PokemonStruct));
RestoreIntegerBits(&backup, &temp->unk0, 2);
RestoreIntegerBits(&backup, &temp->isTeamLeader, 1);
RestoreIntegerBits(&backup, &temp->unkHasNextStage, 7);
RestoreIntegerBits(&backup, &temp->level, 7);
RestoreDungeonLocation(&backup, &temp->dungeonLocation);
RestoreIntegerBits(&backup, &temp->speciesNum, 9);
xxx_restore_poke_sub_c_808F410(&backup, &temp->unkC[0]);
@ -357,9 +357,9 @@ u32 sub_80954CC(u8 *a, u32 b)
RestoreIntegerBits(&backup, &temp->offense.att[1], 8);
RestoreIntegerBits(&backup, &temp->offense.def[0], 8);
RestoreIntegerBits(&backup, &temp->offense.def[1], 8);
RestoreIntegerBits(&backup, &temp->unk1C, 0x18);
RestoreIntegerBits(&backup, &temp->currExp, 0x18);
RestoreIntegerBits(&backup, &temp->IQSkills, 0x18);
RestoreIntegerBits(&backup, &temp->unk24, 4);
RestoreIntegerBits(&backup, &temp->tacticIndex, 4);
RestoreHeldItem(&backup, &temp->heldItem);
RestorePokemonMoves(&backup, temp->moves);
RestoreIntegerBits(&backup, temp->name, 0x50);
@ -388,7 +388,7 @@ u32 sub_8095624(u8 *a, u32 b)
temp = &gUnknown_203B484->unk4;
SaveIntegerBits(&backup, &temp->unk0, 2);
SaveIntegerBits(&backup, &temp->isTeamLeader, 1);
SaveIntegerBits(&backup, &temp->unkHasNextStage, 7);
SaveIntegerBits(&backup, &temp->level, 7);
SaveDungeonLocation(&backup, &temp->dungeonLocation);
SaveIntegerBits(&backup, &temp->speciesNum, 9);
xxx_save_poke_sub_c_808F41C(&backup, &temp->unkC[0]);
@ -399,9 +399,9 @@ u32 sub_8095624(u8 *a, u32 b)
SaveIntegerBits(&backup, &temp->offense.att[1], 8);
SaveIntegerBits(&backup, &temp->offense.def[0], 8);
SaveIntegerBits(&backup, &temp->offense.def[1], 8);
SaveIntegerBits(&backup, &temp->unk1C, 0x18);
SaveIntegerBits(&backup, &temp->currExp, 0x18);
SaveIntegerBits(&backup, &temp->IQSkills, 0x18);
SaveIntegerBits(&backup, &temp->unk24, 4);
SaveIntegerBits(&backup, &temp->tacticIndex, 4);
SaveHeldItem(&backup, &temp->heldItem);
SavePokemonMoves(&backup, temp->moves);
SaveIntegerBits(&backup, temp->name, 0x50);

View File

@ -146,7 +146,7 @@ void sub_803AD88(void)
sUnknown_203B3F8->unk70 = 3;
sUnknown_203B3F8->unk68 = 1;
sUnknown_203B3F8->unk6C = 100;
sUnknown_203B3F8->unk64 = sUnknown_203B3F8->pokemon->unkHasNextStage;
sUnknown_203B3F8->unk64 = sUnknown_203B3F8->pokemon->level;
sUnknown_203B3F8->unk74 = 3;
sUnknown_203B3F8->unk78 = &sUnknown_203B3F8->unkE0[3];
sUnknown_203B3F8->unk7C = 44;
@ -256,7 +256,7 @@ void sub_803AFE8(void)
default:
break;
case 3:
sUnknown_203B3F8->pokemon->unkHasNextStage = sUnknown_203B3F8->unk60;
sUnknown_203B3F8->pokemon->level = sUnknown_203B3F8->unk60;
// Fallthrough is needed to match
case 2:
sub_803ACD0(2);
@ -276,4 +276,4 @@ void sub_803B034(void)
sub_803ACD0(2);
break;
}
}
}

View File

@ -47,63 +47,65 @@ void InitializeRecruitedPokemon(void)
}
}
// void sub_808CE74(s32 _species, u8 a2, u8* a3)
// {
// struct PokemonStruct pokemon;
// u8 name_buffer[20];
// u8 friend_area;
// s32 i;
// register s16 species asm("r7") = (s16)_species;
// s32 cond = a2 << 24;
// pokemon.unk0 = 3;
// if (cond) {
// pokemon.unk2 = 1;
// pokemon.unk4.unk4 = 64;
// }
// else {
// pokemon.unk2 = 1;
// pokemon.unk4.unk4 = 65;
// }
// 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, 0);
// pokemon.speciesNum = species;
// pokemon.heldItem.id = 0;
// pokemon.heldItem.quantity = 0;
// pokemon.unk1C = 0;
// pokemon.unk24 = 0;
// pokemon.unk4.unk5 = 0;
// sub_808E490(pokemon.moves, species);
// // mostly incorrect below this:
// if (!a3) {
// CopyMonsterNametoBuffer(name_buffer, species);
// BoundedCopyStringtoBuffer(pokemon.name, name_buffer, 10);
// }
// else {
// s32 j;
// for (j = 0; j < 10; j++) {
// pokemon.name[j] = a3[j];
// }
// }
// friend_area = gMonsterParameters[species].friend_area;
// for (i = 0; i < 413; i++) {
// if (!((u8)gRecruitedPokemonRef->pokemon[i].unk0 & 1)) {
// u8 species_friend_area = sub_80923D4(i);
// if (species_friend_area == friend_area) {
// gRecruitedPokemonRef->pokemon[i] = pokemon;
// gFriendAreas[species_friend_area] = 1;
// sub_80980B4(species);
// break;
// }
// }
// }
// }
// https://decomp.me/scratch/wQbZB
// 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.level = 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].level = 0;
// pokemon.unkC[1].level = 0;
// SetDefaultIQSkills((u8*)&pokemon.IQSkills, FALSE);
// pokemon.speciesNum = species;
// pokemon.heldItem.id = ITEM_NOTHING;
// pokemon.heldItem.quantity = 0;
// pokemon.currExp = 0;
// pokemon.tacticIndex = 0; // TACTIC_LETS_GO_TOGETHER
// 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,75 +0,0 @@
#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

@ -691,7 +691,7 @@ s32 SaveRecruitedPokemon(u8 *a1, s32 a2)
}
}
else {
pokemon->unkHasNextStage = 0;
pokemon->level = 0;
}
SavePokemonStruct(&backup, pokemon);
}
@ -754,7 +754,7 @@ s32 RestoreRecruitedPokemon(u8 *a1, s32 a2)
void SavePokemonStruct(struct unkStruct_8094924* a1, struct PokemonStruct* pokemon)
{
SaveIntegerBits(a1, &pokemon->unkHasNextStage, 7);
SaveIntegerBits(a1, &pokemon->level, 7);
SaveIntegerBits(a1, &pokemon->speciesNum, 9);
SaveDungeonLocation(a1, &pokemon->dungeonLocation);
xxx_save_poke_sub_c_808F41C(a1, &pokemon->unkC[0]);
@ -765,9 +765,9 @@ void SavePokemonStruct(struct unkStruct_8094924* a1, struct PokemonStruct* pokem
SaveIntegerBits(a1, &pokemon->offense.att[1], 8);
SaveIntegerBits(a1, &pokemon->offense.def[0], 8);
SaveIntegerBits(a1, &pokemon->offense.def[1], 8);
SaveIntegerBits(a1, &pokemon->unk1C, 24);
SaveIntegerBits(a1, &pokemon->currExp, 24);
SaveIntegerBits(a1, &pokemon->IQSkills, 24);
SaveIntegerBits(a1, &pokemon->unk24, 4);
SaveIntegerBits(a1, &pokemon->tacticIndex, 4);
SaveHeldItem(a1, &pokemon->heldItem);
SavePokemonMoves(a1, pokemon->moves);
SaveIntegerBits(a1, pokemon->name, 80);
@ -778,8 +778,8 @@ void RestorePokemonStruct(struct unkStruct_8094924* a1, struct PokemonStruct* po
memset(pokemon, 0, sizeof(struct PokemonStruct));
pokemon->unk0 = 0;
pokemon->isTeamLeader = 0;
RestoreIntegerBits(a1, &pokemon->unkHasNextStage, 7);
if (pokemon->unkHasNextStage) {
RestoreIntegerBits(a1, &pokemon->level, 7);
if (pokemon->level) {
pokemon->unk0 |= 1;
}
RestoreIntegerBits(a1, &pokemon->speciesNum, 9);
@ -792,9 +792,9 @@ void RestorePokemonStruct(struct unkStruct_8094924* a1, struct PokemonStruct* po
RestoreIntegerBits(a1, &pokemon->offense.att[1], 8);
RestoreIntegerBits(a1, &pokemon->offense.def[0], 8);
RestoreIntegerBits(a1, &pokemon->offense.def[1], 8);
RestoreIntegerBits(a1, &pokemon->unk1C, 24);
RestoreIntegerBits(a1, &pokemon->currExp, 24);
RestoreIntegerBits(a1, &pokemon->IQSkills, 24);
RestoreIntegerBits(a1, &pokemon->unk24, 4);
RestoreIntegerBits(a1, &pokemon->tacticIndex, 4);
RestoreHeldItem(a1, &pokemon->heldItem);
RestorePokemonMoves(a1, pokemon->moves);
RestoreIntegerBits(a1, pokemon->name, 80);
@ -816,7 +816,7 @@ s32 SavePokemonStruct2(u8* a1, s32 size)
SaveIntegerBits(&backup, &pokemon2->unk0, 2);
SaveIntegerBits(&backup, pokemon2->isTeamLeader ? &data_u8_neg1 : &data_u8_zero, 1);
SaveIntegerBits(&backup, &pokemon2->unkHasNextStage, 7);
SaveIntegerBits(&backup, &pokemon2->level, 7);
SaveDungeonLocation(&backup, &pokemon2->dungeonLocation);
SaveIntegerBits(&backup, &pokemon2->IQ, 10);
@ -829,13 +829,13 @@ s32 SavePokemonStruct2(u8* a1, s32 size)
SaveIntegerBits(&backup, &pokemon2->offense.att[1], 8);
SaveIntegerBits(&backup, &pokemon2->offense.def[0], 8);
SaveIntegerBits(&backup, &pokemon2->offense.def[1], 8);
SaveIntegerBits(&backup, &pokemon2->unk18, 24);
SaveIntegerBits(&backup, &pokemon2->currExp, 24);
sub_8094184(&backup, &pokemon2->moves);
SaveItemSlot(&backup, &pokemon2->itemSlot);
sub_809449C(&backup, &pokemon2->unk44);
sub_809449C(&backup, &pokemon2->unk48);
SaveIntegerBits(&backup, &pokemon2->IQSkills, 24);
SaveIntegerBits(&backup, &pokemon2->unk50, 4);
SaveIntegerBits(&backup, &pokemon2->tacticIndex, 4);
sub_808F448(&backup, &pokemon2->unk54);
SaveIntegerBits(&backup, &pokemon2->name, 80);
}
@ -864,7 +864,7 @@ s32 RestorePokemonStruct2(u8* a1, s32 size)
else {
pokemon2->isTeamLeader = FALSE;
}
RestoreIntegerBits(&backup, &pokemon2->unkHasNextStage, 7);
RestoreIntegerBits(&backup, &pokemon2->level, 7);
RestoreDungeonLocation(&backup, &pokemon2->dungeonLocation);
RestoreIntegerBits(&backup, &pokemon2->IQ, 10);
@ -877,13 +877,13 @@ s32 RestorePokemonStruct2(u8* a1, s32 size)
RestoreIntegerBits(&backup, &pokemon2->offense.att[1], 8);
RestoreIntegerBits(&backup, &pokemon2->offense.def[0], 8);
RestoreIntegerBits(&backup, &pokemon2->offense.def[1], 8);
RestoreIntegerBits(&backup, &pokemon2->unk18, 24);
RestoreIntegerBits(&backup, &pokemon2->currExp, 24);
sub_80941FC(&backup, &pokemon2->moves);
RestoreItemSlot(&backup, &pokemon2->itemSlot);
sub_809447C(&backup, &pokemon2->unk44);
sub_809447C(&backup, &pokemon2->unk48);
RestoreIntegerBits(&backup, &pokemon2->IQSkills, 24);
RestoreIntegerBits(&backup, &pokemon2->unk50, 4);
RestoreIntegerBits(&backup, &pokemon2->tacticIndex, 4);
sub_808F428(&backup, &pokemon2->unk54);
RestoreIntegerBits(&backup, &pokemon2->name, 80);
}
@ -893,12 +893,12 @@ s32 RestorePokemonStruct2(u8* a1, s32 size)
void xxx_restore_poke_sub_c_808F410(struct unkStruct_8094924* a1, struct unkPokeSubStruct_C* unkC)
{
RestoreIntegerBits(a1, &unkC->unk0, 7);
RestoreIntegerBits(a1, &unkC->level, 7);
}
void xxx_save_poke_sub_c_808F41C(struct unkStruct_8094924* a1, struct unkPokeSubStruct_C* unkC)
{
SaveIntegerBits(a1, &unkC->unk0, 7);
SaveIntegerBits(a1, &unkC->level, 7);
}
void sub_808F428(struct unkStruct_8094924* a1, struct unkStruct_808E6F4* a2)
@ -969,7 +969,7 @@ void sub_808F468(struct PokemonStruct *param_1, struct EvolveStatus *evolveStatu
}
if (evolveConditions.preEvolution.evolveType == EVOLVE_TYPE_LEVEL) {
if ((evolveStatus->evolutionConditionStatus & EVOLUTION_GOOD)) continue;
if (param_1->unkHasNextStage < evolveConditions.evolutionRequirements.mainRequirement) {
if (param_1->level < evolveConditions.evolutionRequirements.mainRequirement) {
evolveStatus->evolutionConditionStatus |= EVOLUTION_LACK_LEVEL;
evolFlag = TRUE;
}

View File

@ -524,7 +524,7 @@ void xxx_pokemonstruct_to_pokemon2_808DE50(struct PokemonStruct2 * a1, struct Po
u32 somestruct2_80943A0;
a1->unk0 = pokemon->unk0;
a1->unkHasNextStage = pokemon->unkHasNextStage;
a1->level = pokemon->level;
a1->IQ = pokemon->IQ;
a1->IQSkills = pokemon->IQSkills;
sub_808E6F4(&a1->unk54);
@ -532,7 +532,7 @@ void xxx_pokemonstruct_to_pokemon2_808DE50(struct PokemonStruct2 * a1, struct Po
a1->isTeamLeader = pokemon->isTeamLeader;
a1->unkA = a3;
a1->speciesNum = pokemon->speciesNum;
a1->unk50 = pokemon->unk24;
a1->tacticIndex = pokemon->tacticIndex;
a1->unk12 = pokemon->pokeHP;
a1->unk10 = pokemon->pokeHP;
@ -541,7 +541,7 @@ void xxx_pokemonstruct_to_pokemon2_808DE50(struct PokemonStruct2 * a1, struct Po
a1->offense.def[i] = pokemon->offense.def[i];
}
a1->unk18 = pokemon->unk1C;
a1->currExp = pokemon->currExp;
CopyAndResetMoves(&a1->moves, &pokemon->moves);
for (i = 0; i < POKEMON_NAME_LENGTH; i++) {
@ -578,13 +578,13 @@ void xxx_pokemon2_to_pokemonstruct_808DF44(struct PokemonStruct* pokemon, struct
s32 i;
pokemon->unk0 = a2->unk0;
pokemon->unkHasNextStage = a2->unkHasNextStage;
pokemon->level = a2->level;
pokemon->IQ = a2->IQ;
pokemon->IQSkills = a2->IQSkills;
pokemon->dungeonLocation = a2->dungeonLocation;
pokemon->isTeamLeader = a2->isTeamLeader;
pokemon->speciesNum = a2->speciesNum;
pokemon->unk24 = a2->unk50;
pokemon->tacticIndex = a2->tacticIndex;
pokemon->pokeHP = a2->unk12;
for (i = 0; i < 2; i++) {
@ -592,7 +592,7 @@ void xxx_pokemon2_to_pokemonstruct_808DF44(struct PokemonStruct* pokemon, struct
pokemon->offense.def[i] = a2->offense.def[i];
}
pokemon->unk1C = a2->unk18;
pokemon->currExp = a2->currExp;
CopyBareMoveData(pokemon->moves, &a2->moves);
for (i = 0; i < POKEMON_NAME_LENGTH; i++) {
@ -771,7 +771,7 @@ s32 sub_808E218(struct unkStruct_808E218_arg* a1, struct PokemonStruct* pokemon)
ptr = DecompressMoveID(ptr, &result);
value = *ptr++;
if (value > evolve_sequence[i].unkHasNextStage) {
if (value > evolve_sequence[i].level) {
break;
}
@ -815,14 +815,14 @@ s32 GetEvolutionSequence(struct PokemonStruct* pokemon, struct EvolveStage* a2)
s32 i;
a2[0].specesNum = pokemon->speciesNum;
a2[0].unkHasNextStage = pokemon->unkHasNextStage;
a2[0].level = pokemon->level;
count = 1;
species = pokemon->speciesNum;
i = 0;
for (; i < 2; i++) {
if (!pokemon->unkC[i].unk0) {
if (!pokemon->unkC[i].level) {
break;
}
species = GetPokemonEvolveFrom(species);
@ -830,7 +830,7 @@ s32 GetEvolutionSequence(struct PokemonStruct* pokemon, struct EvolveStage* a2)
break;
}
a2[1 + i].speciesNum = species;
a2[1 + i].unkHasNextStage = pokemon->unkC[i].unk0;
a2[1 + i].level = pokemon->unkC[i].level;
// wrong increment order:
count++;
}
@ -843,7 +843,7 @@ s32 GetEvolutionSequence(struct PokemonStruct* pokemon, struct EvolveStage* a2)
struct unkPokeSubStruct_C* has_next_stage;
a2[0].speciesNum = pokemon->speciesNum;
a2[0].unkHasNextStage = pokemon->unkHasNextStage;
a2[0].level = pokemon->level;
count = 1;
species = pokemon->speciesNum;
@ -852,7 +852,7 @@ s32 GetEvolutionSequence(struct PokemonStruct* pokemon, struct EvolveStage* a2)
stage = &a2[1];
for (; i < 2; i++) {
if (!has_next_stage->unk0) {
if (!has_next_stage->level) {
break;
}
species = GetPokemonEvolveFrom(species);
@ -860,7 +860,7 @@ s32 GetEvolutionSequence(struct PokemonStruct* pokemon, struct EvolveStage* a2)
break;
}
stage->speciesNum = species;
stage->unkHasNextStage = has_next_stage->unk0;
stage->level = has_next_stage->level;
stage++;
count++;
has_next_stage++;