Registrarse

[RPGXP] Hacer aparecer primer Pkm antes del combate y últimos tras finalizar

Pableroski

Novato - Rpg en desarrollo
Probado en RPG Maker – v16.2

El jugador tiene la opción de apagar o encender la dinámica. En caso de tenerla encendida, de poder elegir que esté presente en todos los combates o solo en los que consideremos importantes. Dejo enlace a un video demostración de la dinámica y un par de fotos de apoyo
ANTES DEL COMBATE
PREcombate.PNG

DESPUÉS DEL COMBATE
POSTcombate.PNG

LIMITACIONES:

-Incompatible con Follow Me (pkm acompañante). Quizás es un futuro pueda implementarse pero lo dudo.​

-Solo permite pkm hasta 5ª generación. Es posible ampliarlo pero de momento tendréis que hacerlo ustedes. Pienso hacerlo en una versión posterior.​
-Los pkm con diferentes formas (unown, castform, kyurem, rotom, etc) solo están programados para mostrar la primera forma. Se implementarán el resto en el futuro.​
-No disponible para combates dobles ni combates con entrenador acompañante. Pendiente de investigación para ver si es posible implementarlo o no.​

-Nidoran (macho y hembra) saldrá siempre por defecto macho al finalizar el combate a no ser que en pokemon.txt, en “name” (NO InternalName) a nidoran macho le añadáis ♂ y a nidoran hembra ♀. Esto es debido a que el nombre que aparece al combatir contra ellos es idéntico.​
-No cambiar el número de la especie pkm en pokemon.txt (PBS). Puede hacerse pero tendréis que reprogramar la llamada para cambiar los gráficos. Aconsejo no hacerlo. Tampoco cambiar el nombre de la especie (ni el interno ni el que sale en el juego al combatir). En caso de hacerlo, no saldrá el gráfico del pkm.​


PARTES DE LA DINÁMICA:

-Antes del combate: saca tanto mi primer pkm como el del contrario.​

-Después del combate: aparecen los dos últimos pkm en combatir, con el vencedor moviéndose en parado y el otro debilitado.​

-Extra: puede usarse para simplemente sacar el primer pkm de tu equipo en cualquier momento en el mapa.​


NECESARIO:

-Overworld de los pkm de la 1ª/5ª generación. Yo tenía los vestigios del Follow Me así que usé esos. También podéis buscarlos por internet. Hagáis lo que hagáis, tendréis que dar créditos si lo solicitan. Como yo aproveché los del Follow Me, tengo los archivos de los overworld nombrados “XXX.png” (y los shiny “XXXs.png”) Ej: crobat sería el 169.png. Mantener esa denominación.​

-Variables desde la 61 a la 65.​

-Interruptores: 2 cualesquiera. En mi código uso el [102], si queréis usar otro solo tenéis que cambiar el número buscando $game_switches[102] . El otro solo lo usaremos dentro del juego así que puede ser cualquiera.​


MODIFICACIONES DEL CÓDIGO:

Para esta dinámica habrá que tocar un poco de código principal, así que explicaré paso a paso las modificaciones que habrá que hacer. Más que nada son para recoger los datos del pkm que está combatiendo.

Hay que tener cuidado porque hay varias líneas iguales en la zona de los combates. Algunas se duplican por la existencia de los combates dobles o los combates con entrenador acompañante. Solo tocaremos la de los combates individuales.

-1. PokeBattle_Battle (1)
PokeBattle_Battle(1).PNG

Buscaremos esta parte del código en PokeBattle_Battle. Yo la tengo a partir de la línea 3930. Puede variar pero no demasiado. Es la parte donde ganamos el combate. Le añadiremos la parte que está marcada en rojo.
Código:
combate_victoria()
Y su explicación por si alguien quiere leerla
Llama a la función combate_victoria() (podéis verla más abajo en el código completo) en la que que si el interruptor 102 (el que decía antes que podíais cambiar si queríais) está activado (si queremos que se dé la dinámica), actualizará el gráfico de nuestro último pkm que haya combatido fuera de pantalla, y posteriormente actualizará el del oponente y refrescará el mapa. Las líneas extras que tiene el pkm del oponente se deben a que es más complicado saber cuál fue su último pkm.

-2. PokeBattle_Battle (2)
PokeBattle_Battle(2).PNG

