Aumentar las variables en cleo

not

Nuevo miembro
Mensajes
13
Puntuación de reacción
8
Aumentar variables
Con este snippet podrás usar mas variables de las permitidas por Sanny Builder que son 32 variables (0@ a 31@).
Hay 2 maneras fáciles para implementar en nuestros mods.


Manera 1
Se usara el "Alloc" 0AC8: 0@ = allocate_memory_size 512 para guardar y sacar la información escrita en las variables, recordar que es IMPORTANTE siempre agregar mas tamaño del que va a usar.
Por ejemplo: Alloc 0@ 512 Con su opcode 0AC8: 0@ = allocate_memory_size 512

Estaría usando 128 variables y dejando 1 sobrante.
Si no hace esto le daría un error y posiblemente un crasheo.

Como usarlo?
En este ejemplo usamos 20 variables para escribir un valor random en ellas y para obtener su valor se usa un FOR iterando entre 20 que es el numero de las variables y a la ves dándoles una ID para que en el bucle principal podamos leerlas.
Código:
{$CLEO}

Thread "Variables"

// <-- Le damos memoria que es equivalente a 20 variables. (21 variables en total pero dejamos 1 libre)
Alloc 0@ 80

// <-- Este bucle es para iterar sobre las 20 variables agregandole su ID mas un valor random
For 1@ = 0 To 20
    0209: 2@ = random_int_in_ranges 0 15641
    Call @AllocWrite 3 Buffer 0@ ID 1@ Value 2@
    If
        1@ >= 20
    Then
        Break
    End
End

// <-- Bucle Principal
While True
    For 1@ = 0 To 20 // Se iteran las 20 variables para obtener su valor
    Wait 1000 ms
        Call @AllocRead 2 Buffer 0@ ID 1@ RetValue 2@
        Printf "Var ID: %d - Value: %d" 5000 1@ 2@ // <-- Se imprime su valor en pantalla
        If
            1@ >= 20
        Then
            Break
        End
    End
End

Funciones con una breve explicación de su uso y parámetros.
Código:
/*|||||||||||||||||||| Manera 1 ||||||||||||||||||||*/
/*
    Parametros:
        Buffer: es la referencia del buffer a donde se guardaran las variables
        ID: es la identificacion de la variable
        Value: es lo que se va a guardar en esa variable
   
    Uso:
        Call @AllocWrite 3 Buffer 0@ ID 1@ Value 2@
*/
:AllocWrite
1@ *= 4 // Se multiplica el ID
005A: 1@ += 0@ // (int) Sumamos el ID con el puesto de la variable del buffer
0A8C: write_memory 1@ size 4 value 2@ virtual_protect 1 // Escribimos
Ret 0

/*
    Parametros:
        Buffer: es la referencia del buffer a donde se optendra las variables
        ID: es la identificacion de la variable
        RetValue: es lo que se guardo en esa variable
   
    Uso:
        Call @AllocRead 2 Buffer 0@ ID 1@ RetValue 2@
*/
:AllocRead
1@ *= 4 // Se multiplica la ID
005A: 1@ += 0@ // (int) Sumamos el ID con el puesto de la variable del buffer
0A8D: 2@ = read_memory 1@ size 4 virtual_protect 1 // Leemos
Ret 1 2@


Manera 2
En este caso se tendrá que poner las variables manualmente en hex y ponerlo al final del script (En este caso se puede donde quiera pero para fines prácticos es mejor al final del script) y se usara el opcode 0AC6: 0@ = label @Variables offset para poder acceder a las variables.

De la siguiente manera se debe poner para acceder a las variables.
Por ejemplo:
:Variables Hex 00 00 00 00 // Variable 0 00 00 00 00 // Variable 1 00 00 00 00 // Variable 2 00 00 00 00 // Variable 3 End

De esta manera podrá guardar la información de las variables sin necesidad de agregar una de mas como la manera 1, pero es menos practico añadir las variables manualmente.

Como usarlo?
En este caso a diferencia del metodo 1 no le asignaremos memoria ya que lo leerá desde el hex que hemos añadido, también usamos 20 variables para escribir un valor random en ellas y para obtener su valor se usa un FOR iterando entre 20 que es el numero de las variables y a la ves dándoles una ID para que en el bucle principal podamos leerlas.
Código:
{$CLEO}

Thread "Variables"

// <-- Iteramos sobre las 20 variables y a la ves le damos una ID
For 0@ = 0 To 20
    0209: 1@ = random_int_in_ranges 0 15641
    Call @HexWrite 2 ID 0@ Value 1@
    If
        0@ >= 20
    Then
        Break
    End
End

// <-- Bucle Principal
While True
    For 0@ = 0 To 20 // <-- Se itera sobre las 20 variables para obtener su valor
        Wait 1000 ms
        Call @HexRead 1 ID 0@ RetValue 1@
        Printf "ID: %d - Value: %d" 5000 0@ 1@ // <-- Imprimimos el valor
        If
            0@ >= 20
        Then
            Break
        End
    End
End

Funciones con una breve explicación de su uso y parámetros.
Código:
/*|||||||||||||||||||| Manera 2 ||||||||||||||||||||*/
/*
    Parametros:
        ID: es la identificacion de la variable
        Value: es lo que se va a guardar en esa variable
   
    Uso:
        Call @AllocRead 2 Buffer 0@ ID 1@ RetValue 2@
*/
:HexWrite
0AC6: 31@ = label @HexVars offset // Donde escribir las variables en HEX
0@ *= 4 // Se multiplica el ID
005A: 0@ += 31@ // (int) Sumamos el ID con el puesto de la variable en HEX
0A8C: write_memory 0@ size 4 value 1@ virtual_protect 1 // Escribimos
Ret 0

/*
    Parametros:
        ID: es la identificacion de la variable
        RetValue: es lo que se guardo en esa variable
   
    Uso:
        Call @HexRead 1 ID 1@ RetValue 2@
*/
:HexRead
0AC6: 31@ = label @HexVars offset // Donde leer las variables en HEX
0@ *= 4 // Se multiplica la ID
005A: 0@ += 31@ // (int) Sumamos el ID con el puesto de la variable en HEX
0A8D: 30@ = read_memory 0@ size 4 virtual_protect 1 // Leemos
Ret 1 30@

:HexVars
Hex
    00 00 00 00 // Variable 0
    00 00 00 00 // Variable 1
    00 00 00 00 // Variable 2
    00 00 00 00 // Variable 3
    00 00 00 00 // Variable 4
    00 00 00 00 // Variable 5
    00 00 00 00 // Variable 6
    00 00 00 00 // Variable 7
    00 00 00 00 // Variable 8
    00 00 00 00 // Variable 9
    00 00 00 00 // Variable 10
    00 00 00 00 // Variable 11
    00 00 00 00 // Variable 12
    00 00 00 00 // Variable 13
    00 00 00 00 // Variable 14
    00 00 00 00 // Variable 15
    00 00 00 00 // Variable 17
    00 00 00 00 // Variable 18
    00 00 00 00 // Variable 19
    00 00 00 00 // Variable 20
End



Si hay algún error no dude en comentarlo aquí.
bynot
 
Arriba