Archivo de la etiqueta: Anima

Anima: UNICO – Crowdfunding en camino

Como habréis podido notar, este último mes el ritmo de actualización de Anima: UNICO ha bajado bastante. Es lo que tienen los hobbys: les toca el último puesto en la fila de prioridades. Y me gustaría que Anima: UNICO ganara posiciones. Para eso, necesito ascenderlo de «hobby» a «trabajo». Y hoy en día, eso significa ¡CROWDFUNDING!

En breve (me faltan algunas piezas para terminar de montarla) lanzaré una campaña de crowdfunding en IndieGoGo para intentar poder acelerar el desarrollo de Anima: UNICO y, en caso de que vaya muy bien, aumentarlo.

Me encantaría escuchar vuestras opiniones y sugerencias.

Making of Anima: UNICO – Localización

Aquí estoy de nuevo. Hoy voy a hablar de un punto peliagudo: la localización, es decir, la traducción y paso a otros idiomas de la aplicación. Esto presenta varios problemas iniciales:

No puedo limitarme a traducir cada término: tengo que usar las equivalencias de las distintas ediciones internacionales. Por suerte, cuento con la ayuda de varios voluntarios (Vincent «Moklo» Bouscarle, corrector de la edición francesa de Anima, está traduciéndola al francés; Andrew «Dynaes» Reich, del foro inglés, está traduciéndola al inglés). De nuevo, muchas gracias a ambos. 

Como ya he mencionado, tengo básicamente tres capas en Anima: UNICO. La capa de modelo se encarga de organizar la información. El modelo de Personaje, por ejemplo, sabe almacenar el nombre, las habilidades, sabe cómo subir de nivel, etc. La capa de Controlador conoce los modelos y las vistas y gestiona toda la lógica general de la aplicación. Por ejemplo, el Controlador de artes marciales sabe cuánto le costará a un personaje en concreto un arte marcial en concreto, y qué datos necesitará una Vista para que el usuario pueda elegir un arte marcial. La capa de Vista recibe datos del Controlador y muestra lo que el usuario ve en la pantalla. Sólo para la Vista tiene sentido la localización.

Mi solución

function setIdiomaUI() {
   var lang = navigator.language || navigator.userLanguage;
   
   if ((lang.lastIndexOf("es") != -1) || (lang.lastIndexOf("spa") != -1)) {
      IDIOMA_UI = SPA;
   } else {
      IDIOMA_UI = ENG;
   }
}
function L(id, spa, eng) {
   this.id = id;
   this[SPA] = spa;
   this[ENG] = eng;
   if (!diccionario["ANIMAUNICO_"+this.id]) {
      diccionario["ANIMAUNICO_"+this.id] = this;
   } else {
      console.log("Clave de diccionario repetida: [" + this.id + " / " + this[SPA] + " / " + this[ENG] + "]");
      console.log("--Clave previa: [" + diccionario["ANIMAUNICO_"+this.id].id + " / " + diccionario["ANIMAUNICO_"+this.id][SPA] + " / " + diccionario["ANIMAUNICO_"+this.id][ENG] + "]");
   }
}
L.prototype = {
   constructor: L,
   toString : function() {
      return this[IDIOMA_UI];
   },
   getId : function() {
      return this.id;
   }
};
function _l(clave) {
   if (diccionario["ANIMAUNICO_"+clave]) {
      return diccionario["ANIMAUNICO_"+clave].toString();
   } else {
      return clave;
   }
}

Explicando un poco: creo una clase, L, que tendrá como instancias cada cadena a localizar y sus localizaciones. Además, tengo una función, _l, que recibe el identificador de una cadena y devuelve su localización al idioma actual. Internamente, las capas de modelo y de controlador sólo usan los identificadores de las cadenas, que son únicos. Cuando la capa Vista va a mostrar algún texto en pantalla, se asegura de mostrarlo llamando a la función _l.

La declaración de cadenas la realizo así:

var UI_DAÑO_FINAL = (new L("UI_DAÑO_FINAL","Daño final","Final Dmg.")).getId();
var UI_VELOCIDAD = (new L("UI_VELOCIDAD","Velocidad","Speed")).getId();
var UI_TURNO_FINAL = (new L("UI_TURNO_FINAL","Turno final","Final Init.")).getId();

Como se puede ver, esto es sólo para español e inglés. En cuanto añada la traducción al francés, me bastará con alterar la clase L y añadir la localización a cada cadena como un argumento más.

Como resulta claro enseguida, esta solución aún presenta problemas. Por ejemplo, habrá ocasiones en que la unión de varios términos deba hacerse en distinto orden según el idioma, y éste sistema de por sí no ofrece soporte para ese caso. Pero para el caso de una hoja de personaje, que sobre todo mostrará términos de manera aislada de momento me está funcionando bastante bien.

Making of Anima: UNICO – Estructura general

En la última entrada repasé las principales herramientas que estoy empleando para crear Anima: UNICO. He de añadir una que olvidé: SourceTree, una interfaz gráfica para git muy cómoda y agradable que permite seguir fácilmente el patrón GitFlow. Obviamente, no necesito usar GitFlow (y realmente no lo uso al 100%), pero como base para organizarme me gusta.

Y, ahora, pasaré a entrar en materia de verdad. Primero, ¿cómo organizar una aplicación javascript del tamaño de Anima: UNICO? Tras mis primeras exploraciones, llegué al siguiente flujo de trabajo:

  1. Creo tantos ficheros javascript como me sea cómodo, normalmente uno por clase.
  2. Para publicarlos, empleo Grunt para concatenarlos todos, minificarlos y ofuscarlos, y así obtengo un único archivo javascript para publicar en la web.

En cuanto al modo de organizar los archivos javascript, me he basado en patrones Modelo-Vista-Controlador

  • js/ – Carpeta general de archivos javascript
    • controller/ – Controladores.
    • data/ – Datos.
    • view/ – Vistas.
    • model/ – Modelos.
    • locale/ – Localización.
    • libs/ – Librerías de terceros
    • vendor/ – Librerías de terceros
  • sass/ – Ficheros SASS.
  • img/ – Imágenes
  • fonts/ – Fuentes
  • css/ – Ficheros CSS.
  • index.html – La página principal.
  • indexLocal.html – Versión de la página principal para depuración local.
  • Gruntfile.js – Instrucciones para Grunt.

Controladores

Se encargan de interacción entre modelos, de preparar los datos que se presentarán al usuario y de interpretar las acciones de usuario.

Datos

Los datos de las instancias concretas de cada clase. Es decir, los datos de cada ventaja,  conjuro, arte marcial, etc…

Hay varias formas de almacenar los datos. Como quería que la aplicación funcionara offline, no podía usar una base de datos. Al final, los almaceno en su propia inicialización. Esto es… mala idea. Debería haberlos guardado desde el principio en formato JSON, y en algún momento del futuro seguramente haga el cambio.

Un ejemplo:

addVentaja(new Ventaja( VENT_APRENDIZAJE_INNATO_EN_UN_CAMPO, «», VENT_APRENDIZAJE_INNATO_EN_UN_CAMPO_DESC, REPETIBLE_OPCIONES, [2,3], [], true, [LISTA_TIPOS_SECUNDARIAS], [aprendizajeInnatoCampo], GRUPO_SECUNDARIAS ));

Esta línea de código inicializa la ventaja «Aprendizaje innato en un campo».

Vistas

Las vistas son las encargadas de generar la interfaz de usuario y de interactuar con él.

Modelos

Los modelos son las clases básicas. Personaje, Raza, ArteMarcial, etc…

Localización

La localización es todo lo relacionado con mostrar la aplicación en varios idiomas. Actualmente esto incluye español e inglés, y el francés está en proceso. Cuento para este paso con la ayuda totalmente inestimable e imprescindible de Andrew «Dynaes» Reich y de Vincent «Moklo» Bouscarle.

En otro artículo entraré en detalle en cómo realizo la localización, ya que me parece un punto interesante.

Making of Anima: UNICO – Herramientas

Aquí estoy de nuevo. Como prometí, voy a hablar de las herramientas que uso para crear Anima: UNICO. Sin más…

1. Lenguaje: HTML+CSS+JavaScript en el cliente, PHP en el servidor

Ésta está clara. El desarrollo principal de Anima: UNICO está realizado en JavaScript. La página web en sí usa HTML, aunque la mayor parte de la misma se genera dinámicamente desde código usando jQuery. La representación se controla casi totalmente mediante CSS.

2. Frameworks y librerías de Javascript: jQuery, jQuery UI, Modernizr, Gumby

Una de los puntos fuertes de JavaScript es la gran cantidad de desarrollos existentes. Muy probablemente jQuery sea el más famoso de ellos, y con razón. Sus funciones resultan básicas para trabajar con el DOM de la página web y no volverse loco.

Además de jQuery, comencé utilizando jQuery UI como base para la interfaz de usuario. jQuery UI es un framework con funciones para crear botones, diálogos, componentes arrastrables, etc.

Modernizr es una pequeña librería que facilita el diseño para varios navegadores.

Gumby es un framework para crear web adaptativas, que se ajustan al tamaño de la pantalla de visualizado. Es la base con la que doy formato a la página.

3. Frameworks y librerías de PHP: CakePHP

Para el lado del servidor de momento estoy usando, de modo muy muy básico, CakePHP, que me ofrece de base justo lo que quería.

4. IDEs: Jetbrains WebStorm, JetBrains PHPStorm

Los IDEs de JetBrains me han conquistado. Me encantó WebStorm para desarrollar en JavaScript, y cuando empecé a usar PHP pasé a PHPStorm (que incluye toda la funcionalidad de WebStorm). Son entornos de desarrollo muy potentes, con integración con todo lo que necesitaba integrar (control de versiones, base de datos remota, ftp, librerías…).

Además, a través de estos IDEs descubrí todas las tecnologías del siguiente punto…

5. Muchas más: Node.JS/NPM+Grunt, SASS+Compass, Mocha

Los IDEs de JetBrains se integran con un servidor Node.JS propio, que permite cargar un montón de scripts de lo más útiles. Yo llegué hasta Grunt, que permite automatizar tareas (es similar a un Make), y lo usé para unificar mis archivos de javascript, minificarlos y prepararlos para ser publicados en producción.

6. Control de versiones

Empecé usando Subversion como control de versiones, pero hace unos meses descubrí y aprendí Git, y no he mirado atrás. Me parece un sistema genial de control de versiones.

7. Tareas, control general, repositorio: Assembla

Buscando, encontré varias opciones de repositorio online. Al final me decanté por Assembla, que ofrece un plan básico gratuito muy atractivo (para mi). Se integra con Svn y con Git, ofrece control de tareas y tickets (que puedo integrar con PHPStorm)

8. Informes y análisis de visitas: Google Analytics

En la página tengo Google Analytics para comprobar las visitas diarias, idioma de visitantes, navegador… detalles bastante importantes para un proyecto en JavaScript.

Por hoy es todo. El próximo día empezaré a describir la estructura básica del código.

Ah, por cierto, en GitHub podéis encontrar el repositorio de código. ¡Adelante, hacedle un fork o lo que queráis!

Making of Anima: UNICO – Introducción

Logo de Anima: UNICOSaludos a todos.

Empiezo aquí una serie de posts sobre la creación de Anima: UNICO, mi aplicación web para crear personajes para el juego de rol Anima: Beyond Fantasy. Veamos si puedo publicar uno dos de estos por semana. Creo que puedo comentar muchas cosas interesantes para cualquiera interesado en realizar aplicaciones semejantes.

Primero, los antecedentes. Empecé a desarrollar Anima: UNICO alrededor de septiembre u octubre de 2013 (no recuerdo la fecha exacta). Inspirado por la magnífica aplicación web de generación de personajes de mi amigo Azrapse para el juego El Anillo Único, la cual usamos casi todas las semanas para jugar, y movido por la carencia de software generador de personajes para Anima, uno de mis juegos de rol favoritos, decidí ponerme manos a la obra.

Sin embargo, Anima: UNICO no fue lo primero que hice en generación web de personajes. Tengo también (bastante avanzado, de hecho) un programa semejante para 7º Mar, y también inicié uno para Hackmaster (edición actual). Con el de 7º Mar aprendí mucho, pero me faltó motivación, aunque espero retomarlo algún día. El de Hackmaster lo abandoné al descubrir que los propios creadores del juego estaban desarrollando una aplicación de generación de personajes: no estoy interesado en hacer trabajo inútil.

He dicho antes que no había software de generación de personajes para Anima, pero no sé muy bien cómo busqué entonces, porque en torno a febrero de 2014 volví a buscar y encontré varias cosas. La principal, la genial hoja excel realizada por varios miembros del foro español de Anima (creo que el principal desarrollador es Solkar). Es tan buena que de haberla visto antes de empezar posiblemente no habría empezado. También descubrí que hace un año alguien realizó un pequeño crowdfunding en indiegogo para realizar una aplicación de generación de personajes para Anima. No he visto actividad por ese frente, y desconozco si habrán llegado a algo. Desde luego, no parece que hayan publicado nada.

