Registrarse

Habilidades por tabla para FR

BanetteAlone

Marioneta muy solitaria
Bueno es hora de compartir esto...

Antes que nada, explico que esto no es un tutorial... No voy a explicar detalles que se explican en tutoriales, esto se hace para FR, o sea fire red, o sea Kanto en ingles.

Hace poco me pasaron una rutina asm que permitía modificar un poco las batallas, la mire un poco y la modifique a mis necesidades y logre hacer funcionar varias habilidades propias, entonces me di cuenta que podía usar una lógica para crear habilidades tal cual como la tabla de poderes y me propuse realizar una rutina que me permitiera crear una tabla de efectos de habilidades y así lo hice... Sin embargo las rutinas salieron mas largas de lo que esperaba, en realidad lo que mas consume espacio son las verificaciones que tiene que hacer para confirmar que la habilidad se cumple... Publico el tema aquí por que aun esta en desarrollo, ya lo verán ahora que explique como funciona.

Bien.

Empecemos...

Vamos a necesitar mucho las herramientas:
- HxD o algún editor hexadecimal.
- Un compilador de código asm como thumb.
- Bloc de notas o cualquier editor de texto que permita guardar texto plano...

Ahora que lo pienso creo que es posible hacer todo esto solo con hexmaniac, pero meh

La rutina funciona en base a la investigación de FBI de pokecomunity sobre los battle modes, modifico la rutina de batalla por movimiento para que se ejecute en cada turno sin verificar una variable, y reemplazando el uso del registro 1 por el registro 3, ya que en este se alberga un numero muy importante que usaremos mas tarde...

La rutina final es esta:

Código:
.text
.align 2
.thumb
.thumb_func

main:
    push {r0-r4}

    ldr r4, .table

loop:
    ldr r3, [r4]
    cmp r3, #0x0
    beq noCrash
    bl linker
    add r4, r4, #0x4
    b loop
  

noCrash:
    pop {r0-r4}
    lsl r0, r0, #0x18
    lsr r0, r0, #0x18
    mov r10, r0
    lsl r1, r1, #0x10
    lsr r1, r1, #0x10
    ldr r2, =(0x2022874)
    ldr r0, =(0x800E2EA +1)
    bx r0

linker:
    bx r3
  
  
.align 2

.table:
    .word 0x08AAAAAA
En ".table" va un offset a una tabla (esta debe ser la dirección no permutada a la tabla sin sumarle uno) de offsets a rutinas asm que iré dándoles a medida voy explicando esto, a estos offsets si hay que sumarles uno.

Esta rutina se compila y se inserta, tomas el offset donde lo insertaste, lo permutas, le sumas uno y lo metes en esta rutina compilada:

Código:
00 4D 28 47 XX XX XX 08
XX allí va su offset permutado

Ahora, van a 0xE2E0 y reemplazan lo que hay allí por la rutina de arriba, solo reemplazan lo que ocupe la rutina (8 bytes) lo demás lo dejan así.

En el spoiler de arriba les hablo de una tabla que tiene offset a rutinas, esta tabla va a tener mínimo dos rutinas (Si ustedes quieren agregarles mas esta bien, pero yo usare dos espacios de esta).

Puedes simplemente ir a un espacio vacío de tu rom (Lleno de ff´s) y reemplazar algunas de esas ff´s con 00´s, un numero no tan pequeño, recomiendo 40 bytes por lo menos, a de ser con 00 que reemplaces las ff por que la mayoria de rutinas acaban sus tablas con estos numeros, así no hay problemas de informacion.

Cuando vayas a agregar un elemento a tu tabla, reemplazas los 00 por la información y así.

Ahora la primera rutina que vamos a insertar en esta tabla la llamaremos main y es la que prepara el terreno para la verificación de habilidades, revisa y guarda en variables la especie, el objeto y la habilidad de los pokemon en el campo... Por ahora es así, sin embargo he estado pensando cambiar el sistema para que sea un poco mas sencillo y menos consumidor de espacio:

Código:
.text
.thumb
.align 2

main:
    cmp r1, #0x0
    beq setter
    cmp r1, #0x3
    beq setter
    push {r0-r5, lr}
    b fin
setter:
    push {r0-r5, lr}
    mov r4, #0x0
  

loop:
    ldr r1, =0x02023BCE
    add r1, r4
    ldrh r1, [r1]
    mov r0, #0x64
    mul r1, r0
    cmp r4, #2
    beq rival
    cmp r4, #6
    beq rival
    ldr r0, =0x02024284
    b menu

rival:
    ldr r0, =0x0202402C
  
menu:
    add r0, r1
    mov r1, #0x0B
    ldr r2, .decrypter
    mov r5, r0
    bl linker
    mov r1, #3
    mul r1, r4
    ldr r2, =0x020370B8
    add r2, r1
    strh r0, [r2]
    mov r0, r5
    mov r1, #0x0C
    ldr r2, .decrypter
    bl linker
    mov r1, #3
    mul r1, r4
    ldr r2, =0x020370BA
    add r2, r1
    strh r0, [r2]
    mov r0, r5
    mov r1, #0x2E
    ldr r2, .decrypter
    bl linker
    cmp r0, #0x0
    beq sumcero
    b con
sumcero:
    add r0, #0x1

con:
    mov r1, #3
    mul r1, r4
    ldr r2, =0x020370B8
    add r2, r1
    ldrh r2, [r2]
    mov r5, #0x1C
    mul r2, r5
    add r2, #0x15
    add r2, r0
    ldr r0, .tablaPokemon
    add r0, r2
    ldrb r0, [r0]
    ldr r2, =0x020370BC
    add r2, r1
    strh r0, [r2]
    cmp r4, #4
    beq verify
    b comprovar

verify:
    ldr r1, =0x02023BD2
    ldrh r1, [r1]
    ldr r2, =0x02023BD4
    ldrh r2, [r2]
    add r1, r2
    cmp r1, #0x0
    bhi comprovar
    b fin


comprovar:
    cmp r4, #0x6
    beq fin
    add r4, #0x2
    b loop
  
linker:
    bx r2

fin:
    pop {r0-r5, pc}

.align 2
.decrypter:
    .word 0x0803FBE9

.tablaPokemon:
    .word 0x08AAAAAA
Pues como lo ven, las aa´s van a ser reemplazadas por la dirección offset de su tabla pokémon.

Esta rutina se compila, se inserta, se permuta su offset, se le suma uno y se agrega en la tabla de offsets.

Es hora de explicar para que sirve la información del registro numero 1...

Este registro contiene información muy importante sobre la batalla, guarda un numero que indica que esta pasando en la batalla en el momento... estos son los que yo he descubierto...

Cuando el valor de r1 es:
0) La batalla acaba de empezar y se muestra al pokemon rival.
1) La batalla acaba de empezar y se lanza al pokemon del jugador.
2) Hay un cambio de pokemon pero este aun no esta en el campo
3) Hubo un cambio de pokemon y este ya esta en el campo.
4) Se ejecutan los movimientos seleccionados por cada lado.
D8) Las caracteristicas de algun pokemon bajaron.
D9) Ha habido un golpe critico.
1D) Un pokemon a caido debilitado.
0D) La batalla acabo.
DF) El jugador a huido.

Estos son los que yo conozco, se que hay muchos mas, debe haber alguno para indicar golpes super efectivos, retrocesos y así, mas tarde estaré actualizando esto para agregarlos.

Después de insertar la rutina de arriba vamos de una vez a la segunda, esta es la verificación, así la llamaremos y es la mas larga.

Código:
.text
.thumb
.align 2

main:
    push {r0-r4, lr}
    mov r4, #0
  
loop:
    cmp r4, #18
    bhi fin
    cmp r4, #12
    beq verify
    b assign

fin:
    pop {r0-r4, pc}

verify:
    ldr r1, =0x02023BD2
    ldrh r1, [r1]
    ldr r2, =0x02023BD4
    ldrh r2, [r2]
    add r1, r2
    cmp r1, #0x0
    beq fin

assign:
    ldr r2, =0x020370BC
    add r2, r4
    ldrh r2, [r2]
    ldr r0, .table
    sub r0, #0xF

loop2:
    add r0, #0xF
    ldrh r1, [r0]
    cmp r1, r2
    beq preanalizis
    cmp r1, #0x0
    beq reloop
    b loop2

reloop:
    add r4, #6
    b loop

preanalizis:
    ldrb r1, [r0, #3]
    mov r2, #0
    cmp r4, #0
    beq heroe
    cmp r4, #6
    beq villano
    mov r2, #2
    cmp r4, #18
    beq villano
    b heroe

heroe:
    add r1, r2
    cmp r1, #3
    bhi ajuste1
    b agregarVar
  
ajuste1:
    mov r1, #1
    b agregarVar

villano:
    add r1, #1
    add r1, r2
    cmp r1, #3
    bhi ajuste2
    b agregarVar

ajuste2:
    sub r1, #4

agregarVar:
    ldr r2, =0x020370D8
    strh r1, [r2]
    mov r1, #0
    add r0, #0x4

analizis:
    add r0, r1
    ldrb r2, [r0]
    mov r3, r0
    add r3, r1
    ldrh r3, [r3, #3]
    cmp r2, #0
    beq siguienteCondicion
    cmp r2, #1
    beq noObj
    cmp r2, #2
    beq obj
    cmp r2, #3
    beq tipoAtq
    cmp r2, #4
    beq byte2
    cmp r2, #5
    beq clima
    cmp r2, #6
    beq noClima
    cmp r2, #7
    beq campo
    cmp r2, #8
    beq noCampo
    cmp r2, #9
    beq atq
    cmp r2, #0xA
    beq byte1
    cmp r2, #0xB
    beq byte3
    cmp r2, #0x12
    beq moveeffect
    b analizis2
  
deloop:
    sub r0, r1
    sub r0, #4
    b loop2

siguienteCondicion:
    cmp r4, #23
    bhi com
    add r4, #24
    mov r1, #1
    b analizis

noObj:
    ldr r2, =0x020370D8
    ldrh r2, [r2]
    mov r1, #0x6
    mul r2, r1
    ldr r1, =0x020370BA
    add r2, r1
    mov r1, r2
    sub r1, #2
    ldrh r1, [r1]
    ldrh r2, [r2]
    cmp r1, #0
    beq deloop
    cmp r2, r3
    beq deloop
    b siguienteCondicion
obj:
    ldr r2, =0x020370D8
    ldrb r2, [r2]
    mov r1, #0x6
    mul r2, r1
    ldr r1, =0x020370BA
    add r2, r1
    mov r1, r2
    sub r1, #2
    ldrh r1, [r1]
    ldrh r2, [r2]
    cmp r1, #0
    beq deloop
    cmp r2, r3
    beq siguienteCondicion
    b deloop

tipoAtq:
    ldr r2, =0x02023D4A
    ldrh r2, [r2]
    mov r1, #12
    mul r2, r1
    ldr r1, =0x08AAAAAA
    add r2, r1
    ldrb r2, [r2, #0x2]
    cmp r2, r3
    beq siguienteCondicion
    b deloop

byte2:
    ldr r2, =0x02023D4A
    ldrh r2, [r2]
    mov r1, #12
    mul r2, r1
    ldr r1, =0x08AAAAAA
    add r2, r1
    ldrb r2, [r2, #0xA]
    cmp r2, r3
    beq siguienteCondicion
    b deloop


clima:
    ldr r2, =0x02023F1C
    ldrb r2, [r2]
    cmp r2, r3
    beq siguienteCondicion
    b deloop

noClima:
    ldr r2, =0x02023F1C
    ldrb r2, [r2]
    cmp r2, r3
    beq deloop
    b siguienteCondicion

campo:
    ldr r2, =0x020370BC
    ldrh r2, [r2]
    cmp r2, r3
    beq siguienteCondicion
    b deloop

noCampo:
    ldr r2, =0x020370BC
    ldrh r2, [r2]
    cmp r2, r3
    bne siguienteCondicion
    b deloop

atq:
    ldr r2, =0x02023D4A
    ldrh r2, [r2]
    cmp r2, r3
    beq siguienteCondicion
    b deloop

byte1:
    ldr r2, =0x02023D4A
    ldrh r2, [r2]
    mov r1, #12
    mul r2, r1
    ldr r1, =0x08AAAAAA
    add r2, r1
    ldrb r2, [r2, #0x9]
    cmp r2, r3
    beq siguienteCondicion
    b deloop

byte3:
    ldr r2, =0x02023D4A
    ldrh r2, [r2]
    mov r1, #12
    mul r2, r1
    ldr r1, =0x08AAAAAA
    add r2, r1
    ldrb r2, [r2, #0xB]
    cmp r2, r3
    beq siguienteCondicion
    b deloop

sig:
    b siguienteCondicion

com:
    b completado
delop:
    b deloop

moveEffect:
    ldr r2, =0x02023D4A
    ldrh r2, [r2]
    mov r1, #12
    mul r2, r1
    ldr r1, =0x08AAAAAA
    add r2, r1
    ldrb r2, [r2]
    cmp r2, r3
    beq siguienteCondicion
    b deloop

analizis2:
    cmp r2, #0xF
    beq tipoObj
    cmp r2, #0x10
    beq noTipoObj
    cmp r2, #0xC
    beq ps
    cmp r2, #0xD
    beq ps
    cmp r2, #0xE
    beq ps
    cmp r2, #0x13
    beq menorPot
    cmp r2, #0x14
    beq igualPot
    cmp r2, #0x15
    beq mayorPot
    cmp r2, #0x11
    beq ps
    b sig



tipoObj:
    ldr r2, =0x020370D8
    ldrh r2, [r2]
    mov r1, #0x6
    mul r2, r1
    ldr r1, =0x020370B8
    add r1, r2
    ldrh r1, [r1]
    cmp r1, #0x0
    beq delop
    mov r2, #0x1C
    mul r1, r2
    ldr r2, .tablaPokemon
    add r2, r1
    ldrb r1, [r2]
    cmp r1, r3
    beq sig
    ldrb r1, [r2, #1]
    cmp r1, r3
    beq sig
    b delop
  
noTipoObj:
    ldr r2, =0x020370D8
    ldrh r2, [r2]
    mov r1, #0x6
    mul r2, r1
    ldr r1, =0x020370B8
    add r1, r2
    mov r2, #0x1C
    mul r1, r2
    ldr r2, .tablaPokemon
    add r2, r1
    ldrb r1, [r2]
    cmp r1, r3
    beq delop
    ldrb r1, [r2, #1]
    cmp r1, r3
    beq delop
    b sig


ps:
    ldr r2, .rutinaPs
    bl linker
    cmp r2, #1
    beq sig
    b delop

menorPot:
    ldr r2, =0x02023D4A
    ldrh r2, [r2]
    mov r1, #12
    mul r2, r1
    ldr r1, =0x08AAAAAA
    add r2, r1
    ldrb r2, [r2, #0x1]
    cmp r2, r3
    blo sig
    b delop

igualPot:
    ldr r2, =0x02023D4A
    ldrh r2, [r2]
    mov r1, #12
    mul r2, r1
    ldr r1, =0x08AAAAAA
    add r2, r1
    ldrb r2, [r2, #0x1]
    cmp r2, r3
    beq sig
    b delop

mayorPot:
    ldr r2, =0x02023D4A
    ldrh r2, [r2]
    mov r1, #12
    mul r2, r1
    ldr r1, =0x08AAAAAA
    add r2, r1
    ldrb r2, [r2, #0x1]
    cmp r2, r3
    bhi sig
    b delop

completado:
    sub r4, #24
    sub r0, r1
    sub r0, #2
    ldrb r3, [r0]
    mov r2, #4
    mul r3, r2
    ldr r2, .tablaEfectos
    add r2, r3
    ldr r2, [r2]
    bl linker
    add r0, r1
    add r0, #2
    b delop
  

linker:
    bx r2

.align 2

.rutinaPs:
    .word 0x08XXXXXX

.tablaPokemon:
    .word 0x08BBBBBB

.tablaEfectos:
    .word 0x08CCCCCC

.table:
    .word 0x08DDDDDD
Bien, como ven es jo****mente largo, peeero es necesario, aquí va una lista de cosas que deben cambiar para que les sirva a ustedes...

- Las AA´s son la Tabla de movimientos pokemon. O sea el offset a esta tabla, la de las características de estos no la de los nombres. (Estas no están al final como las demás están en alguna zona del código de la rutina asignando su valor de forma directa, están específicamente en las líneas 170, 182, 230, 242, 262, 345, 357 y 369).

- Las XX´s es un offset mas uno sin permutar a una rutina que les pasare mas adelante...
- Las BB´s son la dirección a su tabla pokemon.
- Las CC´s son una dirección a una tabla de la que hablaremos mas adelante...
- Las DD´s lo mismo que arriba solo que a otra tabla.

Como verán aun no pueden insertar esta rutina ya que hacen falta otros componentes a los que esta hace referencia...

En los spoiler abajo de este estarán explicando cada una de estas referencias.

Se supone que esta rutina verificaría que un pokemon tuviera una cantidad de ps o un porcentaje de ps especifico, mayor o menor, sin embargo, en mi ingenuosidad pensé que usar el pokemon decrypter bastaría para saber cuales eran los ps de actuales de algún pokemon... Y no, los ps y demás estadísticas de un pokemon parecen estar encriptadas y no tengo idea de como saber los ps de un pokemon durante la batalla...

Aquí esta el código de todas formas. Las XX en la rutina verificadora pueden llenarlas con un offset cualquiera a una rutina, mientras no usen los parámetros para verificar los ps en los efectos a habilidades.

Esto es una de las cosas que me faltan y cuando lo resuelva volveré y editare.

Aun asi esta rutina también verifica si el pokemon tiene algun efecto de estado encima y esta parte si funciona bien, por lo que puedes insertarla aun así pues de algo te servira...

Codigo de la verificadora de ps:
Código:
.text
.thumb
.align 2

main:
    push {r4, lr}
    ldrb r2, [r0]
    ldr r4, =0x020370D8
    ldrh r4, [r4]
    push {r0-r1}
    cmp r4, #1
    beq enemy
    cmp r4, #3
    beq partner
    cmp r4, #2
    beq friend
  
player:
    ldr r0, =0x0803FBE9
    b motor

enemy:
    ldr r0, =0x0803FBE9
    b motor

partner:
    ldr r0, =0x02023BCE
    ldrh r1, [r0, #4]
    ldrh r0, [r0, #6]
    add r0, r1
    cmp r0, #0
    bhi enemy
    mov r4, #1
    b enemy

friend:
    ldr r0, =0x02023BCE
    ldrh r1, [r0, #4]
    ldrh r0, [r0, #6]
    add r0, r1
    cmp r0, #0
    bhi enemy
    mov r4, #1
    b cancelar 


motor:
    mov r1, #100
    mul r1, r4
    add r0, r1
    mov r4, r3
    cmp r2, #0xC
    beq ps
    cmp r2, #0xD
    beq masps
    cmp r2, #0xE
    beq menosps
    cmp r2, #0x12
    beq effect
    b cancelar

ps:
    bl link
    cmp r0, r4
    beq aceptar
    b cancelar

effect:
    bl linky
    cmp r4, #0xff
    beq trans
    cmp r0, r4
    beq aceptar
    b cancelar

trans:
    cmp r0, #0
    bhi aceptar
    b cancelar
  

menosps:
    mov r3, r0
    bl linker
    mov r1, r4
    bl div
    mov r2, r0
    mov r0, r3
    mov r3, r2
    bl link
    cmp r0, r3
    blo aceptar
    b cancelar

masps:
    mov r3, r0
    bl linker
    mov r1, r4
    bl div
    mov r2, r0
    mov r0, r3
    mov r3, r2
    bl link
    cmp r0, r3
    bhi aceptar
    b cancelar
  

linker:
    mov r1, #0x3A
    ldr r2, =0x0803FBE9
    bx r2

link:
    mov r1, #0x39
    ldr r2, =0x0803FBE9
    bx r2

linky:
    mov r1, #0x37
    ldr r2, =0x0803FBE9
    bx r2

div:
    ldr r2, =0x081E4019
    bx r2
  

cancelar:
    mov r2, #0
    b devuelta
aceptar:
    mov r2, #1
    b devuelta

devuelta:
    pop {r0-r1}
    pop {r4, pc}
Se compila, inserta, permuta, suma uno insertar en xx de la rutina verificadora de arriba.


Esta tabla es otra tabla de rutinas pero estas rutinas son las que ejecutan los efectos de las habilidades, por el momento solo he desarrollado una de estas, ire agregando algunas mas a medida vaya desarrollando, pero cualquiera que sepa asm puede desarrollar estos efectos.

La tabla la tienes que insertar en un espacio de tu rom y hacer referencia a esa direccion en la rutina verificadora en CC.

La rutina en cuestión que he creado es una que potencia el movimiento que se esta realizando en el momento, puede indicar una debilidad para el portador o una potenciacion a los golpes de este.

la rutina es esta:
Código:
.text
.thumb
.align 2

    push {r1-r3, lr}
    ldr r1, =0x02023D6B
    ldrb r1, [r1]
    ldr r2, =0x020370D8
    ldrh r2, [r2]
    cmp r1, r2
    beq eject
    b fin

eject:
    mov r1, r0
    add r1, #11
    ldrh r1, [r1]
    ldr r2, =0x02023FD2
    ldrh r3, [r2]
    add r1, r3
    strh r1, [r2]

fin:
    pop {r1-r3, pc}
Se compila, se inserta, se permuta, se suma uno y se inserta en la tabla de efectos de habilidades.
En los comentarios de este foro iré agregando algunos efectos para habilidades.

Ahora sí viene lo chido...

Después de tanta preparación por fin llegamos a lo que queríamos, la tabla de habilidades en si, aquí les explico como funciona mi sistema de habilidades por tabla.

Empecemos con lo que ya saben, deben crear una tabla en algún espacio de su rom cada elemento de esta tabla (las habilidades) ocuparan 15 espacios de la misma, por lo que la tabla debe ser grande en comparación con las demás que han hecho, por fin la dirección de esta tabla debe ponerla en las DD´s de la rutina verificadora.

Ahora sí esta es la explicación de como construir una habilidad:

Los componentes de esta tabla estan compuestos por 7 propiedades distribuidas de la siguiente manera en el codigo:

11 11 22 22 33 33 44 55 55 55 55 66 66 77 77

Asi que este es el espacio que ocupa un solo efecto de habilidad. Ahora explicare de que van cada propiedad.

Empecemos con la primera.
Al comienzo de cada efecto debes declarar el index de la habilidad que tiene que tener algún pokemon en el campo para que el efecto se produzca, el numero tiene que estar en hexadecimal y aunque no creo que hagas mas de 255 habilidades he puesto un half world en lugar de un byte por si las moscas...
Por ello primero tienes que buscar la habilidad que quieres que tenga el efecto, por ejemplo digamos que quiero crear una habilidad, suponiendo que ya ampliamos la tabla de nombres de habilidades y tenemos el nombre y la descripción de nuestra habilidad, entonces vemos que numero de habilidad es, supongamos que es la numero 100, en este caso tendríamos que pasar a hex el numero 100 esto seria 64, este es el numero que tendran que insertar en el primer byte del efecto de la habilidad, el segundo byte debe ser 00, en caso de que el numero hexadecimal que les de la converción tenga mas de dos digitos tendran que poner los ultimos digitos en el primer offset y los primeros en el segundo, vamos que estoy diciendo que permuten el numero.

ejemplo aun así, si van a usar la habilidad 258 eso seria en hexadecimal 102, en el primer byte tendrían que poner 02 y en el segundo 01.

(vaya no queria explicar como permutar y aun así termine haciendolo)

La segunda propiedad.
Esta propiedad alberga un numero que indica el numero del efecto que queremos usar, eso significa que aquí va el numero de índice de una de las rutinas de efectos de la tabla de rutinas de habilidades, a esto yo le llamo el tipo de la habilidad ya que indica el tipo de efecto que va a ejecutar la habilidad, los índices empiezan desde el cero, por lo que su primera rutina de efecto sera el numero 0, la segunda 1 y así.

Como veras el esta propiedad tiene un halfworld, ¿Tantos efectos a habilidades pienso hacer? No. El tipo de la habilidad ocupa solo el primer byte, el segundo byte de esta propiedad pertenece al objetivo de la habilidad, es decir en base a que pokemon se ejecuta la habilidad. he aqui una lista de los valores que puede tener.

00 - se ejecuta en base al propietario de la habilidad.
01 - se ejecuta en base al pokemon rival que este enfrente al propietario de la habilidad.
02 - se ejecuta en base al pokemon compañero de quien tiene esta habilidad.
03 - se ejecuta en base al pokemon compañero del rival que este enfrente al propietario de la habilidad.

Mas adelante hare una actualización para mejorar un poco esto.

Tercera propiedad.
Esto es lo que les da identidad a las habilidades, son parametros que indican cuando se ejecutan los efectos. aquí una lista de estos.

00 - nada.
01 - No tiene objeto.
02 - llevar un objeto específico (se indica cuál en variables)
03 - Que el ataque efectuado sea de un tipo específico (se indica cuál en variables)
04 - que tenga una categoría (segundo byte en desuso de los poderes) específica
(variables :v)
05 - que halla un clima específico ... Ya saben a variables.
06 - que NO halla un clima específico. Se indica en variables.
07 - que halla un "campo" específico (me refiero a que halla algun efecto ejecutándose
en cada turno, esto aun no es funcional)
08 - Que NO halla un campo específico.
09 - que el ataque efectuado sea uno específico.
0A - que el primer byte en desuso de los poderes tenga un valor específico.
0B - que el tercer byte en desuso de los poderes tenga un valor específico.
0C - que el objetivo tenga cantidad de PS indicados en variable. (No funcional)
0D - que el objetivo tenga menos cantidad de PS de los indicados. (No funcional)
0E - que el objetivo tenga más cantidad de PS de los indicados. (No funcional)
0F - que el objetivo sea de un tipo específico.
10 - que el objetivo no sea de un tipo específico.
11 - si el objetivo sufre un efecto de estado.
12 - si el poder ejecutado tiene un move effect especifico.
13 - si el poder ejecutado tiene menor potencia a la especificada.
14 - si el poder ejecutado tiene igual potencia a la especificada.
15 - si el poder ejecutado tiene mayor potencia a la especificada.

(Ahora que los veo son pocas en comparación con el trabajo que costaron llevarlas a cabo)

Bueno pues estas indican la comparación que se tiene que llevar a cabo para verificar que la habilidad si se cumple, son dos comprovantes por lo que esta propiedad ocupa una half word, cada comprovante ocupa un byte.

La cuarta propiedad.
Por ahora solo es un espacio en blanco, proximamente modificara el como se ejecutan los turnos o mas bien quien ataca primero de quien. esto solo si se cumple la habilidad.

La quinta propiedad.
Esta ocupa una word completa pero en realidad son dos halfword, una detras de la otra e indican el valor que debe haber para que la comprovante se cumpla, esto es a los que mi yo del pasado en sus apuntes raros se refería con "variables". todo lo que vayas a poner aqui tiene que estar permutado, el tipo del pokemon objetivo, el objeto que tenga que tener, etc.

La sexta propiedad.
Es una propiedad extra, podria entenderse como una propiedad en desuso pero tiene su funcionalidad para otros tipos de habilidades que creare en el futuro, ya veran a lo que me refiero.

La septima propiedad.
Esta es por decirlo de una forma sencilla el parametro de la habilidad. Por ejemplo con el tipo de habilidades que tenemos hasta el momento puedes aumentar la potencia de los ataques, pero si esta half word esta en cero valiste por que no hara nada, tienes que indicar un valor, en ella, al poner 1 la potencia del ataque se duplicara, al poner dos se triplicara y así... De nuevo, todo lo de aqui debe estar permutado.


Y bueno pues eso es todo. Con un poco de ingenio puedes hacer algunas habilidades con lo que te he dejado hasta aquí.

Despues de insertar estas rutinas y tablas y poner sus offsets en la rutina verificadora, ahora si puedes compilarla, insertarla, permutar su offset, sumarle uno y agregar a la tabla de rutinas por turno a la dichosa rutina verificadora.

Como ven insertar esto es algo complejo y tedioso, por eso estoy pensando primero en simplificarlo y luego en hacer una herramienta de "instalación".

como ya dije ire actualizando con nuevas cosas, pero si quieres probar esto que llevo y como funciona eres libre de hacerlo.

Sin mas, gracias por todo. Si me salte algun reconocimiento puedes hacermelo saber, si quieres ayudar con el proyecto estare gustoso de aceptarte, cualquier ayuda es bienvenida.


Si notan que mi ortografia se fue a pique al final es que estoy cansado y mi compu tambien, bay
 
Última edición:

Tohru

Baneado
Pensé que cosas de este nivel solo se podían en pokeco pero parece que me equivoque y que bueno que me equivoque :3 lo voy a probar
 

Shiny_Miner

Rocker Coder
Bueno es hora de compartir esto...

Antes que nada, explico que esto no es un tutorial... No voy a explicar detalles que se explican en tutoriales, esto se hace para FR, o sea fire red, o sea Kanto en ingles.

Hace poco me pasaron una rutina asm que permitía modificar un poco las batallas, la mire un poco y la modifique a mis necesidades y logre hacer funcionar varias habilidades propias, entonces me di cuenta que podía usar una lógica para crear habilidades tal cual como la tabla de poderes y me propuse realizar una rutina que me permitiera crear una tabla de efectos de habilidades y así lo hice... Sin embargo las rutinas salieron mas largas de lo que esperaba, en realidad lo que mas consume espacio son las verificaciones que tiene que hacer para confirmar que la habilidad se cumple... Publico el tema aquí por que aun esta en desarrollo, ya lo verán ahora que explique como funciona.

Bien.

Empecemos...

Vamos a necesitar mucho las herramientas:
- HxD o algún editor hexadecimal.
- Un compilador de código asm como thumb.
- Bloc de notas o cualquier editor de texto que permita guardar texto plano...

Ahora que lo pienso creo que es posible hacer todo esto solo con hexmaniac, pero meh

La rutina funciona en base a la investigación de FBI de pokecomunity sobre los battle modes, modifico la rutina de batalla por movimiento para que se ejecute en cada turno sin verificar una variable, y reemplazando el uso del registro 1 por el registro 3, ya que en este se alberga un numero muy importante que usaremos mas tarde...

La rutina final es esta:

Código:
.text
.align 2
.thumb
.thumb_func

main:
    push {r0-r4}

    ldr r4, .table

loop:
    ldr r3, [r4]
    cmp r3, #0x0
    beq noCrash
    bl linker
    add r4, r4, #0x4
    b loop
 

noCrash:
    pop {r0-r4}
    lsl r0, r0, #0x18
    lsr r0, r0, #0x18
    mov r10, r0
    lsl r1, r1, #0x10
    lsr r1, r1, #0x10
    ldr r2, =(0x2022874)
    ldr r0, =(0x800E2EA +1)
    bx r0

linker:
    bx r3
 
 
.align 2

.table:
    .word 0x08AAAAAA
En ".table" va un offset a una tabla (esta debe ser la dirección no permutada a la tabla sin sumarle uno) de offsets a rutinas asm que iré dándoles a medida voy explicando esto, a estos offsets si hay que sumarles uno.

Esta rutina se compila y se inserta, tomas el offset donde lo insertaste, lo permutas, le sumas uno y lo metes en esta rutina compilada:

Código:
00 4D 28 47 XX XX XX 08
XX allí va su offset permutado

Ahora, van a 0xE2E0 y reemplazan lo que hay allí por la rutina de arriba, solo reemplazan lo que ocupe la rutina (8 bytes) lo demás lo dejan así.

En el spoiler de arriba les hablo de una tabla que tiene offset a rutinas, esta tabla va a tener mínimo dos rutinas (Si ustedes quieren agregarles mas esta bien, pero yo usare dos espacios de esta).

Puedes simplemente ir a un espacio vacío de tu rom (Lleno de ff´s) y reemplazar algunas de esas ff´s con 00´s, un numero no tan pequeño, recomiendo 40 bytes por lo menos, a de ser con 00 que reemplaces las ff por que la mayoria de rutinas acaban sus tablas con estos numeros, así no hay problemas de informacion.

Cuando vayas a agregar un elemento a tu tabla, reemplazas los 00 por la información y así.

Ahora la primera rutina que vamos a insertar en esta tabla la llamaremos main y es la que prepara el terreno para la verificación de habilidades, revisa y guarda en variables la especie, el objeto y la habilidad de los pokemon en el campo... Por ahora es así, sin embargo he estado pensando cambiar el sistema para que sea un poco mas sencillo y menos consumidor de espacio:

Código:
.text
.thumb
.align 2

main:
    cmp r1, #0x0
    beq setter
    cmp r1, #0x3
    beq setter
    push {r0-r5, lr}
    b fin
setter:
    push {r0-r5, lr}
    mov r4, #0x0
 

loop:
    ldr r1, =0x02023BCE
    add r1, r4
    ldrh r1, [r1]
    mov r0, #0x64
    mul r1, r0
    cmp r4, #2
    beq rival
    cmp r4, #6
    beq rival
    ldr r0, =0x02024284
    b menu

rival:
    ldr r0, =0x0202402C
 
menu:
    add r0, r1
    mov r1, #0x0B
    ldr r2, .decrypter
    mov r5, r0
    bl linker
    mov r1, #3
    mul r1, r4
    ldr r2, =0x020370B8
    add r2, r1
    strh r0, [r2]
    mov r0, r5
    mov r1, #0x0C
    ldr r2, .decrypter
    bl linker
    mov r1, #3
    mul r1, r4
    ldr r2, =0x020370BA
    add r2, r1
    strh r0, [r2]
    mov r0, r5
    mov r1, #0x2E
    ldr r2, .decrypter
    bl linker
    cmp r0, #0x0
    beq sumcero
    b con
sumcero:
    add r0, #0x1

con:
    mov r1, #3
    mul r1, r4
    ldr r2, =0x020370B8
    add r2, r1
    ldrh r2, [r2]
    mov r5, #0x1C
    mul r2, r5
    add r2, #0x15
    add r2, r0
    ldr r0, .tablaPokemon
    add r0, r2
    ldrb r0, [r0]
    ldr r2, =0x020370BC
    add r2, r1
    strh r0, [r2]
    cmp r4, #4
    beq verify
    b comprovar

verify:
    ldr r1, =0x02023BD2
    ldrh r1, [r1]
    ldr r2, =0x02023BD4
    ldrh r2, [r2]
    add r1, r2
    cmp r1, #0x0
    bhi comprovar
    b fin


comprovar:
    cmp r4, #0x6
    beq fin
    add r4, #0x2
    b loop
 
linker:
    bx r2

fin:
    pop {r0-r5, pc}

.align 2
.decrypter:
    .word 0x0803FBE9

.tablaPokemon:
    .word 0x08AAAAAA
Pues como lo ven, las aa´s van a ser reemplazadas por la dirección offset de su tabla pokémon.

Esta rutina se compila, se inserta, se permuta su offset, se le suma uno y se agrega en la tabla de offsets.

Es hora de explicar para que sirve la información del registro numero 1...

Este registro contiene información muy importante sobre la batalla, guarda un numero que indica que esta pasando en la batalla en el momento... estos son los que yo he descubierto...

Cuando el valor de r1 es:
0) La batalla acaba de empezar y se muestra al pokemon rival.
1) La batalla acaba de empezar y se lanza al pokemon del jugador.
2) Hay un cambio de pokemon pero este aun no esta en el campo
3) Hubo un cambio de pokemon y este ya esta en el campo.
4) Se ejecutan los movimientos seleccionados por cada lado.
D8) Las caracteristicas de algun pokemon bajaron.
D9) Ha habido un golpe critico.
1D) Un pokemon a caido debilitado.
0D) La batalla acabo.
DF) El jugador a huido.

Estos son los que yo conozco, se que hay muchos mas, debe haber alguno para indicar golpes super efectivos, retrocesos y así, mas tarde estaré actualizando esto para agregarlos.

Después de insertar la rutina de arriba vamos de una vez a la segunda, esta es la verificación, así la llamaremos y es la mas larga.

Código:
.text
.thumb
.align 2

main:
    push {r0-r4, lr}
    mov r4, #0
 
loop:
    cmp r4, #18
    bhi fin
    cmp r4, #12
    beq verify
    b assign

fin:
    pop {r0-r4, pc}

verify:
    ldr r1, =0x02023BD2
    ldrh r1, [r1]
    ldr r2, =0x02023BD4
    ldrh r2, [r2]
    add r1, r2
    cmp r1, #0x0
    beq fin

assign:
    ldr r2, =0x020370BC
    add r2, r4
    ldrh r2, [r2]
    ldr r0, .table
    sub r0, #0xF

loop2:
    add r0, #0xF
    ldrh r1, [r0]
    cmp r1, r2
    beq preanalizis
    cmp r1, #0x0
    beq reloop
    b loop2

reloop:
    add r4, #6
    b loop

preanalizis:
    ldrb r1, [r0, #3]
    mov r2, #0
    cmp r4, #0
    beq heroe
    cmp r4, #6
    beq villano
    mov r2, #2
    cmp r4, #18
    beq villano
    b heroe

heroe:
    add r1, r2
    cmp r1, #3
    bhi ajuste1
    b agregarVar
 
ajuste1:
    mov r1, #1
    b agregarVar

villano:
    add r1, #1
    add r1, r2
    cmp r1, #3
    bhi ajuste2
    b agregarVar

ajuste2:
    sub r1, #4

agregarVar:
    ldr r2, =0x020370D8
    strh r1, [r2]
    mov r1, #0
    add r0, #0x4

analizis:
    add r0, r1
    ldrb r2, [r0]
    mov r3, r0
    add r3, r1
    ldrh r3, [r3, #3]
    cmp r2, #0
    beq siguienteCondicion
    cmp r2, #1
    beq noObj
    cmp r2, #2
    beq obj
    cmp r2, #3
    beq tipoAtq
    cmp r2, #4
    beq byte2
    cmp r2, #5
    beq clima
    cmp r2, #6
    beq noClima
    cmp r2, #7
    beq campo
    cmp r2, #8
    beq noCampo
    cmp r2, #9
    beq atq
    cmp r2, #0xA
    beq byte1
    cmp r2, #0xB
    beq byte3
    cmp r2, #0x12
    beq moveeffect
    b analizis2
 
deloop:
    sub r0, r1
    sub r0, #4
    b loop2

siguienteCondicion:
    cmp r4, #23
    bhi com
    add r4, #24
    mov r1, #1
    b analizis

noObj:
    ldr r2, =0x020370D8
    ldrh r2, [r2]
    mov r1, #0x6
    mul r2, r1
    ldr r1, =0x020370BA
    add r2, r1
    mov r1, r2
    sub r1, #2
    ldrh r1, [r1]
    ldrh r2, [r2]
    cmp r1, #0
    beq deloop
    cmp r2, r3
    beq deloop
    b siguienteCondicion
obj:
    ldr r2, =0x020370D8
    ldrb r2, [r2]
    mov r1, #0x6
    mul r2, r1
    ldr r1, =0x020370BA
    add r2, r1
    mov r1, r2
    sub r1, #2
    ldrh r1, [r1]
    ldrh r2, [r2]
    cmp r1, #0
    beq deloop
    cmp r2, r3
    beq siguienteCondicion
    b deloop

tipoAtq:
    ldr r2, =0x02023D4A
    ldrh r2, [r2]
    mov r1, #12
    mul r2, r1
    ldr r1, =0x08AAAAAA
    add r2, r1
    ldrb r2, [r2, #0x2]
    cmp r2, r3
    beq siguienteCondicion
    b deloop

byte2:
    ldr r2, =0x02023D4A
    ldrh r2, [r2]
    mov r1, #12
    mul r2, r1
    ldr r1, =0x08AAAAAA
    add r2, r1
    ldrb r2, [r2, #0xA]
    cmp r2, r3
    beq siguienteCondicion
    b deloop


clima:
    ldr r2, =0x02023F1C
    ldrb r2, [r2]
    cmp r2, r3
    beq siguienteCondicion
    b deloop

noClima:
    ldr r2, =0x02023F1C
    ldrb r2, [r2]
    cmp r2, r3
    beq deloop
    b siguienteCondicion

campo:
    ldr r2, =0x020370BC
    ldrh r2, [r2]
    cmp r2, r3
    beq siguienteCondicion
    b deloop

noCampo:
    ldr r2, =0x020370BC
    ldrh r2, [r2]
    cmp r2, r3
    bne siguienteCondicion
    b deloop

atq:
    ldr r2, =0x02023D4A
    ldrh r2, [r2]
    cmp r2, r3
    beq siguienteCondicion
    b deloop

byte1:
    ldr r2, =0x02023D4A
    ldrh r2, [r2]
    mov r1, #12
    mul r2, r1
    ldr r1, =0x08AAAAAA
    add r2, r1
    ldrb r2, [r2, #0x9]
    cmp r2, r3
    beq siguienteCondicion
    b deloop

byte3:
    ldr r2, =0x02023D4A
    ldrh r2, [r2]
    mov r1, #12
    mul r2, r1
    ldr r1, =0x08AAAAAA
    add r2, r1
    ldrb r2, [r2, #0xB]
    cmp r2, r3
    beq siguienteCondicion
    b deloop

sig:
    b siguienteCondicion

com:
    b completado
delop:
    b deloop

moveEffect:
    ldr r2, =0x02023D4A
    ldrh r2, [r2]
    mov r1, #12
    mul r2, r1
    ldr r1, =0x08AAAAAA
    add r2, r1
    ldrb r2, [r2]
    cmp r2, r3
    beq siguienteCondicion
    b deloop

analizis2:
    cmp r2, #0xF
    beq tipoObj
    cmp r2, #0x10
    beq noTipoObj
    cmp r2, #0xC
    beq ps
    cmp r2, #0xD
    beq ps
    cmp r2, #0xE
    beq ps
    cmp r2, #0x13
    beq menorPot
    cmp r2, #0x14
    beq igualPot
    cmp r2, #0x15
    beq mayorPot
    cmp r2, #0x11
    beq ps
    b sig



tipoObj:
    ldr r2, =0x020370D8
    ldrh r2, [r2]
    mov r1, #0x6
    mul r2, r1
    ldr r1, =0x020370B8
    add r1, r2
    ldrh r1, [r1]
    cmp r1, #0x0
    beq delop
    mov r2, #0x1C
    mul r1, r2
    ldr r2, .tablaPokemon
    add r2, r1
    ldrb r1, [r2]
    cmp r1, r3
    beq sig
    ldrb r1, [r2, #1]
    cmp r1, r3
    beq sig
    b delop
 
noTipoObj:
    ldr r2, =0x020370D8
    ldrh r2, [r2]
    mov r1, #0x6
    mul r2, r1
    ldr r1, =0x020370B8
    add r1, r2
    mov r2, #0x1C
    mul r1, r2
    ldr r2, .tablaPokemon
    add r2, r1
    ldrb r1, [r2]
    cmp r1, r3
    beq delop
    ldrb r1, [r2, #1]
    cmp r1, r3
    beq delop
    b sig


ps:
    ldr r2, .rutinaPs
    bl linker
    cmp r2, #1
    beq sig
    b delop

menorPot:
    ldr r2, =0x02023D4A
    ldrh r2, [r2]
    mov r1, #12
    mul r2, r1
    ldr r1, =0x08AAAAAA
    add r2, r1
    ldrb r2, [r2, #0x1]
    cmp r2, r3
    blo sig
    b delop

igualPot:
    ldr r2, =0x02023D4A
    ldrh r2, [r2]
    mov r1, #12
    mul r2, r1
    ldr r1, =0x08AAAAAA
    add r2, r1
    ldrb r2, [r2, #0x1]
    cmp r2, r3
    beq sig
    b delop

mayorPot:
    ldr r2, =0x02023D4A
    ldrh r2, [r2]
    mov r1, #12
    mul r2, r1
    ldr r1, =0x08AAAAAA
    add r2, r1
    ldrb r2, [r2, #0x1]
    cmp r2, r3
    bhi sig
    b delop

completado:
    sub r4, #24
    sub r0, r1
    sub r0, #2
    ldrb r3, [r0]
    mov r2, #4
    mul r3, r2
    ldr r2, .tablaEfectos
    add r2, r3
    ldr r2, [r2]
    bl linker
    add r0, r1
    add r0, #2
    b delop
 

linker:
    bx r2

.align 2

.rutinaPs:
    .word 0x08XXXXXX

.tablaPokemon:
    .word 0x08BBBBBB

.tablaEfectos:
    .word 0x08CCCCCC

.table:
    .word 0x08DDDDDD
Bien, como ven es jo****mente largo, peeero es necesario, aquí va una lista de cosas que deben cambiar para que les sirva a ustedes...

- Las AA´s son la Tabla de movimientos pokemon. O sea el offset a esta tabla, la de las características de estos no la de los nombres. (Estas no están al final como las demás están en alguna zona del código de la rutina asignando su valor de forma directa, están específicamente en las líneas 170, 182, 230, 242, 262, 345, 357 y 369).

- Las XX´s es un offset mas uno sin permutar a una rutina que les pasare mas adelante...
- Las BB´s son la dirección a su tabla pokemon.
- Las CC´s son una dirección a una tabla de la que hablaremos mas adelante...
- Las DD´s lo mismo que arriba solo que a otra tabla.

Como verán aun no pueden insertar esta rutina ya que hacen falta otros componentes a los que esta hace referencia...

En los spoiler abajo de este estarán explicando cada una de estas referencias.

Se supone que esta rutina verificaría que un pokemon tuviera una cantidad de ps o un porcentaje de ps especifico, mayor o menor, sin embargo, en mi ingenuosidad pensé que usar el pokemon decrypter bastaría para saber cuales eran los ps de actuales de algún pokemon... Y no, los ps y demás estadísticas de un pokemon parecen estar encriptadas y no tengo idea de como saber los ps de un pokemon durante la batalla...

Aquí esta el código de todas formas. Las XX en la rutina verificadora pueden llenarlas con un offset cualquiera a una rutina, mientras no usen los parámetros para verificar los ps en los efectos a habilidades.

Esto es una de las cosas que me faltan y cuando lo resuelva volveré y editare.

Aun asi esta rutina también verifica si el pokemon tiene algun efecto de estado encima y esta parte si funciona bien, por lo que puedes insertarla aun así pues de algo te servira...

Codigo de la verificadora de ps:
Código:
.text
.thumb
.align 2

main:
    push {r4, lr}
    ldrb r2, [r0]
    ldr r4, =0x020370D8
    ldrh r4, [r4]
    push {r0-r1}
    cmp r4, #1
    beq enemy
    cmp r4, #3
    beq partner
    cmp r4, #2
    beq friend
 
player:
    ldr r0, =0x0803FBE9
    b motor

enemy:
    ldr r0, =0x0803FBE9
    b motor

partner:
    ldr r0, =0x02023BCE
    ldrh r1, [r0, #4]
    ldrh r0, [r0, #6]
    add r0, r1
    cmp r0, #0
    bhi enemy
    mov r4, #1
    b enemy

friend:
    ldr r0, =0x02023BCE
    ldrh r1, [r0, #4]
    ldrh r0, [r0, #6]
    add r0, r1
    cmp r0, #0
    bhi enemy
    mov r4, #1
    b cancelar


motor:
    mov r1, #100
    mul r1, r4
    add r0, r1
    mov r4, r3
    cmp r2, #0xC
    beq ps
    cmp r2, #0xD
    beq masps
    cmp r2, #0xE
    beq menosps
    cmp r2, #0x12
    beq effect
    b cancelar

ps:
    bl link
    cmp r0, r4
    beq aceptar
    b cancelar

effect:
    bl linky
    cmp r4, #0xff
    beq trans
    cmp r0, r4
    beq aceptar
    b cancelar

trans:
    cmp r0, #0
    bhi aceptar
    b cancelar
 

menosps:
    mov r3, r0
    bl linker
    mov r1, r4
    bl div
    mov r2, r0
    mov r0, r3
    mov r3, r2
    bl link
    cmp r0, r3
    blo aceptar
    b cancelar

masps:
    mov r3, r0
    bl linker
    mov r1, r4
    bl div
    mov r2, r0
    mov r0, r3
    mov r3, r2
    bl link
    cmp r0, r3
    bhi aceptar
    b cancelar
 

linker:
    mov r1, #0x3A
    ldr r2, =0x0803FBE9
    bx r2

link:
    mov r1, #0x39
    ldr r2, =0x0803FBE9
    bx r2

linky:
    mov r1, #0x37
    ldr r2, =0x0803FBE9
    bx r2

div:
    ldr r2, =0x081E4019
    bx r2
 

cancelar:
    mov r2, #0
    b devuelta
aceptar:
    mov r2, #1
    b devuelta

devuelta:
    pop {r0-r1}
    pop {r4, pc}
Se compila, inserta, permuta, suma uno insertar en xx de la rutina verificadora de arriba.


Esta tabla es otra tabla de rutinas pero estas rutinas son las que ejecutan los efectos de las habilidades, por el momento solo he desarrollado una de estas, ire agregando algunas mas a medida vaya desarrollando, pero cualquiera que sepa asm puede desarrollar estos efectos.

La tabla la tienes que insertar en un espacio de tu rom y hacer referencia a esa direccion en la rutina verificadora en CC.

La rutina en cuestión que he creado es una que potencia el movimiento que se esta realizando en el momento, puede indicar una debilidad para el portador o una potenciacion a los golpes de este.

la rutina es esta:
Código:
.text
.thumb
.align 2

    push {r1-r3, lr}
    ldr r1, =0x02023D6B
    ldrb r1, [r1]
    ldr r2, =0x020370D8
    ldrh r2, [r2]
    cmp r1, r2
    beq eject
    b fin

eject:
    mov r1, r0
    add r1, #11
    ldrh r1, [r1]
    ldr r2, =0x02023FD2
    ldrh r3, [r2]
    add r1, r3
    strh r1, [r2]

fin:
    pop {r1-r3, pc}
Se compila, se inserta, se permuta, se suma uno y se inserta en la tabla de efectos de habilidades.
En los comentarios de este foro iré agregando algunos efectos para habilidades.

Ahora sí viene lo chido...

Después de tanta preparación por fin llegamos a lo que queríamos, la tabla de habilidades en si, aquí les explico como funciona mi sistema de habilidades por tabla.

Empecemos con lo que ya saben, deben crear una tabla en algún espacio de su rom cada elemento de esta tabla (las habilidades) ocuparan 15 espacios de la misma, por lo que la tabla debe ser grande en comparación con las demás que han hecho, por fin la dirección de esta tabla debe ponerla en las DD´s de la rutina verificadora.

Ahora sí esta es la explicación de como construir una habilidad:

Los componentes de esta tabla estan compuestos por 7 propiedades distribuidas de la siguiente manera en el codigo:

11 11 22 22 33 33 44 55 55 55 55 66 66 77 77

Asi que este es el espacio que ocupa un solo efecto de habilidad. Ahora explicare de que van cada propiedad.

Empecemos con la primera.
Al comienzo de cada efecto debes declarar el index de la habilidad que tiene que tener algún pokemon en el campo para que el efecto se produzca, el numero tiene que estar en hexadecimal y aunque no creo que hagas mas de 255 habilidades he puesto un half world en lugar de un byte por si las moscas...
Por ello primero tienes que buscar la habilidad que quieres que tenga el efecto, por ejemplo digamos que quiero crear una habilidad, suponiendo que ya ampliamos la tabla de nombres de habilidades y tenemos el nombre y la descripción de nuestra habilidad, entonces vemos que numero de habilidad es, supongamos que es la numero 100, en este caso tendríamos que pasar a hex el numero 100 esto seria 64, este es el numero que tendran que insertar en el primer byte del efecto de la habilidad, el segundo byte debe ser 00, en caso de que el numero hexadecimal que les de la converción tenga mas de dos digitos tendran que poner los ultimos digitos en el primer offset y los primeros en el segundo, vamos que estoy diciendo que permuten el numero.

ejemplo aun así, si van a usar la habilidad 258 eso seria en hexadecimal 102, en el primer byte tendrían que poner 02 y en el segundo 01.

(vaya no queria explicar como permutar y aun así termine haciendolo)

La segunda propiedad.
Esta propiedad alberga un numero que indica el numero del efecto que queremos usar, eso significa que aquí va el numero de índice de una de las rutinas de efectos de la tabla de rutinas de habilidades, a esto yo le llamo el tipo de la habilidad ya que indica el tipo de efecto que va a ejecutar la habilidad, los índices empiezan desde el cero, por lo que su primera rutina de efecto sera el numero 0, la segunda 1 y así.

Como veras el esta propiedad tiene un halfworld, ¿Tantos efectos a habilidades pienso hacer? No. El tipo de la habilidad ocupa solo el primer byte, el segundo byte de esta propiedad pertenece al objetivo de la habilidad, es decir en base a que pokemon se ejecuta la habilidad. he aqui una lista de los valores que puede tener.

00 - se ejecuta en base al propietario de la habilidad.
01 - se ejecuta en base al pokemon rival que este enfrente al propietario de la habilidad.
02 - se ejecuta en base al pokemon compañero de quien tiene esta habilidad.
03 - se ejecuta en base al pokemon compañero del rival que este enfrente al propietario de la habilidad.

Mas adelante hare una actualización para mejorar un poco esto.

Tercera propiedad.
Esto es lo que les da identidad a las habilidades, son parametros que indican cuando se ejecutan los efectos. aquí una lista de estos.

00 - nada.
01 - No tiene objeto.
02 - llevar un objeto específico (se indica cuál en variables)
03 - Que el ataque efectuado sea de un tipo específico (se indica cuál en variables)
04 - que tenga una categoría (segundo byte en desuso de los poderes) específica
(variables :v)
05 - que halla un clima específico ... Ya saben a variables.
06 - que NO halla un clima específico. Se indica en variables.
07 - que halla un "campo" específico (me refiero a que halla algun efecto ejecutándose
en cada turno, esto aun no es funcional)
08 - Que NO halla un campo específico.
09 - que el ataque efectuado sea uno específico.
0A - que el primer byte en desuso de los poderes tenga un valor específico.
0B - que el tercer byte en desuso de los poderes tenga un valor específico.
0C - que el objetivo tenga cantidad de PS indicados en variable. (No funcional)
0D - que el objetivo tenga menos cantidad de PS de los indicados. (No funcional)
0E - que el objetivo tenga más cantidad de PS de los indicados. (No funcional)
0F - que el objetivo sea de un tipo específico.
10 - que el objetivo no sea de un tipo específico.
11 - si el objetivo sufre un efecto de estado.
12 - si el poder ejecutado tiene un move effect especifico.
13 - si el poder ejecutado tiene menor potencia a la especificada.
14 - si el poder ejecutado tiene igual potencia a la especificada.
15 - si el poder ejecutado tiene mayor potencia a la especificada.

(Ahora que los veo son pocas en comparación con el trabajo que costaron llevarlas a cabo)

Bueno pues estas indican la comparación que se tiene que llevar a cabo para verificar que la habilidad si se cumple, son dos comprovantes por lo que esta propiedad ocupa una half word, cada comprovante ocupa un byte.

La cuarta propiedad.
Por ahora solo es un espacio en blanco, proximamente modificara el como se ejecutan los turnos o mas bien quien ataca primero de quien. esto solo si se cumple la habilidad.

La quinta propiedad.
Esta ocupa una word completa pero en realidad son dos halfword, una detras de la otra e indican el valor que debe haber para que la comprovante se cumpla, esto es a los que mi yo del pasado en sus apuntes raros se refería con "variables". todo lo que vayas a poner aqui tiene que estar permutado, el tipo del pokemon objetivo, el objeto que tenga que tener, etc.

La sexta propiedad.
It is an extra property, it could be understood as a deprecated property but it has its functionality for other types of abilities that I will create in the future, you will see what I mean.

The seventh property.
This is to put it simply the skill parameter. For example, with the type of skills that we have so far, you can increase the power of the attacks, but if this half word is at zero, it was worth it because it will not do anything, you have to indicate a value, in it, by putting 1 the power of the attack will be doubled, by putting two it will be tripled and so on... Again, everything here must be permuted.


And well, that's all. With a little ingenuity you can make some skills with what I have left you here.

After inserting these routines and tables and putting their offsets in the checker routine, now if you can compile it, insert it, permute its offset, add one to it and add to the table of routines in turn to the happy checker routine.

As you can see, inserting this is complex and tedious, that's why I'm thinking first of simplifying it and then of making an "installation" tool.

As I said, I will update with new things, but if you want to try what I have and how it works, you are free to do so.

Anyway, thanks for everything. If I miss any recognition you can let me know, if you want to help with the project I will be happy to accept you, any help is welcome.


If you notice that my spelling went down in the end, it's because I'm tired and so is my computer, bye
cooooooooooooooooooooooooooooollllllllllllllllllllllllllllllllllllllllllll
 
Arriba