Registrarse

[Rutina] [ASM] Givepokemon con nombre predefinido

Javi4315

Babyface
Miembro de honor
A raíz de la duda de un usuario para recibir un pokémon con nombre predefinido, se me ocurrió una idea para mi hack en base a eso. Así que decidí escribir la rutina y, por si a alguien le interesa también, la comparto.

Y ya que estamos, créditos necesarios :p

La rutina

Código:
.align 2
.thumb

push {r0-r4,lr}
ldr r0, .load_pointer
ldr r0, [r0]
ldr r2, .var_8000
ldrb r2, [r2]
mov r3, #0x64
mul r2, r3
add r2, #0x8
ldr r3, .pkmn_party
add r3, r2
ldr r1, .var_8000
ldrb r1, [r1]
add r1, #0x1
mov r4, #0x0

bucle1:
ldrb r2, [r0,r4]
cmp r2, #0xFF
beq completar
cmp r4, #0xA
beq fin
strb r2, [r3,r4]
add r4, #0x1
b bucle1

completar:
cmp r4, #0xA
beq fin
ldr r2, =0xFF
strb r2, [r3,r4]
mov r2, #0x0
add r4, #0x1
b completar

fin:
pop {r0-r4,pc}

.load_pointer: .word 0x03000f14
.var_8000: .word 0x020370B8
.pkmn_party: .word 0x02024284
Y aquí la tenéis directamente compilada:

Código:
1F B5 0E 48 00 68 0E 4A 12 78 64 23 5A 43 08 32 0C 4B 9B 18 0A 49 09 78 01 31 00 24 02 5D FF 2A 04 D0 0A 2C 09 D0 1A 55 01 34 F7 E7 0A 2C 04 D0 FF 22 1A 55 00 22 01 34 F8 E7 1F BD 14 0F 00 03 B8 70 03 02 84 42 02 02
Ya sabéis, la insertáis en una zona vacía del rom. El offset donde lo insertéis debe acabar en 0, 4, 8 o C. Es decir, en el offset 0x801343, por ejemplo, no lo podríais insertar porque acaba en 3.

Además, para llamar a la rutina, le debéis sumar 1. Es decir, si la insertas en el offset 0xB00000, luego tendrás que poner "callasm 0xB00001".

La rutina es para FR. Buscaré los offsets para ruby y actualizaré más adelante.

El script

El script es sencillísimo. Pero es necesario tener en cuenta que la rutina sólo funciona si hay espacio en el equipo. Es decir, si el pokémon va al PC, no funciona. El script es el siguiente:

(...)
loadpointer 0x0 @nombre 'Compila el nombre
countpokemon 'Comprueba la cantidad de pokémon en el equipo
copyvar 0x8000 LASTRESULT 'Guarda la cantidad en 0x8000
compare 0x8000 0x6 'Comprueba si tienes 6 (completo)
if 0x1 goto @noespacio 'Si los tienes va a @noespacio
givepokemon 0x(pokemon) 0x(nivel) 0x(objeto) 0x0 0x0 0x0
callasm 0x(offset de la rutina + 1) 'Ejecuta la rutina
(...)

#org @noespacio
(lo que pasa si no tienes espacio en el equipo)
(...)

#org @nombre
= PIPIOLO
Hay que tener en cuenta algunos aspectos:

  • Son 10 caracteres máximos para el nombre del pokémon. Si pones más, sólo se leerán los 10 primeros.
  • El número de pokémon (obtenido con countpokemon) siempre deberá guardarse en la variable 0x8000, ya que es la que lee la rutina.
  • La rutina debe ejecutarse (callasm) después de tener el número de pokémon en la variable 0x8000 y de haber hecho el givepokemon.

Y eso es todo. Yo la he estado probando y no me da ningún problema. Pero si no os va o tenéis algún problema me lo decís ;D
 
M

Miembro eliminado 28262

Invitado
lo pruebo ahora mismo! pedazo de aporte javi, sin duda estaras en los creditos de mi hackrom, y quiero confesarte que algun dia quiero ser como tú y poder programas asm chulísimos-dattebayo! :blush:4

EDIT
Muchas gracias Javi!
 

Dani_SR_17

¡Pokémon LionHeart!
Ole, ole y ole el Javi que nos trae una rutina de las útiles jeje.
La verdad, me parece un aportazo, y me vendrá muy bien en ciertas ocasiones.

¿Sabes si se puede hacer que el Pokémon de un entrenador tenga nombre?
 

MegaSceptile9

Usuario mítico
Interesante, sencillo, pero interesante.

Con esto se pueden hacer varias cosillas si se
tiene buena imaginación, tal vez lo use, ya que
en mi hack los pokemon son dados y no atrapados.

Gracias por el aporte...espero que empieces a liberar más rutinas
 
Arriba