Mis objetivos para Anima: UNICO al inicio eran básicamente los siguientes (y en este orden):

  1. Poder crear personajes completamente en la aplicación web y también sin conexión a Internet.
  2. Desarrollarla en JavaScript: la aplicación del Anillo Único me había convencido de que era el modo óptimo de hacerlo.
  3. Incorporar la versión actual de las reglas (Core Exxet) con todos los suplementos (Dominus Exxet, Arcana Exxet, Prometheum Exxet, Gaïa 1, Gaïa 2, Los Que Caminaron Con Nosotros, la pantalla, los complementos web 1, 2 y 3, y cualquier adicional que apareciera).
  4. Permitir la incorporación de material casero (Categorías, habilidades, ventajas, desventajas, artes marciales, ars magnus, conjuros, etc)
  5. Permitir guardar los personajes, formar grupos de juego, indicar quién es el DJ, que el DJ pudiera marcar qué reglas se usarían en la partida y que los miembros del grupo al crear sus personajes ya se encontraran con esas reglas.
  6. Permitir que el DJ pueda exigir personajes «fiables»: al marcar esta opción, toda la parte aleatoria se delegaría en un servidor (esto requeriría siempre conexión a Internet, claro).

En el próximo artículo, hablaré de las herramientas que estoy empleando (y las que empleé y dejé de emplear).

Diez juegos de rol que me han marcado

He visto en Puerta al Mañana un post interesante, que voy a continuar/imitar aquí. ¿Qué diez juegos de rol han sido los más importantes para mi? (adelanto que voy a compartir muchos con Dungalad).

1 – El Señor de los Anillos: El Juego de Rol de la Tierra Media

MERP

Prisioneros de Pax Tharkas, mi primer contacto con Krynn (aunque entonces yo no lo sabía)

 
Mi primer juego de rol, al que llegué desde los libros juego azules de D&D. Aún recuerdo mi primer intento de partida, dirigiendo a mis hermanos sin nada de experiencia previa… tras describir la Última Posada, pregunto a mi hermano qué va a hacer.

«Salgo a buscar la letrina».

Una acción válida. Por desgracia, decidí que era importante cuánto se movería por turno para llegar y empecé a buscar la regla. Unos minutos después mis hermanos decidieron que mejor jugábamos otro día, cuando me dispuse a anotar sus puntos de vida en el propio libro por no tener aún fotocopias. No fue una gran partida, no…

Jugué bastante al MERP durante el colegio, casi siempre dirigiendo. La de veces que visité el castillo, el bosque de los trolls y la última posada. Y la de Pargen que crecía por esos lares, quién lo iba a decir… e incluso se llegaba a ver a algún Balrog si te descuidabas (y si molestabas al DJ).

Tras un tiempo busqué hacerme con Rolemaster y lo usé como ampliación de reglas del MERP, pero la verdad es que para entonces ya tenía otros juegos que me convencían más que el aluvión de reglas de Rolemaster (aunque siempre recordaré con cariño el +5 a la BO).

Y, por supuesto, este juego me llevó a leerme el Silmarillion (fue el primero que conseguí y el primero que leí. Ahí es nada), el Señor de los Anillos y el Hobbit.  Y cuentos cortos de Tolkien también.

2 – La Llamada de Cthulhu

La Llamada de Cthulhu

No fue mi segundo juego de rol (reconozco que no recuerdo con seguridad si Star Wars de WEG fue el segundo. Puede que sí). Pero es uno de mis favoritos. Un estilo tan distinto, un entorno tan separado de la espada y brujería, y tan interesante.

Creo que esa cama ha matado a unos veintitantos de mis jugadores. Como anécdota, el grupo que mejor se enfrentó a la cama venció sin entrar en la casa. Tras una profunda investigación previa, compraron la casa y la quemaron hasta los cimientos. Una lección para aprender.

Este juego me llevó a leerme las obras completas de H.P. Lovecraft, y varias de Robert Bloch, Ambrose Bierce y sus amigos.

Con el tiempo, mi participación en este mundo llegó a la cumbre cuando pude traducir al español El Rastro de Cthulhu, otra de las muchas visiones del mundo de los Mitos en juego de rol.

3 – Advanced Dungeons & Dragons 2ª Edición

Advanced Dungeons & Dragons 2ª Edición (Manual del Jugador)
Relatos de la Lanza. ¡Así que ax Tharkas está en Krynn!

El peso pesado. Lo compré movido en gran parte por su fama y por los anuncios en la revista española de Dragón. Fui ampliando la colección con suplementos variados y con los Héroes de la Dragonlance.

Puede que haya dirigido a este juego más que a ningún otro. O al menos empata con las siguientes entradas. Una enorme campaña en Krynn, en la que sableé aproveché los libros juego como fuente de ideas (los Páramos de Nordmaar y Reto Crucial, especialmente), con la búsqueda de una espada sagrada. Hacia el final aprovechaba también el material que tenía del fantástico Planescape, aunque de base no «encajase» mucho con Krynn.

 
 
 
 
 
 
4 – Dungeons & Dragons 3ª Edición

D&D 3ª Edición

Más pesos pesados. Si un juego supera al anterior en dedicación, es éste. Durante mucho tiempo fue mi juego principal, con otra enorme campaña, esta vez en los Reinos Olvidados, enfrentándose a un lich cronomante. Viajes en el tiempo, presentes alternativos, antiguos enemigos transformados en aliados.

Y muchos libros comprados. Con la explosión D20, este juego y sus versiones ocupan una parte importante de mi colección.

Su siguiente edición no me convenció. Ya veremos que pasa Next…

5 – 7º Mar

7º Mar (Guía del Jugador)

El tercer peso pesado. Mi juego principal en la universidad. La larga búsqueda de un mapa en cuatro partes hacia la famosa Isla del Mono. Por el camino, muchos magnicidios.

Un juego fantástico pese a sus fallos y problemas. Un mundo de capa y espada de alta aventura, y buenos PNJs que usar y de los que abusar.

Aún es uno de mis juegos favoritos, y lo he jugado también cambiando su sistema por el de Houses of the Blooded (sólo dos sesiones, pero legendarias), por el Fate, y estilo «freeform», con las guías de Mythic.

6 – Anima: Beyond Fantasy

Anima: Beyond Fantasy (ed. Core Exxet)

Un juego que inicialmente compré pensando que iba a ser una patata recargada con un sistema mal copiado de Rolemaster, pero que con las bonitas ilustraciones le gustaría a mi novia (ahora esposa). Digamos que mi impresión era algo errónea.

El juego me encantó. Su mezcla de tipos de poderes, diferenciados y bastante equilibrados me convenció. Durante los primeros meses estuve resolviendo dudas del juego en los foros oficiales, tanto que acabé llamando la atención de Anima Studio. Con el tiempo esto me llevó a colaborar en la línea, escribiendo textos para el manual de Anima Tactics, revisando textos de suplementos, escribiendo gran parte del capítulo de psíquica del Arcana Exxet y alguna cosas más. Esto a su vez me puso en contacto con Edge lo que me llevó a mi etapa de traductor freelance inglés-español de juegos de rol y de mesa. Y todo esto me ha terminado llevando a dedicar mucho tiempo a desarrollar Anima: ÚNICO

Curiosamente, no he jugado tanto a Anima. He jugado un campaña de duración corta-media y algunas partidas sueltas, pero nunca conseguí terminar de vendérselo a mis jugadores (y esto es ya una ligera exageración: para ellos, Anima es uno de los juegos vetados)

7 y 8 – James Bond 007 El Juego de rol y Cazafantasmas

Los Cazafantasmas
James Bond 007

Estos dos juegos los compré juntos en un saldo de playa. Pensé que serían… en fin, algo correspondiente con sus respectivas portadas. Los dos me sorprendieron de forma similar: sistemas de juego muy elegantes, casi con un único método de resolución, reglas para reforzar la ambientación (007 nunca falla, solo se tira casi para ver como de bien lo hace, los cazafantasmas no mueren). Algo muy muy distinto a D&D o MERP, sin duda. Había más juegos ahí fuera.

Los Cazafantasmas también me marcó por la ingente cantidad de erratas y errores tipográficos, pero eso es otra cuestión.

Hoy en día estoy viendo por fin las películas de James Bond. Está costando.

9 – La Leyenda de los Cinco Anillos

La Leyenda de los Cinco Anillos

Cercano a 7º Mar, gana su lugar en esta lista por ser el primer juego al que jugué una campaña larga como jugador y no como director. Con mi escorpión incapaz de mentir. Luego lo he dirigido varias veces también, claro.

 
 
 
 
 
 

10 – Exaltado

Exaltado (primera edición)
Exaltado (segunda edición)

Exaltado, tanto primera como segunda edición, es otro juego que me cautivó desde el principio. Lo evité mucho tiempo debido a la a primera vista horrible portada. Otro error (está claro que debo centrarme en conseguir los juegos cuyo aspecto inicial no me convenza).

Una de las mejores ambientaciones de fantasía existentes. Un sistema que… una de las mejores ambientaciones.

Aunque el sistema tiene sus cosas buenas y sus cosas malas, si no se fuerza mucho funciona aceptablemente. Y eso he hecho durante mucho tiempo, y pienso seguir haciendo en cuanto llegue la esperada tercera edición. Ya falta poco…

Y más…

Se me quedan otros importantes en el tintero. Hackmaster es el primero que me viene a la cabeza. Reign. Houses of the Blooded. World of Synnibarr. Y ya tengo ganas de ver cuáles me marcan en el futuro.