Registrarse

GBC | [En proceso] 510 movimientos/ataques

Estado
Cerrado para nuevas respuestas.

Chamber

Miembro insignia
Miembro insignia


Hola Mundo!!

Aprovechando que GBC esta estrenando seccion de investigaciones les hablare de mi trabajo actual.

Como sabran (o no), en los cartuchos de I y II generacion, el numero total de "cosas" esta limitado a 255 y los Ataques no son la excepcion. Debido a que incluir nuevos pokemon o fakemons requere tambien de ampliar sus learnsets he decidido ampliar los movimientos por diversidad.



Teoria:

Asi como una vez KBC propuso usar un bit sin usar en los datos del Nivel de cada pokemon, yo propongo usar el ultimo BIT dentro de los PP de cada movimiento del pokemon en la party para diferenciar entre dos tipos de tablas (255 movimientos en cada una).



Practica:

Estas son algunas de las rutinas que he tenido que intervenir y una breve descripción de ellas:
  • PpUp: Se limita el uso de un PP UP a 1 por movimiento, similar al PP Max para evitar que altere los movimientos. El unico inconveniente es que este nuevo proceso aumenta el PP un 50%, a diferencia del 60% del PP Max de las nuevas generaciones.
  • UpdateMoveData: Rutina encargada de cargar los datos de cada movimiento a la RAM cada vez que entramos a un turno de batalla.
  • GetMoveName: Ahora tendra que leer 2 tablas para darnos el nombre.
  • GetMoveData: idem.
  • ListMoves: Una rutina un poco compleja. Carga todos los movimientos de nuestro pokemon en una caja de texto. Usada generalmente cuando se va a aprender un nuevo movimiento.
  • LearnMove: idem.
  • MoveInfoBox: Se encarga de definir los atributos de cada movimiento asi como su descripcion.



Resultados:
De momento he usado como segunda tabla los datos de los objetos, pero ya se puede observar que es funcional los cambios hechos en las rutinas. Datos de los movimientos de los pokemon:





 

Shido

comiendo personas
Respuesta: GBC | [En proceso] 510 Movimientos/Ataques

Muy bien espero que esta investigación de frutos será util aunque yo no trabajo en gbc
Pero a los que si les gustara.
 
Respuesta: GBC | [En proceso] 510 Movimientos/Ataques

waao, ya prácticamente lo has logrado compa, felicidades x ello será bueno tener todos los ataques en una rom , lo único inconveniente es que a tantos ataques y pocos pokemon para usarlos, imagino que algunos no se usaran c tema de espacio, el punto es si se quiere ver a todos los ataques puestos en un pokemon seria bueno también poder ampliar el numero de pokemon a 512 como se menciono en una investigación iniciada por KBM y publicada ya hace tiempo en este foro por Gallego...
Ojala se pueda los de la ampliación de los pokemons, y suerte con esta investigación aunque veo que ya casi lo logras
Saludos compa...
 

Master Brock

Miembro insignia
Miembro insignia
Usuario de Platino
Respuesta: GBC | [En proceso] 510 Movimientos/Ataques

No se.... será que estoy loco o no se, pero cada día me pareces mas el puto genio de GBC.

Decimos que @eing es el mejor hacker en cuanto a conocimiento de GBA de toda wah (Al menos eso es mi punto de vista)
Pero tu eres el mejor hacker de GBC por muchísimo de todos los que conozco.
Y eso que conozco a buenos hackers amigos mios de GBC (80C por ejemplo)

Es un avanza enorme el poder disponer de 510 movimientos en total, sin duda mejora enormemente las estrategias de combate y da lugar a nuevos entrenadores mas fuertes y mas duros.

Enhorabuena tío, esperemos que se complete pronto.
 

Pum

GBCero
Respuesta: GBC | [En proceso] 510 Movimientos/Ataques

Sería posible incrementar la cantidad posible de TM's para meter nuevos movimientos a partir de esto?

Sería perfecto que esta investigación acabe dando sus frutos. Como hacker de GBC romper esta barrera sería muy bueno.
 
Última edición:

Chamber

Miembro insignia
Miembro insignia
Respuesta: GBC | [En proceso] 510 Movimientos/Ataques

@WiZaRD: Ya lo comentamos por aqui pero seria bueno decirlo en publico. Los 510 movimientos no esta directamente relacionado con los 507 pokemons. Tener mas pokemon implica mas trabajo del que habia imaginado, asi que por el momento ya no estoy "molestando" a Crystal_ con eso.


@Master Brock: Gracias por tu apoyo y comentarios en mis temas. Siempre espero que con este tipo de investigaciones salga a la luz nueva gente que quiera unirse al bando GBC.

PD: Ya juego el Dragon Warrior Monster's 2.


@Pum: El primer problema que atraviesa esta investigacion hablando de las TM es que no es posible tener movimientos de la segunda tabla (256+) en las TM/HM de manera facil, sin embargo ya trabajo en un sistema para tener esa compatibilidad.

Ahora, incrementar la cantidad de TM/HM no lo veo factible por que eso implica ampliar el bolso de las TM, lo que si me resulta tedioso en comparacion a otras alternativas, como por ejemplo los tutores de movimientos. Pasate por la seccion de parches y mira mi recopilatorio de parches GBC, ahi encontraras el parche de tutores que amplia hasta 32 nuevos tutores.
 

Crystal_

Héroe de WaH
Respuesta: GBC | [En proceso] 510 Movimientos/Ataques

Como sabe GetMoveName (o cualquier de otra de esas rutinas que nombras) de que dirección tomar ese último bit? Podría haber hasta 48 direcciones ram que almacenen los PP de un movimiento (6 pokemon * 4 ataques * 2 entrenadores). Es mas, el movimiento del que GetMoveName quiere obtener el nombre (o del que GetMoveAttr quiere obtener un atributo, etc) no necesariamente tendría porque ser uno de esos 48 o estar relacionado con alguno de ellos.

Con esto quiero incidir en que te vas a encontrar con los mismos problemas que hablamos en lo de 2^9 Pokemon. No es suficiente con modificar esas rutinas, sino que hay que identificar todas las llamadas a esas rutinas e indagar sobre cual es la función que realizan para que la llamada a la rutina genérica (como GetMoveName) se lleve a cabo con los parametros precisos. Tener un noveno bit en ram de soporte te puede ayudar, pero no veo ninguna relación concreta entre los PP en la estructura de un Pokemon con algo tan genérico como "movimiento" que te pueda ser de ayuda. Terminaras llegando a la conclusión de que mantener ese noveno bit en cada direccion de PP no te aporta ninguna información adicional en comparación a si usas una única dirección ram que irás actualizando según sea necesario.

El engine de batalla se basa en la premisa de que ataques, pokemon y muchas otras variables se pueden referenciar con un solo byte. Todo se ha construido basado en eso. Modificarlo requiere realizar cambios desde muy abajo.
 

Chamber

Miembro insignia
Miembro insignia
Respuesta: GBC | [En proceso] 510 Movimientos/Ataques

@Crystal_ Me da gusto que apareciera alguien de tu calibre con todas estas incognitas asi que te planteo la teoria y de paso me ayudas con ella.

GetMoveName es una rutina muy generica tu lo has dicho y su modo (obvio) de funcionamiento es comprobando si el noveno bit esta activado. Como la rutina es solo una disyuntiva (solo tiene dos caminos) no pasa nada si el 9no bit no esta activado. A partir de ahi es donde entra un DECIMO bit en el caso de la batalla.

No lo he platicado con nadie por que tu eres el unico que me entenderia en terminos de ASM GBC, pero el sistema "fisico-especial" que usa el naturia es mucho mas complejo que el que en su momento me enseñaste a traducir, aquel de KBC. En este nuevo sistema se usa un byte auxiliar para CurMove, lo que define caracteristicas como si es fisico, de contacto, se activa la king's rock, etc., por lo que es ahi donde coloco el Decimo bit que solo es referenciado cuando hablamos de CurMove y similares.

