Evolution

This commit is contained in:
Eduardo Quezada 2025-12-27 18:42:58 -03:00
parent 9709af5850
commit 6aee6badb8
13 changed files with 267 additions and 258 deletions

View File

@ -1626,7 +1626,7 @@ _020382F6:
mov r0, #0x0
mov r2, #0x1
lsr r3, r3, #0x10
bl GetMonEvolution
bl Pokemon_GetEvolutionTarget
str r0, [sp, #0x20]
cmp r0, #0x0
beq _02038380

View File

@ -5439,7 +5439,7 @@ _02071E5A:
str r0, [sp, #0x0]
ldrh r3, [r3, #0x24]
mov r0, #0x0
bl GetMonEvolution
bl Pokemon_GetEvolutionTarget
ldr r1, _02071F1C ; =0x000005A4
ldr r2, [r5, r1]
strh r0, [r2, #0x38]

View File

@ -1219,7 +1219,7 @@ _02072E98:
ldr r3, [r5, r3]
mov r2, #0x3
ldrh r3, [r3, #0x24]
bl GetMonEvolution
bl Pokemon_GetEvolutionTarget
cmp r0, #0x0
bne _02072ED0
add r0, r5, #0x0

View File

@ -2260,7 +2260,7 @@ _02076814:
ldr r0, [r1, #0x0]
add r1, r5, #0x0
lsr r3, r3, #0x10
bl GetMonEvolution
bl Pokemon_GetEvolutionTarget
ldr r1, _02076878 ; =0x000005A4
ldr r2, [r4, r1]
strh r0, [r2, #0x38]

View File

@ -4786,7 +4786,7 @@
.extern BoxPokemon_GetForm
.extern Pokemon_GetBoxMon
.extern Pokemon_TryLevelUp
.extern GetMonEvolution
.extern Pokemon_GetEvolutionTarget
.extern ReadFromPersonalPmsNarc
.extern GetEggSpecies
.extern Pokemon_TryAppendMove

View File

@ -1948,7 +1948,7 @@ _02230D9C:
ldr r0, [r5, #4]
mov r2, #0
lsr r3, r3, #0x10
bl GetMonEvolution
bl Pokemon_GetEvolutionTarget
str r0, [sp, #4]
cmp r0, #0
bne _02230DD0

View File

@ -17443,7 +17443,7 @@ _02235FDE:
add r1, r7, #0
mov r2, #1
lsr r3, r3, #0x10
bl GetMonEvolution
bl Pokemon_GetEvolutionTarget
str r0, [sp, #0x24]
cmp r0, #0
beq _02236052
@ -17534,7 +17534,7 @@ _022360B6:
add r1, r7, #0
mov r2, #1
lsr r3, r3, #0x10
bl GetMonEvolution
bl Pokemon_GetEvolutionTarget
str r0, [sp, #0x28]
cmp r0, #0
beq _02236118

View File

@ -45,39 +45,39 @@ static const u16 sPokemonCenterSecondFloorMaps[] = {
static const u16 sMapEvolutionMethods[] = {
MAP_ROUTE_217,
EVO_ROUTE217,
EVO_LEVEL_ICE_ROCK,
MAP_ETERNA_FOREST_INTERIOR,
EVO_ETERNA,
EVO_LEVEL_MOSS_ROCK,
MAP_MOUNT_CORONET_SOUTH_1F,
EVO_CORONET,
EVO_LEVEL_MAGNETIC_FIELD,
MAP_MOUNT_CORONET_SOUTH_2F,
EVO_CORONET,
EVO_LEVEL_MAGNETIC_FIELD,
MAP_MOUNT_CORONET_SOUTH_3F,
EVO_CORONET,
EVO_LEVEL_MAGNETIC_FIELD,
MAP_MOUNT_CORONET_NORTH_MOUNTAINSIDE,
EVO_CORONET,
EVO_LEVEL_MAGNETIC_FIELD,
MAP_MOUNT_CORONET_SOUTH_MOUNTAINSIDE,
EVO_CORONET,
EVO_LEVEL_MAGNETIC_FIELD,
MAP_MOUNT_CORONET_4F_ROOM_1,
EVO_CORONET,
EVO_LEVEL_MAGNETIC_FIELD,
MAP_MOUNT_CORONET_4F_ROOM_3,
EVO_CORONET,
EVO_LEVEL_MAGNETIC_FIELD,
MAP_MOUNT_CORONET_5F,
EVO_CORONET,
EVO_LEVEL_MAGNETIC_FIELD,
MAP_MOUNT_CORONET_6F,
EVO_CORONET,
EVO_LEVEL_MAGNETIC_FIELD,
MAP_MOUNT_CORONET_TUNNEL_ROOM,
EVO_CORONET,
EVO_LEVEL_MAGNETIC_FIELD,
MAP_MOUNT_CORONET_NORTH_1F_ROOM_2,
EVO_CORONET,
EVO_LEVEL_MAGNETIC_FIELD,
MAP_MOUNT_CORONET_NORTH_1F_ROOM_1,
EVO_CORONET,
EVO_LEVEL_MAGNETIC_FIELD,
MAP_MOUNT_CORONET_B1F,
EVO_CORONET,
EVO_LEVEL_MAGNETIC_FIELD,
MAP_MOUNT_CORONET_SPEAR_PILLAR,
EVO_CORONET,
EVO_LEVEL_MAGNETIC_FIELD,
MAP_MOUNT_CORONET_UNUSED_2,
EVO_CORONET,
EVO_LEVEL_MAGNETIC_FIELD,
};
static const struct MapHeader sMapHeaders[] = {

View File

@ -53,7 +53,7 @@ BOOL Species_CanLearnTMHM(u16 species, int form, u8 tmHM);
void BoxPokemon_UpdateAbility(BoxPokemon *boxMon);
u32 MaskOfFlagNo(int flagno);
void SpeciesData_LoadSpecies(int species, SpeciesData *speciesData);
void LoadMonEvolutionTable(u16 species, struct Evolution *dest);
void Species_LoadEvolutions(u16 species, struct Evolution *dest);
int ResolveMonForm(int species, int form);
void MonEncryptSegment(u16 *datap, u32 size, u32 key);
@ -2405,223 +2405,222 @@ BOOL Pokemon_TryLevelUp(Pokemon *mon) {
return FALSE;
}
u16 GetMonEvolution(struct Party *party, Pokemon *mon, u32 context, u32 usedItem, u32 *method_ret) {
u16 target = SPECIES_NONE;
u32 sp40;
u16 species;
u16 heldItem;
u32 personality;
int i;
u8 beauty;
u8 level;
u16 friendship;
u16 pid_hi;
struct Evolution *evoTable;
u8 r1;
u16 Pokemon_GetEvolutionTarget(Party *party, Pokemon *mon, u8 context, u32 evoParam, u32 *methodRet) {
u16 targetSpecies = SPECIES_NONE;
species = (u16)Pokemon_GetData(mon, MON_DATA_SPECIES, NULL);
heldItem = (u16)Pokemon_GetData(mon, MON_DATA_HELD_ITEM, NULL);
personality = Pokemon_GetData(mon, MON_DATA_PERSONALITY, NULL);
beauty = (u8)Pokemon_GetData(mon, MON_DATA_BEAUTY, NULL);
pid_hi = (u16)((personality & 0xFFFF0000) >> 16);
r1 = (u8)GetItemAttr(heldItem, 1, HEAP_ID_DEFAULT);
if (species != SPECIES_KADABRA && r1 == HOLD_EFFECT_NO_EVOLVE && context != 3) {
u16 species = Pokemon_GetData(mon, MON_DATA_SPECIES, NULL);
u16 heldItem = Pokemon_GetData(mon, MON_DATA_HELD_ITEM, NULL);
u32 personality = Pokemon_GetData(mon, MON_DATA_PERSONALITY, NULL);
u8 beauty = Pokemon_GetData(mon, MON_DATA_BEAUTY, NULL);
int i;
u16 friendship;
u16 personalityUpper = (personality & 0xFFFF0000) >> 16;
u8 holdEffect = GetItemAttr(heldItem, ITEMATTR_HOLD_EFFECT, HEAP_ID_DEFAULT);
// Kadabra bypasses Everstone because he's just that broken.
if (species != SPECIES_KADABRA
&& holdEffect == HOLD_EFFECT_NO_EVOLVE
&& context != EVO_CONTEXT_ITEM_USE) {
return SPECIES_NONE;
}
if (method_ret == NULL) {
method_ret = &sp40;
int stackVar;
if (methodRet == NULL) {
methodRet = &stackVar;
}
evoTable = Heap_Alloc(HEAP_ID_DEFAULT, 7 * sizeof(struct Evolution));
LoadMonEvolutionTable(species, evoTable);
Evolution *evolutions = Heap_Alloc(HEAP_ID_DEFAULT, MAX_MON_EVOLUTIONS * sizeof(Evolution));
Species_LoadEvolutions(species, evolutions);
switch (context) {
case 0:
level = (u8)Pokemon_GetData(mon, MON_DATA_LEVEL, NULL);
friendship = (u16)Pokemon_GetData(mon, MON_DATA_FRIENDSHIP, NULL);
for (i = 0; i < 7; i++) {
switch (evoTable[i].method) {
case EVO_CONTEXT_LEVEL_UP:
u8 level = Pokemon_GetData(mon, MON_DATA_LEVEL, NULL);
friendship = Pokemon_GetData(mon, MON_DATA_FRIENDSHIP, NULL);
for (i = 0; i < MAX_MON_EVOLUTIONS; i++) {
switch (evolutions[i].method) {
case EVO_NONE:
case EVO_TRADE:
case EVO_TRADE_HELD_ITEM:
case EVO_USE_ITEM:
case EVO_USE_ITEM_MALE:
case EVO_USE_ITEM_FEMALE:
break;
case EVO_FRIENDSHIP:
if (friendship >= 220) {
target = evoTable[i].target;
*method_ret = EVO_FRIENDSHIP;
case EVO_LEVEL_FRIENDSHIP:
if (friendship >= FRIENDSHIP_EVO_THRESHOLD) {
targetSpecies = evolutions[i].target;
*methodRet = EVO_LEVEL_FRIENDSHIP;
}
break;
case EVO_FRIENDSHIP_DAY:
if (IsNighttime() == 0 && friendship >= 220) {
target = evoTable[i].target;
*method_ret = EVO_FRIENDSHIP_DAY;
case EVO_LEVEL_FRIENDSHIP_DAY:
if (IsNighttime() == FALSE && friendship >= FRIENDSHIP_EVO_THRESHOLD) {
targetSpecies = evolutions[i].target;
*methodRet = EVO_LEVEL_FRIENDSHIP_DAY;
}
break;
case EVO_FRIENDSHIP_NIGHT:
if (IsNighttime() == 1 && friendship >= 220) {
target = evoTable[i].target;
*method_ret = EVO_FRIENDSHIP_NIGHT;
case EVO_LEVEL_FRIENDSHIP_NIGHT:
if (IsNighttime() == TRUE && friendship >= FRIENDSHIP_EVO_THRESHOLD) {
targetSpecies = evolutions[i].target;
*methodRet = EVO_LEVEL_FRIENDSHIP_NIGHT;
}
break;
case EVO_LEVEL:
if (evoTable[i].param <= level) {
target = evoTable[i].target;
*method_ret = EVO_LEVEL;
if (evolutions[i].param <= level) {
targetSpecies = evolutions[i].target;
*methodRet = EVO_LEVEL;
}
break;
case EVO_TRADE:
break;
case EVO_TRADE_ITEM:
break;
case EVO_STONE:
break;
case EVO_LEVEL_ATK_GT_DEF:
if (evoTable[i].param <= level && Pokemon_GetData(mon, MON_DATA_ATK, NULL) > Pokemon_GetData(mon, MON_DATA_DEF, NULL)) {
target = evoTable[i].target;
*method_ret = EVO_LEVEL_ATK_GT_DEF;
if (evolutions[i].param <= level && Pokemon_GetData(mon, MON_DATA_ATK, NULL) > Pokemon_GetData(mon, MON_DATA_DEF, NULL)) {
targetSpecies = evolutions[i].target;
*methodRet = EVO_LEVEL_ATK_GT_DEF;
}
break;
case EVO_LEVEL_ATK_EQ_DEF:
if (evoTable[i].param <= level && Pokemon_GetData(mon, MON_DATA_ATK, NULL) == Pokemon_GetData(mon, MON_DATA_DEF, NULL)) {
target = evoTable[i].target;
*method_ret = EVO_LEVEL_ATK_EQ_DEF;
if (evolutions[i].param <= level && Pokemon_GetData(mon, MON_DATA_ATK, NULL) == Pokemon_GetData(mon, MON_DATA_DEF, NULL)) {
targetSpecies = evolutions[i].target;
*methodRet = EVO_LEVEL_ATK_EQ_DEF;
}
break;
case EVO_LEVEL_ATK_LT_DEF:
if (evoTable[i].param <= level && Pokemon_GetData(mon, MON_DATA_ATK, NULL) < Pokemon_GetData(mon, MON_DATA_DEF, NULL)) {
target = evoTable[i].target;
*method_ret = EVO_LEVEL_ATK_LT_DEF;
if (evolutions[i].param <= level && Pokemon_GetData(mon, MON_DATA_ATK, NULL) < Pokemon_GetData(mon, MON_DATA_DEF, NULL)) {
targetSpecies = evolutions[i].target;
*methodRet = EVO_LEVEL_ATK_LT_DEF;
}
break;
case EVO_LEVEL_PID_LO:
if (evoTable[i].param <= level && pid_hi % 10 < 5) {
target = evoTable[i].target;
*method_ret = EVO_LEVEL_PID_LO;
case EVO_LEVEL_PID_LOW:
if (evolutions[i].param <= level && personalityUpper % 10 < 5) {
targetSpecies = evolutions[i].target;
*methodRet = EVO_LEVEL_PID_LOW;
}
break;
case EVO_LEVEL_PID_HI:
if (evoTable[i].param <= level && pid_hi % 10 >= 5) {
target = evoTable[i].target;
*method_ret = EVO_LEVEL_PID_HI;
case EVO_LEVEL_PID_HIGH:
if (evolutions[i].param <= level && personalityUpper % 10 >= 5) {
targetSpecies = evolutions[i].target;
*methodRet = EVO_LEVEL_PID_HIGH;
}
break;
case EVO_LEVEL_NINJASK:
if (evoTable[i].param <= level) {
target = evoTable[i].target;
*method_ret = EVO_LEVEL_NINJASK;
if (evolutions[i].param <= level) {
targetSpecies = evolutions[i].target;
*methodRet = EVO_LEVEL_NINJASK;
}
break;
case EVO_LEVEL_SHEDINJA:
*method_ret = EVO_LEVEL_SHEDINJA;
*methodRet = EVO_LEVEL_SHEDINJA;
break;
case EVO_BEAUTY:
if (evoTable[i].param <= beauty) {
target = evoTable[i].target;
*method_ret = EVO_BEAUTY;
case EVO_LEVEL_BEAUTY:
if (evolutions[i].param <= beauty) {
targetSpecies = evolutions[i].target;
*methodRet = EVO_LEVEL_BEAUTY;
}
break;
case EVO_STONE_MALE:
break;
case EVO_STONE_FEMALE:
break;
case EVO_ITEM_DAY:
if (IsNighttime() == 0 && evoTable[i].param == heldItem) {
target = evoTable[i].target;
*method_ret = EVO_ITEM_DAY;
case EVO_LEVEL_HELD_ITEM_DAY:
if (IsNighttime() == FALSE && evolutions[i].param == heldItem) {
targetSpecies = evolutions[i].target;
*methodRet = EVO_LEVEL_HELD_ITEM_DAY;
}
break;
case EVO_ITEM_NIGHT:
if (IsNighttime() == 1 && evoTable[i].param == heldItem) {
target = evoTable[i].target;
*method_ret = EVO_ITEM_NIGHT;
case EVO_LEVEL_HELD_ITEM_NIGHT:
if (IsNighttime() == TRUE && evolutions[i].param == heldItem) {
targetSpecies = evolutions[i].target;
*methodRet = EVO_LEVEL_HELD_ITEM_NIGHT;
}
break;
case EVO_HAS_MOVE:
if (Pokemon_HasMove(mon, evoTable[i].param) == TRUE) {
target = evoTable[i].target;
*method_ret = EVO_HAS_MOVE;
case EVO_LEVEL_KNOW_MOVE:
if (Pokemon_HasMove(mon, evolutions[i].param) == TRUE) {
targetSpecies = evolutions[i].target;
*methodRet = EVO_LEVEL_KNOW_MOVE;
}
break;
case EVO_OTHER_PARTY_MON:
if (party != NULL && Party_HasMon(party, evoTable[i].param) == 1) {
target = evoTable[i].target;
*method_ret = EVO_OTHER_PARTY_MON;
case EVO_LEVEL_SPECIES_IN_PARTY:
if (party != NULL && Party_HasMon(party, evolutions[i].param) == TRUE) {
targetSpecies = evolutions[i].target;
*methodRet = EVO_LEVEL_SPECIES_IN_PARTY;
}
break;
case EVO_LEVEL_MALE:
if (Pokemon_GetData(mon, MON_DATA_GENDER, NULL) == GENDER_MALE && evoTable[i].param <= level) {
target = evoTable[i].target;
*method_ret = EVO_LEVEL_MALE;
if (Pokemon_GetData(mon, MON_DATA_GENDER, NULL) == GENDER_MALE && evolutions[i].param <= level) {
targetSpecies = evolutions[i].target;
*methodRet = EVO_LEVEL_MALE;
}
break;
case EVO_LEVEL_FEMALE:
if (Pokemon_GetData(mon, MON_DATA_GENDER, NULL) == GENDER_FEMALE && evoTable[i].param <= level) {
target = evoTable[i].target;
*method_ret = EVO_LEVEL_FEMALE;
if (Pokemon_GetData(mon, MON_DATA_GENDER, NULL) == GENDER_FEMALE && evolutions[i].param <= level) {
targetSpecies = evolutions[i].target;
*methodRet = EVO_LEVEL_FEMALE;
}
break;
case EVO_CORONET:
if (usedItem == evoTable[i].method) {
target = evoTable[i].target;
*method_ret = EVO_CORONET;
case EVO_LEVEL_MAGNETIC_FIELD:
if (evoParam == evolutions[i].method) {
targetSpecies = evolutions[i].target;
*methodRet = EVO_LEVEL_MAGNETIC_FIELD;
}
break;
case EVO_ETERNA:
if (usedItem == evoTable[i].method) {
target = evoTable[i].target;
*method_ret = EVO_ETERNA;
case EVO_LEVEL_MOSS_ROCK:
if (evoParam == evolutions[i].method) {
targetSpecies = evolutions[i].target;
*methodRet = EVO_LEVEL_MOSS_ROCK;
}
break;
case EVO_ROUTE217:
if (usedItem == evoTable[i].method) {
target = evoTable[i].target;
*method_ret = EVO_ROUTE217;
case EVO_LEVEL_ICE_ROCK:
if (evoParam == evolutions[i].method) {
targetSpecies = evolutions[i].target;
*methodRet = EVO_LEVEL_ICE_ROCK;
}
break;
}
if (target != SPECIES_NONE) {
if (targetSpecies != SPECIES_NONE) {
break;
}
}
break;
case 1:
for (i = 0; i < 7; i++) {
switch (evoTable[i].method) {
case EVO_CONTEXT_TRADE:
for (i = 0; i < MAX_MON_EVOLUTIONS; i++) {
switch (evolutions[i].method) {
case EVO_TRADE:
target = evoTable[i].target;
*method_ret = EVO_TRADE;
targetSpecies = evolutions[i].target;
*methodRet = EVO_TRADE;
break;
case EVO_TRADE_ITEM:
if (heldItem == evoTable[i].param) {
target = evoTable[i].target;
*method_ret = EVO_TRADE_ITEM;
case EVO_TRADE_HELD_ITEM:
if (heldItem == evolutions[i].param) {
targetSpecies = evolutions[i].target;
*methodRet = EVO_TRADE_HELD_ITEM;
}
break;
}
if (target != SPECIES_NONE) {
if (targetSpecies != SPECIES_NONE) {
break;
}
}
break;
case 2:
case 3:
for (i = 0; i < 7; i++) {
if (evoTable[i].method == EVO_STONE && usedItem == evoTable[i].param) {
target = evoTable[i].target;
*method_ret = 0;
case EVO_CONTEXT_ITEM_CHECK:
case EVO_CONTEXT_ITEM_USE:
for (i = 0; i < MAX_MON_EVOLUTIONS; i++) {
if (evolutions[i].method == EVO_USE_ITEM && evoParam == evolutions[i].param) {
targetSpecies = evolutions[i].target;
*methodRet = EVO_NONE;
break;
}
if (evoTable[i].method == EVO_STONE_MALE && Pokemon_GetData(mon, MON_DATA_GENDER, NULL) == GENDER_MALE && usedItem == evoTable[i].param) {
target = evoTable[i].target;
*method_ret = 0;
if (evolutions[i].method == EVO_USE_ITEM_MALE
&& Pokemon_GetData(mon, MON_DATA_GENDER, NULL) == GENDER_MALE
&& evoParam == evolutions[i].param) {
targetSpecies = evolutions[i].target;
*methodRet = EVO_NONE;
break;
}
if (evoTable[i].method == EVO_STONE_FEMALE && Pokemon_GetData(mon, MON_DATA_GENDER, NULL) == GENDER_FEMALE && usedItem == evoTable[i].param) {
target = evoTable[i].target;
*method_ret = 0;
if (evolutions[i].method == EVO_USE_ITEM_FEMALE
&& Pokemon_GetData(mon, MON_DATA_GENDER, NULL) == GENDER_FEMALE
&& evoParam == evolutions[i].param) {
targetSpecies = evolutions[i].target;
*methodRet = EVO_NONE;
break;
}
}
break;
}
Heap_Free(evoTable);
return target;
Heap_Free(evolutions);
return targetSpecies;
}
u16 ReadFromPersonalPmsNarc(u16 species) {
@ -3265,7 +3264,7 @@ void SpeciesData_LoadForm(int species, int form, SpeciesData *speciesData) {
ReadWholeNarcMemberByIdPair(speciesData, NARC_POKETOOL_PERSONAL_PERSONAL, ResolveMonForm(species, form));
}
void LoadMonEvolutionTable(u16 species, struct Evolution *evo) {
void Species_LoadEvolutions(u16 species, struct Evolution *evo) {
ReadWholeNarcMemberByIdPair(evo, NARC_POKETOOL_PERSONAL_EVO, species);
}

View File

@ -67,7 +67,7 @@ BOOL CanUseItemOnPokemon(struct Pokemon *pokemon, u16 itemId, s32 moveId, enum H
Heap_Free(itemData);
return TRUE;
}
if (GetItemAttr_PreloadedItemData(itemData, ITEMATTR_EVOLVE) && GetMonEvolution(NULL, pokemon, 3, itemId, NULL) != SPECIES_NONE) {
if (GetItemAttr_PreloadedItemData(itemData, ITEMATTR_EVOLVE) && Pokemon_GetEvolutionTarget(NULL, pokemon, 3, itemId, NULL) != SPECIES_NONE) {
Heap_Free(itemData);
return TRUE;
}

View File

@ -194,7 +194,7 @@
"species": "PIKACHU",
"evos": [
{
"method": "EVO_STONE",
"method": "EVO_USE_ITEM",
"target": "RAICHU",
"param": "ITEM_THUNDERSTONE"
}
@ -232,7 +232,7 @@
"species": "NIDORINA",
"evos": [
{
"method": "EVO_STONE",
"method": "EVO_USE_ITEM",
"target": "NIDOQUEEN",
"param": "ITEM_MOON_STONE"
}
@ -256,7 +256,7 @@
"species": "NIDORINO",
"evos": [
{
"method": "EVO_STONE",
"method": "EVO_USE_ITEM",
"target": "NIDOKING",
"param": "ITEM_MOON_STONE"
}
@ -270,7 +270,7 @@
"species": "CLEFAIRY",
"evos": [
{
"method": "EVO_STONE",
"method": "EVO_USE_ITEM",
"target": "CLEFABLE",
"param": "ITEM_MOON_STONE"
}
@ -284,7 +284,7 @@
"species": "VULPIX",
"evos": [
{
"method": "EVO_STONE",
"method": "EVO_USE_ITEM",
"target": "NINETALES",
"param": "ITEM_FIRE_STONE"
}
@ -298,7 +298,7 @@
"species": "JIGGLYPUFF",
"evos": [
{
"method": "EVO_STONE",
"method": "EVO_USE_ITEM",
"target": "WIGGLYTUFF",
"param": "ITEM_MOON_STONE"
}
@ -322,7 +322,7 @@
"species": "GOLBAT",
"evos": [
{
"method": "EVO_FRIENDSHIP",
"method": "EVO_LEVEL_FRIENDSHIP",
"target": "CROBAT"
}
]
@ -341,12 +341,12 @@
"species": "GLOOM",
"evos": [
{
"method": "EVO_STONE",
"method": "EVO_USE_ITEM",
"target": "VILEPLUME",
"param": "ITEM_LEAF_STONE"
},
{
"method": "EVO_STONE",
"method": "EVO_USE_ITEM",
"target": "BELLOSSOM",
"param": "ITEM_SUN_STONE"
}
@ -444,7 +444,7 @@
"species": "GROWLITHE",
"evos": [
{
"method": "EVO_STONE",
"method": "EVO_USE_ITEM",
"target": "ARCANINE",
"param": "ITEM_FIRE_STONE"
}
@ -468,12 +468,12 @@
"species": "POLIWHIRL",
"evos": [
{
"method": "EVO_STONE",
"method": "EVO_USE_ITEM",
"target": "POLIWRATH",
"param": "ITEM_WATER_STONE"
},
{
"method": "EVO_TRADE_ITEM",
"method": "EVO_TRADE_HELD_ITEM",
"target": "POLITOED",
"param": "ITEM_KINGS_ROCK"
}
@ -543,7 +543,7 @@
"species": "WEEPINBELL",
"evos": [
{
"method": "EVO_STONE",
"method": "EVO_USE_ITEM",
"target": "VICTREEBEL",
"param": "ITEM_LEAF_STONE"
}
@ -613,7 +613,7 @@
"param": 37
},
{
"method": "EVO_TRADE_ITEM",
"method": "EVO_TRADE_HELD_ITEM",
"target": "SLOWKING",
"param": "ITEM_KINGS_ROCK"
}
@ -637,7 +637,7 @@
"species": "MAGNETON",
"evos": [
{
"method": "EVO_CORONET",
"method": "EVO_LEVEL_MAGNETIC_FIELD",
"target": "MAGNEZONE"
}
]
@ -692,7 +692,7 @@
"species": "SHELLDER",
"evos": [
{
"method": "EVO_STONE",
"method": "EVO_USE_ITEM",
"target": "CLOYSTER",
"param": "ITEM_WATER_STONE"
}
@ -729,7 +729,7 @@
"species": "ONIX",
"evos": [
{
"method": "EVO_TRADE_ITEM",
"method": "EVO_TRADE_HELD_ITEM",
"target": "STEELIX",
"param": "ITEM_METAL_COAT"
}
@ -781,7 +781,7 @@
"species": "EXEGGCUTE",
"evos": [
{
"method": "EVO_STONE",
"method": "EVO_USE_ITEM",
"target": "EXEGGUTOR",
"param": "ITEM_LEAF_STONE"
}
@ -817,7 +817,7 @@
"species": "LICKITUNG",
"evos": [
{
"method": "EVO_HAS_MOVE",
"method": "EVO_LEVEL_KNOW_MOVE",
"target": "LICKILICKY",
"param": "MOVE_ROLLOUT"
}
@ -851,7 +851,7 @@
"species": "RHYDON",
"evos": [
{
"method": "EVO_TRADE_ITEM",
"method": "EVO_TRADE_HELD_ITEM",
"target": "RHYPERIOR",
"param": "ITEM_PROTECTOR"
}
@ -861,7 +861,7 @@
"species": "CHANSEY",
"evos": [
{
"method": "EVO_FRIENDSHIP",
"method": "EVO_LEVEL_FRIENDSHIP",
"target": "BLISSEY"
}
]
@ -870,7 +870,7 @@
"species": "TANGELA",
"evos": [
{
"method": "EVO_HAS_MOVE",
"method": "EVO_LEVEL_KNOW_MOVE",
"target": "TANGROWTH",
"param": "MOVE_ANCIENT_POWER"
}
@ -894,7 +894,7 @@
"species": "SEADRA",
"evos": [
{
"method": "EVO_TRADE_ITEM",
"method": "EVO_TRADE_HELD_ITEM",
"target": "KINGDRA",
"param": "ITEM_DRAGON_SCALE"
}
@ -918,7 +918,7 @@
"species": "STARYU",
"evos": [
{
"method": "EVO_STONE",
"method": "EVO_USE_ITEM",
"target": "STARMIE",
"param": "ITEM_WATER_STONE"
}
@ -936,7 +936,7 @@
"species": "SCYTHER",
"evos": [
{
"method": "EVO_TRADE_ITEM",
"method": "EVO_TRADE_HELD_ITEM",
"target": "SCIZOR",
"param": "ITEM_METAL_COAT"
}
@ -950,7 +950,7 @@
"species": "ELECTABUZZ",
"evos": [
{
"method": "EVO_TRADE_ITEM",
"method": "EVO_TRADE_HELD_ITEM",
"target": "ELECTIVIRE",
"param": "ITEM_ELECTIRIZER"
}
@ -960,7 +960,7 @@
"species": "MAGMAR",
"evos": [
{
"method": "EVO_TRADE_ITEM",
"method": "EVO_TRADE_HELD_ITEM",
"target": "MAGMORTAR",
"param": "ITEM_MAGMARIZER"
}
@ -1000,34 +1000,34 @@
"species": "EEVEE",
"evos": [
{
"method": "EVO_ETERNA",
"method": "EVO_LEVEL_MOSS_ROCK",
"target": "LEAFEON"
},
{
"method": "EVO_ROUTE217",
"method": "EVO_LEVEL_ICE_ROCK",
"target": "GLACEON"
},
{
"method": "EVO_STONE",
"method": "EVO_USE_ITEM",
"target": "JOLTEON",
"param": "ITEM_THUNDERSTONE"
},
{
"method": "EVO_STONE",
"method": "EVO_USE_ITEM",
"target": "VAPOREON",
"param": "ITEM_WATER_STONE"
},
{
"method": "EVO_STONE",
"method": "EVO_USE_ITEM",
"target": "FLAREON",
"param": "ITEM_FIRE_STONE"
},
{
"method": "EVO_FRIENDSHIP_DAY",
"method": "EVO_LEVEL_FRIENDSHIP_DAY",
"target": "ESPEON"
},
{
"method": "EVO_FRIENDSHIP_NIGHT",
"method": "EVO_LEVEL_FRIENDSHIP_NIGHT",
"target": "UMBREON"
}
]
@ -1048,7 +1048,7 @@
"species": "PORYGON",
"evos": [
{
"method": "EVO_TRADE_ITEM",
"method": "EVO_TRADE_HELD_ITEM",
"target": "PORYGON2",
"param": "ITEM_UPGRADE"
}
@ -1284,7 +1284,7 @@
"species": "PICHU",
"evos": [
{
"method": "EVO_FRIENDSHIP",
"method": "EVO_LEVEL_FRIENDSHIP",
"target": "PIKACHU"
}
]
@ -1293,7 +1293,7 @@
"species": "CLEFFA",
"evos": [
{
"method": "EVO_FRIENDSHIP",
"method": "EVO_LEVEL_FRIENDSHIP",
"target": "CLEFAIRY"
}
]
@ -1302,7 +1302,7 @@
"species": "IGGLYBUFF",
"evos": [
{
"method": "EVO_FRIENDSHIP",
"method": "EVO_LEVEL_FRIENDSHIP",
"target": "JIGGLYPUFF"
}
]
@ -1311,7 +1311,7 @@
"species": "TOGEPI",
"evos": [
{
"method": "EVO_FRIENDSHIP",
"method": "EVO_LEVEL_FRIENDSHIP",
"target": "TOGETIC"
}
]
@ -1320,7 +1320,7 @@
"species": "TOGETIC",
"evos": [
{
"method": "EVO_STONE",
"method": "EVO_USE_ITEM",
"target": "TOGEKISS",
"param": "ITEM_SHINY_STONE"
}
@ -1418,7 +1418,7 @@
"species": "AIPOM",
"evos": [
{
"method": "EVO_HAS_MOVE",
"method": "EVO_LEVEL_KNOW_MOVE",
"target": "AMBIPOM",
"param": "MOVE_DOUBLE_HIT"
}
@ -1428,7 +1428,7 @@
"species": "SUNKERN",
"evos": [
{
"method": "EVO_STONE",
"method": "EVO_USE_ITEM",
"target": "SUNFLORA",
"param": "ITEM_SUN_STONE"
}
@ -1442,7 +1442,7 @@
"species": "YANMA",
"evos": [
{
"method": "EVO_HAS_MOVE",
"method": "EVO_LEVEL_KNOW_MOVE",
"target": "YANMEGA",
"param": "MOVE_ANCIENT_POWER"
}
@ -1474,7 +1474,7 @@
"species": "MURKROW",
"evos": [
{
"method": "EVO_STONE",
"method": "EVO_USE_ITEM",
"target": "HONCHKROW",
"param": "ITEM_DUSK_STONE"
}
@ -1488,7 +1488,7 @@
"species": "MISDREAVUS",
"evos": [
{
"method": "EVO_STONE",
"method": "EVO_USE_ITEM",
"target": "MISMAGIUS",
"param": "ITEM_DUSK_STONE"
}
@ -1528,7 +1528,7 @@
"species": "GLIGAR",
"evos": [
{
"method": "EVO_ITEM_NIGHT",
"method": "EVO_LEVEL_HELD_ITEM_NIGHT",
"target": "GLISCOR",
"param": "ITEM_RAZOR_FANG"
}
@ -1572,7 +1572,7 @@
"species": "SNEASEL",
"evos": [
{
"method": "EVO_ITEM_NIGHT",
"method": "EVO_LEVEL_HELD_ITEM_NIGHT",
"target": "WEAVILE",
"param": "ITEM_RAZOR_CLAW"
}
@ -1620,7 +1620,7 @@
"species": "PILOSWINE",
"evos": [
{
"method": "EVO_HAS_MOVE",
"method": "EVO_LEVEL_KNOW_MOVE",
"target": "MAMOSWINE",
"param": "MOVE_ANCIENT_POWER"
}
@ -1692,7 +1692,7 @@
"species": "PORYGON2",
"evos": [
{
"method": "EVO_TRADE_ITEM",
"method": "EVO_TRADE_HELD_ITEM",
"target": "PORYGON_Z",
"param": "ITEM_DUBIOUS_DISC"
}
@ -1920,12 +1920,12 @@
"species": "WURMPLE",
"evos": [
{
"method": "EVO_LEVEL_PID_LO",
"method": "EVO_LEVEL_PID_LOW",
"target": "SILCOON",
"param": 7
},
{
"method": "EVO_LEVEL_PID_HI",
"method": "EVO_LEVEL_PID_HIGH",
"target": "CASCOON",
"param": 7
}
@ -1973,7 +1973,7 @@
"species": "LOMBRE",
"evos": [
{
"method": "EVO_STONE",
"method": "EVO_USE_ITEM",
"target": "LUDICOLO",
"param": "ITEM_WATER_STONE"
}
@ -1997,7 +1997,7 @@
"species": "NUZLEAF",
"evos": [
{
"method": "EVO_STONE",
"method": "EVO_USE_ITEM",
"target": "SHIFTRY",
"param": "ITEM_LEAF_STONE"
}
@ -2054,7 +2054,7 @@
"param": 30
},
{
"method": "EVO_STONE_MALE",
"method": "EVO_USE_ITEM_MALE",
"target": "GALLADE",
"param": "ITEM_DAWN_STONE"
}
@ -2181,7 +2181,7 @@
"species": "AZURILL",
"evos": [
{
"method": "EVO_FRIENDSHIP",
"method": "EVO_LEVEL_FRIENDSHIP",
"target": "MARILL"
}
]
@ -2190,7 +2190,7 @@
"species": "NOSEPASS",
"evos": [
{
"method": "EVO_CORONET",
"method": "EVO_LEVEL_MAGNETIC_FIELD",
"target": "PROBOPASS"
}
]
@ -2199,7 +2199,7 @@
"species": "SKITTY",
"evos": [
{
"method": "EVO_STONE",
"method": "EVO_USE_ITEM",
"target": "DELCATTY",
"param": "ITEM_MOON_STONE"
}
@ -2289,7 +2289,7 @@
"species": "ROSELIA",
"evos": [
{
"method": "EVO_STONE",
"method": "EVO_USE_ITEM",
"target": "ROSERADE",
"param": "ITEM_SHINY_STONE"
}
@ -2515,7 +2515,7 @@
"species": "FEEBAS",
"evos": [
{
"method": "EVO_BEAUTY",
"method": "EVO_LEVEL_BEAUTY",
"target": "MILOTIC",
"param": 170
}
@ -2561,7 +2561,7 @@
"species": "DUSCLOPS",
"evos": [
{
"method": "EVO_TRADE_ITEM",
"method": "EVO_TRADE_HELD_ITEM",
"target": "DUSKNOIR",
"param": "ITEM_REAPER_CLOTH"
}
@ -2598,7 +2598,7 @@
"param": 42
},
{
"method": "EVO_STONE_FEMALE",
"method": "EVO_USE_ITEM_FEMALE",
"target": "FROSLASS",
"param": "ITEM_DAWN_STONE"
}
@ -2636,12 +2636,12 @@
"species": "CLAMPERL",
"evos": [
{
"method": "EVO_TRADE_ITEM",
"method": "EVO_TRADE_HELD_ITEM",
"target": "HUNTAIL",
"param": "ITEM_DEEPSEATOOTH"
},
{
"method": "EVO_TRADE_ITEM",
"method": "EVO_TRADE_HELD_ITEM",
"target": "GOREBYSS",
"param": "ITEM_DEEPSEASCALE"
}
@ -2903,7 +2903,7 @@
"species": "BUDEW",
"evos": [
{
"method": "EVO_FRIENDSHIP_DAY",
"method": "EVO_LEVEL_FRIENDSHIP_DAY",
"target": "ROSELIA"
}
]
@ -3045,7 +3045,7 @@
"species": "BUNEARY",
"evos": [
{
"method": "EVO_FRIENDSHIP",
"method": "EVO_LEVEL_FRIENDSHIP",
"target": "LOPUNNY"
}
]
@ -3080,7 +3080,7 @@
"species": "CHINGLING",
"evos": [
{
"method": "EVO_FRIENDSHIP_NIGHT",
"method": "EVO_LEVEL_FRIENDSHIP_NIGHT",
"target": "CHIMECHO"
}
]
@ -3117,7 +3117,7 @@
"species": "BONSLY",
"evos": [
{
"method": "EVO_HAS_MOVE",
"method": "EVO_LEVEL_KNOW_MOVE",
"target": "SUDOWOODO",
"param": "MOVE_MIMIC"
}
@ -3127,7 +3127,7 @@
"species": "MIME_JR",
"evos": [
{
"method": "EVO_HAS_MOVE",
"method": "EVO_LEVEL_KNOW_MOVE",
"target": "MR_MIME",
"param": "MOVE_MIMIC"
}
@ -3137,7 +3137,7 @@
"species": "HAPPINY",
"evos": [
{
"method": "EVO_ITEM_DAY",
"method": "EVO_LEVEL_HELD_ITEM_DAY",
"target": "CHANSEY",
"param": "ITEM_OVAL_STONE"
}
@ -3179,7 +3179,7 @@
"species": "MUNCHLAX",
"evos": [
{
"method": "EVO_FRIENDSHIP",
"method": "EVO_LEVEL_FRIENDSHIP",
"target": "SNORLAX"
}
]
@ -3188,7 +3188,7 @@
"species": "RIOLU",
"evos": [
{
"method": "EVO_FRIENDSHIP_DAY",
"method": "EVO_LEVEL_FRIENDSHIP_DAY",
"target": "LUCARIO"
}
]
@ -3261,7 +3261,7 @@
"species": "MANTYKE",
"evos": [
{
"method": "EVO_OTHER_PARTY_MON",
"method": "EVO_LEVEL_SPECIES_IN_PARTY",
"target": "MANTINE",
"param": "SPECIES_REMORAID"
}

View File

@ -13,6 +13,8 @@
#define MAX_IVS_SINGLE_STAT 31
#define MAX_FRIENDSHIP 255
#define FRIENDSHIP_EVO_THRESHOLD 220
// Pokemon types
#define TYPE_NONE 255
#define TYPE_NORMAL 0
@ -522,34 +524,41 @@ typedef enum {
typedef enum EvoMethod {
EVO_NONE = 0,
EVO_FRIENDSHIP,
EVO_FRIENDSHIP_DAY,
EVO_FRIENDSHIP_NIGHT,
EVO_LEVEL_FRIENDSHIP,
EVO_LEVEL_FRIENDSHIP_DAY,
EVO_LEVEL_FRIENDSHIP_NIGHT,
EVO_LEVEL,
EVO_TRADE,
EVO_TRADE_ITEM,
EVO_STONE,
EVO_TRADE_HELD_ITEM,
EVO_USE_ITEM,
EVO_LEVEL_ATK_GT_DEF,
EVO_LEVEL_ATK_EQ_DEF,
EVO_LEVEL_ATK_LT_DEF,
EVO_LEVEL_PID_LO,
EVO_LEVEL_PID_HI,
EVO_LEVEL_PID_LOW,
EVO_LEVEL_PID_HIGH,
EVO_LEVEL_NINJASK,
EVO_LEVEL_SHEDINJA,
EVO_BEAUTY,
EVO_STONE_MALE,
EVO_STONE_FEMALE,
EVO_ITEM_DAY,
EVO_ITEM_NIGHT,
EVO_HAS_MOVE,
EVO_OTHER_PARTY_MON,
EVO_LEVEL_BEAUTY,
EVO_USE_ITEM_MALE,
EVO_USE_ITEM_FEMALE,
EVO_LEVEL_HELD_ITEM_DAY,
EVO_LEVEL_HELD_ITEM_NIGHT,
EVO_LEVEL_KNOW_MOVE,
EVO_LEVEL_SPECIES_IN_PARTY,
EVO_LEVEL_MALE,
EVO_LEVEL_FEMALE,
EVO_CORONET,
EVO_ETERNA,
EVO_ROUTE217,
EVO_LEVEL_MAGNETIC_FIELD,
EVO_LEVEL_MOSS_ROCK,
EVO_LEVEL_ICE_ROCK,
} EvoMethod;
enum EvolutionContext {
EVO_CONTEXT_LEVEL_UP,
EVO_CONTEXT_TRADE,
EVO_CONTEXT_ITEM_CHECK,
EVO_CONTEXT_ITEM_USE,
};
enum GrowthRate {
GROWTH_MEDIUM_FAST = 0,
GROWTH_ERRATIC,

View File

@ -211,11 +211,12 @@ struct UnkStruct_02069038 {
struct Pokeanm anim;
};
struct Evolution {
typedef struct Evolution {
u16 method;
u16 param;
u16 target;
};
} Evolution;
#define MAX_MON_EVOLUTIONS 7
#define PARTY_SIZE 6
@ -294,7 +295,7 @@ u8 Pokemon_GetForm(Pokemon *mon);
void Species_LoadLevelUpLearnset(int species, int form, u16 *levelUpLearnset);
BoxPokemon *Pokemon_GetBoxMon(Pokemon *mon);
u16 GetMonEvolution(struct Party *party, Pokemon *mon, u32 context, u32 usedItem, u32 *method_ret);
u16 Pokemon_GetEvolutionTarget(struct Party *party, Pokemon *mon, u8 context, u32 evoParam, u32 *methodRet);
u16 ReadFromPersonalPmsNarc(u16 species);
u16 GetEggSpecies(u16 species);
BOOL Pokemon_TryLevelUp(Pokemon *mon);