|
|||||
Mas To The Past
|
|||||
|
Info sheet (in spanish, as provided by authors)
Historia
Año 2112. Ya han pasado varios años desde la 3º Guerra Mundial que ha dejado totalmente desolado nuestro planeta. Los viajes en el tiempo ya son una realidad, aunque solo están al alcance de unos pocos. Se celebra una cumbre con los principales representantes de cada uno de los países del mundo y en ella se pacta una misión: volver al pasado, antes de la guerra, para intentar evitar el desastre. ¿Y quién es el encargado de volver atrás en el tiempo para salvar el mundo? La persona más poderosa y, por lo tanto, con más influencias para poder intentar evitar el conflicto bélico: el presidente de la potencia mundial del momento, el presidente de la República Catalana, el Sr. MasFly (nuestra intención no es ofender con la temática del juego ya que el principal y único objetivo que persigue es el mero entretenimiento y no buscamos crear ningún tipo de controversia).
El viaje en el tiempo se le complica a nuestro protagonista, quedándose sin combustible (plutonio) y quedando atrapado en dos dimensiones simultáneamente. Su objetivo es por lo tanto recoger una a una las unidades de plutonio que se encuentran esparcidas entre las dos dimensiones y recargar el condensador de fluzo/flujo para poder continuar con su viaje al pasado.
Epílogo
¡El Sr. MasFly ya tiene todo el combustible que necesitaba para salir de aquí! Continúa su viaje sin problemas y evita la guerra usando el diálogo y concienciando a los demás países de las consecuencias desastrosas que podría tener un enfrentamiento armado.
Hora de volver a casa señor presi… Esta vez MasFly se asegura bien de tener el combustible suficiente para regresar al futuro, pero aún teniendo combustible, en esto de los viajes en el tiempo nunca se sabe… ¡Buen viaje héroe!
Personajes del juego
Protagonista (MasFly)
Se encuentra en las dos dimensiones al mismo tiempo. Es controlado con las flechas y dispone de un arma que es disparada con la tecla Espacio. El arma solo puede estar en una dimensión simultáneamente, puede ser cambiada entre dimensiones con Ctrl. Nuestro protagonista (o protagonistas, según se mire) pueden coger objetos con la tecla C (debe de mantener esa tecla durante un segundo aproximadamente mientras se encuentra pegado al objeto). Dispone de 10 puntos de vida que le podrán ser quitados o añadidos dependiendo de si los enemigos le dañan o recoge un botiquín.
Objetos
Plutonio: Es el combustible que necesita el flux para poder seguir avanzando en nuestro viaje en el tiempo. Si uno de estos es destruido perderemos inmediatamente debido a una explosión nuclear.
Condensador o flux: Es un objeto que no puede ser destruido ya que sin él no podremos salir de ese espacio temporal. En él deberemos ir depositando el plutonio para cargarlo y cuando llegue a 1.21 jigovatios pasaremos de nivel (Cada nivel será más difícil cargarlo y se necesitará más plutonio).
Botiquín: Cuando nuestra vida se vea mermada por los enemigos solo tendremos una forma de curarnos y eso se hace cogiendo un botiquín. También puede ser destruido por nuestros enemigos pero sin consecuencias catastróficas.
Enemigos
Arktro: Persigue al jugador y le ataca cuerpo a cuerpo. Si pierde al jugador de vista va hacia la última posición en la cual vió al jugador.
Spaniard: (el ladrón, sin terminar): Éste no irá a atacar a MasFly sino que huirá de él y le irá robando objetos. Dependiendo de lo que él crea que perjudica más a MasFly irá a robarselo. Por ejemplo si MasFly tiene poca vida irá a por un botiquín, sino irá a por plutonio.
Desarrollo
Generación de cavernas
Para generar cavernas aleatorias usamos un autómata celular. El proceso consiste inicialmente en llenar de forma aleatoria una matriz de 0s (huecos) y 1s (paredes). Para generar números aleatorios utilizamos la función de CPCtelera cpct_getRandomUniform_u8_f(u8)
. Para darle forma de caverna a esa disposición desordenada de paredes, volvemos a procesar la matriz quitando las paredes de todas aquellas celdas que tengan menos de 5 paredes vecinas.
El algoritmo implementado en el Amstrad CPC tarda aproximadamente un segundo en ejecutarse, lo cual no supone ningún problema, porque se genera mientras se le indica al usuario qué nivel está a punto de jugar.
Colisiones
La idea del juego era que pudieras ir abriendo pasadizos en las paredes tan personalizados y diferentes que no haya dos iguales. Es por ello que decidimos implementar las colisiones basadas en los colores de fondo. Es decir, un personaje de nuestro juego, ya sea el protagonista o un enemigo, solo podrá moverse por las zonas que tengan un fondo de color negro. De esta forma, cuando llegue a una zona con un sprite que no es de este color no pueda avanzar. Para hacer esto no se comprueban todos los pixels a los que va a dirigirse, únicamente se comprueban unos cuantos píxeles de la frontera del sprite.
IA
Pathfinding: Visto el tiempo que consumía la generación de mapas aleatorios, desde el principio se descartaron algoritmos que hacen uso de colas de prioridad en las que guardan los nodos expandidos más prometedores. El algoritmo usado comprueba si puede llegar al jugador desde las casillas vecinas moviéndose primero en una dimensión y luego en otra (distancia Manhattan). En caso de encontrar varios caminos elegiría el más corto.
Árbol de decisiones: En un inicio planeamos implementar un sistema fuzzy que se encargara de la toma de decisiones, sin embargo, el tiempo consumido (tanto de desarrollo como de cómputo) iba a ser mucho mayor que el de implementar un árbol de decisión, y el resultado sería prácticamente el mismo. El árbol de de decisiones es una IA que toma elecciones dependiendo de una situación dada. Se puede esquematizar fácilmente para poder visualizarlo con más facilidad. A continuación aparece el árbol de decisiones que tiene el enemigo Spaniard:
Máquinas de estados: Las máquinas de estado son utilizadas por los enemigos para facilitar la organización del código y poder dividir en distintas partes la IA.
Licencia
GNU General Public License, Versión 3. El código fuente se encuentra adjunto a esta memoria.
Anécdotas
Si coges el logo del juego (o el de la película Back to the future) y le subes el contraste al máximo tienes como resultado la bandera de España y no la catalana.
Durante la implementación del comportamiento de los enemigos hemos inventado numerosos algoritmos de EA (Estupidez Artificial). Quedarse quieto era la mayoría de las veces más inteligente que hacer caso a esos algoritmos.
Los mensajes de los commits del repositorio git se encuentran en 3 idiomas: español, inglés e inglés inventao.
Durante el desarrollo del juego inventamos y pusimos en práctica varias veces una técnica de programación llamada Epic Programming. Consiste en programar escuchando la banda sonora original de la película de El Señor de los Anillos.
¿Qué hemos aprendido?
Hemos aprendido a crear juegos relativamente sencillos para un Amstrad CPC utilizando la librería CPCtelera. Durante el desarrollo hemos tenido que tener muy en cuenta el uso de memoria, cosa a la que hoy en día no estamos tan acostumbrados.
Hemos experimentado lo engorroso que puede llegar a ser programar esas máquinas en comparación con las modernas (y más aún si se hiciera sin ayuda de librerías).
Bibliografía y agradecimientos
- CPCtelera: Librería para el desarrollo de juegos en Amstrad CPC 464.
- Retro Game Asset Studio (RGAS): Para la creación de sprites o la conversión de una imagen a estos.
- Arkos Tracker: Creación de archivos de sonido que finalmente no han sido utilizados en el juego por falta de tiempo.
- CDT2WAV: Para convertir en archivo CDT en un wav para ejecutarlo en el Amstrad CPC 464.
- WinAPE: Para la simulación del Amstrad CPC 464.
- El algoritmo usado para la generación de cavernas aleatorias fue inspirado en:
http://www.roguebasin.com/index.php?title=Cellular_Automata_Method_for_Generating_Random_CaveLike_Levels - Mucha información sobre asm para Z80 aquí: http://sgate.emt.bme.hu/patai/publications/z80guide/
- Tabla de instrucciones de un Z80: http://clrhome.org/table/
- Mapa de memoria de vídeo de un Amstrad CPC: http://www.cpcmania.com/Docs/Programming/Painting_pixels_introduction_to_video_memory.htm
- Juegos de otros años (código fuente incluído): http://cpcretrodev.byterealms.com/contest/
- Curso de Nacho Cabanes: http://www.nachocabanes.com/amstrad/curso/
- Información sobre cosas de CPC que nos ha resultado útil en algún momento del desarrollo: http://www.cpcwiki.eu/