Para coger un objeto, todo lo que tiene que hacer el programa es asignar
al campo POS del objeto un cero (tras verificar que el objeto exista,
que esté en la localidad actual, y que aún no esté en el inventario).
Para dejar un objeto, únicamente es necesario comprobar que se tiene
el objeto y poner en el campo POS el número de la localidad donde el
jugador está... Programando queda:
Procedure Coger(O:String);
Var A:Byte;
Flag:Boolean;
Begin
Flag:=False;
A:=0;
Repeat
Inc(A);
If O=Objetos[A].Nombre Then Flag:=True;
Until (A>NumeroObjs) Or (Flag=True);
If Flag=True Then
Begin
{ El objeto existe }
If Objetos[A].Pos=LocalidadActual Then
Begin
{ El objeto está en la localidad actual }
{ Cogemos el objeto }
Objetos[A].Pos:=0;
TextColor(LightCyan);
WriteLn;
WriteLn('Coges el ',O);
WriteLn;
End
Else
Begin
If Objetos[A].Pos=0 Then
Begin
{ El objeto ya está en posesión }
{ del jugador... }
TextColor(LightCyan);
WriteLn;
WriteLn('Ya tienes el ',O);
WriteLn;
End
Else
Begin
WriteLn('No ves el',O);
WriteLn;
End;
End;
End
Else
Begin
{ el objeto no existe }
WriteLn;
TextColor(LightRed);
Writeln('¿ De qué estás hablando ?');
Writeln;
End;
End;
Como siempre debes poner una llamada a esta rutina en Play...
Este comando tiene el mismo problema que examinar, así que debemos
hacer lo mismo que hicimos en ese caso: juntar el array parsed en un
string que tenga el nombre del objeto:
If Parsed[1]='COGER' Then
Begin
Valid:=True;
{ Juntamos palabras }
D:=3;
E:=Parsed[2];
While Parsed[D]<>'' Do
Begin
E:=E+' '+Parsed[D];
Inc(D);
End;
Coger(E);
End;
La rutina de dejar es parecida, aunque un poco más sencilla:
Procedure Dejar(O:String);
Var A:Byte;
Flag:Boolean;
Begin
Flag:=False;
A:=0;
Repeat
Inc(A);
If (O=Upper(Objetos[A].Nombre)) And
(Objetos[A].Pos=0) Then Flag:=True;
Until (A>NumeroObjs) Or (Flag=True);
If Flag=True Then
Begin
{ El jugador tiene el objeto }
Objetos[A].Pos:=LocalidadActual;
TextColor(LightCyan);
WriteLn;
WriteLn('Dejas el ',O);
WriteLn;
End
Else
Begin
{ El objeto no existe o no lo tiene el jugador... }
TextColor(LightRed);
WriteLn;
WriteLn('No tienes el ',O);
WriteLn;
End;
End;
De nuevo añade el código siguiente a Play... Ya sabes
para que sirve:
If Parsed[1]='DEJAR' Then
Begin
Valid:=True;
{ De nuevo juntamos la palabra }
D:=3;
E:=Parsed[2];
While Parsed[D]<>'' Do
Begin
E:=E+' '+Parsed[D];
Inc(D);
End;
Dejar(E);
End;
Ya tenemos Coger y Dejar listos... Ahora, vayamos a la tercera clase
de comandos de manipulación de objetos: los comandos de usar. Hay
muchos, y tienen en común algo: Manipulan el objeto. Por ejemplo...
Puedes usar la Máscara de Gas tecleando USAR MÁSCARA...
Pero hagámoslo más complicado, ya que con USAR MÁSCARA
también nos podrímos referir a romperla... :))) Es más
difícil de esta manera puesto que el jugador conoce lo que ha de hacer...
Los comandos de usar no son más que líneas y más
líneas de IFs, porque cada objeto tiene efectos diferentes. Algunas
órdenes requieren más de un parárametro. Por ejemplo,
para usar de la espada debes teclear USAR ESPADA EN MONSTRUO...
En FangLore tendremos dos comandos de este tipo... La orden USAR y la
de VESTIR. Vestir será usada para la máscara de gas... El
comando usar será para los otros. La teoría es simple...
Según el objeto que se elija, debes hacer un bloque de instrucciones
que defina lo que ocurra. Por ejemplo, cuando usas la pala en la
localidad 20, la puerta a FangLore se abre... Código para la
orden VESTIR... Es tan breve y simple que la incluiremos en la rutina
Play.
If Parsed[1]='VESTIR' Then
Begin
{ Juntamos palabras }
D:=3;
E:=Parsed[2];
While Parsed[D]<>'' Do
Begin
E:=E+' '+Parsed[D];
Inc(D);
End;
If E='MASCARA GAS' Then
Begin
Valid:=True;
{ Comprueba que tenga la máscara de gas }
{ Sabemos que la máscara es el objeto número 2 }
If Objetos[2].Pos=0 Then
Begin
Mascara:=True;
TextColor(LightCyan);
WriteLn;
WriteLn('Te pones la máscara de gas...');
WriteLn;
End
Else
Begin
TextColor(LightRed);
WriteLn;
WriteLn('No tienes la máscara de gas.');
WriteLn;
End;
End;
End;
La variable Mascara es una variable global de tipo Boolean. Debería
ser inicializada a False en la rutina Init. Cuando sea verdadera,
vendrá a significar que se está usando. Veremos después
como puede ser usada...
Ahora veamos la orden USAR... Existen dos posibilidades:
- USAR PALA EN PUERTA
- USAR ESPADA EN MONSTRUO
El parser debería eliminar la preposición EN... Házlo
en la rutina EliminarArtículos (ver detalles en los primeros
artículos del curso).
Implementemos la rutina de USAR:
Procedure Usar(Arg:TipoParsed);
Var A:Byte;
Flag:Boolean;
Begin
Flag:=False;
A:=0;
Repeat
Inc(A);
If (Arg[2]=Upper(Objetos[A].Nombre)) And
(Objetos[A].Pos=0) Then Flag:=True;
Until (A>NumeroObjs) Or (Flag=True);
If Flag=True Then
Begin
{ El objeto es 'usable' }
Flag:=False;
{ Miramos si el jugador quiere usar la pala }
If Arg[2]='PALA' Then
Begin
Flag:=True;
{ Comprobamos si es usada con la puerta }
If Arg[3]='PUERTA' Then
Begin
{ Miramos si el jugador está en }
{ la localidad apropiada... }
If LocalidadActual=20 Then
Begin
{ El jugador está en el sition correcto }
{ Abrimos pasaje entre el jardín }
{ y la mansión... }
Rooms[20].Norte:=15;
TextColor(LightCyan);
WriteLn;
WriteLn('Echas la puerta abajo...');
WriteLn;
End
Else
Begin
{ El jugador está en algún otro lugar }
TextColor(LightRed);
WriteLn;
WriteLn('No veo ninguna puerta...');
WriteLn;
End;
End
Else
Begin
{ El jugador no usó la pala con la puerta... }
TextColor(LightRed);
WriteLn;
WriteLn('¿ Uso eso con qué ?!');
WriteLn;
End;
End;
If Arg[2]='ESPADA' Then
Begin
Flag:=True;
{ En un futuro artículo incluiré }
{ código, cuando hablemos de monstruos... }
End;
End;
If Flag=False Then
Begin
{ No fueron usados objetos 'legales' }
TextColor(LightRed);
WriteLn;
WriteLn('No puedo usar eso...');
WriteLn;
End;
End;
Debemos pasar el array parsed entero como un parámetro a
la rutina, porque objetos como la pala y la espada necesitan otros
objetos para funcionar... Recuerda que no estás limitado a
USAR objetos... Puedes usar, por ejemplo, una palanca...
Éste no es un objeto porque no lo puedes llevar contigo, pero
lo puedes usar... El código cambiaría ligeramente... En el
caso de FangLore únicamente tendremos objetos... :)
Fíjate también que en el caso de USAR, no podemos usar
el truco que empleamos con Examinar, Coger, Dejar y Vestir, aquello
de juntar el array parsed para formar el nombre de objetos con más
de una palabra (MÁSCARA DE GAS)... Así que es bueno usar
una única palabra como nombre de objetos, sino un montón
de manipulaciones se hacen necesarias... En el caso de FangLore no
hay problemas de este tipo, pero en otros podrían haberlos...
Una vez más añade el código siguiente a Play:
If Parsed[1]='USAR' Then
Begin
Valid:=True;
Usar(Parsed);
End;
Con esto acabamos el artículo... En el siguiente hablaremos
de monstruos y habitaciones especiales... ¡¡ No te lo pierdas !! :))
Nota del traductor: En los primeros números
de 'The Mag' se realizó un cursillo de Pascal la mar de
majo. Como comprenderéis no es cuestión de que lo
reproduzcamos aquí, después de todo esto es una
revista sobre aventuras, y no de programación. A los que
no conozcáis Pascal y sepáis inglés os remito
directamente a 'The Mag'.
A los demás buscaos un buen tutorial en castellano, que
seguro que los habrá perdidos en algún rincón
de la red o miraros alguno de esos CD-ROMS que regalan las revistas,
que puede que venga algun tutorial o cursillo interactivo de Pascal.
Si el Pascal no os va, o simplemente conocéis algún
otro lenguaje (BASIC, no gracias) no os será nada complicado
el pasarlo.
ÚLTIMA REVISIÓN EN FEBRERO DE 1999