De Whack a Hack Wiki!

Klink NB.gif

En desarrollo. Esta página todavía no está terminada y está en espera de ser editada en breve. Por favor, si quiere ayudar, contacta con sus creadores a través de la página de discusión antes de realizar ningún cambio.

No importa si eres un principiante en el mundo del ROM Hacking o ya tienes experiencia previa, este tutorial te guiará a través de los conceptos fundamentales y te proporcionará ejemplos prácticos para ayudarte a comprender y dominar la creación de scripts de eventos. A través de este tutorial, aprenderás cómo escribir scripts de eventos paso a paso.

Introducción

Los eventos se definen mediante scripts, que son secuencias de comandos que controlan la interacción del jugador con el entorno del juego. Puedes usarlos para crear diálogos, activar batallas, desencadenar eventos especiales y mucho más.

A lo largo de este tutorial verás tres modalidades para realizar los mismos scripts:

  • poryasm: Es el formato por defecto de Decompilación. Tiene muchas similitudes con el lenguaje utilizado por XSE, el que se utiliza en ROM Hacking Binario.
  • poryscript: Es un formato más similar a los lenguajes de programación modernos como JavaScript. Fue concebido para agilizar el proceso de desarrollo de los eventos.
  • XSE: Es el formato utilizado por el ROM Hacking binario.

Diálogo básico

Este tipo de script permite crear una interacción del jugador con un NPC.

poryasm

El comando msgbox es el que muestra el mensaje. Este requiere dos elementos:

  1. La dirección del texto (NombreDelScript_Texto).
  2. El tipo de mensaje (MSGBOX_NPC).
 NombreDelScript::
     msgbox NombreDelScript_Texto, MSGBOX_NPC
     end
 
 NombreDelScript_Texto::
     .string "Hola mundo.$"

Fíjate que tenemos dos scripts: Uno que contiene el código (NombreDelScript) y otro que tiene el texto (NombreDelScript_Texto).

El código siempre termina con el comando end, mientras que el texto siempre termina con el caracter $.

poryscript

Poryscript no aporta muchas diferencias con poryasm en este ejemplo. Lo más destacado es que se debe indicar si lo que se va a escribir es un script o si es texto. El contenido se encierra entre llaves ({...}) y los parámetros se encierran entre paréntesis y separados por comas.

 script NombreDelScript {
    msgbox(NombreDelScript_Texto, MSGBOX_NPC)
    end
 }
 
 text NombreDelScript_Texto {
    "Hola mundo."
 }

La mayor ventaja sobre poryasm es que permite obviar la definición del texto, añadiéndolo directamente en el comando msgbox:

 script NombreDelScript {
    msgbox("Hola mundo.", MSGBOX_NPC)
    end
 }

XSE (Binario)

La etiqueta #dynamic 0x800000 especifica a partir de qué dirección empezará XSE a buscar un espacio vacío donde compilar el script. Por ejemplo, la dirección 0x800000. A partir de ahí las bases suelen tener espacio libre.

La etiqueta #org @inicio indica el puntero inicial (inicio es un nombre de ejemplo). Esto siempre se debe poner al inicio del script, ya que al compilar se convertirá en un offset, que será el que le asignemos a los NPC en Advance Map para que nuestro script se ejecute.

  • El comando lock bloquea el movimiento. Así podremos hablar sin que la persona con la que hablamos se vaya.
  • El comando faceplayer hace que la persona con la que hablamos nos mire.
  • El comando msgbox. Se utiliza de la forma msgbox @(puntero del texto) 0x(tipo)
    • El puntero del texto es la dirección donde se escribirá nuestro texto.
    • Respecto al tipo, dependiendo de si es un cartel, una persona, etc, tiene un tipo. El tipo de msgbox nos dice que caja de texto aparecerá en el juego.
 #dynamic 0x800000
 
 #org @inicio
 lock
 faceplayer
 msgbox @texto 0x6
 release
 end
 
 #org @texto
 = Hola mundo.

Inserción

Una vez creado el script hay que asignárselo a un NPC, ya que este tipo de script se ejecuta al interaccionar con un NPC.

Decompilación

Desde porymap se debe entrar en el mapa donde se quiera añadir el script, en la pestaña Events, y seleccionar el NPC que se quiera asignar. Entonces, se copia el nombre del script en el campo Script de la siguiente manera:

Eventos basicos npc porymap.png

Una vez se guarde el proyecto, se puede compilar para comprobar que el script se ha insertado correctamente.

Binario

En primer lugar, se debe compilar el script dentro de la ROM.

Desde Advance Map se debe entrar en el mapa donde se quiera añadir el script, en la pestaña Eventos, y seleccionar el NPC que se quiera asignar. Entonces, se copia el offset del script en el campo Script offset de la siguiente manera:

Eventos basicos npc xse 3.png

Una vez se guarde la ROM, se puede abrir para comprobar que el script se ha insertado correctamente.

Carteles

Se denominan carteles (o, tradicionalmente, postes) a los scripts que no se muestran tras hablar con algún NPC, sino que, por el contrario se muestran al interactuar con un tile, por ejemplo: un cartel de ruta, un libro, un PC...

poryasm

Igual que en el caso anterior, el comando msgbox es el que muestra el mensaje. Este requiere dos elementos:

  1. La dirección del texto (FallarborTown_Text_TownSign).
  2. El tipo de mensaje (MSGBOX_SIGN).
 FallarborTown_EventScript_TownSign::
     msgbox FallarborTown_Text_TownSign, MSGBOX_SIGN
     end
 
 FallarborTown_Text_TownSign:
     .string "FALLARBOR TOWN\n"
     .string "“A farm community with small gardens.”$"

poryscript

 script FallarborTown_EventScript_TownSign {
     msgbox("FALLARBOR TOWN\n“A farm community with small gardens.”", MSGBOX_SIGN)
     end
 }

XSE (Binario)

Una vez más, la etiqueta #dynamic 0x800000 especifica a partir de qué dirección empezará XSE a buscar un espacio vacío donde compilar el script.

La etiqueta #org @inicio indica el puntero inicial (inicio es un nombre de ejemplo).

  • En este caso, los comandos lock y faceplayer no hacen falta.
  • El comando msgbox. Se utiliza de la forma msgbox @(puntero del texto) 0x(tipo)
    • El puntero del texto es la dirección donde se escribirá nuestro texto.
    • Respecto al tipo, dependiendo de si es un cartel, una persona, etc, tiene un tipo. El tipo de msgbox nos dice qué caja de texto aparecerá en el juego.
 #dynamic 0x800000
 
 #org @inicio
 msgbox @texto 0x3
 end
 
 #org @texto
 = ¡Bienvenido a Pueblo Sol!

Recibir objetos

poryasm

poryscript

XSE (Binario)

Recibir Pokémon y huevos

poryasm

poryscript

XSE (Binario)