Diego Mertens
Dartrix Joven
Hola! Desde hace unos días, he estado desarrollando el sistema de combos de capturas para Pokeemerald, y creo que ya está lo suficientemente completo como para compartirlo con ustedes, contando con las siguientes características:
github.com
Código (pondré en spoilers los códigos grandes):
Primero, definimos las variables, vayan a "include/constants/vars.h"
Y renombren alguna variable sin usar como las siguientes:
VAR_CHAIN
Y
VAR_SPECIESCHAINED
En "src/battle_setup.c" añadiremos esto debajo de "static const u8 *GetTrainerCantBattleSpeech(void)" :
Luego, reemplazaremos toda la función "static void CB2_EndWildBattle(void)" con esto:
Cuando hagamos eso, buscamos la función "bool8 IsShinyOtIdPersonality(u32 otId, u32 personality)" en el archivo "src/pokemon.c" y reemplazamos la línea que dice "if (shinyValue < SHINY_ODDS)" con esto:
Al terminar, en el mismo archivo buscamos "void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId)" y reemplazaremos la definición de los IV con esto:
Después, nos vamos a "data/scripts/" y creamos un archivo llamado "chain.inc", y pegamos el siguiente código dentro:
Luego, debemos ir a "src/overworld.c", y en la función "void CB2_WhiteOut(void)", agregamos estas dos líneas al final de la misma:
Y debemos definir el archivo que acabamos de crear en "data/event_scripts.s", por lo que entramos y al final, añadimos esto:
Y con eso, lo tenemos todo listo, cada vez que derrotemos 3 Pokémon salvajes iguales seguidos, aparecerá un mensaje luego del combate que dice el número de la cadena y el Pokémon que estamos buscando, aumentando sus IV y sus probabilidades de ser shiny mientras aumenta la cadena.




- Los IV de los Pokémon aumentan dependiendo de la cadena, siendo que a partir de 10, el nivel de cadena determina los IV de los Pokémon.
- La probabilidad de encontrarse con un Pokémon shiny aumenta, hasta un máximo de un 0,2%, o una probabilidad de 1 entre 348.
- La cadena puede completarse capturando o derrotando al Pokémon salvaje. Escapar de un Pokémon que no era el que buscabas no rompe la cadena.
- Añadir Pokémon raros a las rutas (que normalmente no aparecen) cuando la cadena suba.
- Aumentar la probabilidad de que el Pokémon que buscas aparezca cuando la cadena suba.
- Hacer que Pokémon con menor probabilidad de aparición sean más comunes cuando la cadena suba.
- Evitar la ruptura de la cadena si se hace un combate contra un entrenador.
GitHub - mertens2/pokeemerald: Decompilation of Pokémon Emerald
Decompilation of Pokémon Emerald. Contribute to mertens2/pokeemerald development by creating an account on GitHub.

Primero, definimos las variables, vayan a "include/constants/vars.h"
Y renombren alguna variable sin usar como las siguientes:
VAR_CHAIN
Y
VAR_SPECIESCHAINED
En "src/battle_setup.c" añadiremos esto debajo de "static const u8 *GetTrainerCantBattleSpeech(void)" :
C++:
extern const u8 ChainNumber[];
extern const u8 AddChain[];
C++:
static void CB2_EndWildBattle(void)
{
u16 species;
u16 ptr;
u8 nickname[POKEMON_NAME_LENGTH + 1];
u16 lastPokemonFound;
species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES);
CpuFill16(0, (void*)(BG_PLTT), BG_PLTT_SIZE);
ResetOamRange(0, 128);
if (IsPlayerDefeated(gBattleOutcome) == TRUE && !InBattlePyramid() && !InBattlePike())
{
SetMainCallback2(CB2_WhiteOut);
}
else
{
if ((gBattleOutcome != B_OUTCOME_WON) && (gBattleOutcome != B_OUTCOME_CAUGHT))
{
if (species == VarGet(VAR_SPECIESCHAINED) && VarGet(VAR_CHAIN) >= 1)
{
VarSet(VAR_CHAIN,0);
VarSet(VAR_SPECIESCHAINED,0);
}
else if ((species != VarGet(VAR_SPECIESCHAINED)) && (VarGet(VAR_CHAIN) >= 1))
species = VarGet(VAR_SPECIESCHAINED);
}
else if ((gBattleOutcome == B_OUTCOME_WON) || (gBattleOutcome == B_OUTCOME_CAUGHT))
{
if (VarGet(VAR_CHAIN) == 0)
{
VarSet(VAR_SPECIESCHAINED,species);
ScriptContext1_SetupScript(AddChain);
}
else if ((species == VarGet(VAR_SPECIESCHAINED)) && VarGet(VAR_CHAIN) >=30)
VarSet(VAR_CHAIN,30);
else if ((species == VarGet(VAR_SPECIESCHAINED)) && VarGet(VAR_CHAIN) >=3)
{
GetSpeciesName(gStringVar2 ,VarGet(VAR_SPECIESCHAINED));
ScriptContext1_SetupScript(ChainNumber);
}
else if ((species == VarGet(VAR_SPECIESCHAINED)) && (VarGet(VAR_CHAIN) ==2 || VarGet(VAR_CHAIN) ==1))
ScriptContext1_SetupScript(AddChain);
else if ((species != VarGet(VAR_SPECIESCHAINED)) && (VarGet(VAR_CHAIN) != 0))
VarSet(VAR_CHAIN,0);
VarSet(VAR_SPECIESCHAINED,species);
}
SetMainCallback2(CB2_ReturnToField);
gFieldCallback = sub_80AF6F0;
}
}
C++:
if (shinyValue < (SHINY_ODDS + (VarGet(VAR_CHAIN))*6))
C++:
if (VarGet(VAR_CHAIN) >=10)
{
u32 iv;
iv = VarGet(VAR_CHAIN);
SetBoxMonData(boxMon, MON_DATA_HP_IV, &iv);
SetBoxMonData(boxMon, MON_DATA_ATK_IV, &iv);
SetBoxMonData(boxMon, MON_DATA_DEF_IV, &iv);
SetBoxMonData(boxMon, MON_DATA_SPEED_IV, &iv);
SetBoxMonData(boxMon, MON_DATA_SPATK_IV, &iv);
SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, &iv);
}
else if (VarGet(VAR_CHAIN) ==30)
{
u32 iv;
iv = 31;
SetBoxMonData(boxMon, MON_DATA_HP_IV, &iv);
SetBoxMonData(boxMon, MON_DATA_ATK_IV, &iv);
SetBoxMonData(boxMon, MON_DATA_DEF_IV, &iv);
SetBoxMonData(boxMon, MON_DATA_SPEED_IV, &iv);
SetBoxMonData(boxMon, MON_DATA_SPATK_IV, &iv);
SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, &iv);
}
else
{
u32 iv;
value = Random();
iv = value & 0x1F;
SetBoxMonData(boxMon, MON_DATA_HP_IV, &iv);
iv = (value & 0x3E0) >> 5;
SetBoxMonData(boxMon, MON_DATA_ATK_IV, &iv);
iv = (value & 0x7C00) >> 10;
SetBoxMonData(boxMon, MON_DATA_DEF_IV, &iv);
value = Random();
iv = value & 0x1F;
SetBoxMonData(boxMon, MON_DATA_SPEED_IV, &iv);
iv = (value & 0x3E0) >> 5;
SetBoxMonData(boxMon, MON_DATA_SPATK_IV, &iv);
iv = (value & 0x7C00) >> 10;
SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, &iv);
}
Después, nos vamos a "data/scripts/" y creamos un archivo llamado "chain.inc", y pegamos el siguiente código dentro:
C++:
ChainNumber::
addvar VAR_CHAIN, 1
buffernumberstring 0, VAR_CHAIN
msgbox TextoCool, 2
end
TextoCool::
.string "Cadena: {STR_VAR_1}, de {STR_VAR_2}.$"
AddChain::
addvar VAR_CHAIN, 1
end
C++:
VarSet(VAR_CHAIN,0);
VarSet(VAR_SPECIESCHAINED,0);
Código:
.include "data/scripts/chain.inc"
Y con eso, lo tenemos todo listo, cada vez que derrotemos 3 Pokémon salvajes iguales seguidos, aparecerá un mensaje luego del combate que dice el número de la cadena y el Pokémon que estamos buscando, aumentando sus IV y sus probabilidades de ser shiny mientras aumenta la cadena.




Última edición: