Registrarse

[pokeruby] Añadir la evolución por Nivel y Genero | Otros metodos evo. en los posts del tema

Lunos

Enfrentando a La Organización
Miembro insignia
Holi. El titulo es auto-explicativo.
Creditos para mi y para Shinny, que probando cosas logré hacer que esto funcionara y él me ayudó a corregir un error tonto que tuve por no saber de C.

Antes de comenzar con este tutorial, aprovecho para decirles que tienen este metodo y el resto de metodos evolutivos añadidos por Game Freak a los juegos de pokémon recientes justo aqui. Creditos a BluRose por ello.

Requisitos:
-Leer mi tema de introducción a Pokeruby.
-Editor de texto (yo usaré Notepad++)

Instrucciones:
1) Abriremos el archivo pokeruby\include\pokemon.h con nuestro editor de texto.
Nos vamos a la Linea 484, donde veremos lo siguiente:
#define EVO_FRIENDSHIP 0x0001 // Pokémon levels up with friendship ≥ 220
#define EVO_FRIENDSHIP_DAY 0x0002 // Pokémon levels up during the day with friendship ≥ 220
#define EVO_FRIENDSHIP_NIGHT 0x0003 // Pokémon levels up at night with friendship ≥ 220
#define EVO_LEVEL 0x0004 // Pokémon reaches the specified level
#define EVO_TRADE 0x0005 // Pokémon is traded
#define EVO_TRADE_ITEM 0x0006 // Pokémon is traded while it's holding the specified item
#define EVO_ITEM 0x0007 // specified item is used on Pokémon
#define EVO_LEVEL_ATK_GT_DEF 0x0008 // Pokémon reaches the specified level with attack > defense
#define EVO_LEVEL_ATK_EQ_DEF 0x0009 // Pokémon reaches the specified level with attack = defense
#define EVO_LEVEL_ATK_LT_DEF 0x000a // Pokémon reaches the specified level with attack < defense
#define EVO_LEVEL_SILCOON 0x000b // Pokémon reaches the specified level with a Silcoon personality value
#define EVO_LEVEL_CASCOON 0x000c // Pokémon reaches the specified level with a Cascoon personality value
#define EVO_LEVEL_NINJASK 0x000d // Pokémon reaches the specified level (special value for Ninjask)
#define EVO_LEVEL_SHEDINJA 0x000e // Pokémon reaches the specified level (special value for Shedinja)
#define EVO_BEAUTY 0x000f // Pokémon levels up with beauty ≥ specified value
Lo que haremos será definir un nuevo metodo evolutivo siguiendo el patrón que presenta el archivo.
Yo lo hice tal que asi:
#define EVO_FRIENDSHIP 0x0001 // Pokémon levels up with friendship ≥ 220
#define EVO_FRIENDSHIP_DAY 0x0002 // Pokémon levels up during the day with friendship ≥ 220
#define EVO_FRIENDSHIP_NIGHT 0x0003 // Pokémon levels up at night with friendship ≥ 220
#define EVO_LEVEL 0x0004 // Pokémon reaches the specified level
#define EVO_TRADE 0x0005 // Pokémon is traded
#define EVO_TRADE_ITEM 0x0006 // Pokémon is traded while it's holding the specified item
#define EVO_ITEM 0x0007 // specified item is used on Pokémon
#define EVO_LEVEL_ATK_GT_DEF 0x0008 // Pokémon reaches the specified level with attack > defense
#define EVO_LEVEL_ATK_EQ_DEF 0x0009 // Pokémon reaches the specified level with attack = defense
#define EVO_LEVEL_ATK_LT_DEF 0x000a // Pokémon reaches the specified level with attack < defense
#define EVO_LEVEL_SILCOON 0x000b // Pokémon reaches the specified level with a Silcoon personality value
#define EVO_LEVEL_CASCOON 0x000c // Pokémon reaches the specified level with a Cascoon personality value
#define EVO_LEVEL_NINJASK 0x000d // Pokémon reaches the specified level (special value for Ninjask)
#define EVO_LEVEL_SHEDINJA 0x000e // Pokémon reaches the specified level (special value for Shedinja)
#define EVO_BEAUTY 0x000f // Pokémon levels up with beauty ≥ specified value
#define EVO_GENDER_MALE 0x0010 // Pokémon levels up with a specific gender.
#define EVO_GENDER_FEMALE 0x0011 // Pokémon levels up with a specific gender.
2) Ahora abriremos el archivo pokeruby\constants\pokemon_data_constants.inc
Aquí haremos exactamente lo mismo que hicimos en el Paso 1.
Vamos a la Linea 64 y añadimos nuestro metodo evolutivo siguiendo el patrón que presenta el archivo.
.set EVO_FRIENDSHIP, 0x0001 @ Pokémon levels up with friendship ≥ 220
.set EVO_FRIENDSHIP_DAY, 0x0002 @ Pokémon levels up during the day with friendship ≥ 220
.set EVO_FRIENDSHIP_NIGHT, 0x0003 @ Pokémon levels up at night with friendship ≥ 220
.set EVO_LEVEL, 0x0004 @ Pokémon reaches the specified level
.set EVO_TRADE, 0x0005 @ Pokémon is traded
.set EVO_TRADE_ITEM, 0x0006 @ Pokémon is traded while it's holding the specified item
.set EVO_ITEM, 0x0007 @ specified item is used on Pokémon
.set EVO_LEVEL_ATK_GT_DEF, 0x0008 @ Pokémon reaches the specified level with attack > defense
.set EVO_LEVEL_ATK_EQ_DEF, 0x0009 @ Pokémon reaches the specified level with attack = defense
.set EVO_LEVEL_ATK_LT_DEF, 0x000a @ Pokémon reaches the specified level with attack < defense
.set EVO_LEVEL_SILCOON, 0x000b @ Pokémon reaches the specified level with a Silcoon personality value
.set EVO_LEVEL_CASCOON, 0x000c @ Pokémon reaches the specified level with a Cascoon personality value
.set EVO_LEVEL_NINJASK, 0x000d @ Pokémon reaches the specified level (special value for Ninjask)
.set EVO_LEVEL_SHEDINJA, 0x000e @ Pokémon reaches the specified level (special value for Shedinja)
.set EVO_BEAUTY, 0x000f @ Pokémon levels up with beauty ≥ specified value
.set EVO_GENDER_MALE, 0x0010 @ Pokémon levels up having a specific gender
.set EVO_GENDER_FEMALE, 0x0011 @ Pokémon levels up having a specific gender
3) Y por ultimo, abriremos el archivo pokeruby\src\pokemon_3.c
Aquí empezamos añadiendo una variable que comprobará el genero del pokémon de el Jugador.
La ubicaremos en la Linea 278, tal que asi:
u8 holdEffect;
u8 gender = GetMonGender(mon);
Luego nos vamos a la Linea 345.
Aquí podremos ver una tabla que contiene los distintos metodos evolutivos que el juego posee.
Evolución por amistad, nivel, PID, horario del dia y tal.
Pues lo que nosotros haremos, será añadir una evolución que compruebe si el pokémon del Jugador es macho o hembra, y tiene X nivel.
No puedo explicar como lo hice, porque lo unico que hice fue imitar lo que leia en este archivo :p
Código:
            case EVO_BEAUTY:
                if (gEvolutionTable[species][i].param <= beauty)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_GENDER_MALE:
                if (gEvolutionTable[species][i].param <= level && (gender) == 0)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
			case EVO_GENDER_FEMALE:
                if (gEvolutionTable[species][i].param <= level && (gender) == 254)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
Nota: Dejé a EVO_BEAUTY (el metodo que usa Feebas) en este trozo, para que se puedan situar mas facilmente.

Y lo cierto es que eso es todo.
Para usar nuestro nuevo metodo evolutivo (pokeruby\src\data\pokemon\evolution.h), sigan este ejemplo:
Código:
    [SPECIES_POOCHYENA]  = {{EVO_LEVEL, 18, SPECIES_MIGHTYENA},
                            {EVO_GENDER_MALE, 5, SPECIES_BULBASAUR},
                            {EVO_GENDER_FEMALE, 5, SPECIES_CHARMANDER}},
Al que verán en acción a continuación:


Si por algun motivo no entendieron este tutorial, pueden echarle un vistazo a estos archivos justo aqui.

Y eso es todo.​
 
Última edición:

kakarotto

Leyenda de WaH
Re: Añadir la evolución por Nivel y Genero (Burmy, Snorunt, etc)

Lo subes al nivel 5 y baja al nivel 4....lo has mirado?
 

KleinStudio

Un plato es un plato
Miembro del equipo
Webmaster
Respuesta: Re: Añadir la evolución por Nivel y Genero (Burmy, Snorunt, etc)

Lo más importante del tutorial más allá de añadir la evolución por género es que es que se hace fácil entender cómo añadir nuevos métodos de evolución, sean cuales sean, un gran aporte.

Lo subes al nivel 5 y baja al nivel 4....lo has mirado?
Probablemente sea por la experiencia base, supongo que en un Pokémon bien configurado para que evolucione no pasaría eso.
 

C.

Miembro Deshonroso
Respuesta: Añadir la evolución por Nivel y Genero (Burmy, Snorunt, etc)

Ste Lunos siempre trayendo cosas buenas y útiles...

Bueno, que mas decir, esto es un gran aporte que a parte de ayudar a añadir la evolución por genero, también ayuda con poder añadir otros tipos diferentes.

Sigue trayendo este tipo de cosas plz.
 

Lunos

Enfrentando a La Organización
Miembro insignia
Re: Añadir la evolución por Nivel y Genero (Burmy, Snorunt, etc)

Lo subes al nivel 5 y baja al nivel 4....lo has mirado?
Como lo dijo Klein, eso se debe al grado de crecimiento de Bulbasaur y Charmander comparado a Poochyena, @kakarotto.
Yo simplemente elegí a Bulbasaur y Charmander a modo de prueba, pero si elegís a pokémon que tengan el mismo tipo de crecimiento que Poochyena como por ejemplo Mightyena, Arbok, Dugtrio, Eevee, etc, ese inconveniente no pasará.
 

BluRose

chiste, chiste
Respuesta: Añadir la evolución por Nivel y Genero (Burmy, Snorunt, etc)

hola a todos
estoy añadiendo todos los metodos de evolución que ya existen, lo postearé cuando regreso esta noche

PD:

okay! no añadí el metodo de inkay ni lo de shelmet y karrablast, pero pienso que todos están

/constants/pokemon_data_constants.inc:
Código:
	.set EVO_FRIENDSHIP,       0x0001 @ Pokémon levels up with friendship ≥ 220
	.set EVO_FRIENDSHIP_DAY,   0x0002 @ Pokémon levels up during the day with friendship ≥ 220
	.set EVO_FRIENDSHIP_NIGHT, 0x0003 @ Pokémon levels up at night with friendship ≥ 220
	.set EVO_LEVEL,            0x0004 @ Pokémon reaches the specified level
	.set EVO_TRADE,            0x0005 @ Pokémon is traded
	.set EVO_TRADE_ITEM,       0x0006 @ Pokémon is traded while it's holding the specified item
	.set EVO_ITEM,             0x0007 @ specified item is used on Pokémon
	.set EVO_LEVEL_ATK_GT_DEF, 0x0008 @ Pokémon reaches the specified level with attack > defense
	.set EVO_LEVEL_ATK_EQ_DEF, 0x0009 @ Pokémon reaches the specified level with attack = defense
	.set EVO_LEVEL_ATK_LT_DEF, 0x000a @ Pokémon reaches the specified level with attack < defense
	.set EVO_LEVEL_SILCOON,    0x000b @ Pokémon reaches the specified level with a Silcoon personality value
	.set EVO_LEVEL_CASCOON,    0x000c @ Pokémon reaches the specified level with a Cascoon personality value
	.set EVO_LEVEL_NINJASK,    0x000d @ Pokémon reaches the specified level (special value for Ninjask)
	.set EVO_LEVEL_SHEDINJA,   0x000e @ Pokémon reaches the specified level (special value for Shedinja)
	.set EVO_BEAUTY,           0x000f @ Pokémon levels up with beauty ≥ specified value
	.set EVO_LEVEL_MALE,       0x0010
	.set EVO_LEVEL_FEMALE,     0x0011
	.set EVO_ITEM_MALE,        0x0012
	.set EVO_ITEM_FEMALE,      0x0013
	.set EVO_MOVE,             0x0014
	.set EVO_MAPNUM,           0x0015
	.set EVO_LEVEL_DAY,        0x0016
	.set EVO_LEVEL_NIGHT,      0x0017
	.set EVO_ITEM_DAY,         0x0018
	.set EVO_ITEM_NIGHT,       0x0019
	.set EVO_LEVEL_MON,        0x001a
	.set EVO_LEVEL_DARK,       0x001b
	.set EVO_LEVEL_RAIN,       0x001c
en el fondo de /include/constants/maps.h:
Código:
#define MAP_GROUP(map) (MAP_##map >> 8)
#define MAP_NUM(map) (MAP_##map & 0xFF)

^incluido para mostrar donde yo lo puse

#define EVO_MAP_GROUP(map) (map >> 8)
#define EVO_MAP_NUM(map) (map & 0xFF)
en /include/pokemon.h:
Código:
#define EVO_BEAUTY           0x000f // Pokémon levels up with beauty ≥ specified value
#define EVO_LEVEL_MALE       0x0010 // Pokémon reaches specified level while male
#define EVO_LEVEL_FEMALE     0x0011 // Pokémon reaches specified level while female
#define EVO_ITEM_MALE        0x0012 // specified item is used on male Pokémon
#define EVO_ITEM_FEMALE      0x0013 // specified item is used on female Pokémon
#define EVO_MOVE             0x0014 // Pokémon levels up with specified move
#define EVO_MAPNUM           0x0015 // Pokémon levels up in specified map number
#define EVO_LEVEL_DAY        0x0016 // Pokémon reaches specified level in the day
#define EVO_LEVEL_NIGHT      0x0017 // Pokémon reaches specified level in the night
#define EVO_ITEM_DAY         0x0018 // Pokémon levels up while holding specified item during the day
#define EVO_ITEM_NIGHT       0x0019 // Pokémon levels up while holding specified item during the night
#define EVO_LEVEL_MON        0x001a // Pokémon levels up while specified mon is in the party
#define EVO_LEVEL_DARK       0x001b // Pokémon reaches specified level while a Dark-type Pokémon is in the party
#define EVO_LEVEL_RAIN       0x001c // Pokémon reaches specified level while raining in the overworld
en la parte superior de /src/data/pokemon/evolution.h:
Código:
#ifndef POKERUBY_EVOLUTION_H
#define POKERUBY_EVOLUTION_H

#include "constants/maps.h"

