Registrarse

[Duda][FR Joer]Problema con rutina de cambio de estado

Estado
Cerrado para nuevas respuestas.

MegaSceptile9

Usuario mítico
¡Me lleva la *****!
¡¿Por qué cada vez que estamos a mil por horas hackeando aparece un puto bug que no te deja avanzar?!....¡JOER!

Pues esta vez es con una rutina de cambio de estado de los pokémon.
Fue creada por @Andrea y la inserté en mi hack hace unos 8 meses. Al principio me dio problemas, pero Andrea me pudo darme la solución y me quedó bien la rutina, funcionaba bien y todo. Entonces la dejé guardada en un script para cuando la llegara a necesitar, y ese día llegó (o sea ayer XD). Cuando me decidí a probarla una vez en un script de gatillo y da la puta casualidad que se presentó el mismo error de aquella primera vez, mis pokes de convertían en Huevos malos :(

Pensé que había tocado algo en la rutina mientras hackeaba por esos 8 meses, pero me fui a la dirección donde estaba y se veía perfecta, justo como andrea me la pasó:

03 B5 04 48 00 88 05 49 41 43 05 48 40 18 02 49 01 70 03 BD D0 70 03 02 D2 70 03 02 00 01 00 00 D4 42 02 02

Hice todos los pasos bien como lo muestra este ejemplo:
#dynamic 0x900000
#org @inizio
setvar 0x8000 0x0 //first_pokemon
setvar 0x8001 0x80 //state_pokemon (80 poison)
callasm 0xA00001 //routine
end
Y nada.

Necesito saber que es, ya lo he intentado todo :(
¡¡¡¡HELP!!!!

PD:

[scroll=left]¡Jutsu de invocación![/scroll]

@Javi4315♪ @eing @Andrea @cosarara97 @Cheve ♫
@El puto amo (?)

XD
 
Última edición:

cosarara97

Dejad de cambiar de nick
Miembro de honor
Respuesta: [Duda]El típico bug que te toca los ******

Mal título, no dices el ROM base... puff, yo de mod te banneaba! (nah, pero el warn sí te lo llevabas xD)

Oh my...
Código:
$ arm-none-eabi-objdump -D -m arm -M force-thumb -b binary out.bin

out.bin:     file format binary


Disassembly of section .data:

00000000 <.data>:
   0:	c203      	stmia	r2!, {r0, r1}
   2:	04b5      	lsls	r5, r6, #18
   4:	0048      	lsls	r0, r1, #1
   6:	88c2      	ldrh	r2, [r0, #6]
   8:	4905      	ldr	r1, [pc, #20]	; (0x20)
   a:	4341      	muls	r1, r0
   c:	4805      	ldr	r0, [pc, #20]	; (0x24)
   e:	1840      	adds	r0, r0, r1
  10:	4902      	ldr	r1, [pc, #8]	; (0x1c)
  12:	7001      	strb	r1, [r0, #0]
  14:	c203      	stmia	r2!, {r0, r1}
  16:	c3bd      	stmia	r3!, {r0, r2, r3, r4, r5, r7}
  18:	7090      	strb	r0, [r2, #2]
  1a:	0203      	lsls	r3, r0, #8
  1c:	92c3      	str	r2, [sp, #780]	; 0x30c
  1e:	0370      	lsls	r0, r6, #13
  20:	0002      	movs	r2, r0
  22:	0001      	movs	r1, r0
  24:	c300      	stmia	r3!, {}
  26:	4294      	cmp	r4, r2
  28:	0202      	lsls	r2, r0, #8
De 20 en adelante son números que se leen, así que nada. Como sea, sin más contexto que esta "rutina" (no es ni una función por si sola, si algo sería una parte de algo mayor) no se qué decirte. ¿Estas seguro de que Andrea te pasó esto?

Cuando el juego crashea (o se reinicia, même chose) es ez pz (http://whackahack.com/foro/t-16901/gba-otros-arreglando-rom-cosarara97), pero un huevo malo ya es otra historia.
 

MegaSceptile9

Usuario mítico
Respuesta: [Duda]El típico bug que te toca los ******

Mal título, no dices el ROM base... puff, yo de mod te banneaba! (nah, pero el warn sí te lo llevabas xD)

Oh my...
Código:
$ arm-none-eabi-objdump -D -m arm -M force-thumb -b binary out.bin

out.bin:     file format binary


Disassembly of section .data:

00000000 <.data>:
   0:	c203      	stmia	r2!, {r0, r1}
   2:	04b5      	lsls	r5, r6, #18
   4:	0048      	lsls	r0, r1, #1
   6:	88c2      	ldrh	r2, [r0, #6]
   8:	4905      	ldr	r1, [pc, #20]	; (0x20)
   a:	4341      	muls	r1, r0
   c:	4805      	ldr	r0, [pc, #20]	; (0x24)
   e:	1840      	adds	r0, r0, r1
  10:	4902      	ldr	r1, [pc, #8]	; (0x1c)
  12:	7001      	strb	r1, [r0, #0]
  14:	c203      	stmia	r2!, {r0, r1}
  16:	c3bd      	stmia	r3!, {r0, r2, r3, r4, r5, r7}
  18:	7090      	strb	r0, [r2, #2]
  1a:	0203      	lsls	r3, r0, #8
  1c:	92c3      	str	r2, [sp, #780]	; 0x30c
  1e:	0370      	lsls	r0, r6, #13
  20:	0002      	movs	r2, r0
  22:	0001      	movs	r1, r0
  24:	c300      	stmia	r3!, {}
  26:	4294      	cmp	r4, r2
  28:	0202      	lsls	r2, r0, #8
De 20 en adelante son números que se leen, así que nada. Como sea, sin más contexto que esta "rutina" (no es ni una función por si sola, si algo sería una parte de algo mayor) no se qué decirte. ¿Estas seguro de que Andrea te pasó esto?

Cuando el juego crashea (o se reinicia, même chose) es ez pz (http://whackahack.com/foro/t-16901/gba-otros-arreglando-rom-cosarara97), pero un huevo malo ya es otra historia.
Qué gano yo con decir mentiras? -.-

Foro Whack a Hack! - Conversación Entre Andrea y Miguel D. Scep9

Y no entendí nada de lo que dijiste allá arriba XD
 

cosarara97

Dejad de cambiar de nick
Miembro de honor
lol, yo no decía que hubieras mentido, solo que quizá te habías equivocado en algo.
De todos modos, mea culpa. Al convertir ese hex a un binario lo he hecho mal. Ahora sí:
Código:
   0:	b503      	push	{r0, r1, lr}
   2:	4804      	ldr	r0, [pc, #16]	; (0x14)
   4:	8800      	ldrh	r0, [r0, #0]
   6:	4905      	ldr	r1, [pc, #20]	; (0x1c)
   8:	4341      	muls	r1, r0
   a:	4805      	ldr	r0, [pc, #20]	; (0x20)
   c:	1840      	adds	r0, r0, r1
   e:	4902      	ldr	r1, [pc, #8]	; (0x18)
  10:	7001      	strb	r1, [r0, #0]
  12:	bd03      	pop	{r0, r1, pc}
  14:	70d0      	strb	r0, [r2, #3]
  16:	0203      	lsls	r3, r0, #8
  18:	70d2      	strb	r2, [r2, #3]
  1a:	0203      	lsls	r3, r0, #8
  1c:	0100      	lsls	r0, r0, #4
  1e:	0000      	movs	r0, r0
  20:	42d4      	cmn	r4, r2
  22:	0202      	lsls	r2, r0, #8
(déjame editar)

EDIT:
Código:
   0:	b503      	push	{r0, r1, lr}
   2:	4804      	ldr	r0, [pc, #16]	; (0x14)
   4:	8800      	ldrh	r0, [r0, #0]
   6:	4905      	ldr	r1, [pc, #20]	; (0x1c)
   8:	4341      	muls	r1, r0
   a:	4805      	ldr	r0, [pc, #20]	; (0x20)
   c:	1840      	adds	r0, r0, r1
   e:	4902      	ldr	r1, [pc, #8]	; (0x18)
  10:	7001      	strb	r1, [r0, #0]
  12:	bd03      	pop	{r0, r1, pc}
  14:	020370d0	
  18:	020370d2
  1c:	00000100 	
  20:	020242d4
Eso tiene más buena cara.
r0 = *0x020370d0 (half word)
r1 = 0x100
r1 *= r0
r0 = 0x20242d4
r0 += r1
r1 = 0x20370d2
*r0 = (byte)r1
O sea:
*(0x20242d4+0x100*((hword)(*020370d0))) = (byte)0x20370d2
O sea:
Escribir el byte menor de 0x20370d2 a la dirección resultante de sumar 0x20242d4 más 256 (0x100) multiplicado por la half word que haya en 0x020370d0.
Entonces, de este razonamiento sale la pregunta obvia: por qué narices hacemos un strb de 0x20370d2? Sería lo mismo hacer un strb de 0xd2.

Pero no tengo ni idea de como va eso de los estados de los pokémon, así que por ahora lo dejo aquí. Espero que:
a) Alguien me diga que he hecho algo mal
b) Salga Andrea a explicar
xD
 
Última edición:

BLAx501!

A veces comento en temas :3
Miembro de honor
Usuario de Platino
Hasta donde yo se, los Huevos Malos (BadEggs) se generan para evitar la corrupción de datos del juego, corrompiendo los datos de un Pokémon cuyos datos (256 bytes que se alojan en la RAM todo el tiempo) no son una de las posibles combinaciones que pueden existir (se hace una comprobación mediante operaciones con esa cadena de bytes para asegurarlo, la tengo por ahí, pero no la encuentro ahora mismo).

Lo que está pasando aquí seguramente sea eso. De todos modos Andrea hackea para base AXVE no BPRE, así que probablemente la rutina sea para AXVE y el que la está liando sea Sceptile xD.

Si no, lo único que se me ocurre que pueda estar pasando es que al escribir los valores en los datos del Pokémon, genere un valor erróneo y por eso se convierte en BadEgg.
 

Javi4315

Babyface
Miembro de honor
Ahora mismo no puedo mirar si la rutina está bien o no. Seguramente sea que no está bien. Pero quería aclarar un par de cosas que dice Blax.

Los datos de cada pokémon no ocupan 256 bytes, sino 100. No es algo muy importante, pero bueno, por aclararlo.

Y lo que sí es importante, el estado del pokémon no forma parte de los datos encriptados ni tiene nada que ver con el checksum ni con las operaciones de desencriptación. Se puede editar sin problemas y no genera un bad egg.

Por lo tanto, debe ser algún error en la rutina.
 

MegaSceptile9

Usuario mítico
Javi4315♪;283197 dijo:
Ahora mismo no puedo mirar si la rutina está bien o no. Seguramente sea que no está bien. Pero quería aclarar un par de cosas que dice Blax.

Los datos de cada pokémon no ocupan 256 bytes, sino 100. No es algo muy importante, pero bueno, por aclararlo.

Y lo que sí es importante, el estado del pokémon no forma parte de los datos encriptados ni tiene nada que ver con el checksum ni con las operaciones de desencriptación. Se puede editar sin problemas y no genera un bad egg.

Por lo tanto, debe ser algún error en la rutina.
.thumb
.align 2

push {r0-r3,lr}
ldr r2, .8002 /*variabile 8002*/
ldrh r2,[r2]
cmp r2, #0x0 /*control var 8002 if it's 0*/
beq parte2
b loop

parte2:
ldr r0, .8000 /*variabile 8000*/
ldrh r0,[r0]
ldr r1,.100 /*interval byte between pokemon team*/
mul r1,r0
ldr r0, .pokemon_data /*offset state*/
add r0, r0, r1
ldr r1, .8001 /*save state*/
strb r1,[r0]
b fine

loop:
ldr r2, .8002 /*variabile 8002*/
ldrh r2,[r2]
ldr r3,.100 /*interval byte between pokemon team*/
mul r3,r2
ldr r0, .pokemon_data /*offset state*/
add r0, r0, r3
ldr r1, .8001 /*save state*/
strb r1,[r0]
sub r2, r2, #0x80 /*tolgo 80*/
sub r2, r2, #0x80 /*tolgo 80*/
cmp r2, #0x0 /*controllo che la var 8002 non sia 0*/
beq fine
b loop

fine:
pop {r0-r3,pc}

.align 2
.pokemon_data:
.word 0x030043B0
.8000:
.word 0x0202e8c4
.8001:
.word 0x0202e8c6
.8002:
.word 0x0202e8c8
.100:
.word 0x00000100
Esa es la rutina ._.

Pero, por qué antes si funcionaba y ahora no? T_T
El último poke del equipo se vuelve un Huevo malo :(
 

eing

Miembro de honor
Miembro de honor
Si no te funciona, no es por la rutina.
Es por los punteros, el pokemon data que has compilado es el de rubí xd
Pon el de fr, que es el 020242a0+40.

(No tengo el ram offset de fr porque no lo hackeo, pero ronda x ahí..)
 

Cheve

MoonLover~
Miembro de honor
Pueeeeeeeeeeeeeeeee no la he probado, pero así deberia andar:


Código:
.thumb
.align 2

push {r0-r3,lr}
ldr r2, .8002 /*variabile 8002*/
ldrh r2,[r2]
cmp r2, #0x0 /*control var 8002 if it's 0*/
beq parte2
b loop

parte2:
ldr r0, .8000 /*variabile 8000*/
ldrh r0,[r0]
ldr r1,.100 /*interval byte between pokemon team*/
mul r1,r0
ldr r0, .pokemon_data /*offset state*/
add r0, r0, r1
ldr r1, .8001 /*save state*/
strb r1,[r0]
b fine

loop:
ldr r2, .8002 /*variabile 8002*/
ldrh r2,[r2]
ldr r3,.100 /*interval byte between pokemon team*/
mul r3,r2
ldr r0, .pokemon_data /*offset state*/
add r0, r0, r3
ldr r1, .8001 /*save state*/
strb r1,[r0]
sub r2, r2, #0x80 /*tolgo 80*/
sub r2, r2, #0x80 /*tolgo 80*/
cmp r2, #0x0 /*controllo che la var 8002 non sia 0*/
beq fine
b loop

fine:
pop {r0-r3,pc}

.align 2
.pokemon_data:
.word 0x20242D4
.8000:
.word 0x020270B8 + (0x8000 * 2)
.8001:
.word 0x020270BA + (0x8001 * 2)
.8002:
.word 0x020270BC + (0x8002 * 2)
.100:
.word 0x00000100

(A lo mejor fallo con la dirección de las variables) xD
 

MegaSceptile9

Usuario mítico
Cheve ♫;283321 dijo:
Pueeeeeeeeeeeeeeeee no la he probado, pero así deberia andar:


Código:
.thumb
.align 2

push {r0-r3,lr}
ldr r2, .8002 /*variabile 8002*/
ldrh r2,[r2]
cmp r2, #0x0 /*control var 8002 if it's 0*/
beq parte2
b loop

parte2:
ldr r0, .8000 /*variabile 8000*/
ldrh r0,[r0]
ldr r1,.100 /*interval byte between pokemon team*/
mul r1,r0
ldr r0, .pokemon_data /*offset state*/
add r0, r0, r1
ldr r1, .8001 /*save state*/
strb r1,[r0]
b fine

loop:
ldr r2, .8002 /*variabile 8002*/
ldrh r2,[r2]
ldr r3,.100 /*interval byte between pokemon team*/
mul r3,r2
ldr r0, .pokemon_data /*offset state*/
add r0, r0, r3
ldr r1, .8001 /*save state*/
strb r1,[r0]
sub r2, r2, #0x80 /*tolgo 80*/
sub r2, r2, #0x80 /*tolgo 80*/
cmp r2, #0x0 /*controllo che la var 8002 non sia 0*/
beq fine
b loop

fine:
pop {r0-r3,pc}

.align 2
.pokemon_data:
.word 0x20242D4
.8000:
.word 0x020270B8 + (0x8000 * 2)
.8001:
.word 0x020270BA + (0x8001 * 2)
.8002:
.word 0x020270BC + (0x8002 * 2)
.100:
.word 0x00000100

(A lo mejor fallo con la dirección de las variables) xD
Un millón de gracias por la rutina Cheve_x :D
Pero ya solucioné el problema gracias a @Toise D. BLAx :heart:

Me recomendó usar la herramienta de JPAN. Salió todo perfecto.

Pero de todos modos gracias a todos por responder :)

Pueden cerrar el tema

PD: guardaré esa rutina por si las moscas ;)
 
Estado
Cerrado para nuevas respuestas.
Arriba