Crystal_
Puntuación de reacción
119

Mensajes de perfil Última actividad Publicaciones Acerca

  • Me gusta tu proyecto! Si van a haber cambios gráficos, tengo estos sprites de sobra:
    Vale gracias. Ahora dentro de poco a ver si acabo una modificación a las funciones de las estaciones de radio para que usen mis MIDIs.
    Oye crystal, viendo Esta calculadora de posibilidad de captura en G/S/C, según parece en el juego varía muchísimo la posibilidad de captura según los DVs de HP del pokemon a ser capturado. Y en algunos casos dice que el juego se congelaría al intentar, por ejemplo, capturar un Jigglypuff del nivel 93 si este tiene un DV de HP de 14, o un mewtwo de nivel 98 con un DV de HP de 10. Hay unos cuantos casos aparentemente. A que crees que se debe esto? Podrías publicar un video en youtube al respecto.

    Aparentemente no pasa esto en R/B/Y
    Gracias y no importa, tengo varias ideas en mente, y en el peor de los casos el glitch no es tan horrible.
    dbw A, B es lo mismo que db A + dw B.

    Realmente no te puedo ayudar con lo demas ya que no tengo conocmiento sobre ello.
    Acabo de finalizar una canción donde en un momento hago una parábola con el tempo y al hacer pruebas me dí cuenta de que pasaba el mismo error que con lo que te decía antes. Sin embargo solucioné el problema insertando los cambios de Tempo en los momentos exactos en los que en los tres canales no estuviera ninguna nota ya empezada, de esta forma el error nunca sucedía.

    Sabiendo esto, podría modificar mi función para que en el momento en el que se va a insertar el cambio de tempo, pause la reproducción, aumente el tempo, y después reinicie la reproducción usando la duración restante de las notas de cada canal? O es complicarlo demasiado?

    Por cierto me podrías decir qué diferencia hay entre la instrucción db y la dbw?
    Bueno mi herramienta es en C así que tendré que seguir probando con Visual Studio.

    Volviendo al tema del tempo. Estuve probando todas los posibles bits de las 3 flags que me mostrase, y todas causaban lo mismo de antes, que algún canal a veces se ralentice 1 nota frente al resto. Ahora mismo estoy usando el bit 5 del byte de flags de la pokegear ($D67C). El problema sigue existiendo aunque curiosamente pasa menos veces.

    Es que el tiempo que le lleva procesar la función es mayor que el tiempo que dura una nota? Lo dudo o entonces la función SetGlobalTempo tendría este mismo problema, que es bastante más gorda. Sin embargo los errores tienen una apariencia demasiado aleatoria como para no ser esto.

    Y encontré un problema con la función, necesito un extra a la función para que el bit que uso se ponga a 0 cuando acabe la batalla, que ahora mismo no lo hace.
    Oye vi que subiste la herramienta del Randomizer de TCG en skeetendo, Me tienes que decir qué usas tu para crear el GUI de un programa, yo probé Visual studio pero no controlo de C++ suficientemente.

    Por cierto podrías postear el programa en Wah, si te da pereza lo hago yo si me das permiso
    Bien muchas gracias Crystal , veré que bit puedo usar. Imagino que para usarlo usaría la instrucción res x y set x respectivametnte del byte que elija, siendo x la posición del bit de 0 a 7 que vea conveniente, no?
    Ah bien gracias, aunque no estoy muy seguro de qué es [hld].

    Qué me recomiendas para elegir el byte de la RAM a usar? Hay alguna lista de Bytes libres o que casi no se usan?

    Y no conocía el truco de diectamente poner ret nz o ret z , como no lo vi en tu Tutorial básico de ASM no pensé en ello.
    Bien gracias.

    Respecto a lo del byte C0AF, lo usé como byte de prueba ya que no tengo una lista de bytes libres, disponibles o usables.

    Y que opinas del código aparte de ese byte? Sería optimizable/mejorable??
    Parte 2:

    Ahora hay que hacer lo contrario para .nodanger (0F:5E13)

    Antes era

    21 A6 C1 ld hl, Danger
    CB BE res 7, [hl]
    18 05 jr .done

    Pasará a ser

    CD C7 7E call $7EB8
    00 nop
    00 nop
    18 05 jr .done

    Así no hace el beep beep molesto, ya pensaré algo al respecto

    Y mi nueva función será

    xor a,a ;Para que a sea 0
    ld hl, $C0AF
    cp a,[hl] ;Comparamos [$C0AF] con a
    jr nz,$xx ;Si el resultado coincide ([hl]=0 y a=0) se salta a ret
    ld a, [$C01A] ;Hacemos el petate
    add a,$10
    ld [$C01A],a ;Metemos el nuevo tempo en los 4 canales
    ld [$C04C],a
    ld [$C07E],a
    ld [$C0B0],a
    ld [hl],$00 ;Metemos 00 en $C0AF para futuras iteraciones.
    ret


    Esto funciona perfectamente salvo por un bug que hace que uno de los canales de retrase o adelante 1 semicorchea, es posible que esto sea por que el tiempo que tarda en procesar la función es mayor que el tiempo de duración de una semicorchea?
    Parte 1

    Bueno al final me hice mi par de funciones y funcionan al 90% perfecto.

    .danger sigue igual

    Prototipo de la 1ª función:

    Comprueba si en $C0AF hay un 1 (se salta a ret) o un 0 (se hace todo)

    Mete en "a" el valor a aumentar del tempo

    Mete el nuevo valor en los 4 tempos de los canales.

    Cambia C0AF (creo que libre aunque lo usa el cuarto canal) a 1 para
    asegurarse de que solo cambiamos el tempo 1 vez.
    ret

    Que sería:

    xor a,a ;Para que a sea 0
    ld hl, $C0AF
    cp a,[hl] ;Comparamos [$C0AF] con a
    jr nz,$xx ;Si el resultado no coincide ([hl]=1 y a=0) se salta a ret
    ld a, [$C01A] ;Metemos en a el tempo del primer canal
    sub a,$10 ;Y le restamos $10
    ld [$C01A],a ;Metemos el nuevo tempo en los 4 canales
    ld [$C04C],a
    ld [$C07E],a
    ld [$C0B0],a
    ld [hl],$01 ;Metemos 01 en $C0AF para futuras iteraciones.
    ret
    Pero es que no tengo muy claro qué significan "db" "dw" y "ds"

    El código me quedó así, la idea es que el tempo aumente cuando tenemos la salud en rojo.

    Función CheckDanger -> .danger

    Antes era:

    21 A6 C1 ld hl, Danger
    CB FE set 7,[hl]


    Se cambió por un call a una función mía en el mismo bank en $7E9C que haga exactamente lo mismo pero que además llame al cambio de tempo.

    .danger Quedaría así:


    CD 9C 7E call $7E9C
    00 nop
    00 nop


    Mi función quedaría así:


    21 A6 C1 ld hl, Danger
    CB FE set 7,[hl]
    11 40 00 ld de, $0040 (prueba, no sé aún muy bien qué poner aquí)
    3E 3A ld a, $3a
    21 C7 4A ld hl, $4ac7
    CF rst $08
    C9 ret


    "Danger" (C1A6) varía entre 80 y 9D cuando el poke está en salud roja,0 cuando no.

    El código no hace nada, Se podría aumentar/disminuir el tempo una cantidad fija? en vez de cambiar el tempo en su totalidad?
    Ah vale ya entiendo, primero pongo el valor del tempo en el registro "de" , luego el bank en el registro "a" y el 2byteoffset en el registro hl y después llamo a rst $08, vale gracias.

    Pero el tempo ocupa 1 byte, porqué se necesitan dos registros?
    SetGlobalTempo llama a SetTempo por cada canal, y SetTempo utiliza de como parametro para el tempo.

    SetTempo:
    ld hl, Channel1Tempo - Channel1
    add hl, bc
    ld [hl], e
    inc hl
    ld [hl], d

    bc se utiliza en SetTempo para identificar el canal que debe actualizar, mientras que SetGlobalTempo no requiere bc como entrada ya que se encarga de iterar sobre 4 canales llamando a SetTempo en cada caso con su valor en bc correspondiente:

    ld bc, Channel1
    call SetTempo
    ld bc, Channel2
    call SetTempo
    ld bc, Channel3
    call SetTempo
    ld bc, Channel4

    3asmcall es el nombre de un script, no de una instrucción asm. Utiliza rst $08:

    ld a, BANK(\1)
    ld hl, \1
    rst $08

    Es decir:

    ld de, xxxx
    ld a, $3a
    ld hl, $4ac7
    rst $08
    O sea , que en mi función , hago "ld de, Valor" , y luego "call SetGlobalTempo" y ya está?, Lo digo porque aunque SetTempo usa el registro "de" , como no lo vi en ninguna parte en SetGlobalTempo pues dudé de si era ese.

    Y por cierto, si mi función está en otro bank distinto al de SetGlobalTempo, tendría que hacer un 3asmcall, no? Eso no ocuparía 4 bytes? [3asmcall][bank][XXYY]
    A ver, otra cosa que me surgió haciendo experimentos.

    Resulta que yo quiero llamar a la función SetGlobalTempo pero claro, yo quiero modificar el tempo en una cantidad exacta, cual sería la forma de pasarle un parámetro a esta función? Simplemente haciendo un ld bc, ValorParámetro justo antes del call a la función?
  • Cargando…
  • Cargando…
  • Cargando…
Arriba