Constant Historia "Adso de Melk"; Constant Titular "^Una adaptación de ~La Abadía del Crimen~^ Copyright (c) 2.001 Ricardo Pérez (Alpha Aventuras)^"; Constant ADMITIR_COMANDO_SALIDAS; Constant HORA_NONA = 0; Constant HORA_VISPERAS = 1; Constant HORA_NOCHE = 2; Replace DibujarLineaEstado; Include "EParser"; Object MensajesLibreria with antes [; Prompt: print "^>> "; rtrue; Miscelanea: switch (ml_n) { 10: rtrue; } ]; Include "Decorado"; Include "Acciones"; Include "MovilesV2"; Include "PNJPuertas"; Include "BajoNivel"; Include "barra"; Object barra_estado class objeto_barra_estado with modo BE_COMPUESTO, disposicion 1 1 true BE_LOCALIDAD 40 1 true BE_PUNTUACION 60 1 true BE_TURNOS 1 2 true BE_TEXTO 40 2 true BE_TEXTO, lineas_inv BE_INV_TOTAL BE_INV_TOTAL, texto [ x i; switch (x) { 1: print_ret (string) NombreDia(), " día | ", (string) NombreHora(); 2: print "Obsequium: "; for (i = 1 : i < Abad.obsequium : i++) print "*"; } ]; [ DibujarLineaEstado; barra_estado.dibujar(); ]; ! --------------------------------------------------- ! ! CAMINOS PARA LOS PNJ ! ! --------------------------------------------------- Constant RUTA_NINGUNA = 0; !Constant RUTA_ALEATORIA = 1; Constant RUTA_ABAD_INICIAL = 2; Constant RUTA_ABAD_SU_CELDA = 3; Constant RUTA_SEGUIR_ADSO = 4; Constant RUTA_SEGUIR_ABAD = 5; Array RutaAbadInicial --> obj_e 0 obj_n 0 obj_e 0 obj_n 0 obj_n 0 obj_o 0; Constant LRutaAbadInicial = 12; ! --------------------------------------------------- ! ! HABITACIONES ! ! --------------------------------------------------- Class Habitacion class Lugar, has luz; Object Vereda "Vereda" class Habitacion, with descripcion "La abrupta vereda que sube, montaña arriba, hasta las faldas de la abadía.", al_n AnteLasPuertas, arriba AnteLasPuertas, no_puedes_ir "Vuestra meta se encuentra ya próxima. No cambiéis vuestro rumbo."; Object decVereda Vereda class Decorado with desc_iglesia "La divisáis a lo lejos, majestuosa y tenue como un espejismo.", describir 'vereda' [; ; return ""; ] G_FEMENINO 'abadia' [; return self.desc_iglesia; ] G_FEMENINO 'iglesia' [; return self.desc_iglesia; ] G_FEMENINO 'montana' "Después de todo un día de ascensión, has llegado a la conclusión de que la montaña es MUY alta." G_FEMENINO, antes [; Examinar: rfalse; default: switch (cantidad) { 'abadia', 'iglesia': "Está un poco lejos para eso, ¿no?"; default: "El abrupto terreno montañoso no permite que hagas mucho con él."; } ] has escenario; Object AnteLasPuertas "Junto a las puertas de la abadía" class Habitacion, with inicial "Tras varias horas más de lenta ascensión, llegáis finalmente...", descripcion "Una vez tienes ante tí las inmensas puertas que conducen a la abadía, aprecias realmente la grandiosidad de su construcción, tan sólo equiparable a la del Altísimo alavado y reverenciado tras sus muros.", no_puedes_ir "Estais delante de vuestro destino: entrad en él.", antes [; Entrar: "La puerta está cerrada. Deberíais llamar antes."; Llamar: print "Llamas a la puerta, observando el rostro de curiosidad de tu maestro al percibir la decisión con la que has actuado. Mientras tu interior se llena de orgullo por ello, oyes unos estridentes chirridos y roces de metal, que dan paso a un fuerte golpe, liberando la puerta que antes estaba cerrada a cal y canto. Un monje aparece tras ella, invitándoos a pasar.^Comenzáis a subir...^"; JugadorA(Entrada); move Guillermo to Entrada; print "El monje que abrió la puerta os pide que esperéis al abad, y se pierde por el oeste.^"; ArrancarReloj(Entrada, 3); rtrue; ]; Object Entrada "Las escaleras de entrada" class Habitacion, with descripcion "Una escalera de amplios escalones conduce unos metros más arriba a la entrada de la iglesia.", tiempo_restante 3, tiempo_agotado [; move Abad to localizacion; PNJ_Ruta(Abad, MOVIMIENTO_PREFIJADO, RutaAbadInicial, LRutaAbadInicial); Abad.precamino = RUTA_ABAD_INICIAL; ArrancarDaemon(Abad); "Llega el abad..."; ], antes [; Ir: ! Si el Abad aún no ha aparecido en el juego... if (~~(parent(Abad) ofclass Habitacion)) { EscribeGuillermo("No deberíamos movernos de aquí hasta que llegue el abad."); rtrue; } if (uno == obj_s) "Las puertas de la abadía están cerradas."; ], al_e AlaSureste; Object AlaSureste "Ala Sureste" class Habitacion, with descripcion "Junto a una esquina de la iglesia. Al norte, el patio, y al oeste, las escaleras de entrada a la iglesia.", al_o Entrada, al_n Patio1; Object Patio1 "Lado occidental del patio" class Habitacion, with descripcion "Un patio adornado con árboles y flores de todas las especies, ayuda al recogimiento interior de los monjes de la abadía. Está rodeado por parejas de columnas dispuestas uniformemente por su perímetro, y varios escalones en sus esquinas, probablemente para ayudar a los monjes más ancianos de la abadía.", al_s AlaSureste, al_e Patio2; Object Patio2 "El patio, junto a las columnas" class Habitacion, with descripcion "Tres discretos escalones conducen a la salida del patio, junto a la entrada abierta de una zona amurallada.", al_o Patio1, al_n EntradaAlaEste; Object EntradaAlaEste "Entrada al ala Este" class Habitacion, with descripcion "Ante tí la entrada al ala Este de la iglesia. Desde aquí se vislumbra el altar, al final de un largo y austero pasillo.", al_o AlaEste, al_s Patio2, al_n Mirador; Object Mirador "Mirador" class Habitacion, with descripcion "Un amplio mirador te obsequia con una impresionante vista de montes y colinas vírgenes, de una belleza tal que parecen haber sido tocados directamente por la mano de Dios.", al_s EntradaAlaEste, al_o FrenteCeldas; Object FrenteCeldas "Junto a tu celda" class Habitacion, with descripcion "Poco o nada de la extraordinaria luz que baña al mirador alcanza a llenar la estancia en la que te encuentras, pues aquí la semioscuridad es palpable, y tan sólo se percibe la presencia de tres puertas: una, hacia el oeste, comunica con la capilla; las otras dos dan a sendas celdas, una de las cuales es la dispuesta por el Abad para que la ocupéis tu maestro y tú.", al_e Mirador, al_o puerta_paso, al_n puerta_vuestra_celda; Object -> puerta_paso "puerta de hierro" class PNJPuerta, with nombre 'hierro', descripcion "Una solida puerta de hierro, mugrosa y oxidada por el tiempo y la humedad de estas estancias.", al_o JuntoCapilla, al_e FrenteCeldas has femenino abierta escenario; Object -> puerta_vuestra_celda "puerta de vuestra celda" class PNJPuerta, with nombre 'celda' 'nuestra', descripcion "La puerta que conduce a vuestra celda.", al_n VuestraCelda, al_s FrenteCeldas, has femenino abierta escenario; Object VuestraCelda "Vuestra celda" class Habitacion, with descripcion "Esta es vuestra celda, etc, etc, etc...", al_s puerta_vuestra_celda, cada_turno [; if (self hasnt general) { give self general; print "Guillermo saca cosas de su sayo y las guarda, etc, etc... Tú lo miras, etc, etc. Te dice eso de que algunas cosas es mejor esconderlas, etc, etc.^"; Guillermo.precamino = RUTA_SEGUIR_ADSO; PNJ_Ruta(Guillermo, MOVIMIENTO_PERSEGUIR, jugador); } ]; Object JuntoCapilla "Lugar de paso" class Habitacion, with descripcion "Este es el área que comunica la capilla, por un lado, con el ala este de la iglesia, y por otro, con la estancia en la que se encuentra vuestra celda, separada por una pesada y chirriante puerta.", al_e puerta_paso, al_s AlaEste, al_o Capilla; Object Capilla "La capilla" class Habitacion, with descripcion "Te encuentras en la capilla, la sala situada detrás del altar.", al_e JuntoCapilla, al_o [; if (MuroCapilla hasnt general) return 0; else return puerta_pasadizo; ]; Object -> MuroCapilla with nombre 'muro' 'pared' 'paredes' 'ladrillo' 'ladrillos', descripcion "Descubres una puerta.", despues [; Examinar: give self general; ], has escenario oculto; Object -> puerta_pasadizo "puerta" class PNJPuerta, with descripcion "Una puerta semioculta por la semejanza en color y textura con el muro en el que descansa.", articulo "una", describir [; if (MuroCapilla hasnt general) "Algo en el muro Oeste te llama la atención."; else "Observando con cuidado el muro Oeste, puedes apreciar los bordes, finos y casi imperceptibles, de una puerta."; ], al_e Capilla, al_o Pasadizo, has femenino cerrojo abrible; Object Pasadizo "El pasadizo secreto" class Habitacion, with descripcion "Un pasadizo secreto lleno de calaveras, humedad, etc.", al_e puerta_pasadizo; Object AlaEste "Ala Este de la iglesia" class Habitacion, with descripcion "La entrada lateral de la iglesia es sorprendentemente sobria, aunque no deja de resultar imponente. Aquí, los frescos y las estatuas dejan paso a altos muros de piedra que dan muestras de una solidez inquebrantable.", al_e EntradaAlaEste, al_n JuntoCapilla, al_o Altar; Object Altar "El altar" class Habitacion, with descripcion "El altar de la iglesia.", al_e AlaEste, al_o AlaOeste; Object AlaOeste "Ala Oeste de la iglesia" class Habitacion, with descripcion "El ala Oeste, a diferencia de la situada al este, no resulta ser más que un ancho pero corto pasillo en el que, al fondo, aparece la puerta de entrada a la celda del Abad.", al_e Altar, al_o puerta_abad; Object -> puerta_abad "puerta de la celda", class PNJPuerta, with descripcion "La puerta que impide el paso a la celda del Abad.", al_o CeldaAbad, al_e AlaOeste, has femenino escenario cerrojo cerrojoechado abrible; Object CeldaAbad "La celda del Abad", class Habitacion, with descripcion "Esta es la celda del Abad.", al_e puerta_abad; ! --------------------------------------------------- ! ! PERSONAJES DEL JUEGO ! ! --------------------------------------------------- Object Guillermo "Fray Guillermo" class Movil, with nombre 'fray' 'guillermo' 'baskerville' 'maestro', descripcion "Fray Guillermo de Baskerville, tu maestro.", describir [; switch (random(2)) { 1: "A tu lado, tu maestro parece perdido en delicadas elucubraciones."; 2: "Tu maestro observa atentamente su alrededor, escrutándolo con la eficacia de un sabueso."; } ], precamino RUTA_SEGUIR_ADSO, pnj_ha_llegado [; if (self.tipo_de_movimiento == MOVIMIENTO_PERSEGUIR) rfalse; if (parent(self) == VuestraCelda) { if (VuestraCelda hasnt general) { self.precamino = RUTA_NINGUNA; PNJ_Ruta(self, MOVIMIENTO_NINGUNO); } else { ! self.precamino = RUTA_SEGUIR_ADSO; ! PNJ_Ruta(self, MOVIMIENTO_PERSEGUIR, jugador); } } ], cada_turno [; if ((Abad.estado == 4) && (localizacion == FrenteCeldas)) { if (Abad.obsequium < 10) { print "Una vez que el Abad se ha marchado, tu maestro se dirige a tí con seriedad:^"; EscribeGuillermo("Adso, se nos ha encomendado la misión de investigar la extraña muerte sucedida en la abadía, y para ello no deberíamos levantar sospechas o suspicacias más allá de lo esperable. En el futuro, cuando desees hacer incursiones en la abadía, házmelo saber previamente, y por supuesto no lo hagas en presencia del Abad, ¿de acuerdo?"); PreguntaSiNo = 1; print "^Finalmente, concluye:^"; } EscribeGuillermo("Bien, pues vamos a comprobar qué tal es la celda que tan gentilmente nos ha preparado el Abad."); PNJ_Ruta(Guillermo, MOVIMIENTO_POR_META, VuestraCelda); Guillermo.movimiento(); } ], has animado propio; ! El tiempo, como un personaje más en la historia, me ayuda a escribir ! un código más claro. Object Tiempo with dia 1, hora HORA_NONA, tiempo_restante, tiempo_agotado [; if ((self.dia == 1) && (self.hora == HORA_NONA)) self.pasa_tiempo(); ], pasa_tiempo [; BorrarPantalla(); switch (self.dia) { 1: switch (self.hora) { HORA_NONA: self.hora = HORA_VISPERAS; box "Primer día" "" " VISPERAS"; HORA_VISPERAS: self.dia = 2; self.hora = HORA_NOCHE; box "Segundo día" "" " NOCHE "; } } EsperarTecla(); BorrarPantalla(); print "^^"; ; ]; Object Abad "Abad" class Movil, with nombre 'abad', articulo "al", obsequium 10, estado 0, precamino RUTA_NINGUNA, descripcion "<>", describir "El Abad observa en todo momento a tu maestro, mirándote de vez en cuando de soslayo y con actitud indiferente.", pnj_ha_llegado [; if ((parent(self) == CeldaAbad) && (Tiempo.dia == 1) && (Tiempo.hora == HORA_NONA)) ! El abad regresa a la celda, y pasados varios turnos, ! se cambia la hora ArrancarReloj(Tiempo, 10); else { ! Si le damos al móvil una rutina pnj_ha_llegado, cuando ! un PNJ llega a su destino, obligatoriamente hay que ! darle una nueva ruta, aunque sea MOVIMIENTO_NINGUNO self.precamino = RUTA_NINGUNA; PNJ_Ruta(self, MOVIMIENTO_NINGUNO); } ], daemon [; if (self.precamino == RUTA_ABAD_INICIAL or RUTA_NINGUNA) { if ((localizacion ~= AlaSureste) && (parent(self) == AlaSureste)) self.obsequium--; if ((localizacion ~= Patio1) && (parent(self) == Patio1) && (parent(Guillermo) == Patio1)) self.obsequium--; if ((localizacion ~= FrenteCeldas) && (parent(Abad) == FrenteCeldas) && (parent(Guillermo) == FrenteCeldas)) self.obsequium--; } ], cada_turno [; if ((self.precamino == RUTA_ABAD_INICIAL) || ((self.precamino == RUTA_NINGUNA) && (localizacion == FrenteCeldas))) switch (self.estado) { 0: self.estado = 1; EscribeAbad("Bienvenidos a esta abadía, hermanos. Os ruego que me sigáis. Ha sucedido algo terrible."); Guillermo.precamino = RUTA_SEGUIR_ABAD; PNJ_Ruta(Guillermo, MOVIMIENTO_PERSEGUIR, Abad); print "Tu maestro asiente con la cabeza, indicando al Abad que así hará.^"; Abad.movimiento(); rtrue; 1: self.estado = 2; if (localizacion == AlaSureste) { EscribeAbad("Temo que uno de los monjes ha cometido un crimen. Os ruego que lo encontréis antes de que llegue Bernardo Gui, pues no quisiera que se manche el nombre de esta abadía."); Abad.movimiento(); } rtrue; 2: self.estado = 3; if (localizacion == Patio1) { EscribeAbad("Debéis respetar mis órdenes y las de la abadía. Asistir a los oficios y la comida. De noche debéis estar en vuestra celda."); Abad.movimiento(); } rtrue; 3: if (localizacion == FrenteCeldas) { self.estado = 4; self.precamino = RUTA_ABAD_SU_CELDA; PNJ_Ruta(Abad, MOVIMIENTO_POR_META, CeldaAbad); EscribeAbad("Esta es vuestra celda. Debo irme."); Guillermo.precamino = RUTA_NINGUNA; PNJ_Ruta(Guillermo, MOVIMIENTO_NINGUNO); if (self.obsequium < 10) { print "^Y concluye, observándote atentamente y con expresión severa...:^"; EscribeAbad("Y en cuanto a tí, joven amanuense, no vuelvas a llegar tarde, pues como máximo responsable de esta abadía debes obedecerme sin demora."); } Abad.movimiento(); indirect(Guillermo.cada_turno); self.estado = 5; rtrue; } } ], has animado; ! --------------------------------------------------- ! ! EL RESTO DEL CODIGO ! ! --------------------------------------------------- [ NombreDia; switch (Tiempo.dia) { 1: return "Primer"; 2: return "Segundo"; 3: return "Tercer"; 4: return "Cuarto"; 5: return "Quinto"; 6: return "Sexto"; 7: return "Séptimo"; default: return "*** ERROR ***"; } ]; [ NombreHora; switch (Tiempo.hora) { HORA_NONA: return "NONA"; HORA_VISPERAS: return "VISPERAS"; default: return "*** HORA DESCONOCIDA ***"; } ]; [ RutinaPostJuego; if (Abad.obsequium <= 1) banderafin = 1; rfalse; ]; [ EscribeAbad msg; style bold; print "^ABAD: ~", (string) msg, "~^"; style roman; ]; [ EscribeGuillermo msg; style bold; print "^GUILLERMO: ~", (string) msg, "~^"; style roman; ]; Include "Gramatica"; Include "Teletipo"; Object tt_inicial class Teletipo with descripcion "^Ya al final de mi vida de pecador, mientras, canoso y decrépito como el mundo, espero el momento de perderme en el abismo sin fondo de la divinidad desierta y silenciosa, participando de la luz inefable de las inteligencias angélicas, en esta celda del querido monasterio de Melk, donde aún me retiene mi cuerpo pesado y enfermo, me dispongo a dejar constancia sobre este pergamino de los hechos asombrosos y terribles que me fue dado presenciar en mi juventud, repitiendo verbatim cuanto vi y oí, y sin aventurar interpretación alguna, para dejar, en cierto modo, a los que vengan después (si es que antes no llega el Anticristo) signos de signos, sobre los que pueda ejercerse la plegaria del desciframiento[...].^"; [ Portada; BorrarPantalla(); print "^^^^^^^^^^"; box "" "" " -- Adso de Melk --" " por Ricardo Pérez López" "" "(c) 2.001 Alpha Aventuras" "" ""; EsperarTecla(0, 100); tt_inicial.proyeccion(); EsperarTecla(); BorrarPantalla(); box "Primer día" "" " NONA"; EsperarTecla(0, 50); BorrarPantalla(); ]; [ Inicializar; IniciarPuertas(); Portada(); modomirar = 2; localizacion = Vereda; move Guillermo to localizacion; PNJ_Ruta(Guillermo, MOVIMIENTO_PERSEGUIR, jugador); PNJ_Ruta(Abad, MOVIMIENTO_NINGUNO); IniciarMoviles(); print "^^^"; ! parser_trace = 2; ]; [ LlamarSub; "¿A dónde o a quién quieres llamar?"; ]; [ MejorDecirloAsiSub; "[ Para hablar con alguien, usa la forma: ~Alguien, algo~ o bien ~Pregunta a alguien sobre algo~. ]"; ]; Verb 'llama' * -> Llamar * 'a//' 'puerta' -> Llamar * 'puerta' -> Llamar * 'a//' 'la' 'puerta' -> Llamar; ! Evita las opciones "di...", "responde..." y "habla..." al conversar ! con criaturas Extend "responde" replace * topic -> MejorDecirloAsi; Extend "habla" replace * topic -> MejorDecirloAsi;