Registrarse

[pokeruby] Añadir una flag personalizada para invocar pokémon brillantes

Lunos

Enfrentando a La Organización
Miembro insignia
Holi. El dia de hoy traigo algo bastante jugoso que recien recordé que tenia guardado.
ShantyTown lo compartió en Discord hace un huevo de tiempo y me parece una gran caracteristica.
El dia de hoy crearemos una flag personalizada que al usarla, hará que el siguiente pokémon que encontremos sea shiny.

Los creditos van para ShantyTown quien compartió la caracteristica y como implementarla justo aqui.
Sin mas que decir, comencemos.

Requisitos:
-Leer mi tema de introducción a Pokeruby.

Instrucciones:
Pues la verdad es que es extremadamente sencillo todo.
Entramos al link de GitHub previamente mencionado, vemos todas las lineas añadidas y replicamos esos cambios en los archivos pertinentes de nuestra carpeta Pokeruby.
Asi que:

1) Vamos a \pokeruby\data\maps y elegimos la carpeta con los archivos del mapa en el que queremos implementar la flag.

2) Abrimos el archivo "scripts.inc" y elegimos un Person Event que activará la flag tras interactuar con él.
En este caso yo quiero que el cartel "Ruta 101 - Pueblo Escaso" active la flag. ¿Que hago entonces?
Pues añado: "setflag FLAG_SET_SHINY_MON" a su script, al que puedo encontrar facilmente apoyandome en el archivo "text.inc".

El resultado es:
Route101_EventScript_14EA76:: @ 814EA76
msgbox Route101_Text_16D349, 3
setflag FLAG_SET_SHINY_MON
end​
Guardo el archivo y cierro.

3) Ahora nos movemos al siguiente cambio que ocurre en \pokeruby\include\constants\flags.h

Ctrl+F "FLAG_LANDMARK_BERRY_MASTERS_HOUSE", y dejando una linea de por medio, añadimos: "#define FLAG_SET_SHINY_MON (SYSTEM_FLAGS + 0x64)".
Guardo el archivo y cierro.

4) Ahora nos vamos al siguiente cambio que ocurre en \pokeruby\include\pokemon.h

Ctrl+F "bool8 IsShiny(struct Pokemon *mon);", creamos una nueva linea y añadimos "bool8 IsShinyOtIdPersonality(u32 otId, u32 personality);".
Guardo el archivo y cierro.

5) Ahora nos vamos al proximo archivo a modificar, que es en \pokeruby\src\pokemon_1.c

-Añadimos #include "constants/flags.h" en una nueva linea despues de #include "constants/abilities.h", que es la tercera.

-Añadimos #include "event_data.h en una nueva linea despues de #include "constants/species.h", que es la septima.

-Ctrl+F "level_up_learnset_pointers" y dejando una linea de por medio, añadimos "static u32 ForceShinyPersonality(u32 personality);".

-Ctrl+F "personality = Random32();", segundo resultado. Nos situamos al final de la linea, haremos una nueva e insertamos:
if (FlagGet(FLAG_SET_SHINY_MON))
{
personality = ForceShinyPersonality(personality);
}​
-Ctrl+F "CreateMon(mon, species, level, fixedIV, 1, personality" (Linea #1484 o #1492 dependiendo de la fecha en la que obtuvieron los archivos de pokeruby), nos situamos al final del corchete y dejando linea de por medio, añadimos:
static u32 ForceShinyPersonality(u32 personality)
{
int currentBit;
u32 playerOT = gSaveBlock2.playerTrainerId[0]
| (gSaveBlock2.playerTrainerId[1] << 8)
| (gSaveBlock2.playerTrainerId[2] << 16)
| (gSaveBlock2.playerTrainerId[3] << 24);
u16 otVal = (playerOT >> 16) ^ (playerOT & 0xFFFF);
u16 bitSelector = Random();
u16 personalityVal = (personality >> 16) ^ (personality & 0xFFFF);
for (currentBit = 3; currentBit < 16; currentBit++)
{
int shiftedBit = 1 << currentBit;
int otBitSet = (otVal & shiftedBit) != 0;
int personalityBitSet = (personalityVal & shiftedBit) != 0;
if (otBitSet + personalityBitSet == 1)
{
// Bits are different, so let's arbitrarily flip one of them such
// that the XOR of the folded OT and personality values will be 0.
if (bitSelector & shiftedBit)
personality ^= shiftedBit;
else
personality ^= (shiftedBit << 16);
}
}
return personality;
}​
6) Tras haber aplicado todos los cambios:
C:\cygwin64\Cygwin.bat
cd pokeruby
make
Y ya.

Aqui una muestra del resultado:


Explicación:
1) En scripts.inc estamos haciendo que un Person Event active la flag que hará que el siguiente pokémon que encontremos sea shiny tras interactuar con él.

2) En flags.h estamos añadiendo el macro FLAG_SET_SHINY_MON que se encarga de activarlo todo.

3) En pokemon.h estamos añadiendo una linea de codigo que será referido en pokemon_1.src y forzará al proximo pokémon a tener un valor de personalidad que lo hará shiny.(?)

4) En el archivo pokemon_1.src estamos añadiendo el efecto que esa linea de codigo tendrá, y tambien estamos añadiendo el codigo que ejectará la flag FLAG_SET_SHINY_MON si está activada.(?)

(?) = Intento interpretar lo que estoy leyendo sin saber un joraca sobre C.


S alguien que sepa sobre C lee este tema, seria genial que ofrezca una mejor explicación que la mia.

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

L!no

GBA Developer
Respuesta: Pokeruby | Añadir una flag personalizada para invocar pokémon brillantes

Basicamente crea una funcion que hace que el bit que marca si un pokemon es shiny o no se active, y luego añade un pedazo de codigo en el selector de personalidad, que si la flag shiny esta activa, llama a la funcion previamente mencionada.
luego, edita la funcion del wildbattle para que al finalizar la flag shiny se apague.
y en pokemon.h, lo unico que hace es añadir declaraciones de las funciones implementadas.
si alguien no entendio que avise :v

acerca del tuto, esta excelente @Lunos , todo muy bien explicado, y con info util.

Enviado desde mi SM-G531M mediante Tapatalk
 

Kaiser de Emperana

Called in hand
Respuesta: Pokeruby | Añadir una flag personalizada para invocar pokémon brillantes

No se si es que yo estoy ciego y no encuentro donde es que lo menciona el tutorial... Pero es imposible que esto funcione sin hacer los cambios del archivo "src/pokemon_1.c"

EDIT: Nevermind, me falla la comprensión lectora al parecer...
 
Última edición:

Eddie

U Got Woomy
Respuesta: Pokeruby | Añadir una flag personalizada para invocar pokémon brillantes

Aunque esta bien creo que es mas facil expandir la tabla de aparicion de shiny o por medio de evento estan los benditos Scripts,pero bueno se "agradece"
 

kakarotto

Leyenda de WaH
Re: Respuesta: Pokeruby | Añadir una flag personalizada para invocar pokémon brillantes

No se si es que yo estoy ciego y no encuentro donde es que lo menciona el tutorial... Pero es imposible que esto funcione sin hacer los cambios del archivo "src/pokemon_1.c"

EDIT: Nevermind, me falla la comprensión lectora al parecer...
Realmente @Monika lleva razón. Es un poco ambigua su explicacion y lo ha dejado pasar por alto, por lo que hay que mirar obligatoriamente el tuto en ingles para la funcion C
 

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: Re: Respuesta: Pokeruby | Añadir una flag personalizada para invocar pokémon brillantes

Realmente @Monika lleva razón. Es un poco ambigua su explicacion y lo ha dejado pasar por alto, por lo que hay que mirar obligatoriamente el tuto en ingles para la funcion C
La explicación de los cambios hechos, es solamente mi sencilla interpretación para que todo el mundo pueda entender mas o menos lo que hace cada cosa, como lo dije en el post principal.

Algo que tambien dije ahi es:
Y lo cierto es que puedo repetir exactamente lo mismo con el resto de archivos, pero es que no tiene sentido.
Todo es cuestión de observar, copiar, pegar, guardar y probar.
Aunque esta bien creo que es mas facil expandir la tabla de aparicion de shiny
No tengo ni idea de a que te refieres con "expandir la tabla de aparición de shiny".
o por medio de evento estan los benditos Scripts,pero bueno se "agradece"
El tema está en que justamente, en el ROM Hacking por metodo binario vos no podés spawnear un shiny usando un script a menos de que insertes una Rutina ASM como el Shinyzer.

Lo que este tutorial enseña es, justamente, a crear una flag que te permitirá forzar un shiny a placer en tus scripts. Yo diria que es especialmente util en pequeños eventos, como para darle una sorpresa al jugador.

Cabe decir que tambien podés saltarte la modificación al archivo wild_encounter.c y hacer que la flag funcione permanentemente hasta que la resetees. Algo asi se puede usar en regiones como el Archipielago Naranja, quizá.
La idea de usar shinies en reemplazo de una variación tropical se ha visto en Pokémon Adventure - Red Chapter, por ejemplo.
 
Última edición:

kakarotto

Leyenda de WaH
Re: Pokeruby | Añadir una flag personalizada para invocar pokémon brillantes

Lunos lo has hecho sin el archivo C?
 

KleinStudio

Un plato es un plato
Miembro del equipo
Webmaster
Respuesta: Re: Pokeruby | Añadir una flag personalizada para invocar pokémon brillantes

Lunos lo has hecho sin el archivo C?
No, a ver, es que la verdad es un poco lioso el tutorial, supongo que porque estamos acostumbrados a que nos den todo paso a paso.

Lunos dijo:
Entramos al link de GitHub previamente mencionado, vemos todas las lineas añadidas y replicamos esos cambios en los archivos pertinentes de nuestra carpeta Pokeruby.
O sea, que hay que hacer los mismos cambios que en el commit de Github (las líneas con el + y en verde son las nuevas líneas a añadir).

Obviamente solo con definir el flag y definir la función no va a funcionar mágicamente, tienes que añadir luego la función y hacer que se llame cuando se crea la personalidad del Pokémon en pokemon_1.c

@Lunos, tampoco son muchos archivos, estaría genial si pudieses poner los cambios en el código de la misma forma que está en el commit para que fuese más fácil de seguir el tutorial ;)
 

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: Pokeruby | Añadir una flag personalizada para invocar pokémon brillantes

Pensé que habia sido lo suficientemente claro al decir que el proceso es exactamente (y es que no va en broma, literalmente la misma explicación que di para los Pasos 2, 3 y 4 aplica a los dos pasos que no mencioné. El proceso es literalmente igual.) lo mismo que ya expliqué 3 veces en el tutorial.

Estoy seriamente preocupado, pero bueh, ya edité el primer post.
 

kakarotto

Leyenda de WaH
Re: Pokeruby | Añadir una flag personalizada para invocar pokémon brillantes

A ver..yo lo entendi a la primera que habia que editar el archivo .C, pero claro tras la duda de Monika y releerlo, ya no me quedo 100% claro y por eso mi pregunta, pero ya me extrañaba. Buen tutorial
 
Arriba