Acimut
Profesional de WaH
Update 2022/03/19:
Update 2021/12/06:
¡Que tal!
Hace rato no me pasaba por aquí con algún aporte, así que revisando cosas que tengo, encontré que hace un mes (noviembre 2021) había hecho el port de la implementación del RTC nativo a pokefirered realizado por Hiroshi Sotomura de Pokeco, para fire red "binario".
Para mí, es un gusto compartir este recurso con ustedes, inyección en C que implementa el RTC de manera nativa en Pokémon Fire Red y Rojo Fuego, así que en teoría no debería haber problema al usarlo en cartuchos reales con el chip RTC de Seiko Instruments, tal como funciona en RSE.
El port lo he logrado fácilmente con una inyección en C que mete todo el código de Sotomura en la rom de fire red o rojo fuego.
Características (weas cuánticas que hizo Sotomura):
La inyección está lista para Rojo Fuego y Fire Red v1.0.
Recordad queeste parche esta inyección por ahora es para probar el funcionamiento del mismo, pues hace falta algunas implementaciones, y como menciona Sotomura, algunas de estas deberían estar más ligado al hack de cada quién.
Pendiente:
Por último, los créditos correspondientes a quienes hacen esto posible:
- Parche removido debido a un bug que impide leer partidas guardadas.
- El repositorio ahora es público.
- Bugfix: Ahora lee la partida guardada correctamente.
- Agregado los métodos evolutivos aportados por BluRose aquí .
- Expande la cantidad de evoluciones a más de 5 por especie (así eevee podrá tener el número de evoluciones que quieras).
- Se puede configurar las opciones predeterminadas al iniciar una nueva partida (text speed, frame, sound, battle style, button mode, etc).
- Se puede configurar el destino donde aparece el prota al iniciar una nueva partida (banco, mapa, warpid, x, y).
- Se puede usar para establecer más opciones de incio, como el nombre fijo del rival, ítems, entre otros.
- Repuntea automáticamente la tabla gEvolutionTable (Fire Red: 0x08259754, Rojo Fuego: 0x08254F1C).
Update 2021/12/06:
- Agregado parche para Fire Red 1.0
- Post movido a investigaciones, pues el parche aún no está del todo listo para ser usado en un hack, porque hace falta implementaciones como el sistema de día y noche, entre otras cosas que usan RTC. Si estás interesado, puedes ayudar para que este recurso tenga un mejor uso en los hack y pueda estar a la altura, aportando recursos como scripts o ideas.
- Agregada información sobre la IWRAM.
¡Que tal!
Hace rato no me pasaba por aquí con algún aporte, así que revisando cosas que tengo, encontré que hace un mes (noviembre 2021) había hecho el port de la implementación del RTC nativo a pokefirered realizado por Hiroshi Sotomura de Pokeco, para fire red "binario".
Para mí, es un gusto compartir este recurso con ustedes, inyección en C que implementa el RTC de manera nativa en Pokémon Fire Red y Rojo Fuego, así que en teoría no debería haber problema al usarlo en cartuchos reales con el chip RTC de Seiko Instruments, tal como funciona en RSE.
El port lo he logrado fácilmente con una inyección en C que mete todo el código de Sotomura en la rom de fire red o rojo fuego.
Características (weas cuánticas que hizo Sotomura):
- Restaura la evolución por felicidad en día y noche.
- Funcionalidad de Pokérus (no la he probado, ayudadme!)
- Restauración de los special:
- 0x9A StartWallClock: Configura el reloj de pared.
- 0x9B Special_ViewWallClock: Muestra el reloj de pared.
- 0xCF GetWeekCount
- Uso de los siguientes comandos en XSE:
- 0x2C cmd2c: Lee 2 pares de bytes (hora 2byte, minutos 2byte), luego los guarda en gLocalTime.
- 0x2D checkdailyflags
- 0x2E resetvars: Ahora asigna la hora, minutos y segundos a las siguientes variables respectivamente: 0x8000, 0x8001, 0x8002
- Ocupa las siguientes flags y variables:
- 0x35C FLAG_SET_WALL_CLOCK
- 0x837 FLAG_SYS_RESET_RTC_ENABLE
- 0x83F FLAG_SYS_CLOCK_SET
- 0x38F ~ 0x3CF DAILY_FLAGS
- 0x402C VAR_DAYS
- 0x4032 VAR_RESET_RTC_ENABLE
Para inyectar el código en tu rom es necesario tener:
Como se puede ver, la inyección insertó el código en el offset 0x08710df0 en una rom rojo fuego (screenshot antigua).
Puedes usar el siguiente script de XSE como ejemplo:
- Ganas y paciencia.
- Conocimientos intermedios o avanzados (no recomendado para novatos).
- Instalado devkitARM, cualquier versión reciente sirve.
- Instalado MAKE, cualquier versión reciente sirve.
- Instalado ArmIPS, cualquier versión reciente sirve.
- Instalado pret-tools (Tutorial aquí).
- Más paciencia.
- Una rom de pokémon fire red o rojo fuego.
- Clonado o descargado el siguiente repositorio: https://github.com/Acimut/Pokemon-FR-Native-RTC
- Para compilar es necesario tener preproc.exe y gbagfx.exe dentro alguna ruta de la variable PATH
- Modificar el archivo Makefile para cambiar el offset y la rom con la que vamos a trabajar. Buscamos las siguientes líneas:
ROM_CODE ?= BPRE
OFFSET ?= 0x08730000- Cambiamos 730000 por un offset alienado con suficiente espacio libre (cerca de 0xA000 bytes). Se puede insertar en espacio expandido de la rom, cambiando el 0x08 por 0x09 al inicio del offset.
- Cambiamos BPRE por BPRS si vas a compilar en una rom Rojo Fuego española.
- Dentro de la carpeta raíz del proyecto, poner una rom con extensión de archivo .gba
- con nombre BPRE si usa Fire Red
- con nombre BPRS si usa Rojo Fuego
- Compilan ejecutando make. Se genera una nueva carpeta llamada “build” y adentro encontrará un archivo rom_bpre.gba (rom_bprs.gba en caso de Rojo Fuego) que tendrá el código compilado. Pueden abrir el archivo offset.txt para revisar los offset donde se ha insertado el código compilado.
Como se puede ver, la inyección insertó el código en el offset 0x08710df0 en una rom rojo fuego (screenshot antigua).
Puedes usar el siguiente script de XSE como ejemplo:
Código:
#dynamic 0x800000
#org @main
lockall
checkgender
copyvar 0x8004 LASTRESULT
checkflag 0x35C
if 0x1 goto @MostrarReloj
msgbox @string1 MSG_KEEPOPEN
call @ConfigurarReloj
pause 0x1E
setflag 0x35C
msgbox @string2 MSG_KEEPOPEN
closeonkeypress
releaseall
end
'---------------
#org @MostrarReloj
fadescreen 0x1
special 0x9B
waitstate
releaseall
end
'---------------
#org @ConfigurarReloj
fadescreen 0x1
special 0x9A
waitstate
return
'---------------
#org @string1
= El reloj está detenido[.]
'---------------
#org @string2
= [player]: ¡Ahora el reloj funciona\ncorrectamente!
El sistema de por sí trae funciones obtener los datos del RTC, sin embargo aquí están los offset de la IWRAM y bytes usados:
gLocalTime: Aquí guarda la hora local (del juego), una vez configurado el wallclock con el special 0x9A.
0x030074a0
ocupa 5 bytes: días 2 bytes, horas 1 byte, minutos 1 byte, segundos, 1byte
sLocked: Usado por el chip RTC de Seiko Instruments.
0x030074e2
ocupa 1 byte.
sErrorStatus: Guarda una el estado de error del RTC.
0x030074e8
ocupa 2 bytes.
sRtc: Aquí está la información del RTC de nuestra consola o emulador.
0x030074f0
ocupa 10 bytes: 1byte para: año, mes, día, día de la semana, hora, minuto, segundo, estado, hora de alarma, minuto de alarma
sProbeResult: Usado por el chip RTC de Seiko Instruments. Al parecer, es usado para comprobar el estado del RTC e indicar el error en sErrorStatus
0x030074fc
ocupa 1 byte.
sSavedIme: Guarda un registro de I/O, al parecer el 0x4000208
0x030074fe
ocupa 2 byte.
Nota: Tener en cuenta que los datos del RTC que aparecen en la memoria del emulador, como el sRtc, se ven de la siguiente forma (año = 0x21, mes=0x12, etc.):
gLocalTime: Aquí guarda la hora local (del juego), una vez configurado el wallclock con el special 0x9A.
0x030074a0
ocupa 5 bytes: días 2 bytes, horas 1 byte, minutos 1 byte, segundos, 1byte
sLocked: Usado por el chip RTC de Seiko Instruments.
0x030074e2
ocupa 1 byte.
sErrorStatus: Guarda una el estado de error del RTC.
0x030074e8
ocupa 2 bytes.
sRtc: Aquí está la información del RTC de nuestra consola o emulador.
0x030074f0
ocupa 10 bytes: 1byte para: año, mes, día, día de la semana, hora, minuto, segundo, estado, hora de alarma, minuto de alarma
sProbeResult: Usado por el chip RTC de Seiko Instruments. Al parecer, es usado para comprobar el estado del RTC e indicar el error en sErrorStatus
0x030074fc
ocupa 1 byte.
sSavedIme: Guarda un registro de I/O, al parecer el 0x4000208
0x030074fe
ocupa 2 byte.
Nota: Tener en cuenta que los datos del RTC que aparecen en la memoria del emulador, como el sRtc, se ven de la siguiente forma (año = 0x21, mes=0x12, etc.):
La inyección está lista para Rojo Fuego y Fire Red v1.0.
Recordad que
Pendiente:
- Agregar filtro de paletas para el sistema Day and Night.
Por último, los créditos correspondientes a quienes hacen esto posible:
RTC nativo en pokefirered:
Hiroshi Sotomura
GriffinR
PRET
Métodos evolutivos:
@BluRose
Screenshots:
Hiroshi Sotomura
GriffinR
PRET
Métodos evolutivos:
@BluRose
Screenshots:
Última edición: