elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Aporte. COBOL. Interactive Fiction: La Torre
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Aporte. COBOL. Interactive Fiction: La Torre  (Leído 2,272 veces)
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Aporte. COBOL. Interactive Fiction: La Torre
« en: 4 Marzo 2023, 22:56 pm »

Hecho en GNU-COBOL
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.


« Última modificación: 4 Marzo 2023, 23:35 pm por MAFUS » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Aporte. COBOL. Interactive Fiction: La Torre <CONTINUACIÓN>
« Respuesta #1 en: 4 Marzo 2023, 23:36 pm »

Código:
CORTAR.
    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 6 *> CORREAS
                EVALUATE OBJETO-2-ID
                    WHEN ZEROES
                        DISPLAY '¿Con qué quieres cortar?'
                    WHEN 13 *> CUCHILLO
                        IF PERTENENCIA(OBJETO-2-ID) = 8 *> EL CUCHILLO ESTÁ EN EL INVENTARIO
                            EVALUATE TRUE
                                WHEN DESACTIVADO(OBJETO-1-ID) *> LAS CORREAS TODAVÍA NO SE CORTARON
                                    SET ACTIVADO(OBJETO-1-ID) TO TRUE *> ACTIVA EL FLAG GENERAL DE LAS CORRAS PARA INDICAR QUE ESTÁN CORTADAS
                                    SET ESTANDAR(5) TO TRUE *> CONVIERTE LA FUNDA EN UN OBJETO ESTÁNDAR
                                    DISPLAY 'Cortas las correas con el cuchillo.'
                                WHEN ACTIVADO(OBJETO-1-ID) *> YA FUERON CORTADAS
                                    DISPLAY 'Ya las cortaste.'
                            END-EVALUATE
                        ELSE
                            DISPLAY '¡Vaya! ¿Y el cuchillo?'
                        END-IF
 
                    WHEN OTHER
                        DISPLAY 'Eso no corta.'
 
                END-EVALUATE
 
            WHEN OTHER
                DISPLAY 'Una acción totalemnte inútil, me temo.'
 
        END-EVALUATE
    ELSE
        DISPLAY 'No veo eso que dices.'
    END-IF.
 
ATAR.
    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
        EVALUATE OBJETO-1-ID
 
            WHEN 5 *> FUNDA
                EVALUATE OBJETO-2-ID
                    WHEN ZEROES
                        DISPLAY '¿A qué quieres atarla?'
                    WHEN 10 *> BARROTES FIJOS
                        IF LOCALIDAD-ACTUAL = 4 *> EL JUGADOR DEBE ESTAR EN LA MAZMORRA
                            EVALUATE TRUE WHEN DESACTIVADO(OBJETO-1-ID) *> LA FUNDA NO ESTÁ ATADA
                                EVALUATE TRUE
                                    WHEN DESACTIVADO(11) *> EL BARROTE NO SE HA QUITADO
                                        DISPLAY 'Aún que ataras la funda allí no tienes suficiente espacio para pasar por los barrotes.'
                                    WHEN ACTIVADO(11) *> EL BARROTE SE HA QUITADO
                                        SET ACTIVADO(OBJETO-1-ID) TO TRUE *> SE ASIGNA EL FLAG PERA MARCAR QUE LA FUNDA ESTÁ ATADA
                                        SET ESCENARIO(OBJETO-1-ID) TO TRUE *> INTERACTUACIÓN LIMITADA CON LA FUNDA
                                        MOVE 4 TO PERTENENCIA(OBJETO-1-ID) *> LA FUNDA PASA A SER PARTE DE LA HABITACIÓN
                                        MOVE 7 TO A-AFUERA(LOCALIDAD-ACTUAL) *> HACE QUE EL JUGADOR PUEDA 'SALIR' POR EL VENTANUCO
                                        *> CAMBIA 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. La funda está atada por el exterior a modo de cuerda de escape.' TO DESCRIPCION-OBJETO(10)
                                        DISPLAY 'Tu salida hacia la libertad está lista.'
                                END-EVALUATE
                            END-EVALUATE
                        ELSE
                            DISPLAY 'No ves eso aquí.'
                        END-IF
 
                    WHEN 11 *> BARROTE FLOJO
                        IF LOCALIDAD-ACTUAL = 4
                            EVALUATE TRUE
                                WHEN DESACTIVADO(11) *> EL BARROTE FLOJO TODAVÍA NO SE HA QUITADO DEL VENTANUCO
                                    DISPLAY 'Mejor atarla a un barrote sólido.'
                                WHEN ACTIVADO(11)
                                    DISPLAY '¿Quieres hacerte un columpio? ¿En una mazmorra? Tus gustos son muy extraños. Mejor no.'
                            END-EVALUATE
                        ELSE
                            DISPLAY 'No te serviría de nada hacer eso.'
                        END-IF
 
                    WHEN OTHER
                        DISPLAY 'Cuando vas a realizar el lazo te das cuenta que no te servirá tener eso atado.'
 
                END-EVALUATE
 
            WHEN OTHER
                DISPLAY 'Eso no se usa para atar cosas.'
 
        END-EVALUATE
    ELSE
        DISPLAY 'No tienes eso.'
    END-IF.
 
DESATAR.
    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
        EVALUATE OBJETO-1-ID
 
            WHEN 5 *> FUNDA
                IF LOCALIDAD-ACTUAL = 4 *> EL JUGADOR DEBE ESTAR EN LA MAZMORRA
                    EVALUATE TRUE
                        WHEN ACTIVADO(OBJETO-1-ID) *> LA FUNDA ESTÁ ATADA
                            SET DESACTIVADO(OBJETO-1-ID) TO TRUE *> SE ASIGNA EL FLAG PERA MARCAR QUE LA FUNDA ESTÁ DESATADA
                            SET ESTANDAR(OBJETO-1-ID) TO TRUE *> INTERACTUACIÓN PLENA CON LA FUNDA
                            MOVE 0 TO A-AFUERA(LOCALIDAD-ACTUAL) *> IMPIDE QUE EL JUGADOR PUEDA 'SALIR' POR EL VENTANUCO
                            DISPLAY 'Desatas la funda que queda en el suelo.'
                            *> CAMBIA 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)
                        WHEN DESACTIVADO(OBJETO-1-ID) *> LA FUNDA NO ESTÁ ATADA
                            DISPLAY 'La funda no está atada a ningún sitio.'
                    END-EVALUATE
                ELSE IF LOCALIDAD-ACTUAL = 2 *> EL JUGADOR ESTÁ EN EL DORMITORIO
                    EVALUATE TRUE
                        WHEN DESACTIVADO(6) *> LAS CORREAS NO ESTÁN CORTADAS
                            DISPLAY 'No tienes suficiente fuerza para desatar las correas. Deberías encontrar una mejor forma para soltarlas.'
                        WHEN ACTIVADO(6) *> LAS CORREAS YA SE CORTARON
                            DISPLAY 'La funda no está atada a nada.'
                    END-EVALUATE
                ELSE
                    DISPLAY 'La funda no está atada a nada.'
                END-IF
 
            WHEN 6 *> CORREAS
                IF LOCALIDAD-ACTUAL = 2 *> EL JUGADOR DEBE ESTAR EN EL DORMITORIO
                    EVALUATE TRUE
                        WHEN DESACTIVADO(OBJETO-1-ID) *> LAS CORREAS NO ESTÁN CORTADAS
                            DISPLAY 'No tienes suficiente fuerza en los dedos cómo para desatarlas. Deberás encontrar una mejor forma para soltarlas.'
                        WHEN ACTIVADO(OBJETO-1-ID) *> LAS CORREAS YA SE HAN CORTADO
                            DISPLAY 'Ya las cortaste, no es necesario deshatarlas.'
                    END-EVALUATE
                ELSE
                    DISPLAY 'No ves eso aquí.'
                END-IF
 
            WHEN OTHER
                DISPLAY 'Eso no está atado a nada.'
 
        END-EVALUATE
    ELSE
        DISPLAY 'No ves eso aquí.'
    END-IF.
 
END PROGRAM LA-TORRE.


En línea

Tachikomaia


Conectado Conectado

Mensajes: 1.390


Hackentifiko!


Ver Perfil
Re: Aporte. COBOL. Interactive Fiction: La Torre
« Respuesta #2 en: 5 Marzo 2023, 00:23 am »

¿Tienes un code para que un personaje camine, salte, ataque y se agache? Vi que tu code tiene algo de eso, pero no vi casos prohibidos como que si está atacando no puede saltar.

Mira, tengo esto:
Código
  1. fscommand ("fullscreen", "true");
  2. Player.Facing = 1;
  3. Player.Attacking = 0;
  4. Player.Action = 1;
  5. // 0 crouching, 0.5 startingjump, 1 nothing, 2 walking, 3 falling, 3.5 minjump, 4 jumping.
  6. // /////////////////////////////////////////////
  7. // //////////////////  Bond  ///////////////////
  8. // /////////////////////////////////////////////
  9. function PersControl () {
  10. if (Player.Action == 2) {
  11. // Si el personaje está caminando.
  12. if (Key.isDown(65)) {
  13. // Si se presiona A.
  14. StartingJump();
  15. } else if (Key.isDown(83)) {
  16. // Si se presiona S.
  17. Attack();
  18. } else if (Key.isDown(40)) {
  19. // Si se presiona abajo.
  20. Crouch();
  21. } else if (Key.isDown(39)) {
  22. // Si se presiona derecha.
  23. FaceRight();
  24. Player._x = Player._x+0.9;
  25. } else if (Key.isDown(37)) {
  26. // Si se presiona izquierda.
  27. FaceLeft();
  28. Player._x = Player._x-0.9;
  29. } else {
  30. Quiet();
  31. }
  32. //FALTA THROW
  33. } else if (Player.Attacking == 0) {
  34. // Si el personaje no está atacando.
  35. if (Player.Action == 1) {
  36. // Si el personaje está en reposo.
  37. if (Key.isDown(65)) {
  38. // Si se presiona A.
  39. StartingJump();
  40. } else if (Key.isDown(83)) {
  41. // Si se presiona S.
  42. Attack();
  43. } else if (Key.isDown(40)) {
  44. // Si se presiona abajo.
  45. Crouch();
  46. } else if (Key.isDown(39)) {
  47. // Si se presiona derecha.
  48. FaceRight();
  49. Player._x = Player._x+0.9;
  50. Walk();
  51. } else if (Key.isDown(37)) {
  52. // Si se presiona izquierda.
  53. FaceLeft();
  54. Player._x = Player._x-0.9;
  55. Walk();
  56. }
  57. //FALTA THROW
  58. } else if (Player.Action == 3) {
  59. // Si el personaje está cayendo.
  60. Player.SpeedY = Player.SpeedY+0.1;
  61. MovingJump();
  62. if (Player._y>=554) {
  63. // Si el personaje toca el suelo.
  64. Player._y = 554;
  65. // Acá no debería haber Quiet sino FallEnd o...
  66. // depende de la velocidad de la caída???
  67. Quiet();
  68. }
  69. //FALTA: AT, THROW
  70. } else if (Player.Action == 4) {
  71. // Si el personaje está saltando.
  72. Jump();
  73. //FALTA: AT, THROW
  74. } else if (Player.Action == 0.5) {
  75. // Si el personaje está empezando a saltar.
  76. if (Key.isDown(39)) {
  77. // Si se presiona derecha.
  78. if (Player.Facing == -1) {
  79. Player.Facing = 1;
  80. }
  81. Player.SpeedX = 0.9;
  82. } else if (Key.isDown(37)) {
  83. // Si se presiona izquierda.
  84. if (Player.Facing == 1) {
  85. Player.Facing = -1;
  86. }
  87. Player.SpeedX = -0.9;
  88. } else {
  89. Player.SpeedX = 0;
  90. }
  91. //FALTA: AT, THROW, Down?
  92. } else if (Player.Action == 0) {
  93. // Si el personaje está agachado.
  94. if (Key.isDown(40)) {
  95. // Si se presiona abajo.
  96. if (Key.isDown(65)) {
  97. // Si se presiona A.
  98. StartingJump();
  99. } else if (Key.isDown(83)) {
  100. // Si se presiona S.
  101. Player.Attacking = 1;
  102. Player.gotoAndPlay(124);
  103. }
  104. } else {
  105. Quiet ();
  106. }
  107. } else if (Player.Action == 3.5) {
  108. // Si el personaje está saltando pero aún no llegó a cierta altura.
  109. Player.SpeedY = Player.SpeedY+0.1;
  110. if (Player.SpeedY<-3) {
  111. MovingJump();
  112. } else {
  113. // Si el personaje llegó a cierta altura (y perdió cierta velocidad).
  114. Player.Action = 4;
  115. Jump();
  116. }
  117. //FALTA: AT, THROW???
  118. }
  119. //¿FALTA: AT, THROW, AG?
  120. }
  121. }
  122. //JUMP, AG WHILE STARTING AT? AFTER?
  123. //AG
  124. // Otras funciones.
  125. function StartingJump () {
  126. Player.gotoAndPlay(96);
  127. Player.Action = 0.5;
  128. }
  129. function MovingJump () {
  130. Player._x = Player._x+Player.SpeedX;
  131. Player._y = Player._y+Player.SpeedY;
  132. }
  133. function MinJump () {
  134. Player.Action = 3.5;
  135. Player.SpeedY = -4;
  136. MovingJump();
  137. }
  138. function Jump () {
  139. if (Key.isDown(65)) {
  140. // Si se presiona A.
  141. Player.SpeedY = Player.SpeedY+0.1;
  142. if (Player.SpeedY>=0) {
  143. // Si el personaje comienza a caer.
  144. Fall();
  145. }
  146. } else {
  147. // Si se suelta A.
  148. Player.SpeedY = 0.1;
  149. Fall();
  150. }
  151. MovingJump();
  152. }
  153. function Fall () {
  154. Player.Action = 3;
  155. Player.play();
  156. }
  157. function Walk () {
  158. Player.gotoAndPlay(35);
  159. Player.Action = 2;
  160. }
  161. function Attack () {
  162. Player.gotoAndPlay(2);
  163. Player.Attacking = 1;
  164. Player.Action = 1;
  165. }
  166. function FaceRight () {
  167. if (Player.Facing == -1) {
  168. Player.Facing = 1;
  169. Player._xscale = 100;
  170. }
  171. }
  172. function FaceLeft () {
  173. if (Player.Facing == 1) {
  174. Player.Facing = -1;
  175. Player._xscale = -100;
  176. }
  177. }
  178. function Crouch () {
  179. Player.gotoAndStop(96);
  180. Player.Action = 0;
  181. }
  182. function Quiet () {
  183. Player.gotoAndStop(1);
  184. Player.Action = 1;
  185. }
  186. //Player.SpeedX = 0.9*Player.Facing;
  187. //Jump();

Intento imitar a este personaje:
https://www.youtube.com/watch?v=PGmIbgmc6qI

Es más complejo que Mario y varios otros, ya que por ejemplo antes de saltar se agacha.

¿Cómo harías el código? ¿te doy más datos del personaje? A ver

Estado              ¿Puede caminar?  ¿atacar?  ¿saltar?  ¿agacharse?  ¿desagacharse?
Quieto                        S                    S           S              S                    N
Caminando               S(*)                  S           S              S                    N
Atacando parado         N                    N         S(*2)         N                    N
Atacando en el aire     N                    N            N             N                    N
Atacando agachado     N                    N           N             N    S (cambia a ataque parado)
Iniciando salto (agachado)  N          N(*3)        N             N                    N
Elevándose                 N                    S           N             N                    N
Cayendo                    N                     S           N             N                    N
Agachado                  N             S(agachado)   N       S(continuar)          S
(*) Continuar, la animación no reinicia por presionar el botón sino cuando termina si el botón sigue presionado.
Cuando ataca, si está caminando se detiene.
Cuando el personaje salta, antes se agacha.
(*2): Primero se agacha (y continúa la animación de que ataca) como sucede al saltar.
La imagen o pose del personaje mientras se eleva es distinta de cuando cae.
La velocidad hacia los costados del salto no es modificable una vez establecida (sucede luego del estado "iniciando salto").
Es posible saltar sin moverse hacia un costado, o sí hacerlo.
Si en "iniciando salto" el personaje está mirando hacia un lado, se presiona saltar, y enseguida hacia el lado contrario, se salta hacia dicho lado (mirando hacia ese lado sí).
(*3) Pero cuando se eleva sí ataca.
Cuando cae se agacha.
Si al caer está atacando, el ataque continúa agachado.
Sólo es posible cambiar hacia donde se mira cuando se camina.

Creo que eso es todo lo que me interesa por ahora.

Gracias.
« Última modificación: 5 Marzo 2023, 00:31 am por Tachikomaia » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
tutoriales noesis interactive
Diseño Gráfico
togueter 0 2,203 Último mensaje 29 Noviembre 2007, 16:23 pm
por togueter
Eidos Interactive presenta Battlestations: Pacific
Juegos y Consolas
Castiblanco 2 1,580 Último mensaje 7 Marzo 2008, 21:54 pm
por Castiblanco
Ayuda con COBOL
Programación General
za.asi 1 2,166 Último mensaje 6 Septiembre 2012, 02:30 am
por sistemx
COBOL es difícil?
Programación General
ccrunch 1 2,186 Último mensaje 16 Septiembre 2014, 17:01 pm
por engel lex
Cobol
Programación General
FermatsTheorem 3 2,326 Último mensaje 19 Febrero 2017, 05:26 am
por 43H4FH44H45H4CH49H56H45H
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines