qna_rh
Thread Id: 21319
Thread Name: Repunteo Condicional HEX
Hola ¿Qué tal?
Mi duda de cambio de un byte en la RAM ha generado otra duda un poco más aterrizada en la ROM.
D4 16 29 08 64 0A 38 08 C0 0A 6B 08 38 0A 6B 08
95 01 0A 00 00 00 02 01 00 00 01 00 14 1A 29 08
74 0B 38 08 62 DD 14 08 48 86 30 08 6B 01 0B 00
01 00
Esto señores es un conjunto de Bytes que almacenan el cabezal de un mapa.
Su offset es este de aquí:
0x305544
Ahora, mi problema de la RAM radica en que quiero cambiar un byte específico que es leído al cargar el mapa luego de un warp. Localicé el offset en la RAM de este mismo cabezal y al hacer el WBTO cambiaba pero al hacer el warp volvía a ser el mismo de siempre. Pero no me por vencido y he creado otra posible solución teórica.
Aquí viene lo interesante, si de alguna manera pudiera repuntear en la ROM ese offset a uno libre donde genere una condición con una flag o variable en que si la variable es 1 por ejemplo, que cargue el cabezal normal. Pero si es cero que cambie el cabezal cambiado. Todo esto se haría 100% en la ROM por lo que no habría por que cambiar la RAM.
No se que opinan de ello. ¿Es posible?
Puff... Es enrevesado pero de narices... xDD
¿Con un script de nivel de tipo 04, que se ejecuta antes de cargar cierta información del mapa, no funcionaría? Sinceramente, nunca he probado algo así, pero no sé si pudiera servir... Es lo que se me ocurre.
Encuentra la rutina que lee esos cabezales, analízala y modifícala ;)
(if map is xxxx and byte_in_ram_yyyy then load aaaa else load bbbb)
Juanjo, ¿Has intentado hacer lo que te dije? XD
Vale, pues ni idea, lo que dije es una teoria.
Y no funciona? Joe...
Pues entonces no se, no eres el único que eso le está matando.
Lo que dije funciona cuando sales y entras?
Es raro, tenia entendido que en la vram no se refrescaba... que se guardaba en el sav que se crea automaticamente...
Luego le echo un vistazo a ver si llegamos a una solución, sino la encuentras antes, aunque lo de cosarara podría ser.
Jose, pues no he intentado aún lo tuyo porque simplemente no estoy familiarizado mucho con la RAM y bueno. Si sabía que la VRAM no se actualizaba pero no se como hacer lo que me dijiste.
Aún así, el cambio que quiero es solo momentáneo. Así fuese de tan solo unos segundos cargando el mapa . SI me puedes explicar como pasar esos dos bytes a la VRAM sería genial.
Ahora, este tema lo abrí como otra opción que quiero intentar por su facilidad. Pero es que olvide como se repuntea en HEX (xD) Y como poner los condicionales.
De resto ahí voy intentando.
Gracias...
PD: Es duro regresar después de dos años sin tocar ni un A-Map)
Iniciado por Juanjo
Ahora, este tema lo abrí como otra opción que quiero intentar por su facilidad. Pero es que olvide como se repuntea en HEX (xD) Y como poner los condicionales.
Repuntear algo consiste en buscar su pointer, que como trabajamos con ARM va a estar en little-endian (AABBCC->CCBBAA), y cambiarlo por otro. No se a qué te refieres con "poner los condicionales"; Si quieres que un pointer se cargue o no dependiendo de una variable vas a tener que (una de dos):
a) Conseguir colocar un script que se ejecute en el momento adecuado (que va a poder hacerse dependiendo de si realmente esos scripts de nivel 04 se ejecutan cuando queremos o no, o de si hay algún otro script por ahí que nos sirva).
b) Tocar ASM.
Cosarara, eso que dices de permutear y cambiar lo intenté antes pero jodí el mapa así que no estaba seguro si así se repunteaba...
Creo que tendré que tocar ASM ya que ese efecto que quiero es mi sueño y ya he luchado demasiado (Y roto muchos ROMs) intentándolo.
¿Y si explicas directamnte lo que quieres hacer?
Es que no he entendido la idea..
Según tengo entendido, si lo que quieres es cargar un mapa u otro dependiendo de X u Y.
Miraté el script de nivel de la shoal cave. (Vamos la cueba cambiante de ¿FR? o era ¿ruby? Bueno que te mires eso, y saques conclusiones..)
A veces la cueva estaba llena de agua, y otras seca..
Quiero, dependiendo del valor de una var se cargue un cabezal u otro. Pero no se como, es decir, cuando la RAM lea estos bytes que corresponden al Header del mapa, dependiendo de la una var lea otro cabezal similar pero con otros bytes cambiados. Para eso debo repuntear algún condicional para llamar a uno u otro cabezal.
Eso es lo que quiero D:
Pero juanjo, el cabezal de un mapa, contiene la información de un mapa.
Scripts de nivel, minis en el mapa, pokémon salvajes, eventos.. etc.
Vamos toda la información del mapa, y digo yo no es mejor cargar otro mapa, que sea idéntico (de tamaño y eso..) pero con las diferencias que quieras colocar?
Es que si no no le veo sentido..
No exactamente Eing. No quiero cambiar todo el banco, solo la parte del cabezal que está ahí, si vez bien son pocos bytes. Es la parte del cabezal donde están almacenados el tipo de mapa, la música, el cave byte, el clima, etc.
Iniciado por Juanjo
No exactamente Eing. No quiero cambiar todo el banco, solo la parte del cabezal que está ahí, si vez bien son pocos bytes. Es la parte del cabezal donde están almacenados el tipo de mapa, la música, el cave byte, el clima, etc.
¿Hay algún motivo especial que impida hacerlo con 2 mapas? Se podrían poner en los dos los mismos datos de bloques (tiles), eventos, etc. sin tener que duplicar nada a parte del cabezal.
Ese sistema lo usaré en muchos y muuuy grandes. Necesito algo un poco más "Dinámico", me parece mucho desperdicio un mapa muy grande para tan solo un par de bytes.
Iniciado por Juanjo
Ese sistema lo usaré en muchos y muuuy grandes. Necesito algo un poco más "Dinámico", me parece mucho desperdicio un mapa muy grande para tan solo un par de bytes.
El tamaño del mapa no importa, pues como ya he dicho los 2 cabezales pueden apuntar a los mismos datos de bloque.
Si el cambio es lo suficientemente grande, como para necesitar otro mapa, no te compliques, haz otro mapa y haz el script que te dije.
Y si el cambio es minusculo, usa codigo rubikon, o como se le llame al del XSE.
Igualmente, si no nos dices que es lo que realmente quieres hacer, es imposible ayudarte. Solo nos comentas que estás encabezonado con cambiar ese byte..
En los mapas existe algo llamado "tipo", que define el tipo de mapa (ruta, cueva, pueblo, ciudad, dentro, etc)
Quiero cambiar el tipo de un mapa de acuerdo al valor de una variable. Pero este byte que controla el tipo está almacenado en la ROM junto al cabezal del mapa.
Traté de cambiar su valor en la RAM con un WBTO y aunque lo hacía bien aún necesitaba un warp para refrescarlo y al hacerlo perdía el WBTO.
Por eso pensé en hacerlo con HEX... Agradezco sus ayudas ^^ y perdon por tantas preguntas.
PD: Ahora estoy aprendiendo ASM para intentarlo por ahí :P
.__.
¿Y ese cambio? Perdona mi ignorancia pero hace como 546438 veces que no hackeo.
Pero para que quieres cambiar el tipo de mapa?
La unica diferencia que conozco, es para que salga un BG u otro..
Y además, que se pueda correr o no.
Yo aún no entiendo qué problema hay con poner 2 headers para el mismo mapa =/
/-------------\
Header 1 (byte de un modo) --\ | Eventos |
|--| Tilesets |
Header 2 (byte cambiado) ----/ | Block data |
\-------------/
Lo grande que sea el mapa no importa, porque la única información que duplicas es el header.
Lo que dice cosita es lo que quiero hacer pero mi pregunta es como poner esos dos headers y hacer depender de una variable si se carga uno u otro.
Estoy comenzando con una rutina condicional en ASM.
Aún así eing ese cambio que quiero hacer es clave para un sistema de dice modificado que estoy desarrollando.
Puedes poner un script de nivel que haga un warp si la variable está en X valor.
Te complicas demasiado yo opino.
Y ese problema, lo tiene la gente "lista".
Es decir.. a veces, la gente que le gusta razonar, opta por vías mucho más díficiles, a las fáciles, cuando estás son las más accesibles y puede que posibles.
No te comas la olla, dos mapas y ale.
Total, en rubí hay 4684376 mapas repetidos xD
Pd. A malas fijate en la estructura de las Bases secretas.