Registrarse

[C] RTC Nativo para Rojo Fuego y Fire Red

Acimut

Profesional de WaH
Update 2022/03/19:
  • 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:
  • 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
Compilando la rom:
  • 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.
WSL.png

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.):
1638833811071.png

La inyección está lista para Rojo Fuego y Fire Red v1.0.

Recordad que este 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:

  • 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:
rtc_boy_1.gif
rtc_boy_2.gif
rtc_girl_2.gif
 
Última edición:

Acimut

Profesional de WaH
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.
 

Rojo2010

Baneado
El parche está bien porque a mí el programa para poner rtc no funciona sin net framwerwork 2.0 y3.0 pero así son las cosas de mi pc del gobierno que no soporta netframwerwork (así se escribe no ok pues da igual xd)
 

milenco

Leyenda de WaH
GENIAL APORTE!!! pero tengo una duda, mi rom lo estoy haciendo de 0 y he hecho un montón de modificaciones en hex y otros metodos, de hecho lo ultimo que iba a hacer era inyectar el sistema rtc, para expandir los métodos evolutivos, pero al ver esto lo quise probar para no ocupar day & night (este siempre me buguea el juego) bueno el tema es que ocupe el parche y abrí la rom en hxd pero ya no esta la información de los punteros de los métodos evolutivos (offset 42FC4 ) seguramente se movio con el parche para reparar varios metodos, pero ahora no se como expandir la tabla y agregar nuevas formas de evo... porfavor me podrias compartir los offset donde repunteaste las tablas? te lo agradecería mucho!!!
 

Acimut

Profesional de WaH
bueno el tema es que ocupe el parche y abrí la rom en hxd pero ya no esta la información de los punteros de los métodos evolutivos (offset 42FC4 ) seguramente se movio con el parche para reparar varios metodos
Ciertamente se ha movido esa función de ahí, para corregir los métodos evolutivos de Espeon y Umbreon.

lo ultimo que iba a hacer era inyectar el sistema rtc, para expandir los métodos evolutivos, pero al ver esto lo quise probar para no ocupar day & night (este siempre me buguea el juego)
pero ahora no se como expandir la tabla y agregar nuevas formas de evo... porfavor me podrias compartir los offset donde repunteaste las tablas? te lo agradecería mucho!!!
Me alegra que llegaras con una situación bastante común para la implementación de este parche en un hack, pues así solucionamos algunas dudas, pues como mencioné antes, el parche es para ir probando funcionalidades.

Primero he de mencionar la manera en que trabaja esto. Lo que he realizado es una inyección que inserta en una rom de fire red el código del RTC de pokeemerald que preparó Sotomura para pokefirered, tal cual fue copiar y pegar.

¿Cómo es esto posible?
Bueno, es porque estamos hablando del mismo juego, con pokefirered obtienes una rom de fire red, lo mismo para el código que está en pokefirered está en binario en la rom de fire red. Así, en teoría lo único que necesitamos hacer es reemplazar el viejo código (segmentos de bytes compilados en la rom) por el nuevo código. Si me preguntan, aquí es donde está el trabajo de una inyección, realizar los hooks correctamente sin dañar nada más.

Naturalmente, hay modificaciones que para aplicarlas a "binario" sería necesario cambiar "todo en la rom", por lo que probablemente no valga el esfuerzo, pero no significa que sea imposible, sólo sería demasiado trabajo.

Volviendo al punto, y respondiendo tu pregunta. La función se ha movido completamente, repunteada y reemplazada por la inyección, por lo que nos otorga la libertad de modificarla como si de decomp se tratase. Es como le he dicho a un amigo, "decomp but binario xd". Así que, para expandir la "tabla de evoluciones" sólo basta aplicar cambios en el código de la inyección, perfectamente nos sirven las publicadas por BluRose aquí.

Entonces puedo hacer lo siguiente:
1. Hacer otro parche, para sólo hacer hook a los punteros en la "tabla", para las evoluciones de Umbreon y Espeon, así estaría la tabla de evoluciones donde normalmente se encuentra.
2. Implementar los métodos aportados por @BluRose y pasar aquí un nuevo parche con las modificaciones para probar que funcionan.

También puedes enviarme un mensaje privado si quieres ayudarme, o discutir aquí sobre la implementación de más características sobre este recurso.
 

Acimut

Profesional de WaH
Update 2022/03/19:
  • 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).
 

Shiny_Miner

Rocker Coder
Update 2022/03/19:
  • 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).
cool
 

Acimut

Profesional de WaH
Algun dia habra parche?
No.

Y la razón es muy simple: esta wea cuántica ya se volvió lo suficientemente complejo para que se meta en un parche. Pues que si quieres cambiar la tabla de evoluciones, editar métodos evolutivos, opciones de inicio de partida, entre otras cosas que maneja RTC, intentar hacer esto luego de aplicar un parche no será tan fácil (porque tampoco es imposible) como hacerlo desde el código de la inyección*. Además que algunos preferirán configurar algunas cosas como el sistema de día y noche (cuando tenga tiempo actualizo el post).

Hace algunas semanas implementé el sistema de día y noche y actualicé el repo, pero no he tenido tiempo para terminar detalles, como compatibilidad con rojo fuego y actualizar este post con instrucciones para el sistema de día y noche.

Pequeña muestra del avance (?
pd: estaba probando la iluminación de las ventanas, no me maten pls :v
pd2: gracias al staf de wah por implementar la posibilidad de insertar vídeos desde otras fuentes como discord.
 

Checo_XP

La vida es una eXPeriencia
No.

Y la razón es muy simple: esta wea cuántica ya se volvió lo suficientemente complejo para que se meta en un parche. Pues que si quieres cambiar la tabla de evoluciones, editar métodos evolutivos, opciones de inicio de partida, entre otras cosas que maneja RTC, intentar hacer esto luego de aplicar un parche no será tan fácil (porque tampoco es imposible) como hacerlo desde el código de la inyección*. Además que algunos preferirán configurar algunas cosas como el sistema de día y noche (cuando tenga tiempo actualizo el post).

Hace algunas semanas implementé el sistema de día y noche y actualicé el repo, pero no he tenido tiempo para terminar detalles, como compatibilidad con rojo fuego y actualizar este post con instrucciones para el sistema de día y noche.

Pequeña muestra del avance (?
pd: estaba probando la iluminación de las ventanas, no me maten pls :v
pd2: gracias al staf de wah por implementar la posibilidad de insertar vídeos desde otras fuentes como discord.
el relog esta ahi, si se puede ponerlo de manera individual?
 

Acimut

Profesional de WaH
el relog esta ahi, si se puede ponerlo de manera individual?
Tu lo que quieres sólo es el reloj de pared ¿eh?
Lamentablemente va a ser difícil que lo implementes en fire red sin usar esta u otra inyección, sobre todo si no tienes conocimiento de lo que estás haciendo. Además, debo suponer que tienes implementado el rtc y dns de la herramienta de primedialga o del CFRU, por lo que si quieres usar esta versión del RTC deberías quitar el sistema que tienes antes de aplicar esta inyección, lo que puede hacer complicada tu situación como pueda que no.

También puedes tratar de hacerlo por tu cuenta, tienes este repositorio con el código de del reloj, así como también está en pokeemerald o pokeruby, no es que sea un secreto ni mucho menos. El archivo se llama wallclock.c si gustas revisarlo.

Alguna vez ví un tutorial donde explicaban cómo usar scripts con el RTC de la herramienta de primedialga, en alguna parte estabacómo hacer un script para mostrar la hora, pero no recuerdo dónde.

PD: veo que borraste los mensajes de ayer, quise responder de inmediato pero se me fue el internet antes de poder eviar respuesta xd
 

Checo_XP

La vida es una eXPeriencia
Tu lo que quieres sólo es el reloj de pared ¿eh?
Lamentablemente va a ser difícil que lo implementes en fire red sin usar esta u otra inyección, sobre todo si no tienes conocimiento de lo que estás haciendo. Además, debo suponer que tienes implementado el rtc y dns de la herramienta de primedialga o del CFRU, por lo que si quieres usar esta versión del RTC deberías quitar el sistema que tienes antes de aplicar esta inyección, lo que puede hacer complicada tu situación como pueda que no.

También puedes tratar de hacerlo por tu cuenta, tienes este repositorio con el código de del reloj, así como también está en pokeemerald o pokeruby, no es que sea un secreto ni mucho menos. El archivo se llama wallclock.c si gustas revisarlo.

Alguna vez ví un tutorial donde explicaban cómo usar scripts con el RTC de la herramienta de primedialga, en alguna parte estabacómo hacer un script para mostrar la hora, pero no recuerdo dónde.

PD: veo que borraste los mensajes de ayer, quise responder de inmediato pero se me fue el internet antes de poder eviar respuesta xd
Respuesta 1:Solo dije tonterias y me arrepenti asi que las borre.

Respuesta 2: Entonces si quiero poner "este relog" me va dar problemas por razones de compatibilidad ya que si le puse rtc usando dns.

Respuesta 3: Consegui una rom base que viene CFRU con DPE limpia al menos ya se que no es compatible el rtc nativo en esa rom pero horita ando en este proyecto que se basa en una rom virgen y pense que no habria problema.

Duda: Se que esto no tiene nada que ver con el tema pero ¿Crees que la rom base que viene con CFRU con DPE limpia de @coqeeinrh (La cual es inglesa la rom) no tendria algun problema si le implemento un parche de traduccion al español de @CompuMax ?

Parche de Traduccion: https://whackahack.com/foro/threads/fr-rom-base-traduccion-100-al-espanol-oficial-de-la-fire-red.55882/

Rom base: https://whackahack.com/foro/threads/rom-base-fr-cfru-dpe-implementado-herramientas-actu-3-5-22.66748/

(Creo que al rato en la amanecer lo intentare a ver que sucede si le meto ese parche con esa rom base, cuando vea el resultado te comentare)
 

Acimut

Profesional de WaH
Respuesta 2: Entonces si quiero poner "este relog" me va dar problemas por razones de compatibilidad ya que si le puse rtc usando dns.
En realidad, no dije que fuera imposible, es posible hacer que el reloj de pared funcione con el rtc de primedialga o cfru, el problema real es quién va hacer el trabajo, porque yo no.

Duda: Se que esto no tiene nada que ver con el tema pero
Por favor, lee las normas del foro.
 

Checo_XP

La vida es una eXPeriencia
Por favor, lee las normas del foro.
[/QUOTE]
No sabia de donde estaban las normas, para la proxima tendre mas cuidado.

En realidad, no dije que fuera imposible, es posible hacer que el reloj de pared funcione con el rtc de primedialga o cfru, el problema real es quién va hacer el trabajo, porque yo no.

En eso creo que no tendria problema (De todas formas esto no es prioritario) ya tengo a un compañero de la escuela que esta aprendiendo el lenguaje c y las inyecciones en las roms y me esta ayudando con el mapeo y los scrips.
 
Arriba