Junio 28, 2014, 03:13:30 PM Ultima modificación: Junio 28, 2014, 04:46:29 PM por DarkKRuleR
Hoolas! Pues bien, en mi juego quiero seguir una mecánica similar a Demon's Souls y Dark Souls: muerte inevitable. Básicamente, la partida se guarda constantemente y tras cada decisión importante, así que si vas a morir no podrás cambiarlo, y la muerte tiene consecuencias, que aún no he decidido, pero no serán buenas :) en Demon's Souls al morir la partida se guardaba, y perdías todo tu "dinero", jodiendo mucho.

Pero aquí es difícil.... ya que basta conque el usuario copie el archivo de guardado y, si muere en un punto clave, lo borre y coloque el anterior...

qué puedo hacer para evitar esto? Que el jugador no pueda tocar, copiar ni borrar los archivos de guardado? Si no puedo toda esta idea se va a la *****, básicamente :(

Por ejemplo, crear y leer el archivo de guardado en una carpeta dentro de system32 o por ahí... pero podría dar problemas de escritura, y si el sistema de archivos cambia de un windows a otro... o ocultar el archivo para que el usuario no pueda borrarlo?

A mí también me interesa saber cómo conseguir que no modifiquen o muevan tu archivo. Sin embargo, ahora no dispongo de mucho tiempo, pero me da curiosidad estas extensiones y dll's que hay en http://www.gmtoolbox.com/

Espero que te sirvan de algo, y en especial ésta de aquí: http://gmc.yoyogames.com/index.php?showtopic=338771 podría servirte, pero no estoy seguro de ello.

Un saludo!  :)

Gracias, pero por lo que veo esa es para evitar hakeos, no que borren el archivo... o que lo muevan de sitio :( iré mirando, a ver si alguien tiene algo claro... porque de nada me sirve implementar autoguardado y penalización por muerte si el usuario puede copiar el archivo de guardado, dejarlo en algún lugar y, cuando muera, borrar el actual y dejar el anterior...

No es algo con lo que yo haya experimentado personalmente, pero usando un hash puedes comprobar la integridad de un archivo. En este caso tomas el hash del archivo guardado y lo guardas por aparte en otro archivo externo, luego cuando se vaya a cargar la partida se revisa si el hash del save que se está cargando es el mismo que el guardado, si no lo es pues el save fue cambiado y ahí tú sabrás que ocurre.

Agrega encriptación para que el usuario promedio no pueda alterar el archivo donde guardas el hash y listo.

Busca las funciones md5_file o sha1_file en el manual.

Cita de: DarkKRuleR en Junio 28, 2014, 03:13:30 PM
Por ejemplo, crear y leer el archivo de guardado en una carpeta dentro de system32 o por ahí...

En GM8.x se podía guardar en cualquier lugar, pero ahora GM:S sólo permite un área de escritura, área que esta predefinida y no se puede cambiar.
http://docs.yoyogames.com/source/dadiospice/002_reference/file%20handling/file%20system%20limits.html

Yo venía a dar una solución parecida a la que propuso Killer, aunque se me había olvidado que GM:S trae funciones para manejar hashes.

Se podría usar una ds_list o ds_map, por ejemplo, para guardar una "huella de tiempo", y esa misma huella de tiempo la guardas en tu archivo de guardado. Se supone que si el usuario hace una "copia de seguridad" del archivo de guardado, esa copia tendría una huella de tiempo anterior o "menor" a la huella de tiempo más reciente, que estaría en la ds_list/ds_map.

También podría guardarse el hash en lugar de la huella de tiempo, con el mismo propósito.

#5 Junio 28, 2014, 07:54:05 PM Ultima modificación: Junio 28, 2014, 08:04:59 PM por DarkKRuleR
Lo que dice Killer.. no sé, la idea es que el usuario no copie el guardado. Es decir, no quiero impedir que modifique el archivo, que es lo que parece que dices tú (se puede? si se puede modificar tan fácil y añadirte nivel 99999 gratis tengo que planteármelo, pero dudo que el usuario haga eso, le quita la gracia al juego...) sino que no quiero se copie el archivo para sustituirlo por el actual mas tarde. Lo de la huella de tiempo suena bien pero no he entendido ná, penumbra dices uqe lo solucionaría?

AUnque yo creo que el usuario no haria trampa tan bestia (le diré un aviso, que si intenta trampas el juego pierde la gracia, y que para eso mejor no juegue), lo de sustituir el savegame es una trampa que no trae remordimientos (no es tan heavy como añadirse 1000 niveles, sino que si tienes un fallo puedes borrarlo, asi que podria plantearse hacerlo, y eso si quiero evitarlo)

En un caso extremo, el usuario guarda el archivo de guardado en un pendrive o en otra carpeta y, si muere, basta con borrar el archivo de guardado actual y sustituirlo por el antiguo. Eso se puede evitar?

Y otra cosa... es fácilmente localizable el archivo de guardado? No he probado con el .exe e instalando el juego, sólo desde el editor de GM, pero no logro encontrar el archivo de guardado, y sé que está por ahí D:


CitarSe podría usar una ds_list o ds_map, por ejemplo, para guardar una "huella de tiempo", y esa misma huella de tiempo la guardas en tu archivo de guardado. Se supone que si el usuario hace una "copia de seguridad" del archivo de guardado, esa copia tendría una huella de tiempo anterior o "menor" a la huella de tiempo más reciente, que estaría en la ds_list/ds_map.

Pero si el usuario borra el archivo y pone y carga el anterior, el programa cargará la huella de tiempo del anterior archivo.. es decir, no se vería la trampa, no? Esa "huella de tiempo más reciente" dónde se guarda? Si se guarda en el mismo archivo solamente no tiene sentido...

empiezo, el juego se guarda en A, lo copio. Luego avanzo y A se sobreescribe en B, y he muerto. Borro B y pongo A, pudiendo cargar antes de morir. Eso se solucionaría?

A lo que yo me refiero es, que con las funciones de fecha y hora de GM, puedes saber la hora, minuto y segundo del último guardado. Mi idea requeriría que guardaras el juego en intervalos cortos de tiempo y/o en puntos cruciales. La hora de guardado más actual la escribirías en una ds_list/ds_map en GM y también por supuesto en el archivo de guardado. Por ejemplo, supongamos que el último guardado marca la hora en 10:15:30 (10 horas, 15 minutos, 30 segundos) y que el usuario "tramposo" usa un guardado con una huella de tiempo de 10:15:00.

Al cargar el archivo de guardado, compararías la huella de tiempo "tramposa" con la más actual (y válida) que está en la ds_list. Como son diferentes, te darías cuenta que el usuario está usando un archivo de guardado anterior. Si por ejemplo, esto pasa, también se podría guardar los datos del juego (los más actuales y válidos) a manera de respaldo en un arreglo, que se usaría para cargar el juego en caso de encontrar la trampa.

#7 Junio 28, 2014, 08:52:41 PM Ultima modificación: Junio 28, 2014, 08:54:56 PM por DarkKRuleR
Sí, mi juego se guarda tras cada decisión importante, y cada 10 segundos cuando el usuario deja de moverse (no quiero que guarde en mitad de un salto por si su PC es un tanto lento y le lague). Pero repito:

Citarsupongamos que el último guardado marca la hora en 10:15:30 y que el usuario "tramposo" usa un guardado con una huella de tiempo de 10:15:00.

la partede "el último guardado marca" es falsa. Yo guardo en 10:15:00, entonces me lo guardo a parte. Luego muero en 10:15:30. Entonces CIERRO EL JUEGO, y lo abro de nuevo USANDO EL ARCHIVO DE 10:15:00. No hay forma de comprobar que es falso, pues la hora de guardado mas reciente no existe... he ahí el problema, sino todo sería fácil :) el usuario puede cerrar el juego y abrirlo de nuevo con sólo el archivo viejo, y ahí no puedes comprobar nada. La partida nueva donde moriste ya no existe, y cerraste el juego donde la estabas jugando. En ningún lado queda información sobre tu muerte en 10:15:30.

Citarl cargar el archivo de guardado, compararías la huella de tiempo "tramposa" con la más actual (y válida) que está en la ds_list. Como son diferentes...

la mas actual y valida NO EXISTE, pues el juego fue cerrado, es ahí donde voy. A menos que guardes a que hora fue el ultimo guardado en otro sitio que el usuario NO PUEDA TOCAR, entonces sí.

PD: a ser posible no quiero meterme con servidores para guardar online (donde no puedes hacer estas trampas), porque no tengo ni servidor, ni idea, y parece muy complicado... aunque si es la única manera...

#8 Junio 28, 2014, 09:40:49 PM Ultima modificación: Junio 28, 2014, 09:47:38 PM por penumbra
Tienes razón, al cargar el juego no hay manera de comprobar la huella de tiempo, sólo funcionaría mientras el juego corre. De momento no se me ocurre una manera de "esconder" el archivo. Porque una cosa es prevenir alterar el archivo (editarlo), pero tú no quieres eso, quieres impedir que el jugador cree una copia para usarla después.

Lo único que se me ocurre es hacerlo en línea, guardar la huella de tiempo en un servidor y leerla al cargar el archivo de guardado. Creo que probaré ese método para mi juego ahora que has indicado la falla de la huella de tiempo local. El problema o complejidad surge en que si hay 100 usuarios jugando, cada usuario debe tener su huella de tiempo guardada en el servidor, pero tampoco es algo difícil de lograr.

¿Se podría ocultar la huella de tiempo en un archivo? Por ejemplo, con las funciones de escritura binaria, guardar la huella en un archivo jpg falso. O si le agregas un archivo "README" a tu juego, guardar en ese archivo la huella de tiempo la hora en una sección, los minutos en otra, los segundos en otra... creo que ya estoy desvariando. ???

Esto se podría hacer en GM8 usando las funciones que accedían al registro, lástima que ya no existen más en GM:S

El método con hash funcionaria ya sea si se cambia algo dentro del save o si el save es completamente otro archivo, el hash comprueba la integridad del archivo y obviamente dos archivos diferentes tendrán dos hashs diferentes.

Y sin recurrir a servidores entonces lo que quieres es técnicamente imposible, no existe ninguna zona en disco donde un usuario con suficiente conocimiento no pueda entrar, ni encripción tan fuerte que no pueda ser rota, inclusive el registro es fácilmente modificable, la pregunta sería hasta donde llegaría el usuario común para hacer trampa en tu juego, y si realmente vale la pena llegar hasta tales alturas para hacerlo. Y sin ánimos de ofender, pero si tú mismo no sabes donde se están guardando los saves quizás te estas preocupando un poco de más.

En videoconsolas y similares no hay de que preocuparse de eso, ahora bien, si tu juego es para PC si que tenemos un serio problema.
Aunque siendo serios, eso que te preocupa es bastante surrealista. Tendría que ser el jugador una persona muy espabilada y con conocimientos de informática para poder hacer trampas.
Ademas, los archivos de guardado en game maker se alojan en sitios bien escondidos, por lo que es riesgo es aun menor.

#11 Junio 28, 2014, 11:52:12 PM Ultima modificación: Junio 28, 2014, 11:53:45 PM por DarkKRuleR
No he probado cómo se vería tras instalarlo, pero por ahora, ejecutando con la flecha verde del proyecto, no veo los saves en la carpeta xD

CitarEl método con hash funcionaria ya sea si se cambia algo dentro del save o si el save es completamente otro archivo, el hash comprueba la integridad del archivo y obviamente dos archivos diferentes tendrán dos hashs diferentes.

Ya, pero el tema es cómo saber cuál de los dos es inválido, cosa que no es posible..

conocéis el LOL? Imaginad que pudiérais coger el archivo con vuestros datos y, si pierdes una partida clasificatoria, reemplazar el archivo con la partida perdida por el anterior en que aún no habías jugado. Eso quiero evitar si el usuario tiene acceso directo a los archivos de guardado.

No me preocuparé en encriptar los archivos porque sé que el usuario no se tomará esas molestias por mi juego, a demás, si lo hace le quita toda la gracia (pondré un mensaje así si hace falta), pero lo de sustituir el archivo es una trampa que "no da remordimientos", ya que no es una trampa en sí, sino que reviertes tu error, así que podría hacerlo, y eso sí quiero evitarlo...

lo de esconder la huella de tiempo en un JPG falso o algo así.. podría funcionar, pero bueno, el usuario podría coger TODAS las imagenes y hacerse la copia igualmente xD pero ahí ya sería desvariar un poco, es una idea posible si se pudiera hacer! Cada vez que guardo el juego, creo un número random que guardo también en otra parte. Y sólo acepta savegames cuyo random es igual al random guardado en otra parte. El usuario no sabrá dónde está ese random, si me lo curro para ocultarlo bien... podría funcionar, porque dudo que se tome ya tantas molestias :) aunque ahora con la limitación de dónde guardar y modificar archivos ando perdido :(

EDITR: a Marth, en serio los archivos de guardado están muy escondidos? Pero cualquiera que sepa de GM podría encontrarlos? hmmm

CitarTendría que ser el jugador una persona muy espabilada y con conocimientos de informática para poder hacer trampas.

copiar y pegar archivos? No tanto D:

Respondiendo a: "¿Marth, en serio los archivos de guardado están muy escondidos? ¿Pero cualquiera que sepa de GM podría encontrarlos?"

Yo no consigo encontrar donde están los archivos de guardado de mi proyecto. Igual tu puedes decirme donde esta y ya podría acceder a ellos, pero si yo conociendo el programa no se donde se guarda se me hace difícil creer que alguien que ignora la existencia del game maker tendrá menos posibilidades que encontrarla. Aunque claro, yo hablo de un programa probado desde el game maker, ¡otro mundo es cuando se trate de un programa ejecutable!

He creado e instalado el .exe, he ido a la ubicación del archivo... está el .exe, una dll. un data.win, license.txt y uninstall... lo he comprobado y el data.win no contiene el archivo de guardado... así que efectivamente, es muy difícil que el usuario encuentre dónde está...

y si sabe game maker podría buscarlo... quizás lo mejor sea no preocuparme. Pondré un mensaje en cierto punto diciendo al usuario "si estás jugando este juego es para pasártelo bien y ser legal. Haciendo trampas, de cualquier tipo, no conseguirás nada", o algo así camuflado, porque dudo que vayan a jugar para hacer trampa, realmente no ganarán nada :)

entonces ya puedo ponerme a pensar en cómo joder al usuario con la muerte, que en mitad de batalla con 10 de vida diga "mierda voy a morirme qué hago ahora", que tenga miedo de morir por las penalizaciones que meta, pero que son parte del juego :D nada de "oh voy a morir, qué pena, venga muere ya que quiero volver al punto de control dos pasos atrás"

#14 Junio 29, 2014, 01:42:23 AM Ultima modificación: Junio 29, 2014, 01:47:22 AM por 7sixerCF
Hola solo quería decir que muchos juegos son vulnerables al susodicho problema, al menos 2 que conozco: INVERSION de Konami en el que formatie el pc y guarde el archivo de salvado de la partida y Deus Ex.
Lo que quiero decir es que a grandes empresas les ocurre esto y dudo mucho que usuarios indie pueden solucionar el problema que presentas.

pero... solo por joder al usuario podrías cada ves que se guarda la partida tu crear tu propio archivo de guardado independiente aparte del que genera GM con algún nombre rebuscado que aleje las sospechas en alguna parte del dispositivo (olvide como se llamaban los archivos en los que puedes guardar información) bueno la cosa es que el archivo que crees solo deberias guardar 1 variable ponte tu la del dinero (la cual deberia ser igual que la que guardo GM de esta manera al iniciar una nueva partida podrías comparar la dicha variable de manera de que si son distintas podrías mostrar un mensaje... o.o