Lo que más me interesaba de pokeemerald era entender cómo funcionaba el sistema de mapas y eventos y como ya tengo experiencia con como está hecho en Pokémon Essentials decidí hacer un pequeño apaño para añadir el Pokémon Follower. Podéis ver el resultado actual en este vídeo.
He subido el código actual al fork de pokeemerald en mi GitHub, ahí podéis ver también el estado actual y lo que faltaría por hacer aunque lo que habría que investigar ahora mismo sería la amplicación de overworlds sin utilizar tablas.
En su momento expandir los overworlds añadiendo un nuevo valor de 4 bits a EventObject y EventObjectTemplate que sirviese como tabla, de forma que podía tener 4080 overworlds.
Aunque funcionaba, me gustaría modificar el valor graphicsId de las dos estructuras anteriores y que fuese un valor de 16 bits en lugar de 8 para no tener que estar comprobando la tabla.
Hice algún avance sobre esto modificando también macros/asm/map.inc y cambiando el macro de event_object de esta forma:
Con esta modificación el juego funciona cuando se crea una nueva partida (no se puede utilizar la antigua ya que el tamaño del SaveBlock1 cambia y se come datos) pero se ve que hay algo que sigue causando overflow en algún sitio y el juego deja de responder incluso si únicamente le añado 1 bit más (512 overworlds)
Quien quiera colaborar está bienvenido
He subido el código actual al fork de pokeemerald en mi GitHub, ahí podéis ver también el estado actual y lo que faltaría por hacer aunque lo que habría que investigar ahora mismo sería la amplicación de overworlds sin utilizar tablas.
En su momento expandir los overworlds añadiendo un nuevo valor de 4 bits a EventObject y EventObjectTemplate que sirviese como tabla, de forma que podía tener 4080 overworlds.
Aunque funcionaba, me gustaría modificar el valor graphicsId de las dos estructuras anteriores y que fuese un valor de 16 bits en lugar de 8 para no tener que estar comprobando la tabla.
Hice algún avance sobre esto modificando también macros/asm/map.inc y cambiando el macro de event_object de esta forma:
Código:
.macro object_event index:req, gfx:req, replacement:req, x:req, y:req, elevation:req, movement_type:req, x_radius:req, y_radius:req, trainer_type:req, sight_radius_tree_etc:req, script:req, event_flag:req
.byte \index,
.2byte \gfx
.byte \replacement, 0
.2byte \x
.2byte \y
.byte \elevation, \movement_type, ((\y_radius << 4) | \x_radius), 0
.2byte \trainer_type, \sight_radius_tree_etc
.4byte \script
.2byte \event_flag
.2byte 0
inc _num_npcs
.endm
Quien quiera colaborar está bienvenido