Void Hawk / Goodies

Logo Goodies Pantalla Inicio Pantalla Intro Pantalla Partida en juego Pantalla Game Over
Void Hawk

Descargar Juego Descargar Código Fuente

El juego

VoidHawk es un juego de naves pseudoscroll horizontal, con una gran inclinación arcade, donde van apareciendo diversos enemigos y nuestra nave, la VoidHawk, debe destruirlos.

El sistema de juego está basado en un modo survival infinito donde van apareciendo enemigos de forma aleatoria y nuestro reto es aguantar el máximo tiempo posible.
Entre las características más impresionantes del juego se encuentran:

  • Físicas realistas: Los personajes y sus ataques responden a las leyes de la física como si estuvieran en el mundo real.
  • Los steering behaviors se apoyan en la física para crear efectos de movimiento life-like improvisados.
  • IA Avanzada: Los enemigos son conscientes de ti y de ellos mismos para, por ejemplo, evitar chocarse entre sí. También hay enemigos que usan swarming para que un grupo se comporte como un único individuo.

El jugador: la nave de reconocimiento VoidHawk

Nave

La nave de reconocimiento VoidHawk

El jugador controla a la nave VoidHawk a través del espacio controlado por Omnius, la maligna supermente que tiene cautiva a la princesa.

La VoidHawk, al ser una nave de reconocimiento, sólo dispone de un armamento básico de cañones de rayos, que podemos disparar pulsando la tecla espacio.

Asimismo podemos controlar el movimiento con las teclas de dirección.

Motores

Motores de la nave de reconocimiento

Cuidado: Los sus motores no le permiten cambiar de dirección muy rápidamente por lo que debemos saber conducir contrarrestando la inercia.

Conforme vayamos derribando enemigos iremos subiendo nuestra puntuación, que podremos comprobar cuando la VoidHawk sea volatilizada por el enemigo.

Podemos comprobar la salud de los escudos observado el borde de la pantalla, que irá cambiando de color conforme los escudos se vayan sobrecalentando: el verde indica que los escudos están funcionando al 100%, el amarillo indica que hemos recibido impactos, pero la nave puede continuar su misión y el color rojo indica que los escudos están al borde del colapso y un solo impacto más esparcirá nuestros restos por el hiperespacio.

Los enemigos: Consideraciones

Kamikaze

Los kamikazes son naves autónomas con un cerebro positrónico de nivel 5. Su misión es de reconocimiento y también son usadas para establecer canales de comunicación y replicación de la supermente Omnius.

Kamikaze

Enemigo Kamikaze

El kamikaze no tiene armas, la forma que tiene de destruirte es intentar chocarse contigo cuando te detecta. Es muy rápido aunque tiene poca defensa y es fácil derribarlo. Sus motores no mueven la nave a través del espacio sino que mueven el espacio alrededor de la nave, esto lo hace tremendamente rápido y letal a corta distancia.

Cuando la VoidHawk sea abordada por un enjambre de Kamikazes, lo mejor es plantarles cara o intentar superarlos. Huir no es una opción. Son tremendamente rápidos.

Suelen aparecer en grupos pero bastan unos cuantos impactos de nuestros cañones para convertirlos en polvo espacial para siempre.

Sweeper

Sweeper

Enemigo Sweeper

Estas naves al servicio de la supermente tienen un poderoso generador de plasma llamado Flanger que destruye todo lo que se opone a su paso.

Para disparar el Flanger precisan de un gran espacio vacío delante de los colectores de proa por lo que cuentan con un generador de antigravedad que evita que te acerques demasiado a ellos expulsándote lejos.

Siempre trabajan en escuadras de unas cuantas unidades y sus tripulantes son excelentes estrategas y pilotos. Tienen un sistema de comunicación en tiempo real que les permite mantener una comunicación fluida, aún a largas distancias, por lo que siempre saben dónde colocarse en el espacio para no chocarse entre ellas.

