Registrarse

[ROM Hacking GBC] Pregunta/respuesta rápida

Estado
Cerrado para nuevas respuestas.
Respuesta: Consultorio de dudas de GBC

Gracias, probé con el tile layer pro, pero es bastante complicado porque estan bastante desordenados los sprites de iconos que me es imposible
 

Chamber

Miembro insignia
Miembro insignia
Respuesta: Re: Consultorio de dudas de GBC

No es posible crear más de 255 ataques sin modificar con ASM la forma en que el juego carga los ataques, haciendo una rutina que diferencie entre dos tablas distintas con 256 valores cada una. Para hacer algo así hay que estar bastante experimentado en ASM, por lo que si no eres Koolboyman o Tauwasser y no quieres pasarte meses buscando la manera de hacerlo, es imposible.

Eso sí, puedes repuntear la tabla para tener 3 ataques extra (0xFC, 0xFD y 0xFE) pero me da a mí que no merece la pena.

Saludos ;D
Despues de 9 meses de haberte preguntado como repuntear la tabla de ataques y que ninguno de los dos supo, aqui traigo la respuesta gracias a mis clases de 5 minutos de ASM con Crystal_ y Miksy91, asi por lo menos tenemos 3 ataques extras para usar:

2-Byte Pointer Pokemon Gold:
0x37f79

Bank Byte Pokemon Gold:
0x37F82
Edito: La informacion anterior esta incompleta, el juego cuenta con 5 rutinas que hacen referencia a la tabla de movientos. De momento solo se que las primeras dos corresponde a los pokemon del rival en batalla y a los nuestros en la party o en batalla. De cualquier forma les dejo las direcciones:

Pokemon del rival:
$DA7F = Pointer
$DA8B = Bank

Pokemon propios:
$37f79 = Pointer
$37F82 = Bank

$394D3 = Pointer
$394DF = Bank

$3D4AC = Pointer
$3D4B8 = Bank

$50974 = Pointer
$5097D = Bank

Edito2: revisen el tema de offset utiles, ahi esta el resto de la informacion.
 

Chamber

Miembro insignia
Miembro insignia
Respuesta: Consultorio de dudas de GBC

@Crystal_ @javcdark @GOLD_Z!APODOSDESHIT @Kurisutaru♪

Traigo entre manos usar los espacios vacios que hay en el juego (GSC) para agregar +2 pokemon a la pokedex (que es algo de mentira ya que no me interesa verlos en el pokedex de momento).

La duda me surge en que cosas tengo que modificar. Voy a enumerarlas y ustedes me ayudan si me falta alguna.

  • Move/Evo Data. Esto no es dificil ya que con poquito hex y la herramienta de Mateo puedo repuntear todo de golpe.
  • Base Stats. Aqui la veo un poquito dificil. Sucede que como los datos son fijos, tengo que repuntear TODA la tabla (no pesa mucho, cerca de 0x2000). Hasta el momento encontre 2 rutinas para repuntear, asi que teoricamente no hay problema.
  • Minis en la Party. Aqui hay un ligero problemita, si mal no recuerdo el banco esta EXACTO a las necesidades para agregar 3 minis mas a los existentes. De cualqueir forma, 3 bytes de algun lado han de salir.
  • Pokepic. Aqui es de facil solucion, el sprite de Raticate estorba para agregar los 2 (3) pointer mas, asi que repunteo a Raticate y asunto arreglado.
  • Entradas del pokedex (proximamente).

Segun me parece con esto es suficiente para tener otros dos pokemon.

Pd: Los pokemon nuevos son los 0xFC y 0xFD. 0xFE se usa para los huevos.
 

Crystal_

Héroe de WaH
Respuesta: Consultorio de dudas de GBC

lol y de donde te vas a sacar 2000 bytes de una misma bank? (podrias llevarlo a la ultima bank pero no crees que eso es ir un poco a lo loco :p). Podrias hacer un checkeo especial: si pokemon <251 todo igual pero si >251 leer de una tabla por separado que apunte a los stats del pokemon 252 (por cierto cual es el del egg, 253 no?, supongo que el 2do pokemon seria 254 entonces).

como dices el move/evo data es de longitud indefinida y por tanto utiliza pointers separados, no deberia ser mucho problema (simplemente repointeas tambien bulbasaur para hacer sitio a dos pointers mas y ya esta).

Se me ocurre tambien cries y egg moves pero eso no deberia suponer demasiado problema.
 

Xuuki

holi
Respuesta: Consultorio de dudas de GBC

segun yo tenia entendido que solo es posible agregar un solo poke mas...

aun asi las entradas a modificar son
0x40C0E, 0x40C1c, 0x40BFC, 0x40BF7, 0x40C65-40D5F, 0x40D60-40E5B

lamentablemente solo tengo los offsets, no se para que sirve cada uno :(
 

Chamber

Miembro insignia
Miembro insignia
Respuesta: Consultorio de dudas de GBC

@Crystal_ Se que decir que repuntear 0x2000 bytes es una barbaridad, de hecho volvi a leer mi post y es una locura, pero no encuentro una solucion facil. Ya lo hice con los movimientos, no eran tantos como estos (0x600) pero en teoria es lo mismo. Obvio no los voy a mover dentro del mismo Bank, los voy a mover a otro diferente. Lo de la rutina <Menor que, mayor que> es algo complicado no creees? por que no se que tantas otras rutinas se tengan que modificar para que tomen en cuenta eso.

Cierto con los Cries y los Egg. Los Egg ya los tengo localizados, aunque ni tendrian eggmoves al tratarse de Metagross y Slaking. Respecto a los Cries, eso va a ser un problema; no me refiero a los pokemon para agregar, si no a todo mi hack en general. Ni pinche idea de como igualar los sonidos de cada pokemon.

@javcdark Si es posible agregar dos pokemon mas, y como dice crystal_ serian el 252 y 254 por que el 253 es el huevo. Lo de los offsets, te explico.

0x40C1C es para definir el numero de pokemon en el pokedex nacional.
0x40BFC define el numero de pokemon en el pokedex de Johto.
0x40BF7 se localiza el pointer (supongo que de 2-bytes) de la tabla del Pokedex de Johto.
0x40C65-40D5F es el orden del pokedex alphabetico.
0x40D60-40E5B es el orden del pokedex de Johto

0x40C0E No tengo idea de que sea, pero obvio sera algo del pokedex.

Gold_Z!APODOSDESHIT @Kurisutaru♪ no te hagas pato y opina!!:trollface:
 

Crystal_

Héroe de WaH
Respuesta: Consultorio de dudas de GBC

Lo de la rutina <Menor que, mayor que> es algo complicado no creees?
No deberia ser tan complicado. Esto es lo que tenemos:

Código:
#org 3A79
push bc
push de
push hl
ld a,(FF00+9F)
push af
ld a,14
rst 10 ; cargamos la bank 14 en ram
dec a ; numero-1
ld a,(CE60) ; tomamos el numero del pokemon
cp a,FD ; si es un huevo...
jr z,Label3A9E ; ...se maneja de forma diferente
ld bc,0020 ; logitud de los base stats data de cada pokemon
ld hl,5B0B ; puntero
call Label31A3 ; rutina que se encarga de llevarnos a la posicion correcta (añade 0020 a 5B0B tantas veces como corresponda) 
ld de,D120 ; a partir de aqui tan solo se trata de cargar el base stats data que ya hemos tomado en las direcciones de RAM que corresponda
ld bc,0020
call Label311A
jr Label3AB3
Label3A9E: 
ld de,7A83
ld b,55
ld hl,D131
ld (hl),b
ld hl,D132
ld (hl),e
inc hl
ld (hl),d
inc hl
ld (hl),e
inc hl
ld (hl),d
jr Label3AB3
Label3AB3:
ld a,(CE60)
ld (D120),a
pop af
rst 10
pop hl
pop de
pop bc
ret

#org 10
Label10:
ld (FF00+9F),a
ld (2000),a
ret

#org 31A3
Label31A3: ; decrementar numero del pokemon y hacer loop mientras sea distinto de 0
and a,a
ret z ; bulbasaur
Label31A5:
add hl,bc
dec a
jr nz,Label31A5
ret

#org 311A
Label311A: ; cargar byte a byte en la RAM hasta que esten todos
inc b
inc c
jr Label3121
Label311E:
ldi a,(hl)
ld (de),a
inc de
Label3121:
dec c
jr nz,Label311E
dec b
jr nz,Label311E
ret
En realidad no hay mucho que cambiar. Ademas como solo se trata de dos pokemon adicionales, podemos apuntar a cada uno por separado (lo mas sencillo teniendo en cuenta que el huevo esta intercalado)

Código:
#org 3A79 
(...)
ld a,(CE60) ; tomamos el numero del pokemon
jp ComprobarMasDe251 ; originalmente cp a,FD
nop
nop ; originalmente jr z,Label3A9E
; ningun cambio en la rutina original a partir de aqui
MenorIgual251: 
ld bc,0020 ; longitud de los base stats data de cada pokemon
ld hl,5B0B ; puntero
call Label31A3 ; rutina que se encarga de llevarnos a la posicion correcta  
Todos:
ld de,D120 ; cargar en ram donde corresponda
ld bc,0020
(...)

#org 53B15 ; ya tenemos cargada la rom bank 14 ($50000-$54000) en ram $4000-$7FFF
ComprobarMasDe251:
cp a,FD ; 
jp z,Label3A9E ; primero ponemos el salto si es huevo que habiamos eliminado para hacer hueco al jump
cp a,FC ; si no es huevo, comparar con numero 252
jp c,MenorIgual251 ; si es menor que 252, hacemos como tal y como estaba la rutina original
jr nz,NoEs252 ; si llegados aqui no es numero 252 (FC), entonces es 254
ld hl,7C00 ; stats pokemon 252
NoEs252: 
ld hl,7C20 ; stats pokemon 254
jp,Todos ; en caso de ser 252/254, ya tan solo falta cargar en la ram
 

Xuuki

holi
Respuesta: Consultorio de dudas de GBC

gracias @Chamber, la verdad es que no segui en esto de añadir pokemon porque en mi hack nisiquiera ocupo los 251 pokemon existentes :)

Por lo mismo de que el huevo es el 253 sabia que solo era posible añadir el pokemon 252, pero si se puese hacer un salto al 254 pues entonces a darle

y me puse a revisar los offset y vi que 0x40C0E tiene el mismo valor que 0x40C1C y 0x40BFC, por lo que puedo suponer que se trata de la cantidad de pokemon en el modo alfabetico
 

Chamber

Miembro insignia
Miembro insignia
Respuesta: Consultorio de dudas de GBC

@Crystal_ A que rutina corresponde el #org 3A79??? A la carga de Stats?

Si es asi, podemos hacer algo un poco diferente. Podemos hacer que comprube si el pokemon lleva "X" item, y de se asi dar un salto a que cargue Stats diferentes?

Y lo mismo se puede hacer con la rutina de carga de Sprite y Back Sprite???


@javcdark, ya revise y si, lo mas logico es que sea la cantidad de alphabeticos.
 

Crystal_

Héroe de WaH
Respuesta: Consultorio de dudas de GBC

la rutina en 3a79 es la que se encarga de llevar los base stats data del pokemon a la ram, a partir de ahi ya se usaran como se tengan que usar. Es probable que no haya nada mas que cambiar respecto a base stats data pero no estoy seguro.

No entiendo que quieres dedir con lo del item explicate e.e, quieres forzar a que los pokemon 252 y 254 lleven siempre un determinado item? De todas formas es posible que el item se carge despues de los base stats por lo que eso no seria posible.

Respecto a los sprites el pointer viene definido en los base stats. Habria que buscar una bank con espacio 4 sprites y apuntar a donde corresponda en esa bank.

He estado investigando un poco y 0x40C0E cae aparentemente en la rutina que se encarga de llevar a la ram el orden viejo de la pokedex:

#org 40C08
ld hl,C5D0
ld a,01
ld c,FB
Label40C0F:
ldi (hl),a
inc a
dec c
jr nz,Label40C0F
call LabelC18
ret

Simplemente se encarga de escribir 01 en C5D0, 02 en C5D1, 03 en C5D2... hasta FB.

C5D0 es la ram address donde se guarda el orden de la pokedex. Por ejemplo en modo viejo se ve 01, 02, 03, 04..., FB, en modo nuevo se ve 98 (chikorita) 99 (bayleef) 9a (meganium) 9b (cyndaquil) 9c (quilava) 9d (typhlosion) etc y en modo alfabetico tan solo aparecen los pokemon que han sido vistos, evidentemente en orden alfabetico.

Las rutinas que se encargen de llevar el orden de las pokedex a la ram, habria que añadir que incluyan dos pokemon de mas. Lo bueno es que al parecer es posible utilizar las dos ram addresses justo despues de celebi (se actualizan al salir de la pokedex y durante la pokedex parece que no se usan), pero solo lo digo a simple vista
 

Chamber

Miembro insignia
Miembro insignia
Respuesta: Consultorio de dudas de GBC

Lo que te explico del item es que hagamos una rutina que haga un salto cuando "Y" pokemon tiene equipado "X" pokemon, osea MEGAEVOLUCION!

Asi podriamos cargar diferentes stats y con la otra rutina cargar un back diferente o un Front diferente (para el rival).

Por lo que dices que no es posible, no me refiero a que el item se cargue en el juego, si no que la rutina compruebe que item lleva el pokemon en cuestion, aunque no se si se tome como direccion fija el del primer pokemon o si el juego toma el slot del party correspondiente durante un cambio y tendria que ser dinamico la busqueda del item. De cualquier forma tu eres muy inteligente y sabras como hacerlo :D
 

Crystal_

Héroe de WaH
Respuesta: Consultorio de dudas de GBC

es decir, tu lo que quieres no son dos pokemon adicionales simplemente, quieres que se comporten como 'megaevoluciones' como las de gen 6, eso dices?

Pero en ese caso no seria necesario meter esos pokemon en la pokedex, no? O es que hasta las megaevoluciones tienen entrada en la pokedex? I sobre los movimientos por nivel y evoluciones, entonces deberian ser iguales de los del pokemon del que megaevoluciona, no? (o es que esto de las megaevoluciones es mas complejo de lo que pensaba???)

Si lo que te refieres es a esto seria mas sencillo trabajar simplemente sobre las rutinas (la de tus pokemon y las del enemigo) que carga los pokemon en combate, pero si quieres entradas en la pokedex seria mucho mas complejo.
 

Chamber

Miembro insignia
Miembro insignia
Respuesta: Consultorio de dudas de GBC

@Crystal_ No no, solo me desvie del tema, la verdad si necesito las dos entradas para hacer unas evoluciones que me hicieron falta; Slaking y Metagross como lo comente.

Lo de las megaevoluciones surgio a partir de la rutina que hiciste.

Crees que se pueda engañar al juego y que las Megaevoluciones sean Extras??
Veras, no necesitan cargar ID, ni Learnset ni nada, por que siempre es el mismo que el del poke sin evolucionar, lo unico que se necesita modificar son los Stats, Tipos y Sprites. de ahi en mas podemos tomar todo del pokemon original.

Como serian "ficticios" no necesitan tener entrada en el pokedex, que hasta donde se, en pokemon XY no tienen.

Entonces si sera facil??
 

Crystal_

Héroe de WaH
Respuesta: Consultorio de dudas de GBC

Si una megaevolucion nunca va ser usada por un oponente, entonces bien porque basicamente nos cargamos la mitad del trabajo.

En ese caso trabajar sobre a la rutina que carga los datos de un pokemon cuando lo envias al combate. Lo que añadas deberia ocurrir en un momento en el que los datos ya estan en ram pero el spriet todavia no se a mostrado. Deberias comprobar el byte de la ram que indica el item que lleva, y si coincide con el de la megaevolucion habria que actualizar stats, tipos y sprites.

Aunque esto supondia que el pokemon aparece directamente en combate con la megaevolucion, no se si querrias que salga algun tipo de texto antes y alguna animacion, eso ya seria bastante mas complejo.
 

Chamber

Miembro insignia
Miembro insignia
Respuesta: Consultorio de dudas de GBC

No, dada la complejidad de esto no quiero ni animaciones, ni texto ni nada... aunque seria muy dificil hacer una llamada de texto? Algo asi como "RamPokemon reacciono a la MEGA-Stone"

Pues si estaria chido que el oponente tambien usara MEGAS, pero entiendo que es mas complicado todo en el lado del campo del oponente, asi que si no se puede no hay nada mas que hablar.
 
Respuesta: Consultorio de dudas de GBC

consulta compadres , estoy haciendo la tarea de javc pero tengo un ligero problema no logro que me de el segundo mensaje la verdad nose ha que se debe aqui les dejo algunas imagenes para que vean de los comandos , para ver si algo hice mal



de la siguiente imagen es la que tengo el problema al crear el NPC nose que como rrelenar los datos que estan en el cuadrado rojo



agredecere ver si alguien me puede ayudar ya que es para la tarea que tengo de scrip
 

Gold

Porrero a tiempo parcial
Miembro insignia
Respuesta: Consultorio de dudas de GBC

Lo mas seguro es que estes usando una flag ya activada, por lo cual no vuelve a pasar, intenta ponerle flags de eventos poco comunes, como la 0x64 0x65, ademas si hay un checkbit obviamente debe haber un setbit, asi solo el rom esta checkeando el estado de la flag, pero no la estas activando.

Lo de llenar en jobtomap copia los mismos datos de otro npc, pero donde dice script pon el 2 byte pointer del script nuevo, pero invertido.

Intenta eso que digo

EDIT: El script deberia ser asi

#org ' tu offset
Faceplayer
Loadfont
Checkbit1 0x50
If true :Salto
2writetext :men
Setbit1 0x50
Closetext
Loadmovesprites
End

#org :Salto
2writetext :men2
Closetext
End
 
Respuesta: Consultorio de dudas de GBC

Kurisutaru♪;223327 dijo:
Lo mas seguro es que estes usando una flag ya activada, por lo cual no vuelve a pasar, intenta ponerle flags de eventos poco comunes, como la 0x64 0x65, ademas si hay un checkbit obviamente debe haber un setbit, asi solo el rom esta checkeando el estado de la flag, pero no la estas activando.

Lo de llenar en jobtomap copia los mismos datos de otro npc, pero donde dice script pon el 2 byte pointer del script nuevo, pero invertido.

Intenta eso que digo


gracias por el comentario revisare el comando , respecto al dato que dices scrip ya estan los 2 byts invertidos , respecto si copio a los otros NPC ya vi de los demas , pero los demas tiene diferentes , me refiero cada scrip es distinto , y nose cual podria ser ponerle al nuevo , es por eso que pregunto
 

Gold

Porrero a tiempo parcial
Miembro insignia
gracias por el comentario revisare el comando , respecto al dato que dices scrip ya estan los 2 byts invertidos , respecto si copio a los otros NPC ya vi de los demas , pero los demas tiene diferentes , me refiero cada scrip es distinto , y nose cual podria ser ponerle al nuevo , es por eso que pregunto
1. Mira el edit para ver algo como va el script
2. Es diferente porque algunos tienen distinto comportamiento, copia el de un npc que solo se mueva sin rumbo.
 

Chamber

Miembro insignia
Miembro insignia
Respuesta: Consultorio de dudas de GBC

Para la primer duda parece que GOLD ya respondio, solo te hacia falta SETear el Flag para que al volver hablar con él se pasara al segundo dialogo.

Por lo otro, los parametros del NPC te recomende que te pasaras por el tutorial de "agregar eventos" en la zona de GBC y veo que no lo hiciste. De cualquier forma ahi te va una pequeña explicacion.

  • Selected: Aqui no necesitas mover nada, se refiere al mini seleccionado.
    Picture. El sprite que va tener ese NPC. Hay un limite de 11 (no recuerdo bien) NPC por mapa, asi que solo podras cambiarlo por uno de esos.
  • Face Type: Definen en la direccion que esta volteando nuestro NPC, estos son los valores:
    Código:
    0 - Down
    1 - Up
    2 - Left
    4 - Right
    5 - Left/Right
    6 - Down
    7 - Up
    8 - Left
    9 - Right
    10 - Look Around
  • Movement: define el numero de pasos que puede dar un sprite en movimiento. para que se quede en su lugar solo deja el 0x00.
  • Time Type/Value: Usa FF FF
  • Sigth Range: cuando el NPC es un entrenador, define el numero de casillas en el que te puede ver y aparesca el simbolo de "!" para retarte. Si no es entrenador dejalo en 0x00.
  • Palette: el color del NPC.
  • Script: el pointer de tu script (previamente compilado en PKSV) pero los bytes invertidos.
  • Flag Index: Este apartado de los flags sirve para ocultar al NPC una vez que un flag se activo. No se como explicarlo, pero si tu en tu dialogo usas el flag 0x50, aqui pon el mismo valor (0x50), de otro modo pon 0xFF
  • Flag Bit: Aqui va el numero 6 o 7 para que el sprite se oculte, o 0xFF para el resto.
 
Estado
Cerrado para nuevas respuestas.
Arriba