Otro caso es cuando usamos LearnMove, antes de cada llamada yo uso una rutina auxiliar donde mediante un Byte (solo 4 bits enrealidad) determino el orden que tienen los 4 movimientos dentro de las 2 tablas de movimientos, asi tengo todo mejor organizado.

Por ultimo te agrego que las rutinas tienen un "candado" que evita que las propiedades de byte axuliar sean heredadas a otra rutina, por que como sabras, son muchas las rutinas que hacen llamada a un mismo movimiento a la vez. Del mismo modo el candado da seguridad a rutinas que en este momento no quiero tocar, como las de las TM.
 
  • Me gusta
Reacciones : Pum

Crystal_

Héroe de WaH
Respuesta: GBC | [En proceso] 510 Movimientos/Ataques

GetMoveName es una rutina muy generica tu lo has dicho y su modo (obvio) de funcionamiento es comprobando si el noveno bit esta activado. Como la rutina es solo una disyuntiva (solo tiene dos caminos) no pasa nada si el 9no bit no esta activado. A partir de ahi es donde entra un DECIMO bit en el caso de la batalla.
Independientemente de los bits que quieras utilizar, el problema viene de mas abajo. GetMoveName no entiende otra cosa que no sea un numero hexademinal que ella recibe en la direccion d265 e identifica como un movimiento que tiene que convertir en texto. La rutina no entiende de nada mas. Lo escribiré de otra forma, si por ejemplo [wd265] = 0x87, de que tabla lées el movimiento? Es decir, si [wd265] = 0x87, en que te basas para poner el noveno bit a 0 ó ponerlo a 1?

La solución no puede ofrecerse a nivel de GetMoveName ya que no es posible generalizar a todos los casos. Por tanto, debe proporcionarse a nivel de cada una de las rutinas que llaman a GetMoveName.

Ten en cuenta que con +256 movimientos ese noveno bit es parte de lo que define de que movimiento se trata. A fin de cuentas lo que llamamos noveno bit no deja de ser convertir el identificador de movimiento de un número de 1 byte a otro de 2 bytes. Es como pretender que tu llames a GetMoveName dándole solo un numero entre 0 y 63 y que esta rutina sea capaz de deducir por si sola los otros dos bits del movimiento en base a nada más.
 

Chamber

Miembro insignia
Miembro insignia
Respuesta: GBC | [En proceso] 510 Movimientos/Ataques

Bueno te cuento como viene de atras.

No tengo el nombre preciso de la rutina ni los nombres de la ram por no estar en mi pc, pero el tipo de nombre se define por una tabla. GetMoveName lo que hace es llamar a GetName poniendo $02 en "RamX", entonces mi nuevo GetMoveName al leer el 9no bit cambia el $02 por $04 y asi define que GetName toma el nombre de la segunda tabla.

En general GetMoveName es la rutina mas dificil de adaptar por el nivel tan basico que maneja, de ahi en mas todo es un poco mas simple y todo se hace como dices:

RutinaBase solo distingue el 9no bit.
RutinaComun define la activacion del 9no bit.

En resumidas cuentas si trabajo a niveles mas basicos.
 

Crystal_

Héroe de WaH
Respuesta: GBC | [En proceso] 510 Movimientos/Ataques

Veo que sigues insistiendo en explicarme como las diferentes rutinas se manejan con ese noveno bit, que es lo mas superficial. Como actuar en función de ese noveno bit se puede enfocar de muchas maneras y me parece perfecto como lo has planteado.

Lo que vengo preguntando desde el principio es, como sabe "RutinaComun" o como quieras llamarla, si activar o no ese noveno bit? En que te basas para hacer saber a "RutinaComun" si debe poner a 0 o a 1 ese bit?

Tan solo quiero hacerte ver la necesidad de manejar cada caso de forma diferente. No puede existir una rutina común que pueda deducir cual debe ser el estado de ese noveno bit por si sola, sino que debe recibir esa información de la rutina llamante de la misma forma que recibe los 8 bits restantes. Es un problema muy trivial que te encontrarías nada mas empezar a trabajar. Es necesario estar mas o menos familiarizado con principalmente (parte del) engine de batalla -con el cual, afortunadamente, a diferencia de mí, ya deberías estar familiarizado en cierto grado debido a haber estado trabajando en implementar nuevos movimientos o habilidades- para poder aplicar los cambios precisos a todas las rutinas que tienen que ver con la gestión de movimientos para que "traduzcan" su forma de referenciar a un movimiento de 1 byte a 2 bytes (con ayuda de ese noveno bit).

La clave está en ver un movimiento como un número de 2 bytes. Ya que actualmente es un número de un byte, verás como el identificador de un movimiento generalmente se manejará con el registro a. Esa dirección RAM en la que almacenas el noveno bit debe servirte como extensión al regsitro a para identificar al ahora movimiento de 9 bits. De forma que cuando pases a GetMoveName, GetMoveAttr, GetMoveData, etc. el identificador del movimiento en el registro a (o cualquier otro registro de 1 byte), o en una dirección ram tal como wD265 (en donde se habrá cargado desde un registro de 1 byte), debes pasarle el bit 9 como si fuese parte de ese registro o dirección de ram, solo que la localización de ese bit mas significativo no será la misma que la de los otros 8.
 

Chamber

Miembro insignia
Miembro insignia
Respuesta: GBC | [En proceso] 510 Movimientos/Ataques

Lo que vengo preguntando desde el principio es, como sabe "RutinaComun" o como quieras llamarla, si activar o no ese noveno bit? En que te basas para hacer saber a "RutinaComun" si debe poner a 0 o a 1 ese bit?

Tan solo quiero hacerte ver la necesidad de manejar cada caso de forma diferente.
Y asi esta hecho :D

Despues de haberme sumergido en el mundo del sistema de batalla, lo comprendo a un 80% sin contar el AI. Esto me llevo a entender eso que mencionas desde hace tiempo: Cada caso especifico es diferente uno de otro y no se puede manejar con una o dos rutinas genericas.

Quizas lo burdo de mi explicacion en el post principal te llevo a entender eso, ya que solo digo "cambie X rutina para que identifique un 9no bit", pero la verdad es que detras de eso hay una red de rutinas que definen un unico valor almacenado en el registro a. Esto de la ampliacion de movimientos es exponensial, para llegar al byte que define el GetMoveName quizas antes se tuvo que pasar por una subrutina que se definia por 3 opciones en la ram, que a su vez cada una tuvo que pasar por otra subrutina igualmente definida por 3 variables, lo que nos da un lugar de un chequeo de 9 variables antes de llegar al resultado, en un ejemplo hipotetico. Es ahi donde yo tengo que intervenir 1,2,3 o n' rutinas antes de llegar a GetMoveName, por que el numero de variables ahora son 12 o mas.

Por ejemplo, para Predef MoveList solo lee 4 bytes en determinada RAM y los representa como una lista, de mi dependera que antes de cada llamada a MoveList poner una rutina que defina el 9no bit en base de si hablamos de un PartyMon, BattleMon o EnemyMon, por eso, todo lo que me has enseñado y todo lo que he aprendido a lo largo de mas de 6 meses intensivos de ASM es que las rutinas no son aisladas y siempre debes trabajarlas como una red, comunicandose unas con otras.

Este primer experimento posteado con una sola imagen es la menera mas simple de representar una semana de investigacion con resultados positivos en areas "importantes" de trabajar, como son el comportamiento en batalla del movimiento y la visualizacion del mismo en la stat box. Aun me queda mucho trabajo por delante, sobre todo planteando como es que el oponente va a hacer uso de ese 9no bit ya que nunca he visto que los oponentes usen PP por encima de lo normal.
 

Chamber

Miembro insignia
Miembro insignia
Respuesta: GBC | [En proceso] 510 Movimientos/Ataques

@Crystal_ Necesito un consejo.

La parte de player ya casi la resuelvo al 100%, pero la cosa es diferente con el enemy.

En el caso de los WildMon y TrainerType1 (los mas simples) resolvi que el nivel en que el pokemon aprende cada ataque determina a que tabla pertenece dicho movimiento en funcion de si el nivel es non o par, hasta ahi todo bien. Ahora, para los TrainerType2 y 4 cuyos datos de los movimientos provienen del ROM no encuentro una manera facil de resolverlo.

La manera correcta que pense para resolverlo fue haciendo una tabla auxiliar referenciada segun el OtherTrainerClass y el OtherTrainerID donde un byte (mediante bits) determina que movimientos pertenecen a la primera tabla y cuales a la segunda. Esta solución me da pereza hacerla ya que implica hacer calculo de cada uno de los pokemon del entrenador, de todos los entrenadores.

Mi siguiente opción es que al momento de cargar los datos del trainer dependiendo de si el CurPartyLevel es par o non tomar solo dos caminos. Si el nivel es par, todos los movimientos pertenecen a la primer tabla y si es non solo los primeros dos movimientos pertenecen a la primer tabla mientras que los otros dos pertenecen a la segunda.

Como ves esta ultima solucion? la verdad es que apunto a cosas mas practicas que exactas.
 

Crystal_

Héroe de WaH
Respuesta: GBC | [En proceso] 510 Movimientos/Ataques

La última opcion te limita bastante y no veo la razón por la que tenga que ser así.

En cualquier caso evitaría emplear la RAM si no es necesario. Amplia los datos de los 4 movimientos de cada pokemon de 4 a 5 bytes, y utiliza 4 bits de uno de ellos para determinar a que tabla pertenece. O si eso te va a suponer mas trabajo, utiliza una tabla aparte, preferiblemente por simplicidad en el mismo banco (0E).
 

Chamber

Miembro insignia
Miembro insignia
Respuesta: GBC | [En proceso] 510 Movimientos/Ataques

En cualquier caso evitaría emplear la RAM si no es necesario. Amplia los datos de los 4 movimientos de cada pokemon de 4 a 5 bytes, y utiliza 4 bits de uno de ellos para determinar a que tabla pertenece. O si eso te va a suponer mas trabajo, utiliza una tabla aparte, preferiblemente por simplicidad en el mismo banco (0E).
Como tu trabajas desde GitHub lo dices tan facil (?)

Ya sabes que los GS lovers tenemos "Herramientitis", asi que si amplio los datos de 4 a 5 bytes, adios tools.

Lo correcto seria también hacer una tabla aparte, aunque no dentro del mismo banco por que las herramientas lo borran (si lo se, apestan). Lo dejare para después a ver si me ilumino viendo otras rutinas. Se me ocurren muchas ideas de como colgarme de datos previos de la RAM, pero solo implica la personalizacion por trainerclass y no por pokemon.
 
Última edición:

Chamber

Miembro insignia
Miembro insignia
Pum dijo:
Cómo se hará para diferenciar entre una tabla y otra a la hora de poner estos nuevos movimientos en movesets de Pokémon (Ya sea en equipos contrarios en un editor de entrenadores o para editar los movimientos que aprenderá el pokemon por nivel) o en TMs. O en general en la ROM.
@Pum Estoy planeando que este parche tenga compatibilidad con herramientas por eso esta es mi "solucion" para cada aspecto. En el caso de los Learnsets lo que define a que tabla pertenece cada movmientos es el nivel al que aprende el ataque, siendo que los pares se usan para -255 mientras que los nones para +256, asi sera mas "facil" la edicion para novatos mediante herramientas.

En el caso de las TM se tendrá que hacer mediante Hex, habrá una tabla de bits (8-bytes para las 57 TMHM) que definirá el tipo de tabla. En su momento compartiré una herramienta que hizo @javcdark para editar bits.

En el caso de los trainers es mas complicado ya que lo unico "editable" es el nivel, objeto y los movimientos y por ese lado no podria tocar el ultimo bit del nivel por que esta pensado para usarse en una posible ampliacion del pokedex. Los trainers en los que no se definen los ataques no hay problema por que toma el esquema non-par descrito anteriormente; para los que si definimos los ataques simplemente queria hacer que los primeros 2 movimientos fueran de la tabla 1 (-255) mientras que los ultimos dos fueran de la tabla 2 (+256) pero en la practica no se que tan bueno o malo sea esto.

Se aceptan sugerencias...
 
Estado
Cerrado para nuevas respuestas.
Arriba