! "El gorrón del tren" ! (Las desventuras de un pasajero del tren) ! ! REALIZADO POR: José Manuel Ferrer Ortiz (Morgul) ! ! Copyright (C) 2000-2002 José Manuel Ferrer Ortiz ! CONSTANTES Constant Historia "~El gorrón del tren~ (Las desventuras de un pasajero del tren)^"; Constant Titular "^Realizado por: José Manuel Ferrer Ortiz (Morgul)^^ (C) 2000-2002 José Manuel Ferrer Ortiz^^Presentado a la primera Brevecomp^"; Release 6; ! Queremos usar el comando 'Salidas', pero no el 'Lugares' y tampoco la ! puntuación. Constant ADMITIR_COMANDO_SALIDAS; Constant NO_LUGARES; Constant NO_PUNTUACION; ! VARIABLES GLOBALES Global bollito_pedido = 0; Global bollito_dado = 0; Global callar = 0; Global muerto = 0; Include "EParser"; ! Si se pide depuración, incluiremos la librería betatest (antes de incluir ! Acciones) si estamos compilando para máquina Z, puesto que ésta sólo funciona ! en esta máquina :-( #ifdef TARGET_ZCODE; IFDEF DEBUG; Include "betatest"; ENDIF; #endif; ! MENSAJES DE LA LIBRERIA Object MensajesLibreria with antes [; Comer: switch (ml_n) { 1: switch (random (3)) { 1: "Eso es incomestible."; 2: "No puedes comerte eso."; 3: "¡No estás tan desesperadamente hambriento como para comerte eso!"; } }; Despertarse: switch (random (3)) { 1: "Ya estás despierto."; 2: "No estás durmiendo."; 3: "Esto no es un sueño, es la realidad."; }; Dormir: "Este no es un buen sitio para echar una siesta."; Excavar: "El suelo es duro, necesitarías para ello un taladro."; Miscelanea: switch (ml_n) { 3: if (muerto == 0) TextoLlamativo (" Has perdido "); else TextoLlamativo (" Has muerto "); rtrue; 10: rtrue; ! Lo que hace cuando se introduce una línea en blanco 19: if (ABONO notin jugador) "Estás sudando de la preocupación de no tener billete."; else "Estás temblando de miedo ante la posibilidad de que el revisor descubra que este billete no es tuyo."; 39: switch (random (4)) { 1: "Eso no es importante para la aventura."; 2: "Con eso no lograrás nada útil."; 3: "No vas a conseguir nada con eso."; 4: "No pierdas el tiempo con eso."; } }; Nadar: "Aquí no puedes nadar."; Prompt: print "^>> "; rtrue; Quemar: switch (random (2)) { 1: "No tienes nada con lo que puedas quemar."; 2: "¡No seas pirómano!"; }; Saltar: switch (random (3)) { 1: "¿Para qué quieres saltar?"; 2: "No te servirá de nada saltar aquí."; 3: "Mejor conserva tus energías para más tarde."; }; ]; ! Reemplazaremos la rutina ResponderSub, porque el hablar con los personajes ! solamente queremos que se haga mediante el comando 'Hablar', a través de ! menús valiéndonos de la librería fhablaoo. Replace ResponderSub; Include "Acciones"; ! Esto es para evitar que el parser se invente objetos para comandos en los ! que no se haya especificado ninguno, (como al poner 'comer'). Está aquí ! porque debe estar antes de incluir Gramatica.h [ ElegirObjetos obj N; if (N == 2) if ((obj notin localizacion) && (obj notin brujula)) return -2; ]; Include "Gramatica"; Include "Cortos"; Include "fhablaoo"; Include "zn"; Include "Facilitar"; ! CORTOS ! ! ¡ATENCIÓN!: No sigas leyendo si no te has pasado ya el juego ! cortometraje Corto_Final with descripcion "El revisor hace una marca con un bolígrafo en la parte trasera del billete y te lo devuelve." "^^El resto del trayecto transcurre sin incidencias, por lo que consigues llegar a tu destino a tiempo, sano y salvo." "^^Bajas del tren y emprendes el camino hacia tu casa pero, al poco rato, una corriente de aire frío te sacude la cara, haciéndote estornudar." "^^Metes la mano en tu bolsillo para sacar un pañuelo, pero lo único que ésta encuentra es al tacto algo bastante más duro y regular que un pañuelo de papel." "^^Te preguntas extrañado, aunque en voz alta:" "^~¿Qué tengo en el bolsillo?~" "^^Un tipo feo y deforme, de piel verde y escamosa y ojos saltones que pasaba a tu lado te dice siseando:" "^~¡No vale! ¡No vale! ¿No es cierto que no vale, preciosso mío, preguntarnos que tiene en los asquerosos bolsillitos?~" "^^Por si acaso es peligroso, te apartas de él y cruzas a la acera de enfrente." "^^Sacas el objeto no identificado de tu bolsillo y le echas una mirada, que pasa de curiosa a colérica en pocos instantes." "^^Gritas:" "^~¡Mecagüen los vomitivos aseos de los trenes!" " ¡Si desde un principio he tenido aquí mi propio billete de tren!~" "^^Al final, después de romper el billete en mil pedazos y de patear una lata de refresco que había en el suelo, te tranquilizas porque, al fin y al cabo..."; ! HABITACIONES Habitacion ANDEN "Andén principal (en la estación)" with descripcion [; FijarPronombre ('él', PIDEBOLLITOS); FijarPronombre ('-le', PIDEBOLLITOS); FijarPronombre ('-lo', PANEL); "Te encuentras en el andén principal de la estación, algunos trenes esperan aquí su hora de salida. Hacia el este quedan algunas tiendas dentro del mismo edificio de la estación. Al norte hay más vías, de la 7 a la 10. La gente va de un lado a otro, yendo y viniendo de y hacia todos los sitios.^^Un mendigo merodea por aquí, llevando un vaso en la mano y observando a la gente de su alrededor. Del techo cuelga un enorme panel luminoso que llama tu atención."; ], irrelevante 'trenes' 'tiendas' 'tren' 'via' 'vias' 'gente' 'humo' 'humillo' 'cucharilla' 'cuchara' 'mano', al_n [; if ((bollito_pedido == 1) && (bollito_dado == 0)) { FijarPronombre ('él', PIDEBOLLITOS); FijarPronombre ('-le', PIDEBOLLITOS); print_ret "El mendigo te ", (coge) " del brazo y dice:^~Oye, por ahí no está la cafetería.~"; } else { JugadorA (JUNTOVIA); rtrue; } ], al_e CAFETERIA, abajo "No puedes bajar del andén, un tren te lo impide.", adentro CAFETERIA, afuera [; print_ret "No puedes abandonar la estación, ¡tienes que ", (coge) "r el tren!"; ]; Habitacion ASEO "Aseo (en el tren)" with descripcion "Este es el típico aseo minimalista propio de los trenes, tiene lo más básico: un retrete, un lavabo, un espejo y un secador de manos... por cierto, no hay papel.", irrelevante 'retrete' 'lavabo' 'secador' 'puerta', ocupado 1, al_e [; if (REVISOR in ASEO) "El revisor te cierra el paso para que no salgas del aseo."; else JugadorA (OTROVAGON); rtrue; ], abajo "Tendrías que adelgazar un poco para poder bajar por el retrete.", adentro [; print "No querrás meterte dentro del retrete.^"; PreguntaSiNo = 1; rtrue; ], afuera [; return self.al_e(); ], salidas [direccion; switch (direccion) { obj_adentro: return 2; default: rfalse; } ]; Habitacion CAFETERIA "Cafetería (en la estación)" with descripcion [; FijarPronombre ('él', CAMARERO); FijarPronombre ('-le', CAMARERO); "Estás en la cafetería de la estación, hay varias mesas con sillas distribuídas por todo el local y un buen número de gente sentada en ellas tomando su desayuno (qué ingenuos, no saben que en casa también se puede desayunar y que además es más barato). Hay dos puertas acristaladas, una al norte y la otra al oeste.^^Te sientas en una de las sillas de una mesa vacía y esperas al camarero. Este, al poco rato, se te acerca y te dice:^ ~¿Qué desea tomar caballero?~"; ], irrelevante 'cafeteria' 'mesa' 'mesas' 'silla' 'sillas' 'local' 'gente' 'desayuno' 'puerta' 'puertas' 'cristal' 'cristales', al_n JUNTOVIA, al_o ANDEN, afuera "Esta cafetería tiene dos salidas: una al norte y otra al oeste, ¿por cual de ellas quieres salir?"; Habitacion JUNTOVIA "Junto a la vía 7 (en la estación)" with descripcion [; if (JUNTOVIA.ladotren == 0) { FijarPronombre ('-la', MAQUINA); FijarPronombre ('-lo', TREN); FijarPronombre ('-los', TORNIQUETES); print_ret "Estás en el andén que se encuentra junto a la vía 7. Hay una entrada de la cafetería al sudeste, y al suroeste queda el andén principal. Al oeste está el tren que deberías ", (coge) "r, pero unos torniquetes te cortan el paso y no te dejan pasar al otro lado, en el que está el tren.^^En una de las paredes de la estación puedes ver una máquina expendedora de billetes."; } else { FijarPronombre ('-lo', TREN); FijarPronombre ('-los', TORNIQUETES); print_ret "Estás en el andén que se encuentra junto a la vía 7. Al oeste está el tren que deberías ", (coge) "r y, como ya has pasado los torniquetes, ya puedes subir a él."; } ], irrelevante 'via' 'vias' 'anden' 'entrada' 'cafeteria' 'vagon' 'vagones' 'pared' 'paredes' 'puerta' 'cabina', ladotren 0, al_se [; if (JUNTOVIA.ladotren == 0) JugadorA (CAFETERIA); else { FijarPronombre ('-los', TORNIQUETES); "No puedes ir ahí, ya que los torniquetes te impiden el paso."; } rtrue; ], al_so [; if (JUNTOVIA.ladotren == 0) JugadorA (ANDEN); else { FijarPronombre ('-los', TORNIQUETES); "No puedes ir ahí, ya que los torniquetes te impiden el paso."; } rtrue; ], al_o [; if (JUNTOVIA.ladotren == 1) JugadorA (VAGON); else { FijarPronombre ('-lo', TREN); FijarPronombre ('-los', TORNIQUETES); "No puedes subir al tren, ya que los torniquetes te impiden acceder a él."; } rtrue; ], arriba [; return self.al_o(); ], adentro [; if (JUNTOVIA.ladotren == 1) JugadorA (VAGON); else JugadorA (CAFETERIA); rtrue; ], afuera [; return ANDEN.afuera(); ], antes [; Saltar: if (JUNTOVIA.ladotren == 0) { print "Tras cerciorarte de que nadie te observa, saltas por encima de los torniquetes, cayendo al lado en el que está el tren.^"; JUNTOVIA.ladotren = 1; move MAQUINA to LIMBO; } else { print "Tras cerciorarte de que nadie te observa, saltas por encima de los torniquetes, cayendo al lado opuesto al del tren.^"; JUNTOVIA.ladotren = 0; move MAQUINA to JUNTOVIA; } rtrue; ]; ! Aquí es donde estarán los objetos que no estén en el juego. Habitacion LIMBO "Limbo" with descripcion "¿Cómo has llegado hasta aquí? Se suponía que este sitio era ficticio."; ! Añadimos una descripción porque sin ella obtendríamos un ! error al acceder a la habitación (mediante xir). Habitacion OTROVAGON "Segundo vagón (en el tren)" with descripcion [; print "Este es el segundo vagón del tren (el más próximo a la cabina del maquinista). Tan grande como el anterior pero no con tantos asientos, ya que en éste hay un aseo donde, en el otro, había más asientos. El aseo queda al oeste."; if ((ASEO.ocupado == 1) || (jugador notin OTROASIENTO)) { if (jugador in OTROASIENTO) print " A tu lado"; else print " En frente del aseo"; print " hay un "; if ((ASEO.ocupado == 1) && jugador notin OTROASIENTO) print "par de asientos libres."; else print "asiento libre."; } print " Hacia el sur está la puerta que va hacia el primer vagón y hacia el norte está la cabina del maquinista.^"; if ((jugador in OTROASIENTO) && (PASAJERO in OTROASIENTO)) print "^Hay un pasajero sentado a tu lado.^"; rtrue; ], irrelevante 'bolsillo' 'pasajeros' 'puerta' 'cabina' 'celo', al_n "No puedes ir al norte, allí está la cabina del maquinista.", al_s [; if (REVISOR has general) { print_ret "El revisor te ", (coge) " bien fuerte del brazo y dice:^~¿A dónde crees que vas?"; } else JugadorA (VAGON); rtrue; ], al_e [; if (TREN notin JUNTOVIA) { print "Aunque sabes que el tren está en marcha, saltas de él sin pensártelo dos veces, destrozándote contra las piedras que rodean la vía."; muerto = 1; banderafin = 1; rtrue; } else { JugadorA (JUNTOVIA); rtrue; } ], al_o [; if (ASEO.ocupado == 1) "No puedes entrar, está ocupado."; else { JugadorA (ASEO); rtrue; } ], adentro [; return self.al_o(); ], afuera [; return self.al_e(); ], abajo [; return self.al_e(); ]; Habitacion VAGON "Primer vagón (en el tren)" with descripcion [; FijarPronombre ('-la', LUCECITA); print "El vagón en el que encuentras ahora mismo es el primer vagón del tren (el más alejado de la cabina del maquinista). Es muy grande y está repleto de asientos pero éstos, a su vez, están repletos de pasajeros y "; if (jugador in ASIENTO) print "no queda ningún asiento libre. Hay una"; else print "sólo queda un asiento libre junto a la"; print " puerta que conecta el primer vagón con el segundo. Esta puerta se encuentra al norte.^^Sobre la puerta hay una lucecita roja, la cual está "; if (ASEO.ocupado == 1) "encendida."; else "apagada."; ], irrelevante 'pasajeros' 'puerta' 'asientos' 'celo', al_n [; if (REVISOR has general) print_ret "El revisor te ", (coge) " bien fuerte del brazo y dice:^~¿A dónde crees que vas?"; else JugadorA (OTROVAGON); rtrue; ], al_e [; if (TREN notin JUNTOVIA) { print "Aunque sabes que el tren está en marcha, saltas de él sin pensártelo dos veces, destrozándote contra las piedras que rodean la vía."; muerto = 1; banderafin = 1; rtrue; } else { JugadorA (JUNTOVIA); rtrue; } ], abajo [; return self.al_e(); ], afuera [; return self.al_e(); ]; ! OBJETOS Objeto ABONO "abono mensual" LIMBO with nombre 'abono' 'ticket' 'billete', adjetivos 'mensual', descripcion "Es un abono mensual para viajar en tren, por la cara de delante están inscritas las horas en las que ha sido pasado por los distintos torniquetes, además del número de DNI del propietario (que no eres tú). Por la cara de detrás están las marcas que hace el revisor en los distintos días, a la ida y a la vuelta, y también una banda magnética que leen y escriben a su antojo los torniquetes."; Objeto ASIENTO with nombre_corto [; if (jugador in self) print "asiento"; else print "asiento libre"; rtrue; ], esta_en VAGON, nombre 'asiento', adjetivos 'libre', descripcion [; if (jugador in self) print "Este asiento"; else print "El asiento libre"; print " es exactamente igual que los otros "; if (jugador in self) "sólo que tú eres quien está sentado en él."; else "pero, como ya te he dicho, no está ocupado por nadie."; ], despues [; Meterse: "Te sientas en el asiento libre."; ] has entrable escenario transparente; Objeto BOLLITO "bollito" LIMBO with nombre 'bollo' 'bollito', descripcion "Es un bollito con muy buena pinta, si no está recién hecho, al menos, aparenta estarlo.", antes [; Comer: move BOLLITO to LIMBO; "Te comes el bollito. Estaba muy tierno y bueno."; ] has comestible; Personaje CAMARERO "camarero" CAFETERIA with nombre 'camarero' 'hombre', descripcion "Es como todos los camareros que tienen que trabajar de buena mañana, con una mala cara que intenta esconder con una sonrisa forzada.", Enunciado [linea; switch (linea) { 0: "~Nada~"; 1: "~Un bollito~"; 2: "~¿Cuánto cuesta un bollito?~"; 3: "~Una pizza a los cuatro quesos~"; } ], Respuesta [linea; switch (linea) { 0: print "El camarero te echa una mirada asesina y te tira del local.^"; JugadorA (ANDEN); rtrue; 1: if (MONEDAS notin Jugador) "No tienes con qué pagarlo."; move BOLLITO to Jugador; move MONEDAS to LIMBO; self.QuipOff (1); "El camarero te da el bollito, y tú le pagas con las monedas."; 2: self.QuipOff (2); "El camarero te dice:^~Pues tan sólo 125 pesetas.~"; 3: self.QuipOff (3); "El camarero, malhumorado, dice:^~Por si no se ha dado cuenta, esto es una cafetería, aquí no hacemos pizzas.~"; } ], InicializarQuips [; self.QuipsOn (2, 0, 3); ], vida [; Atacar: "No tienes motivos para hacerlo."; ] has animado escenario; Objeto CARTEL_LINUX "cartel publicitario" LIMBO with nombre 'cartel', adjetivos 'publicita' 'linux', descripcion "Es un cartel publicitario fijado con celo. Dice: ~Utilice Linux, su ordenador se lo agradecerá.~" has escenario; Objeto CARTEL_SECRETO "cartel publicitario" LIMBO with nombre 'cartel', adjetivos 'publicita' 'secreto' 'morgul', descripcion "Es un cartel publicitario fijado con celo. Dice: ~¡La aventura más esperada del año! El secreto de Morgul, próximamente en vuestras pantallas.~" has escenario; Objeto ESPEJO "espejo" ASEO with nombre 'espejo', descripcion "Es un espejo de aproximadamente 30x40 centímetros de dimensión, situado sobre el lavabo.", antes [; Atacar: "No conseguirías nada rompiendo el espejo."; ] has escenario; Objeto ESTACION "estación de tren" with nombre 'estacion', adjetivos 'tren', esta_en ANDEN JUNTOVIA, descripcion "Es la estación de tren de tu ciudad, bastante grande y siempre llena de gente. Exteriormente es bonita pero por dentro (tras las reformas modernas) es horrorosa. De todos modos, cumple perfectamente su misión.", has escenario femenino; Objeto LUCECITA "lucecita roja" VAGON with nombre 'lucecita' 'luz', adjetivos 'roja' 'encendida' 'apagada', descripcion [; if (ASEO.ocupado == 1) "Está encendida, lo cual significa que el aseo está ocupado. Junto a ella pone: ~ASEO~ y un símbolo de un hombre y de una mujer."; else "Está apagada, lo cual significa que el aseo está libre. Junto a ella pone: ~ASEO~ y un símbolo de un hombre y de una mujer."; ], antes [; Coger: print_ret "No puedes ", (coger) "la, no llegas."; ] has escenario femenino; Objeto MAQUINA "máquina expendedora de billetes" JUNTOVIA with nombre 'maquina', adjetivos 'expendedora' 'billetes', descripcion "Esta es la única expendedora de toda la estación que parece que funciona, tienes que introducirle el dinero para poder comprar un billete. Cada billete (de los que tú necesitas) cuesta 125 pesetas.", antes [; Atacar: "Golpeas la máquina, pero no ocurre nada de nada."; Recibir: if (uno == MONEDAS) { move MONEDAS to LIMBO; "~Vaya, parece que esta máquina se ha tragado las monedas y no me saca ningún billete.~"; } else "No puedes meter eso ahí."; ] has escenario recipiente abierto femenino; Objeto MONEDAS "monedas" LIMBO with nombre_fp 'monedas', nombre_m 'dinero', genero G_FEMENINO + G_PLURAL, descripcion "Son las monedas que te ha dado el mendigo, concretamente 125 pesetas."; Objeto OTROASIENTO with nombre_corto [; if (jugador in self) print "asiento"; else if (ASEO.ocupado == 0) print "asiento libre"; else print "par de asientos libres"; rtrue; ], esta_en OTROVAGON, nombre 'asiento' 'asientos' 'par', adjetivos 'libre' 'libres', descripcion [; if (ASEO.ocupado == 0) { if (jugador in self) print "Este asiento"; else print "El asiento libre"; print " es exactamente igual que los otros "; if (jugador in self) "sólo que tú eres quien está sentado en él."; else "pero, como ya te he dicho, no está ocupado por nadie."; } else "Este par de asientos libres es exactamente igual que los otros pero, como ya te he dicho, no están ocupados por nadie."; ], despues [; Meterse: "Te sientas en el asiento libre."; ] has entrable escenario transparente; Objeto PANEL "panel informativo" ANDEN with nombre 'panel', adjetivos 'informativo' 'luminoso' 'enorme' 'gran' 'grande' 'colgado', descripcion "Es un panel informativo que indica el horario de llegadas y salidas de los distintos trenes de la estación, el tuyo está a punto de salir y se encuentra en la vía 7.", antes [; Coger: print_ret "Es imposible ", (coger) "lo por tres razones: la primera es que se encuentra a unos cuatro metros de altitud, la segunda es que debe pesar varias toneladas, y la tercera es que está sujeto al techo."; ] has escenario; Objeto PAPEL "papel higiénico" ASEO with nombre 'papel', adjetivos 'higienico', antes [; default: "Te he dicho que no hay."; ] has oculto; Personaje PASAJERO "pasajero" LIMBO with nombre 'pasajero' 'hombre', descripcion [; if (self hasnt general) "Es un hombre de unos treinta y tantos años de edad. No parece preocupado por si aparece el revisor, seguro que tiene billete."; else { print "El pasajero está agachado buscando las monedas."; if (ABONO in OTROASIENTO) { print " De su bolsillo asoma un billete."; } print "^"; } ], antes [; BuscarEn: if (ABONO in OTROASIENTO) "De su bolsillo asoma un billete."; else rfalse; ], tiempo_restante, tiempo_agotado [; ASEO.ocupado = 0; move self to OTROASIENTO; if (jugador in OTROASIENTO) "^Un hombre sale del aseo y se sienta a tu lado."; else if (jugador in OTROVAGON) "^Un hombre sale del aseo y se sienta en uno de los asientos libres."; else if (jugador in VAGON) "^Ves cómo la lucecita sobre la puerta se apaga."; ], Enunciado [linea; switch (linea) { 0: "Por casualidad, ¿no tendrás ningún billete de sobra?"; } ], Respuesta [linea; switch (linea) { 0: self.QuipOff (0); "El pasajero te dice:^~Pues no, sólo tengo uno para mí.~"; } ], InicializarQuips [; self.QuipOn (0); ], vida [; Atacar: "No tienes motivos para hacerlo."; ] has animado escenario; Personaje PIDEBOLLITOS "mendigo" ANDEN with nombre 'mendigo' 'hombre', adjetivos 'pide-bollitos' 'pidebollitos' 'pide-bollos' 'pidebollos', descripcion "Es un mendigo que va pidiendo a la gente que le compren un bollito para desayunar, pero parece que nadie le hace caso. Ha debido estar mucho tiempo sin lavarse, está desgreñado y tiene las uñas ennegrecidas de mugre. En su mano izquierda sostiene un vaso de plástico.", antes [; BuscarEn: "Tiene un vaso en su mano izquierda."; Frotar: "~La verdad es que falta le hace, pero ese no es mi problema, que se lave él mismo.~"; Oler: "~Prefiero no acercarme demasiado a él. Además, desde aquí, no parece que huela muy bien.~"; ], cada_turno [; if ((jugador hasnt general) && (bollito_dado == 0)) { if (callar == 1) { callar = 0; return; } if (random(3) == 1) if (PIDEBOLLITOS hasnt general) { self.QuipOff (0); self.QuipsOn (3, 1, 4, 5); CAMARERO.QuipsOn (2, 1, 2); FijarPronombre ('él', PIDEBOLLITOS); "^El mendigo se te acerca y te dice:^ ~Oye, por favor, ¿podrías comprarme un bollito de la cafetería? Es que ya tengo un vaso de chocolate y podría acompañarlo con un bollito.~"; } else if (MONEDAS hasnt general) { FijarPronombre ('él', PIDEBOLLITOS); "El mendigo te dice:^~Por favor, cómpramelo.~"; } else if ((random (3)) == 1 or 2) { self.QuipsOn (2, 2, 3); FijarPronombre ('él', PIDEBOLLITOS); "^El mendigo te dice:^~¿Ya me lo has comprado?~"; } } ], Enunciado [linea; switch (linea) { 0: "~Hola~"; 1: "~Lo siento, no tengo dinero.~"; 2: "~Sí~"; 3: "~Aún no~"; 4: "~No~"; 5: "~¿Por qué no lo compras tú?~"; } ], Respuesta [linea; switch (linea) { 0: self.QuipOff (0); "El mendigo sonríe y dice:^~Hola~"; 1: self.QuipsOff (2, 1, 4); move MONEDAS to jugador; give MONEDAS general; give PIDEBOLLITOS general; FijarPronombre ('ellas', MONEDAS); FijarPronombre ('-las', MONEDAS); bollito_pedido = 1; callar = 1; "El mendigo te dice:^~Yo tengo algo de dinero, ten y cómpramelo.~^^ Te da unas monedas."; 2: self.QuipsOff (2, 2, 3); callar = 1; "El mendigo te dice:^~Pues dámelo.~"; 3: self.QuipsOff (2, 2, 3); callar = 1; "El mendigo te dice:^~Pues cómpramelo, por favor.~"; 4: self.QuipsOff (4, 1, 2, 3, 4); give Jugador general; bollito_pedido = 0; "El mendigo gira la cabeza y deja de prestarte atención."; 5: self.QuipOff (5); callar = 1; "El mendigo responde:^~Porque no me dejan entrar.~"; } ], InicializarQuips [; self.QuipOn (0); ], vida [; Atacar: "No tienes motivos para hacerlo."; Dar: if (uno == BOLLITO) { move BOLLITO to LIMBO; bollito_dado = 1; self.QuipsOff (3, 1, 2, 3); self.QuipsOff (2, 4, 5); print_ret "El mendigo ", (coge) " el bollito con sus sucias manos y te da las gracias. Acto seguido, devora con ansia su, para él, preciado manjar."; } else if (uno == MONEDAS) { "El mendigo te dice:^~No me devuelvas el dinero, cómprame con él el bollito, que para eso te lo he dado.~"; } ] has animado transparente escenario; Personaje REVISOR "revisor" LIMBO with nombre 'revisor' 'hombre', descripcion "Es el revisor de este tren, mide 1'90 metros, está cuadrado y tiene cara de mala leche. Más te vale conseguir un billete.", contador 0, daemon [; self.contador = self.contador + 1; if (self hasnt general) switch (self.contador) { 40: move REVISOR to OTROVAGON; if ((jugador in OTROVAGON) || (jugador in OTROASIENTO)) "^El revisor sale de la cabina y empieza a pedir los billetes de los pasajeros."; 42: if ((jugador in OTROVAGON) || (jugador in OTROASIENTO)) { if (jugador in OTROASIENTO) move REVISOR to OTROASIENTO; give REVISOR general; self.QuipOn (1); self.contador = 0; "^El revisor te pide el billete."; } 43: move REVISOR to ASEO; if (jugador in ASEO) { give REVISOR general; self.QuipOn (1); self.contador = 0; "^El revisor entreabre (con su llave) la puerta del aseo y te pide tu billete."; } 45: move REVISOR to VAGON; if (jugador in ASIENTO) move REVISOR to ASIENTO; give REVISOR general; self.QuipOn (1); self.contador = 0; if (jugador in ASIENTO) "^El revisor sale de la puerta que conecta los dos vagones y te pide tu billete."; else "^El revisor sale de la puerta que conecta los dos vagones y, al cabo de un rato, te pide tu billete."; } else ! self has general if (self.contador == 4) { print "^El revisor te levanta, te pega dos sopapos, abre la puerta del tren y te tira."; muerto = 1; banderafin = 1; } ], Enunciado [linea; switch (linea) { 0: "~Hola~"; 1: "~Sí, en seguida se lo doy~"; } ], Respuesta [linea; switch (linea) { 0: self.QuipOff (0); self.contador--; ! El hablar hace que el revisor se impaciente menos "El revisor contesta secamente:^~Hola~"; 1: self.QuipOff (1); self.contador--; ! El hablar hace que el revisor se impaciente menos "El revisor dice:^~Más te vale que sea en seguida~"; } ], InicializarQuips [; self.QuipOn (0); ], vida [; Atacar: "No eres tan valiente como para enfrentarte a él."; Dar: if (uno == ABONO) { if (jugador in OTROASIENTO) { banderafin = 1; muerto = 1; "El pasajero sentado a tu lado grita:^~¡Eh! ¡Ese es mi billete!~^^El revisor, tras comprobar que el número de DNI inscrito en el billete concuerda con el de el pasajero, te levanta y te lanza fuera del tren. Lo último que ven tus ojos son piedras y tu propia sangre."; } else { banderafin = 2; Corto_Final.proyeccion(); rtrue; } }; Insultar: "Eso sería muy arriesgado."; ] has animado escenario; Objeto TORNIQUETES "torniquetes" JUNTOVIA with nombre_m 'torniquete', nombre_mp 'torniquetes', nombre_f 'barrera', nombre_fp 'barreras', descripcion "Son los típicos torniquetes de las estaciones de tren, en los que, en teoría, tienes que meter el billete para poder pasar al otro lado.", antes [; Abrir: "Necesitarías una caja de herramientas para poder hacerlo."; Meterse: "¡No hagas tonterías!"; SaltarSobre: print "Tras cerciorarte de que nadie te observa, saltas por encima de los torniquetes, cayendo al lado "; if (JUNTOVIA.ladotren == 0) { print "en el que está el tren.^"; JUNTOVIA.ladotren = 1; move MAQUINA to LIMBO; } else { print "opuesto al del tren.^"; JUNTOVIA.ladotren = 0; move MAQUINA to JUNTOVIA; } rtrue; ] has escenario nombreplural; Objeto TREN "tren" JUNTOVIA with nombre 'tren' 'ferrocarril', descripcion [; print_ret "Este es el tren que tienes que ", (coge) "r, consta sólo de dos vagones (aunque son bastante largos) y la cabina del maquinista."; ], tiempo_restante, tiempo_agotado [; if ((jugador notin VAGON) && (jugador notin OTROVAGON) && (jugador notin ASEO) && (jugador notin ASIENTO) && (jugador notin OTROASIENTO)) { if (jugador in JUNTOVIA) print "^Ves cómo tu tren se va"; else print "^Tu tren se acaba de ir"; print ", y con él todas tus esperanzas."; banderafin = 1; } else { move TREN to LIMBO; "^El tren sale de la estación e inicia su trayecto."; } ], antes [; Coger: ; rtrue; Meterse: ; rtrue; ] has escenario; Objeto VASO "vaso de plástico" PIDEBOLLITOS with nombre 'vaso', adjetivos 'plastico' 'chocolate' 'mendigo', descripcion "Es un vaso de plástico que contiene chocolate. El mendigo pide-bollitos (que es lo que es este) lo remueve incesantemente con una cucharilla también de plástico. De su interior sale un humillo que indica que todavía está caliente.", antes [; Coger, Sacar, Tocar: "~Prefiero no tocar ese vaso.~"; Soplar: "El mendigo aparta el vaso y dice:^~¡Eh! ¿Qué haces? Así lo vas a enfriar~"; ]; Objeto VENTANA "ventana" with esta_en VAGON OTROVAGON, nombre 'ventana' 'ventanilla', nombre_fp 'ventanas', descripcion [esperando; if (esperando == 1) print "Te distraes un rato mirando por la ventana."; else print "Te pones a mirar un rato por la ventana."; if (TREN notin JUNTOVIA) switch (random (4)) { 1: print " Ves pasar otro tren en sentido contrario."; 2: print " Ves un perro que está ladrando al tren, pero no se le oye."; } else switch (random (6)) { 1: print " Ves cómo sale un tren de la estación."; 2: print " Ves cómo llega un tren a la estación."; 3: print " Ves cómo sube gente a un tren."; } print_ret ""; ], antes [; Abrir, Cerrar: "Esta ventana no es de esas que pueden abrirse y cerrarse."; BuscarEn: return self.descripcion (0); ] has femenina escenario; ! FUNCIONES ! Función inicial [ Inicializar; ! Esto es para que el juego dé siempre la descripción de la habitación, aunque ! ya la hayamos visitado modomirar = 2; ! El juego comienza con el jugador en el andén principal localizacion = ANDEN; ! Para controlar un poco el tratamiento 'especial' de los comandos jugador.ordenes = OrdenesJugador; ! Ponemos en marcha los relojes y daemons ArrancarReloj (PASAJERO, 17); ArrancarDaemon (REVISOR); ArrancarReloj (TREN, 23); ! Ajusta las frases iniciales para hablar con los PSI's CAMARERO.InicializarQuips(); PASAJERO.InicializarQuips(); PIDEBOLLITOS.InicializarQuips(); REVISOR.InicializarQuips(); ! Configuraciones del módulo zn zn_conf.max_turnos = 60; "Sé bienvenido a...^"; ]; ! Para controlar un poco el tratamiento 'especial' de los comandos [ OrdenesJugador; Dejar: if (uno == MONEDAS) { if ((jugador in OTROASIENTO) && (PASAJERO in OTROASIENTO)) { give PASAJERO general; move MONEDAS to LIMBO; move ABONO to OTROASIENTO; PASAJERO.QuipOff (0); "Dejas caer las monedas, y el pasajero sentado a tu lado se agacha para buscarlas."; } else { move MONEDAS to localizacion; "Dejas caer las monedas."; } } else rfalse; Dormir: if ((jugador in ASIENTO or OTROASIENTO) && (TREN notin JUNTOVIA)) { "Con el traqueteo del tren, no puedes conciliar el sueño."; } else if (jugador in ASIENTO or OTROASIENTO) { "No tienes sueño."; } else rfalse; Esperar: if (jugador in ASIENTO or VAGON) switch (random (3)) { 1: move CARTEL_SECRETO to VAGON; "Te distraes mirando un cartel, éste dice:^~¡La aventura más esperada del año! El secreto de Morgul, próximamente en vuestras pantallas.~"; 2: "Te distraes observando lo curiososo que es que siempre todos los pasajeros están serios."; 3: return VENTANA.descripcion (1); } else if (jugador in OTROASIENTO or OTROVAGON) switch (random (2)) { 1: move CARTEL_LINUX to OTROVAGON; "Te distraes mirando un cartel, éste dice:^~Utilice Linux, su ordenador se lo agradecerá.~"; 2: "Te distraes observando lo curiososo que es que siempre todos los pasajeros están serios."; 3: return VENTANA.descripcion (1); } else rfalse; Examinar: if (uno == obj_arriba) if (jugador in ANDEN) "Del techo cuelga un enorme panel luminoso que llama tu atención."; rfalse; PonerSobre: if ((uno == MONEDAS) && (otro == VASO)) switch (random (2)) { 1: "~No creo que al mendigo le gustara eso.~"; 2: "~Eso sería una guarrada.~"; } else rfalse; Salir: if ((jugador in ASIENTO) || (jugador in OTROASIENTO)) { print "Te levantas del asiento.^"; if (jugador in ASIENTO) JugadorA (VAGON); else JugadorA (OTROVAGON); } else rfalse; default: rfalse; ]; ! VERBOS Verb 'ayuda' * -> Ayuda; VerboIrregular "ayuda" with imperativo "ayuda"; Extend only 'deja' first * 'caer' multiheld -> Dejar; Extend 'di' replace * -> Responder * topic -> Responder; Extend only 'habla' replace * 'a//' creature -> HablarCon ! Si pongo en alguna línea * 'con' creature -> HablarCon ! 'a//'/'con', la librería * 'a//' noun -> HablarCon ! no sabe responder bien a * 'con' noun -> HablarCon; ! un simple "HABLA" Verb 'insulta' * 'a//' noun -> Insultar * noun -> Insultar; Verb 'introduce' * multiexcept 'dentro' 'de' noun -> Meter * multiexcept 'en' noun -> Meter; VerboIrregular "introducir" with imperativo "introduce"; Extend 'pide' replace * -> Responder * topic -> Responder; ! SINÓNIMOS Verb 'levanta' = 'levantate'; ! RUTINAS VERBOSUB [ AyudaSub; "Si quieres más información, mira el fichero leeme.txt que se distribuye junto con este juego."; ]; [ InsultarSub; if (uno == jugador) "No conseguirás nada insultándote."; else if (uno has animado) "¡No seas maleducado!"; else { print "No parece", (n) uno, " ofendid", (o) uno, " por tus insultos.^"; rtrue; } ]; [ ResponderSub; "Para hablar con alguien usa el verbo ~Hablar~."; ];