Mostrando entradas con la etiqueta proyectos. Mostrar todas las entradas
Mostrando entradas con la etiqueta proyectos. Mostrar todas las entradas

sábado, 11 de septiembre de 2010

Saboteur

Ya puede considerarse terminada SABOTEUR, a falta de que decida hacer alguna ampliación.
Finalmente es una aventura 2D con interfaz conversacional, y no puede jugarse sin gráficos.

Las descripciones de las localidades no existen, salvo algunas impresiones del PJ en lugares relevantes. Las localidades se muestran gráficamente en 2D y tanto el PJ como los PNJ actúan en ellas conforme a los sucesos.
El resto de los textos usuales en una aventura conversacional sí que están incluídos.


Me ha costado horrores escoger el título, todos los que se me ocurrían me sonaban ridículos, demasiado largos, o pretenciosos, de modo que por pura desesperación he optado por "Saboteur", mismamente, como los juegos que inspiraron a éste.

[Actualización 14 de Septiembre]
La aventura puede descargarse AQUÍ. Ocupa 7 megas.

lunes, 9 de agosto de 2010

Los saboteurs

En los 80 estaban de moda los karatekas y los ninjas, y de esto trataba la saga Saboteur.
En la primera parte, que no jugué, pero pude ver en casa de un chaval con un CPC monocromo tomábamos el papel de un ninja. En la segunda parte, que sí que tuve en mi CPC, encarnábamos a la hermana del anteriormente citado que debía ¿vengarse? infiltrándose en un complejo de unas 500 pantallas para desactivar el lanzamiento de un misil.
Los movimientos eran un petardo, propio de los juegos de la época, pero aun así la acción era trepidante, echándole imaginación y, en el caso de la segunda parte, gracias a la banda sonora, compuesta por Rob Hubbard (aunque mola más esta versión mejorada made in Spain).



El caso es que pretendo hacer algo parecido pero en plan conversacional.
Un ninja (o agente de negro) que se infiltra en una base enemiga compuesta por localidades bidimensionales, aunque en este caso con la posibilidad de traspasar puertas hacia terceras dimensiones.

No habrá animaciones, pero sí representaciones del personaje en las distintas acciones y posiciones.
Así, cada parte del decorado tiene sus coordenadas, y los objetos que dejamos también memorizan el lugar donde quedaron.
Al igual que en Randolph Dwight, el personaje se desplazará (aparecerá gráficamente desplazado) por la pantalla hasta el lugar donde se encuentre el objeto a manipular y en la pose adecuada para dar el pego de que está realizando dicha acción.
Es una mezcla de animación por turnos y por eventos de tiempo.
Así, si escribimos "coger pistola", el personaje aparecerá agachado unos segundos en el lugar donde yace la pistola (que también aparecerá representada en el suelo, aunque sean 4 pixels) y posteriormente se reincorporará.
Si saltamos tanto de lo mismo, el personaje no va a permanecer en el aire hasta que nos dé por escribir la siguiente orden y pulsar return.

Se diferencia de Barbarian Quest en que el personaje no se mueve, sino que aparece desplazado, y en que el interfaz es 100% conversacional.
Hasta ahora sólo había estado haciendo gráficos, pero hoy he programado la interfaz con unas pocas acciones y funciona bastante bien.

Las pantallas son de 800 por 200 pixels.
Primeramente dibujé las piezas para componer escenarios, los "ingredientes", pero en lugar de dibujar las pantallas a la antigua - -, lo cual sería una tortura china y consumiría mucho tiempo de proceso, grabé varios modelos básicos de escenarios ya compuestos a los que sólo habrá que añadir algunas partes externas para personalizarlos.
Por ejemplo, a un pasillo le puedo añadir puertas, muebles, muros laterales, y configurar así la decoración y las salidas de la localidad.
Glulx no tiene las capacidades de un lenguaje de programación de videojuegos: redibujado selectivo o volcado de buffer, por tanto dibujar muchos gráficos significa un lapso que se acaba notando, más si son PNG que si son JPG. Por tanto pego de base un JPG, e intento que los añadidos sean también JPG, salvo cuando no hay tu tía y necesito las transparencias de los PNG.

Tambien estuve barajando si usar una malla definiendo el mapa cómodamente en una matriz, y por ahora lo he descartado, ya que lo que me ahorro en mapeado me lo como luego configurando decorados con numeritos.
Serán localidades donde el decorado base se define en una propiedad, y los complementos en propiedades especiales acompañadas de las coordenadas del añadido, que sirven tanto para saber dónde se dibujan, como para tener la referencia de dónde tiene que ir el personaje si esa parte añadida es interactuable.
Así:
localidad lugar1 "lugar"
with
el_grafico pasillo1,
muroizquierdo 0,
escalerabaja 340,
;
Sólo con esto puedo automatizar desde la clase localidad que hay salida hacia el oeste, pero no hacia el este (pues existe la propiedad muroizquierdo); y que además se puede bajar por una escalera y el personaje cuando vaya a bajar o acabe de subir por ella se dibujará en la coordenada x=340.

Las puertas las meteré desde fuera, ya que como pueden estar abiertas o cerradas, y haber más de una por localidad (les pondré distintos colores), deben constituír cada una un objeto.

En Regreso al Edén ya hice una escena aislada así, donde el personaje era representado como en un arcade 2D localizado en la pantalla en función de su posición (la escena de cruzar el puente). Ésta vez será la base de la aventura.

Aunque no haya animaciones, creo que la acción va a ser igual de trepidante. Los resultados de las órdenes son instantáneos, y no hay que esperar cansinamente a que el personaje eche a correr y desaparezca por un extremo de la pantalla.

En Saboteur 1 el ninja llega a la base en una barca, en Saboteur 2 en un ala delta; y escapan respectivamente el helicóptero y en moto.
¿cómo puedo superar tal espectacularidad ochentera?

Aquí el ninja llegará a la base escondido en el camión de reparto de Mahou y escapará en una superbicicleta con cuadro de carbono y tubeless... por un carril bici, que ahora están de moda XD (Es broma, en parte)

Actualizo:
El juego sí que tendrá algunas animaciones de desplazamiento, pero parciales. No será el movimiento completo desde un punto hasta el destino sino los primeros pasos a modo de insinuación.

No tendrá descripciones, salvo particularidades, todo habrá que verlo en la pantalla, aunque los resultados de las acciones sí se describirán en texto escuetamente.
Lo que sí que se listan son los objetos pequeños, ya que debido a su tamaño, aunque aparezcan representados, son imposibles de reconocer (por ejemplo, una moneda serían dos píxels, podría ser cualquier cosa, incluso una textura de la pared)
También, incluiré algún comando de rastreo que liste los objetos de escenario de cada localidad, que se podrá configurar como permanente, para que los jugadores invidentes no tengan que estar tecleándolo constantemente.
Aun así, el resultado sin gráficos será muy pobre. La gracia de la aventura está en el feedback visual, aunque la alimentación sea textual. Será como "leer un cómic" :P

[Actualizo]
Parece que existe desde hace tiempo un remake un tanto libre de los Saboteur con el remix de Saboteur 2 Marcel Donné como banda sonora. Ver aquí.
El resultado no me gusta mucho, usa gráficos fusilados de otros juegos y con animaciones bastante chuscas.

jueves, 3 de diciembre de 2009

Elige tu propia orcoaventura

Quizá haga algo para la orcoscomp. Estoy planeando un mix entre aventura conversacional y librojuego con combates. Gracias a Eliuk ya tengo el código funcional para lo que es el motor, formado con extractos de la librería Fhablao.h, un parche de Datoki y sustituyendo los "Quips" por flags, usando la librería NewFlags.h

Ahora se me plantea la dificultad de crear las escenas librojuego. El concepto de puzzles es completamente diferente aquí que en modo conversacional. De hecho es complicado implementar algo parecido a un puzzle con un sistema de opciones, casi estás dando la solución.
Por tanto, por un lado los textos, el relato, cobran más importancia. Por otro, cuando el jugador debe decidir, las opciones deben de tener algún sentido e interés, el cual estará fuertemente ligado al interés que despierte el propio relato.

Lo cual no ocurre en la conversacional, donde tenemos multitud de opciones invisibles, y de entre ellas muy pocas que sean realmente prácticas.

Al principio pensé en esto con la idea de que sería más rápido y sencillo hacer un librojuego que una aventura conversacional corta, pero me estoy temiendo que no va a ser así, aun con el motor listo.
Podría "fusilar" algún libro de Lobo Solitario... XD
A parte de tener que pensar todas las subtramas, esto va a ser como volver a programar por tablas, haciéndote un mapita en árbol de localidades y comunicaciones entre ellas (opciones).
Claro, que todo se puede simplificar:




En cuanto al sistema de combate, se basará en turnos alternativos de atacar-defenderse, entrando en juego la Destreza en el Combate, la Energía, la ruleta, bonificaciones o penalizaciones en función del tipo de ataque, y penalizaciones por luchar contra más de un enemigo.

La energía mide tanto la vida como el cansancio, cuanto más fuerte estés mejor peleas.
Cuando la energía llega a cero mueres, incapaz de defenderte más.
.
Atacar a más de un enemigo supone que tienes que dividir tus puntos de destreza a la hora de defenderte entre el número de amenazas.

Las tiradas de la ruleta son de 0 a 9, siendo 1 pifia (fallo seguro) y 0 (10) acierto seguro. Además, sacar un 0 atacando a un enemigo que anteriormente obtuvo pifia supone un crítico: daño x 3.

Las tácticas de combate son 4:
1. defensiva.
2. equilibrada.
3. ofensiva.
4. sucida (berserker).
La defensiva es la única que no consume energía, se basa esquivar y buscar buenas posiciones para atacar sólo ante oportunidades claras. Como compensación, en el turno siguiente tendremos una bonificación de defensa.
La sucida es la que más aumenta la probabilidad de acierto en el enemigo, a costa de que en el turno siguiente, cuando seamos atacados, sufriremos una penalización en nuestra defensa, y además consume más energía.
El resto de las opciones tienes sus bonificaciones y penalizaciones igualmente.

Lor rivales mayormente serán orcos, lo que se traduce en una destreza en el combate inferior a la del protagonista, pero una fuerza mayor. Es decir: tienen menos probabilidad de acertar, pero cuando aciertan, su daño base será mayor. En la característica de Fuerza están incluídas tanto la potencia del atacante como la del arma con la que golpea.

Todas las reglas son ambivalentes, se aplican por igual al protagonista y a los enemigos, que también decidirán individualmente la táctica de combate que más les conviene en cada turno.




jueves, 21 de mayo de 2009

La Venganza de Yan, release 0


Acabo de subir al CAAD La Venganza de Yan.

Yan, ausente durante años labrándose un futuro en el ejército, regresa unos días a su isla natal.
Y en ella descubre que de la aldea sólo quedan ruinas y brasas aún calientes y humeantes.
¿Quién ha podido hacer esto?
¡Quien haya sido lo pagará!

Ocupa unos 10 megas, de los cuales la mitad son gráficos, luego sonido, y por último el código en sí, que son 500 Kb.

Para más información podéis leer el comentario de Urbatain en SPAC, tras testear la aventura, o entradas anteriores de este mismo blog para detalles técnicos.

miércoles, 29 de abril de 2009

Gráficos con Inkscape

Llevo cosa de un mes usando Inkscape, a la par que Urbatain (lo cual habrán notado por su serie de pruebas de concepto de El Anillo).

Haciendo los gráficos para "La venganza de Yan", empecé con un estilo sencillo para poder ir rápido. El caso es que cuando vas cogiendo destreza, puedes hacerlo menos sencillo sin perder velocidad.
He usado mucho del reciclaje de siluetas para abarcar las diferentes localidades de una misma zona.
Por ejemplo, para dibujar un bosque pinto unos pocos modelos de follaje, ramas y troncos, y lo que sigue es un copy-paste a lo bestia. Una vez compuesta la escena, se copia y se reordena todo para hacer otra localidad.

Y no todo es Inkscape. Aunque es ideal para dibujar las siluetas y calcar de imágenes... para los retoques finales o para dibujar las sombras de los personajes es preferible usar un programa de retoque fotográfico, a base de máscaras.
Así lo estoy haciendo finalmente, tras una fase incial de intentar obtener el acabado definitivo con el propio Inkscape.

El nivel de calidad ha ido in-cresccendo, y eso se nota comparando los primeros dibujos con los últimos. Las primeras localidades voy a tener que redibujarlas porque se han quedado muy atrás.






El tamaño de los gráficos es de 720 x 195 px

lunes, 6 de abril de 2009

La Venganza de Yan

Estos días estoy programando una historia que se me ocurrió el jueves. La programación va a buen ritmo, sólo que me falta por planear las secuencias finales (que no el final). Realmente ha ido saliendo todo improvisado a partir de la idea general.
La ambientación está inspirada en un antiguo largometraje animado chino llamado "Taro el niño Dragón (Tatsunoko Taro)"... aunque de la inspiración a la expiración hay un trecho ;D

Por fín voy a implementar para algo más que para juegos de palabras lo que aprendí del código de "Ad Verbum": para conversaciones con PSIS y como apoyo a otros objetos del juego, para poder especificar detalles sin necesidad de crear nuevos objetos ligados.

Se trata de un parseado en paralelo, que no suplanta sino que complementa, un parseado de reconocimiento de cadenas o de trozos de texto.
Inform funciona igual que siempre, sólo que cuando quiero le consulto al otro parseado qué ha encontrado, y así puedo dar mejores respuestas a las cosas que me interesen.

He dispuesto 5 variables que recolectan los valores coincidentes del parseado en paralelo, y son estas variables las que se consultan luego desde el código de los objetos y las funciones.

Es un sistema a la vieja usanza. Te tienes que haces una tabla y apuntar qué número está representando a qué concepto (uso "concepto" para describir un grupo de palabras o cadenas que vienen a ser sinónimas en el contexto del juego). Y a la vez escoger bien cómo haces las listas, en qué orden pones las cadenas en el código y cuál de las 5 variables será la encargada de almacenar cada tipo de concepto. En principio una variable cazará conceptos referidos a pronombres, otra cazará partículas interrogativas, otra acciones, otra nombres y otra adjetivos, en principio, porque en la práctica se mezcla todo un poco para aprovechar donde no se necesita y no se prevee que haya conflicto.

La detección de cadenas se realiza por barrido secuencial, no por el orden en que ha sido escrito, sino por el orden en el que cada cadena está escrita en el código. Cada variable adquiere el valor del último concepto coincidente de su lista personal. De modo que si dos cadenas vitales están en la misma lista, la variable sólo almacenará la que esté más abajo en el código.

Así he empezado a programar y ya es tarde para cambiarlo, pero explicaré un sistema mejor:
En lugar de unas pocas variables para muchos conceptos...
Una variable para cada concepto, y claro, no usaremos variables sino Flags (banderas), que apenas usan memoria. Puedes crear 5000 flag y el parser ni pestañea.

De esta forma, antes de cada input ponemos todos los Flags encargados de pescar conceptos en false, y procedemos a hacer el barrido.

En nuestro código del PSI, tendremos cosas como éstas:
react_before[;
hablar:
print "Pepito dice:^";
if(FlagOn(100) && FlagOn(156)) "Me llamo Jhames.";
if(FlagOn(101) && FlagOn(157)) "El pescador se llama Josema.";
if(FlagOn(111) && FlagOn(157)) "¡¿Cómo que quieres matar al pescador?!.";
],


Como decía, hay que tener la chuleta al lado, y veremos las cadenas que activan cada flag:
Flag 100: llama*, nombre
Flag 111: mata*, asesina*, liquid*
Flag 156: tu, usted, te
Flag 157: pesc*d*r



(*) Como esto va por fragmentos, los asteriscos los he puesto a modo representativo para que se vean las partes que se pueden omitir sin problemas. Para palabras largas, para preveer varias flexiones... simplemente detectas las letras de la palabra que son fijas y que son imprescindibles para distinguirla de otra similar.
También se puede fijar la longitud.
Podemos detectar de un plumazo "amigo" y "amiga", programando la detección de "a"+"m"+"i"+"g+"+longitud=5.
Aunque para este ejemplo, lo dejaríamos en "a"+"m"+"i"+"g". Ya que la secuencia "amig" no presenta demasiado riesgo de confundirsem (o estar fundida dentro) con otra palabra. Sin determinar la longitud, el Flag saltaría a la que el jugador escribiera "amigo", "amiga", "amigos", "amigas", "amigable", "amigablemente"... etc

Y así funciona. Que el parser detecte que quieres que "Fulano te acompañe hasta el rio cantando una canción, con las manos en la cabeza y dando saltitos" es posible técnicamente, aunque aviso que no pienso implementar chorradas de ese estilo XD.

La máxima utilidad es distinguir intenciones y preguntas respecto a sujetos.
Puedes decir "Fulano"... ¿Fulano qué?
Dónde vive Fulano.
Quién es Fulano el de la derecha.
Quién es Fulano el de la izquierda.
...
La espada de Fulano... ¿qué pasa con la espada de fulano?
Dame la espada de Fulano
Encuentra la espada de Fulano
Fulano no tiene espada
...
Quiero matar a Fulano.

Hoygan nesesito un krak para Fulano es urjente.

Fuera de las conversaciones, esto sigue siendo muy útil. Por ejemplo, para un combate:
Tenemos un objeto "troll" y queremos poder elegir a dónde le atizamos con la espada.
Normalmente habría que crear un objeto "mano", un objeto "brazo", un objeto "pestaña"...

Con este sistema simplemente creamos el objeto "troll", así:
object Troll "Troll" limbo
with name 'troll' 'planseldon',
adjectives 'mano' 'manos' 'brazo' 'brazos' 'pierna' 'piernas' 'derecha' 'izquierda' 'pestaña',
before[;
Attack: print "Golpeas al troll en ";
if(FlagOn (50))"una mano.";
if(FlagOn (51))"un brazo.";
if(FlagOn (52))"una pierna";
!etc
"una parte al azar de su cuerpo.";

],
has animate scenery talkable;


Nuevamente tendríamos que mirar la lista para ver qué activa cada flag. Pero en este caso, del propio código se deduce:
Flag 50: mano*, dedo*
Flag 51: brazo*, codo*
Flag 52: pie/, pies/, pierna*
!etc

Resúmen de lo que hemos hecho:
  1. Un único objeto
  2. Introducimos los nombres de todos los blancos o subelementos en la propiedad 'adjectives' para que el parser trague con ellos (recordemos cómo funciona Inform, el parseado en paralelo "detectacascajos" actúa de apoyo, pero no sustituye) (*** ver NOTA1 al final)
  3. En el código del objeto consultamos las pesquisas que ha realizado el parseado en paralelo de detección de cadenas, a ver si "ha pescado algo". De ser así, podemos programar fácimente una respuesta personalizada, y si no, dejamos que salte la respuesta estandar.

*** NOTA1:
El código del Troll arriba expuesto sólo es viable-razonable en un modo de parseado tal que la propiedad adjectives no tenga la misma jerarquía que la propiedad 'name' sino que sea dependiente. ('adjectives' sólo se consulta si antes ha habido coincidencia en la propiedad 'name')
En caso contrario, el código expuesto es inviable, pues estaría abierto a disparates tales como escribir "ex pestaña" y recibir la descripción del troll".

***NOTA2:
El código para realizar este parseado "bruto" tipo PAWS en paralelo está expuesto AQUÍ, aunque en la versión "poco óptima", usando unas pocas variables en lugar de millones y millones de Flags.

domingo, 18 de enero de 2009

Fuentes TTF

Me bajé el otro día el Font Creator de High-Logic y una maravilla. Teniendo en cuenta que nunca había usado un programa de estos para hacer fuentes, resultó ser bastante intuitivo y funcional.

Tenemos un mapa general de caracteres, desde el que podemos copiar y editar, pasando a la ventana de diseño vectorial. Aquí dibujamos las fuentes usando el botón izquierdo para marcar puntos y el izquierdo para marcar puntos de tangencialidad (para trazos curvos). Podemos igualemnet copiar y pegar trozos de polígono.

En resúmen, que tiene todas las herramientas para diseñar bien y rápido, y gratis, aunque el programa cuente con una versión "pro" con más funciones.

La fuente se graba en formato TTF, se copia en la carpeta de Windows de fuentes, y ya la tenemos disponible para usarla.

Adjunto unas capturas del proyecto "Nagalok", que no he tocado desde finales del verano, cuando volvía cambiarle los gráficos por enésima vez aprovechando las numerosas fotos de casas de entramado de madera "timber frame" que hice en las vacaciones. Le he aplicado un alfabeto inventado bastante inextricable, pero que ambienta mejor que el estándar. Ya que se desarrolla en otro mundo, pues otro alfabeto, otro lenguaje... queda más exótico y misterioso.



El mismo alfabeto, en su versión de letras no ligadas:

jueves, 6 de noviembre de 2008

Preview Palabra Exacta

"Palabra Exacta" no será el título definitivo, pero lo es provisionalmente, para la aventura basada en Ad Verbum.
Es una aventura breve en tono de humor, dentro de una torre encantada. Repleta de retos basados en juegos de palabras: "wordplay" que dicen los guiris.

Una pequeña presentación:


(La aventura será sólo texto, sin gráficos ni sonido ¡Oh!)

lunes, 27 de octubre de 2008

Ad Verbum

L'otro día Urba me convenció (tras no conseguir que le dibujara unos elfos) para hacer una versión en castellano de Ad Verbum, la premiada aventura de Nick Montfort que tiene como particularidad estar basada en juegos de palabras.

Nuestra misión consiste en recoger todos los objetos de la mansión de un brujo, estando estos objetos en habitaciones encantadas, de tal forma que tendremos que vérnoslas con el léxico inglés para hallar los comandos que podemos escribir. Y es que, por ejemplo, en la sala Norte, todos los textos están escritos con palabras que empiezan por N, y nosotros, mismamente, sólo podremos indroducir órdenes con palabras con una N delante. Luego olvidémonos de comandos como TAKE o EXIT.

En castellano quedaría algo así:
S
Salón sombrío. Sientes seis simios sarnosos sentados sobre sendos sofás silbando soporíferas saetas sevillanas. Seguidamente, sobre sólido soporte saliente, se sitúan sobrias sandalias sarracenas.
>>COGER SANDALIAS
¡Shhhhh! ¡Silencio! Sacrilegio sugerir semejantes sandeces.
>>EX SIMIOS
¡Shhhhh! ¡Silencio! Sacrilegio sugerir semejantes sandeces.
>>SENTIR SIMIOS
Son seres selváticos, salvajes, sentados sobre sus sofás. Silban sin saber solfeo, sin salero.
>>SABOREA SIMIOS
Simios sin salsa saben sosos.
>>SENTARSE SOFA
Sobre sofa se sitúa simio salvaje. Se sulfurará si sobre su sayo se sientan.


M
Muros manchados, mazmorra macabra. Momios malvados me miran mal, meditando macarrónicas monsergas, meneando maracas musicales. Mobiliario: mesa marrón, mampara moteada.
>>MANGAR MARACAS
Mala manera. Momios manifiestan: "mangantes merecen morir".
>>MATAR MOMIOS
Momios muy mortíferos, mejor me mantengo manso, menos macarra.
>>MANOSEAR MESA
Momios malhumorados me manotean manifestando: "¡manchas muebles, manos mugrientas, maldito maleducado! ¡multa millonaria!"



Lógicamente no es una traducción, ni es mi intención. Se trata de, sobre la misma idea, hacer historias distintas, y es que ya sería casualidad que se pudieran hacer los mismos juegos de palabras que en inglés. No, por tanto las salas son diferentes.

Habrá salas con más letras, y me ahorraré otros puzzles con palabras que incluye Ad Verbum que encuentro demasiado rebuscados para centrarme en sacarle el máximo jugo a los juegos de letras iniciales o palabras con una sola vocal.

Todo esto una vez hallada la forma de procesar esto con el párser, que ya veremos ya veremos... Supongo que un pawslike vendría mejor al caso, o quizá programarlo directamente en Python a pelo, sin parser.

miércoles, 13 de agosto de 2008

viejos programas en AMOS

Como ayer tuve que ir a la sierra, aproveché para montar el Amiga y cargar unos cuantos programas que había hecho en AMOS, un lenguaje parecido al BASIC, pero especializado en la creción de videojuegos, con funciones para "pegar" sprites, detectar el joystick...etc

En los diquetes que cargué había:
-Proyectos de aventuras conversacionales:
Uno con gráficos concluído... hasta que se me agotó la memoria, dos bocetos, y otro sólo texto que no sé si termina, porque desde luego que son injugables.
El código es algo así como unas definiciones de DATAs con los verbos y el vocabulario, todos recortados "mira" "exam" "coge" "da"... y luego un input y a buscar coincidencias.
En la primera localidad de la que está terminada no logré hacer nada, y eso que más o menos recuerdo por dónde van los tiros, más que nada porque ese comienzo más tarde lo reciclé para "La Guarida Valshar".

-La aventura del Orco:
Quizá es lo más jugable que programé, es una aventura 2D de un orco que tiene que recuperar la piedra Il que cura una enfermedad que afecta a su horda. Con el joystick nos movemos, podemos recoger objetos, y con disparo accedemos a un menú para hablar (escribiendo tal cual) o utilizar objetos, entre ellos un libro de hechizos (también deberemos escribirlos tecleando).

-Proyectos de juego de rol en primera persona
Tipo Eye of the Beholder, sin monstruos ni menús, sólamente los laberintos y los dibujos de los muros. Curiosamente los laberintos estaban definidos en una matriz de DATA con "1" y "0", indicando los huecos y los muros, lo mismo que he hecho recientemente para la automatización en una malla 2D de los laberintos de PUJ.

-Varios:
*El Tron, llamado "Destellos", para uno o dos jugadores y con varios niveles, algunos de los cuales tienen "passing-points" que irán rellenando un marcador al pasar sobre ellos.
*El ahorcado con un monigote dibujado a un lado, con la cabeza metida en una guillotina, que gesticula en función de nuestros aciertos, y acabará gullotinado si fallamos.
*El buscaparejas: un damero de casillas ocultas que revelaremos por parejas mostrando las imágens que esconden. Se trata de ir recordando donde estaba cada una, para levantar a la vez las que son iguales.
*La barra y la pelotita, un machacaladrillos pero sin ladrillos, un frontón en solitario.
*El Lingo, el juego del programa de la tele.
*Proyectos de aventuras gráficas con menús tipo Delphine pero sin personajes, que no pasan del menú o de una pantalla sin mucho que hacer.
*Proyectos de plataformas 2D con muñegotes saltarines.
*Proyectos de isométricos (sólo el movimiento del personaje)

Los gráficos dibujados a golpe de Deluxe Paint

Las fotos de las pantallas han salido fatal, el refresco de pantalla era muy lento al hacer correr los juegos (cosas de ser un lenguaje interpretado), incluso se podía apreciar a simple vista el barrido

Ventana principal de edición de AMOS. Lo que más me llamó la atención son lo diminutos que son los códigos en comparación con los fuentes que manejo ahora.


La aventura del Orco. te puedes mover de derecha a izquierda o entrar por las puertas hacia habitaciones paralelas. Las pantallas están dibujadas a base de "tiles".
El objetivo era encontrar la piedra mágina Il, pero como el juego no tenía instrucciones, eso sólo lo sé yo... bueno, ni yo, porque hasta que no terminé le juego no me acordé de cuál era el objetivo.

Empezabas en una serie de salas por las que deambulaba otro como tú llamado Blongo. En general, por todo el juego hay placas en la pared que te dan pistas en plan "las mejores cosechas crecen bajo las estrellas" "en la marca roja..." y algunas otras con simples tonterías inservibles como "la intuición radica en el rabillo del ojo".
Los hechizos que usas son 5:
-El de disminución, para convertir a un monstruo verde que no te deja pasar en un enanito que huye despavorido.
-El de crecimiento, para hacer brotar setas, sólo posible por la noche, como te dice la pista. Para que sea de noche, si resulta que es de día, hay que darse una vuelta pasando pantallas, o entrar y salir entre dos, ya que a cada paso de pantalla progresa el cielo exterior.
-El de miedo, para apartar a un tipo que te dispara con una cervatana, trás descubrir aquello a lo que teme: a las setas.
-El de descubrir, para ver cual de los toneles de "lom" de la bodega está marcado con una X. Aquel que beba de él se convertirá en una seta (hay que aprovechar los sprites). Llenas una copa, se la llevas a Blongo y se convierte en una seta al beberla, una seta que repite una palabra mágica, un hechizo para teletransportarte... (ingenioso ¿verdad? XD)
-El de convertir en oro... al revés. Al final del juego nos encontramos con la situación de que el que tenía la piedra Il ha convertido todo lo que tenía en oro, incluída la piedra. Entonces tenemos que escribir el hechizo de convertir en oro al revés para desfacer la pifia.




Las aventuras conversacionales. La que se ve en la parte superior es la que está terminada. Básicamente empezabas en una celda, como en La Guarida Valshar, luego aparecía por ahí una rata parlanchina, le pedías comida al carcelero, y se la dabas a la rata, que te mostraba una salida secreta. Llegabas a otra sala a través de una máquina de Cocacola, o algo así. Luego había un bosque con un gnomo que hacías salir de su casa tapándole la chimenea, una taberna, y un precipicio con un tronco en medio del cual te esperaba un diablo. A éste le hacías caer metiendo una vara en un hueco del tronco y haciendo palanca para que girase.

La de la parte inferior es sólo un modelo, no hay nada más que hacer, que ver que funciona coger cosas y los verbos.
Destacar la parafernalia del marco, muy propio de cuando la memoria era un problema, para meter gráficos lo más pequeñitos posibles sin que cantase mucho que eran ridículamente pequeñitos.


Arriba el juego del Lingo, que trata de adivinar palabras. Primeramente te aparecen una pocas letras y espacios en blanco, por ejemplo: -R--A-
A continuación pruebas una palabra que case con el modelo, por ejemplo TRIGAS, si no era esa la palabra, al menos se te marcarán las letras que coincidan en posición con el de la palabra secreta (si esta fuera BRIDAS, en el siguiente turno se quedaría la palabra así: -RI-AS)

Abajo, un "dungeon" con el menú de movimiento (sin los gráficos de las flechitas) típico de este género: Avanza, gira, atrás, y moverte en paralelo.
Los muros están realizados gracias a la opción de deformacion en perspectiva del Deluxe Paint. De todas formas, recuerdo que fue llevadero recortar cada trocito de muro para todas las posibles posiciones en 3 o 4 niveles de profundidad (afortunadamente los dungeons son muy oscuros, y puedes justificarte así de no dibujar más planos hasta que no quepan los pixels :D)
Éste se mueve un poco lento por el tamaño descomunal de la ventana gráfica (le llevaba demasiado tiempo a la máquina montar todos los srpites, y más teniendo en cuenta que esto es un lenguaje interpretado, y parte de la memoria la está consumiendo el propio AMOS); de modo que hice otro con la ventana más pequeñita, y así corría más ligero.

martes, 12 de agosto de 2008

IA en el juego de mesa-estrategia

Técnicas de estrategia.
Por ahora la IA de los emperadores rivales manejados por el ordenador funciona así, en base a un sistema de puntuación:
1. Valorar movimiento de tropas.
-Busca territorios propios
-Busca territorios accesibles desde los propios
-Comprueba que hay tropas que mover
*Valora el número de tropas enemigas en esos territorios.
-Comprueba que nuestras tropas son suficientes para ganar. ++ o --
*Valora riqueza de ese territorio. ++
*Valora si es capital de otro reino. ++
-Si no hay tropas para mover desde el territorio que da acceso al movimiento de máxima puntuación, valorar un posible paso de tropas desde otro territorio colindante, para en el siguiente turno...

2. Valorar lo expuesta que está nuestra capital
-Busca el territorio donde está nuestra capital
-Busca territorios accesibles desde/hacia
-Comprueba si son nuestros o enemigos
-Si son enemigos valora el número de tropas y nuestra fuerza defensiva.
-Si la capital está en peligro:
A-Busca territorios colindantes con aquel que supone la mayor amenaza
-Busca tropas propias en esos territorios
-Valora si alguna de esas tropas es suficiente para acabar con la amenaza
->Ataca
B-Comprueba cuantas tropas podemos reclutar en la capital
-Valora si son suficientes para resistir el posible ataque.
-> Arma las tropas necesarias en la capital
C-Busca territorios colindantes con nuestra capital
-Busca tropas propias en ellos
-Valora si con su regreso a la capital, ésta estará suficientemente defendida
-> Mueve tropas hacia la capital
(no valora la posibilidad de múltiples amenazas sino que busca la mayor de entre ellas; en el caso de múltiples, las dos últimas opciones, B y C, serían preferibles a la primera, A)

3. Valora reclutamientos.

De momento lo he puesto a funcionar saltando el turno del jugador para ver a toda velocidad el transcurso de la guerra, y la cosa funciona poco inteligentemente; se crean circuitos repetitivos que tardan mucho en deshacerse. Lo cual es normal, si todos los emperadores tienen el mismo criterio de ataque y defensa, parece que juegan al gato y al ratón mordiéndose las colas, y sólo tras mucho tiempo alguna capital es tomada y cambian los ciclos por unos momentos para volver a hacerse regulares.

Hay que ampliar la IA con variaciones personalizadas para valoraciones secundarias. Por ejemplo, entre varios posibles territorios de avance, tender a elegir el más rico, el que posea más enemigos, el que pertenezca al emperador que más nos ha atacado...

También con objetivos a largo plazo: La estrategia principal del juego será tomar las capitales, que son el punto flaco de los demás imperios, pero también conquistar pro el camino el mayor número de territorios para obtener más rentas y más soldados. Por tanto, buscar recorridos óptimos hacia las capitales más cercanas y débiles pasando de camino por los territorios más fáciles de conquistar.

Y con autocorreciones: si tras varios turnos, el promedio de territorios, riqueza y tropas sale negativo en comparación con la media de los demás emperadores, algo está haciendo mal, luego debe cambiar sus criterios de valoración secundarios (los que no tienen que ver con la defensa de la capital, que son prioritarios)

sábado, 9 de agosto de 2008

El Wargame y la Aventura 2D en acción

Unas capturas subidas a Youtube:

sábado, 2 de agosto de 2008

pythoneando

Empecé a primeros de Julio a investigar Python+Pygame, y la verdad es que ha cundido la cosa. Este blog que al principio pretendía ser de programación de Inform, y luego pasó a ser de programación y chismorreos caadianos, va a terminar por ampliarse a blog de videoaventuras en general. Esto es: videoaventuras conversacionales, videoaventuras de plataformas, videoaventuras de mesa...

Empecé realizando el proyecto que tantos años deseaba hacer y no pude por mi falta de conocimientos de programación: una aventura 2D tipo Another World, que cumpla ciertos aspectos que considero importantes:
-Gravedad e inercias reales, velocidad, nada de saltos fantasma en plasma líquido. Puedes controlar los saltos mientras en la animación el personaje tenga algún pie en el suelo; una vez en el aire, éste sigue una trayectoria invariable salvo que se estampe con alguna masa.
-Transiciones entre acciones: no puedes pasar de correr a andar así sin más, ni cambiar de dirección sin amortiguar la inercia. Mismamente, si vas corriendo y pulsas para salto de longitud, el comando no se ejecutará instantáneamente sino en el momento en el que termines la zancada, para tomar impulso, como lo antes dicho.

Para esto las acciones van por pilas: accion_actual y accion_siguiente, la cual salta cuando el frame de transición sea el correcto.

Más o menos he conseguido el motor, más o menos porque se podría mejorar con más fidelidad, pero es un coñazo dibujar tantos frames.
Grabación en video->volcado->selección de fotogramas->calco en vectorial->conversión en bitmap->edición->"amontonamiento" en capas->grabación en PNG

...

Como me estaba saturando de este proyecto, y no estaba inspirado para un buen guión, carpetazo y quise hacer un juego de mesa tipo risk.
31 territorios y 8 emperadores rivales por conquistarlos.

El sistema de lucha será sencillo: 2 contra 3 = mueren dos de cada ejército y gana el segundo con una tropa viva; con algunos modificadores: los que atacan tienen un porcentaje de desventaja; también se acumula un portentaje negativo si atacan una ciudad fortificada (hasta tres niveles de fortificación); o si atacan un reino montañoso, donde mismamente los que ya están ahí esperando tienen ventaja posicional sobre los que llegan.
El sistema se irá calibrando cuando funcione.

También barajo -utópicamente- hacer los combates jugables, de forma que el 2 contra 3 ganan los segundos sea más relativo (aunque 2 contra 4 ni de coña), adquiriendo la piel del general que da las órdenes, las cuales son transmitidas por los músicos con códigos de trompetiles, y con muchas animaciones "jolgoriosas" de fondo (si no, no mola):
¡arqueros!, ¡primera línea avance!, ¡atrás!... tipo Patapón-pon-pata-pon.

El proyecto 1: Las criaturas humanoides, llamadas naar, tienen cada una un rostro diferente y personal, aunque no se aprecie mucho. Superpongo una máscara translúcida con los matices... y, anden, corran o salten, la cabeza siempre horizontal :D La máscara es de boca para arriba, para hacer comunes los frames de cuando muevan la boca para hablar.

El war-game, en el que de momento no se puede hacer nada más que pasear el ratón por el mapa y curiosear.
El menú de la derecha son las acciones básicas (sin implantar):
-Mover tropas
-Fortificar un sitio
-Reclutar hombres.
Faltan:
-Trasladar la capital del Imperio ( si cae una capital el conquistador se queda con todo, aunque para conquistar una capital, además de enfrentarse a las fortificaciones y tropas que allí se hallen, hay una guardia pretoriana fija, y de regalo, que vale como 3 o 4 tropas)
-Enviar órdenes (las acciones no se ejecutarán hasta que envíes las palomas mensajeras a tus generales repartidos por el imperio). Una vez enviadas, correrá el turno (el mes), se verán los resultados, y los movimientos que han hecho los emperadores rivales.

En fin, lo más importante de Python es esto:
# -*- coding: iso-8859-1 -*-
¡¡¡Sin esta línea mágica no se pueden escribir acentos ni eñññññññes!!!

domingo, 29 de junio de 2008

Brodmann Area 15

Haciendo un meme chorra de esos que purulan por los blogs, consistente en coger una imagen al azar de una página que muestra imágenes al azar, un nombre al azar de una wiki y las cuatro últimas palabras de una página de citas, estas últimas también generadas al azar, y hacer la portada de un disco, me salió esto:

Y más que para un disco, es una portada buenísima para una aventura basada en el mundo de "1984", de Orwell.

Brodmann te vigila, somos tus amigos, siempre estamos a tu lado, vigilamos que seas correcto, por tu propio bien, queremos tu felicidad...

lunes, 2 de junio de 2008

la procrastinación del Cangrejo

Este fin de semana me decidí a terminar fuera como fuese un viejo proyecto en InformATE que inicié en el 2002 y que tenía abandonado.

Últimamente llueve todos los días y hace tiempo que no salgo a la montaña, por tanto los fines de semana no hago nada productivo, de modo que me autoimpuse cerrar ese proyecto sí o sí durante el finde.
Empecé el Viernes por la tarde, me pasé la madrugada sin dormir, y el domingo a las 23:00 lo tenía terminado... con algunos bugs fatales que tuve que corregir el lunes.

El mismo domingo, de madrugada, soltaron en Redes un palabro muy significativo:
Procrastinación, la acción de procrastinar (del latín procrastinare) es decir, de postergar actividades o situaciones que uno debe atender, por otras situaciones más irrelevantes y agradables. Este término proviene del latín pro- (adelante) y crastinus (relacionado con el mañana).

En el mismo programa, un profesor comentaba una experiencia de todos conocida - seamos alumnos o profesores, jefes o mandaos - relacionada con la fecha de entrega de trabajos.
Este profesor mandó sus alumnos presentar tres trabajos a lo largo del curso. Al primer grupo le puso como fecha límite el último día de clase; al segundo grupo le puso tres fechas, un trabajo por trimestre.
Ni que decir tiene que los trabajos del primer grupo se hicieron los tres en el último momento y mal. En general, empezamos a funcionar cuando la fecha límite está cercana, no antes.

Parece que ponerse fecha y límites es importante. A veces nos ponen fecha desde fuera, otras veces no, y es entonces cuando nos la tenemos que poner nosotros, o esperaremos eternamente hasta un último momento que nunca llegará, porque nadie nos va a decir ¡mañana lo quiero!

En este caso, la postergación no es comparable a la de una tarea obligada, ya que esto es un hobby, sino debida a pretensiones excesivas que arrojan unas perspectivas de programación eternas y costosas en tiempo que terminan por hacerme desechar todo el trabajo anterior para pasar a una tarea más liviana y ágil.

Aquí está la aventura, y la solución.

viernes, 16 de mayo de 2008

Mazmorror

¡¡¡Regístralo!!! el nombre es la hostia, y no lo ha usado nadie ¡corre corre! ¡que se te puede adelantar alguien! (por ejemplo yo)
Se pueden sacar cómics, dibujos animados, camisetas, muñecos, juegos de ordenador, politonos, películas. El nombre es contundente.

Mazmorror es una serie de minirelatos de coña parodiando los juegos de rol, de Fran Kapilla, que debería estar aquí... pero no funciona el enlace.

Tomo prestada la marca de la saga, cumpliendo mi amenaza al autor, para la próxima nano, cuyo título provisional es:
Crónicas de Mazmorror - capítulo X
2001 Puj y un brebaje de gazpacho


Por supuesto, una parodia en un mundo fantástico de alevosas incoherencias y absurdos.

Sí, se parecen mucho... es que son de la misma camada