Registrarse

[Rutina] Rutinas by Javi4315 [Pokémon Editor | Act - 01/05/2017]

FEL!X

ᴛᴜ ᴀᴍɪɢᴏ ᴇʟ ᴇsᴘᴀᴅᴀᴄʜíɴ
Usuario de Oro
Respuesta: Rutinas by Javi4315 [Poder Oculto | Act - 20/04/2017]

Javi4315♪;381526 dijo:
Esta rutina permite editar los datos encriptados de cualquier pokémon del equipo. Para ello, traslada los datos desencriptados del pokémon a un espacio libre de la RAM donde se pueden editar.
¡¡Esto es jodidamente genial! Es genial poder editar completamente los datos de un pokemon del equipo!! ¡Directo a mi hack jefe! Eres genial tío, cuando actualicé el hack te haré una mención a lo grande. No sabes el jugo que le voy a sacar a tu rutina. Ya tengo unas ideas muy bestias para darle mucho pero que mucho juego <3

~Mis respetos


¡Muchas gracias hermano!
~Un abrazo
 

pikachu240

Junior C# Developer
Una pregunta se podria hacer que te den un pokemon con uno o varios ataques custom(ataques que no tiene porque aprender por ejemplo pikachu con surf)
Seria como lo del nombre? Se podria poner en variables los ataques y luego modificarlo aunque molaria dar un pokemon customizado de arriba a abajo preparado con asignar variables las que sean texto podrían ser punteros al texto (bueno no se como va el asm pero me parece que es posible :)

Crees que se podria hacer? De ser asi podrías?????(carita de perro pidon)(entiendo que puede ser mucha faena y no tengas ganas xD)
 

Javi4315

Babyface
Miembro de honor
Una pregunta se podria hacer que te den un pokemon con uno o varios ataques custom(ataques que no tiene porque aprender por ejemplo pikachu con surf)
Seria como lo del nombre? Se podria poner en variables los ataques y luego modificarlo aunque molaria dar un pokemon customizado de arriba a abajo preparado con asignar variables las que sean texto podrían ser punteros al texto (bueno no se como va el asm pero me parece que es posible :)

Crees que se podria hacer? De ser asi podrías?????(carita de perro pidon)(entiendo que puede ser mucha faena y no tengas ganas xD)
Puedes hacerlo con la última rutina que puse ("Pokémon editor"). Desencripta el pokémon que quieras editar, y utiliza el comando writebytooffset para cambiar los ataques. Puse la tabla, si la miras, verás que los ataques están en 0x203F500 + 44.
 

Cheve

MoonLover~
Miembro de honor
Respuesta: Rutinas by Javi4315 [Poder Oculto | Act - 20/04/2017]

Javi4315♪;381526 dijo:

POKéMON EDITOR​

Esta rutina permite editar los datos encriptados de cualquier pokémon del equipo. Para ello, traslada los datos desencriptados del pokémon a un espacio libre de la RAM donde se pueden editar.

En realidad, el sistema utiliza dos rutinas, una para desencriptar y otra para encriptar. Aviso de que son largas.

Esta es la rutina para desencriptar los datos:

Código:
.align 2
.thumb

push {r0-r7,lr}
ldr r1, .var_8000
ldrh r1, [r1]
mov r0, #0x64
mul r1, r0
ldr r0, .party
add r0, r0, r1
ldr r1, [r0]
ldr r2, [r0,#0x4]
eor r1, r2
mov r6, r1
ldr r2, .memory
mov r7, #0x0
ldr r7, [r0,#0x50]
mov r5, r0
ldr r0, [r0]

seguir2:
ldr r1, =0x18000000
cmp r0, r1
blo seguir3
sub r0, r0, r1
b seguir2

seguir3:
ldr r1, =0x1800000
cmp r0, r1
blo seguir4
sub r0, r0, r1
b seguir3

seguir4:
ldr r1, =0x180000
cmp r0, r1
blo seguir5
sub r0, r0, r1
b seguir4

seguir5:
ldr r1, =0x18000
cmp r0, r1
blo seguir6
sub r0, r0, r1
b seguir5

seguir6:
ldr r1, =0x1800
cmp r0, r1
blo seguir7
sub r0, r0, r1
b seguir6

seguir7:
ldr r1, =0x180
cmp r0, r1
blo seguir8
sub r0, r0, r1
b seguir7

seguir8:
ldr r1, =0x18
cmp r0, r1
blo continuar
sub r0, r0, r1
b seguir8

continuar:
str r0, [r2,#0x50]
mov r0, r5
mov r5, #0x0
ldr r3, [r0]
str r3, [r2]
ldr r3, [r0,#0x4]
str r3, [r2,#0x4]
ldr r3, [r0,#0x8]
str r3, [r2,#0x8]
ldr r3, [r0,#0xC]
str r3, [r2,#0xC]
ldr r3, [r0,#0x10]
str r3, [r2,#0x10]
ldr r3, [r0,#0x14]
str r3, [r2,#0x14]
ldr r3, [r0,#0x18]
str r3, [r2,#0x18]
ldr r3, [r0,#0x1C]
str r3, [r2,#0x1C]
mov r5, #0x50
ldr r5, .memory
ldr r4, =0x50
ldrb r5, [r5,r4]
mov r1, r6
cmp r5, #0x6
blo g_pri
cmp r5, #0xC
blo a_pri
cmp r5, #0x12
blo e_pri
cmp r5, #0x18
blo m_pri

g_pri:
mov r3, #0x0
ldr r3, [r0,#0x20]
eor r3, r1
str r3, [r2,#0x20]
ldr r3, [r0,#0x24]
eor r3, r1
str r3, [r2,#0x24]
ldr r3, [r0,#0x28]
eor r3, r1
str r3, [r2,#0x28]
b segunda

a_pri:
mov r3, #0x0
ldr r3, [r0,#0x20]
eor r3, r1
str r3, [r2,#0x2C]
ldr r3, [r0,#0x24]
eor r3, r1
str r3, [r2,#0x30]
ldr r3, [r0,#0x28]
eor r3, r1
str r3, [r2,#0x34]
b segunda

e_pri:
mov r3, #0x0
ldr r3, [r0,#0x20]
eor r3, r1
str r3, [r2,#0x38]
ldr r3, [r0,#0x24]
eor r3, r1
str r3, [r2,#0x3C]
ldr r3, [r0,#0x28]
eor r3, r1
str r3, [r2,#0x40]
b segunda

m_pri:
mov r3, #0x0
ldr r3, [r0,#0x20]
eor r3, r1
str r3, [r2,#0x44]
ldr r3, [r0,#0x24]
eor r3, r1
str r3, [r2,#0x48]
ldr r3, [r0,#0x28]
eor r3, r1
str r3, [r2,#0x4C]

segunda:
mov r3, #0x0
cmp r5, #0x6
beq g_seg
cmp r5, #0x7
beq g_seg
cmp r5, #0xC
beq g_seg
cmp r5, #0xD
beq g_seg
cmp r5, #0x12
beq g_seg
cmp r5, #0x13
beq g_seg
cmp r5, #0x0
beq a_seg
cmp r5, #0x1
beq a_seg
cmp r5, #0xE
beq a_seg
cmp r5, #0xF
beq a_seg
cmp r5, #0x14
beq a_seg
cmp r5, #0x15
beq a_seg
cmp r5, #0x2
beq e_seg
cmp r5, #0x3
beq e_seg
cmp r5, #0x8
beq e_seg
cmp r5, #0x9
beq e_seg
cmp r5, #0x16
beq e_seg
cmp r5, #0x17
beq e_seg
cmp r5, #0x4
beq m_seg
cmp r5, #0x5
beq m_seg
cmp r5, #0xA
beq m_seg
cmp r5, #0xB
beq m_seg
cmp r5, #0x10
beq m_seg
cmp r5, #0x11
beq m_seg

g_seg:
mov r3, #0x0
ldr r3, [r0,#0x2C]
eor r3, r1
str r3, [r2,#0x20]
ldr r3, [r0,#0x30]
eor r3, r1
str r3, [r2,#0x24]
ldr r3, [r0,#0x34]
eor r3, r1
str r3, [r2,#0x28]
b tercera

a_seg:
mov r3, #0x0
ldr r3, [r0,#0x2C]
eor r3, r1
str r3, [r2,#0x2C]
ldr r3, [r0,#0x30]
eor r3, r1
str r3, [r2,#0x30]
ldr r3, [r0,#0x34]
eor r3, r1
str r3, [r2,#0x34]
b tercera

e_seg:
mov r3, #0x0
ldr r3, [r0,#0x2C]
eor r3, r1
str r3, [r2,#0x38]
ldr r3, [r0,#0x30]
eor r3, r1
str r3, [r2,#0x3C]
ldr r3, [r0,#0x34]
eor r3, r1
str r3, [r2,#0x40]
b tercera

m_seg:
mov r3, #0x0
ldr r3, [r0,#0x2C]
eor r3, r1
str r3, [r2,#0x44]
ldr r3, [r0,#0x30]
eor r3, r1
str r3, [r2,#0x48]
ldr r3, [r0,#0x34]
eor r3, r1
str r3, [r2,#0x4C]

tercera:
mov r3, #0x0
cmp r5, #0x8
beq g_ter
cmp r5, #0xA
beq g_ter
cmp r5, #0xE
beq g_ter
cmp r5, #0x10
beq g_ter
cmp r5, #0x14
beq g_ter
cmp r5, #0x16
beq g_ter
cmp r5, #0x2
beq a_ter
cmp r5, #0x4
beq a_ter
cmp r5, #0xC
beq a_ter
cmp r5, #0x11
beq a_ter
cmp r5, #0x12
beq a_ter
cmp r5, #0x17
beq a_ter
cmp r5, #0x0
beq e_ter
cmp r5, #0x5
beq e_ter
cmp r5, #0x6
beq e_ter
cmp r5, #0xB
beq e_ter
cmp r5, #0x13
beq e_ter
cmp r5, #0x15
beq e_ter
cmp r5, #0x1
beq m_ter
cmp r5, #0x3
beq m_ter
cmp r5, #0x7
beq m_ter
cmp r5, #0x9
beq m_ter
cmp r5, #0xD
beq m_ter
cmp r5, #0xF
beq m_ter

g_ter:
mov r3, #0x0
ldr r3, [r0,#0x38]
eor r3, r1
str r3, [r2,#0x20]
ldr r3, [r0,#0x3C]
eor r3, r1
str r3, [r2,#0x24]
ldr r3, [r0,#0x40]
eor r3, r1
str r3, [r2,#0x28]
b cuarta

a_ter:
mov r3, #0x0
ldr r3, [r0,#0x38]
eor r3, r1
str r3, [r2,#0x2C]
ldr r3, [r0,#0x3C]
eor r3, r1
str r3, [r2,#0x30]
ldr r3, [r0,#0x40]
eor r3, r1
str r3, [r2,#0x34]
b cuarta

e_ter:
mov r3, #0x0
ldr r3, [r0,#0x38]
eor r3, r1
str r3, [r2,#0x38]
ldr r3, [r0,#0x3C]
eor r3, r1
str r3, [r2,#0x3C]
ldr r3, [r0,#0x40]
eor r3, r1
str r3, [r2,#0x40]
b cuarta

m_ter:
mov r3, #0x0
ldr r3, [r0,#0x38]
eor r3, r1
str r3, [r2,#0x44]
ldr r3, [r0,#0x3C]
eor r3, r1
str r3, [r2,#0x48]
ldr r3, [r0,#0x40]
eor r3, r1
str r3, [r2,#0x4C]

cuarta:
mov r3, #0x0
cmp r5, #0x9
beq g_cua
cmp r5, #0xB
beq g_cua
cmp r5, #0xF
beq g_cua
cmp r5, #0x11
beq g_cua
cmp r5, #0x15
beq g_cua
cmp r5, #0x17
beq g_cua
cmp r5, #0x3
beq a_cua
cmp r5, #0x5
beq a_cua
cmp r5, #0xD
beq a_cua
cmp r5, #0x10
beq a_cua
cmp r5, #0x13
beq a_cua
cmp r5, #0x16
beq a_cua
cmp r5, #0x1
beq e_cua
cmp r5, #0x4
beq e_cua
cmp r5, #0x7
beq e_cua
cmp r5, #0xA
beq e_cua
cmp r5, #0x12
beq e_cua
cmp r5, #0x14
beq e_cua
cmp r5, #0x0
beq m_cua
cmp r5, #0x2
beq m_cua
cmp r5, #0x6
beq m_cua
cmp r5, #0x8
beq m_cua
cmp r5, #0xC
beq m_cua
cmp r5, #0xE
beq m_cua

g_cua:
mov r3, #0x0
ldr r3, [r0,#0x44]
eor r3, r1
str r3, [r2,#0x20]
ldr r3, [r0,#0x48]
eor r3, r1
str r3, [r2,#0x24]
ldr r3, [r0,#0x4C]
eor r3, r1
str r3, [r2,#0x28]
b salir

a_cua:
mov r3, #0x0
ldr r3, [r0,#0x44]
eor r3, r1
str r3, [r2,#0x2C]
ldr r3, [r0,#0x48]
eor r3, r1
str r3, [r2,#0x30]
ldr r3, [r0,#0x4C]
eor r3, r1
str r3, [r2,#0x34]
b salir

e_cua:
mov r3, #0x0
ldr r3, [r0,#0x44]
eor r3, r1
str r3, [r2,#0x38]
ldr r3, [r0,#0x48]
eor r3, r1
str r3, [r2,#0x3C]
ldr r3, [r0,#0x4C]
eor r3, r1
str r3, [r2,#0x40]
b salir

m_cua:
mov r3, #0x0
ldr r3, [r0,#0x44]
eor r3, r1
str r3, [r2,#0x44]
ldr r3, [r0,#0x48]
eor r3, r1
str r3, [r2,#0x48]
ldr r3, [r0,#0x4C]
eor r3, r1
str r3, [r2,#0x4C]

salir:
str r7, [r2,#0x50]
pop {r0-r7,pc}

.party: .word 0x02024284
.var_8000: .word 0x020370B8
.memory: .word 0x0203f500
Código:
FF B5 CA 49 09 88 64 20 41 43 C7 48 40 18 01 68 42 68 51 40 0E 1C C6 4A 00 27 07 6D 05 1C 00 68 C4 49 88 42 01 D3 40 1A FA E7 C3 49 88 42 01 D3 40 1A FA E7 C1 49 88 42 01 D3 40 1A FA E7 C0 49 88 42 01 D3 40 1A FA E7 BE 49 88 42 01 D3 40 1A FA E7 BD 49 88 42 01 D3 40 1A FA E7 18 21 88 42 01 D3 40 1A FA E7 10 65 28 1C 00 25 03 68 13 60 43 68 53 60 83 68 93 60 C3 68 D3 60 03 69 13 61 43 69 53 61 83 69 93 61 C3 69 D3 61 50 25 A8 4D 50 24 2D 5D 31 1C 06 2D 05 D3 0C 2D 0E D3 12 2D 17 D3 18 2D 20 D3 00 23 03 6A 4B 40 13 62 43 6A 4B 40 53 62 83 6A 4B 40 93 62 1F E0 00 23 03 6A 4B 40 D3 62 43 6A 4B 40 13 63 83 6A 4B 40 53 63 14 E0 00 23 03 6A 4B 40 93 63 43 6A 4B 40 D3 63 83 6A 4B 40 13 64 09 E0 00 23 03 6A 4B 40 53 64 43 6A 4B 40 93 64 83 6A 4B 40 D3 64 00 23 06 2D 2D D0 07 2D 2B D0 0C 2D 29 D0 0D 2D 27 D0 12 2D 25 D0 13 2D 23 D0 00 2D 2C D0 01 2D 2A D0 0E 2D 28 D0 0F 2D 26 D0 14 2D 24 D0 15 2D 22 D0 02 2D 2B D0 03 2D 29 D0 08 2D 27 D0 09 2D 25 D0 16 2D 23 D0 17 2D 21 D0 04 2D 2A D0 05 2D 28 D0 0A 2D 26 D0 0B 2D 24 D0 10 2D 22 D0 11 2D 20 D0 00 23 C3 6A 4B 40 13 62 03 6B 4B 40 53 62 43 6B 4B 40 93 62 1F E0 00 23 C3 6A 4B 40 D3 62 03 6B 4B 40 13 63 43 6B 4B 40 53 63 14 E0 00 23 C3 6A 4B 40 93 63 03 6B 4B 40 D3 63 43 6B 4B 40 13 64 09 E0 00 23 C3 6A 4B 40 53 64 03 6B 4B 40 93 64 43 6B 4B 40 D3 64 00 23 08 2D 2D D0 0A 2D 2B D0 0E 2D 29 D0 10 2D 27 D0 14 2D 25 D0 16 2D 23 D0 02 2D 2C D0 04 2D 2A D0 0C 2D 28 D0 11 2D 26 D0 12 2D 24 D0 17 2D 22 D0 00 2D 2B D0 05 2D 29 D0 06 2D 27 D0 0B 2D 25 D0 13 2D 23 D0 15 2D 21 D0 01 2D 2A D0 03 2D 28 D0 07 2D 26 D0 09 2D 24 D0 0D 2D 22 D0 0F 2D 20 D0 00 23 83 6B 4B 40 13 62 C3 6B 4B 40 53 62 03 6C 4B 40 93 62 1F E0 00 23 83 6B 4B 40 D3 62 C3 6B 4B 40 13 63 03 6C 4B 40 53 63 14 E0 00 23 83 6B 4B 40 93 63 C3 6B 4B 40 D3 63 03 6C 4B 40 13 64 09 E0 00 23 83 6B 4B 40 53 64 C3 6B 4B 40 93 64 03 6C 4B 40 D3 64 00 23 09 2D 2D D0 0B 2D 2B D0 0F 2D 29 D0 11 2D 27 D0 15 2D 25 D0 17 2D 23 D0 03 2D 2C D0 05 2D 2A D0 0D 2D 28 D0 10 2D 26 D0 13 2D 24 D0 16 2D 22 D0 01 2D 2B D0 04 2D 29 D0 07 2D 27 D0 0A 2D 25 D0 12 2D 23 D0 14 2D 21 D0 00 2D 2A D0 02 2D 28 D0 06 2D 26 D0 08 2D 24 D0 0C 2D 22 D0 0E 2D 20 D0 00 23 43 6C 4B 40 13 62 83 6C 4B 40 53 62 C3 6C 4B 40 93 62 1F E0 00 23 43 6C 4B 40 D3 62 83 6C 4B 40 13 63 C3 6C 4B 40 53 63 14 E0 00 23 43 6C 4B 40 93 63 83 6C 4B 40 D3 63 C3 6C 4B 40 13 64 09 E0 00 23 43 6C 4B 40 53 64 83 6C 4B 40 93 64 C3 6C 4B 40 D3 64 17 65 FF BD 84 42 02 02 B8 70 03 02 00 F5 03 02 00 00 00 18 00 00 80 01 00 00 18 00 00 80 01 00 00 18 00 00 80 01 00 00
Y esta es la rutina para volverlos a encriptar:

Código:
.align 2
.thumb

push {r0-r7,lr}
ldrh r0, .memory
add r0, #0x20
mov r2, #0x0
mov r3, #0x2
mov r4, #0x0

checksum:
cmp r2, #0x30
beq encriptar2
ldrh r1, [r0,r2]
add r4, r4, r1
add r2, r2, r3
b checksum

encriptar2:
ldr r1, .var_8000
ldrh r1, [r1]
mov r0, #0x64
mul r1, r0
ldr r0, .party
add r2, r0, r1
ldr r0, .memory
ldr r7, [r0,#0x50]
strh r4, [r0,#0x1C]
ldr r1, [r0]
ldr r5, [r0,#0x4]
eor r1, r5
mov r6, r1
mov r5, r0
ldr r0, [r0]

seguir2:
ldr r1, =0x18000000
cmp r0, r1
blo seguir3
sub r0, r0, r1
b seguir2

seguir3:
ldr r1, =0x1800000
cmp r0, r1
blo seguir4
sub r0, r0, r1
b seguir3

seguir4:
ldr r1, =0x180000
cmp r0, r1
blo seguir5
sub r0, r0, r1
b seguir4

seguir5:
ldr r1, =0x18000
cmp r0, r1
blo seguir6
sub r0, r0, r1
b seguir5

seguir6:
ldr r1, =0x1800
cmp r0, r1
blo seguir7
sub r0, r0, r1
b seguir6

seguir7:
ldr r1, =0x180
cmp r0, r1
blo seguir8
sub r0, r0, r1
b seguir7

seguir8:
ldr r1, =0x18
cmp r0, r1
blo continuar
sub r0, r0, r1
b seguir8

continuar:
str r0, [r2,#0x50]
mov r0, r5
mov r5, #0x0
ldr r3, [r0]
str r3, [r2]
ldr r3, [r0,#0x4]
str r3, [r2,#0x4]
ldr r3, [r0,#0x8]
str r3, [r2,#0x8]
ldr r3, [r0,#0xC]
str r3, [r2,#0xC]
ldr r3, [r0,#0x10]
str r3, [r2,#0x10]
ldr r3, [r0,#0x14]
str r3, [r2,#0x14]
ldr r3, [r0,#0x18]
str r3, [r2,#0x18]
ldr r3, [r0,#0x1C]
str r3, [r2,#0x1C]
mov r5, #0x50
ldr r4, =0x50
ldrb r5, [r2,r4]
mov r1, r6
cmp r5, #0x6
blo g_pri
cmp r5, #0xC
blo a_pri
cmp r5, #0x12
blo e_pri
cmp r5, #0x18
blo m_pri

g_pri:
mov r3, #0x0
ldr r3, [r0,#0x20]
eor r3, r1
str r3, [r2,#0x20]
ldr r3, [r0,#0x24]
eor r3, r1
str r3, [r2,#0x24]
ldr r3, [r0,#0x28]
eor r3, r1
str r3, [r2,#0x28]
b segunda

a_pri:
mov r3, #0x0
ldr r3, [r0,#0x2C]
eor r3, r1
str r3, [r2,#0x20]
ldr r3, [r0,#0x30]
eor r3, r1
str r3, [r2,#0x24]
ldr r3, [r0,#0x34]
eor r3, r1
str r3, [r2,#0x28]
b segunda

e_pri:
mov r3, #0x0
ldr r3, [r0,#0x38]
eor r3, r1
str r3, [r2,#0x20]
ldr r3, [r0,#0x3C]
eor r3, r1
str r3, [r2,#0x24]
ldr r3, [r0,#0x40]
eor r3, r1
str r3, [r2,#0x28]
b segunda

m_pri:
mov r3, #0x0
ldr r3, [r0,#0x44]
eor r3, r1
str r3, [r2,#0x20]
ldr r3, [r0,#0x48]
eor r3, r1
str r3, [r2,#0x24]
ldr r3, [r0,#0x4C]
eor r3, r1
str r3, [r2,#0x28]

segunda:
mov r3, #0x0
cmp r5, #0x6
beq g_seg
cmp r5, #0x7
beq g_seg
cmp r5, #0xC
beq g_seg
cmp r5, #0xD
beq g_seg
cmp r5, #0x12
beq g_seg
cmp r5, #0x13
beq g_seg
cmp r5, #0x0
beq a_seg
cmp r5, #0x1
beq a_seg
cmp r5, #0xE
beq a_seg
cmp r5, #0xF
beq a_seg
cmp r5, #0x14
beq a_seg
cmp r5, #0x15
beq a_seg
cmp r5, #0x2
beq e_seg
cmp r5, #0x3
beq e_seg
cmp r5, #0x8
beq e_seg
cmp r5, #0x9
beq e_seg
cmp r5, #0x16
beq e_seg
cmp r5, #0x17
beq e_seg
cmp r5, #0x4
beq m_seg
cmp r5, #0x5
beq m_seg
cmp r5, #0xA
beq m_seg
cmp r5, #0xB
beq m_seg
cmp r5, #0x10
beq m_seg
cmp r5, #0x11
beq m_seg

g_seg:
mov r3, #0x0
ldr r3, [r0,#0x20]
eor r3, r1
str r3, [r2,#0x2C]
ldr r3, [r0,#0x24]
eor r3, r1
str r3, [r2,#0x30]
ldr r3, [r0,#0x28]
eor r3, r1
str r3, [r2,#0x34]
b tercera

a_seg:
mov r3, #0x0
ldr r3, [r0,#0x2C]
eor r3, r1
str r3, [r2,#0x2C]
ldr r3, [r0,#0x30]
eor r3, r1
str r3, [r2,#0x30]
ldr r3, [r0,#0x34]
eor r3, r1
str r3, [r2,#0x34]
b tercera

e_seg:
mov r3, #0x0
ldr r3, [r0,#0x38]
eor r3, r1
str r3, [r2,#0x2C]
ldr r3, [r0,#0x3C]
eor r3, r1
str r3, [r2,#0x30]
ldr r3, [r0,#0x40]
eor r3, r1
str r3, [r2,#0x34]
b tercera

m_seg:
mov r3, #0x0
ldr r3, [r0,#0x44]
eor r3, r1
str r3, [r2,#0x2C]
ldr r3, [r0,#0x48]
eor r3, r1
str r3, [r2,#0x30]
ldr r3, [r0,#0x4C]
eor r3, r1
str r3, [r2,#0x34]

tercera:
mov r3, #0x0
cmp r5, #0x8
beq g_ter
cmp r5, #0xA
beq g_ter
cmp r5, #0xE
beq g_ter
cmp r5, #0x10
beq g_ter
cmp r5, #0x14
beq g_ter
cmp r5, #0x16
beq g_ter
cmp r5, #0x2
beq a_ter
cmp r5, #0x4
beq a_ter
cmp r5, #0xC
beq a_ter
cmp r5, #0x11
beq a_ter
cmp r5, #0x12
beq a_ter
cmp r5, #0x17
beq a_ter
cmp r5, #0x0
beq e_ter
cmp r5, #0x5
beq e_ter
cmp r5, #0x6
beq e_ter
cmp r5, #0xB
beq e_ter
cmp r5, #0x13
beq e_ter
cmp r5, #0x15
beq e_ter
cmp r5, #0x1
beq m_ter
cmp r5, #0x3
beq m_ter
cmp r5, #0x7
beq m_ter
cmp r5, #0x9
beq m_ter
cmp r5, #0xD
beq m_ter
cmp r5, #0xF
beq m_ter

g_ter:
mov r3, #0x0
ldr r3, [r0,#0x20]
eor r3, r1
str r3, [r2,#0x38]
ldr r3, [r0,#0x24]
eor r3, r1
str r3, [r2,#0x3C]
ldr r3, [r0,#0x28]
eor r3, r1
str r3, [r2,#0x40]
b cuarta

a_ter:
mov r3, #0x0
ldr r3, [r0,#0x2C]
eor r3, r1
str r3, [r2,#0x38]
ldr r3, [r0,#0x30]
eor r3, r1
str r3, [r2,#0x3C]
ldr r3, [r0,#0x34]
eor r3, r1
str r3, [r2,#0x40]
b cuarta

e_ter:
mov r3, #0x0
ldr r3, [r0,#0x38]
eor r3, r1
str r3, [r2,#0x38]
ldr r3, [r0,#0x3C]
eor r3, r1
str r3, [r2,#0x3C]
ldr r3, [r0,#0x40]
eor r3, r1
str r3, [r2,#0x40]
b cuarta

m_ter:
mov r3, #0x0
ldr r3, [r0,#0x44]
eor r3, r1
str r3, [r2,#0x38]
ldr r3, [r0,#0x48]
eor r3, r1
str r3, [r2,#0x3C]
ldr r3, [r0,#0x4C]
eor r3, r1
str r3, [r2,#0x40]

cuarta:
mov r3, #0x0
cmp r5, #0x9
beq g_cua
cmp r5, #0xB
beq g_cua
cmp r5, #0xF
beq g_cua
cmp r5, #0x11
beq g_cua
cmp r5, #0x15
beq g_cua
cmp r5, #0x17
beq g_cua
cmp r5, #0x3
beq a_cua
cmp r5, #0x5
beq a_cua
cmp r5, #0xD
beq a_cua
cmp r5, #0x10
beq a_cua
cmp r5, #0x13
beq a_cua
cmp r5, #0x16
beq a_cua
cmp r5, #0x1
beq e_cua
cmp r5, #0x4
beq e_cua
cmp r5, #0x7
beq e_cua
cmp r5, #0xA
beq e_cua
cmp r5, #0x12
beq e_cua
cmp r5, #0x14
beq e_cua
cmp r5, #0x0
beq m_cua
cmp r5, #0x2
beq m_cua
cmp r5, #0x6
beq m_cua
cmp r5, #0x8
beq m_cua
cmp r5, #0xC
beq m_cua
cmp r5, #0xE
beq m_cua

g_cua:
mov r3, #0x0
ldr r3, [r0,#0x20]
eor r3, r1
str r3, [r2,#0x44]
ldr r3, [r0,#0x24]
eor r3, r1
str r3, [r2,#0x48]
ldr r3, [r0,#0x28]
eor r3, r1
str r3, [r2,#0x4C]
b salir

a_cua:
mov r3, #0x0
ldr r3, [r0,#0x2C]
eor r3, r1
str r3, [r2,#0x44]
ldr r3, [r0,#0x30]
eor r3, r1
str r3, [r2,#0x48]
ldr r3, [r0,#0x34]
eor r3, r1
str r3, [r2,#0x4C]
b salir

e_cua:
mov r3, #0x0
ldr r3, [r0,#0x38]
eor r3, r1
str r3, [r2,#0x44]
ldr r3, [r0,#0x3C]
eor r3, r1
str r3, [r2,#0x48]
ldr r3, [r0,#0x40]
eor r3, r1
str r3, [r2,#0x4C]
b salir

m_cua:
mov r3, #0x0
ldr r3, [r0,#0x44]
eor r3, r1
str r3, [r2,#0x44]
ldr r3, [r0,#0x48]
eor r3, r1
str r3, [r2,#0x48]
ldr r3, [r0,#0x4C]
eor r3, r1
str r3, [r2,#0x4C]

salir:
str r7, [r2,#0x50]
pop {r0-r7,pc}

.party: .word 0x02024284
.var_8000: .word 0x020370B8
.memory: .word 0x0203f500
Código:
FF B5 D0 48 20 30 00 22 02 23 00 24 30 2A 03 D0 81 5A 64 18 D2 18 F9 E7 C9 49 09 88 64 20 41 43 C6 48 42 18 C7 48 07 6D 84 83 01 68 45 68 69 40 0E 1C 05 1C 00 68 C4 49 88 42 01 D3 40 1A FA E7 C2 49 88 42 01 D3 40 1A FA E7 C1 49 88 42 01 D3 40 1A FA E7 BF 49 88 42 01 D3 40 1A FA E7 BE 49 88 42 01 D3 40 1A FA E7 BC 49 88 42 01 D3 40 1A FA E7 18 21 88 42 01 D3 40 1A FA E7 10 65 28 1C 00 25 03 68 13 60 43 68 53 60 83 68 93 60 C3 68 D3 60 03 69 13 61 43 69 53 61 83 69 93 61 C3 69 D3 61 50 25 50 24 15 5D 31 1C 06 2D 05 D3 0C 2D 0E D3 12 2D 17 D3 18 2D 20 D3 00 23 03 6A 4B 40 13 62 43 6A 4B 40 53 62 83 6A 4B 40 93 62 1F E0 00 23 C3 6A 4B 40 13 62 03 6B 4B 40 53 62 43 6B 4B 40 93 62 14 E0 00 23 83 6B 4B 40 13 62 C3 6B 4B 40 53 62 03 6C 4B 40 93 62 09 E0 00 23 43 6C 4B 40 13 62 83 6C 4B 40 53 62 C3 6C 4B 40 93 62 00 23 06 2D 2D D0 07 2D 2B D0 0C 2D 29 D0 0D 2D 27 D0 12 2D 25 D0 13 2D 23 D0 00 2D 2C D0 01 2D 2A D0 0E 2D 28 D0 0F 2D 26 D0 14 2D 24 D0 15 2D 22 D0 02 2D 2B D0 03 2D 29 D0 08 2D 27 D0 09 2D 25 D0 16 2D 23 D0 17 2D 21 D0 04 2D 2A D0 05 2D 28 D0 0A 2D 26 D0 0B 2D 24 D0 10 2D 22 D0 11 2D 20 D0 00 23 03 6A 4B 40 D3 62 43 6A 4B 40 13 63 83 6A 4B 40 53 63 1F E0 00 23 C3 6A 4B 40 D3 62 03 6B 4B 40 13 63 43 6B 4B 40 53 63 14 E0 00 23 83 6B 4B 40 D3 62 C3 6B 4B 40 13 63 03 6C 4B 40 53 63 09 E0 00 23 43 6C 4B 40 D3 62 83 6C 4B 40 13 63 C3 6C 4B 40 53 63 00 23 08 2D 2D D0 0A 2D 2B D0 0E 2D 29 D0 10 2D 27 D0 14 2D 25 D0 16 2D 23 D0 02 2D 2C D0 04 2D 2A D0 0C 2D 28 D0 11 2D 26 D0 12 2D 24 D0 17 2D 22 D0 00 2D 2B D0 05 2D 29 D0 06 2D 27 D0 0B 2D 25 D0 13 2D 23 D0 15 2D 21 D0 01 2D 2A D0 03 2D 28 D0 07 2D 26 D0 09 2D 24 D0 0D 2D 22 D0 0F 2D 20 D0 00 23 03 6A 4B 40 93 63 43 6A 4B 40 D3 63 83 6A 4B 40 13 64 1F E0 00 23 C3 6A 4B 40 93 63 03 6B 4B 40 D3 63 43 6B 4B 40 13 64 14 E0 00 23 83 6B 4B 40 93 63 C3 6B 4B 40 D3 63 03 6C 4B 40 13 64 09 E0 00 23 43 6C 4B 40 93 63 83 6C 4B 40 D3 63 C3 6C 4B 40 13 64 00 23 09 2D 2D D0 0B 2D 2B D0 0F 2D 29 D0 11 2D 27 D0 15 2D 25 D0 17 2D 23 D0 03 2D 2C D0 05 2D 2A D0 0D 2D 28 D0 10 2D 26 D0 13 2D 24 D0 16 2D 22 D0 01 2D 2B D0 04 2D 29 D0 07 2D 27 D0 0A 2D 25 D0 12 2D 23 D0 14 2D 21 D0 00 2D 2A D0 02 2D 28 D0 06 2D 26 D0 08 2D 24 D0 0C 2D 22 D0 0E 2D 20 D0 00 23 03 6A 4B 40 53 64 43 6A 4B 40 93 64 83 6A 4B 40 D3 64 1F E0 00 23 C3 6A 4B 40 53 64 03 6B 4B 40 93 64 43 6B 4B 40 D3 64 14 E0 00 23 83 6B 4B 40 53 64 C3 6B 4B 40 93 64 03 6C 4B 40 D3 64 09 E0 00 23 43 6C 4B 40 53 64 83 6C 4B 40 93 64 C3 6C 4B 40 D3 64 17 65 FF BD 84 42 02 02 B8 70 03 02 00 F5 03 02 00 00 00 18 00 00 80 01 00 00 18 00 00 80 01 00 00 18 00 00 80 01 00 00
El funcionamiento, al contrario que la rutina xD, es simple. Solo tienes que guardar el slot del poke en la variable 0x8000 y llamar a la rutina que desencripta los datos. Después, edita los datos que quieras y, por ultimo, llama a la rutina que los encripta de nuevo. Pero ten cuidado, si cambias el valor de la variable, se encriptarán los datos en otro slot, así que, cuando tengas que editar datos, hazlo y encripta de nuevo sin hacer otras cosas.

La rutina desencripta los datos, por tanto, no son editables los datos no encriptados, ya que estos se pueden hacer directamente sin necesidad de una rutina.

El pokémon se desencripta en la dirección 0x203F500 y se pueden editar los datos con simples WBTOs. Estos son los datos (en decimal):



NOTA: Pronto haré un tutorial en el que explicaré cómo funcionan todos los datos de los pokémon para que sepáis editarlos correctamente. Además, es probable que también haga rutinas suplementarias para que podáis editar fácilmente algunos aspectos más complicados, como la pokéball en la que fue capturado o para poder hacer shiny al pokémon.
Oh my...

Buen trabajo Javi! Gracias por traer semejante aporte :D~
 
Última edición por un moderador:

Lunos

Enfrentando a La Organización
Miembro insignia
Javi4315♪;378518 dijo:
GIVEPOKEMON CON NOMBRE PREDEFINIDO​
Escribí un script tal que asi y este fue el resultado:

Nota: La rutina compilada fue insertada en 0x71A250.
Nota2: Bahamut es el nickname que siempre le doy a mis Charmander, ignorenlo.

¿Cual fue mi error?


EDITO: Solucionado. Cambié levemente la estructura del script y funcionó de maravilla.
Puse la cadena del countpokemon apenas empezar el script y moví el loadpointer a la linea anterior al givepokemon.
Basicamente este es el script cambiado y aqui el resultado:


Muchisimas gracias Javi :)

EDITO2: Viendo esto de nuevo, se me vinieron un par de ideas a la cabeza.
¿Seria posible asignarle un OT (Original Trainer) y TID (Trainer ID) propios al Pokémon que estás recibiendo?
Eso haria que el script en si se sienta un poco mas real/correcto, quiero decir, la idea detras de darle un apodo a un Pokémon es formar un vinculo, y esa idea se pierde si el Pokémon que recibes tiene tu mismo OT y TID en lugar de los propios del entrenador que te dió al Pokémon.
 
Última edición:

deidara9216

Profesional de WaH
aloha bro, eh visto tus rutinas y me preguntaba, conoces alguna que haga que aumente el nivel estándar.

osea que mi pokémon no solo suba a level 100 si no a 150 por ejemplo o 200 o casas asi ?

graicas por tu tiempo y por tu aydua.
 

MichaKing

Grafista avanzado
aloha bro, eh visto tus rutinas y me preguntaba, conoces alguna que haga que aumente el nivel estándar.

osea que mi pokémon no solo suba a level 100 si no a 150 por ejemplo o 200 o casas asi ?

graicas por tu tiempo y por tu aydua.

Para eso puedes usar el tutorial que trajo Lunos desde Pokeco, puedes aumentar la cantidad de niveles desde 100 hasta 255, aunque supongo que toqueteando un poco y con algo de creatividad, puedes cambiar esa cantidad. Aquí te la dejo:
[FR] El futuro es hoy, otra vez | Expandir la cantidad de Niveles de 100 a 255

Ontopic: Pues ni que decir, todas esas rutinas son extremadamente útiles y estoy seguro de que usaré unas cuantas (Si no es que todas) para darle más jugabilidad y entretenimiento a ya sea cualquier proyecto que se me ocurra.

~MichaKing
 

pikachu240

Junior C# Developer
Tengo un pequeño problema, resulta que para dar un pokemon editado primero tengo que ver si tiene espacio en el equipo y dárselo si lo tiene...estaria bien poder preparar el pokemon y luego si va a la caja o al equipo sea otro tema.

Se podria hacer que el givepokemon después de crearlo mire una dirección para cargar los datos y luego lo de? Creo que es posible pero no se muy bien el trabajo que implica.

Pd:no pido que se haga solo que se piense en su validez aunque si se quiere hacer no dire que no xD
 

Ryurs

Usuario de oro
Respuesta: Rutinas by Javi4315 [Poder Oculto | Act - 20/04/2017]


PODER OCULTO
El ataque Poder Oculto depende en tipo y potencia de las estadísticas del pokémon. Si quieres averiguar el tipo y la potencia del ataque en un determinado pokémon del equipo, esta es tu rutina.

undefined
A riesgo de ser ignorado, me preguntaba si alguien puede ser tan amable de darme una pequeña explicación de como poder diseñar el script para utilizar la rutina ASM del poder oculto, puesto que me interesa bastante.

La verdad es que Javi en su primer post aparte de subir la rutina subió el script (a trozos?) y unas explicaciones de como usarlo o forma de proceder para montarlo. Pero por más que lo intento, no soy ni capaz de hacer que lo básico funcione. Para estos casos lo que suelo hacer en primer lugar es asegurarme de que el script funciona bien. Es decir, en este caso, con lograr que te tire el [buffer1] y el [buffer2] de forma correcta, ya me vale, luego es ir "complicando" el script (que te pregunte con un sí o no si quieres saber el poder oculto, poner los diferentes textos según si afirmas o si declinas, etc).

Gracias de antemano, un saludooo.
 

Eaas

Profesional de WaH
A riesgo de ser ignorado, me preguntaba si alguien puede ser tan amable de darme una pequeña explicación de como poder diseñar el script para utilizar la rutina ASM del poder oculto, puesto que me interesa bastante.

La verdad es que Javi en su primer post aparte de subir la rutina subió el script (a trozos?) y unas explicaciones de como usarlo o forma de proceder para montarlo. Pero por más que lo intento, no soy ni capaz de hacer que lo básico funcione. Para estos casos lo que suelo hacer en primer lugar es asegurarme de que el script funciona bien. Es decir, en este caso, con lograr que te tire el [buffer1] y el [buffer2] de forma correcta, ya me vale, luego es ir "complicando" el script (que te pregunte con un sí o no si quieres saber el poder oculto, poner los diferentes textos según si afirmas o si declinas, etc).

Gracias de antemano, un saludooo.
En el post principal te da la rutina y más abajo te explica q trabaja con la variable 0x8000

en fin debe s darle el valor de la pos de tu pok en el menu a la variable y abajo te deja ya el script entero.
 

Ryurs

Usuario de oro
En el post principal te da la rutina y más abajo te explica q trabaja con la variable 0x8000

en fin debe s darle el valor de la pos de tu pok en el menu a la variable y abajo te deja ya el script entero.
Hmmmm, eso ya lo he leído en su post, pero no entiendo como ponerlo.

Según dices tú, es muy fácil hacerlo, pero yo no entiendo los 3 trozos de script que te da Javi como "unirlos" para que funcione (si hubiera puesto un único script con todo como base creo que se hubiera entendido mejor).

EDITO: He entendido una parte de lo que me pasaba. Resulta que yo estaba mirando el primer post, y no sé porque, pero las "cajas de texto" con los scripts que ponía Javi estaban como incompletas (no se podían expandir). Revisando todos los comentarios, en el post nº15 de Javi, cuando publicó esta sección de rutina de poder oculto me he fijado que ahí esas "cajas de texto" sí que se podían expandir, viendo en su totalidad lo que yo no llegaba a comprender de los scripts (son en realidad como 2 separados que trabajan separados pero conjuntos digamos).

El problema es que una vez hecho esto, he comprobado que tanto el TIPO del poder oculto como su POTENCIA, te las devuelve mal, es decir, que no acierta en lo que debe.
 
Última edición:

Eaas

Profesional de WaH
Hmmmm, eso ya lo he leído en su post, pero no entiendo como ponerlo.

Según dices tú, es muy fácil hacerlo, pero yo no entiendo los 3 trozos de script que te da Javi como "unirlos" para que funcione (si hubiera puesto un único script con todo como base creo que se hubiera entendido mejor).

EDITO: He entendido una parte de lo que me pasaba. Resulta que yo estaba mirando el primer post, y no sé porque, pero las "cajas de texto" con los scripts que ponía Javi estaban como incompletas (no se podían expandir). Revisando todos los comentarios, en el post nº15 de Javi, cuando publicó esta sección de rutina de poder oculto me he fijado que ahí esas "cajas de texto" sí que se podían expandir, viendo en su totalidad lo que yo no llegaba a comprender de los scripts (son en realidad como 2 separados que trabajan separados pero conjuntos digamos).

El problema es que una vez hecho esto, he comprobado que tanto el TIPO del poder oculto como su POTENCIA, te las devuelve mal, es decir, que no acierta en lo que debe.
Haver bro ya c lo q te sucedió
No entiendes lo espuesto pq hay comandos como call y otros más q el explica para q se usan
El primer script es solo compilarlo en realidad el q usa es el segundo.

Te lo puedo explicar pero creo mejor q para q no te pasen más esas cosas te llegues al apartado de tutoriales y estudies un poquito para q mejores en estas cosas, si aun así no lo logras entonces yo mismo te lo inserto en tu Rom y te explico todo x pasos.
Mucha suerte
 

Bugrhak

A long time ago I used to call myself "Subzero".
A riesgo de ser ignorado, me preguntaba si alguien puede ser tan amable de darme una pequeña explicación de como poder diseñar el script para utilizar la rutina ASM del poder oculto, puesto que me interesa bastante.

La verdad es que Javi en su primer post aparte de subir la rutina subió el script (a trozos?) y unas explicaciones de como usarlo o forma de proceder para montarlo. Pero por más que lo intento, no soy ni capaz de hacer que lo básico funcione. Para estos casos lo que suelo hacer en primer lugar es asegurarme de que el script funciona bien. Es decir, en este caso, con lograr que te tire el [buffer1] y el [buffer2] de forma correcta, ya me vale, luego es ir "complicando" el script (que te pregunte con un sí o no si quieres saber el poder oculto, poner los diferentes textos según si afirmas o si declinas, etc).

Gracias de antemano, un saludooo.
Lo primero que tienes que hacer es crear un script en el que suceda todo lo posterior a elegir el POKéMON del cuál quieres saber el poder oculto.
Luego de eso, debes copiar la segunda y tercera parte del script, pegarlo todo junto y quitarle el (...).

La segunda y tercera parte del script que puso javi corresponden a lo que hace posible que de abra el menú de equipo POKéMON para que puedas elegir al POKé en cuestión.

Tu decidirás como complementas el script.

Luego ya puedes compilar el script.

Si tienes más dudas pregunta. También, si gustas, podría hacerte un script con las especificaciones que tu quieras.
Un saludo.

PD: Estoy bastante oxidado en esto, si he causado algún tipo de confusión os pido disculpas.
 
Última edición:

Ryurs

Usuario de oro
Hola a ambos! Gracias por intentar ayudarme, pero si os fijáis en el EDIT que puse en mi otro post (lo coloqué antes de vuestras respuestas :rolleyes:), veréis que el problema ya no lo tenía en el diseño del script (tenía un problema en el que en el primer post no podía visualizar bien ninguna caja de texto con los trozos de script).

El problema surge ahora porque el TIPO y la POTENCIA que te da el script ya probándolo en el juego no es el correcto.

Unas muestras (en rom limpia y save nuevo):

1. Selección del Pokémon (el inicial que te da OAK):
1.png

2. TIPO y POTENCIA que te tira el script:
2.png

3. Comprobación en PKHeX (herramienta que te permite cambiar/comprobar cosas en los saves):
3.png

Aquí ya vemos que no es lo mismo que nos tiro el script in-game.

4. Comprobación en una calculadora online de Poder Oculto (le metí los IVs del Bulbasaur para que me lo saque):
4.png

Aquí vemos que coincide con el del PKHeX, que es el Poder Oculto que realmente es.

Así que ese es el problema. O la rutina está mal hecha, o yo he metido la pata en algún sitio, que puede ser perfectamente.
Este es el script que configure y usé:
Código:
#dynamic 0x800000

#org @inicio // Inicia el script
lock // Congela al jugador
faceplayer

fadescreen 0x1
special 0x9F 'abre el menú para elegir al poke que quieras
waitstate
compare 0x8004 0x6
if 0x4 goto @end 'esto es lo que pasa cuando sales sin elegir a un poke
copyvar 0x8000 0x8004 'pasa el slot del poke a la variable 0x8000, que es la que usa la rutina
callasm 0xB00001
pause 0x5 'esto es opcional, es para que no quede tan "drástico"
buffernumber 0x1 0x8005 'guarda la potencia del ataque en [buffer2]
call 0x800000 'debe ser siempre call para que funcione el return, nunca goto
msgbox @texto1 0x6 'este sería el msgbox que muestra los datos

#org @end
msgbox @texto2 0x6
release
end

#org @texto1
= TIPO: [buffer1]\nPOTENCIA: [buffer2]

#org @texto2
= Vaya...\pPuedes volver siempre que quieras.
Yo la rutina la compilé tal cual en el offset B00000 (por eso el callasm 0xB00001) y el primer script que te da Javi tal cual en el offset 800000 (por eso el call 0x800000).

Entonces, sino es mucha molestia, podéis hacer una comprobación de esto en una rom limpia. Vosotros que veo que entendéis del tema, al final se hace rápido, es compilar la rutina y el primer script que subió (esas 2 cosas tal cual) y luego compilar el segundo script, utilizando ese que os he dejado yo o creando uno propio, y ver si realmente os da el TIPO y la POTENCIA que debería ser.

Un saludooo y perdón por las molestias.
 
Arriba