Este mes vamos a dedicar la sección a examinar con detalle las formas de usar los items (objetos) en CAECHO?.
Básicamente hay tres formas diferentes en las que pueden usarse los items:
Veamos el uso de los condactos descritos. Lo primero que hay que saber, es que todos estos condactos no son solo acciones (coger, dejar...) sino que son condiciones. Es decir: intentarán hacer la acción que les corresponda, si lo consiguen la 'condición' será verdadera, sino será falsa. Esto permite tomar medidas oportunas... Veamos un ejemplo, si cuando se intenta coger algo que no está accesible, porque lo lleva un PSI presente lo bueno sería, no sólo decir: "No está por aquí", sino decir también "Lo lleva no se quién". Para hacer algo así pondríamos (ejemplo no completo):
\VOC
Coger 6 Verbo;
....
\BLO
BLOQUE [2] Entiende()
{
....
CUAL 1; /: Pone el valor del objeto referido por el Jugador en la
bandera cardinal número 0 :/
....
HAZ [10]
{
....
Coger:{
(!(COGER [0]))
{
/: Aquí se pondrían las operaciones necesarias para
comprobar si está '[0]' en algún PSI presente... :/
....
}
}
....
}
....
}
Veamos los significados de estos condactos, todos ellos ponen en pantalla los mensajes que sean pertinentes, siempre y cuando se incluya la tabla de mensajes '0' estandard que viene en INICIAL.FUE. Además todos comprueban la presencia de la luz necesaria:
DAPSI item psi2 psi1
Con todo esto vamos a avanzar un poco más en la aventura que estábamos haciendo. Lo primero sería sacar todo lo referente a la descripción de las localidades a un bloque externo. Sería algo así:
BLOQUE [2] Describe()
{
LIMPANT;
DESC [34];
NL;
SALIDAS [34] 1 0;
(PRESENTE 0) {ACTUAL 0; MENSAJE 1 10;}
}
Podemos añadir los verbos de PONTE y QUITATE para manejar objetos que sean prendas. Metamos CALCETIN como ejemplo de prenda. De esta forma el vocabulario quedaría como:
\VOC
NORTE 4 Verbo; N 4 Verbo;
SUR 5 Verbo; S 5 Verbo;
ESTE 6 Verbo; E 6 Verbo;
OESTE 7 Verbo; O 7 Verbo;
FIN 8 Verbo;
COGER 9 Verbo;
COGE 9 Verbo;
DEJAR 9 Verbo;
DEJA 9 Verbo;
I 10 Verbo;
INVEN 10 Verbo;
EXAMINa 11 Verbo;
EX 11 Verbo;
PONTE 12 Verbo;
PON 12 Verbo;
PONER 12 Verbo;
QUITA 13 Verbo;
QUITAR 13 Verbo;
QUITAT 13 Verbo;
CAAD 4 nombre;
FANZINe 4 nombre; /: Sólo importan las 6 primeras letras :/
CALCETin 5 nombre;
Incluyamos el calcetín como un objeto que se puede poner encima. Para ello tenemos que poner el campo booleano nº 7 a VERDADERO. Al definir un objeto pondremos '*' para indicar VERDADERO y '-' para poner FALSO. Así sería:
\ITE /: Una sección de ITEM, con un item :/
\0 Caad _ ""CAAD"" ""Un fanzine sobre aventuras conversacionales.""
-*< 2,<
\1 Calcetin _ ""Calcetín"" ""Un viejo calcetín perforado por el uso.""
-*-----*< 2,<
Hemos aprovechado para poner a '*' (VERDADERO) los campos booleanos nº 1, de ambos objetos. Esto significa que son masculinos, esto sirve para indicar que el artículo a poner será 'un' y no 'una' como pasaba en la anterior versión.
Cambiaremos el listado para ajustarlo al formato de la actual versión del CAECHO? la 2.0. El bloque principal de la aventura quedaría como:
BLOQUE [0] PrimeraAventura()
{
CAR 0;
R 3; /: Ignorar la gestión de luz, todo iluminado :/
COPI 1 47; /: Tabla donde está el Prompt :/
COPI 7 48; /: Mensaje del Prompt :/
COPI 2 34; /: Localidad inicial la 2 :/
Describe;
MIENTRAS (IGQ 0 [0]) /: Un bucle infinito :/
{
PREG 0;
ANALIZA 0 1;
(MNQ 10 MaxVerbMov) /: Comprueba si es de movimiento :/
{
(CAMINAR 34) /: Intenta caminar en la dirección adecuada :/
{
/: Si lo consigue repetir descripción :/
Describe;
}
SINO /: Si no lo consigue poner 'No puedes ir en esa dirección.' :/
{
MENSAJE 1 9;
}
}
SINO
{ /: No es de movimiento :/
CUAL 1; /: Analiza el objeto referido :/
HAZ [10]
{
Fin:{FIN;}
Coge:{(COGER [0]);}
Deja:{(DEJAR [0]);}
Ponte:{(VESTIR [0]);}
Quita:{(QUITAR [0]);}
I:{HazInventario;}
Examina:{EXAM [0]; NL;}
SINO {MENSAJE 1 8;} /: 'No puedes hacer éso' :/
}
}
} /: Final del bucle infinito :/
}
Pero tenemos un problema grave, evidentemente, el bloque de hacer inventario que teníamos antes no nos vale, pues no contempla el CALCETIN. ¿Que hacemos modificarlo para incluirlo?. Sin modificar nada más podríamos dejarlo en algo como:
BLOQUE [1] HazInventario()
{
(LLEVADO 0) { ACTUAL 0; MENSAJE 1 11;} SINO {MENSAJE 1 12;}
(LLEVADO 1) { ACTUAL 1; MENSAJE 1 11;} SINO {MENSAJE 1 12;}
(PUESTO 1) { ACTUAL 1; MENSAJE 1 13;} SINO {MENSAJE 1 12;}
}
Donde 'LLEVADO' comprueba si el objeto es llevado por el jugador y 'PUESTO' comprueba si lo está vistiendo. Sería necesario un nuevo mensaje en la tabla 1 (\MEN 1):
\13 ""Llevas puesto \ix.""
Pero está muy claro que así no vamos a ninguna parte. Esto se está complicando demasiado y tan sólo hay dos objetos. Vamos a hacer una rutina más general. Esta primera rutina pondrá los nombres de los objetos llevados y los puestos uno debajo del otro. Para conseguir esto tendremos que cambiar la tabla de mensajes quedando ésta como:
\MEN 1
\0 ""salida posible: ""
\1 ""salidas posibles: ""
\2 ""no hay salida.\n""
\3 ""norte""
\4 ""sur""
\5 ""este""
\6 ""oeste""
\7 "" >>""
\8 ""No puedo hacer éso.""
\9 ""No puedes moverte en esa dirección.""
\10 ""Aquí está \ix.""
\11 ""Llevas:"
\12 ""Nada.""
\13 ""Llevas puesto:""
\14 ""\ix""
Básicamente lo que haremos será barrer la lista de todos los objetos de la aventura y comprobar si están siendo llevados o puestos e imprimirlo en su caso.
#define NumObj 2; /: Hay dos objetos :/
BLOQUE [1] HazInventario()
{
PUSH 1; /: Usaré la bandera 1 como índice :/
PUSH 2; /: Usaré la bandera 2 como contador :/
/: Ver objetos llevados :/
COPI 0 1; /: Primer objeto es el número '0' :/
COPI 0 2; /: Ningún objeto encontrado :/
MENSAJE 1 11; /: 'Llevas:' :/
MIENTRAS (MNQ 1 NumObj)
{/: Si es llevado poner nombre y cuenta :/
(LLEVADO [1]) {MENSAJE 1 14; INC 1 2;}
}
(IGQ 2 0) {MENSAJE 1 12;} /: No había ninguno :/
/: Ver objetos puestos :/
COPI 0 1; /: Primer objeto es el número '0' :/
COPI 0 2; /: Ningún objeto encontrado :/
MENSAJE 1 13; /: 'Llevas puesto:' :/
MIENTRAS (MNQ 1 NumObj)
{/: Si es llevado poner nombre y cuenta :/
(PUESTO [1]) {MENSAJE 1 14; INC 1 2;}
}
(IGQ 2 0) {MENSAJE 1 12;} /: No había ninguno :/
POP 2;
POP 1;
}
Ya es general, pero un poco complicado. En el próximo número veremos formas más sencillas de hacer esto mismo.
Melitón Rodriguez, el de la 117.