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:
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:
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).
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:
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...
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.
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.
Ahora sí viene lo chido...
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
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
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
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í.
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
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.
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
- 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:
Se compila, inserta, permuta, suma uno insertar en xx de la rutina verificadora de arriba.
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}
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:
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.
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}
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í.
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.
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: