Comunidad Game Maker

Ayuda => Desarrollo de Scripts => Mensaje iniciado por: Mgbu en Septiembre 25, 2012, 09:24:31 PM

Título: Sistema de trucos o cheats [Programación]
Publicado por: Mgbu en Septiembre 25, 2012, 09:24:31 PM
Como vi que lo preguntaron bastante pero no hay un engine en esta sección hice uno bien simple:

Nombre del creador
Yo, Mgbu

Breve descripción de la función
Es un código que se fija continuamente si has escrito alguna de las palabras clave para ejecutar un código, en ese código podés darle más vida al jugador, darle municiones, puntos o lo que sea

Versión de GM utilizada
GM 8.0

Código de la función

Es un objeto que se fija continuamente si has escrito un truco para el juego.. Chequea cada vez que apretas una tecla desde la A a la Z, buscando si acabas de escribir el truco. Así que no hace falta apretar enter, abrir un cuadro de texto ni nada. Apenas uno termina de escribir la clave se ejecuta lo que uno quiere

Este es el código, esto va en un objeto obj_cheats (o como quieras llamarlo). Tiene que estar cuando lo necesitas, así que es bueno ponerlo en la primera room y hacerlo persistente. Pero cuidado que no se duplique!
Esto va en el evento Key Press>Any Key
[gml]
//Seteamos los trucos, esto puede ir en create/////
cantcheats=3  //Cantidad de trucos               //
cheats[0]='medico'                               //
cheats[1]='rambo'                                //
cheats[2]='piratas'                              //
///////////////////////////////////////////////////

if keyboard_lastkey>=ord('A') and keyboard_lastkey<=ord('Z') { //Si la tecla apretada es una letra
    for (i=0;i<cantcheats;i+=1) { //Probar con cada truco
        largo=string_length(cheats) //largo = largo del truco
        largoescrito=string_length(keyboard_string) //largoescrito = largo de keyboard_string
        escrito=string_copy(keyboard_string,largoescrito-largo+1,largo) //escrito = ultimos caracteres de keyboard_string (si el truco mide 6 se fija los ultimos 6, si el truco mide 5 se fija los ultimos 5 y así)
        if escrito=cheats { //Si lo escrito es igual al truco
            switch (cheats)
            case medico: {
                //Codigo a ejecutar si se escribio "medico"
            }
            case rambo: {
                //Codigo a ejecutar si es "rambo"
            }
            case piratas: {
                //Codigo a ejecutar si es "piratas"
            }
        }
    }
}
[/gml]

Después de resumirlo queda mas lindo pero mas dificil de entender, esto es lo mismo que lo que escribí antes
[gml]
//Seteamos los trucos, esto puede ir en create/////
cantcheats=3  //Cantidad de trucos               //
cheats[0]='medico'                               //
cheats[1]='rambo'                                //
cheats[2]='piratas'                              //
///////////////////////////////////////////////////

if keyboard_lastkey>=ord('A') and keyboard_lastkey<=ord('Z') { //Si la tecla apretada es una letra
    for (i=0;i<cantcheats;i+=1) { //Probar con cada truco
        if string_copy(keyboard_string,string_length(keyboard_string)-string_length(cheats)+1,string_length(cheats))=cheats { //Obtener lo último escrito y compararlo con el truco
            switch (cheats)
            case medico: {
                //Codigo a ejecutar si se escribio "medico"
            }
            case rambo: {
                //Codigo a ejecutar si es "rambo"
            }
            case piratas: {
                //Codigo a ejecutar si es "piratas"
            }
        }
    }
}
[/gml]

Luego lo que falta es escribir en los case, ahí pones lo que queres que se ejecute cuando se escribió el truco
Título: Re:Sistema de trucos o cheats [Programación]
Publicado por: Marron121 en Septiembre 25, 2012, 10:25:40 PM
Podrías hacer uno para hacer Trofeos o logros? Me muero de ilusión por probarlo :D
Hablando del engine,esta muy bien explicado,y es bastante sencillo,me encanta  :-*
Título: Re:Sistema de trucos o cheats [Programación]
Publicado por: Mgbu en Septiembre 25, 2012, 10:30:57 PM
Para los trofeos o logros no creo que haga falta hacer nada. En el evento en donde ganas el logro haces que ganes el logro y listo XD
Podés guardar en un ini que logros ganaste y cuáles no para mostrarlos después

Gracias por pasar ;D
Título: Re:Sistema de trucos o cheats [Programación]
Publicado por: Johann en Septiembre 26, 2012, 02:09:32 AM
Tienes que usar execute_string, es decir, puedes encontrar otra forma de hacerlo sin esa funcion? tiene muy mala fama de ser lenta.
Título: Re:Sistema de trucos o cheats [Programación]
Publicado por: Silver_light en Septiembre 26, 2012, 02:41:44 AM
Hola Mgbu, tu Script es interesante, nunca había intentado ejecutar un script de esa forma, es más... ni siquiera sabía que se podía XD
Vaya...

Mirando el comentario de Maitreya:
Cita de: Maitreya en Septiembre 26, 2012, 02:09:32 AM
Tienes que usar execute_string, es decir, puedes encontrar otra forma de hacerlo sin esa funcion? tiene muy mala fama de ser lenta.
Supongo que podrías replazar la dicha linea:
[GML] execute_string('scr_cheat_'+cheats+'()') //Ejecutar un script[/GML]
por:
[GML]script_execute(i);[/GML]
puesto que la conicidencia se logra en el elemento i, verdad?

EDIT: De hecho, lo he comprobado y solo funcionaría si los indices de los scripts fueran creados en orden.
Título: Re:Sistema de trucos o cheats [Programación]
Publicado por: Mgbu en Septiembre 26, 2012, 05:25:51 PM
Cita de: Silver_light en Septiembre 26, 2012, 02:41:44 AM
Hola Mgbu, tu Script es interesante, nunca había intentado ejecutar un script de esa forma, es más... ni siquiera sabía que se podía XD
Vaya...

Mirando el comentario de Maitreya:
Cita de: Maitreya en Septiembre 26, 2012, 02:09:32 AM
Tienes que usar execute_string, es decir, puedes encontrar otra forma de hacerlo sin esa funcion? tiene muy mala fama de ser lenta.
Supongo que podrías replazar la dicha linea:
[GML] execute_string('scr_cheat_'+cheats+'()') //Ejecutar un script[/GML]
por:
[GML]script_execute(i);[/GML]
puesto que la conicidencia se logra en el elemento i, verdad?

EDIT: De hecho, lo he comprobado y solo funcionaría si los indices de los scripts fueran creados en orden.
Uuy, no sabia que era lenta, justo esa función (execute_string) me encanta porque hace de todo XD

Se puede reemplazar por un switch, algo así como:
[gml]
if keyboard_lastkey>=ord('A') and keyboard_lastkey<=ord('Z') { //Si la tecla apretada es una letra
    for (i=0;i<cantcheats;i+=1) { //Probar con cada truco
        largo=string_length(cheats) //largo = largo del truco
        largoescrito=string_length(keyboard_string) //largoescrito = largo de keyboard_string
        escrito=string_copy(keyboard_string,largoescrito-largo+1,largo) //escrito = ultimos caracteres de keyboard_string (si el truco mide 6 se fija los ultimos 6, si el truco mide 5 se fija los ultimos 5 y así)
        if escrito=cheats { //Si lo escrito es igual al truco
            switch (cheats)
            case medico: {
                //Codigo a ejecutar si se escribio "medico"
            }
            case rambo: {
                //Codigo a ejecutar si es "rambo"
            }
            case piratas: {
                //Codigo a ejecutar si es "piratas"
            }
            execute_string('scr_cheat_'+cheats+'()') //Ejecutar un script
        }
    }
}
[/gml]
¿Que les parece si lo cambio por eso?
Título: Re:Sistema de trucos o cheats [Programación]
Publicado por: Silver_light en Septiembre 26, 2012, 10:44:25 PM
Acerca de la funcion maligna(?
Cito: (Lease en inglés)
Citar
They make execution of your game slower. When Game Maker starts, it converts all scripted GML into a byte-coded representation, by verifying the syntax, checking the parameters and converting them into something that GM can execute much faster. Your game runs faster because this first step of interpretation of your programming takes place the start of the executable, and not while it is actually running the game. But execute_string() and execute_file() always apply this parsing during the game, when these commands are called. This can introduce a performance drop in your game, especially when used in continuously (step, draw) and semi-continuously (key, collision) triggered events.
Lo he sacado de:www.gmc.yoyogames.com/index.php?showtopic=322492 (http://www.gmc.yoyogames.com/index.php?showtopic=322492)

Viendo que es una funcion sumamente lenta, suponiendo para juegos más complejos, utilizar Switch no está mal, sin embargo sería engorroso, pero de todas formas no creo que afecte el rendimiento como lo haría execute_string, a menos que tengas miles de Cheat's XD
P/D: por cierto, agregaste nuevamente execute_string() debajo de todo el Switch
Título: Re:Sistema de trucos o cheats [Programación]
Publicado por: Mgbu en Septiembre 26, 2012, 11:33:42 PM
Cita de: Silver_light en Septiembre 26, 2012, 10:44:25 PM
Acerca de la funcion maligna(?
Cito: (Lease en inglés)
Citar
They make execution of your game slower. When Game Maker starts, it converts all scripted GML into a byte-coded representation, by verifying the syntax, checking the parameters and converting them into something that GM can execute much faster. Your game runs faster because this first step of interpretation of your programming takes place the start of the executable, and not while it is actually running the game. But execute_string() and execute_file() always apply this parsing during the game, when these commands are called. This can introduce a performance drop in your game, especially when used in continuously (step, draw) and semi-continuously (key, collision) triggered events.
Lo he sacado de:www.gmc.yoyogames.com/index.php?showtopic=322492 (http://www.gmc.yoyogames.com/index.php?showtopic=322492)

Viendo que es una funcion sumamente lenta, suponiendo para juegos más complejos, utilizar Switch no está mal, sin embargo sería engorroso, pero de todas formas no creo que afecte el rendimiento como lo haría execute_string, a menos que tengas miles de Cheat's XD
P/D: por cierto, agregaste nuevamente execute_string() debajo de todo el Switch
Esta bien, lo voy a cambiar, va a ser mejor, total no complica nada
Dejé el execute_string abajo... porque me olvide de sacarlo XD
Título: Re:Sistema de trucos o cheats [Programación]
Publicado por: Fenris78 en Septiembre 27, 2012, 01:51:12 PM
Me gusta el script, es muy ingenioso.

Es sencillo, util y muy facil de implementar. Enhorabuena.

Si he entendido bien como funciona (estoy un poco oxidado ultimamente), hay una cosa que no me termina de gustar y es que por lo que veo, hace un chequeo constante de la entrada de teclado sin comprobar cuanto tiempo pasa entre pulsaciones. Si uno se confunde escribiendo, o pulsa una tecla de mas, el script termina por no saber cuando el usuario a vuelto a intentar meter un cheat.

Si escribo:

Citarmediccomedicomedicomedico

El script entiende:

Citarmedicc
omedic
omedic

y te puedes llevar todo el tiempo que quieras escribiendolo que no lo vas a conseguir nunca.

podrias solucionar el problema añadiendo un testeo tras pulsar la ultima tecla del codigo correcto mas largo. Si no coincide, limpias el array y comienzas de cero. Tambien puedes hacer lo mismo si pasan mas de x segundos entre pulsaciones, ya que se entiende que el usuario esta iniciando otro intento. De esta forma tambien ahorras espacio en el array y velocidad de proceso. Tal y como esta diseñado ahora mismo, el array continua creciendo indefinidamente con cada entrada de teclado.
Título: Re:Sistema de trucos o cheats [Programación]
Publicado por: Mgbu en Septiembre 27, 2012, 07:18:38 PM
Cita de: Fenris78 en Septiembre 27, 2012, 01:51:12 PM
Me gusta el script, es muy ingenioso.

Es sencillo, util y muy facil de implementar. Enhorabuena.

Si he entendido bien como funciona (estoy un poco oxidado ultimamente), hay una cosa que no me termina de gustar y es que por lo que veo, hace un chequeo constante de la entrada de teclado sin comprobar cuanto tiempo pasa entre pulsaciones. Si uno se confunde escribiendo, o pulsa una tecla de mas, el script termina por no saber cuando el usuario a vuelto a intentar meter un cheat.

Si escribo:

Citarmediccomedicomedicomedico

El script entiende:

Citarmedicc
omedic
omedic

y te puedes llevar todo el tiempo que quieras escribiendolo que no lo vas a conseguir nunca.

podrias solucionar el problema añadiendo un testeo tras pulsar la ultima tecla del codigo correcto mas largo. Si no coincide, limpias el array y comienzas de cero. Tambien puedes hacer lo mismo si pasan mas de x segundos entre pulsaciones, ya que se entiende que el usuario esta iniciando otro intento. De esta forma tambien ahorras espacio en el array y velocidad de proceso. Tal y como esta diseñado ahora mismo, el array continua creciendo indefinidamente con cada entrada de teclado.
Gracias por las felicitaciones, dan ganas de hacer más scripts :D

Lo del error no pasa, porque se fija los ultimos 6 caracteres del keyboard_string, no los multiplos de 6 (si el truco mide 6 caracteres). Fijate en esta parte del código:
[gml]
escrito=string_copy(keyboard_string,largoescrito-largo+1,largo) //escrito = ultimos caracteres de keyboard_string (si el truco mide 6 se fija los ultimos 6, si el truco mide 5 se fija los ultimos 5 y así)
[/gml]
Título: Re:Sistema de trucos o cheats [Programación]
Publicado por: Fenris78 en Septiembre 28, 2012, 01:48:21 AM
Mmmm... pues tienes razon, no se yo en que estaria pensando. XD

De todas formas si que seria buena cosa que limpiar el array pasado un tiempo entre pulsaciones, porque si no va a seguir creciendo indefinidamente con cada entrada de teclado, ¿no?.

Título: Re:Sistema de trucos o cheats [Programación]
Publicado por: Mgbu en Septiembre 28, 2012, 02:33:27 AM
Me estas confundiendo :P
El unico array que encontre es cheats[], ese array solamente tiene a los trucos. Lo que uno teclea se guarda en keyboard_string, que solo guarda los ultimos 1024 caracteres
Título: Re:Sistema de trucos o cheats [Programación]
Publicado por: Texic en Septiembre 28, 2012, 05:25:55 PM
1024 es el máximo de la variable keyboard_string por defecto, el string del código sólo agarra los últimos X caracteres (donde X es el largo del string de código que se está verificando). Y no hay intervalo entre intentos, el keyboard_string agarra todas las teclas que toques. Lobo, no sé exactamente qué habrás tomado, pero definitivamente está afectando tu sistema cognitivo XD
Título: Re:Sistema de trucos o cheats [Programación]
Publicado por: Fenris78 en Septiembre 28, 2012, 05:34:57 PM
Bufff...

Que palo, me acabo de dar cuenta de que esa lista (keyboard_string) no se puede limpiar. Y yo pensando "que desperdicio de memoria, si solo quiero seis caracteres ¿acaso se infla hasta el infinito?"

Esto nunca ha ocurrido, vosotros no estabais aqui y esto esta escrito con tinta invisible. XD

Título: Re:Sistema de trucos o cheats [Programación]
Publicado por: Mgbu en Septiembre 28, 2012, 06:48:14 PM
No uses tus poderes de administracion para limpiar las huellas en la base de datos de la comunidad! XD
Título: Re:Sistema de trucos o cheats [Programación]
Publicado por: Fenris78 en Septiembre 28, 2012, 10:52:55 PM
¡PSST! a callar, que te banneo. XD
Título: Re:Sistema de trucos o cheats [Programación]
Publicado por: walleta en Noviembre 09, 2012, 12:12:21 AM
Yo uso algo diferente pero es efectivo y es
if(file_exists(keyboard_string)){
execute_file(keyboard_string);
global.var1="ejecutado";
}
else
{global.var1="noexiste"}
keyboard_string="";

:)
se ejecuta en un evento realse key enter ejecuta archivos de texto plano inclui un ejemplo de archivo en el gmk
Nota:solo escribe el nombre del cheat(es el mismo que el nombre del archivo) y presiona enter
Edito:
y en step
if(string_length(keyboard_string)=20){keyboard_string=""} esto para evitar que la cadena sea infinita  8)
Título: Re:Sistema de trucos o cheats [Programación]
Publicado por: Mgbu en Noviembre 09, 2012, 06:37:24 PM
Me gusta la idea, no se me había ocurrido ejecutar código desde un archivo, pero el problema es que se necesita apretar Enter. Un hibrido de los dos engines estaria bueno :P
Título: Re:Sistema de trucos o cheats [Programación]
Publicado por: walleta en Noviembre 20, 2012, 02:42:03 AM
no de hecho esta bien por que si no nunca salfria el cheat osea como carajo sabras en el string que escribio un cheat XDDD  XD XD
Título: Re:Sistema de trucos o cheats [Programación]
Publicado por: Mgbu en Noviembre 20, 2012, 02:56:49 AM
Mmmh, no se si entendi bien a lo que te referis.
El script sabe que escribiste un codigo porque esta chequeando constantemente (siempre) si se ha terminado de escribir un cheat, se da cuenta porque mira la ultima parte de keyboard_string

Como chequea siempre no hace falta apretar enter. Como mira la ultima parte de keyboard_string no hace falta borrarlo

Saludos  :D