Había un detalle molestándome en los últimos días y eran las habilidades iniciales del personaje. Sí, básicamente el background dice que eras un vago incorregible (en el caso de los personajes masculinos), pero incluso los vagos son obligados a aprender algo. Y para los personajes femeninos la cosa es algo distinta. En fin, que seas hombre o mujer, la vida no se inicia justo en el punto que empieza el juego, algo deberías tener en la cabeza, además de pelo.
Y nada más óptimo para resolver este problema que introducir un segundo paso en la creación de personajes, en el cual puedes escoger varias habilidades iniciales, supongo que tres o cinco serían un buen número. No sé aún si ofrecer la posibilidad de invertir más de uno de esos cinco puntos en potenciar una habilidad en específico. Aparte de las habilidades opcionales, algunas razas recibirán bonificaciones en forma de habilidades gratis, además de atributos. Técnicamente esto no tiene mucha complicación, sólo debería tomarme un par de horas implementar lo necesario, de hecho, ayer hice el diseño del segundo diálogo en el editor de layouts. Supongo que este fin de semana lo tendré terminado.
Reajuste de diálogos
Hace dos días me enfrenté a la tarea de agregar una misión a un diálogo. Francamente lo dejé después de un rato. Así que volví a pensar cómo lograr un sistema más sencillo, pero sin perder la potencia del actual. El sistema permite hacer cualquier cosa, ya que es un script que tiene acceso a toda la información del jugador y su interlocutor. Y por eso mismo se puede volver una pesadilla arreglar algo que ya está hecho.
Luego de un rato valorando un formato basado en XML con Lua incrustado, me enfoqué en otra idea: dividir los nodos en funciones, en vez de meterlos en un if-then enorme. Hice una prueba rápida y funcionó. La cosa es sencilla: se crea una tabla (en Lua, una tabla es como un arreglo) donde cada elemento es una función. Al ejecutarse el script, se recibe el índice de toda la vida indicando dónde estamos, pero esta vez se usa para invocar la función correcta. Y la cosa queda más o menos así:
Dialog = {}
Dialog["1"] = function(player, npc)
end
*
*
-- El parametro q es el indice a ejecutar
Dialog[q](ent_jugador, ent_npc)
Eso, a grandes rasgos. La mejora no es enorme, pero los diálogos son más legibles y se evita el excesivo anidamiento de condiciones. Este es el método que se utiliza en los ejemplos del libro de Buckland para la máquina de estados finitos.
Luego de un rato valorando un formato basado en XML con Lua incrustado, me enfoqué en otra idea: dividir los nodos en funciones, en vez de meterlos en un if-then enorme. Hice una prueba rápida y funcionó. La cosa es sencilla: se crea una tabla (en Lua, una tabla es como un arreglo) donde cada elemento es una función. Al ejecutarse el script, se recibe el índice de toda la vida indicando dónde estamos, pero esta vez se usa para invocar la función correcta. Y la cosa queda más o menos así:
Dialog = {}
Dialog["1"] = function(player, npc)
end
*
*
-- El parametro q es el indice a ejecutar
Dialog[q](ent_jugador, ent_npc)
Eso, a grandes rasgos. La mejora no es enorme, pero los diálogos son más legibles y se evita el excesivo anidamiento de condiciones. Este es el método que se utiliza en los ejemplos del libro de Buckland para la máquina de estados finitos.
Fallout MMO, posible beta para el 2012
Leo en Joystiq que Interplay sigue adelante con su MMORPG basado en el universo de Fallout, nombre código Project V13, a pesar de los problemas legales con Bethesda. El estudio ha concretado una alianza con Masthead Studios, quien proporciona la tecnología para el desarrollo del juego (utilizada en su proyecto Earthrise) y además han anunciado una posible fecha para el lanzamiento de la beta: 2012. Curioso, no les parece? Me pregunto si tendremos tiempo de meterle mano antes que la lluvia de neutrinos nos mande a un universo post-apocalíptico.
Los CEO de ambas compañías se han deshecho en halagos: Herve Caen (Interplay) acerca de la tecnología de Masthead, y Atanas Atanasov (Masthead) sobre las innovativas características de Project V13.
Pero no ha sido lo único acerca de Project V13 en estos días. Resulta que también Mark O'Green, quien escribió la mayoría de los diálogos de Fallout 1 y 2, se une a Interplay, que también cuenta con Chris Taylor. Esperemos que Interplay logre asegurar el financiamiento del proyecto durante esos dos largos años que tiene por delante hasta la beta.
Los CEO de ambas compañías se han deshecho en halagos: Herve Caen (Interplay) acerca de la tecnología de Masthead, y Atanas Atanasov (Masthead) sobre las innovativas características de Project V13.
Pero no ha sido lo único acerca de Project V13 en estos días. Resulta que también Mark O'Green, quien escribió la mayoría de los diálogos de Fallout 1 y 2, se une a Interplay, que también cuenta con Chris Taylor. Esperemos que Interplay logre asegurar el financiamiento del proyecto durante esos dos largos años que tiene por delante hasta la beta.
Centralizando todo
Ayer inicié el trabajo de mover la información del juego a una sola clase. En realidad esto no es esencial, pero tenía esta idea desde hace tiempo y así es como quiero hacerlo. La instancia de esta clase contendrá todo lo referente al juego actual: hora y fecha, lista de entidades, mapas, contenedores, etc. Esto es un trabajito un poco largo, porque un montón de código debe ser adaptado, en C y en Lua, para que acceda a las listas de entidades a través de la nueva clase. Y por supuesto aparecerán los inevitables bugs.
También agregué una nueva quest al juego, aunque depende de implementar eventos adicionales para las entidades porque se trata de liquidar a alguien.
También agregué una nueva quest al juego, aunque depende de implementar eventos adicionales para las entidades porque se trata de liquidar a alguien.
3 en raya
Al parecer estoy a punto de implantar algún nuevo record mundial de bugs consecutivos. Al fin logré descubrir qué sucedía con __setitem__, que resultó ser que estaba asignando un valor a un índice inexistente, debido a un atributo que eliminé. Creo que tendré que implementar alguna forma de validar los valores que los scripts tratan de asignar a ciertas cosas.
Sin emabrgo, apenas arreglé ese apareció otro, el juego se caía más o menos ne el mismo lugar. La cuestió era código sin probar que había añadido mientras el anterior bug no me dejaba ejecutar la aplicación. Me tomó un buen rato descubrir que el problema no estaba en los scripts, sino en un parseo incorrecto del XML de los mapas del juego. Y al fin logré entrar otra vez en el juego, solo para descubrir que ahora no funciona el código de movimiento de los personajes en modo isométrico. El modelo simplemente gira y se queda caminando en el mismo lugar. Nada, que hay veces en que uno maldice la hora en que se le ocurrió programar. Me pregunto si cuando solucione ese aparecerá un cuarto problema.
A propósito, busco hosting para proyectos libres, que sea gratis, tenga SVN y espacio web. Obviamente, ubicado fuera de USA.
Sin emabrgo, apenas arreglé ese apareció otro, el juego se caía más o menos ne el mismo lugar. La cuestió era código sin probar que había añadido mientras el anterior bug no me dejaba ejecutar la aplicación. Me tomó un buen rato descubrir que el problema no estaba en los scripts, sino en un parseo incorrecto del XML de los mapas del juego. Y al fin logré entrar otra vez en el juego, solo para descubrir que ahora no funciona el código de movimiento de los personajes en modo isométrico. El modelo simplemente gira y se queda caminando en el mismo lugar. Nada, que hay veces en que uno maldice la hora en que se le ocurrió programar. Me pregunto si cuando solucione ese aparecerá un cuarto problema.
A propósito, busco hosting para proyectos libres, que sea gratis, tenga SVN y espacio web. Obviamente, ubicado fuera de USA.
Tú también Sourceforge?
Hoy me encontré con un error raro mientras intentaba emerger unos paquetes de KDE. El paquete en cuestión (xine) se descarga directo de Sourceforge, me daba Forbidden, y como es opcional para emerger Phonon, lo omití. Revisando la lista de correo de software libre, me entero de que el problema es que Sourceforge ha pasado de listar a Cuba entre los países que no pueden usar sus servicios a denegar activamente las descargas, tal como hacen Sun y Google Code. O sea, que cientos de miles de softwares ya no pueden ser descargados de su hosting oficial desde aquí, aún cuando sus autores no sean norteamericanos y la política les toque de los tres el más largo.
Código roto
Esto de la programación tiene sus cosas. Es muy común encontrarse todo tipo de problemas del Orinoco, que tú no sabes ni yo tampoco, como esto que me acaba de ocurrir.
Como he dicho en varias ocasiones, utilizo SWIG para generar el código que permite a los scripts en Lua acceder a las variables de la aplicación en C++. SWIG maneja casi todo tipo de cosas, incluyendo operadores, pero por desgracia, no maneja arreglos. El operador [] se emula mediante unas funciones auxiliares, __setitem__/__getitem__ muy sencillas y que funcionan (valga la redundancia) bastante bien. Hasta hace una semana. Algo he cambiado que provoca un error: Error in __setitem__ (arg 2), expected 'int' got 'nil'. El valor no es asignado, con el consiguiente fallo de toda la aplicación poco después.
Y por supuesto, en la lista de correo de Lua nadie tiene idea de qué puede estar pasando.
Como he dicho en varias ocasiones, utilizo SWIG para generar el código que permite a los scripts en Lua acceder a las variables de la aplicación en C++. SWIG maneja casi todo tipo de cosas, incluyendo operadores, pero por desgracia, no maneja arreglos. El operador [] se emula mediante unas funciones auxiliares, __setitem__/__getitem__ muy sencillas y que funcionan (valga la redundancia) bastante bien. Hasta hace una semana. Algo he cambiado que provoca un error: Error in __setitem__ (arg 2), expected 'int' got 'nil'. El valor no es asignado, con el consiguiente fallo de toda la aplicación poco después.
Y por supuesto, en la lista de correo de Lua nadie tiene idea de qué puede estar pasando.
Rediseñado las habilidades
Esta era una tarea que había dejado para después, ya que ni siquiera tenía un prototipo jugable del proyecto. Desde el principio la idea fue tener atributos básicos y habilidades, como todo RPG que se precie de serlo. El caso es que ya es hora que me tome esto en serio y defina un conjunto de habilidades raíz, las cuales tendrán otras ramificaciones que serán las habilidades que en verdad podremos ejecutar.
Por ejemplo, Magia. Magia influye en la potencia de los hechizos y su probabilidad de fallo, y es la habilidad que podremos nivelar a medida que usemos hechizos. Cualquier jugador puede tener esta habilidad, aún cuando no sea mago. La diferencia es que no tendrás acceso a todo el arsenal de hechizos si eres Mondongo Oblongo, guerrero de profesión y con el cerebro de un protozoo. Sin embargo esto permite cositas tales como que los Antiguos sean guerreros con excepcionales dotes para trucos mágicos. O viceversa: que puedas desarrollar un mago que sea un gran espadachín.
La lista de habilidades raíz es solo una nebulosa en mi cabeza, por el momento. Me falta definir si las diferentes armas de cuerpo a cuerpo serán regidas por habilidades distintas o por una sola, y un conjunto extra como oratoria o comercio.
Por ejemplo, Magia. Magia influye en la potencia de los hechizos y su probabilidad de fallo, y es la habilidad que podremos nivelar a medida que usemos hechizos. Cualquier jugador puede tener esta habilidad, aún cuando no sea mago. La diferencia es que no tendrás acceso a todo el arsenal de hechizos si eres Mondongo Oblongo, guerrero de profesión y con el cerebro de un protozoo. Sin embargo esto permite cositas tales como que los Antiguos sean guerreros con excepcionales dotes para trucos mágicos. O viceversa: que puedas desarrollar un mago que sea un gran espadachín.
La lista de habilidades raíz es solo una nebulosa en mi cabeza, por el momento. Me falta definir si las diferentes armas de cuerpo a cuerpo serán regidas por habilidades distintas o por una sola, y un conjunto extra como oratoria o comercio.
Tai Chi
He retomado los entrenamientos diarios, esta vez de Tai Chi tradicional, para complementar un poco el EBMAS que ya no puedo practicar a menudo. En general aquí se hace mucho Tai Chi, pero deportivo (la forma 24, forma de espada, etc). Así que el 90% de los practicantes son ancianos, el resto, niños que tienen potencial como competidores.
En cambio, el Tai Chi tradicional, tal como lo hace un reducido número de personas, busca volver a la esencia del estilo como un todo: arte marcial y método terapéutico. Porque obviamente, el Tai Chi no se inventó solo para que los ancianitos chinos ejercitaran el cuerpo, si no también para que los maestros maltrataran el cuerpo de su oponente.
Las similitudes con el Wing Tzung (o Wing Tsun, Wing Chun, como querráis llamarle) son muchas y me da la ligera impresión de que éste se deriva del Tai Chi. Donde el WS usa una estructura triangular, el Tai Chi usa el círculo, ambos hacen énfasis en redirigir los golpes con movimientos de tronco, mantener el contacto, atacar en vez de defender y la pelea a muy corta distancia con combinaciones de varios golpes. Los desplazamientos son muy parecidos, y tantos otros detalles que no me extenderé para no abrumarlos con cosas que no puedo ilustrar adecuadamente.
En fin, que si alguien piensa que el Tai Chi no es un buen método de defensa personal, está muy equivocado.
En cambio, el Tai Chi tradicional, tal como lo hace un reducido número de personas, busca volver a la esencia del estilo como un todo: arte marcial y método terapéutico. Porque obviamente, el Tai Chi no se inventó solo para que los ancianitos chinos ejercitaran el cuerpo, si no también para que los maestros maltrataran el cuerpo de su oponente.
Las similitudes con el Wing Tzung (o Wing Tsun, Wing Chun, como querráis llamarle) son muchas y me da la ligera impresión de que éste se deriva del Tai Chi. Donde el WS usa una estructura triangular, el Tai Chi usa el círculo, ambos hacen énfasis en redirigir los golpes con movimientos de tronco, mantener el contacto, atacar en vez de defender y la pelea a muy corta distancia con combinaciones de varios golpes. Los desplazamientos son muy parecidos, y tantos otros detalles que no me extenderé para no abrumarlos con cosas que no puedo ilustrar adecuadamente.
En fin, que si alguien piensa que el Tai Chi no es un buen método de defensa personal, está muy equivocado.
Ptex es ahora open source
Ptex es una biblioteca de mapeado de texturas desarrollada por los estudios Disney y utilizada en la película Bolt. Ptex te permite olvidarte del mapeado UV, ya que cada cara recibe una textura individual, ofrece un formato propio para almacenar eficientemente cientos de texturas y proporciona E/S cacheada y filtrado de alta calidad.
Ahora está disponible bajo licencia BSD, o sea, que básicamente puedes hacer lo que te dé la gana con ella. Veamos cuánto penetra esta opción en el mundo de los videojuegos y herramientas libres.
Ahora está disponible bajo licencia BSD, o sea, que básicamente puedes hacer lo que te dé la gana con ella. Veamos cuánto penetra esta opción en el mundo de los videojuegos y herramientas libres.
Hechos sobre Jack Bauer
Ahora que estamos en temporada de 24, algunos hechos sobre Jack Bauer:
No puedes comparar a Jack Bauer con Jesucristo. Jesucristo solo resucitó una vez.
Matar a Jack Bauer no lo mata. Solo lo enoja.
Jack Bauer puede respirar el gas nervioso Centox y sobrevivir. Solo le gusta contener la respiración.
En Santa Monica High, salir con Kim Bauer era conocido como "el beso de la muerte".
Jack Bauer puede morderse su propio codo. En menos de 24 horas.
Jack Bauer no muere. Simplemente se queda dormido cuando la tortura se vuelve aburrida.
Jack Bauer no esquiva las balas. Las balas lo esquivan a él.
Si Jack Bauer fuera gay, se llamaría Chuck Norris.
Jack Bauer no sigue los protocolos, los protocolos lo siguen a él.
Jack no cree en las Leyes de Murphy, solo en la Ley de Bauer: Si algo puede ir mal, se resolverá en 24 horas.
No puedes comparar a Jack Bauer con Jesucristo. Jesucristo solo resucitó una vez.
Matar a Jack Bauer no lo mata. Solo lo enoja.
Jack Bauer puede respirar el gas nervioso Centox y sobrevivir. Solo le gusta contener la respiración.
En Santa Monica High, salir con Kim Bauer era conocido como "el beso de la muerte".
Jack Bauer puede morderse su propio codo. En menos de 24 horas.
Jack Bauer no muere. Simplemente se queda dormido cuando la tortura se vuelve aburrida.
Jack Bauer no esquiva las balas. Las balas lo esquivan a él.
Si Jack Bauer fuera gay, se llamaría Chuck Norris.
Jack Bauer no sigue los protocolos, los protocolos lo siguen a él.
Jack no cree en las Leyes de Murphy, solo en la Ley de Bauer: Si algo puede ir mal, se resolverá en 24 horas.
SVN actualizado
Estoy en proceso de actualizar el repositorio SVN en Sourceforge con los últimos cambios y arreglos. Ya hay una ventana para revisar el inventario (vacío, a menos que cumplas la misión inicial) y otra para comerciar, aún sin implementar pues no he dispuesto de tiempo suficiente para programar.
Así que si alguien quiere tomarse la molestia de bajar el svn (las indicaciones están en algún sitio aquí), el código debería funcionar a menos que yo haya olvidado algo. Antes de compilar es necesario regenerar los wrappers, que esos sí no me preocupo de tenerlos actualizados. Para ello basta con ejecutar pkgs/swig-regen.sh. Para los usuarios de Windows tendré que buscar una variante, pero es que me resulta más cómodo manejar algunas cosas desde bash.
Así que si alguien quiere tomarse la molestia de bajar el svn (las indicaciones están en algún sitio aquí), el código debería funcionar a menos que yo haya olvidado algo. Antes de compilar es necesario regenerar los wrappers, que esos sí no me preocupo de tenerlos actualizados. Para ello basta con ejecutar pkgs/swig-regen.sh. Para los usuarios de Windows tendré que buscar una variante, pero es que me resulta más cómodo manejar algunas cosas desde bash.
Ogre y drivers open source
Tenía pensado probar el proyecto con los controladores abiertos de ATI, el viejo radeon que soporta todas las tarjetas obsoletas, pero resulta que Ogre no funciona con ellos. Si no recuerdo mal, no sucedía así antes. Pregunté en el foro y no me han confirmado el problema, pero el error que da ("Problems getting GL version string using glGetString") sí está documentado como problemas con el driver, generalmente cuando no es el oficial. Tendré que seguir esperando hasta que llegue la nueva tarjeta, a ver cómo me va con Nvidia.
Sin embargo esto produce un gran problema: los usuarios que quieran seguir con sus controladores radeon abiertos no podrán jugar. Y siempre los hay, sobre todo los que no pueden actualizar su hardware obsoleto.
Sin embargo esto produce un gran problema: los usuarios que quieran seguir con sus controladores radeon abiertos no podrán jugar. Y siempre los hay, sobre todo los que no pueden actualizar su hardware obsoleto.
Suscribirse a:
Entradas (Atom)