29764-\[ASM]_Givepokemon_con_nombre_predefinido
#0
Javi4315♪ 13374
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

.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:

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:



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