elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Ingeniería Inversa (Moderadores: karmany, .:UND3R:., MCKSys Argentina)
| | |-+  Introducción a Game Hacking en Game Boy con GameShark
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Introducción a Game Hacking en Game Boy con GameShark  (Leído 4,033 veces)
Ephedra

Desconectado Desconectado

Mensajes: 4



Ver Perfil
Introducción a Game Hacking en Game Boy con GameShark
« en: 16 Mayo 2024, 00:52 am »

Hola a todos, tras algunos años de ausencia he decidido volver al foro (https://foro.elhacker.net/foro_libre/presentacion-t521505.0.html;msg2278764#msg2278764), y qué mejor manera de hacerlo que ensuciándonos un poco las manos destripando cartuchos de Game Boy.

En este thread voy a compartirles un proyecto didáctico en el que estuve trabajando para explicar las bases de Game Hacking a usuarios que se acercaban al tema por primera vez.


Introducción

Seguramente muchos de ustedes ya han experimentado en su época con Cheat Engine, o incluso habrán llegado a conocer los llamados "game enhancers" como Game Genie o Game Shark. Algunos venían en formato CD (Game Shark para PSX) y otros eran un dispositivo de hardware dedicado que interconectaba la consola con el cartucho que quisieramos "mejorar" (Game Shark para Game Boy).

Estos "mejoradores" de juegos nos permitían activar "cheats" o "trucos" de una forma simple y efectiva: modificando los valores almacenados en memoria (ya sea una sola vez, por ejemplo para agregarnos dinero o items; o permanentemente evitando su modificación, por ejemplo para evitar perder puntos de salud y ser inmortales).

Acá les dejo una foto del mío, un GameShark para Game Boy que apareció en Uruguay sellado y con sus plásticos originales.







Hoy en día los propios emuladores traen plugins para cumplir la función de un GameShark (o Game Genie), por lo que decidí programar un cartucho de pruebas para - como mencioné al principio - poder explicar de forma virtual y simple los conceptos básicos de game hacking para cualquier interesado, y evitar que se pierda esta hermosa costumbre de destripar cosas para aprender cómo funcionan.


Game hacking en Game Boy

Como este proyecto apunta mayormente a la manipulación de registros de memoria (el "qué" - contenido - y el "dónde" - posición de memoria) no vi una necesidad imperiosa de incursionar en frameworks de desarrollo como gbdk o GBASM (el "cómo", en este caso), por lo que decidí utilizar GBStudio para ahorrar tiempo (y salud mental). Llamé a este proyecto "DVHR" (Damn Vulnerable Hack Rom), y decidí agregarle varios sprites para que sea tan didáctico como fuese posible. La emulación fue hecha con VisualBoyAdvance, el cual trae integrado un emulador de Game Shark.

El cartucho representa el viaje de un personaje desconocido por tres escenarios (desafíos) hasta llegar a reunirse con otros personajes desconocidos. La idea de esta premisa tan genérica es poder adaptar la narrativa a cualquier público que esté siguiendo el tutorial.



El primer escenario representa un problema clásico para toda aventura: la necesidad de fondos para emprenderla. Si miramos los indicadores superiores en la siguiente captura, veremos que nuestra bolsa está vacía (valor "0") y de no solucionar este inconveniente, no podemos avanzar al siguiente escenario.



En la esquina inferior izquierda el cartucho nos sopla la solución: 0101 98CB ¿pero qué significa esta cadena?

Este es un código Game Shark, a grandes rasgos:

0101 representa un valor.

98CB representa una posición de memoria.

Este código colocará los valores "0101" en la posición "98CB". Si espiaramos esa posición de la memoria en el cartucho en ese preciso momento, veríamos que el valor es "0". Esa posición está guardando el valor de nuestro dinero, por lo cual modificarla nos permitirá "mejorar" nuestra experiencia de juego.



Utilizando el plugin de Game Shark de VisualBoyAdvance podemos ingresar este "cheat" e incluso guardarlo con un nombre amigable (como en los Game Shark originales).

Al colocar este código el juego dará por concluído el desafío y nos llevará al siguiente escenario, donde un Goblin nos cortará el paso.



Para resolver este escenario deberemos modificar dos registros, uno donde se almacena el "Escudo" (y colocarlo en 1) y otro donde se almacenan los puntos de Salud del Goblin (colocándolos en 0 para... "mejorar" nuestra experiencia de juego).

Nuevamente el juego nos sopla dos cadenas, que nos ayudarán a entender mejor la estructura de los códigos Game Shark:

0101 9ACB: Colocar el valor "0101" en la posición "9ACB".

0100 9CCB: Colocar el valor "0100" en la posición "9CCB".

De acá podemos inducir dos cosas importantes (de nuevo, a muy grandes rasgos):

- Del primer sector de la cadena (los primeros 4 dígitos), los últimos dos son los que modifican el valor de las variables. En el primer caso vamos a colocar el valor en "01" (Escudo) y en el segundo en "00" (HP del Goblin), a pesar que ambos empiezan por "01".

- Hasta ahora, todas las posiciones de memoria que estamos modificando terminan en "CB", por lo que si bien no son contiguas, comparten un espacio acotado y relativamente cercano. Esto también podemos saberlo leyendo los documentos técnicos sobre manejo de memoria de la consola y la documentación de los MBC (Memory Bank Controllers). Pero un recién interesado en el tema claramente no disfrutará haciéndolo.

Agregando estos dos códigos nos haremos con un nuevo escudo, una piel de Goblin y un nuevo desafío. O mejor dicho... dos.



Esta vez tenemos dos enemigos que nos cortan el paso: una Serpiente y un Murciélago, pero ya no hay soluciones disponibles. Al parecer, los puntos de Salud (HP) de la Serpiente oscilan entre 2 y 4 (y tenemos que bajarlos a 0) y los del Murciélago oscilan entre 6 y 8 (y claramente, también hay que bajarlos a 0).

Tenemos la siguiente estructura de códigos:

0100 ??CB: Colocar el valor "0100" en la posición "??CB".

0100 ??CB: Colocar el valor "0100" en la posición "??CB".

Sabemos que hay que colocar en "00" dos valores ubicados en la misma "vecindad" (espacio) de memoria donde vinimos trabajando hasta el momento. Parece que se nos ha agotado la suerte pero no, es hora de aprender a buscar cheats como en la vieja escuela... rompiendo.

Un feature que tenían los Game Sharks (no todos, sino algunas versiones) es la capacidad de "buscar" trucos... ¿cómo funciona? buscando un valor específico a lo largo de la memoria y siguiendo eventuales cambios para aislar e identificar posibles posiciones de memoria de interés.

En palabras más simples, supongamos que nuestro personaje tiene un valor específico de "Oro", por ejemplo, 151. Mapeamos el valor 151 y nuestro "mejorador" de juegos va a darle seguimiento, dándonos una lista de todas las posiciones de memoria del juego que estén guardando ese valor (que podrían ser muchísimas). Gastamos 1 de Oro y el valor ya no es 151, sino 150. Ahora no buscamos "qué posición tiene en este momento el valor 150", sino "qué posición tiene en este momento el valor 150 y anteriormente tenía el valor 151". Esto desencadena un proceso de eliminación que nos irá arrojando cada vez menos candidatos hasta identificar la posición específica que queremos manipular. Una suerte de "Adivina quién" pero con un depurador.

El "Game Shark" integrado en la mayoría de los emuladores permite este comportamiento, así que vamos a buscar valores de interés. Comencemos por el valor "techo" del HP de la Serpiente: 4.



Aparentemente, ninguna posición de memoria está guardando ese valor, por lo que sabemos que no es el que estamos buscando. Repitamos el proceso para el valor "techo" del HP del Murciélago: 8.



Bingo, encontramos varios candidatos y uno está en la vecindad que buscamos ("CB").

Acá es donde varios habrán notado algo extraño: la notación de la dirección de memoria está "al revés" ("CB" está primero que "A0"). Esta diferencia en la notación es común, a veces ciertas instrucciones o direcciones se representarán "al revés" según el programa (o plug-in) que estmos utilizando. Los que en algún momento de sus carreras hayan usado debug.exe en Windows para programar en ASM sabrán a lo que me refiero.

Vamos a colocar ese valor en "0", y continuamos repitiendo el proceso con los demás valores (2 y 3 para la Serpiente) hasta aislar las posiciones de memoria sospechosas.



Acá es donde viene útil una advertencia amistosa: cuando estén buscando cheats o manipulando la memoria de un programa en general, es muy común que a veces identifiquemos mal una dirección, alteremos su valor y suframos consecuencias inesperadas. En los cartuchos de Game Boy el peor escenario posible es un Kernel Panic, nada que no se resuelva reiniciando la consola o el emulador. Pero es ideal tener sumo cuidado cuando se manipula la memoria de algún otro proceso "más serio" que no esté aislado por un emulador ni sea un simple juego didáctico.

Ejemplo de un Kernel Panic en Game Boy:



Una vez que aislamos las posiciones de memoria sospechosas y cambiamos los valores necesarios, lograremos resolver el desafío.



Si prestan atención verán debajo la solución del mismo. Si prestan aún más atención, verán que el cheat resaltado en el Game Shark no se corresponde a esas soluciones, sino que fue un error de mi parte al intentar aislar e identificar la posición de memoria (y afortunadamente, no causó un Panic).



Finalmente nuestro personaje llegó al final de su aventura (sea cual sea su objetivo) y pudimos explicar de forma didáctica una introducción básica a cómo funciona el Game Hacking de la vieja escuela.


Outro

Espero que el hilo no se haya hecho tedioso ni extenso. Desde ya es un gusto estar de vuelta con ustedes, y cualquier crítica constructiva siempre es bien recibida.

Espero que les haya gustado, nos vemos en la próxima.


Referencias y links de interés
- Tweet con las fotos originales: https://twitter.com/MauroEldritch/status/1591444536152449024
- Una historia de cartuchos piratas: https://twitter.com/MauroEldritch/status/1740129623814414704
- Descargar una copia de DVHR: https://mega.nz/file/Jc0kTITD#v8PQbbZojCN1yuoPhtFqoQ9HxLyHb6CH4IyUjuUEO9I
- GBStudio: https://www.gbstudio.dev/es/
- VisualBoy: https://visualboyadvance.org/

Ningún Goblin fue lastimado durante la producción de este artículo.
En línea

Hot Metal & Methedrine
Tachikomaia


Conectado Conectado

Mensajes: 1.460


Hackentifiko!


Ver Perfil
Re: Introducción a Game Hacking en Game Boy con GameShark
« Respuesta #1 en: 16 Mayo 2024, 02:38 am »

Nunca entendí el buscador de cheats en cuanto a "old value", "greater than", etc, pero no es tan necesario, simplemente buscas un valor, introduces los cheats que te aparecen, a cada uno poniéndole distinto valor, y así se ve cual es. Conviene salvar los cheats antes por las dudas, si el juego se tranca desactivas la mitad y vas desactivando cada vez menos hasta hallar el buscado.

Antes usaba No$Gb o algo así, un emulador de DOS o algo similar, que no sé si traía buscador, yo simplemente probaba de todo, metía como 16 cheats a ver si cambiaba algo, y sí llegué a encontrar mucho. Incluso teniendo Internet, no siempre se encuentra lo que uno busca en Internet.

Luego está el memory viewer o algo así que me ayudó a hallar parámetros que no se muestran en el juego, por ejemplo la fuerza de Mario en Mario Tennis GB. Pero no recuerdo mucho de eso, sólo lo usé en eso, creo que aparecen los nombres y todo claro. También hay parámetros que uno no se imagina que existen, como el alcance de los jugadores. Puedes hacer que tu compañero sólo pueda hacer saques por ejemplo, es útil si quieres jugar contra 2 sin un compañero, es como si no existiera (pero debes activarlo cuando deba devolver saques... o perder esos games). Esos sólo los puedes hallar probando códigos como loco, no se muestran esos números, y en Internet me parece que no están. Tenerlos en el bloc de notas y usar Reemplazar ahorra algo de tiempo. A veces no basta con cambiar las direcciones, hay que probar las mismas con distintos valores.

Pero hay juegos en que es más complicado, no parece haber un código para modificar algo, es como que a veces funciona y a veces no, se requiere más de uno, no sé. Eso me pareció con el Pokemon Leaf Green en cuanto a qué Pokemon salvaje aparece. Por supuesto si buscas en Internet encuentras, pero según recuerdo vienen con un código clave o no es gameshark, es más raro...
Tengo un problema así con Tsubasa 2 de NES, mira, uno pone por ejemplo esto:
036C-01-23
Y ahora uno de los jugadores tuyo es otro, pero sus stats varían mientras juegas, te pueden aparecer unos similares a los de Tsubasa, o todo 8, o los suyos reales, u otros... es un lío. No intenté arreglarlo aún ¿por casualidad sabes cómo? Uf ¿y sabes cómo ver la experiencia de los jugadores? No me refiero al LV, sino al parámetro que no se muestra en el juego, supuestamente existe. Tampoco lo busqué mucho por mi cuenta, lo más parecido que vi es un video donde se muestra un número pero no se sabe si es real y no se explica si cada vez aumenta más lento o la cantidad requerida para el LV Up aumenta, es un misterio, en guías que vi no se dice.

También me gustaría que me dijeras las fórmulas matemáticas o lo que sea que se use al realizar los tiros en Mario Tennis GB.

Ah, otra cosa que me acordé: Hacer que el juego crea que ciertas cosas ocurrieron o no ¿sabés algo de eso? Por ejemplo en Seiken Denketsu 3 (SNES) empezar desde que se rompieron los cristales ¿por qué? Quiero probar distintos personajes, stats y clases sin jugar desde el inicio cada vez... Vi un código para cambiar los personajes, etc, pero igual me gustaría poder cambiar el momento del juego, sino se puede bugear (imagina que jugué con la historia de Duran y de repente lo cambio...).
« Última modificación: 16 Mayo 2024, 03:22 am por Tachikomaia » En línea

Ephedra

Desconectado Desconectado

Mensajes: 4



Ver Perfil
Re: Introducción a Game Hacking en Game Boy con GameShark
« Respuesta #2 en: 16 Mayo 2024, 15:02 pm »

¿Cómo estás Tachikomaia? Gracias por comentar!

El filtro de "old value" es justo el que doy como ejemplo acá cuando digo "busquemos una posición de memoria que tenga el valor 150 pero antes tenía valor 151" (ahí está el old value, 151). Los demás filtros aplican distintas lógicas para ayudarte a aislar esa posición.

Yo hacía eso mismo que mencionas en Final Fantasy Tactics y Resident Evil 2 (PSX), había situaciones donde muchos cheats "chocaban" entre sí y rompían todo, y entonces desactivaba gradualmente hasta que funcione  ;D

Buenísimo análisis de Mario Tennis, recuerdo haberlo jugado (pero no hackeado) para Game Boy, así que era una versión ultra básica aunque sí contaba con medidores de fuerza y un doble como tú dices. Lo del bloc de notas lo hacía también con algunos Sharks como el de PSX (que venía en CD) porque no tenía más espacio en la Memory Card (y era una época de crisis como para ir a comprar una extra  :-[ ).

En los juegos "más complicados" pasa eso que mencionas, a veces se require más de un código y hay varios motivos:

- Hay varios sectores de memoria que componen el valor que queremos modificar.

- Hay un sector "testigo" - como un token canario - que guarda una copia de un valor específico y se va modificando a la par que el original. Si hay una diferencia inesperada entre los valores, se considera el del canario como válido y se "arregla" la diferencia reestableciendo el valor desde ahí. Esto lo puedes ver en juegos donde modificas por ejemplo el dinero, y este hace un "flash update" (lo ves actualizarse y de golpe volver al valor anterior en menos de un segundo).

- Existen barreras lógicas que monitorean que el valor esté en un rango esperado. Aunque la posición de memoria soporte el valor que estás expresando, una rutina de control podría decir "momento, no está bien que tengas este item/dinero/stat en este punto (o no está bien que lo tengas en ningún momento)" y le aplica una corrección.

- Podría ser que el juego en cuestión utilice alguna aleatorización de direcciones/espacio de memoria y por eso a veces los códigos funcionen y otras veces no (en las consolas sobre las que hago esto que son viejitas nunca lo he visto, pero quizás alguien pueda darnos más contexto en máquinas más modernas).

Para la consulta de Tsubasa no lo he visto en detalle pero es una buena pregunta, si funciona como un stat oculto suele ser bastante engorroso aislarlo (porque muchas veces también lo calculas a ciegas). Me pasaba en ciertos RPG con stats ocultas como "lealtad" / "amistad" (que no te avisaban tampoco cuando un personaje subía o bajaba el stat, ni te mostraba el valor exacto). Encontrarlo era difícil incluso usando los filtros: "debe ser un stat que subió porque la pelea salió bien"... si, pero la EXP y otros stats subieron también... y había 8 personajes en el tablero... si hacemos algunas multiplicaciones de stats * personajes...  :huh: (como decís, es un misterio a veces).

Lo de las fórmulas de Mario Tennis de momento te la debo, no lo sé honestamente  :( pero me lo llevo de tarea, porque está dentro de las consolas donde suelo destripar cartuchos  :laugh: .

Esa última pregunta es buenísima porque es algo muy común de encontrar y te obliga a ejercitar mucho la lógica. En términos de programación para que una condición se cumpla pueden haber escenarios tan simples como complejos. Vamos a tomar el caso que me dices sobre los cristales que se rompieron (no jugué ese juego pero para el caso sirve):

Puede ser algo tan sencillo como que el programador haya hecho algo así:

Código:
#Código Ruby para simpleza
#Se rompieron los cristales (Con un Booleano)
$evento_cristales_rotos = true

O también

Código:
#Código Ruby para simpleza
#Se rompieron los cristales (Con un Flag, que a efectos prácticos es lo mismo)
$evento_cristales_rotos = 1

Y esto se traduciría en nuestro depurador como un cambio en una variable que pasó de "00" (0 o "falso") a "01" (1 o "verdadero"). Este es el tipo de caso sencillo que exploto en el cartucho del thread, una simple variable fácil de aislar. Cambiar este valor marcaría el evento como hecho.

Pero también existe la posibilidad que el programador haga algo como esto:

(recuerda que no jugué ese juego y estoy inventando condiciones para este ejemplo)

Código:
#Código Ruby para simpleza
#Jugador entró en la zona del evento
$evento_jugador_en_zona = true

#Jugador tiene los items necesarios para disparar el evento ($jugador_items es un array)
if $jugador_items.include? 'Crystal Breaker'
    $evento_jugador_tiene_item = true
end

#Jugador tiene el nivel necesario para disparar el evento
if $jugador_nivel? >= 15
    $evento_jugador_tiene_nivel = true
end

#Jugador habló con el NPC necesario para disparar el evento
if $jugador_interactuar_npc == true
    $evento_jugador_hablo_npc = true
end

#Podemos romper los cristales
if ($evento_jugador_en_zona == true) && ($evento_jugador_hablo_npc = true) && ($evento_jugador_tiene_nivel = true) && ($evento_jugador_tiene_item = true)
    evento_romper_cristales()
end

Puede ser que este cambio de escenario sea disparado tras monitorear varios aspectos (variables) y no sea fácil aislarlo. Quizás el evento nunca sea realmente marcado en la memoria como que "ocurrió", por ejemplo en GameBoy se puede usar el cambio de escena que inicia como el nombre indica un nuevo escenario. En el cartucho de ejemplo nunca marco "se dispara el escenario 3", sino "se cumplieron ambas condiciones del escenario 2, ejecuta un cambio de escena" (como en el último ejemplo que invocamos la función evento_romper_cristales()). Esa función puede no retornar ni escribir un valor, y su paso por la máquina no nos deja un registro claro, más allá de que el escenario avance.

Exactamente esto me pasó con The Dark Eye (https://en.wikipedia.org/wiki/The_Dark_Eye_(video_game)) donde logré dar por completados algunos escenarios pero olvidé marcar otras condiciones que ocurren a medio camino, quedándome soft-locked, y es común que te suceda en juegos que requieren muchos items y condiciones para progresar como las sagas Resident Evil, quizás logres bypassear una puerta molesta, pero en el trayecto para descubrir lo que la abre levantarías un item que te serviría más adelante (y que ahora no tienes por haber bypasseado).

Es mucho prueba y error. Ojalá te haya dado algunas ideas para intentar destripar esos juegos un poco más. Te dejo un abrazo y gracias por comentar.

« Última modificación: 16 Mayo 2024, 15:05 pm por Ephedra » En línea

Hot Metal & Methedrine
Tachikomaia


Conectado Conectado

Mensajes: 1.460


Hackentifiko!


Ver Perfil
Re: Introducción a Game Hacking en Game Boy con GameShark
« Respuesta #3 en: 16 Mayo 2024, 21:27 pm »

Buena info.

Te digo un ejemplo de "greater than":

- Cargo una partida de Castlevania Aria of Sorrow (GBA) en que tengo LV6.
- Pongo Search for cheats.
- Pongo Specific Value, Equal, Signed, 8 bits, Update values, escribo 6, pongo Start, y luego Search.
- Me aparecen muchas direcciones de memoria.
- Cargo una partida en que tengo LV10.
- Algunos valores cambiaron a 10, otros aumentaron, otros bajaron, otros siguen siendo 6:

- Pongo Old Value, Less than, y me quedaron los valores más bajos.

Es que entrevera eso, porque yo digo el Old value (6) is less than the new (10), pero parece que hay que pensar poniendo el New primero.
Otra cosa que me ha quitado las ganas de probar cuando lo intenté es que el Start borra todo, y no se entiende bien para qué existe, o sea, si está activado lo de Update values (que debería) entonces no tiene mucho sentido que uno deba presionar Start antes, debería ser "escribir valor, presionar Search", no "Start, luego Search". Pero cuando se busca el Old value no hay que presionar Start, sino todo se borra. Pues eso, por eso nunca lo aprendí, no le veo mucho sentido a cómo está hecho.


Si se pudieron hacer emuladores ¿por qué no se pueden hacer traductores del código, convertirlo a algo más o menos legible? Me gustaría que hubiera eso, quizá algún día las IAs puedan...
En línea

Ephedra

Desconectado Desconectado

Mensajes: 4



Ver Perfil
Re: Introducción a Game Hacking en Game Boy con GameShark
« Respuesta #4 en: 17 Mayo 2024, 14:16 pm »

Hola!

Claro, cuando cargas una partida tienes dos posibilidades:

- Si lo haces desde el emulador (cargando el savefile como un quicksave) estás cargando un "state" (estado general) del cartucho en un momento dado, incluyendo los valores de la memoria. Esto claramente sobreescribe cualquier código que tengas activado. Lo interesante es que si activas un truco y haces un quicksave, como este es en realidad una modificación de la memoria queda almacenado cuando vuelvas a cargarlo.

- Si lo haces desde el juego (con el menú correspondiente) podrías disparar una rutina que "normalice" (limpie) todos los valores primero y luego coloque los de tu partida. Eso explicaría por qué no funciona.

En tu caso estás cargando dos partidas diferentes, dudo que funcione. Intenta cazar trucos en una misma partida ya sea nueva o cargada desde el menú contextual del juego y no con save-states, quicksaves u otras opciones del emulador.

Saludos!

En línea

Hot Metal & Methedrine
Tachikomaia


Conectado Conectado

Mensajes: 1.460


Hackentifiko!


Ver Perfil
Re: Introducción a Game Hacking en Game Boy con GameShark
« Respuesta #5 en: 18 Mayo 2024, 00:33 am »

Creo que eso es otro tema.

Como el juego es el mismo, las direcciones de memoria son las mismas, creo.

Luego de que halló direcciones con el o valores especificados, cuando se busca OLD valúe con Less than sólo quedarán los valores que ahora son más bajos que el OLD.

Yo lo que digo es que me entrevera la interfase de eso, porque OLD está en la izquierda y NEW en la derecha, así que si pongo "Less than" para mí suena dejar las direcciones en que OLD is less than NEW", pero parece que es: "Dejar los valores NEW si son less than OLD".

No sé, son interpretaciones mías, al no haber botón undo tampoco es tan cómodo probar bien cómo funciona.

Todo eso sirve para descartar cosas más rápido y así reducir también la posibilidad de pomner un código que tranque el juego, pero como dije en mis épocas de más vicio probaba todo y ya, no es tan importante usarlo.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Game boy pasó de moda...GAME MAN !
Juegos y Consolas
skapunky 3 4,221 Último mensaje 28 Junio 2007, 13:57 pm
por peib0l
[Batch Game] Adventure Game - by SmartGenius
Scripting
SmartGenius 0 3,416 Último mensaje 17 Julio 2009, 06:15 am
por SmartGenius
[Batch Game] The Pair Game - by SmartGenius
Scripting
SmartGenius 5 6,016 Último mensaje 10 Agosto 2010, 23:36 pm
por DA KILLER
[Game-Hacking] Se necesita experto [PAGO]
Hacking
-ElApreNDiz!- 4 5,849 Último mensaje 21 Junio 2011, 15:53 pm
por n0more
The Game Awards: Game Of The Year y otros ganadores
Noticias
wolfbcn 0 1,145 Último mensaje 8 Diciembre 2018, 14:01 pm
por wolfbcn
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines