! Instrucciones de compilación: ! Situar el código fuente en el directorio de la librería informate. Allí necesitarás las librerías: facilitar.h ETemas.h y Fisica.h Constant Historia "Prueba fisica.h"; Constant Titular "^"; release 3; ! Indicamos a Inform que queremos el comando SALIDAS Constant ADMITIR_COMANDO_SALIDAS; ! Que imprima deducciones Constant IMPRIMIR_DEDUCCIONES; Constant OBJETO_SACO=mochila; Include "EParser"; Include "ETemas"; Include "Acciones"; Include "Facilitar"; Include "Fisica"; Objeto_fisico aventurero "tu mismo" with nombre 'aventurero' 'tu', descripcion "Tan buen aspecto como siempre.", peso 80, volumen 100, peso_max 50, volumen_max 45, has animado; Habitacion vacio "Vacío no tan vacuo" with descripcion "Un lugar no tan vacío como aparentaba. Al norte hay un lugar con objetos variados, al este un lugar con objetos idénticos (plurales), al oeste un lugar con objetos de escenario y al sur un lugar con objetos ambiguos (nombres parecidos).", al_n variados, al_e plurales, al_o decorados, al_s ambiguos, has luz; Objeto_fisico -> mochila "mochila de cuero" with nombre 'bolsa' 'mochila', adjetivos 'cuero', peso 5, volumen 20, volumen_max 20, peso_max 50, si_cerrado "Una mochila de cuero está tirada en el suelo cerrada.", si_abierto "Una mochila de cuero está abierta en el suelo.", has recipiente abrible abierta femenino prenda entrable; Class piedra class objeto_fisico, with nombre_f 'piedra', nombre_m 'penon' 'pedrusco', nombre_fp 'piedras//p', nombre_corto "piedra", plural "piedras", descripcion "Piedra aventurera, para usar en laberintos.", peso 10, volumen 4, has femenino; piedra -> -> "piedra"; piedra -> -> "piedra"; piedra -> -> "piedra"; piedra -> -> "piedra"; piedra -> -> "piedra"; Objeto_fisico silla "silla alta" vacio with nombre 'silla', adjetivos 'alta', peso 30, volumen 40, volumen_max 103, descripcion "Es tan alta que desde ella podrías llegar casi al techo.", descripcion_dentro "El mundo se ve más alto desde aqui.", antes [; Empujar: "Debes decir hacia qué dirección quieres empujarla."; EmpujarDir: if (parent(Jugador)==silla) "¡No puedes empujarla si estás subido a ella!"; PermitirEmpujarDir(); rtrue; ], despues [; EmpujarDir: "La silla se arrastra fácilmente mientras la empujas."; ], reaccionar_despues [; Dejar: if (Jugador in self) move uno to parent(self); ], has soporte entrable femenino; objeto_fisico sillita "sillita de parvulito" vacio with nombre 'silla' 'sillita', adjetivos 'parvulito' 'pequeña' 'parvulo' 'enana', peso 10, volumen 30, volumen_max 50, descripcion "Es tan pequeña que desde ella no podrías llegar a ningun lado, incluso de puntillas.", antes [; Empujar: "Debes decir hacia qué dirección quieres empujarla."; EmpujarDir: if (parent(Jugador)==silla) "¡No puedes empujarla si estás subido a ella!"; PermitirEmpujarDir(); rtrue; ], despues [; EmpujarDir: "La silla se arrastra fácilmente mientras la empujas."; ], reaccionar_despues [; Dejar: if (Jugador in self) move uno to parent(self); ], has soporte entrable femenino; Objeto_fisico coche "coche kar rojo" vacio with nombre 'cochecito' 'coche' 'kar', adjetivos 'pequeno' 'rojo', peso 100, volumen 100, volumen_max 130, descripcion "Es un kar, un coche pequeño rojo pero lo bastante grande como para entrar en él y sentarse dentro. Entre los controles hay un botón gordo verde de encendido. La matrícula es KAR 1.", si_encendido "El coche rojo está aquí, con el motor aún encendido.", si_apagado "Aqui hay aparcado un coche kar rojo.", gasolina 5, antes [; Arrancar: <>; Encender: if (self.gasolina==0) { "El motor hace ¡bruum bruum!, pero en seguida hace ¡cof cof cof!, y se vuelve a parar por la falta de energía."; } Empujar: "El coche se mueve un poco sobre sus ruedas."; EmpujarDir: if (parent(Jugador)==coche) "¡No puedes empujar el coche desde dentro!"; PermitirEmpujarDir(); rtrue; Ir: if (coche has encendido) { if (self.gasolina==0) { give self ~encendido; print "¡Brumm! ¡Brumm! ¡Cof! ¡Cof! ¡Cof! Vaya, parece que se le acaba la energía (es un coche mágico, asi que no va con gasolina sino con FROBOZZINA que es una energía mágica). El coche se detiene y se le para el motor.^"; return false; } print "¡Brumm! ¡Brumm! Viajas en el coche rojo.^"; self.gasolina--; return true; } print "(Ahora mismo el motor está apagado.)^"; Conducir: "Para conducir el coche, simplemente, entra en él, pon el motor en marcha y escribe la dirección a la que quieres ir, igual que si te movieras normalmente."; ], despues [; EmpujarDir: "El coche rueda lentamente mientras lo empujas."; Encender: "Enciendes el coche y el motor ruge: ¡brumm!"; ], has conmutable entrable recipiente transparente; Object boton_coche "botón de encendido del coche kar" coche with nombre 'boton' 'encendido', adjetivos 'gordo' 'verde' 'coche' 'kar', descripcion "Redondo, verde y gordo, sirve para arrancar y parar el motor del coche.", antes [; Coger: "Es parte del coche."; Empujar, Tocar: if (coche has encendido) <>; else <>; Encender: <>; ], has escenario; Object matricula "matricula del kar" coche with nombre 'matricula', adjetivos 'kar' 'coche' 'rojo', descripcion "Pone KAR 1.", antes [; Coger: "Es parte del coche rojo."; ], has escenario; Objeto_fisico nota "pequeña nota" coche with nombre 'nota', adjetivos 'pequena', peso 0, volumen 0, antes [; Atacar: remove nota; "Rompes la pequeña nota en papelitos más pequeños aún hasta hacerla desaparecer por completo."; ], descripcion "COCHE MAGICO MARCA FROBOZZ^ ^¡Hola, Conductor!^ ^Instrucciones de uso:^ ^¡Enciende el motor, sientate dentro cómodamente y muevete en cualquier dirección usando NORTE, SUR, ESTE u OESTE!^ ^Garantía:^ ^Este coche está garantizado contra defectos de fábrica por un periodo de 76 milisegundos desde la fecha de compra, o hasta que sea usado por primera vez, lo que ocurra primero.^ ^¡Buena Suerte!", has femenino; Objeto_fisico cochecito "cochecito teledirigido verde" vacio with nombre 'cochecito' 'coche', adjetivos 'pequeno' 'pequenisimo' 'verde' 'teledirigido' 'teledirijido', peso 10, volumen 20, volumen_max 20, descripcion "Es un coche pequeño verde teledirigido. Parece bastante completo y si fueses una hormiga, parece que podrías conducirlo. Entre los controles hay un botón gordo verde de encendido. La matrícula es MINI 1.", si_encendido "El coche teledirigido está aquí, con el motor aún encendido.", gasolina 30, antes [; Arrancar: <>; Encender: if (self.gasolina==0) { "El motorcito del coche teledirijido hace ¡ruum ruum!, pero en seguida hace ¡cof cof cof!, y se para por la falta de energía."; } Empujar: "El coche se mueve un poco sobre sus ruedas."; EmpujarDir: if (parent(Jugador)==coche) "¡No puedes empujar el coche desde dentro!"; PermitirEmpujarDir(); rtrue; Ir: if (self has encendido) { if (self.gasolina==0) { give self ~encendido; print "¡rumm! ¡rumm! ¡Cof! ¡Cof! ¡Cof! Vaya, parece que se le acaba la energía (es un coche mágico, asi que no va con gasolina sino con FROBOZZINA que es una energía mágica). El coche teledirigido se detiene y se le para el motor.^"; return false; } print "¡fiuuuuuuum! Viajas en el coche teledirigido.^"; self.gasolina--; return true; } print "(Ahora mismo el motor está apagado.)^"; Conducir: "Para conducir el coche, simplemente, pulsa el botón de encendido en el mando de control remoto y pulsa el botón de flecha correspondiente a la dirección a la que quieres que vaya."; ], despues [; EmpujarDir: "El coche teledirigido rueda lentamente mientras lo empujas."; Encender: "Enciendes el coche teledirigido y el motor murmura: ¡rrrrrrumm!"; ], has conmutable entrable recipiente transparente; Object boton_cochecito "botón de encendido del coche teledirigido" cochecito with nombre 'boton' 'encendido', adjetivos 'gordo' 'verde' 'cochecito' 'coche' 'teledirijido' 'teledirigido', descripcion "Redondo, verde y gordo, sirve para arrancar y parar el motor del coche.", antes [; Coger: "Es parte del coche."; Empujar, Tocar: if (coche has encendido) <>; else <>; Encender: <>; ], has escenario; Object matricula_cochecito "matricula del coche teledirigido" cochecito with nombre 'matricula', adjetivos 'cochecito' 'coche' 'teledirijido' 'teledirigido', descripcion "Pone MINI 1.", antes [; Coger: "Es parte del coche teledirigido."; ], has escenario; Objeto_fisico notita "pequeñisima notita" cochecito with nombre 'nota' 'notita', adjetivos 'pequena' 'pequenisima', peso 0, volumen 0, antes [; Atacar: remove nota; "Rompes la pequeña nota en papelitos más pequeños aún hasta hacerla desaparecer por completo."; ], descripcion "COCHE TELEDIRIGIDO MAGICO MARCA FROBOZZ^ ^¡Hola, Jugador!^ ^Instrucciones de uso:^ ^¡Coge el mando, pulsa el botón de encendido y muevelo en cualquier dirección pulsando los botones de dirección del mando de control remoto: NORTE, SUR, ESTE u OESTE!^ ^Garantía:^ ^Este juguete está garantizado contra defectos de fábrica por un periodo de 76 milisegundos desde la fecha de compra, o hasta que sea usado por primera vez, lo que ocurra primero.^ ^¡Buena Suerte!", has femenino; !================================================================ Object variados "Lugar de objetos variados" with descripcion "Al sur vuelves al lugar vacío.", al_s vacio, has luz; Objeto_fisico -> raton "ratón de ordenador" with descripcion "Es un ratón serie, compatible Microsoft.", nombre 'raton', adjetivos 'ordenador', peso 1, volumen 2, ; Objeto_fisico -> papel "papel" with descripcion "Un folio en blanco.", nombre 'papel' 'folio', nombre_f 'cuartilla' 'hoja', genero G_MASCULINO, peso 1, volumen 1, ; Objeto_fisico -> ornitorrinco "ornitorrinco" with descripcion "Pico de pato, cubierto de pelo... ya sabes.", nombre 'ornitorrinco' 'animal', describe "Por aquí anda un ornitorrinco.", peso 35, volumen 20, has animado; Objeto_fisico -> bombilla "bombilla" with descripcion "Una bombilla, con el filamento fundido.", nombre_f 'bombilla', nombre_m 'filamento', genero G_FEMENINO, peso 1, volumen 1, ; object -> saco_sin_fondo "saco sin fondo" with nombre 'saco', adjetivos 'sin' 'fondo', descripcion "Un saco que contiene en su interior toda una otra dimensión.", despues [; Meter: "El saco adapta la abertura al tamaño del objeto, y este entra sin problemas."; Meterse: if (random(2)==1) "Metes una mano en el saco, después el brazo; la boca del saco se va adaptando a tu cuerpo, aunque el fondo del saco no aumenta ni disminuye; después metes la cabeza y contemplas una fría oscuridad; metes la cabeza, el otro brazo y ajustas el saco a tu torso y empujas hacia abajo hasta que te cubre entero. ¡Estás dentro del saco!."; else "Metes una pierna en el saco, despúes la otra; la boca del saco se adapta a la anchura de tu cintura; y tirando de sus bordes meter el resto de tu cuerpo dentro."; ], has recipiente abierto entrable; objeto_fisico -> paraguas "paraguas negro" with nombre 'paraguas', adjetivos 'negro' 'grande' 'amplio', descripcion [; print "Es negro y bastante grande. La empuñadura es de madera de color claro. "; if (self has abierto) "Está abierto."; else "Está cerrado."; ], si_cerrado "El paraguas está tirado en el suelo cerrado.", si_abierto "El paraguas está abierto en el suelo.", peso 3, volumen 15, despues [; Abrir: self.volumen=30; Cerrar: self.volumen=15; ], has abrible; Objeto_fisico -> medidor "medidor de objetos" with nombre 'medidor', adjetivos 'objetos' 'frobozz', peso 50, volumen 80, volumen_max 110, describir "Apoyada en una pared, hay un medidor de objetos marca frobozz.", descripcion "Es un medidor de propiedades físicas de los objetos creado por el mago loco Urbatín para la marca Frobozz. Funciona como una balanza normal y corriente, pones un objeto sobre el medidor y le das al botón gordo blanco que pone GO, y el medidor te dirá los parámetros del objeto en unas unidades totalmente arbitrarias creadas por Urbatín.", medir [ x num obj; num=0; objectloop(x in medidor) { if ((x hasnt escenario)&(x hasnt estatico)) { num++; obj=x; } } print "El medidor dice: "; switch (num) { 0: "ERROR, no hay ningún objeto en el medidor, introduce uno por favor."; 1: if (obj ofclass objeto_fisico) { "el objeto pesa ", CalcularPeso(obj), " unidades arbitrarias de peso de Urbatín; y tiene un volumen de ", CalcularVolumen(obj), " unidades arbitrarias de volumen Urbatín."; } else "ERROR, el objeto no tiene dimensiones físicas."; default: "ERROR, sólo de uno en uno, por favor."; } ], has entrable soporte transparente; Object boton_blanco "botón gordo y blanco" medidor with nombre 'boton' 'go', adjetivos 'gordo' 'blanco' 'medidor', descripcion "Gordo y blanco. Pone GO.", antes [; Empujar: medidor.medir(); rtrue; ], has escenario; Object TemasDiccionario; Object letraT "letra T" TemasDiccionario with nombre 'letra' 't//'; Object diccionario "diccionario de la lengua" variados with nombre 'diccionario', adjetivos 'lengua' 'espanola' 'espanol', antes [ tema ; ! esto define la variable "tema" que se usa en el switch Consultar, Leer: tema=AveriguarTema(TemasDiccionario); ! esto sale de la librería Etemas switch(tema) { ! y esto salta al valor que coincida en "tema" letraT: "Al abrir el diccionario por la letra T, la definición de tonto de llama la atención: cada día que amanece, el número de tontos crece."; default: "Aparte de las definiciones típicas de esa letra, no ves nada interesante"; } ]; !================================================================ Object plurales "Habitación de los objetos plurales" with descripcion "Hacia el oeste vuelves al lugar vacío.", al_o vacio, has luz; Class Letra class objeto_fisico, with nombre 'letra' 'letras//p', adjetivos 'un' 'juego' 'scrabble', listar_juntos [; if (etapa_inventario==1) { print "las letras "; ! Modificamos el estilo temporalmente estilo_ac = estilo_ac | ESPANOL_BIT | SINARTICULO_BIT; estilo_ac = estilo_ac & (~NUEVALINEA_BIT) & (~INDENTAR_BIT); } else print " de un juego de Scrabble"; ], nombre_corto [; if (listando_junto ofclass Letra) rfalse; print "letra ", (object) self; if (~~preguntacualexactamente) print " de un juego de Scrabble"; rtrue; ], articulo "la", peso 0, volumen 0, has femenino; Letra -> "X" with nombre 'x//'; Letra -> "Y" with nombre 'y//'; Letra -> "Q" with nombre 'q//'; Letra -> "F" with nombre 'f//'; Class MonedaOro class objeto_fisico, with nombre 'moneda' 'oro' 'monedas//p', nombre_corto "moneda de oro", plural "monedas de oro", peso 1, volumen 1, has femenino; Class MonedaPlata class objeto_fisico, with nombre 'moneda' 'bronce' 'monedas//p', nombre_corto "moneda de plata", plural "monedas de plata", peso 1, volumen 1, has femenino; Class MonedaBronce class objeto_fisico, with nombre 'moneda' 'bronce' 'monedas//p', nombre_corto "moneda de bronce", plural "monedas de bronce", peso 1, volumen 1, has femenino; MonedaOro ->-> with adjetivos 'oxidada', nombre_corto "moneda de oro oxidada"; MonedaOro ->->; MonedaOro ->->; MonedaPlata ->->; MonedaPlata ->->; MonedaBronce ->->; MonedaBronce ->->; MonedaBronce ->->; MonedaBronce ->->; Objeto_fisico -> saquito "saquito de terciopelo azul" with nombre 'saquito', adjetivos 'terciopelo' 'azul', peso 1, volumen 5, peso_max 10, volumen_max 6, has recipiente abrible abierto entrable; Object -> setas "criadero de setas" with nombre_mp 'criadero', nombre_fp 'setas', adjetivos 'gris' 'grises', descripcion "Infinidad de setas grises.", describir "En una esquina de la habitación, hay un metro cuadrado de tierra lleno de setas.", antes [; Coger, Comer: if (seta in self) "No seas avaricioso... con una bastará."; else "Ya cogiste una, no seas tan derrochador."; Oler: "Huelen a tierra húmeda."; ], has transparente recipiente abierto; Objeto_fisico seta "seta gris" setas with nombre 'seta', adjetivos 'gris', descripcion "Es una seta gris aparentemente normal, pero no descartes algún efecto secudario si te la comes.", peso 2, volumen 4, antes [ x ; Comer: aventurero.peso=6; aventurero.volumen=6; aventurero.peso_max=6; aventurero.volumen_max=6; ArrancarReloj(self,10); move self to setas; print "¡Ñam Ñam Ñam!, te la zampas de un bocado... Empiezas a sentirte raro y ves como la habitación se hace enooooorme y enooooorme, hasta que el techo se pierde en el infinito.^"; if ((CalcularVolumenLlevado(aventurero)>RetornaPropVolumenMax(aventurero))|(CalcularPesoLlevado(aventurero)>RetornaPropPesoMax(aventurero))) { objectloop(x) if (x in aventurero) move x to Localizacion; print "Los objetos que llevas también se hacen enormes hasta que no puedes contenerlos y los sueltas desparramándolos por el suelo.^"; } rtrue; Oler: "Huele a tierra y humedad."; ], tiempo_restante 0, tiempo_agotado [; aventurero.peso=80; aventurero.volumen=100; aventurero.peso_max=50; aventurero.volumen_max=45; print "Derrepente, la habitación vuelve a tomar su tamaño natural progresivamente, las paredes se estrechan y el techo baja hasta su posición original.^"; if ((parent(jugador) ofclass objeto_fisico)&(jugador.volumen>CalcularVolumen(parent(jugador)))) { print "Confundido ves que estás sentado patéticamente sobre ", (el) parent(jugador),", asi que... "; <>; } ""; ], has femenino comestible; !================================================================ Object ambiguos "Lugar de los objetos ambiguos" with descripcion "Al norte vuelves al lugar vacío.", al_n vacio, has luz; Objeto_fisico -> telefono "teléfono gris" with nombre 'telefono' 'aparato' 'telefonico', adjetivos 'gris', descripcion "El cable está cortado.", peso 5, volumen 5, has transparente; Object ->-> auricular "auricular del teléfono" with nombre 'auricular', adjetivos 'telefono', descripcion "Ya no tiene utilidad.", ; Objeto_fisico -> factura "factura de teléfono" with nombre 'factura', adjetivos 'telefono', descripcion "Un legajo de papel larguísimo. Es astronómica. Tal vez por eso han cortado el cable.", peso 1, voumen 3, has femenino; Objeto_fisico -> telefonorojo "teléfono rojo" with nombre 'telefono', adjetivos 'rojo', descripcion "Un teléfono rojo. ¿con quién comunicará?", peso 8, volumen 5, ; Objeto_fisico -> rojo "Rojo" with nombre 'rojo', descripcion "Un diablo gordo llamado Rojo.", peso 100, volumen 100, has animado propio; !================================================================ Object decorados "Lugar de las decoraciones" with descripcion "Este lugar está ricamente decorado, a base de tapices, cuadros, candelabros, alfombras y graffiti. Hacia el este vuelves al lugar vacío.", al_e vacio, has luz; Object -> tapices "tapices" with descripcion "Los tapices muestran imágenes abstractas.", nombre 'tapices', has escenario nombreplural; Object -> cuadros "cuadros" with descripcion "Son cuadros de Tapies, no muy diferentes de los tapices.", nombre 'cuadros' 'tapies', has escenario nombreplural; Object -> alfombras "alfombras" with descripcion "Alfombras persas.", nombre 'alfombras', has escenario nombreplural femenino; Object -> candelabros "candelabros" with descripcion "Candelabros dorados, pero sin luz.", nombre 'candelabros', has escenario nombreplural; Objeto -> graffiti "graffiti" with descripcion "Los huecos entre cuadros y tapices dejan ver la pared, decorada con graffiti.", nombre 'graffiti', has escenario ; [ Inicializar; CambiarJugador(aventurero); localizacion=vacio; parser_listo=0; "^Bienvenido al banco de pruebas de fisica.h^"; ]; Include "Gramatica"; Verb 'conduce' * noun -> Conducir; VerboIrregular "conducir" with imperativo 'conduce'; [ ConducirSub ; "Eso no se puede conducir."; ]; Verb 'arranca' * noun -> Arrancar; [ ArrancarSub ; "Eso no se puede arrancar."; ]; [ LeerSub; "No hay nada que leer ahí."; ]; Extend 'lee' replace * noun -> Leer * 'sobre' topic 'en' noun -> Consultar * topic 'en' noun -> Consultar;