Noticias

¡Ayuda a la Comunidad GM, haz una donación!

* Sponsor

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Autor Tema: tabla_array_ini(tabla_string);  (Leído 188 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado dixon

en: Septiembre 11, 2021, 08:47:20 pm
Autor del script: Reyes Dávila
Nombre del script: tabla_array_ini()
Breve descripción de su función: Recibe como argumento una tabla de Microsoft Word y genera un string con formato de archivo ini.
Versiones usadas: Game maker 4.3, Game maker html5, Game maker studio. Debería funcionar en todas las versiones superiores a Game maker 4.3. Lamentablemente no funciona en game maker studio 2, pero realmente no se requiere su implementacion ya que si lo que queremos es obtener archivos ini lo podemos hacer desde la web html5.
Version del script: 4

Mejoras realizadas:

Versión 4
7/10/2021
*Anidacion de claves: Ahora pueden crearse claves anidadas. Puede ser útil para:
1. Organizar facilmente juegos de preguntas donde las preguntas puedan ser audibles y/o requieran algún material de apoyo como un video de youtube.

2. Organizar dialogos aleatorios: Para crear personajes que hablen libremente y escojan ellos mismos lo que van a decir mediante un random.

Debemos tomar en cuenta que el objetivo del script es organizar fácilmente gran cantidad de información diversa en archivos ini. Si se domina correctamente la estructura de tabla se pueden crear archivos ini bastante organizados lo cual nos permitiría crea fácilmente juegos con estructuras complejas.

Será necesario que les cree uno o varios tutoriales para enseñarles a usar la estructura de tabla, los resultados que he obtenido son muy buenos.

Versión 3
*Corregido error en game maker studio.
*Corregido error al exportar a html5.

Versión 2
*Ahora no se requiere una columna especial. Reconoce tablas de Microsoft Word Correctamente.
*Se pueden crear secciones con nombres distintos. Reconoce diversas tablas dentro de la tabla principal.

Html5
En la siguiente web verán el funcionamiento del script y podrán crear su archivo ini a partir de una tabla de microsoft word.
https://dixonysusjuegoseducativos.000webhostapp.com/_practica_game/tabla_ini/ver_01/index.html

Código del script:

Código: [Seleccionar]
///tabla_ini(str);
//Este script transforma el contenido de una tabla de Microsoft Word en formato ini.
//En str debe colocarse la tabla especial de Microsoft Word.

//Al crear la tabla en Microsoft Word se deberá tomar en cuenta:
//1. No usar tabulaciones dentro de celdas,(Produce error).
//2. No usar caracter numeral # dentro de celdas. Para comentar usar ;.
//3. No usar espacios en blanco para definir secciones, puede usar Línea baja "_".
//4. No iniciar una tabla con un comentario en la primera fila.
//5. No iniciar una tabla con una linea vacia en la primera fila.

//Características del sistema
//1. La primera columna a la izquierda serán las secciones del formato ini.
//2. Las siguientes columnas serán las claves y valores.

tabla=argument0;


//Determinando el tipo de tabla
tabla_tipo=1;
str_ram=string_count(chr(9)+chr(13)+chr(10),tabla);
if(str_ram=0){
tabla_tipo=2;

c1=(string_count(chr(35),tabla)=0);
chr_10=string_count(chr(10),tabla);
chr_9=string_count(chr(9),tabla);
c2=(frac(chr_9/chr_10)=0);

if(c1 and c2)
{
tabla=string_replace_all(tabla,chr(10),chr(9)+chr(13)+chr(10));
}
else
{
tabla_tipo=3;
tabla=string_replace_all(tabla,chr(13)+chr(10),chr(9)+chr(13)+chr(10));
}

}

////////////////Corrigiendo tabla
/////Quitando inicio de tabla
//Para game maker 4 desde script
string_inicio=chr(13)+chr(10);
index=1;count=string_length(string_inicio);
c2=(string_copy(tabla,index,count)=string_inicio);
if(c2)
{
index=count+1;
count=string_length(tabla)-index;
tabla=string_copy(tabla,index,count);
}


///Cadenas separadoras de filas de tabla:
//Game maker 4, desde script: 9,13,10.
//Game maker 4 desde file: "";
//Game maker html5 desde script: 35.
//Game maker html5 desde get_string(): 32.


////////////Determinando finales de linea.
//Solo para game maker studio y html5
if(tabla_tipo=2)
{
length=string_length(tabla);
columnas=0;
count_chr_9=0;
pos_chr_9=1;
for(i=1;i<=length;i+=1)
{
    str_chr=string_copy(tabla,i,1);
    if(str_chr=chr(9))
    {
        count_chr_9+=1;

//Para detectar final de linea con cantidad de columnas
continuar=(columnas=0);
if(columnas){continuar=(frac(count_chr_9/columnas)=0)}

        for(i2=i;i2>pos_chr_9 and continuar;i2-=1)
        {
           str_chr_2=string_copy(tabla,i2,1);
           if(str_chr_2=chr(35) || str_chr_2=chr(32))
           {
if(columnas=0){columnas=count_chr_9};//Cantidad de columnas

chr_index=i2;

//Modificando tabla
index=1;count=chr_index-1;
tabla11=string_copy(tabla,index,count);
index=count+2;count=string_length(tabla)-index+1;
tabla12=string_copy(tabla,index,count);
tabla=tabla11+tabla12;
tabla=string_insert(chr(9)+chr(13)+chr(10),tabla,chr_index);
length=string_length(tabla);

continuar=0;//finalizando ciclo
           }

        }
        pos_chr_9=i;

    }

}
}//fin if(tabla_tipo=2)



//Corrigiendo final de tabla
index=string_length(tabla);count=1;
str_x=string_copy(tabla,index,count);
c1=(str_x=chr(9) || str_x=chr(13) || str_x=chr(10) || str_x=chr(32) || str_x=chr(35));
while(c1)
{
index=1;
count=string_length(tabla)-1;
tabla=string_copy(tabla,index,count);
index=string_length(tabla);count=1;
str_x=string_copy(tabla,index,count);
c1=(str_x=chr(9) || str_x=chr(13) || str_x=chr(10) || str_x=chr(32) || str_x=chr(35));
}
tabla+=chr(9)+chr(13)+chr(10);


//Determinando finales de línea de manera adecuada.
string01=chr(13)+chr(9)+chr(13)+chr(10);
string02=chr(9)+chr(13)+chr(10);
string_correcto=string(chr(9))+string("[fin]");
//if(string_count(string01,tabla))
{
tabla=string_replace_all(tabla,string01,string_correcto);
tabla=string_replace_all(tabla,string02,string_correcto);
}
////////////Fin  corrigiendo tabla



//Cantidad de filas
filas=string_count("[fin]",tabla);//Cantidad de filas.

//Extrayendo filas
for(i=1;i<=filas;i+=1)
{
//Clasificando filas
count=string_pos("[fin]",tabla)-1;
index=1;
fila[i]=string_copy(tabla,index,count);
count+=5;
tabla=string_delete(tabla,index,count);
}

//Identificando cantidad de columnas
columnas=string_count(chr(9),fila[1]);

//Identificando celdas
for(i=1;i<=filas;i+=1)
{
for(i2=1;i2<=columnas;i2+=1)
{
index=1;
count=string_pos(chr(9),fila[i])-1;
celda[i2,i]=string_copy(fila[i],index,count);
index=count+2;
count=string_length(fila[i])-index+1;
fila[i]=string_copy(fila[i],index,count);
}
}


//Identificador de filas
seccion_principal=0;
seccion_concatenada=0;

for(i=1;i<=filas;i+=1)
{
//Verificando si la primera celda de la primera columna está vacia
primera_celda_vacia=0;
if(string_length(celda[1,i])=0){primera_celda_vacia=1}

//Verficando todas las celdas están vacías
todas_celdas_vacias=1;
columnas_ram="";
for(i2=1;i2<=columnas;i2+=1)
{
columnas_ram+=string(celda[i2,i]);
}
if(string_length(columnas_ram)){todas_celdas_vacias=0}

fila_tipo[i]="";
if(fila_tipo[i]="" and celda[1,i]=string(chr(59))){fila_tipo[i]="comentario chr(59)"}
if(fila_tipo[i]="" and celda[1,i]=string(chr(35))){fila_tipo[i]="comentario chr(35)"}
if(fila_tipo[i]="" and !todas_celdas_vacias and seccion_principal=0){fila_tipo[i]="seccion principal";seccion_principal=1}

if(fila_tipo[i]="" and !todas_celdas_vacias and seccion_principal=1){fila_tipo[i]="seccion concatenada";seccion_concatenada+=1;}
if(fila_tipo[i]="seccion concatenada" and primera_celda_vacia and seccion_concatenada>1){fila_tipo[i]="clave anidada"}

if(fila_tipo[i]="" and todas_celdas_vacias){fila_tipo[i]="vacia";seccion_principal=0;seccion_concatenada=0}
}
//FIN Identificador de filas


//Creando ini
salida_ram="";
salida_ini="";
fila_principal=1;
claves_anidadas_123=0;

for(i=1;i<=filas;i+=1)
{
if(fila_tipo[i]="seccion principal"){fila_principal=i;i+=1}

//Enumerando claves anidadas
if(fila_tipo[i]="seccion concatenada"){claves_anidadas_123=0}
if(fila_tipo[i]="clave anidada"){claves_anidadas_123+=1}

//Obteniendo valor de celda.
for(i2=1;i2<=columnas;i2+=1)
{

//Identificando la columna 1 para secciones y comentarios.
if(i2=1)
{
if(fila_tipo[i]="seccion principal"){salida_ram=string(celda[1,fila_principal]);salida_ini+='['+string(salida_ram)+']'}
if(fila_tipo[i]="seccion concatenada"){salida_ram=string(celda[1,fila_principal])+string(celda[1,i]);salida_ini+='['+string(salida_ram)+']';}
//if(fila_tipo[i]="clave anidada")
if(fila_tipo[i]="comentario chr(59)"){salida_ini+=';'}
if(fila_tipo[i]="comentario chr(35)"){salida_ini+='#'}
c1=(fila_tipo[i]="seccion concatenada");
if(c1){salida_ini+='[fin]'};//Salto de línea para secciones concatenadas.
}
else
{

c1=(celda[i2,i]!="");
if(c1)
{
cx1=(fila_tipo[i]="seccion concatenada");
cx2=(fila_tipo[i]="clave anidada");
c2=(cx1 || cx2);
if(c2)
{
//Analizando claves
if(celda[i2,fila_principal]=";")
{
//Cuando la clave es un comentario
salida_ram=string(celda[i2,fila_principal])+string(celda[i2,i]);
}
else
{
//Clave normal
if(fila_tipo[i]="seccion concatenada")
{
salida_ram=string(celda[i2,fila_principal])+' = '+string(celda[i2,i]);
}

//Clave anidada
if(fila_tipo[i]="clave anidada")
{
salida_ram=string(celda[i2,fila_principal])+"."+string(claves_anidadas_123)+' = '+string(celda[i2,i]);
}
}
}

if(!c2){salida_ram=string(celda[i2,i])}
salida_ini+=salida_ram;
if(c2){salida_ini+='[fin]'};//Salto de línea para claves y valores.
}




}

}//fin for(i2=1;i2<=columnas;i2+=1)
//Fin obteniendo valor de celda

//Salto de linea para final de secciones
//Salto de linea para columna final
x1=i+(i<filas);
if(fila_tipo[x1]!="clave anidada")
{
salida_ini+="[fin]";
}


}
salida_ini=string_replace_all(salida_ini,"[fin]",chr(13));
return string(salida_ini);
















Modo de uso:


1. Crear script: Con el código que se les está entregando, deberán crear un script cuyo nombre deberá ser: “tabla_ini”.
Ejemplo de creación de un script con el código entregado.


2. Crear tabla: Abre Microsoft Word y crea una tabla con las dimensiones que necesites.
Ejemplo de tabla normal creada con Microsoft Word.



3. En el evento CREATE de un objeto deberás colocar:
Código: [Seleccionar]
tabla_ini(“”);//No olvidar las comillas dobles.

4. Copia la tabla: Selecciona toda la tabla de Microsoft Word . Para copiar toda la tabla sin problemas podemos: Ubicar el mouse sobre la tabla, presionamos click derecho, luego en seleccionar y finalmente en tabla:


5: Pegar tabla: En el evento créate donde hemos colocado el código ‘tabla_ini(“”);’, debemos pegar la tabla copiada dentro de los paréntesis y entre las comillas dobles.

6. Obtener código ini: El script recibe como argumento el string de la tabla y devuelve un string que contiene el archivo ini.


Detalles sobre la tabla







Mejoras próximas del script
1. Anidación: Permitir la anidación de código para crear estructuras anidadas.
2. Salida tipo Json: Permitir la creación de archivos Json.
3. Json lectura: Permitir la lectura de archivos Json para producir archivos ini, ds_maps y ds_lists, en versiones que no cuenten con estas funciones.

Visión de futuro:
1. Si se logra el manejo adecuado del lenguaje Json, se podrá tomar dicho lenguaje como base para la creación de estructuras de juegos y/o sistemas los cuales podrían ser capaces de ejecutarse o interpretarse en diversas plataformas y lenguajes. Esto a su vez permitiría lograr cosas actualmente imposibles (año 2021) como:
   A. Exportar juegos de versiones antiguas del game maker, a plataformas como android.
   B. Fusión de video juegos: se podría crear un interprete de código que tome como base los archivos json para generar un video juego en base a ellos, para luego crear un sistema que combine dos archivos json el cual genere un tercer archivo con características especificas capaces de ser interpretado.
C. Multi motor: Se pudiesen crear juegos basados en estructuras Json los cuales mediante interpretes especificaos pudiesen ejecutarse en diversos motores de desarrollo (Godot, Unity, Game maker, CryEngine, etc..). Esto quiere decir que se podrían crear juegos que se ejecuten en varios motores.

Bueno, eso es todo por ahora, saludos.

« Última modificación: Octubre 08, 2021, 04:43:17 am por dixon »

Si Dios quiere; Limpiaré la oficina, puliré el piso y les serviré café a todos, luego, me enseñarán a programar e iré a comprarles más café.
 


No Tienes Permisos Para Dar Puntos
point 10 Puntos

Usuarios que puntuaron el tema » Clamud (10 Pts) 


 


Warning: Parameter 1 to spoiler_buffer() expected to be a reference, value given in Unknown on line 0

Warning: Parameter 1 to custom_report_ob() expected to be a reference, value given in Unknown on line 0