WiZaRD
Puntuación de reacción
76

Mensajes de perfil Última actividad Publicaciones Acerca

  • seguido, no hace falta dejar espacio.

    Por cierto cuando acabes, haz File -> Save ROM as, y guardala con un nombre nuevo, para no sobreescribir tu hack actual en caso de que algo vaya mal (a no ser que tengas backup reciente)
    ok, entonces donde escribiste call 7E9B, cambialo por call 7ED1 y empieza a escribir las instrucciones que te pase en el link, a partir de 7E9B. (donde dice call z, Pickup y ld hl, tablaProbsItems, escribe en su lugar call z, 0000 y ld hl, 0000) luego ya pondremos bien las direcciones.

    Cada vez que escribas una instruccion, pulsa enter, y luego escribe la siguiente, etc.

    Te dejo el link otra vez: ld hl, DA2A ld bc, 002F ld d, 6 ldi a, (hl) cp 13 jr z, 0A cp 14 jr z, 06 - Pastebin.com
    es posible que ya hayas utilizado ese espacio en tu hack?

    A partir de donde empiezas a ver solo nop hasta 7fff?
    Vas bien por ahora. Ahí debes escribir call 7E9B (para escribir, simplemente pulsa una letra y se te abrira una ventanita en la que puedes escribir eso, despues dale a OK, o con el boton Enter del teclado)
    Despues desplazate hasta la línea que empieza por ROMF:7E9B. Si no me equivoco ahí empieza una tira de nops, es decir, esta vacio para que puedas escribir tu tu rutina. Esto es lo que tienes que escribir (abre el enlace):
    ld hl, DA2A ld bc, 002F ld d, 6 ldi a, (hl) cp 13 jr z, 0A cp 14 jr z, 06 - Pastebin.com
    lo primero de todo abre to rom con bgb y haz click con el boton derecho en la pantalla: other -> debugger.

    Se te abrira el debugger de bgb. Haz click en Debug -> Breakpoints. Se te abrira otra ventana. Donde pone "PC=" escribe 0f:7479 y dale al boton "Add".

    Haz click con el izquierdo en la pantalla de la game boy para resumir la partida. Inicia un combate. Mejor uno salvaje que puedas huir rapidamente. Huye y veras que se te "para" el juego y te salta la ventana del debugger. Si lo hiciste bien te debera aparecer una linea roja que empieza con ROMF:7479. No toques nada mas por ahora y avisame.
    Tienes el link en la primera linea de mi ultimo mensaje!

    Para implementarlo en tu hack, vete pensando en descargar bgb: BGB GameBoy Emulator (current version: BGB 1.5)
    [Z80 Assembler] 7479: ; 3f479 call 7E9B 7E9B: ; 3fe9b ld hl, DA2A ld bc, 002F ld d, 6 - Pastebin.com

    Un par de cosas. Esta rutina será llamada en el momento en que acabe un combate, como ocurre en las nuevas generaciones. De esta forma, el item se recogera justo tras acabar un combate (justo antes de volver al overworld), y no en otro momento.

    Por otro lado, decidi por mi cuenta dar una probabilidad de 1/8 de que la habilidad se active. Si has jugado rubi/zafiro por ejemplo, sabras que no siempre tras cada combate el zigzagoon aparece con un nuevo item, sino que solo algunas pocas veces, al azar. Te parece poco o mucho 1/8? Se puede cambiar si quieres.
    casi casi... es al reves!

    Lo que hace es cargar el contendio de la direccion de memoria apuntada por hl, en el registro a. En este caso, como hl apunta a la direccion del pokemon, podemos cargar el numero del pokemon en a, y despues hacer la famosa comparacion mediante el cp que ya utilizamos.

    Para serte sincero, la cosa se vuelve mas compleja ahora. No complejidad en el sentido de que sea mucho código o muy lioso, si no que entenderlo requiere mas soltura. Es mejor que aprendas con cosas mas simples, aunque no tengan aplicacion directa en tu hack. Aunque no puedas entenderlo, al menos te mostrare la rutina para que puedas copiarla en tu rom.

    Pero antes, una ultima pregunta sencilla! Dijimos que tan solo aplicaremos pickup cuando el pokemon no lleve ya otro item ¿que valor crees que tendrá la direccion de memoria del item cuando el pokemon no tiene NINGUN item?
    bien, de todas formas siguen siendo mas o menos pocos, es mas sencillo y hasta requiere menos codigo hacerlo sin tabla.

    De todas formas, aunque cambie la rutina, seguimos un poco con lo de antes:

    Serias capaz de explicar que occure aqui sabiendo que DA2A es la direccion de memoria del numero del pokemon y que DA2B es la del numero del item que lleva?

    ld hl, DA2A
    ldi a, (hl)

    ¿Tras estas dos instrucciones, que contiene el registro a? ¿Y cual es el valor de hl?

    Pista: lo de arriba es lo mismo que:

    ld hl, DA2A
    ld a, (hl)
    inc hl
    Pues bien ya sabemos mas o menos como va la cosa, ahora tenemos que organizarlo en una rutina que funcione:

    ld hl, DA2A ; hl = DA2A
    ld bc, 002F
    ld d, 6

    .siguientePokemon
    ; comprobar si es Zigzagoon
    ldi a, (hl) ; incrementar y cargar en a: hl = DA2B, a = (DA2B)
    cp 13
    push hl
    call z, Pickup
    pop hl

    ; comprobar si es Linoone
    ld a, (hl) ; a = (DA2B)
    cp 14
    push hl
    call z, Pickup
    pop hl

    ; comprobar el siguiente Pokemon del equipo
    add hl, bc
    dec d
    jr nz, .siguientePokemon

    Aunque no vas a entender todo, quiero que por ahora entiendas como funciona lo que esta en negrita. Como dije en el anterior post, la flag z se activara en funcion de si el registro a coincide con el numero o no. Gracias a esto podemos emplear la instruccion call z para llamar a una subrutina SOLO cuando z este "encendida". Esta subrutina sera la ultima parte del trabajo, y se encargara se darle un item, al azar, al pokemon con pickup.
    Correcto (mas o menos). La instruccion cp nos permite comparar dos registros o un registro con un numero que nosotros queramos. Como ya conocemos el numero que queremos comparar (13 para zigzagoon, 14 para linoone), podemos emplear las instrucciones cp a, 13 y cp a, 14.

    Estas instrucciones coparan el valor del registro a con 13 y con 14 respectivamente. Con cp a, 13 por ejemplo, cuando a coincide con 13 se activa la flag z. Imaginate a la flag z como a una bombilla que se enciende y se apaga; en este caso se encendera cuando a coincida con 13, y se apagara en cualquier otro caso.

    Respecto a lo de la tabla, para esto no es necesaria ya que solo son dos pokemon. Si fueran mas si que sería mas eficiente usarla (como estamos haciendo con los items, ya que hay muchisimos!)
    Bueno vamos a avanzar un poquito mas. Como me has dicho que solo quieres pickup con zigzagoon y linoone tendremos que hacer algo para que la habilidad no se active con ningun otro pokemon!

    Esto significa que debemos de comprobar si el numero del pokemon coincide con el de zigzagoon (13 hex) o linoone (14 hex).

    Se te ocurre alguna instruccion que nos permita comparar dos numeros para ver si el numero del pokemon coincide con, por ejemplo, 13?
    bien, descubriste lo que hace jr nz, pero te falto interpretar cual es la funcion que desempeña en nuestro caso :p

    En nuestro caso, jr nz va a comprobar si el registro c llegó a 0. Como inicialmente tenía el valor 6 y lo decrementamos de 1 en 1 con dec c, conseguimos que nuestra rutina en forma de "bucle" se ejecute un total de 6 veces, es decir, una por cada pokemon en el equipo.
    por cierto algo que todavia no te he llegado a preguntar... a que pokemon(s) quieres darle la habilidad pickup? (ya que supongo que no se la daras a todos los 251 pokemon!)
    Cuando tu comparas dos numeros, si esos son iguales se activa el flag z y dependiendo de eso se activa o no tu salto. Ejemplo

    ld a,$1
    cp a,$2
    jr nz,@brinco

    ld a,$1 convierte a = 1
    cp a,$2 compara si 1 es igual a 2, como el resultado es que no son iguales, el flag z no se pone y cuando llegas a jr nz,@brinco pues se ejecuta ese "salto", caso contrario lo ignora.

    Aqui un ejemplo de como lo ignora:

    ld a,$57
    cp a,$57
    jr nz,@brinco

    Al hacer la comparacion 57 es igual a 57 por lo tanto el flag z se activa eh ignora el salto.

    jr z = brinca si z esta activado
    jr nz = brinca si z no esta activado
    Eso pasa por que Taillow/Swellow tienen Scrapy como habilidad especial y les permite golpear fantasmas, asi que es normal.
  • Cargando…
  • Cargando…
  • Cargando…
Arriba