jueves, 30 de octubre de 2008

Un sistema de conversación decente

De rebote, gracias al código de Ad Verbum, al fín he encontrado -casi, pero me vale- lo que estaba buscando de una forma más sencilla a como lo tenía planteado meses atrás: una forma de leer muchos trocitos dentro de una cadena de texto, y con todos los "objetos-texto reconocido" que quiera. Y lo mejor de todo es que esos trocitos ni siquiera son objetos, luego no interfieren con nada, sólo pueden interferir entre ellos, y aquí entra la buena estrategia para diseñar las raíces de vocabulario de conversación.

Para empezar unifico todos los dispares y poco útiles -a mi juicio- modos de comunicarse que hay en inform:

Extend only 'grita' replace
* -> chillar
* noun -> chillar
* 'a//' creature -> chillar
* 'a//' creature topic -> hablar
* topic -> chillar;
verb 'chilla' = 'grita';

extend 'habla' replace
* ->hablar
* noun->hablar
* topic ->hablar;

extend 'pregunta' replace
* ->hablar
* noun->hablar
* topic ->hablar;

extend 'dile' replace
* ->hablar
* noun->hablar
* topic ->hablar;

extend 'pide' replace
* ->hablar
* noun->hablar
* topic ->hablar;

[hablarSub;
"Hablas, pero nadie te responde.";
];

[comohablarsub;
"Para hablar utiliza la fórmula: DECIR TAL";
];


A continuación viene el detector de cadenas, con la pequeña pega de que hay que escribir los caracteres uno a uno, y que no puedes detectar concatenación con espacios... salvo enrevesando la fórmula con más loops.

[BeforeParsing i j thisword thislength x;
bla1=0; !marca de texto detectado
bla2=0; !marca de texto detectado
bla3=0; !marca de texto detectado
bla4=0; !marca de texto detectado
for (i=parse-->0,j=1:j<=i:j++)
{
thisword = WordAddress(j);
thislength = WordLength(j);
if ( thisword -> 0 >= 'a' && thisword -> 0 <= 'z' ){ if(hablador in location){ if(thisword->0=='v' && thisword->1=='e'
&& thisword->2=='t' && thisword->3=='e') bla1=10;

if(thisword->0=='r' && thisword->1=='i'
&& thisword->1=='o') bla2=1;

if(thisword->0=='t' && thisword->1=='o' && thisword->2=='r'
&& thisword->3=='r' && thisword->4=='e') bla2=2;

!...etc


Y por fín, el personaje hablador. El nuevo sistema de hablar se detectará en el reaccionar_antes (react_before) del personaje, ya que de momento no necesito múltiples interlocutores, y todo lo que hables te lo replicará el único PSI presente, que traga con todo, hasta con su propio nombre si lo pones. Y de paso, me fusilo el Order y el Answer, que también forman parte del club de los modos de hablar múltiples:

object hablador "PSI hablador"
with name 'psi',
react_before[;

answer, order: <
ComoHablar>;rtrue;

hablar:
if (bla1==10)print "Has dicho vete";
if(bla2==1)print "Has dicho río";
if(bla2==2)print "Has dicho torre, torreón, o torrecita";
],
!...etc



Por ahora, mucho mejor que lo que tenía, y... hecho y funcional.
(El código es para compilar en Glulx, para Z-code cambian ciertas cosas)

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.

lunes, 20 de octubre de 2008

El barco del CAAD





martes, 16 de septiembre de 2008

Mi primera Kedada

¿Reconocéis a alguien?
Están por ahí JSJ, Cárdenas, J. Basilio, Salazar, Manowar, Jarel...

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: