¡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.
Mi función se llamará "ScrCmd_changeMini", y el siguiente a C5, es C6, así que:
(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í:
(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:
De nuevo, siguiendo el patrón del resto de funciones, podemos llegar a nuestra función deseada, en mi caso, ha quedado así:
¡Y ya está!
Ya podemos usar nuestro nuevo comando en cualquier script, en mi caso, podría llamar dicho comando con algo así como:
That's all
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
Código:
.4byte ScrCmd_changeMini @ 0xC6
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
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
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;
}
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