Buscaremos esta parte del código en PokeBattle_Battle. Yo la tengo en torno a la línea 4010. Puede variar pero no demasiado. Es la parte donde perdemos el combate. Le añadiremos la parte que está marcada en rojo.
Código:
combate_derrota()
Y su explicación por si alguien quiere leerla
Llama a la función combate_derrota() (código). Misma utilidad que combate_ganado salvo que aquí el pkm al final del combate con la animación en parado activa será la del contrario.

-3. PokeBattle_Battle (3)
PokeBattle_Battle(3).PNG

En esa misma pestaña del código, PokeBattle_Battle, buscaremos en torno a la línea 1417 esa zona. Igual que antes, podría variar, pero no demasiado. Es la parte donde cambiamos de pkm. Añadimos la línea marcada.
Código:
$game_variables[62]=party[newpokename].species
Explicación
Guardará en la variable 62 el pkm que llamemos al combate tras un cambio.

-4. PokeBattle_Battler
PokeBattle_Battler.PNG

No confundir con PokeBattle_Battle. Buscamos la línea 776 y añadimos esa línea de código.
Código:
$game_variables[61]=pbThis
Explicación
Recoge el nombre que sale por pantalla del pkm oponente


AÑADIR SCRIPT:

Como siempre, encima del main pegáis el código. Dejo el enlace por si alguien quiere descargarlo. Dejaría el código aquí textual pero el mensaje sobrepasa el límite de caracteres.

Recoge el nombre que sale por pantalla del pkm oponente. Esto supone un problema, porque no es la especie, ni el código del pkm, sino el nombre textual. Ej: “Crobat rival”. Por eso hará falta luego de hacer uso de dos funciones para convertir esto a número de especie. Estas funciones son pkm_a_nombre_especie() y especie_pkm_a_numero(). En caso de que queráis ampliarlo a pkm de otras generaciones, tendréis que iros a especie_pkm_a_numero() y completarlo según lo tengo. pkm_a_nombre_especie() no hay que tocarla.

El código tiene dos funciones más, combate_primer_pkm(evento,direccion) y cambio_grafico_pkm(especie,evento,direccion,debilitado,nuestro). La primera sirve para establecer tu primer pokemon elegible del equipo. Con esa llamará a la segunda función y pondrá en el evento que elijas el gráfico de tu primer pkm con animación en parado.

Si no queréis usar el script para los combates siempre podéis usar esas dos últimas funciones para sacar a vuestro primer pkm elegible al mapa cuando queráis.

EN EL JUEGO:

El script lo que hace es actualizar el gráfico de un evento del mapa a los del pkm que tú elijas.

-USO PREVIO AL COMBATE:

-Si queremos que aparezca nuestro primer pkm y el del oponente antes del combate:​

MAPA
Eventos en mapa.PNG

Tendremos que crear dos eventos y dejarlos vacíos. Uno será para nuestro pkm y el otro para el del oponente. Yo prefiero dejarlo fuera de los bordes visibles pero podéis ponerlos donde queráis en realidad siempre que no molesten a la hora de jugar. También tendrás que dejar dos recuadros entre el NPC y tú como mínimo ya que tienen que caber los pkm.

Aquí podéis jugar con la posición del jugador ($game_player.x y $game_player.y) para ajustar la posición de vuestro personaje cuando el NPC te localice. O que el NPC se mueva hacia atrás una vez hable contigo antes de empezar el combate. Vuestra elección.



PÁGINA DE EVENTOS

Lo siguiente es opcional. Podréis programar vuestro juego pensando que en todos los combates se aplicará esta dinámica. En ese caso podéis saltaros los condicionales y llamar directamente al script. Pero yo prefiero darle esa opción al jugador, tener la dinámica implementada y que él sea quien decida si la usa o no, poder apagarla y encenderla. Al final pondré un ejemplo de cómo darle esta opción al jugador. Aquí lo que quiero es explicar cómo adaptar nuestros combates a esa situación.

Utilizar los dos interruptores que mencioné al inicio para condicionar la aparición de la dinámica. Si el interruptor [102] está apagado, el jugador tiene la dinámica desactivada y pasará directamente al combate (en este caso podrías hacer que el NPC se acerque lo máximo al jugador como es habitual). En cambio si está encendida y por tanto, la dinámica está activada, tenemos dos escenarios:

-Si consideramos el combate como importante, y la dinámica (interruptor [102]) está encendida, entonces siempre sacaremos los pkm. Quiere decir que en este caso nos saltaremos el condicional del segundo interruptor (103 en mi caso) y solo habrá que poner el principal
Combate Importante.PNG

-Si no consideramos el combate como importante, habría que hacer uso de los dos condicionales. [102] para ver si la mecánica está activa y [103] para ver si el jugador quiere que aparezca en todos los combates o no.
Combate No Importante.PNG

Ahora vendría mover los eventos vacíos que serán los gráficos de los pkm. Se colocan entre los combatientes.

Después, preparamos las variables. Puedes ponerlas con los comandos típicos (“operaciones de variables”) aunque yo prefiero hacerlo todo seguido en una llamada de script. Las variables son las que siguen:
-63: Id del evento que será tu pkm​
-64: Id del evento que será el pkm oponente.​
-65: Dirección en la que saldrá TU pkm. El del oponente saldrá volteado a la inversa para que mire de frente al tuyo. Admite varias posibilidades:​
-Mirar abajo: 'abajo','ABAJO','Abajo'. También el 2, pero sin las comillas ‘ ’.​
-Mirar izquierda: 'izquierda','IZQUIERDA','Izquierda','izq','IZQ','Izq'. También el 4, pero sin las comillas ‘ ’.​
-Mirar derecha: 'derecha','DERECHA','Derecha','dch','DCH','Dch'. También el 6, pero sin las comillas ‘ ’.​
-Mirar abajo: 'arriba','ARRIBA','Arriba'. También el 8, pero sin las comillas ‘ ’.​

Por último le damos el gráfico oportuno a los dos eventos. Al nuestro se lo damos llamando a la función “combate_primer_pkm(pbGet(63),pbGet(65))”. Al del oponente, se lo damos manualmente, ya que su primer pkm será siempre el primero que tenga determinado en trainers.txt, lo que facilita las cosas. Ponerlo con “mover evento” y “cambiar gráficos”.
No olvidar el $game_map.refresh o no se refrescará la pantalla y quizás no aparezcan los pkm.
Ponemos el condicional típico del combate.

-USO TRAS EL COMBATE:

PÁGINA DE EVENTOS

Después del combate le quitamos el gráfico manualmente a los eventos de los pkm por medio de “mover evento” y “cambio gráfico”. Los movemos a donde estaban antes del combate y listo. $game_map.refresh para refrescar el mapa.


-EXTRA: USO FUERA DE COMBATE
Si solo queremos sacar a nuestro primer pkm elegible al mapa, sin necesidad de que haya un combate. Basta con llamar a la función combate_primer_pkm(evento,direccion), siguiendo exactamente lo mismo que hicimos antes.


ACTIVAR/DESACTIVAR MECÁNICA

Para esto, como he dicho, utilizo dos interruptores. [102] está en el código (habría que modificarlo si queréis cambiarlo) y el segundo que uso es [103], que podéis cambiarlo sin necesidad de alterar nada ya que solo lo uso en la página de eventos.

Primero pensé en ponerlo en el menú de opciones, pero ni sé cómo tocar esa parte del código ni me parecía lo más seguro. Imagina cambiar el modo en una ruta delante de un NPC. Por seguridad prefiero controlar dónde se puede activar/desactivar.
Así que podéis ponerlo en un objeto que solo pueda usarse en determinados mapas, o hacer lo que yo hice que fue implementarlo en el PC del jugador, ya que este es accesible desde cualquier Centro Pkm.
Si seguís mi ejemplo de arriba al clasificar los combates en importantes/no importantes, la combinación de interruptores es sencilla:

-Mecánica en todos los combates: [102]:ON [103]:OFF​
-Mecánica solo en combates importantes: [102]:ON [103]:ON​
-Mecánica desactivada: [102]:OFF [103]:ON/OFF (Sería residual, da igual el valor).​

Puede llegar a ser un poco lioso pero creo que es una mecánica que merece la pena.
Como siempre, si lo usáis agradecería la mención pero no la exijo.
Si alguien tiene alguna duda se la resolveré. Iré actualizándolo con las mejoras que indico arriba.
 

Adjuntos

Arriba