Archivo de la categoría: Anima: UNICO

Estado de los proyectos – Septiembre 2014

Veamos como han avanzado mis variados proyectos tras algo menos de un mes.

  • Anima: UNICO – El generador de personajes para Anima Beyond Fantasy. Sigue parado, pero sigo con ganas de ultimarlo de una vez.
  • Otros generadores de personajes – El primero ha empezado a materializarse: Workings of Fate, un conjunto de herramientas para el juego Fate Core. La primera herramienta, el Generador de Aspectos, tiene ya publicada una primera versión.
  • John Merridew está muerto – Mi novela de misterio. 1600 palabras escritas, dedicadas sobre todo a descripciones iniciales de personajes y a organizar los capítulos.
  • Archelogos – El videojuego de arqueología (mejor dicho, archelogía) situado en el mundo de Arche. Algunas pruebas de mecánicas e interfaz básica, y organizando localizaciones.
  • El mundo de Arche – El juego de rol ambientado en un mundo de fantasía platónica, aristotélica, alanmooriana. De momento, unas cinco mil palabras escritas describiendo distintos aspectos del mundo.

Como novedades, he iniciado una cuenta en Patreon para quienes quieran apoyar mi creación de aplicaciones para juegos de rol. ¡Y ya tengo dos patrones!

Proyectos en marcha

Mmm… mi anterior entrada de proyectos en marcha es de 2011. Creo que es hora de actualizar mi lista de proyectos.

Veamos, hace tres años comparado con ahora:

  • (entonces) El principal proyecto actual es Comando M.A.N.N. (Marcianos Arios No Nazis), un juego de rol de ciencia ficción con elementos bélicos inspirado por el Equipo A.
  • (ahora) Comando M.A.N.N. nunca terminó de despegar, y ahora me parece que tendría cierto desagradable solapamiento con Walküre, así que se queda en el cajón. Puede que en algún momento haga una versión simple basada en Fate o en AW, que están muy de moda esas cosas.
  • (entonces) John Merridew está muerto es un relato sobre un asesinato en una habitación cerrada en el mundo de fantasía de Arguè.
  • (ahora) John Merridew está muerto sigue siendo un relato whodunnit, pero ya no situado en el mundo de Arguè.
  • (entonces) Por supuesto, el proyecto del juego de rol del mundo de Arguè sigue en marcha, pero va para largo.
  • (ahora) Y tan para largo. Sigo sin aclararme las ideas lo bastante, pero puede que le de un empujón en breve.
  • (entonces) También en el mundo de Arguè se situará Days of Adventure and Fantasy, un MMORPG textual que está tan lejos de tener una versión inicial de prueba que no merecía le pena ni mencionarlo.
  • (ahora) Days of Adventure and Fantasy ya no existe, aunque el título puede que lo vuelva a usar.
  • (entonces)Rojosky, Bilinfus, Lupar es un relato corto sobre cómo afecta un día extraño a una persona poco común.
  • (ahora) La idea sigue ahí.

5 proyectos que no han llegado a nada. Ni han avanzado, de hecho. Algo tengo que hacer mejor.

Mis proyectos actuales serían estos:

  • Anima: UNICO – El generador de personajes para Anima Beyond Fantasy. Mis planes de un crowdfunding que me ayudara a terminarlo no pudieron ser, pero lo concluiré. Me he tomado unos meses de descanso, pronto volveré a por su recta final.
  • Otros generadores de personajes – Estoy trabajando en otros generadores similares. Cuando hayan avanzado lo bastante los publicaré.
  • John Merridew está muerto – Stefan Gutnacht, el gran detective alemán, está de vacaciones en Inglaterra. Necesita el aire fresco de la campiña inglesa tras los terribles acontecimientos de su aventura en la Selva Negra. Su viejo amigo y compañero de fatigas, Oscar Hammond (ahora Hammond-Kemp), le ofrece la hospitalidad de su casa. Allí conocerá a John Merridew, un hombre despreciable. Stefan Gutnacht no tendrá unas vacaciones tan tranquilas como deseaba.
  • Arguè Archeo Logos – «¡Están intentando matarme, es algo nuevo para mi!», «A mi me pasa a menudo». El imperio Trelo dominó la faz Noah durante mucho tiempo, pero desapareció abrúptamente. En este videojuego te dedicarás a investigar su historia, su artesanía, su tecnología, su hechicería y el misterio de su desaparición. Coge tu pala, tu pico, tu pincel y tu papel cebolla, practica tu dialéctica, no busques ninguna equis que marque el lugar y, sobre todo, ten cuidado con la Sociedad Secreta que no quiere que los misterios Trelos sean desvelados…
  • Arguè – El juego de rol ambientado en un mundo de fantasía platónica, aristotélica, alanmooriana.

Con eso cubro todas mis principales áreas de interés: escritura, rol, programación, videojuegos. ¿Llevaré alguno a buen puerto? La respuesta, al parecer, dentro de unos tres años.

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.