Comunidad Game Maker

Ayuda => Desarrollo de Scripts => Mensaje iniciado por: Texic en Febrero 19, 2013, 07:27:21 PM

Título: Scripts extendidos para listas
Publicado por: Texic en Febrero 19, 2013, 07:27:21 PM
Creador: Yo

Version de GM utilizada:  :GM8:

Descripcion:
Una recopilación de scripts útiles para listas creado por mi, extiende las funciones permitiendo mezclar o ordenar 2 listas ligadas (o más modificando los scripts), buscar y reemplazar un valor o todos (como la función string_replace_all), y encontrar todas las repeticiones de un valor en una lista con la posición detallada de cada uno

ds_list_sort_both
[gml]//argument0=lista 1
//argument1=lista 2
//argument2=ascendente
//argument3=preciso
var a,b,isreal,isreal2;
if argument3=0
{
if ds_list_size(argument0)<>ds_list_size(argument1) {return -1}
a=ds_list_create()
ds_list_copy(a,argument0)
b=ds_list_create()
ds_list_copy(b,argument1)
ds_list_sort(argument0,argument2)
for (i=0;i<=ds_list_size(argument1)-1;i+=1)
{
ds_list_replace(argument1,i,ds_list_find_value(b,ds_list_find_index(a,ds_list_find_value(argument0,i))))
}
ds_list_destroy(a)
ds_list_destroy(b)
return 1
}
else
{
if ds_list_size(argument0)<>ds_list_size(argument1) {return -1}
isreal=ds_list_create()
isreal2=ds_list_create()
for (i=0;i<=ds_list_size(argument0)-1;i+=1)
{
ds_list_add(isreal,is_real(ds_list_find_value(argument0,i)))
ds_list_replace(argument0,i,string(ds_list_find_value(argument0,i))+string(i))
ds_list_add(isreal2,is_real(ds_list_find_value(argument1,i)))
ds_list_replace(argument1,i,string(ds_list_find_value(argument1,i))+string(i))
}
a=ds_list_create()
ds_list_copy(a,argument0)
b=ds_list_create()
ds_list_copy(b,argument1)
ds_list_sort(argument0,argument2)
for (i=0;i<=ds_list_size(argument1)-1;i+=1)
{
ds_list_replace(argument1,i,ds_list_find_value(b,ds_list_find_index(a,ds_list_find_value(argument0,i))))
}
for (i=0;i<=ds_list_size(argument0)-1;i+=1)
{
ds_list_replace(argument0,i,string_delete(ds_list_find_value(argument0,i),string_length(ds_list_find_value(argument0,i)),1))
if ds_list_find_value(isreal,i) {ds_list_replace(argument0,i,real(ds_list_find_value(argument0,i)))}
ds_list_replace(argument1,i,string_delete(ds_list_find_value(argument1,i),string_length(ds_list_find_value(argument1,i)),1))
if ds_list_find_value(isreal2,i) {ds_list_replace(argument1,i,real(ds_list_find_value(argument1,i)))}
}
ds_list_destroy(a)
ds_list_destroy(b)
ds_list_destroy(isreal)
ds_list_destroy(isreal2)
return 1
}[/gml]
Este script ordena una lista (lista 1) en orden ascendente o descendente dejando intacta la lista ligada (lista 2). El argumento preciso debe usarse si en la lista 1 existen valores que se repiten, de otra manera se recomienda no usarlo ya que consume más recursos. Las listas deben tener el mismo tamaño. Devuelve 1 si la operación es exitosa, de lo contrario devuelve -1

ds_list_shuffle_both
[gml]//argument0=lista 1
//argument1=lista 2
//argument2=preciso
var a,b,isreal,isreal2;
if argument2=0
{
if ds_list_size(argument0)<>ds_list_size(argument1) {return -1}
a=ds_list_create()
ds_list_copy(a,argument0)
b=ds_list_create()
ds_list_copy(b,argument1)
ds_list_shuffle(argument0)
for (i=0;i<=ds_list_size(argument1)-1;i+=1)
{
ds_list_replace(argument1,i,ds_list_find_value(b,ds_list_find_index(a,ds_list_find_value(argument0,i))))
}
ds_list_destroy(a)
ds_list_destroy(b)
return 1
}
else
{
if ds_list_size(argument0)<>ds_list_size(argument1) {return -1}
isreal=ds_list_create()
isreal2=ds_list_create()
for (i=0;i<=ds_list_size(argument0)-1;i+=1)
{
ds_list_add(isreal,is_real(ds_list_find_value(argument0,i)))
ds_list_replace(argument0,i,string(ds_list_find_value(argument0,i))+string(i))
ds_list_add(isreal2,is_real(ds_list_find_value(argument1,i)))
ds_list_replace(argument1,i,string(ds_list_find_value(argument1,i))+string(i))
}
a=ds_list_create()
ds_list_copy(a,argument0)
b=ds_list_create()
ds_list_copy(b,argument1)
ds_list_shuffle(argument0)
for (i=0;i<=ds_list_size(argument1)-1;i+=1)
{
ds_list_replace(argument1,i,ds_list_find_value(b,ds_list_find_index(a,ds_list_find_value(argument0,i))))
}
for (i=0;i<=ds_list_size(argument0)-1;i+=1)
{
ds_list_replace(argument0,i,string_delete(ds_list_find_value(argument0,i),string_length(ds_list_find_value(argument0,i)),1))
if ds_list_find_value(isreal,i) {ds_list_replace(argument0,i,real(ds_list_find_value(argument0,i)))}
ds_list_replace(argument1,i,string_delete(ds_list_find_value(argument1,i),string_length(ds_list_find_value(argument1,i)),1))
if ds_list_find_value(isreal2,i) {ds_list_replace(argument1,i,real(ds_list_find_value(argument1,i)))}
}
ds_list_destroy(a)
ds_list_destroy(b)
ds_list_destroy(isreal)
ds_list_destroy(isreal2)
return 1
}[/gml]
Hace lo mismo que el script anterior pero mezclando la lista 1 de manera aleatoria, también se debe notar que se elimina el parámetro ascendente. Las listas deben tener el mismo tamaño. Devuelve 1 si la operación es exitosa, de lo contrario devuelve -1

ds_list_find_replace
[gml]//argument0=lista
//argument1=valor buscado
//argument2=valor con el que será reemplazado
var a;
a=ds_list_find_index(argument0,argument1)
if a<>-1 {ds_list_replace(argument0,a,argument2)}
return a[/gml]
Este script reemplaza el primer valor encontrado en una lista por el valor deseado. Devuelve la posición del elemento reemplazado si se encontró, de lo contrario devuelve -1

ds_list_find_replace_all
[gml]//argument0=lista
//argument1=valor buscado
//argument2=valor con el que será reemplazado
var a,b;
b=-1
a=ds_list_find_index(argument0,argument1)
while a<>-1 {ds_list_replace(argument0,a,argument2) a=ds_list_find_index(argument0,argument1) b=1}
return b[/gml]
Este script reemplaza todos los valores encontrados en una lista por el valor deseado. Devuelve 1 si se encontró y reemplazó algún valor, de lo contrario devuelve -1

ds_list_find_index_all
[gml]//argument0=lista
//argument1=valor buscado
var a,b;
aux=ds_list_create()
b=-1
a=ds_list_find_index(argument0,argument1)
while a<>-1 {ds_list_replace(argument0,a,"_*#@") ds_list_add(aux,a) a=ds_list_find_index(argument0,argument1)}
a=ds_list_find_index(argument0,"_*#@")
while a<>-1 {ds_list_replace(argument0,a,argument1) a=ds_list_find_index(argument0,"_*#@")}
return aux[/gml]
Este script encuentra todas las posiciones de un valor buscado en la lista y los vierte en una lista nueva, devuelve el índice de dicha lista

Bueno, esos son todos, me costó un poco hacer algunos, pero a mi particularmente me estaban haciendo falta, espero que a alguno le sirva, saludos!  :)
Título: Re:Scripts extendidos para listas
Publicado por: Creador de juegos GM en Febrero 19, 2013, 08:02:18 PM
Cita de: Texic en Febrero 19, 2013, 07:27:21 PM
Creador: Yo

Version de GM utilizada:  :GM8:

Descripcion:
Una recopilación de scripts útiles para listas creado por mi, extiende las funciones permitiendo mezclar o ordenar 2 listas ligadas (o más modificando los scripts), buscar y reemplazar un valor o todos (como la función string_replace_all), y encontrar todas las repeticiones de un valor en una lista con la posición detallada de cada uno

ds_list_sort_both
[gml]//argument0=lista 1
//argument1=lista 2
//argument2=ascendente
//argument3=preciso
var a,b,isreal,isreal2;
if argument3=0
{
if ds_list_size(argument0)<>ds_list_size(argument1) {return -1}
a=ds_list_create()
ds_list_copy(a,argument0)
b=ds_list_create()
ds_list_copy(b,argument1)
ds_list_sort(argument0,argument2)
for (i=0;i<=ds_list_size(argument1)-1;i+=1)
{
ds_list_replace(argument1,i,ds_list_find_value(b,ds_list_find_index(a,ds_list_find_value(argument0,i))))
}
ds_list_destroy(a)
ds_list_destroy(b)
return 1
}
else
{
if ds_list_size(argument0)<>ds_list_size(argument1) {return -1}
isreal=ds_list_create()
isreal2=ds_list_create()
for (i=0;i<=ds_list_size(argument0)-1;i+=1)
{
ds_list_add(isreal,is_real(ds_list_find_value(argument0,i)))
ds_list_replace(argument0,i,string(ds_list_find_value(argument0,i))+string(i))
ds_list_add(isreal2,is_real(ds_list_find_value(argument1,i)))
ds_list_replace(argument1,i,string(ds_list_find_value(argument1,i))+string(i))
}
a=ds_list_create()
ds_list_copy(a,argument0)
b=ds_list_create()
ds_list_copy(b,argument1)
ds_list_sort(argument0,argument2)
for (i=0;i<=ds_list_size(argument1)-1;i+=1)
{
ds_list_replace(argument1,i,ds_list_find_value(b,ds_list_find_index(a,ds_list_find_value(argument0,i))))
}
for (i=0;i<=ds_list_size(argument0)-1;i+=1)
{
ds_list_replace(argument0,i,string_delete(ds_list_find_value(argument0,i),string_length(ds_list_find_value(argument0,i)),1))
if ds_list_find_value(isreal,i) {ds_list_replace(argument0,i,real(ds_list_find_value(argument0,i)))}
ds_list_replace(argument1,i,string_delete(ds_list_find_value(argument1,i),string_length(ds_list_find_value(argument1,i)),1))
if ds_list_find_value(isreal2,i) {ds_list_replace(argument1,i,real(ds_list_find_value(argument1,i)))}
}
ds_list_destroy(a)
ds_list_destroy(b)
ds_list_destroy(isreal)
ds_list_destroy(isreal2)
return 1
}[/gml]
Este script ordena una lista (lista 1) en orden ascendente o descendente dejando intacta la lista ligada (lista 2). El argumento preciso debe usarse si en la lista 1 existen valores que se repiten, de otra manera se recomienda no usarlo ya que consume más recursos. Las listas deben tener el mismo tamaño. Devuelve 1 si la operación es exitosa, de lo contrario devuelve -1

ds_list_shuffle_both
[gml]//argument0=lista 1
//argument1=lista 2
//argument2=preciso
var a,b,isreal,isreal2;
if argument2=0
{
if ds_list_size(argument0)<>ds_list_size(argument1) {return -1}
a=ds_list_create()
ds_list_copy(a,argument0)
b=ds_list_create()
ds_list_copy(b,argument1)
ds_list_shuffle(argument0)
for (i=0;i<=ds_list_size(argument1)-1;i+=1)
{
ds_list_replace(argument1,i,ds_list_find_value(b,ds_list_find_index(a,ds_list_find_value(argument0,i))))
}
ds_list_destroy(a)
ds_list_destroy(b)
return 1
}
else
{
if ds_list_size(argument0)<>ds_list_size(argument1) {return -1}
isreal=ds_list_create()
isreal2=ds_list_create()
for (i=0;i<=ds_list_size(argument0)-1;i+=1)
{
ds_list_add(isreal,is_real(ds_list_find_value(argument0,i)))
ds_list_replace(argument0,i,string(ds_list_find_value(argument0,i))+string(i))
ds_list_add(isreal2,is_real(ds_list_find_value(argument1,i)))
ds_list_replace(argument1,i,string(ds_list_find_value(argument1,i))+string(i))
}
a=ds_list_create()
ds_list_copy(a,argument0)
b=ds_list_create()
ds_list_copy(b,argument1)
ds_list_shuffle(argument0)
for (i=0;i<=ds_list_size(argument1)-1;i+=1)
{
ds_list_replace(argument1,i,ds_list_find_value(b,ds_list_find_index(a,ds_list_find_value(argument0,i))))
}
for (i=0;i<=ds_list_size(argument0)-1;i+=1)
{
ds_list_replace(argument0,i,string_delete(ds_list_find_value(argument0,i),string_length(ds_list_find_value(argument0,i)),1))
if ds_list_find_value(isreal,i) {ds_list_replace(argument0,i,real(ds_list_find_value(argument0,i)))}
ds_list_replace(argument1,i,string_delete(ds_list_find_value(argument1,i),string_length(ds_list_find_value(argument1,i)),1))
if ds_list_find_value(isreal2,i) {ds_list_replace(argument1,i,real(ds_list_find_value(argument1,i)))}
}
ds_list_destroy(a)
ds_list_destroy(b)
ds_list_destroy(isreal)
ds_list_destroy(isreal2)
return 1
}[/gml]
Hace lo mismo que el script anterior pero mezclando la lista 1 de manera aleatoria, también se debe notar que se elimina el parámetro ascendente. Las listas deben tener el mismo tamaño. Devuelve 1 si la operación es exitosa, de lo contrario devuelve -1

ds_list_find_replace
[gml]//argument0=lista
//argument1=valor buscado
//argument2=valor con el que será reemplazado
var a;
a=ds_list_find_index(argument0,argument1)
if a<>-1 {ds_list_replace(argument0,a,argument2)}
return a[/gml]
Este script reemplaza el primer valor encontrado en una lista por el valor deseado. Devuelve la posición del elemento reemplazado si se encontró, de lo contrario devuelve -1

ds_list_find_replace_all
[gml]//argument0=lista
//argument1=valor buscado
//argument2=valor con el que será reemplazado
var a,b;
b=-1
a=ds_list_find_index(argument0,argument1)
while a<>-1 {ds_list_replace(argument0,a,argument2) a=ds_list_find_index(argument0,argument1) b=1}
return b[/gml]
Este script reemplaza todos los valores encontrados en una lista por el valor deseado. Devuelve 1 si se encontró y reemplazó algún valor, de lo contrario devuelve -1

ds_list_find_index_all
[gml]//argument0=lista
//argument1=valor buscado
var a,b;
aux=ds_list_create()
b=-1
a=ds_list_find_index(argument0,argument1)
while a<>-1 {ds_list_replace(argument0,a,"_*#@") ds_list_add(aux,a) a=ds_list_find_index(argument0,argument1)}
a=ds_list_find_index(argument0,"_*#@")
while a<>-1 {ds_list_replace(argument0,a,argument1) a=ds_list_find_index(argument0,"_*#@")}
return aux[/gml]
Este script encuentra todas las posiciones de un valor buscado en la lista y los vierte en una lista nueva, devuelve el índice de dicha lista

Bueno, esos son todos, me costó un poco hacer algunos, pero a mi particularmente me estaban haciendo falta, espero que a alguno le sirva, saludos!  :)
muy buen post,espero que le sirva a otro mas que a mii,muy bueno,por sierto... que game maker 8 usas
Título: Re:Scripts extendidos para listas
Publicado por: Texic en Febrero 19, 2013, 08:14:57 PM
Cita de: Creador de juegos GM en Febrero 19, 2013, 08:02:18 PMmuy buen post,espero que le sirva a otro mas que a mii,muy bueno,por sierto... que game maker 8 usas
El 8.0, pero debería funcionar en el 8.1 también, y si no sacaron ninguna de estas funciones, lo mismo con el studio. Ahora con los anteriores no sé porque no tengo los manuales a mano, pero en el 6 no está la función shuffle así que esa no funcionaría, pero sostengo que las demás si, ya que las funciones comparten los mismos argumentos que con gm8 y la misma funcionalidad
Título: Re:Scripts extendidos para listas
Publicado por: Creador de juegos GM en Febrero 19, 2013, 08:16:11 PM
Cita de: Texic en Febrero 19, 2013, 08:14:57 PM
Cita de: Creador de juegos GM en Febrero 19, 2013, 08:02:18 PMmuy buen post,espero que le sirva a otro mas que a mii,muy bueno,por sierto... que game maker 8 usas
El 8.0, pero debería funcionar en el 8.1 también, y si no sacaron ninguna de estas funciones, lo mismo con el studio. Ahora con los anteriores no sé porque no tengo los manuales a mano, pero en el 6 no está la función shuffle así que esa no funcionaría, pero sostengo que las demás si, ya que las funciones comparten los mismos argumentos que con gm8 y la misma funcionalidad
en la  7 lo probé y funciona.