Registrarse

[pokeruby - pokeemerald] Crear nuevos comandos de scripting

Kaktus

Miembro insignia
Miembro insignia
¡Buenas!

Hoy vengo a enseñar como crear nuevos comandos de scripting, me planteé si esto era posible, y no me tomó más de 5 minutos en descubrir que sí, así que si descubrirlo me tomó tan poco, imaginad lo que os tomará a vosotros sabiéndolo ya (?

Bueno, me he decidido a cambiar el formato de los tutoriales, ahora, en lugar de explicarlo todo al dedillo, daré por hecho que sabéis lo necesario para poder desarrollar y adaptar los tutoriales a vuestra manera, porque si yo os enseño por ejemplo, a crear un nuevo comando, pero no tenéis ni p*ta idea de programación, de poco os servirá crear nuevos comandos, porque no sabréis como desarrollar la función que realizará este.

Dejándome de rollos, vamos al grano.

Para empezar, editaremos el archivo "data/script_cmd_table.inc" y al final de "gScriptCmdTable", es decir, después de ".4byte ScrCmd_waitmoncry@ 0xC5" si no habéis tocado nada, añadiremos lo siguiente.

Código:
	.4byte nombreDeLaFunción              @ 0xSIGUIENTE_VALOR
Mi función se llamará "ScrCmd_changeMini", y el siguiente a C5, es C6, así que:

Código:
	.4byte ScrCmd_changeMini              @ 0xC6
(El valor después del @, es simplemente un comentario de texto que nos servirá de referencia)

Ahora, añadiremos un/una macro en "include/macros/event.inc", y buscaremos donde se encuentra la última macro existente (en este caso, C5), así que buscaremos por .macro waitmoncry, que es la que está definida en el byte C5 (obviamente, tenemos un límite hasta FF, a no ser que expandamos)

Ahora, es bastante simple, añadimos un/una macro en función de lo que necesitemos, en este caso, yo necesito un u16 para guardar un valor, así que, siguiendo el formato del resto de macros, la mía quedaría así:

Código:
	@ Changes the player minisprite.
	.macro changeMini minivalue
	.byte 0xc6
	.2byte \minivalue
	.endm
(Obviamente, la anotación la he puesto yo, si no queréis ponerla, no es necesario)

Ya tenemos la macro declarada, al igual que la función, y ahora sólo queda una cosa por hacer.

Pasamos a crear nuestra función en "src/scrcmd.c".

Algo que siempre tenemos que respetar, es meter en el paréntesis de la función, esto:

Código:
struct ScriptContext *ctx
De nuevo, siguiendo el patrón del resto de funciones, podemos llegar a nuestra función deseada, en mi caso, ha quedado así:

Código:
void ScrCmd_changeMini(struct ScriptContext *ctx)
{
	u16 miniValue = VarGet(ScriptReadHalfword(ctx));
	
	struct EventObject *eventObj = &gEventObjects[gPlayerAvatar.eventObjectId];
	
	sub_805B980(eventObj, miniValue);
    EventObjectTurn(eventObj, eventObj->movementDirection);
    SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_ON_FOOT);
	gSaveBlock2.playerMini = miniValue;
}
¡Y ya está!

Ya podemos usar nuestro nuevo comando en cualquier script, en mi caso, podría llamar dicho comando con algo así como:

Código:
changeMini 35

That's all :)
 

Dragonite

But where's your heart
Hola, el tutorial está de lujo.

Vengo a agregar que el directorio del archivo event.inc no es el mismo en pokeemerald, si no que está en:

Código:
asm/macros/event.inc
También la estructura es algo distinta, pero es bastante sencilla de comprender.

Código:
	.macro changeframe frameNumber:req
	.byte 0xe3
	.2byte \frameNumber
	.endm
Después del nombre del comando se debe poner el nombre del parámetro seguido de dos puntos y un :req, creo que se refiere a required (requerido, obligatorio).

Ya luego, es exactamente igual, como podrán ver.

Sería un buen agregado a tu excelente tutorial.

¡Saludos!
 
Última edición:
Arriba