Carrier

El Carrier es la unidad más poderosa y temida de la flota mecánica de Omnius por la gran cantidad de defensa y métodos de ataque de que dispone.

Hay poca información de los Carriers ya que nadie que haya visto uno ha sobrevivido para contarlo, pero gracias a unos informes capturados y descifrados tenemos la siguiente información:

Cada Carrier incorpora una versión recortada de Omnius y siempre va protegida por una guardia de Drones de combate. Su comportamiento es complejo pero pasamos a describirlo brevemente.

CarrierEnemigo Carrier

Cuando entables contacto con un Carrier, intentará derribarte con su Phaser de alta potencia: los drones que lo acompañan se retirarán para dejarle paso pero volverán rápidamente a su posición de defensa. Cuando le queden tres o dos Drones, estos te intentarán derribar con sus cañones de rayos. Cuando le quede un único Drone, el Carrier lo usará para impactarlo contra ti en un último y desesperado intento. Cuando todos los drones sean destruidos, la Carrier empezará a disparar su Phaser de alta potencia a una increíble velocidad ya que no tiene que alimentar a ningún Drone y puede invertir toda su energía en destruirte.

Si eres lo suficientemente buen tirador es posible impactar en el casco del Carrier aun cuando tiene la guardia de Drones intacta. Craso error, todos los drones intentarán chocarte contigo por haber herido a su nave insignia mientras la Carrier llama refuerzos para sustituir esos Drones suicidas.

Características principales

Nuestro juego es espectacular por varias razones:

La primera es la historia. La historia es una amalgama de aspectos de la cultura del videojuego y de la narración más geek que hacen que el jugador se sienta cómodo al integrar detalles que ya conoce y a la vez disfrute de una experiencia totalmente inédita.

Respecto al apartado técnico decir que todos los objetos del juego responden tal y como lo harían en la vida real, es decir que están sujetos a las leyes de la física. Las naves tienen aceleración, deceleración, les afecta la gravedad… Todo ello contribuye a crear una sensación de realismo sin precedentes en Amstrad CPC.

Otro aspecto que hace único a nuestro juego es el comportamiento de los enemigos. Cada tipo de enemigo tiene un comportamiento diferente que se adapta a la situación del juego, creando de esta forma retos inesperados que hacen de cada partida algo increíble y divertido.

Aparte de la calidad técnica, hemos creado un producto que aúna el sabor de los juegos retro con elementos de videojuegos más actuales tales como el modo inmersivo, donde aspectos relacionados con la vida de nuestra nave formen parte del propio juego como elementos activos y no como un elemento creado para el simple propósito de informar al usuario.

Un aspecto a resaltar es la gran capacidad de vicio que tiene el juego. El modo survival, el hecho de que el juego no tiene fin y la dificultad ajustada al detalle hacen que el jugador siempre quiera mejorar su puntuación o aguantar más de forma que está entretenido más tiempo.

En cuanto a las artes gráficas resaltar que todos los sprites han sido creados para la ocasión con la mayor calidad.
Además del contenido artístico creado para el juego, hemos creado todo tipo de soportes gráficos (véase gráficos creados para la presentación, carátula…) que fomentan toda una experiencia de inmersión más allá del juego en sí mismo.

Historia del desarrollo

Idea

Título

Título del juego

Pues estuvimos barajando varias opciones: que si un Zelda… Que si un Metal Slug… Que si un juego de naves…

Hacer un Metal Slug iba a ser demasiado ambicioso y hacer un Zelda, por lo que habíamos oído del resto de grupos, iba a ser hacer más de lo mismo, por lo que al final nos decantamos por ser únicos y decidimos hacer un juego de naves que fuera espectacular.

Pasos de elaboración

Al principio nos tiramos en plancha a escribir código casi sin pensar qué estábamos haciendo. Lo que pretendíamos era calibrar la potencia del CPC y si de paso salía algo guapo, pues apuntarlo para más tarde.

Una vez comprobado que el CPC era poco más que una tostadora, nos pusimos en serio a ver qué podíamos hacer que fuera diferente y quedara bien. Con la ayuda del profesor Retroman decidimos que el eje central del juego serían las físicas, que se basaría en un modo survival y que iba ser el mejor juego para CPC que exista.

Empezamos diseñando la propia VoidHawk y el primer enemigo, el kamikaze. Cuando el kamikaze estuvo funcionando, creamos el siguiente enemigo y así hasta tener el repertorio de enemigos que tenemos.

En algún punto del desarrollo tuvimos que parar y rediseñar todo el código que teníamos para que fuera más óptimo, ya que con el crecimiento que estaba experimentando, se estaba volviendo muy pesado y lento.

El último día de desarrollo estuvimos trabajando a destajo puliendo los detallitos e incluso sopesamos la idea de incluir un multiplayer cooperativo. ¡Y lo hicimos! Pero era demasiado lento.

Tecnologías utilizadas

En CPC por desgracia hay poco donde elegir. Basic quedó rechazado desde el primer momento por su nula capacidad para aprovechar al máximo la potencia de la máquina. Respecto a las librerías usamos la de Raul Simarro, CPCRSLib, y de ella sólo usamos la función de pintar sprites sin máscara, que bien podríamos habernos hecho una nosotros pero por falta de tiempo al final nadie la hizo y como la de Raúl aparentemente funcionaba…

Problemas encontrados y soluciones

Buf… ¿Por dónde empezar?

Uno de los mayores problemas es la limitada capacidad de procesamiento de la máquina. Cada vez que queríamos hacer algo un poco más avanzado la velocidad se resentía, lo que nos ha llevado a tener que optimizar al máximo hasta donde hemos sabido.

Derivado de lo anterior tenemos que el Z80 del CPC no sabe trabajar con floats… Y nuestro juego está basado en físicas realistas… Os podéis imaginar el percal para hacer los efectos…
Para simular las físicas sin floats usamos aritmética de punto fijo lo cual hace que se pierda MUCHA precisión.

Para acelerar la cosa un poco más también redujimos el tamaño de los sprites.

Otro problemón es que la librería de Raúl Simarro hace lo que le sale del topacio con la pila cuando algo toca el registro IX de la máquina, lo cual genera errores aleatorios, que no tienen nada que ver con el código que modificas y que te vuelven loco hasta que lo arreglas sin saber cómo.

Anécdotas del desarrollo

Cpcrslib

Problemas con Cpcrslib

Cuando estábamos probando unas cosillas para optimizar, cambiamos una cosita del código y al probarlo, de repente todo iba muchísimo más rápido, como tres veces más. Aún recuerdo la decepción al ver que iba tan rápido porque el emulador estaba funcionando al 1000% de velocidad.

Otra cosilla es que, como CPCRSLib funciona tan bien, de repente algo que iba dejaba de funcionar y nos volvíamos locos para hacerlo funcionar bien de nuevo, tocabas algo que no tenía nada que ver con el problema y de repente todo volvía a ir bien. Por ejemplo, cuando estuvimos acelerando el movimiento de los drones, de repente se pintaban fuera de la pantalla, creamos una variable para otra cosa y de repente todo volvía a funcionar bien.

También tenemos que decir que durante las pruebas de sonido Fran ejecutó en su portátil un ejemplo de código extraídode CPCManía sobre la música y acto seguido empezó a oler a quemado toda el aula. Eran los altavoces del portátil que estaban on fire. Como resultado, ya no se oyen. Esto es sacrificio señores.

Tiempo de desarrollo

¿Contado en tiempo o en dolores de cabeza? Si contamos en dolores de cabeza… MUCHOS y si contamos en tiempo, también mucho. Desde el principio hemos estado trabajando muy duro y sobre todo hacia el final del desarrollo el esfuerzo fue brutal, incluso damos de lado otros proyectos o exámenes de universidad. Entrábamos a las 9 y salíamos a las 21, y cuando llegábamos a casa el WhatsApp echaba fuego de todas las cosas que discutíamos, ideas nuevas, problemas…

¿Qué aprendimos?

Sobre todo a blasfemar por culpa de todos los problemas sin sentido que hemos tenido.

También hemos aprendido como funciona a fondo un Amstrad CPC, a optimizar un poco los programas, lo que es y a usar los cálculos en coma fija.

En general aunque hemos trabajado y sufrido mucho, también hemos disfrutado con el desarrollo. Hemos aprendido muchas cosas y además estamos contentos con el resultado.

A algunos de nosotros nos ha servido para adentrarnos en el mundo del retro-desarrollo y es posible que veamos algún día una versión de VoidHawk para GameBoy. No os digo ná y os lo digo tó.

Ficha Técnica

Lenguaje utilizado: C
Tamaño en Kbytes: DSK: 204KB, CDT: 59KB
Modo gráfico: Modo 0

Sistemas de Sprites

Para fomentar el efecto de espacio vacío el juego no está basado en tiles por lo que solo los personajes tienen sprites:

SpritesSprites del juego Void Hawk

Todos los contenidos, tanto gráficos como sonoros han sido creados de forma inédita para VoidHawk.

Librerías

La que hemos usado ha sido CPCRSLib, de Raúl Simarro.
De ella se ha utilizado únicamente la función de pintar sprites sin máscara.

IA y modelos utilizados

La IA está basada en steering behaviors, que se aprovecha de la física para generar comportamientos realistas, automáticos e improvisados.

  • Seek: Dirige a un personaje en la dirección correcta calculando la fuerza necesaria para llegar al objetivo.
  • Porsuit: Un personaje intercepta a un objetivo en movimiento prediciendo su posición futura.
  • Path Following: Existe una lista de puntos a visitar y el personaje genera la fuerza necesaria que lo dirige a cada punto en orden.
  • Collision Avoidance: Dirige al personaje de forma que evita los obstáculos que hayan en su camino. Se predice el movimiento futuro y se comprueba si colisionará o no.
  • Swarming: Existe una reina que dirige a sus zánganos y en todo momento los zánganos la obedecen y la protegen.

Instrucciones para compilar

This game uses a modification of the CPCITOR framework to build a .DSK for Amstrad CPC file from sources. For building it you need to do the following steps

Under Windows:

  1. Install Cygwin on your system if you do not have it already installed
    ** Note: for this, a 32bits version of cygwin has been used
  2. Unpack the ZIP file with the code just below your $HOME directory
    *** This will create a $HOME/$GAME folder
  3. Ensure that you have these files UNDER the $HOME/$GAME/tool folder (2)
    *** HEX2BIN 1.0.10:
    **** hex2bin/Hex2bin-1.0.10/hex2bin.exe
    *** IDSK 0.13:
    *** idsk/iDSK.0.13/iDSK/src
    *** SDCC 3.4.0:
    **** sdcc/sdcc-3.4.0.installtree/bin/sdasz80.exe
    **** sdcc/sdcc-3.4.0.installtree/bin/sdcc.exe
    **** sdcc/sdcc-3.4.0.installtree/bin/sdcpp.exe
    **** sdcc/sdcc-3.4.0.installtree/bin/sdldz80.exe
    **** sdcc/sdcc-3.4.0.installtree/share/sdcc/lib/z80/z80.lib
  4. Enter into $HOME/$GAME through your cygwin console
  5. Typein “make”

(2) These files may not have been distributed to you along with the ZIP file: they are external tools whose rights belong solely to their authors. You may download them by downloading HEX2BIN, IDSK and SDCC packs from the Internet. You may need to compile some of them from sources. If you want to get them fast, you may want to have a look to CPCITOR framework, which would get all of them for you.

Leave A Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.