Esto estaba en binario en forma de rutina ASM para poder mover la cámara de forma instantánea en los scripts y no necesitar esperar a un applymovement. Miré un poco como funcionaba y he hecho un comando para aplicarlo en los scripts de forma más cómoda.
Os pongo por aquí como implementar el comando, ya que hacer una branch para esto me parece muy chorra.
En primer lugar vamos a 'asm/macros/event.inc' y añadimos un nuevo macro (comando para scripting):
Es importante tener en cuenta que el '.byte 0xe3' indica el id que tendrá el macro, podéis poner cualquier número entre 0x00 y 0xFE siempre que ESTÉ LIBRE, el primer id libre por defecto en emerald es 0xe3, pero vosotros podríais tenerlo ocupado en función de lo que hayáis hecho.
Ahora vamos a 'data/script_cmd_table.inc' y añadimos la siguiente línea en la tabla de script commands, esta será la función de código C que se ejecutará cuando llamemos al comando 'movecamerainstant' durante un script.
Por último tenemos que definir que es lo que hará la función que acabamos de colocar en tabla. Nos dirigimos a 'src/scrcmd.c' y añadimos nuestra nueva función:
A partir de ahora, cada vez que llamemos a 'movecamerainstant x, y' en un script se ejecutará este fragmento de código, añadiendo las coordenadas indicadas a la posición y refrescando el mapa (sin necesidad de refrescar la pantalla).
El comando solo mueve la posición del player por el mapa, el uso de los comandos fadescreen, los special SpawnCameraObject/RemoveCameraObject y mover la posición de los sprites u ocultarlos quedan a discreción del usuario en el script.
Os pongo por aquí como implementar el comando, ya que hacer una branch para esto me parece muy chorra.
En primer lugar vamos a 'asm/macros/event.inc' y añadimos un nuevo macro (comando para scripting):
Código:
@ Moves camera instantly without waiting an applymovement
.macro movecamerainstant x:req y:req
.byte 0xe3 @Command id
.2byte \x @X coords added to player pos
.2byte \y @Y coords added to player pos
.endm
Ahora vamos a 'data/script_cmd_table.inc' y añadimos la siguiente línea en la tabla de script commands, esta será la función de código C que se ejecutará cuando llamemos al comando 'movecamerainstant' durante un script.
Código:
.4byte ScrCmd_movecamerainstant
Por último tenemos que definir que es lo que hará la función que acabamos de colocar en tabla. Nos dirigimos a 'src/scrcmd.c' y añadimos nuestra nueva función:
Código:
bool8 ScrCmd_movecamerainstant(struct ScriptContext *ctx)
{
s16 x,y;
x = ScriptReadHalfword(ctx); //Reads x command parameter
y = ScriptReadHalfword(ctx); //Reads y command parameter
gSaveBlock1Ptr->pos.x += x; //Adds X coords to player position
gSaveBlock1Ptr->pos.y += y; //Adds Y coords to player position
DrawWholeMapView(); //Refresh map tiles
}
El comando solo mueve la posición del player por el mapa, el uso de los comandos fadescreen, los special SpawnCameraObject/RemoveCameraObject y mover la posición de los sprites u ocultarlos quedan a discreción del usuario en el script.