Registrarse

[Scripting] FR | Sobre las Flags y Variables

Lilith.

Without Heart
Gold dijo:
Hola a todos, he estado mirando desde el mas allá algunas dudas de scripts, y he visto que muchos hackers experimentados cofcofmegasceptilecofcof aún no conocen al 100% las flags y variables seguras de usar, asi que les dejo esto.

Sobre Flags y Variables

Empezaremos desde lo más común de usar, las flags

Flags

las Flags son simples: se tratan de "interruptores" que maneja el juego, como tales pueden ser encendidos o apagados, con el fin de mostrar progresos en los eventos. En mayor parte son usados para saber si un evento ya ocurrió o no, nada misterioso en eso. Lo que pocos saben es la existencia de flags especiales que son usadas para otras cosas diferentes a simples interruptores.

Un tio llamado DavidJCobb documentó bastante información acerca de las flags usadas por el engine del juego para eventos especiales, asi que empieza la lista:

Sumario de documentos sobre Flags:
Código:
Flags 0x000 - 0x006, las mínimas, son Flaga temporales y son manipuladas por el engine del juego.
Flags 0x011 - 0x01F: Controlan la visibilidad de OWs destructibles, como las rocas de Golpe Roca. Estas flags se autoresetean cuando hay un refrescado y/o cambio de mapa, los scripts de nivel no pueden manipularlas. Nunca deben usarse en Npc normales.
Flag 0x266: modificada directamente por el engine. si esta encendida, habrá un huevo esperandote en la Guardería de la Isla Quarta. si rechazas el huevo automáticamente la flag se apaga.

*Nota: A pesar de existir el comando checkitem, el juego simplemente nunca usa este comando; En vez de eso, los scripts de Game Freak siempre chequean las flags que desencadenan el evento que hace que recibas ese item (tambien es usado para personas escondidas). por ejemplo, el juego usa el comando "checkflag 0x271" después de encendida, no un "checkitem ITEM_BICYCLE 0x1" como todos hacemos.

Cosa similar es con las medallas. Otro ejemplo es el dialogo "Futuro campeón" del gordito que está junto a las estatuas de los gimnasios, pues en vez de chequear la flag de la medalla estos tiene su propias flags, (4B0-4B7) que por cierto no son seguras de usar.

No todas las flags de visibilidad de OW son encendidas/apagadas directamente. Muchas pertenecen a su ID de persona en A-Map, y son indirectamente manipuladas al usarse el comando "hidesprite" en los npc (refiriendose al número de persona en su ID de mapa).

---Flags notorias:---
Flags 0x011 - 0x01F: usadas para el control de visibilidad de OW destructibles (No usables)
Flag 0x266: usada por el engine para manejar el evento del huevo en la guardería de Isla Quarta. (No usable)
Flags 0x4B0 - 0x4B7 afect el dialogo "Futuro campeón" del gordito de los gimnasios.
Flags 0x4B8 - 0x4BC: controlan las acciones (siempre) del Alto Mando mientras estas en la Liga Pokemon, estas son reseteadas al entrar en el Salón de la Fama.(No usables)
Flags 0x500 - 0x700 Flags de entrenadores (Usables pero solo en entrenadores, en npc's pueden causar fallos en entrenadores ya vencidos, a menos que en tu hack no hayan entrenadores estas no deberían usarse)
Flags 701- 720- Restos de RZ, se supone que son flags que cada 8 horas son reseteadas, eran para las Bayas de Hoenn, pero su código está destruído al desaparecer el RTC en FireRed, No usables, a menos que sean tan "listo" de portear el cutre-RTC de RZ.
Flags 0x820 - 0x827: Leídas directamente por el engine y determina las medallas adquiridas. (Requete No usables)
Flag 0x82D: controla la personalización de tu perfil de tu PC en todos losCP, Aparentemente manejadas por el engine.(No usable) si la flqg 0x834 es encendida, desaparece el texto "PC de alguien" y se reemplaza por "PC de Bill". No se si afecta al menú de la PC, pero si afecta al dialogo cuando capturas un Pokémon.
Flag 0x842: Posiblemente sea algo de la Wireless Conection o algún minijuego. Es chequeada después de curar en el CP.
Flag 0x844: Usada cuando Celio se conecta con Aredia -- Tambien cuando te conectas con RZE--
Flag 0x849: Se activa al resolver el acertijo de las Ruinas Sete.
Si las flags 0x84A y 0x84B son reseteadas, El tio de Ciudad Carmín No comprobará si tienes los MysticTicket y AuroraTicket, respectivamente.(Raro pero no usables)
Flags 0x890 - 0x8FD: son flags del Worldmap
Flags 0x900: son usadas para la RAM e I/O, tambien estan ligadas al uso de variables, BAJO NINGÚN MOTIVO DEBEN SER USADAS.
*Como nota queda que este documento es exclusivo para FireRed, asi que hackers de Ruby/Emerald, no sean vagos e investiguen :v.


Bien, ahora queda enlistada cada flag conocida. Como puedes ver, son solo unas cuantas. Sin embargo, la mayoría son temporales o, como verás, muchas tienen descripciones como "Usadas para GAME START SCRIPT" o "Usara para árboles de CORTE...", osea que obviamente dichas flags no pueden usarse para otra cosa. En efecto, las únicas flags que puedes usar de esas son las que son usadas únicamente por un evento que facilmente puede ser borrado.

Por ejemplo, la flag 0x250: "Fijada si el prota recibe la.MASTER BALL del presidente de SILPH CO.". si eliminas dicho evento, entonces la flag es segura de usar.

Otro ejemplo es la flag 0x3A: "Controla la visibilidad del OW de la POKEDEX de OAK's en su Laboratorio (PALLET TOWN (4.3)". Si remueves las Pokedex, entonces la flag queda segura de usar.

Un concepto erróneo común es creer que las flags que no estan en la anterior lista son seguras. Es Totalmente Falso. En general, solo las flags 200-2FF son las únicas que no aparecen en la lista y son seguras. No se enlistaron más ya que aún se desconece su función, pero ten siempre en mente que si no son las flags anteriormente descritas, NO LAS USES.

Asi que, si vas a scriptear las flags a usar deben ser:

Código:
[B]200-2FF
Flags para eventos que pueden manipularse i-game.[/b]

La mayoría de flags 100's son usadas para controlar la visibilidad de items en el suelo. Personalmente es preferible dejar esas flags para nuevos items en el suelo, sin embargo, si borras ese item de mapa, no hay razón para no usar su flag.

Esta regla aplica a todos los juegos de GBA.

Es posible repuntear las flags para tener más, pero eso implica usar el ASM como lo usa JPAN, Jambo51 o ShinyQuagsire (Que en mi opinion son brujos (?))

Para finalizar un resúmen del porque no puedes usar las flags no seguras (Si eres cabezota y no entendiste)

-Porque son temporales, se resetearán en cualquier momento
-500-700 son flags para entrenadores
-Flags arriba de 900 comparten datos con las variables.

Ahora si ¿Queda claro todo?

[size="4"]Variables[/size]

Las variables son como las X en matemáticas (Alcancías como Cheve Diría). Estas pueden almacenar hasta 0xFFFF datos, en decimal es mas o menos 65,000. Como las flags, se usan para hacer funcionar el progreso de los eventos, la única diferencia es que estas almacenan datos, no son interruptores.

De nuevo como con las Flags se enlistarán las variables de relevancia:
[code]
Variables Relvantes
4000        Variable Temporal/desechable
                Valor escrito por comando special 0xE7.
4001        Variable Temporal/desechable.
4003        Variable Temporal/desechable? Usado en la TORRE DEL ENTRENADOR.
4006        Variable Temporal/desechable? Usada en las RUINAS SETE.
4008        Variable Temporal/desechable? Usada en las RUINAS SETE.
400E        Variable Temporal/desechable? Usada en las RUINAS SETE.
400F        Variable Temporal/desechable? Usado en la TORRE DEL ENTRENADOR.
4010        Variable Temporal/desechable.
                Escrito por el incompleto special 0x142.
4020        Podómetro. su valor siempre baja hasta llegar a 0x0000, cuando el REPELENTE expira.
4021        Podómetro. Max valor 0x007F; hace un bucle al llegar a 0x0000.
4022        Podómetro. Max valor 0x0004; hace un bucle al llegar a 0x0000
4023        Podómetro. Max valor 0x05DC; siempre mantiene un valor aleatorio.
4025        Podómetro? Usado para el script de  DAISY, ya que no se usa en otro sitio
            Siempre esta fijado a 0x01F4 (500) por el Engine
4031        El pokemon inicial que el prota escogió (0, 1, 2).
            Acceso directo por el special 0x129
4036        Multi-uso, usado para un minijuego que no recuerdo.
            Aparentemente fijado a 0x0000 cuando se inicia una ronda nueva.
            Aparentemente fijado a 0xFFFF cuando se acaba el tiempo.
4037        Caja donde caerá un pokemon recibido por un givepokemon, el Pokemon se envía a la caja que indica la variable.
            Valor leído por el special 0x165.
4038        Desconocido.
            Leído por los special 0xA6 y 0xA9.
            Escrito por el special 0xA8.
            Usado por el special 0xAA.
Variables 4000 can't be used because:
- Porque se sobrepondrían a la RAM usada por las Flags
- Los scripts no los reconocen como variables.
- Los scripts funcionan así: "si el argumento es menor a 0x3FFF, luego buscar el valor del número del argumento de la variable y usarlo como valor. Por supuesto, usar el argumento como un valor." en resúmen, le provocas dolores de cabeza al pobre Rom :c
- Algunas de estas que no aparecen han sido declaradas inseguras. Aunque claro, es un misterio si son seguras o no.
Variables 0x4100 ta 0x417F (inclusive) se sobreponen a la RAM usada para un tipo de datos especial llamados "Variables Ocultas" -- tienen fijadas 64 dwords que es usado en algunos comandos cuyo propósito se desconoce.
-Variables 0x5084 to 0x55CC sobreescriben la RAM aparentemente usada para datos random. Se desconocen los efectos que suceden al sobreescribirla, pero parece ser irrelevante.
-Variables 0x56F4 - 0x5EF3 parece que tambien se sobrepone a la RAM usada para la PC. Estas no aparece en la documentación de JPAN (La figura de 0x5EF4 la propuso el) no es un cálculo preciso, talvez sea que el rango de RAM usada no se sobreponga a parte escencial de la PC.

Extraoficialmente -- dato no oficial -- es que las únicas variables seguras sean 0x4000 to 0x40FF (inclusive), excluyendo las variables anteriormente descritas ya que son usadas por el engine.

Basicamente, es mejor aprender a ahorrar variables al máximo. Si es necesario, reemplazalas por flags (dependiendo la situación) ya que como pudimos ver las variables son mucho menos que las flags.


En general, solo las variables 0x4011-0x40FF son seguras. Las demás sobreescriben direcciones de la RAM usadas en la PC, cajas o flags, o son temporales/desechables. Como ya dije, muchas de estas se sobreponen a direcciones dinámicas de la RAM, usadas por el engine, por lo tanto debes ser cuidadoso con ese detalle. Chequea las listas, usa el método científico para llegar a conclusiones; Es la única manera de saber cuales son seguras y cuales no. Fuera de este rango, terminarás estropeando funciones de los special o comandos de scripts, otra consecuencia es generar Huevos Malos.

(Y de nuevo, las reglas aplican a todos los Rom de GBA.)

Ahora repasemos:


Flags Seguras:
->200-2FF
->Flags de eventos o OWs están removidas


Variables Seguras:
->0x4011-0x40FF
->Recuerda revisar la lista! Algunas variables tienen su función específica!

Creditos:

DavidJCobb- Parte de la documentación de este documento.

Jambo51- Explicación de las funciones de las flags arriba de 0x900 y porque son altamente peligrosas

karatekid552: Gran parte de este documento (Mayoría)

Güld: Traducción y clarificación de algunas funciones, además encontrar los restos de las flags que cada 8 horas son reseteadas.

~Paaz
.
 

Dragonite

But where's your heart
Respuesta: FR | Scripting | Sobre las Flags y Variables.

Joder, son tan pocasí Recuerdo haber usado flags y vars mucho mís altas y no tener ningún problema al respecto...

Pues gracias por la info.

Aclaro: Son 255 flags y 238 variables. Pero a mí me parecen pocas, vamos.
 

CelticFrostie

Sexador de pollos
Hombre, 255 y 238... La verdad son pocas, sí, pero hay que ver que esas son las libres SEGURAS.
Hay muchas fuera de lo que tú dices con las que no he tenido problema, así que supongo que sin liarla mucho podrás usar al menos 1/3 más, digo yo.
Gran investigación y gracias!
 

MegaSceptile9

Usuario mítico
Respuesta: FR | Scripting | Sobre las Flags y Variables.

Empecé a usar las flag desde la 500 en adelante y no
he tenido ningún tipo de problema -.- y también las de
200 en adelante.
 

Sayer301!

UnityLord!
Miembro de honor
Respuesta: FR | Scripting | Sobre las Flags y Variables.

No entiendo lo de las flags de entrenadores, te refieres a lo relacionado con el comando "Chektrainerflag"??

Porque yo hasta ahora estoy usando las flags de la 500 a la 700 y no he tenido ningún problema.
 

Naren Jr.

Puto amo
Usuario de Platino
Respuesta: FR | Scripting | Sobre las Flags y Variables.

Nunca he tenido problemas con flags a menos que cuando recién comenzaba colocaba una que no era eso fue RE-TROLL en fin buen tuto :eek:o servirá de mucho para saber que valores andan libres.

saludos /._./
 

Lilith.

Without Heart
Respuesta: FR | Scripting | Sobre las Flags y Variables.

Gold dijo:
Les explicaré:
El problema de usar incorrectamente las flags/variables es que las anteriormente descritas sobreescriben el espacio de memoria RAM que usan otros comandos, el usarlas es como jugar a la ruleta rusa, o simplemente es como sobreescribir datos, o porque no es posible saber cuando comenzará un bug o glitch.

Si quieren mas flags/variables seguras de usar sigan este tutorial http://whackahack.com/foro/t-30988/fr-asm-extendiendo-flags-variables-disponibles#post273850
.
 

H.B.P

Emperador Kaktiácero
Miembro de honor
Respuesta: FR | Scripting | Sobre las Flags y Variables.

Curioso lo que puedes descubrir explorando un poco, pero aún así, me parece increíble que se haya olvidado de una de las flags más importantes del juego: la que activa el Menú Pokémon. En fin, volviendo con el tema, nunca me han gustado demasiado las flags, tan sólo las utilizo cuando es estrictamente necesario (por ejemplo, para hacer desaparecer minis), y respecto al tema de las variables, nada que decir, aunque quizás haya podido emplear variables del rango de 7F00 hacia abajo.

+Gracias.
 

Yainish

Usuario de platino
Respuesta: FR | Scripting | Sobre las Flags y Variables

¿Entonces es por eso por lo que se me resetean las variables cuando cambio de mapa, porque uso desde la 4000?
(Estoy empezando el proyecto y aún no he llegado a la 4011)
 
Arriba