struct Evolution gEvolutionTable[NUM_SPECIES][5] =
y finalmente, la parte que tiene el código actual, src/pokemon_3.c:
los includes:
Código:
#include "global.h"
#include "constants/hold_effects.h"
#include "constants/items.h"
#include "constants/maps.h"
#include "constants/moves.h"
#include "constants/songs.h"
#include "constants/species.h"
#include "constants/weather.h"
#include "battle.h"
#include "battle_message.h"
#include "data2.h"
#include "event_data.h"
#include "field_weather.h"
#include "item.h"
#include "link.h"
#include "m4a.h"
#include "main.h"
#include "move_tutor_menu.h"
#include "pokemon.h"
#include "pokedex.h"
#include "random.h"
#include "overworld.h"
#include "party_menu.h"
#include "rom_8077ABC.h"
#include "rom_8094928.h"
#include "rtc.h"
#include "sound.h"
#include "sprite.h"
#include "string_util.h"
#include "text.h"
#include "trainer.h"
#include "util.h"
#include "ewram.h"
y ahora GetEvolutionTargetSpecies:
Código:
u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem)
{
    int i;
    int j;
    u16 targetSpecies = 0;
    u16 species = GetMonData(mon, MON_DATA_SPECIES, 0);
    u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0);
    u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0);
    u8 level;
    u16 friendship;
    u8 beauty = GetMonData(mon, MON_DATA_BEAUTY, 0);
    u16 upperPersonality = personality >> 16;
    u8 holdEffect;
    u8 gender = GetMonGender(mon);
    u8 mapGroup = gSaveBlock1.location.mapGroup;
    u8 mapNum = gSaveBlock1.location.mapNum;

    if (heldItem == ITEM_ENIGMA_BERRY)
        holdEffect = gSaveBlock1.enigmaBerry.holdEffect;
    else
        holdEffect = ItemId_GetHoldEffect(heldItem);

    if (holdEffect == HOLD_EFFECT_PREVENT_EVOLVE && type != 3)
        return 0;

    switch (type)
    {
    case 0:
        level = GetMonData(mon, MON_DATA_LEVEL, 0);
        friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0);

        for (i = 0; i < 5; i++)
        {
            switch (gEvolutionTable[species][i].method)
            {
            case EVO_FRIENDSHIP:
                if (friendship >= 220)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_FRIENDSHIP_DAY:
                RtcCalcLocalTime();
                if (gLocalTime.hours >= 12 && gLocalTime.hours < 24 && friendship >= 220)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_FRIENDSHIP_NIGHT:
                RtcCalcLocalTime();
                if (gLocalTime.hours >= 0 && gLocalTime.hours < 12 && friendship >= 220)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_LEVEL:
                if (gEvolutionTable[species][i].param <= level)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_LEVEL_ATK_GT_DEF:
                if (gEvolutionTable[species][i].param <= level)
                    if (GetMonData(mon, MON_DATA_ATK, 0) > GetMonData(mon, MON_DATA_DEF, 0))
                        targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_LEVEL_ATK_EQ_DEF:
                if (gEvolutionTable[species][i].param <= level)
                    if (GetMonData(mon, MON_DATA_ATK, 0) == GetMonData(mon, MON_DATA_DEF, 0))
                        targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_LEVEL_ATK_LT_DEF:
                if (gEvolutionTable[species][i].param <= level)
                    if (GetMonData(mon, MON_DATA_ATK, 0) < GetMonData(mon, MON_DATA_DEF, 0))
                        targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_LEVEL_SILCOON:
                if (gEvolutionTable[species][i].param <= level && (upperPersonality % 10) <= 4)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_LEVEL_CASCOON:
                if (gEvolutionTable[species][i].param <= level && (upperPersonality % 10) > 4)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_LEVEL_NINJASK:
                if (gEvolutionTable[species][i].param <= level)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_BEAUTY:
                if (gEvolutionTable[species][i].param <= beauty)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_LEVEL_MALE:
                if (gEvolutionTable[species][i].param <= level && gender == MON_MALE)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_LEVEL_FEMALE:
                if (gEvolutionTable[species][i].param <= level && gender == MON_FEMALE)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_MOVE:
                if (pokemon_has_move(&gPlayerParty[i], gEvolutionTable[species][i].param) == TRUE)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_MAPNUM:
                if (EVO_MAP_GROUP(gEvolutionTable[species][i].param) == mapGroup && EVO_MAP_NUM(gEvolutionTable[species][i].param) == mapNum)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_LEVEL_DAY:
                RtcCalcLocalTime();
                if (gLocalTime.hours >= 12 && gLocalTime.hours < 24 && gEvolutionTable[species][i].param <= level)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_LEVEL_NIGHT:
                RtcCalcLocalTime();
                if (gLocalTime.hours >= 0 && gLocalTime.hours < 12 && gEvolutionTable[species][i].param <= level)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_ITEM_DAY:
                RtcCalcLocalTime();
                if (gLocalTime.hours >= 12 && gLocalTime.hours < 24 && gEvolutionTable[species][i].param == heldItem)
                {
                    heldItem = 0;
                    SetMonData(mon, MON_DATA_HELD_ITEM, &heldItem);
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                }
                break;
            case EVO_ITEM_NIGHT:
                RtcCalcLocalTime();
                if (gLocalTime.hours >= 0 && gLocalTime.hours < 12 && gEvolutionTable[species][i].param == heldItem)
                {
                    heldItem = 0;
                    SetMonData(mon, MON_DATA_HELD_ITEM, &heldItem);
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                }
                break;
            case EVO_LEVEL_MON:
                for (j = 0; j < PARTY_SIZE; j++)
                {
                    u16 checkSpecies = GetMonData(&gPlayerParty[j], MON_DATA_SPECIES, NULL);
                    if (checkSpecies == gEvolutionTable[species][i].param)
                        targetSpecies = gEvolutionTable[species][i].targetSpecies;
                }	
                break;
            case EVO_LEVEL_DARK:
                for (j = 0; j < PARTY_SIZE; j++)
                {
                    u16 checkType1 = gBaseStats[GetMonData(&gPlayerParty[j], MON_DATA_SPECIES, NULL)].type1;
                    u16 checkType2 = gBaseStats[GetMonData(&gPlayerParty[j], MON_DATA_SPECIES, NULL)].type2;
                    if ((checkType1 == TYPE_DARK || checkType2 == TYPE_DARK) && gEvolutionTable[species][i].param <= level  && i != j) // i != j because pancham can't evolve itself
                        targetSpecies = gEvolutionTable[species][i].targetSpecies;
                }	
                break;
            case EVO_LEVEL_RAIN:
                if ((GetCurrentWeather() == WEATHER_RAIN_LIGHT
                    || GetCurrentWeather() == WEATHER_RAIN_MED
                    || GetCurrentWeather() == WEATHER_RAIN_HEAVY)
                    && gEvolutionTable[species][i].param <= level)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            }
        }
        break;
    case 1:
        for (i = 0; i < 5; i++)
        {
            switch (gEvolutionTable[species][i].method)
            {
            case EVO_TRADE:
                targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_TRADE_ITEM:
                if (gEvolutionTable[species][i].param == heldItem)
                {
                    heldItem = 0;
                    SetMonData(mon, MON_DATA_HELD_ITEM, &heldItem);
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                }
                break;
            }
        }
        break;
    case 2:
    case 3:
        RtcCalcLocalTime();
        for (i = 0; i < 5; i++)
        {
            if ((gEvolutionTable[species][i].method == EVO_ITEM && gEvolutionTable[species][i].param == evolutionItem)
             || (gEvolutionTable[species][i].method == EVO_ITEM_MALE && gEvolutionTable[species][i].param == evolutionItem && gender == MON_MALE)
             || (gEvolutionTable[species][i].method == EVO_ITEM_FEMALE && gEvolutionTable[species][i].param == evolutionItem && gender == MON_FEMALE))
            {
                targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            }
        }
        break;
    }

    return targetSpecies;
}

