Registrarse

[pokeruby - pokeemerald] Mover la cámara instantáneamente (Comando)

Samu

Miembro insignia
Miembro insignia
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):
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
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.
Código:
    .4byte ScrCmd_movecamerainstant
1589545216640.png



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
}
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.
 

Jaizu

Usuario mítico
Muy bueno Samu!
Se te olvidó un pequeño detalle, pero de perlas.
En /src/scrcmd.c hay que hacer un include a field_camera.h, tal que así, debajo del resto de includes:
Código:
#include "field_camera.h"
Respecto al método, tremenda chapuza, pero al menos no nos quedamos detrás de binario, se agradece.
 
Arriba