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.

Reseña de videojuego: Remember Me

En resumen

Jugado en: Playstation 3 (versión descargable)

Duración aproximada: de 8 a 10h.

¿Completado?

Puntos fuertes: Gráficos de los escenarios, banda sonora, remezclar recuerdos, sistema de combos.

Puntos débiles: Doblaje, las partes de saltar y trepar.

Puntuación: hombrelorohombrelorohombreloro

Comentario

» Te recordaré pronto.»

Remember Me es un juego de ese género tan común hoy en día consistente en trepar/saltar por escenarios, intercalado con peleas contra muchos enemigos, y centrado en contar la historia que quiere contar, con poca o ninguna intervención del jugador. Un género del que el máximo exponente posiblemente sea la saga Uncharted. Remember Me añade algo de variedad a la fórmula con un sistema de combos configurables (el jugador decide si cada golpe hace más daño, o le cura, o le permite activar antes sus golpes especiales) y con unos (pocos) puzzles consistentes en alterar elementos de los recuerdos de un personaje para cambiar su forma de ser.

Por desgracia, la mayor parte del tiempo consiste en trepar y saltar, sin ninguna libertad, avanzando por las pantallas. Aunque la ciudad de Neo-París tiene un diseño muy atractivo, se hace tedioso trepar y saltar, sin importar habilidad: es sólo un modo de espaciar los combates.

Eso sí, no es un juego excesivamente relleno de paja. Cada capítulo tiene una buena duración,

Reseña de videojuego: InFamous

En resumen

Jugado en: Playstation 3 (versión descargable)

Duración aproximada: –

¿Completado? Sí, como infame.

Puntos fuertes: Nivel de poder, ritmo de la acción.

Puntos débiles: Gráficos de enemigos, libertad de acción.

Puntuación: hombrelorohombrelorohombreloro

Comentario

InFamous es un entretenido juego de superhéroes/supervillanos que intenta destacar la posibilidad de decidir ser bueno o malo. La parte de superpoderes le sale bien: no tiene miedo a proporcionarte un gran nivel de poder y amenazas acordes, y ofrece una gran ciudad que recorrer de modos muy originales («surfeando» cables de alta tensión o vías de tren eléctrico). Sin embargo, la «dualidad» de moralidad queda muy floja, con decisiones forzadas y otras irrelevantes. La historia es curiosa, aunque las motivaciones pueden tener más o menos sentido según tus «elecciones» morales.

 

Reseña de videojuego: Donkey Kong Country Returns

En resumen

Jugado en: Wii

Duración aproximada:  -.

¿Completado? Sí, hasta templo dorado

Puntos fuertes: Diversión, dificultad, banda sonora.

Puntos débiles: Originalidad.

Puntuación: hombrelorohombrelorohombrelorohombreloro

Comentario

Un gran juego de plataformas para Wii, poco innovador pero que hace muy bien lo que hace. Una dificultad bastante adecuada (elevada in resultar desesperante), fases ligeramente variadas y bastantes secretos para encontrar.

Muy bueno para jugar con niños pequeños, que en puntos difíciles pueden dejar que Kong les coja (lo cual además le hace la vida más fácil a Kong).

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.