Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: kostra en Octubre 31, 2019, 10:20:09 pm

Título: [Solucionado] Saber el tipo de dato (u8, s8, u16, f16...)
Publicado por: kostra en Octubre 31, 2019, 10:20:09 pm
Buenas, ando haciendo unos scripts para facilitar la vida un poco más al que pretende hacer un juego online, el caso es que para enviar un paquete de buffer al servidor, hay que indicar qué tipo de dato se envía, con "buffer_u8", "buffer_f16", etc..

Lo que quiero saber es si hay alguna manera de saber qué tipo de estos es una variable, para hacer un script... he visto que hay funciones por ejemplo "is_int32", "is_int64"... pero claro, ahí no hay ni signed/unsigned, ni hay float... entonces investigando en google, vi una manera de sacar cuándo es unsigned, simplemente convirtiendo el número decimal a número binario y simplemente mirar cuántas cifras quedan mirando su "lenght".. pero claro, aquí no entran ni los números con signos ni los decimales... entonces, aquí me he estancado... alguna sugerencia??

Me gustaría crear un script donde le metas un argumento y te devuelva un tipo (con un número que lo identifique o algo)
Título: Re:Saber el tipo de dato (u8, s8, u16, f16...)
Publicado por: kostra en Noviembre 01, 2019, 09:29:55 am
tema resuelro, simplemente me hice un script algo chapuzero mirando si el valor es mayor que tal y menor que tal, un millón de if embedidos en otros ifs embedidos en otros ifs xD para asegurarme de que se elige siempre el buffer más pequeño... e aquí el script por si algún nub como yo lo necesitara algún día:

///buffer_type(value)

var val = argument[0];

if is_string(val) {
    return buffer_string; //string
    exit;
    }
else if is_bool(val) {
    return buffer_bool; //bool
    exit;
    }
else {
    var str = string(val);
    if string_count(".",str) > 0 {
        if val >= 16777216
        && val < 16777216 {
            return buffer_f32; //f32
            exit;
            }
        else {
            return buffer_f64; //f64
            exit;
            }
        }
    else {
        if val < 0 {
            if val >= -128 {
                return buffer_s8; //s8
                exit;
                }
            else if val >= -32768 {
                return buffer_s16; //s16
                exit;
                }
            else if val >= -2147483648 {
                return buffer_s32; //s32
                exit;
                }
            else {
                return buffer_u64; //u64
                exit;
                }
            }
        else {
            if val <= 127 {
                return buffer_s8; //s8
                exit;
                }
            else if val <= 255 {
                return buffer_u8; //u8
                exit;
                }
            else if val <= 32767 {
                return buffer_s16; //s16
                exit;
                }
            else if val <= 2147483647 {
                return buffer_s32; //s32
                exit;
                }
            else if val <= 4294967295 {
                return buffer_u32; //u32
                exit;
                }
            else {
                return buffer_u64; //u64
                }
            }
        }
    }

Nota, he evadido buffer_f16 y buffer_text porque el primero en el manual pone not supported y el segundo leí en otro lugar que tampoco is supported