Análisis detallado del desarrollo de 'Mi noche', por el propio autor

Tag: Articulos tecnicos

La idea de "Mi noche"
Cuando me apunté a la Comp tenía en mente una aventura completamente distinta a la que finalmente presenté. Era una historia donde los protagonistas iban a ver a una medium para contactar con el más allá, donde el transcurso de la aventura sucedería por fases o capítulos, donde habría ilustraciones en las escenas más importantes... pero rápidamente me di cuenta de que eso llevaba demasiado tiempo.

"Mi noche" fue una idea feliz que me vino a la cabeza dándole vueltas a la otra aventura. Mi intención era que el jugador se metiera de lleno en el cuerpo de una adolescente, con sus dudas, complejos, preocupaciones, fantasías y sobre todo con sus miedos. Para ello rodeé a la protagonista de personajes arquetípicos de una serie de adolescentes, y también la puse en una situación común en esas edades.

El punto en todo esto para conseguir la inmersión era utilizar lugares (el caserón y el pueblo) y personajes (tu mejor amiga, tu hermana, el chico que te gusta...) con los que el jugador pudiera identificarse con facilidad. ¿Quién no ha ido de pequeño a la casa del pueblo de sus padres a veranear? ¿Quién no ha tenido un amorío de verano que se ha terminado al llegar septiembre? ¿Quién no ha montado una fiesta con sus amigos más cercanos con la esperanza de ligarse a esa persona que le gusta?

Por supuesto después de poner todo en situación faltaba aderezarla con elementos sobrenaturales, el componente del más allá. Para esto de nuevo me valgo de los miedos que todos hemos tenido de pequeños: ir a ese oscuro altillo en la casa del pueblo, tenerte que mover por una casa enorme y vacía cuando se ha ido la luz, despertarte por la noche y tener la sensación de que hay una silueta en la oscuridad...

Una vez tuve esta idea clara, la gracia era cómo darle todo esto al jugador. En este caso comienzo poniendo en escena de forma muy explícita lo sobrenatural, y dejo que el jugador avance y vaya descubriendo poco a poco lo cotidiano, dejando que la historia de Carla se vaya contando con flashbacks y recursos del estilo. También quería que el jugador sintiera la preocupación de quedarse sin fuentes de luz. La indefensión en la aventura (sobre todo al principio) sucede siempre que el jugador apaga la luz, en ese caso aparecen las sombras y pierde la posibilidad de inspeccionar los elementos de la casa. Las fuentes de luz disponibles en el juego se agotan al cabo de un rato, aunque creo que doy tiempo de sobras, de forma que es realmente complicado quedarse completamente a oscuras en una partida.

Siempre tuve claro que quería una aventura que sucediera dentro de una casa, y ese fuera el único escenario. Maniac Mansion es uno de mis juegos favoritos, soy un absoluto fan, y por eso me atrae tanto la idea de hacer que todo suceda en una casa. En la aventura es muy fácil dirigirse a la salida e intentar huir de todo, pero hacerlo supone la muerte. En este caso el recurso está copiado del primer Alone in the Dark, otro juego que me marcó mucho en su momento.

La aventura se puede ganar y se puede perder. Para mi esto es importante. Si estoy haciendo un juego, el jugador tiene que poder morir, y morir debe significar una derrota. Es el reto esencial de la aventura. Por otro lado, no me gusta hacer aventuras muy rebuscadas donde solo un gran experto pueda llegar al final, más bien todo lo contrario. Quiero que sea muy asequible llegar al final, que la dificultad no resulte desalentadora. La dificultad la añado con el sistema de puntuaciones, donde llegar al 5 es algo bastante asequible pero llegar al 10 es realmente complicado. Con esto consigo que una persona que no quede entusiasmada pueda terminar y tener una vista general de la historia sin perder demasiado tiempo, y a la vez darle rejugabilidad para que quien quiera pueda profundizar, encontrar nuevos retos y descubrir pequeños secretos de la historia.

Experiencia con AGE

Desde el aspecto técnico, personalmente solo tenía experiencia con InformATE. No obstante ya en la Última Comp varios usuarios me comentaron que estaba desfasado, así que en esta ocasión decidí buscar otro sistema más nuevo. Me planteé elegir entre tres frameworks distintos: AGE, I7 y fi.js. Elegí AGE por varios motivos: estaba basado en Java (lenguaje que conozco bien), era lo suficientemente potente como para incluir multimedia y tenía un entorno de desarrollo dedicado con muy buena pinta. En I7 vi un lenguaje bastante inusual y me dió la sensación de que me costaría más que los otros aprenderlo. En cuanto a fi.js, he de admitir que aunque la idea es buena personalmente detesto JavaScript, principalmente por la dificultad en la traza de errores del lenguaje.

Una vez elegido AGE me empollé la documentación de la wiki y realicé los correspondientes tutoriales para cogerle el truco a PUCK. Mi primera impresión fue la sorpresa de la gran cantidad de funcionalidades que soportaba el framework, siendo las que más me impresionaron el sistema de peleas, con armas y hechizos, y el sistema de subidas de nivel del tipo juegos RPG. Otra característica que me llamó la atención fue la orientación multijugador del sistema. Esto último me dió la impresión de no estar prácticamente documentado, pero sí muy mencionado en los artículos de la wiki. Mi aventura no usaba ninguna de estas características, así que personalmente poco más puedo decir respecto a ellas.

Una vez inicié el desarrollo de "Mi noche", he de admitir que al principio me costó hacerme con el sistema. El entorno de PUCK me resultó muy amigable, pero cometía muchísimos errores en los scripts. Estos errores se debieron principalmente a fallos sintácticos (lo mismo que me pasaba en InformATE), errores en la gestión de las propiedades de las entidades y errores en el ciclo de ejecución de los distintos eventos que suceden cada turno. Respecto al último punto, encontré muchas diferencias con InformATE que ejecuta su código de forma muy secuencial. En el caso de AGE hay una mezcla entre métodos de las entidades y eventos con las que hay que experimentar para entender bien su funcionamiento.

Otro aspecto importante en el que encontré grandes diferencias con InformATE fue el parser. En este caso personalmente me gustó más el planteamiento de AGE. Para cada instrucción AGE analiza con mucho acierto los componentes importantes y tú solo debes preocuparte de aplicar la funcionalidad correspondiente. De nuevo, es necesario algo de experimentación para ver cómo resuelve los distintos tipos de instrucciones y como enlazarlo con los métodos de cada entidad para responder a esas instrucciones. Este parser me resultó mucho más cómodo que el de InformATE que te obligaba a programar y extender la gramática de cada verbo constantemente, algo que me resultaba muy incómodo y que me generaba muchos errores.

Dejo para lo último lo más importante, y en mi caso uno de los factores clave para elegir AGE, el entorno PUCK. Aunque supuestamente es posible programar una aventura para AGE escribiendo un XML, esto carece de sentido pudiendo utilizar el entorno de desarrollo. Como ya he comentado PUCK tiene una interfaz que me resultó sencilla, práctica y amigable. Su estructura tiene por un lado un mapa de entidades, donde se puede ver en todo momento un diagrama completo y visual de la aventura, que permite seleccionar cualquier elemento para ver su ficha particular. En la ficha es posible editar nombres, descripciones y propiedades de una entidad de forma ordenada y clara. A su vez la ficha contiene un editor de scripts donde programar la lógica de la aventura. Todo esto deja el código muy bien ordenado, resultando muy sencillo y rápido acceder a las distintas partes del código. A pesar de todas estas virtudes, el entorno PUCK también tiene en mi opinión un gran defecto: lo disperso que se encuentra el código. Esta dispersión es un problema si por ejemplo descubres en un momento avanzado del desarrollo que has cometido una falta de ortografía de forma recurrente (por ejemplo, has escrito "vurro" por todas partes). PUCK no te permite hacer búsquedas y reemplazos masivos en el texto, y esto son características que los programadores usamos con frecuencia.

El punto más decepcionante con AGE en mi caso va relacionado con su integración con Java. Funcionando éste sobre la JVM yo entendí que sería sencillo utilizar librerías externas programadas en Java, pero cuando ví el proceso necesario para hacer esto me pareció excesivamente complejo. Tampoco encontré la manera de utilizar elementos clave del lenguaje Java como son la herencia o métodos estáticos, y tuve que resolver esas necesidades utilizando alternativas menos intuitivas, como crear entidades "flotando" en el mundo con métodos de uso general en su apartado de scripts.
También encontré un defecto capital en AGE que ya padecí en InformATE, y es la falta de separación entre las descripciones y el código. Los que estamos acostumbrados a programar aplicaciones de gestión estamos muy acostumbrados a poner todos los textos descriptivos en un diccionario externo para facilitar traducciones y dejar el código limpio. Por ejemplo, una aplicación Android ya te dispone en su estructura de proyecto base un fichero XML donde colocar todos los textos con su correspondiente clave. Resulta extraño que los frameworks destinados a juegos puramente textuales no dispongan de un mecanismo similar. Esto facilitaría enormemente corregir fallos ortográficos, mejorar la calidad de los textos y traducir las aventuras a otros idiomas fácilmente.

Mi conclusión final es que elegí un framework con un gran abanico de funcionalidades de las cuales acabé aprovechando las más simples, las que ya utilicé con InformATE. Tanto el parser como PUCK me resultaron muy cómodos durante la fase de desarrollo de la aventura. La dispersión de los textos no obstante me causó problemas a la hora de corregir errores que los usuarios me pasaron después de probar la aventura.

Futuro de "Mi noche"

Como resultado de la aventura lo único que me he dejado a nivel técnico y me arrepiento es no haberla publicado como una web. El resto de participantes sí lo ha hecho, y creo que a estas alturas es lo más cómodo de cara a atraer a jugadores. También me ha quedado el gusanillo de añadir ilustraciones para algunas escenas, pero soy demasiado lento dibujando.

Esto no significa que no vaya a haber más cambios en "Mi noche" en adelante. Tengo en mente dos actualizaciones importantes: la primera como ya he comentado es hacerla jugable como web, poniéndole una interfaz gráfica más personalizada (ya veremos si con ilustraciones o no, que eso ya son palabras mayores), la otra mejora sería traducirla al inglés ya que me gustaría ver como queda el resultado en ese idioma, si mantiene su encanto o pierde toda la gracia.

Y por supuesto arreglar los problemas de sordera, de eso no me olvido tampoco.

Comentarios

Al-Khwarizmi
Sáb, 18/02/2017 - 23:25

Muy interesante análisis, tanto de la aventura como de AGE, del cual creo que has descrito muy bien las debilidades y fortalezas.

Sobre lo de separar las descripciones del código para facilitar cosas como correcciones y traducciones, es algo que ya me han dicho alguna vez. Ahora mismo esa funcionalidad se puede conseguir sólo a medias, con los ficheros de mensajes por defecto (véase http://www.caad.es/aetheria/doc/doku.php?id=mensajes_por_defecto "cambiar todos los mensajes de una sola vez"). Esto nos permite externalizar los mensajes que se muestran desde el código, pero no cubre por ejemplo las descripciones que se meten directamente en el formulario de PUCK.

Creo que esto se podría mejorar más. Algo que se me ocurre es que haya unos caracteres especiales que se puedan usar también en descripciones y otros textos para mostrar (nombres para mostrar, descripciones de componentes, etc.); y que rodeen a un código de mensaje por defecto. Por ejemplo, que si yo pongo como texto de una descripción: "$$desc.dormitorio$$"", eso signifique que hay que buscar el mensaje "desc.dormitorio" en los ficheros de mensajes por defecto y utilizarlo ahí. Así a ojo creo que no sería muy difícil de implementar, podría hacer que los métodos que escriben cosas por la salida del jugador (write(), etc.) hagan esas sustituciones (tal vez opcionalmente, para no perder eficiencia buscando sustituciones en aventuras que no usen esa funcionalidad). ¿Te parecería un avance o crees que se quedaría corto, y por qué? ¿Alguna otra sugerencia? Un día tenemos que hablar de estas cosas, o también puedes poner sugerencias en el foro.

(c)1998-2015 CAAD

Todos los contenidos de esta web son propiedad de CAAD. Las colaboraciones son propiedad de sus respectivos autores.