Free format
Código:
*>****************************************************************
*> Author: Miquel A. Fuster Sancho
*> Date: 21-DIC-2021
*> Purpose: Profundizar en Cobol mediante un proyecto diferente
*> Tectonics: cobc
*> Disclaimer: Este código pretende ser una implementación del
*> código de 'La Torre' aparecido en el tutorial de INFSP
*> en la página del Club de Aventuras AD
*> (ver web http://www.caad.es/informate/infsp/infsp6_docs.htm)
*> La autoría de la aventura es de sus correspondientes autores
*> originales. Este es solamente un ejercicio de programación
*> sin ningún ánimo de lucro.
*>****************************************************************
IDENTIFICATION DIVISION.
PROGRAM-ID. LA-TORRE.
DATA DIVISION.
FILE SECTION.
WORKING-STORAGE SECTION.
01 LOCALIDADES OCCURS 8 INDEXED BY LOC-ID.
05 NOMBRE-LOCALIDAD PIC X(32).
05 DESCRIPCION-LOCALIDAD PIC X(255).
05 DIRECCIONES.
10 AL-N PIC 9.
10 AL-S PIC 9.
10 AL-E PIC 9.
10 AL-O PIC 9.
10 A-ARRIBA PIC 9.
10 A-ABAJO PIC 9.
10 A-ADENTRO PIC 9.
10 A-AFUERA PIC 9.
01 OBJETOS OCCURS 13 INDEXED BY OBJ-ID.
05 NOMBRE-OBJETO PIC X(32).
05 DESCRIPCION-OBJETO PIC X(255).
05 SINONIMOS PIC X(32) OCCURS 5 INDEXED BY SINONIMOS-ID.
05 PERTENENCIA PIC 9.
05 ATRIBUTOS.
10 INTERACTIVIDAD PIC 9.
88 ESTANDAR VALUE 0.
88 ESCENARIO VALUE 1.
88 OCULTO VALUE 2.
10 GENERO PIC 9.
88 MASCULINO VALUE 0.
88 FEMENINO VALUE 1.
10 NUMERO PIC 9.
88 SINGULAR VALUE 0.
88 PLURAL VALUE 1.
10 GENERAL PIC 9.
88 DESACTIVADO VALUE 0.
88 ACTIVADO VALUE 1.
01 PALABRAS-PARSER.
05 VERBO PIC A(32).
05 NOMBRE-1 PIC X(32).
05 PREPOSICION PIC A(32).
05 NOMBRE-2 PIC X(32).
01 CADENA-DE-SALIDA.
05 N-ESPACIOS-FINALES PIC 999 USAGE COMP-3.
05 LARGO-DE-CADENA PIC 999 USAGE COMP-3.
05 CADENA-SALIDA PIC X(255).
77 SALIR-JUEGO PIC 9.
77 ENTRADA-JUGADOR PIC X(255).
77 VERBO-ID PIC 99.
77 OBJETO-1-ID PIC 99.
77 OBJETO-2-ID PIC 99.
77 LOCALIDAD-ACTUAL PIC 9.
77 NUMERO-OBJETOS PIC 99.
PROCEDURE DIVISION.
JUEGO SECTION.
MAIN-PROCEDURE.
PERFORM MOSTRAR-TITULO.
PERFORM INICIALIZAR-LOCALIDADES.
PERFORM INICIALIZAR-OBJETOS.
PERFORM INICIALIZAR-JUEGO.
PERFORM DESCRIBIR-LOCALIDAD.
PERFORM BUCLE-JUEGO UNTIL SALIR-JUEGO EQUALS 1.
STOP RUN.
BUCLE-JUEGO.
IF LOCALIDAD-ACTUAL = 7 *> SE LLEGÓ AL OBJETIVO FINAL
PERFORM REINICIAR-JUEGO
ELSE
PERFORM OBTENER-ENTRADA
PERFORM PARSEAR
END-IF.
MOSTRAR-TITULO.
DISPLAY 'LA TORRE'.
DISPLAY ' '
DISPLAY 'Estás encerrado en una torre desde hace mucho tiempo.'.
DISPLAY 'Nadie se acuerda ya de tí. Solo tú puedes obtener tu libertad.'.
DISPLAY ' '.
DISPLAY 'Pulsa una tecla para continuar...'.
ACCEPT ENTRADA-JUGADOR.
TERMINAR-JUEGO.
DISPLAY '¿Estás seguro que quieres terminar la partida? ' WITH NO ADVANCING.
ACCEPT ENTRADA-JUGADOR.
MOVE FUNCTION UPPER-CASE(ENTRADA-JUGADOR) TO ENTRADA-JUGADOR.
IF ENTRADA-JUGADOR = 'S' OR 'SI'
MOVE 1 TO SALIR-JUEGO
END-IF.
REINICIAR-JUEGO.
DISPLAY ' '.
DISPLAY '¿Quieres jugar de nuevo? ' WITH NO ADVANCING.
ACCEPT ENTRADA-JUGADOR.
MOVE FUNCTION UPPER-CASE(ENTRADA-JUGADOR) TO ENTRADA-JUGADOR.
IF ENTRADA-JUGADOR = 'S' OR 'SI'
PERFORM MAIN-PROCEDURE
ELSE
MOVE 1 TO SALIR-JUEGO
END-IF.
ESCRIBIR-CADENA.
*> Imprime la cadena sin los espacios del final
MOVE ZERO TO N-ESPACIOS-FINALES.
*> cuenta cuantos espacios hay al final
INSPECT FUNCTION REVERSE(CADENA-SALIDA) TALLYING N-ESPACIOS-FINALES FOR LEADING SPACES.
*> resta los espacios al largo de la cadena
SUBTRACT N-ESPACIOS-FINALES FROM LENGTH OF CADENA-SALIDA GIVING LARGO-DE-CADENA
*> en LARGO-DE-CADENA está la cantidad de caracteres útiles de la cadena
DISPLAY CADENA-SALIDA(1:LARGO-DE-CADENA) WITH NO ADVANCING.
ESCRIBIR-CADENA-CON-SALTO.
PERFORM ESCRIBIR-CADENA.
DISPLAY ' '.
ENUMERAR-OBJETOS-VISIBLES.
PERFORM CUENTA-OBJETOS-VISIBLES.
IF NUMERO-OBJETOS > 0
DISPLAY 'Puedes ver ' WITH NO ADVANCING
PERFORM VARYING OBJ-ID FROM 1 BY 1 UNTIL OBJ-ID > 13
IF INTERACTIVIDAD(OBJ-ID) = 0 AND PERTENENCIA(OBJ-ID) = LOCALIDAD-ACTUAL
EVALUATE TRUE
WHEN MASCULINO(OBJ-ID)
EVALUATE TRUE
WHEN SINGULAR(OBJ-ID)
DISPLAY 'un ' WITH NO ADVANCING
WHEN PLURAL(OBJ-ID)
DISPLAY 'unos ' WITH NO ADVANCING
END-EVALUATE
WHEN FEMENINO(OBJ-ID)
EVALUATE TRUE
WHEN SINGULAR(OBJ-ID)
DISPLAY 'una ' WITH NO ADVANCING
WHEN PLURAL(OBJ-ID)
DISPLAY 'unas ' WITH NO ADVANCING
END-EVALUATE
END-EVALUATE
MOVE NOMBRE-OBJETO(OBJ-ID) TO CADENA-SALIDA
PERFORM ESCRIBIR-CADENA
SUBTRACT 1 FROM NUMERO-OBJETOS
IF NUMERO-OBJETOS > 0
DISPLAY ', ' WITH NO ADVANCING
ELSE
DISPLAY '.'
END-IF
END-IF
END-PERFORM
END-IF.
CUENTA-OBJETOS-VISIBLES.
INITIALIZE NUMERO-OBJETOS.
PERFORM VARYING OBJ-ID FROM 1 BY 1 UNTIL OBJ-ID > 13
IF INTERACTIVIDAD(OBJ-ID) = 0 AND PERTENENCIA(OBJ-ID) = LOCALIDAD-ACTUAL
ADD 1 TO NUMERO-OBJETOS
END-IF
END-PERFORM.
CUENTA-OBJETOS-INVENTARIO.
INITIALIZE NUMERO-OBJETOS.
PERFORM VARYING OBJ-ID FROM 1 BY 1 UNTIL OBJ-ID > 13
IF PERTENENCIA(OBJ-ID) = 8
ADD 1 TO NUMERO-OBJETOS
END-IF
END-PERFORM.
CUENTA-SALIDAS.
INITIALIZE NUMERO-OBJETOS.
IF AL-N(LOCALIDAD-ACTUAL) > 0
ADD 1 TO NUMERO-OBJETOS
END-IF.
IF AL-S(LOCALIDAD-ACTUAL) > 0
ADD 1 TO NUMERO-OBJETOS
END-IF.
IF AL-E(LOCALIDAD-ACTUAL) > 0
ADD 1 TO NUMERO-OBJETOS
END-IF.
IF AL-O(LOCALIDAD-ACTUAL) > 0
ADD 1 TO NUMERO-OBJETOS
END-IF.
IF A-ARRIBA(LOCALIDAD-ACTUAL) > 0
ADD 1 TO NUMERO-OBJETOS
END-IF.
IF A-ABAJO(LOCALIDAD-ACTUAL) > 0
ADD 1 TO NUMERO-OBJETOS
END-IF.
IF A-ADENTRO(LOCALIDAD-ACTUAL) > 0
ADD 1 TO NUMERO-OBJETOS
END-IF.
IF A-AFUERA(LOCALIDAD-ACTUAL) > 0
ADD 1 TO NUMERO-OBJETOS
END-IF.
INICIALIZACIONES SECTION.
INICIALIZAR-JUEGO.
SET LOCALIDAD-ACTUAL TO 1.
INICIALIZAR-LOCALIDADES.
SET LOC-ID TO 0.
*> 1. PUERTA PRINCIPAL
SET LOC-ID UP BY 1.
INITIALIZE LOCALIDADES(LOC-ID).
MOVE 'Puerta Principal' TO NOMBRE-LOCALIDAD(LOC-ID).
MOVE 'Estás junto a la puerta principal. A su lado puedes ver una mesa de guardia y en la pared norte una chimenea.' TO DESCRIPCION-LOCALIDAD(LOC-ID).
MOVE 2 TO AL-E(LOC-ID).
*> 2. DORMITORIO
SET LOC-ID UP BY 1.
INITIALIZE LOCALIDADES(LOC-ID).
MOVE 'Dormitorio' TO NOMBRE-LOCALIDAD(LOC-ID).
MOVE 'Varios maltrechos catres se amontonan en esta habitación.' TO DESCRIPCION-LOCALIDAD(LOC-ID).
MOVE 1 TO AL-O(LOC-ID).
MOVE 3 TO AL-E(LOC-ID).
*> 3. ESCALERA DE CARACOL
SET LOC-ID UP BY 1.
INITIALIZE LOCALIDADES(LOC-ID).
MOVE 'Escalera de caracol' TO NOMBRE-LOCALIDAD(LOC-ID).
MOVE 'El viento ulula a través de la empinada escalera de caracol, una vieja armadura parece vigilar la escalera.' TO DESCRIPCION-LOCALIDAD(LOC-ID).
MOVE 5 TO A-ARRIBA(LOC-ID).
MOVE 2 TO AL-O(LOC-ID).
*> 4. MAZMORRA
SET LOC-ID UP BY 1.
INITIALIZE LOCALIDADES(LOC-ID).
MOVE 'Mazmorra' TO NOMBRE-LOCALIDAD(LOC-ID).
MOVE 'Una silenciona estancia débilmente alumbrada por los rayos de luna que se filtran a través de un pequeño ventanuco. El suelo está lleno de paja, colgando de unos grilletes en la pared observas un esqueleto humano.' TO DESCRIPCION-LOCALIDAD(LOC-ID).
MOVE 5 TO AL-E(LOC-ID).
*> 5. ESCALERA DE CARALCOL 2
SET LOC-ID UP BY 1.
INITIALIZE LOCALIDADES(LOC-ID).
MOVE 'Ecalera de caracol' TO NOMBRE-LOCALIDAD(LOC-ID).
MOVE 'Los desgastados peldaños de piedra resbalan en ocasiones. A mitad de la escalera una antorcha en la pared impide que la oscuridad sea completa.' TO DESCRIPCION-LOCALIDAD(LOC-ID).
MOVE 3 TO A-ABAJO(LOC-ID).
MOVE 6 TO A-ARRIBA(LOC-ID).
*> 6. ALTO TORRE
SET LOC-ID UP BY 1.
INITIALIZE LOCALIDADES(LOC-ID).
MOVE 'Alto de la torre' TO NOMBRE-LOCALIDAD(LOC-ID).
MOVE 'Una gran cama preside la estancia, los guresos barrotes no permiten la salida por la ventana, aunque de todos modos estaría demasaido alta.' TO DESCRIPCION-LOCALIDAD(LOC-ID).
MOVE 5 TO A-ABAJO(LOC-ID).
*> 7. EXTERIOR DE LA TORRE
SET LOC-ID UP BY 1.
INITIALIZE LOCALIDADES(LOC-ID).
MOVE 'Exterior de la Torre' TO NOMBRE-LOCALIDAD(LOC-ID).
MOVE '¡Al fin libre de esta prisión! ¿Qué nuevas aventuras te aguardan ahora?' TO DESCRIPCION-LOCALIDAD(LOC-ID).
*> 8. JUGADOR (PSEUDO-LOCALIZACIÓN PARA EL INVENTARIO)
SET LOC-ID UP BY 1.
INITIALIZE LOCALIDADES(LOC-ID).
MOVE 'Jugador' TO NOMBRE-LOCALIDAD(LOC-ID).
INICIALIZAR-OBJETOS.
SET OBJ-ID TO 0.
*> 1. CARBON
SET OBJ-ID UP BY 1.
INITIALIZE OBJETOS(OBJ-ID).
MOVE 'trozo de carbón' TO NOMBRE-OBJETO(OBJ-ID).
MOVE 'Un trozo de negro carbón que parece haber sobrevivido al fuego.' TO DESCRIPCION-OBJETO(OBJ-ID).
MOVE 'TROZO' TO SINONIMOS(OBJ-ID, 1).
MOVE 'CARBON' TO SINONIMOS(OBJ-ID, 2).
MOVE 'CARBÓN' TO SINONIMOS(OBJ-ID, 3).
MOVE 'CARBóN' TO SINONIMOS(OBJ-ID, 4).
*> 2. CHIMENEA
SET OBJ-ID UP BY 1.
INITIALIZE OBJETOS(OBJ-ID).
MOVE 'chimenea' TO NOMBRE-OBJETO(OBJ-ID).
MOVE 'Hace mucho tiempo que no arde fuego alguno en esta vieja chimenea.' TO DESCRIPCION-OBJETO(OBJ-ID).
MOVE 'CHIMENEA' TO SINONIMOS(OBJ-ID, 1).
MOVE 'HOGAR' TO SINONIMOS(OBJ-ID, 2).
MOVE 1 TO PERTENENCIA(OBJ-ID).
SET ESCENARIO(OBJ-ID) TO TRUE.
SET FEMENINO(OBJ-ID) TO TRUE.
*> 3. CATRES
SET OBJ-ID UP BY 1.
INITIALIZE OBJETOS(OBJ-ID).
MOVE 'catres' TO NOMBRE-OBJETO(OBJ-ID).
MOVE 'CATRES' TO SINONIMOS(OBJ-ID, 1).
MOVE 'CAMASTROS' TO SINONIMOS(OBJ-ID, 2).
MOVE 'Todos los catres han sido reducidos a una masa informe de madera, excepto uno que aún está bien conservado.' TO DESCRIPCION-OBJETO(OBJ-ID).
MOVE 2 TO PERTENENCIA(OBJ-ID).
SET ESCENARIO(OBJ-ID) TO TRUE.
SET PLURAL(OBJ-ID) TO TRUE.
*> 4. CATRE
SET OBJ-ID UP BY 1.
INITIALIZE OBJETOS(OBJ-ID).
MOVE 'catre' TO NOMBRE-OBJETO(OBJ-ID).
MOVE 'Una funda de tela cubre la cama.' TO DESCRIPCION-OBJETO(OBJ-ID).
MOVE 'CATRE' TO SINONIMOS(OBJ-ID, 1).
MOVE 'CAMASTRO' TO SINONIMOS(OBJ-ID, 2).
MOVE 2 TO PERTENENCIA(OBJ-ID).
MOVE 1 TO INTERACTIVIDAD(OBJ-ID).
*> 5. FUNDA
SET OBJ-ID UP BY 1.
INITIALIZE OBJETOS(OBJ-ID).
MOVE 'funda' TO NOMBRE-OBJETO(OBJ-ID).
MOVE 'La funda parece bastante resistente.' TO DESCRIPCION-OBJETO(OBJ-ID).
MOVE 'FUNDA' TO SINONIMOS(OBJ-ID, 1).
MOVE 'TELA' TO SINONIMOS(OBJ-ID, 2).
SET ESCENARIO(OBJ-ID) TO TRUE.
SET FEMENINO(OBJ-ID) TO TRUE.
*> 6. CORREAS
SET OBJ-ID UP BY 1.
INITIALIZE OBJETOS(OBJ-ID).
MOVE 'correas' TO NOMBRE-OBJETO(OBJ-ID).
MOVE 'Son unas correas de cuero que' TO DESCRIPCION-OBJETO(OBJ-ID). *> El final de la descripción depende de su estado interno.
MOVE 'CORREAS' TO SINONIMOS(OBJ-ID, 1).
MOVE 'CORREA' TO SINONIMOS(OBJ-ID, 2).
MOVE 'CUERO' TO SINONIMOS(OBJ-ID, 3).
SET ESCENARIO(OBJ-ID) TO TRUE.
SET FEMENINO(OBJ-ID) TO TRUE.
SET PLURAL(OBJ-ID) TO TRUE.
*> 7. PAJA
SET OBJ-ID UP BY 1.
INITIALIZE OBJETOS(OBJ-ID).
MOVE 'paja' TO NOMBRE-OBJETO(OBJ-ID).
MOVE 'Paja húmeda e inútil.' TO DESCRIPCION-OBJETO(OBJ-ID).
MOVE 'PAJA' TO SINONIMOS(OBJ-ID, 1).
SET ESCENARIO(OBJ-ID) TO TRUE.
SET FEMENINO(OBJ-ID) TO TRUE.
*> 8. ESQUELETO
SET OBJ-ID UP BY 1.
INITIALIZE OBJETOS(OBJ-ID).
MOVE 'esqueleto' TO NOMBRE-OBJETO(OBJ-ID).
MOVE 'Los huesos amarillentos, las cuencas vacías.' TO DESCRIPCION-OBJETO(OBJ-ID).
MOVE 'ESQUELETO' TO SINONIMOS(OBJ-ID, 1).
MOVE 'HUMANO' TO SINONIMOS(OBJ-ID, 2).
MOVE 'MUERTO' TO SINONIMOS(OBJ-ID, 3).
MOVE 'CADAVER' TO SINONIMOS(OBJ-ID, 4).
MOVE 4 TO PERTENENCIA(OBJ-ID).
SET ESCENARIO(OBJ-ID) TO TRUE.
*> 9. VENTANUCO
SET OBJ-ID UP BY 1.
INITIALIZE OBJETOS(OBJ-ID).
MOVE 'ventanuco' TO NOMBRE-OBJETO(OBJ-ID).
MOVE 'A través de los barrotes de este ventanuco puedes ver el exterior de la torre, iluminado por una increíble luna llena.' TO DESCRIPCION-OBJETO(OBJ-ID).
MOVE 'VENTANUCO' TO SINONIMOS(OBJ-ID, 1).
MOVE 'VENTANA' TO SINONIMOS(OBJ-ID, 2).
MOVE 'TRAGALUZ' TO SINONIMOS(OBJ-ID, 3).
MOVE 4 TO PERTENENCIA(OBJ-ID).
SET ESCENARIO(OBJ-ID) TO TRUE.
*> 10. BARROTES SOLIDOS
SET OBJ-ID UP BY 1.
INITIALIZE OBJETOS(OBJ-ID).
MOVE 'barrotes sólidos' TO NOMBRE-OBJETO(OBJ-ID).
MOVE 'Al examinar de cerca los barrotes de la ventana descubres uno que parece estar más flojo.' TO DESCRIPCION-OBJETO(OBJ-ID).
MOVE 'BARROTES' TO SINONIMOS(OBJ-ID, 1).
MOVE 'BARRAS' TO SINONIMOS(OBJ-ID, 2).
MOVE 4 TO PERTENENCIA(OBJ-ID).
SET ESCENARIO(OBJ-ID) TO TRUE.
SET PLURAL(OBJ-ID) TO TRUE.
*> 11. BARROTE FLOJO
SET OBJ-ID UP BY 1.
INITIALIZE OBJETOS(OBJ-ID).
MOVE 'barra' TO NOMBRE-OBJETO(OBJ-ID).
MOVE 'Parece que este barrote podría quitarse con un poco de esfuerzo.' TO DESCRIPCION-OBJETO(OBJ-ID).
MOVE 'BARROTE' TO SINONIMOS(OBJ-ID, 1).
MOVE 'BARRA' TO SINONIMOS(OBJ-ID, 2).
SET OCULTO(OBJ-ID) TO TRUE.
SET FEMENINO(OBJ-ID) TO TRUE.
*> 12. ANTORCHA
SET OBJ-ID UP BY 1.
INITIALIZE OBJETOS(OBJ-ID).
MOVE 'antorcha' TO NOMBRE-OBJETO(OBJ-ID).
MOVE 'Un tenue fuego bailotea a su extremo.' TO DESCRIPCION-OBJETO(OBJ-ID).
MOVE 'ANTORCHA' TO SINONIMOS(OBJ-ID, 1).
MOVE 'TEA' TO SINONIMOS(OBJ-ID, 2).
MOVE 5 TO PERTENENCIA(OBJ-ID).
SET ESCENARIO(OBJ-ID) TO TRUE.
SET FEMENINO(OBJ-ID) TO TRUE.
*> 13. CUCHILLO
SET OBJ-ID UP BY 1.
INITIALIZE OBJETOS(OBJ-ID).
MOVE 'pequeño cuchillo' TO NOMBRE-OBJETO(OBJ-ID).
MOVE 'Un pequeño cuchillo cuchillo cubierto de herrumbre. No parece haberle servido de mucho a su malogrado poseedor.' TO DESCRIPCION-OBJETO(OBJ-ID).
MOVE 'CUCHILLO' TO SINONIMOS(OBJ-ID, 1).
MOVE 'PEQUEÑO' TO SINONIMOS(OBJ-ID, 2).
MOVE 'PUÑAL' TO SINONIMOS(OBJ-ID, 3).
MOVE 'HOJA' TO SINONIMOS(OBJ-ID, 4).
MOVE 'CUCHILLA' TO SINONIMOS(OBJ-ID, 5).
PARSER SECTION.
OBTENER-ENTRADA.
DISPLAY ' '.
INITIALIZE ENTRADA-JUGADOR.
DISPLAY '>> ' WITH NO ADVANCING.
ACCEPT ENTRADA-JUGADOR.
PARSEAR.
*> CONVERTIR LA ENTRADA A MAYÚSCULAS
MOVE FUNCTION UPPER-CASE(ENTRADA-JUGADOR) TO ENTRADA-JUGADOR.
*> SEPARAR LA FRASE EN SUS DIVERSOS COMPONENTES
UNSTRING ENTRADA-JUGADOR
DELIMITED BY SPACE
INTO VERBO, NOMBRE-1, PREPOSICION, NOMBRE-2
END-UNSTRING.
IF VERBO NOT = SPACES
*> OBTENER ACCIONES Y OBJETOS
PERFORM OBTENER-VERBO-ID
*> EJECUTAR EJECUTAR ACCIONES
EVALUATE VERBO-ID
WHEN 1
PERFORM TERMINAR-JUEGO
WHEN 2
PERFORM IR-AL-NORTE
WHEN 3
PERFORM IR-AL-SUR
WHEN 4
PERFORM IR-AL-ESTE
WHEN 5
PERFORM IR-AL-OESTE
WHEN 6
PERFORM IR-ARRIBA
WHEN 7
PERFORM IR-ABAJO
WHEN 8
PERFORM IR-ADENTRO
WHEN 9
PERFORM IR-AFUERA
WHEN 10
PERFORM OBTENER-NOMBRE-1
PERFORM EXAMINAR
WHEN 11
PERFORM INVENTARIO
WHEN 12
PERFORM OBTENER-NOMBRE-1
PERFORM COGER
WHEN 13
PERFORM OBTENER-NOMBRE-1
PERFORM DEJAR
WHEN 14
PERFORM OBTENER-NOMBRE-1
PERFORM EMPUJAR
WHEN 15
PERFORM OBTENER-NOMBRE-1
PERFORM TIRAR-DE
WHEN 16
PERFORM OBTENER-NOMBRE-1
PERFORM OBTENER-NOMBRE-2
PERFORM CORTAR
WHEN 17
PERFORM OBTENER-NOMBRE-1
PERFORM OBTENER-NOMBRE-2
PERFORM ATAR
WHEN 18
PERFORM OBTENER-NOMBRE-1
PERFORM DESATAR
WHEN 19
PERFORM MOSTRAR-SALIDAS
WHEN 20
PERFORM DESCRIBIR-LOCALIDAD
WHEN OTHER
DISPLAY 'Lo siento, no te entiendo.'
END-EVALUATE
END-IF.
OBTENER-VERBO-ID.
INITIALIZE VERBO-ID.
IF VERBO = 'TERMINA' OR 'TERMINAR'
MOVE 1 TO VERBO-ID
ELSE IF VERBO = 'N' OR 'NORTE'
MOVE 2 TO VERBO-ID
ELSE IF VERBO = 'S' OR 'SUR'
MOVE 3 TO VERBO-ID
ELSE IF VERBO = 'E' OR 'ESTE'
MOVE 4 TO VERBO-ID
ELSE IF VERBO = 'O' OR 'OESTE'
MOVE 5 TO VERBO-ID
ELSE IF VERBO = 'SUBE' OR 'SUBIR'
MOVE 6 TO VERBO-ID
ELSE IF VERBO = 'BAJA' OR 'BAJAR'
MOVE 7 TO VERBO-ID
ELSE IF VERBO = 'ENTRA' OR 'ENTRAR'
MOVE 8 TO VERBO-ID
ELSE IF VERBO = 'SAL' OR 'SALTE' OR 'SALIR'
MOVE 9 TO VERBO-ID
ELSE IF VERBO = 'EX' OR 'EXAMINA' OR 'EXAMINAR'
MOVE 10 TO VERBO-ID
ELSE IF VERBO = 'I' OR 'INVENTARIO'
MOVE 11 TO VERBO-ID
ELSE IF VERBO = 'COGE' OR 'COGER' OR 'TOMA' OR 'TOMAR'
MOVE 12 TO VERBO-ID
ELSE IF VERBO = 'DEJA' OR 'DEJAR' OR 'SUELTA' OR 'SOLTAR'
MOVE 13 TO VERBO-ID
ELSE IF VERBO = 'EMPUJA' OR 'EMPUJAR'
MOVE 14 TO VERBO-ID
ELSE IF VERBO = 'TIRA' OR 'TIRAR' OR 'JALA' OR 'JALAR'
MOVE 15 TO VERBO-ID
ELSE IF VERBO = 'CORTA' OR 'CORTAR'
MOVE 16 TO VERBO-ID
ELSE IF VERBO = 'ATA' OR 'ATAR'
MOVE 17 TO VERBO-ID
ELSE IF VERBO = 'DESATA' OR 'DESATAR'
MOVE 18 TO VERBO-ID
ELSE IF VERBO = 'X' OR 'SALIDAS'
MOVE 19 TO VERBO-ID
ELSE IF VERBO = 'M' OR 'MIRA' OR 'MIRAR'
MOVE 20 TO VERBO-ID
END-IF.
OBTENER-NOMBRE-1.
INITIALIZE OBJETO-1-ID, OBJ-ID.
IF VERBO-ID = 15 *> CASO ESPECIAL DEL VERBO TIRAR,
IF NOMBRE-1 = 'DE' *> QUE SUELE LLEVAR LA PREPOSICION 'DE' ANTES DEL OBJETO DIRECTO.
MOVE PREPOSICION TO NOMBRE-1 *> EL NOMBRE SE HABRÍA CARGADO EN PREPOSICION,
END-IF *> DE ESTA MANERA SE TRANSPORTA A NOMBRE-1
END-IF
IF NOMBRE-1 NOT = SPACES
PERFORM VARYING OBJ-ID FROM 1 BY 1 UNTIL OBJ-ID>13 OR OBJETO-1-ID > 0
PERFORM VARYING SINONIMOS-ID FROM 1 BY 1 UNTIL SINONIMOS-ID > 5 OR OBJETO-1-ID > 0
IF SINONIMOS(OBJ-ID, SINONIMOS-ID) = NOMBRE-1
MOVE OBJ-ID TO OBJETO-1-ID
END-IF
END-PERFORM
END-PERFORM
END-IF.
OBTENER-NOMBRE-2.
INITIALIZE OBJETO-2-ID, OBJ-ID.
IF VERBO-ID = 16 *> CASO ESPECIAL DEL VERBO CORTAR,
IF PREPOSICION NOT = 'CON' AND NOMBRE-2 = SPACES *> QUE SUELE LLEVAR LA PREPOSICION 'CON' ANTES DEL OBJETO INDIRECTO.
MOVE PREPOSICION TO NOMBRE-2 *> SI 'CON' NO ESTÁ EN SU LUGAR EL JUGADOR HA PUESTO EN 'PREPOSICION'
END-IF *> EL OBJETO INDIRECTO DE LA ORACION
END-IF
IF VERBO-ID = 17
IF PREPOSICION NOT = 'A' AND NOMBRE-2 = SPACES
MOVE PREPOSICION TO NOMBRE-2
END-IF
END-IF
IF NOMBRE-2 NOT = SPACES
PERFORM VARYING OBJ-ID FROM 1 BY 1 UNTIL OBJ-ID>13 OR OBJETO-2-ID > 0
PERFORM VARYING SINONIMOS-ID FROM 1 BY 1 UNTIL SINONIMOS-ID > 5 OR OBJETO-2-ID > 0
IF SINONIMOS(OBJ-ID, SINONIMOS-ID) = NOMBRE-2
MOVE OBJ-ID TO OBJETO-2-ID
END-IF
END-PERFORM
END-PERFORM
END-IF.
EJECUTAR-VERBOS SECTION.
DESCRIBIR-LOCALIDAD.
DISPLAY ' '.
DISPLAY '[ ' WITH NO ADVANCING.
MOVE NOMBRE-LOCALIDAD(LOCALIDAD-ACTUAL) TO CADENA-SALIDA.
PERFORM ESCRIBIR-CADENA.
DISPLAY ' ]'.
MOVE DESCRIPCION-LOCALIDAD(LOCALIDAD-ACTUAL) TO CADENA-SALIDA
PERFORM ESCRIBIR-CADENA-CON-SALTO.
PERFORM ENUMERAR-OBJETOS-VISIBLES.
IR-AL-NORTE.
IF AL-N(LOCALIDAD-ACTUAL) > 0
MOVE AL-N(LOCALIDAD-ACTUAL) TO LOCALIDAD-ACTUAL
PERFORM DESCRIBIR-LOCALIDAD
ELSE
DISPLAY 'No puedes ir por ahí.'
END-IF.
IR-AL-SUR.
IF AL-S(LOCALIDAD-ACTUAL) > 0
MOVE AL-S(LOCALIDAD-ACTUAL) TO LOCALIDAD-ACTUAL
PERFORM DESCRIBIR-LOCALIDAD
ELSE
DISPLAY 'No puedes ir por ahí.'
END-IF.
IR-AL-ESTE.
IF AL-E(LOCALIDAD-ACTUAL) > 0
MOVE AL-E(LOCALIDAD-ACTUAL) TO LOCALIDAD-ACTUAL
PERFORM DESCRIBIR-LOCALIDAD
ELSE
DISPLAY 'No puedes ir por ahí.'
END-IF.
IR-AL-OESTE.
IF AL-O(LOCALIDAD-ACTUAL) > 0
MOVE AL-O(LOCALIDAD-ACTUAL) TO LOCALIDAD-ACTUAL
PERFORM DESCRIBIR-LOCALIDAD
ELSE
DISPLAY 'No puedes ir por ahí.'
END-IF.
IR-ARRIBA.
IF A-ARRIBA(LOCALIDAD-ACTUAL) > 0
MOVE A-ARRIBA(LOCALIDAD-ACTUAL) TO LOCALIDAD-ACTUAL
PERFORM DESCRIBIR-LOCALIDAD
ELSE
DISPLAY 'No puedes ir por ahí.'
END-IF.
IR-ABAJO.
IF A-ABAJO(LOCALIDAD-ACTUAL) > 0
MOVE A-ABAJO(LOCALIDAD-ACTUAL) TO LOCALIDAD-ACTUAL
PERFORM DESCRIBIR-LOCALIDAD
ELSE
DISPLAY 'No puedes ir por ahí.'
END-IF.
IR-ADENTRO.
IF A-ADENTRO(LOCALIDAD-ACTUAL) > 0
MOVE A-ADENTRO(LOCALIDAD-ACTUAL) TO LOCALIDAD-ACTUAL
PERFORM DESCRIBIR-LOCALIDAD
ELSE
DISPLAY 'No puedes ir por ahí.'
END-IF.
IR-AFUERA.
IF A-AFUERA(LOCALIDAD-ACTUAL) > 0
MOVE A-AFUERA(LOCALIDAD-ACTUAL) TO LOCALIDAD-ACTUAL
PERFORM DESCRIBIR-LOCALIDAD
ELSE
DISPLAY 'No puedes ir por ahí.'
END-IF.
MOSTRAR-SALIDAS.
PERFORM CUENTA-SALIDAS.
IF NUMERO-OBJETOS > 0
DISPLAY 'Las salidas posibles son: ' WITH NO ADVANCING
IF AL-N(LOCALIDAD-ACTUAL) > 0
DISPLAY 'norte' WITH NO ADVANCING
PERFORM MOSTRAR-SALIDAS-MAS
END-IF
IF AL-S(LOCALIDAD-ACTUAL) > 0
DISPLAY 'sur' WITH NO ADVANCING
PERFORM MOSTRAR-SALIDAS-MAS
END-IF
IF AL-E(LOCALIDAD-ACTUAL) > 0
DISPLAY 'este' WITH NO ADVANCING
PERFORM MOSTRAR-SALIDAS-MAS
END-IF
IF AL-O(LOCALIDAD-ACTUAL) > 0
DISPLAY 'oeste' WITH NO ADVANCING
PERFORM MOSTRAR-SALIDAS-MAS
END-IF
IF A-ARRIBA(LOCALIDAD-ACTUAL) > 0
DISPLAY 'subir' WITH NO ADVANCING
PERFORM MOSTRAR-SALIDAS-MAS
END-IF
IF A-ABAJO(LOCALIDAD-ACTUAL) > 0
DISPLAY 'bajar' WITH NO ADVANCING
PERFORM MOSTRAR-SALIDAS-MAS
END-IF
IF A-ADENTRO(LOCALIDAD-ACTUAL) > 0
DISPLAY 'entrar' WITH NO ADVANCING
PERFORM MOSTRAR-SALIDAS-MAS
END-IF
IF A-AFUERA(LOCALIDAD-ACTUAL) > 0
DISPLAY 'salir' WITH NO ADVANCING
PERFORM MOSTRAR-SALIDAS-MAS
END-IF
ELSE
DISPLAY 'No hay salida.'
END-IF.
MOSTRAR-SALIDAS-MAS.
SUBTRACT 1 FROM NUMERO-OBJETOS
IF NUMERO-OBJETOS > 1
DISPLAY ', ' WITH NO ADVANCING
ELSE IF NUMERO-OBJETOS = 1
DISPLAY ' y ' WITH NO ADVANCING
ELSE
DISPLAY '.'
END-IF.
EXAMINAR.
IF NOMBRE-1 = SPACES
DISPLAY '¿Qué quieres examinar?'
ELSE IF OBJETO-1-ID = ZEROES
DISPLAY 'Realmente desconozco a lo que te refieres.'
ELSE IF PERTENENCIA(OBJETO-1-ID) = LOCALIDAD-ACTUAL OR 8
*> DESCRIBIR EL OBJETO
MOVE DESCRIPCION-OBJETO(OBJETO-1-ID) TO CADENA-SALIDA
PERFORM ESCRIBIR-CADENA
*> DIFERENTES OBJETOS CON TRATAMIENTOS ESPECIALES
EVALUATE OBJETO-1-ID
WHEN 2 *> CHIMENEA
*> SI ES LA PRIMERA VEZ QUE SE EXAMINA LA CHIMENEA
EVALUATE TRUE WHEN DESACTIVADO(OBJETO-1-ID)
*> DAR LA CHIMENEA POR EXAMINADA
SET ACTIVADO(OBJETO-1-ID) TO TRUE
*> INFORMAR DEL CARBÓN EN LA DESCRIPCIÓN
DISPLAY ' Un trozo de carbón es todo lo que queda del antiguo hogar.' WITH NO ADVANCING
*> MOVER EL CARBÓN A LA MISMA HABITACIÓN QUE LA CHIMENEA.
MOVE PERTENENCIA(OBJETO-1-ID) TO PERTENENCIA(1)
END-EVALUATE
WHEN 4 *> CATRE
*> SI ES LA PRIMERA VEZ QUE SE EXAMINAN EL CATRE
EVALUATE TRUE WHEN DESACTIVADO(OBJETO-1-ID)
*> DAR A CATRE POR EXAMINADOS
SET ACTIVADO(OBJETO-1-ID) TO TRUE
*> TRAER FUNDA Y CORREAS AL DORMITORIO
MOVE PERTENENCIA(OBJETO-1-ID) TO PERTENENCIA(5), PERTENENCIA(6)
END-EVALUATE
WHEN 6 *> CORREAS
EVALUATE TRUE
WHEN DESACTIVADO(OBJETO-1-ID)
DISPLAY ' sujetan la funda a la cama.' WITH NO ADVANCING
WHEN ACTIVADO(OBJETO-1-ID)
DISPLAY ' cuelgan de la cama.' WITH NO ADVANCING
END-EVALUATE
WHEN 8 *> ESQUELETO
EVALUATE TRUE WHEN DESACTIVADO(OBJETO-1-ID)
SET ACTIVADO(OBJETO-1-ID) TO TRUE
DISPLAY ' Junto a él ves un pequeño cuchillo.' WITH NO ADVANCING
MOVE PERTENENCIA(OBJETO-1-ID) TO PERTENENCIA(13)
END-EVALUATE
WHEN 10 *> BARROTES
EVALUATE TRUE WHEN DESACTIVADO(OBJETO-1-ID)
SET ACTIVADO(OBJETO-1-ID) TO TRUE
MOVE PERTENENCIA(OBJETO-1-ID) TO PERTENENCIA(11) *> MUEVE EL BARROTE FLOJO A LA HABITACIÓN
END-EVALUATE
END-EVALUATE
*> REALIZAR EL SALTO DE LINEA
DISPLAY ' '
ELSE
DISPLAY 'No veo eso que dices.'
END-IF.
INVENTARIO.
PERFORM CUENTA-OBJETOS-INVENTARIO.
IF NUMERO-OBJETOS > 0
DISPLAY 'Tienes ' WITH NO ADVANCING
PERFORM VARYING OBJ-ID FROM 1 BY 1 UNTIL OBJ-ID > 13
IF PERTENENCIA(OBJ-ID) = 8
EVALUATE TRUE
WHEN MASCULINO(OBJ-ID)
EVALUATE TRUE
WHEN SINGULAR(OBJ-ID)
DISPLAY 'un ' WITH NO ADVANCING
WHEN PLURAL(OBJ-ID)
DISPLAY 'unos ' WITH NO ADVANCING
END-EVALUATE
WHEN FEMENINO(OBJ-ID)
EVALUATE TRUE
WHEN SINGULAR(OBJ-ID)
DISPLAY 'una ' WITH NO ADVANCING
WHEN PLURAL(OBJ-ID)
DISPLAY 'unas ' WITH NO ADVANCING
END-EVALUATE
END-EVALUATE
MOVE NOMBRE-OBJETO(OBJ-ID) TO CADENA-SALIDA
PERFORM ESCRIBIR-CADENA
SUBTRACT 1 FROM NUMERO-OBJETOS
IF NUMERO-OBJETOS > 0
DISPLAY ', ' WITH NO ADVANCING
ELSE
DISPLAY '.'
END-IF
END-IF
END-PERFORM
ELSE
DISPLAY 'No tienes nada.'
END-IF.
COGER.
IF NOMBRE-1 = SPACES
DISPLAY '¿El qué?'
ELSE IF OBJETO-1-ID = ZEROES
DISPLAY 'Realmente desconozco a lo que te refieres.'
ELSE IF PERTENENCIA(OBJETO-1-ID) = 8
DISPLAY 'Ya tienes ' WITH NO ADVANCING
EVALUATE TRUE
WHEN MASCULINO(OBJETO-1-ID)
EVALUATE TRUE
WHEN SINGULAR(OBJETO-1-ID)
DISPLAY 'el ' WITH NO ADVANCING
WHEN PLURAL(OBJETO-1-ID)
DISPLAY 'los ' WITH NO ADVANCING
END-EVALUATE
WHEN FEMENINO(OBJETO-1-ID)
EVALUATE TRUE
WHEN SINGULAR(OBJETO-1-ID)
DISPLAY 'la ' WITH NO ADVANCING
WHEN PLURAL(OBJETO-1-ID)
DISPLAY 'las ' WITH NO ADVANCING
END-EVALUATE
END-EVALUATE
DISPLAY NOMBRE-OBJETO(OBJETO-1-ID), '.'
ELSE IF PERTENENCIA(OBJETO-1-ID) = LOCALIDAD-ACTUAL
*> DIFERENTES OBJETOS CON TRATAMIENTOS ESPECIALES
EVALUATE OBJETO-1-ID
WHEN 5 *> FUNDA
IF PERTENENCIA(OBJETO-1-ID) = 2 *> SOLO SI LA FUNDA ESTÁ EN EL DORMITORIO
EVALUATE TRUE WHEN ACTIVADO(4) *> SI LA CAMA NO SE HA DESTAPADO
EVALUATE TRUE
WHEN ACTIVADO(6) *> SI LAS CORREAS ESTAN CORTADAS
*> HACER DE LA FUNDA UN OBJETO ESTANDAR
SET ESTANDAR(OBJETO-1-ID) TO TRUE
*> DESTAPAR LA CAMA
SET ACTIVADO(4) TO TRUE
*> TRAE LA PAJA AL DORMITORIO
MOVE 2 TO PERTENENCIA(7)
*> CAMBIA LA DESCRIPCION DEL CATRE AL LLEVARTE LA FUNDA
INITIALIZE DESCRIPCION-OBJETO(4)
MOVE 'Sólo restos de paja cubren la cama.' TO DESCRIPCION-OBJETO(4)
WHEN DESACTIVADO(6) *> LAS CORREAS NO ESTÁN CORTADAS AÚN
DISPLAY 'La funda está sujeta a la cama por unas correas.'
END-EVALUATE
END-EVALUATE
END-IF
WHEN 11 *> BARROTE FLOJO
IF PERTENENCIA(OBJETO-1-ID) = 4 *> SOLO SI EL BARROTE ESTÁ EN LA MAZMORRA
EVALUATE TRUE WHEN DESACTIVADO(OBJETO-1-ID) *> SI LA BARRA NO SE HA SACADO DE LOS BARROTES
DISPLAY 'Con un fuerte tirón arrancas el barrote del ventanuco.'
*> CAMBIAR LA DESCRIPCIÓN DE LOS BARROTES
INITIALIZE DESCRIPCION-OBJETO(10)
MOVE 'En la ventana falta un barrote. Parece que podrías pasar por el hueco.' TO DESCRIPCION-OBJETO(10)
*> CAMBIAR LA DESCRIPCIÓN DEL BARROTE
INITIALIZE DESCRIPCION-OBJETO(OBJETO-1-ID)
MOVE 'Una barra de hierro medio oxidada.' TO DESCRIPCION-OBJETO(OBJETO-1-ID)
*> DAR UNA INTERACTIVIDA ESTÁNDAR AL BARROTE
SET ESTANDAR(OBJETO-1-ID) TO TRUE
*> MARCA COMO MOVIDO EL BARROTE
SET ACTIVADO(OBJETO-1-ID) TO TRUE
*> SI LA FUNDA ESTÁ ATADA EL JUGADOR YA PUEDE SALIR DE LA TORRE
EVALUATE TRUE WHEN ACTIVADO(5)
MOVE 7 TO A-AFUERA(LOCALIDAD-ACTUAL) *> HACE QUE EL JUGADOR PUEDA 'SALIR' POR EL VENTANUCO
DISPLAY 'Tu salida hacia la libertad está lista.'
END-EVALUATE
END-EVALUATE
END-IF
END-EVALUATE
*> REALIZAR EL SALTO DE LINEA
*> SOLO COGE LOS OBJETOS QUE TENGA UNA INTERACTIVIDAD ESTÁNDAR
EVALUATE TRUE
WHEN ESTANDAR(OBJETO-1-ID) OR OCULTO(OBJETO-1-ID)
MOVE 8 TO PERTENENCIA(OBJETO-1-ID)
DISPLAY 'Ok.'
WHEN OTHER
DISPLAY 'No puedes llevarte eso.'
END-EVALUATE
ELSE
DISPLAY 'No veo eso que dices.'
END-IF.
DEJAR.
IF NOMBRE-1 = SPACES
DISPLAY '¿El qué?'
ELSE IF OBJETO-1-ID = ZEROES
DISPLAY 'Realmente desconozco a lo que te refieres.'
ELSE IF PERTENENCIA(OBJETO-1-ID) = 8
MOVE LOCALIDAD-ACTUAL TO PERTENENCIA(OBJETO-1-ID)
DISPLAY 'Ok.'
ELSE
DISPLAY 'No tienes ese objeto en tu inventario.'
END-IF.
EMPUJAR.
IF NOMBRE-1 = SPACES
DISPLAY '¿El qué?'
ELSE IF OBJETO-1-ID = ZEROES
DISPLAY 'Realmente desconozco a lo que te refieres.'
ELSE IF PERTENENCIA(OBJETO-1-ID) = LOCALIDAD-ACTUAL OR 8
EVALUATE OBJETO-1-ID
WHEN 12 *> ANTORCHA
IF AL-O(LOCALIDAD-ACTUAL) = ZERO *> SI NO ESTÁ ABIERTO EL PASO AL OESTE
MOVE 4 TO AL-O(LOCALIDAD-ACTUAL)
DISPLAY 'Al empujar la antorcha una porción de pared se abre al oeste dando acceso a una estancia.'
ELSE *> EL PASO AL OESTE YA ESTÁ ABIERTO
DISPLAY 'La antorcha no cede más.'
END-IF
WHEN OTHER
DISPLAY 'No tiene sentido hacer eso.'
END-EVALUATE
END-IF.
TIRAR-DE.
IF NOMBRE-1 = SPACES
DISPLAY '¿El qué?'
ELSE IF OBJETO-1-ID = ZEROES
DISPLAY 'Realmente desconozco a lo que te refieres.'
ELSE IF PERTENENCIA(OBJETO-1-ID) = LOCALIDAD-ACTUAL OR 8
EVALUATE OBJETO-1-ID
WHEN 12 *> ANTORCHA
IF AL-O(LOCALIDAD-ACTUAL) = 4 *> SI ESTÁ ABIERTO EL PASO AL OESTE
MOVE ZERO TO AL-O(LOCALIDAD-ACTUAL)
DISPLAY 'Al tirar de la antorcha la puerta secreta se cierra de nuevo.'
ELSE *> EL PASO AL OESTE YA ESTÁ CERRADO
DISPLAY 'La antorcha no cede más.'
END-IF
WHEN OTHER
DISPLAY 'No tiene sentido hacer eso.'
END-EVALUATE
END-IF.