Registrarse

duda sobre bucle de variable

Estado
Cerrado para nuevas respuestas.

kakarotto

Leyenda de WaH
Buenas gente, estoy intentando hacer un script que mediante una rutina desencripta los datos de un poke dado y a traves de una variable se lo asigna a este, pero una vez asignado pase al siguiente valor y se lo asigne y asi hasta el final...

Se que es una especie de bucle pero lo he hecho y no se me ocurre de otra forma y por consiguiente, no es el resultado esperado:
Código:
#dynamic 0x800000

'---------------
#org @start
compare 0x40FF 0x0
if 0x1 goto @snippet1
compare 0x40FF 0x1
if 0x1 goto @snippet2
compare 0x40FF 0x2
if 0x1 goto @snippet3
compare 0x40FF 0x3
if 0x1 goto @snippet4
compare 0x40FF 0x4
if 0x1 goto @snippet5
compare 0x40FF 0x5
if 0x1 goto @snippet6
end

'---------------
#org @snippet1
givepokemon 0x5 0x5 0x0 0x0 0x0 0x0
setflag 0x860
addvar 0x40FF 0x1
setvar 0x8004 0x0
setvar 0x8000 0x27
setvar 0x8001 0x0
setvar 0x8002 0x1F
callasm 0x8E682B1
return

'---------------
#org @snippet2
setvar 0x8000 0x28
setvar 0x8002 0x1F
callasm 0x8E682B1
addvar 0x40FF 0x1
return

'---------------
#org @snippet3
setvar 0x8000 0x29
setvar 0x8002 0x1F
callasm 0x8E682B1
addvar 0x40FF 0x1
return

'---------------
#org @snippet4
setvar 0x8000 0x2A
setvar 0x8002 0x1F
callasm 0x8E682B1
addvar 0x40FF 0x1
return

'---------------
#org @snippet5
setvar 0x8000 0x2B
setvar 0x8002 0x1F
callasm 0x8E682B1
addvar 0x40FF 0x1
return

'---------------
#org @snippet6
setvar 0x8000 0x2C
setvar 0x8002 0x1F
callasm 0x8E682B1
addvar 0x40FF 0x1
end
Como observareis una vez asignado el valor 0x27 a la variable 0x8000 y asignado al poke, quiero que continue por 0x28 y se lo asigne de nuevo al poke y así...

¿Podriais echarme una mano? GRACIAS
 
Última edición:

.Areku_Sama

Old school ROM-Hacker EST. 2006
¿Qué resultado es exactamente el no deseado o el que te esta dando en este momento? Para poder ayudarte mejor :)
 

Dani_SR_17

¡Pokémon LionHeart!
A ver, si te he entendido bien lo que quieres es esto:

Código:
#dynamic 0x800000

'---------------
#org @start
givepokemon 0x5 0x5 0x0 0x0 0x0 0x0
setflag 0x860
setvar 0x8001 0x0
setvar 0x8004 0x0
setvar 0x8000 0x27
goto @Bucle1

#org @Bucle1
setvar 0x8002 0x1F '¿Necesitas colocar la variable en esta valor siempre? Si no es así ponlo arriba mejor.
compare 0x40FF 0x7
if 0x0 goto @Bucle2
end

'---------------
#org @Bucle2
addvar 0x40FF 0x1
callasm 0x8E682B1
addvar 0x8000 0x1
goto @Bucle1

PD: Si pones return, tienes que llamar a esa parte del script con un call, no con un goto.
 

BLAx501!

A veces comento en temas :3
Miembro de honor
Usuario de Platino
@kakarotto, si no he entendido mal, lo que tu quieres es acortar el script y hacerlo de forma más sencilla.

Mi propuesta es esta. No la he probado ni la he compilado porque estoy desde el móvil, pero en caso de tener errores, no creo que sean difíciles de detectar.

Si no es esto lo que quieres, he explicado todo lo que he ido haciendo, de modo que no te resultará demasiado difícil ajustarlo a lo que quieras ;)

Código:
#dynamic 0x800000
'Para hacer todo más sencillo, aprovecharemos el comando goto.
'Haremos uso de una variable que nos permitirá ir avanzando en la ejecución de forma simple
'Dado que usabas aquí la 0x40FF, mantendré dicha variable para el script.
'Doy por hecho que el valor que quieres poner en la variable 0x8000 SIEMPRE comienza en 0x27
'En caso de que no sea así, habría que hacer alguna modificación.
'---------------
#org @start
givepokemon 0x5 0x5 0x0 0x0 0x0 0x0
setflag 0x860
setvar 0x8004 0x0
setvar 0x8000 0x27
setvar 0x8001 0x0
setvar 0x8002 0x1F
callasm 0x8E682B1
setvar 0x40FF 0x27 'Le asignamos el mismo valor que a la variable 0x8000
goto @loopStart
'Esto será la primera iteración. Debe de hacerse manualmente. Con el goto vamos al bucle en sí

#org @loopStart 
compare 0x40FF 0x2C
if 0x0 goto @mainLoop
end
'El bucle comprueba si has llegado ya a hacer que la variable valga 0x2C. Esto es variable y se
'adapta al valor máximo que le quieras poner. Mientras no llegues a dicho valor, el bucle se repetirá
'mediante el goto. En caso de que se alcance dicho valor, finaliza el script.

#org @mainLoop
addvar 0x40FF 0x1
copyvar 0x8000 0x40FF 'Copia el contenido de 0x40FF en 0x8000
setvar 0x8002 0x1F
callasm 0x8E682B1
goto @loopStart
'Este es el trozo de código que se ejecuta dentro del bucle. Como teníamos ya la variable asignada a 
'0x27 y esa asignación se ha hecho ya, aumentamos el valor, copiamos la variable en la variable dinámica
'damos el valor a la otra, ejecutamos el callasm y volvemos al inicio del bucle, para comprobar si la 
'condición de parada del mismo se cumple o no.
Te dejo también el script sin comentarios ;)

Código:
#dynamic 0x800000

#org @start
givepokemon 0x5 0x5 0x0 0x0 0x0 0x0
setflag 0x860
setvar 0x8004 0x0
setvar 0x8000 0x27
setvar 0x8001 0x0
setvar 0x8002 0x1F
callasm 0x8E682B1
setvar 0x40FF 0x27
goto @loopStart

#org @loopStart 
compare 0x40FF 0x2C
if 0x0 goto @mainLoop
end

#org @mainLoop
addvar 0x40FF 0x1
copyvar 0x8000 0x40FF
setvar 0x8002 0x1F
callasm 0x8E682B1
goto @loopStart
P.D. Te recomiendo que tengas esto a mano porque te resultará útil de cara a futuros scripts.

Lower Than (0x0)
Equals (0x1)
Greater Than (0x2)
Lower than or Equal to (0x3)
Greater than or Equal to (0x4)
Not exactly equal to (0x5)

P.D.2. He visto que mientras preparaba todo, @Dani_SR_17 se me ha adelantado... Prefiero mi versión porque reasigna todas las veces las variables dinámicas y así te aseguras de que no se alteran los valores de las mismas entre medias (que no debería, ojo). Es un pelín más larga, pero igualmente compacta :awesome:
 

Fran Agustín

Si el sol besa tus ojos, ni cuenta te das.
Miembro insignia
¿Y si mejor nos dejamos de joder con el XSE y usamos un editor de scripts que no solamente es mejor sino que además está desarrollado por un miembro de esta misma comunidad? Vamos, ¡Red Alien de @cosarara97 por favor!
Suponiendo que el valor de las variables $8000 y $8002 no son modificadas en la ejecución
Código:
[PLAIN]
#include "stdlib/std.rbh"
#dyn 0x800000

#org @inicio
 givepokemon 5 5 0 0 0 0
 setflag 0x860
 setvar 0x8000 0x27
 setvar 0x8001 0
 setvar 0x8002 0x1F
 setvar 0x8004 0

:loop
 while (0x8000<=0x2C)
 {
  callasm 0x8E682B1
  addvar 0x8000 1
 }
end
[/PLAIN]
En el caso de que sí sean modificadas, o bien si no estás seguro
Código:
[PLAIN]
#include "stdlib/std.rbh"
#dyn 0x800000

#org @inicio
 givepokemon 5 5 0 0 0 0
 setflag 0x860
 setvar 0x40FF 0x27
 setvar 0x8001 0
 setvar 0x8004 0

:loop
 while (0x40FF<=2C)
 {
  copyvar 0x8000 0x40FF
  setvar 0x8002 0x1F
  callasm 0x8E682B1
  addvar 0x40FF 1
 }
end
[/PLAIN]

Ídem caso 1 del spoiler anterior
Código:
[PLAIN]
#include "stdlib/std.rbh"
#dyn 0x800000

#org @inicio
 givepokemon 5 5 0 0 0 0
 setflag 0x860
 setvar 0x40FF 0x27
 setvar 0x8001 0
 setvar 0x8002 0x1F
 setvar 0x8004 0

:loop
 callasm 0x8E682B1
 addvar 0x8000 1
 compare 0x8000 0x2C
 if 0x3 goto :loop

:end
 end
[/PLAIN]
Ídem caso 2 del spoiler anterior
Código:
[PLAIN]
#include "stdlib/std.rbh"
#dyn 0x800000

#org @inicio
 givepokemon 5 5 0 0 0 0
 setflag 0x860
 setvar 0x40FF 0x27
 setvar 0x8001 0
 setvar 0x8004 0

:loop
 copyvar 0x8000 0x40FF
 setvar 0x8002 0x1F
 callasm 0x8E682B1
 addvar 0x40FF 1
 compare 0x40FF 0x2C
 if 0x3 goto :loop

:end
 end
[/PLAIN]

@Aarón maldito imbécil de mente en 2 dimensiones. Igual te quiero <3
 
Estado
Cerrado para nuevas respuestas.
Arriba