si les gustaría ver todos los cambios en lugar de ver mi mensaje grande que tiene mucha información, aquí está un commit en github que muestra todos los cambios (no des ninguna atención a calculate_base_damage.c)
https://github.com/BluRosie/pokeruby-edits/commit/6e3081dc69f909a41e401405a71afbd08ef51125

PD: quitar el objeto cuando es usado para la evolución
https://github.com/BluRosie/pokeruby-edits/commit/967773d9db8459a1d4372d99d3f398eaaa5c4bf1
 
Última edición:

Lunos

Enfrentando a La Organización
Miembro insignia
Re: Respuesta: Añadir la evolución por Nivel y Genero (Burmy, Snorunt, etc)

hola a todos
estoy añadiendo todos los metodos de evolución que ya existen, lo postearé cuando regreso esta noche

PD:

okay! no añadí el metodo de inkay ni lo de shelmet y karrablast, pero pienso que todos están

/constants/pokemon_data_constants.inc:
Código:
	.set EVO_FRIENDSHIP,       0x0001 @ Pokémon levels up with friendship ≥ 220
	.set EVO_FRIENDSHIP_DAY,   0x0002 @ Pokémon levels up during the day with friendship ≥ 220
	.set EVO_FRIENDSHIP_NIGHT, 0x0003 @ Pokémon levels up at night with friendship ≥ 220
	.set EVO_LEVEL,            0x0004 @ Pokémon reaches the specified level
	.set EVO_TRADE,            0x0005 @ Pokémon is traded
	.set EVO_TRADE_ITEM,       0x0006 @ Pokémon is traded while it's holding the specified item
	.set EVO_ITEM,             0x0007 @ specified item is used on Pokémon
	.set EVO_LEVEL_ATK_GT_DEF, 0x0008 @ Pokémon reaches the specified level with attack > defense
	.set EVO_LEVEL_ATK_EQ_DEF, 0x0009 @ Pokémon reaches the specified level with attack = defense
	.set EVO_LEVEL_ATK_LT_DEF, 0x000a @ Pokémon reaches the specified level with attack < defense
	.set EVO_LEVEL_SILCOON,    0x000b @ Pokémon reaches the specified level with a Silcoon personality value
	.set EVO_LEVEL_CASCOON,    0x000c @ Pokémon reaches the specified level with a Cascoon personality value
	.set EVO_LEVEL_NINJASK,    0x000d @ Pokémon reaches the specified level (special value for Ninjask)
	.set EVO_LEVEL_SHEDINJA,   0x000e @ Pokémon reaches the specified level (special value for Shedinja)
	.set EVO_BEAUTY,           0x000f @ Pokémon levels up with beauty ≥ specified value
	.set EVO_LEVEL_MALE,       0x0010
	.set EVO_LEVEL_FEMALE,     0x0011
	.set EVO_ITEM_MALE,        0x0012
	.set EVO_ITEM_FEMALE,      0x0013
	.set EVO_MOVE,             0x0014
	.set EVO_MAPNUM,           0x0015
	.set EVO_LEVEL_DAY,        0x0016
	.set EVO_LEVEL_NIGHT,      0x0017
	.set EVO_ITEM_DAY,         0x0018
	.set EVO_ITEM_NIGHT,       0x0019
	.set EVO_LEVEL_MON,        0x001a
	.set EVO_LEVEL_DARK,       0x001b
	.set EVO_LEVEL_RAIN,       0x001c
en el fondo de /include/constants/maps.h:
Código:
#define MAP_GROUP(map) (MAP_##map >> 8)
#define MAP_NUM(map) (MAP_##map & 0xFF)

^incluido para mostrar donde yo lo puse

#define EVO_MAP_GROUP(map) (map >> 8)
#define EVO_MAP_NUM(map) (map & 0xFF)
en /include/pokemon.h:
Código:
#define EVO_BEAUTY           0x000f // Pokémon levels up with beauty ≥ specified value
#define EVO_LEVEL_MALE       0x0010 // Pokémon reaches specified level while male
#define EVO_LEVEL_FEMALE     0x0011 // Pokémon reaches specified level while female
#define EVO_ITEM_MALE        0x0012 // specified item is used on male Pokémon
#define EVO_ITEM_FEMALE      0x0013 // specified item is used on female Pokémon
#define EVO_MOVE             0x0014 // Pokémon levels up with specified move
#define EVO_MAPNUM           0x0015 // Pokémon levels up in specified map number
#define EVO_LEVEL_DAY        0x0016 // Pokémon reaches specified level in the day
#define EVO_LEVEL_NIGHT      0x0017 // Pokémon reaches specified level in the night
#define EVO_ITEM_DAY         0x0018 // Pokémon levels up while holding specified item during the day
#define EVO_ITEM_NIGHT       0x0019 // Pokémon levels up while holding specified item during the night
#define EVO_LEVEL_MON        0x001a // Pokémon levels up while specified mon is in the party
#define EVO_LEVEL_DARK       0x001b // Pokémon reaches specified level while a Dark-type Pokémon is in the party
#define EVO_LEVEL_RAIN       0x001c // Pokémon reaches specified level while raining in the overworld
en la parte superior de /src/data/pokemon/evolution.h:
Código:
#ifndef POKERUBY_EVOLUTION_H
#define POKERUBY_EVOLUTION_H

#include "constants/maps.h"

struct Evolution gEvolutionTable[NUM_SPECIES][5] =
y finalmente, la parte que tiene el código actual, src/pokemon_3.c:
los includes:
Código:
#include "global.h"
#include "constants/hold_effects.h"
#include "constants/items.h"
#include "constants/maps.h"
#include "constants/moves.h"
#include "constants/songs.h"
#include "constants/species.h"
#include "constants/weather.h"
#include "battle.h"
#include "battle_message.h"
#include "data2.h"
#include "event_data.h"
#include "field_weather.h"
#include "item.h"
#include "link.h"
#include "m4a.h"
#include "main.h"
#include "move_tutor_menu.h"
#include "pokemon.h"
#include "pokedex.h"
#include "random.h"
#include "overworld.h"
#include "party_menu.h"
#include "rom_8077ABC.h"
#include "rom_8094928.h"
#include "rtc.h"
#include "sound.h"
#include "sprite.h"
#include "string_util.h"
#include "text.h"
#include "trainer.h"
#include "util.h"
#include "ewram.h"
y ahora GetEvolutionTargetSpecies:
Código:
u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem)
{
    int i;
    int j;
    u16 targetSpecies = 0;
    u16 species = GetMonData(mon, MON_DATA_SPECIES, 0);
    u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0);
    u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0);
    u8 level;
    u16 friendship;
    u8 beauty = GetMonData(mon, MON_DATA_BEAUTY, 0);
    u16 upperPersonality = personality >> 16;
    u8 holdEffect;
    u8 gender = GetMonGender(mon);
    u8 mapGroup = gSaveBlock1.location.mapGroup;
    u8 mapNum = gSaveBlock1.location.mapNum;

    if (heldItem == ITEM_ENIGMA_BERRY)
        holdEffect = gSaveBlock1.enigmaBerry.holdEffect;
    else
        holdEffect = ItemId_GetHoldEffect(heldItem);

    if (holdEffect == HOLD_EFFECT_PREVENT_EVOLVE && type != 3)
        return 0;

    switch (type)
    {
    case 0:
        level = GetMonData(mon, MON_DATA_LEVEL, 0);
        friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0);

        for (i = 0; i < 5; i++)
        {
            switch (gEvolutionTable[species][i].method)
            {
            case EVO_FRIENDSHIP:
                if (friendship >= 220)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_FRIENDSHIP_DAY:
                RtcCalcLocalTime();
                if (gLocalTime.hours >= 12 && gLocalTime.hours < 24 && friendship >= 220)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_FRIENDSHIP_NIGHT:
                RtcCalcLocalTime();
                if (gLocalTime.hours >= 0 && gLocalTime.hours < 12 && friendship >= 220)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_LEVEL:
                if (gEvolutionTable[species][i].param <= level)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_LEVEL_ATK_GT_DEF:
                if (gEvolutionTable[species][i].param <= level)
                    if (GetMonData(mon, MON_DATA_ATK, 0) > GetMonData(mon, MON_DATA_DEF, 0))
                        targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_LEVEL_ATK_EQ_DEF:
                if (gEvolutionTable[species][i].param <= level)
                    if (GetMonData(mon, MON_DATA_ATK, 0) == GetMonData(mon, MON_DATA_DEF, 0))
                        targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_LEVEL_ATK_LT_DEF:
                if (gEvolutionTable[species][i].param <= level)
                    if (GetMonData(mon, MON_DATA_ATK, 0) < GetMonData(mon, MON_DATA_DEF, 0))
                        targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_LEVEL_SILCOON:
                if (gEvolutionTable[species][i].param <= level && (upperPersonality % 10) <= 4)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_LEVEL_CASCOON:
                if (gEvolutionTable[species][i].param <= level && (upperPersonality % 10) > 4)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_LEVEL_NINJASK:
                if (gEvolutionTable[species][i].param <= level)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_BEAUTY:
                if (gEvolutionTable[species][i].param <= beauty)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_LEVEL_MALE:
                if (gEvolutionTable[species][i].param <= level && gender == MON_MALE)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_LEVEL_FEMALE:
                if (gEvolutionTable[species][i].param <= level && gender == MON_FEMALE)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_MOVE:
                if (pokemon_has_move(&gPlayerParty[i], gEvolutionTable[species][i].param) == TRUE)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_MAPNUM:
                if (EVO_MAP_GROUP(gEvolutionTable[species][i].param) == mapGroup && EVO_MAP_NUM(gEvolutionTable[species][i].param) == mapNum)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_LEVEL_DAY:
                RtcCalcLocalTime();
                if (gLocalTime.hours >= 12 && gLocalTime.hours < 24 && gEvolutionTable[species][i].param <= level)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_LEVEL_NIGHT:
                RtcCalcLocalTime();
                if (gLocalTime.hours >= 0 && gLocalTime.hours < 12 && gEvolutionTable[species][i].param <= level)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_ITEM_DAY:
                RtcCalcLocalTime();
                if (gLocalTime.hours >= 12 && gLocalTime.hours < 24 && gEvolutionTable[species][i].param == heldItem)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_ITEM_NIGHT:
                RtcCalcLocalTime();
                if (gLocalTime.hours >= 0 && gLocalTime.hours < 12 && gEvolutionTable[species][i].param == heldItem)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_LEVEL_MON:
                for (j = 0; j < PARTY_SIZE; j++)
				{
                    u16 checkSpecies = GetMonData(&gPlayerParty[j], MON_DATA_SPECIES, NULL);
                    if (checkSpecies == gEvolutionTable[species][i].param)
                        targetSpecies = gEvolutionTable[species][i].targetSpecies;
                }	
                break;
            case EVO_LEVEL_DARK:
                for (j = 0; j < PARTY_SIZE; j++)
                {
                    u16 checkType1 = gBaseStats[GetMonData(&gPlayerParty[j], MON_DATA_SPECIES, NULL)].type1;
                    u16 checkType2 = gBaseStats[GetMonData(&gPlayerParty[j], MON_DATA_SPECIES, NULL)].type2;
                    if ((checkType1 == TYPE_DARK || checkType2 == TYPE_DARK) && gEvolutionTable[species][i].param <= level  && i != j) // i != j because pancham can't evolve itself
                        targetSpecies = gEvolutionTable[species][i].targetSpecies;
                }	
                break;
            case EVO_LEVEL_RAIN:
                if ((GetCurrentWeather() == WEATHER_RAIN_LIGHT
                    || GetCurrentWeather() == WEATHER_RAIN_MED
                    || GetCurrentWeather() == WEATHER_RAIN_HEAVY)
                    && gEvolutionTable[species][i].param <= level)
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            }
        }
        break;
    case 1:
        for (i = 0; i < 5; i++)
        {
            switch (gEvolutionTable[species][i].method)
            {
            case EVO_TRADE:
                targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            case EVO_TRADE_ITEM:
                if (gEvolutionTable[species][i].param == heldItem)
                {
                    heldItem = 0;
                    SetMonData(mon, MON_DATA_HELD_ITEM, &heldItem);
                    targetSpecies = gEvolutionTable[species][i].targetSpecies;
                }
                break;
            }
        }
        break;
    case 2:
    case 3:
        RtcCalcLocalTime();
        for (i = 0; i < 5; i++)
        {
            if ((gEvolutionTable[species][i].method == EVO_ITEM && gEvolutionTable[species][i].param == evolutionItem)
             || (gEvolutionTable[species][i].method == EVO_ITEM_MALE && gEvolutionTable[species][i].param == evolutionItem && gender == MON_MALE)
             || (gEvolutionTable[species][i].method == EVO_ITEM_FEMALE && gEvolutionTable[species][i].param == evolutionItem && gender == MON_FEMALE))
            {
                targetSpecies = gEvolutionTable[species][i].targetSpecies;
                break;
            }
        }
        break;
    }

    return targetSpecies;
}

si les gustaría ver todos los cambios en lugar de ver mi mensaje grande que tiene mucha información, aquí está un commit en github que muestra todos los cambios (no des ninguna atención a calculate_base_damage.c)
https://github.com/BluRosie/pokeruby-edits/commit/6e3081dc69f909a41e401405a71afbd08ef51125
Esto si que es un tremendisimo aporte.
Yo he probado la evolución por mapa y por movimiento, y funcionan de maravilla.


Muchisimas gracias Blu, este es un precioso aporte
 
Arriba