!% -~S~D !% +language_name=Spanish !!============================================================================== !! !! HOMO HOMINI ORCUS !! !!============================================================================== !! !! !! File: hhorcus.inf !! Author(s): J. Francisco Martín (jfm.lisaso@gmail.com) !! Language: ES (Castellano) !! System: Inform/INFSP 6 !! Platform: Z-Machine / Glulx !! Release: 2.5 !! Released: 2010/08/18 !! Notes: !! (2009/11/25) - Inicio del desarrollo !! (2009/12/31) - Primera revisión de la aventura !! (2010/01/06) - Redefinición del comando MIRAR !! (2010/01/07) - Elementos multimedia !! (2010/01/08) - Segunda revisión de la aventura !! (2010/01/14) - Correcciones de Eliuk Blau !! (2010/04/22) - Inclusión de 'mistype.h', de C Knight !! !! !!------------------------------------------------------------------------------ !! !! !! MODIFICACIONES A LA LIBRERÍA: !! !! [SpanishG.h - ParseNoun] Si se define un objeto con el valor "caja" en su !! campo 'name' y los valores "madera" y "caoba" en el campo 'adjectives', !! ParseNoun acepta las cadenas "caja", "caja de madera", "caja de madera de !! caoba", "madera", "caoba",... para referirse al objeto. Con la modificación !! se altera el comportamiento de ParseNoun para que las cadenas "madera" y !! "caoba" no sean cadenas válidas, de manera que sea precisa la existencia de !! al menos una coincidencia con los valores del campo 'name' del objeto. !! !! !!------------------------------------------------------------------------------ !! !! !! HOMO HOMINI ORCUS !! Copyright (c) 2009, 2010, J. Francisco Martín !! !! Este programa es software libre: usted puede redistribuirlo y/o !! modificarlo bajo los términos de la Licencia Pública General GNU !! publicada por la Fundación para el Software Libre, ya sea la versión !! 3 de la Licencia, o (a su elección) cualquier versión posterior. !! !! Este programa se distribuye con la esperanza de que sea útil, pero !! SIN GARANTÍA ALGUNA; ni siquiera la garantía implícita MERCANTIL o !! de APTITUD PARA UN PROPÓSITO DETERMINADO. Consulte los detalles de !! la Licencia Pública General GNU para más información. !! !! Debería haber recibido una copia de la Licencia Pública General GNU !! junto a este programa. En caso contrario, consulte !! . !! !! !!------------------------------------------------------------------------------ !!============================================================================== !! Constantes y variables globales del relato !!------------------------------------------------------------------------------ Constant Story "HOMO HOMINI ORCUS"; Constant Headline "Un encuentro interactivo por J. Francisco Martín, (c) 2010"; !Release 1; Serial "091231"; ! Primera revisión (Máquina-Z) !Release 2; Serial "100108"; ! Segunda revisión (Máquina-Z/GLULX) Constant Checking 2; Release 5; !Serial "100114"; Global life_points; ! Guarda los puntos de vida del personaje Global attack_focus; ! Detecta el lugar al que va dirigido un ataque Constant MANUAL_PRONOUNS; ! Los pronoms. refieren a objetos ya mencionados Constant NO_PLACES; ! Acciones LUGARES y OBJETOS desactivadas Constant NO_SCORE; ! No se lleva conteo de puntuación Constant STPARSER_STYLE _STR_; ! Selecciona formato de los mensajes del parser Constant STPARSER_MSG1 "[ "; ! Define texto inicial de mensajes del parser Constant STPARSER_MSG2 " ]"; ! Define texto final de mensajes del parser Constant MISTYPE_MSG1 "[> "; ! Define texto inicial de mensajes del corrector Constant MISTYPE_MSG2 " ]^"; ! Define texto final de mensajes del corrector Constant QUICKCHECK; ! "mistype.h": corrección rápida Constant NAMEABLES; ! Permite rutinas generales de parsing en objs. #Ifdef TARGET_GLULX; Constant SGW_CON_DAMUSIX; Constant SGW_SIN_MARCO_DE_TRABAJO; Constant SCBACK = $FFFFFF; ! estilo fondo Constant SCTEXT = $000000; ! estilo texto Constant SCEMPH = $000000; ! estilo enfasis Constant SCHEAD = $000000; ! estilo cabecera (nombre localidades) Constant SCINPU = $990000; ! estilo input del jugador Constant LIBACK = $FFFFFF; ! estilo fondo linea de estado Constant LITEXT = $990000; ! estilo texto linea de estado 909090 Constant SCUSR1 = $600000; ! estilo configurable User1 Constant SCUSR2 = $004000; ! estilo configurable User2 #Endif; ! TARGET_GLULX !!============================================================================== !! Librerías !!------------------------------------------------------------------------------ Replace Banner; ! Información básica sobre el relato, castellano Replace DrawStatusLine; ! Imprime la línea de estado Replace KeyboardPrimitive; ! Requerido por "mistype.h" Replace LMode1Sub; ! Lookmode 1: Breve Replace LMode2Sub; ! Lookmode 2: Largo (predeterminado) Replace LMode3Sub; ! Lookmode 3: Superbreve Replace LookSub; ! Redefinición del comando mirar Replace VersionSub; ! Información general sobre el relato, castellano Include "Parser"; ! Decodifica la entrada de teclado Include ">mistype.h"; ! Corrección automática de errores ortográficos #Ifdef TARGET_GLULX; !Include "./da_gwin/gwincls.h"; ! GWindows base classes Include ">damusix.h"; ! Administrador unificado de sonido en Glulx #Endif; !!------------------------------------------------------------------------------ !! Información básica sobre el relato, en castellano !!------------------------------------------------------------------------------ [ Banner i; #Ifdef TARGET_ZCODE; !! style bold; !! #Ifnot; !! NEGRITA glk($0086, 3); !! #Endif; !! if (Story ~= 0 ) print (string) story; #Ifdef DEBUG; print " [BETA]"; #Endif; #Ifdef TARGET_ZCODE; !! font on; style roman; !! #Ifnot; !! NORMAL glk($0086, 0); !! #Endif; !! new_line; print (string) Headline; new_line; #Ifdef TARGET_ZCODE; print "Versión ", Checking ,"."; print (HDR_GAMERELEASE-->0) & $03ff; print " / Núm. de serie "; for (i=0 : i<6 : i++) print (char) HDR_GAMESERIAL->i; !!in!! #Ifnot; ! TARGET_GLULX; print "Versión ", Checking ,"."; @aloads ROM_GAMERELEASE 0 i; print i; print " / Núm. de serie "; for (i=0 : i<6 : i++) print (char) ROM_GAMESERIAL->i; !!in!! #Endif; ! TARGET_ print " / Creado con Inform "; inversion; new_line; ]; !!------------------------------------------------------------------------------ !! Dibuja una barra de estado con el nombre de la localidad centrado en pantalla !!------------------------------------------------------------------------------ !! Buffer temporal para calcular el largo de un texto #Ifdef VN_1630; ! compilador 6.30 o superior Array _AlmacenDeTexto_ buffer 160; ! 150 y algo caracteres deberían bastar #Ifnot; ! compiladores más viejos Array _AlmacenDeTexto_ -> 160 + WORDSIZE; #Endif; !VN_1630 !! La siguiente función sirve tanto para imprimir el nombre de la localidad !! como para redirigir su salida a PrintToBuffer() para contar caracteres [ PrintLocationName; if (location == thedark) print (name) location; else { FindVisibilityLevels(); if (visibility_ceiling == location) print (name) location; else print (The) visibility_ceiling; } ]; [ DrawStatusLine width pos; #Ifdef TARGET_GLULX; ! If we have no status window, we must not try to redraw it. if (gg_statuswin == 0) return; #Endif; ! TARGET_GLULX ! If there is no player location, we should not try either. if (location == nothing || parent(player) == nothing) return; StatusLineHeight(gg_statuswin_size); MoveCursor(1, 1); width = ScreenWidth(); spaces width; ! Primero calculamos la posición inicial para imprimir centrado. ! IMPORTANTE: si se cambia el nombre o el tamaño del buffer de texto ! temporal, se deben cambiar también los dos primeros argumentos de ! PrintToBuffer() abajo. pos = (width - PrintToBuffer(_AlmacenDeTexto_, 160, PrintLocationName)) / 2; MoveCursor(1, pos); ! se mueve el cursor a la posición calculada PrintLocationName(); ! se imprime el nombre de la localidad MainWindow(); ]; !!------------------------------------------------------------------------------ !! Redefinición de los 'lookmode': Breve, Largo y Superbreve !!------------------------------------------------------------------------------ [ LMode1Sub; lookmode = 1; L__M( ##LMode1 ); ]; ! Breve [ LMode2Sub; lookmode = 2; L__M( ##LMode2 ); ]; ! Largo (normal) [ LMode3Sub; lookmode = 3; L__M( ##LMode3 ); ]; ! Superbreve !!------------------------------------------------------------------------------ !! Redefinición del comando MIRAR !!------------------- [ LookSub allow_abbrev visibility_levels i j k nl_flag; if (parent(player) == 0) return RunTimeError(10); .MovedByInitial; if (location == thedark) { visibility_ceiling = thedark; NoteArrival(); } else { visibility_levels = FindVisibilityLevels(); if (visibility_ceiling == location) { NoteArrival(); if (visibility_ceiling ~= location) jump MovedByInitial; } } ! The room description (if visible) if (lookmode < 3 && visibility_ceiling == location) { if ((allow_abbrev ~= 1) || (lookmode == 2) || (location hasnt visited)) { if (location.&describe ~= 0) RunRoutines(location, describe); else { if (location.description == 0) RunTimeError(11, location); else PrintOrRun(location, description); } } } if (visibility_ceiling == location) nl_flag = 1; if (visibility_levels == 0) Locale(thedark); else { for (i=player,j=visibility_levels : j>0: j--,i=parent(i)) give i workflag; for (j=visibility_levels : j>0 : j--) { for (i=player,k=0 : k 0) { print "Estándar del intérprete ", standard_interpreter/256, ".", standard_interpreter%256 ," (", HDR_TERPNUMBER->0; #Iftrue (#version_number == 6); print (char) '.', HDR_TERPVERSION->0; #Ifnot; print (char) HDR_TERPVERSION->0; #Endif; print ")"; } else { print "Intérprete ", HDR_TERPNUMBER->0, " Versión "; #Iftrue (#version_number == 6); print HDR_TERPVERSION->0; #Ifnot; print (char) HDR_TERPVERSION->0; #Endif; print " / "; } #Ifnot; ! TARGET_GLULX; @gestalt 1 0 ix; print "Versión del intérprete ", ix / $10000, ".", (ix & $FF00) / $100, ".", ix & $FF, " / "; @gestalt 0 0 ix; print "VM ", ix / $10000, ".", (ix & $FF00) / $100, ".", ix & $FF; #Endif; ! TARGET_; new_line; #Ifdef TARGET_GLULX; print "Correcciones y librería SGW+DMX 2.3 por Eliuk Blau^"; new_line; print "Música: ~Thème de combat~, de Julien PETITJEAN [NOTA 2]^", (stcursiva) " http://creativecommons.org/licenses/by-nc-sa/2.0/fr/^"; print "Dibujos de J. Francisco Martín^", (stcursiva) " http://creativecommons.org/licenses/by-nc-sa/3.0/es/^"; #Endif; ]; !!------------------------------------------------------------------------------ !! Mensajes de la librería (sacados de 'Spanish.h') !!------------------------------------------------------------------------------ Object LibraryMessages with before [; Answer, Ask, AskFor, Order, Tell: print_ret (stparser) "Para iniciar una conversación, usa simplemente la orden HABLA (a) PERSONAJE."; CommandsOff: switch (lm_n) { ![6/11] 1: print_ret (stparser) "Grabación de órdenes finalizada."; #Ifdef TARGET_GLULX; 2: print_ret (stparser) "Grabación de órdenes ya estaba finalizada."; #Endif; ! TARGET_ } CommandsOn: switch (lm_n) { ! [6/11] 1: print_ret (stparser) "Grabación de órdenes activada."; #Ifdef TARGET_GLULX; 2: print_ret (stparser) "Órdenes relanzadas."; 3: print_ret (stparser) "Grabación de órdenes ya activada."; 4: print_ret (stparser) "Fallo en la grabación de órdenes."; #Endif; ! TARGET_ } CommandsRead: switch (lm_n) { ! [6/11] 1: print_ret (stparser) "Relanzando acciones."; #Ifdef TARGET_GLULX; 2: print_ret (stparser) "Las órdenes ya están siendo relanzadas."; 3: print_ret (stparser) "Fallo en la reejecución de órdenes: grabación en curso."; 4: print_ret (stparser) "Fallo en la reejecución de órdenes."; 5: print_ret (stparser) "Acciones ejecutadas: fin del proceso."; #Endif; ! TARGET_ } LMode1: !! Además se ha reescrito también la rutina LMode1Sub de la lib. print_ret (stparser) "El relato está ahora en su modo ~breve~, que da sólo descripciones largas de los lugares la primera vez que son visitados, y se limita a imprimir el nombre de la localidad en otro caso."; LMode2: !! Además se ha reescrito también la rutina LMode2Sub de la lib. print_ret (stparser) "El relato está ahora en su modo normal ~largo~, que siempre da descripciones largas de los lugares (incluso si ya habías estado antes)."; LMode3: !! Además se ha reescrito también la rutina LMode3Sub de la lib. print_ret (stparser) "El relato está ahora en su modo ~superbreve~, se sólo imprime el nombre de las localidades (incluso si nunca habías estado antes)."; Look: !! La acción Look se genera cuando el jugador pone MIRAR, pero !! también de forma automática al entrar en una localidad !! nueva, o cuando el player sale o se baja de un objeto en el !! que estaba. switch( lm_n ) { 1: !! Aclaración a añadir tras el título si el jugador !! está subido (o sentado) en un objeto print ","; if (lm_o has chair) print " sentado en ", (the) lm_o; else print " sobre ", (the) lm_o; return true; 2: !! Aclaración a añadir tras el título si el jugador !! está dentro de un objeto print ", en ", (the) lm_o; return true; 3: !! Aclaración a añadir tras el título si el jugador ha !! sido transformado en otro personaje, mediante una !! llamada a ChangePlayer(nuevo, 1); (sin el 1, la !! librería no intentará mostrar este mensaje) print " (como ", (object) lm_o , ")"; return true; 4: !! Una vez la libraría ha mostrado la descripción de la !! localidad, si el player estaba encima de un !! "supporter", la librería generará este mensaje 4 !! para mostrar qué más cosas hay sobre el "supporter" return false; 5, !! Son usados por la librería para listar los objetos 6: !! "simples" que hay en la localidad. Son objetos !! "simples" los que no dan su propia auto-descripción !! a través de la propiedad "describe" o "initial". new_line; if (lm_o~=location) { if (lm_o has supporter) print "Sobre "; else print "En "; print (the) lm_o; print " puedes ver "; } else print "Puedes ver "; if ( lm_n == 5 ) print "también "; WriteListFrom( child(lm_o), ENGLISH_BIT + WORKFLAG_BIT + RECURSE_BIT + PARTINV_BIT + TERSE_BIT + CONCEAL_BIT ); if ( lm_o ~= location ) "."; "."; 7, !! Respuesta estándar a MirarHacia [6/11] 8: !! El jugador está en un objeto [6/11N 4U65] return false; } NotifyOff: print_ret (stparser) "Notificación de puntuación desactivada."; Prompt: new_line; print (stcursiva) "> "; return true; Quit: switch (lm_n) { 1: print (stparser) "Por favor, responde sí o no.", " "; 2: print (stparser) "¿Realmente quieres abandonar el relato?", " "; } return true; Restart: switch (lm_n) { 1: print (stparser) "¿Realmente quieres reiniciar el relato?", " "; 2: print (stparser) "Error al reiniciar.^"; } return true; Restore: switch (lm_n) { 1: print_ret (stparser) "Error. No se pudo recuperar la partida."; 2: print (stparser) "Partida cargada."; new_line; <>; } Save: switch (lm_n) { 1: print_ret (stparser) "Error. No se pudo guardar la partida."; 2: print_ret (stparser) "Partida guardada."; } Score: if (lm_n==2) print_ret (stparser) "Este relato no tiene conteo de puntuación."; ScriptOff: switch ( lm_n ) { 1: print_ret (stparser) "La transcripción ya estaba desactivada."; 2: new_line; print_ret (stparser) "Fin de la transcripción."; 3: print_ret (stparser) "Intento fallido de finalización de transcripción."; } ScriptOn: switch ( lm_n ) { 1: print_ret (stparser) "La transcripción ya estaba activada."; 2: print_ret (stparser) "Iniciando la transcripción de:"; 3: print_ret (stparser) "Intento fallido al comienzo de la transcripción."; } Take: switch ( lm_n ) { 12: "Ya tienes las manos ocupadas con demasiadas cosas."; 13: print "Primero metes ", (the) lm_o ," en uno de los bolsillos de la chaqueta para hacer sitio. "; rtrue; default: return false; } Verify: switch ( lm_n ) { 1: print_ret (stparser) "Fichero de juego verificado e intacto."; 2: print_ret (stparser) "El fichero de juego no parece intacto, puede estar corrompido (a menos que estés jugando con un intérprete muy primitivo que no sea capaz de realizar la comprobación)."; } Yes: "Es bueno ser positivo."; Miscellany: switch( lm_n ) { 1: ! El jugador ha especificado objetos múltiples, pero el ! parer tiene una lista que no admite más de 16 print (stparser) "Sólo se consideran los dieciséis primeros objetos."; new_line; return true; 2: ! El jugador ha usado objetos múltiples, pero por alguna ! razón la lista del parser está vacía print_ret (stparser) "No se sabe a qué objetos te refieres."; 6: ! Error si el intérprete no tiene "undo". print_ret (stparser) "Tu intérprete no puede ~deshacer~ acciones."; 7: ! Otro error ocasionado ante una acción "undo" print_ret (stparser) "No puedes ~deshacer~ más."; 10: ! Se introduce una línea en blanco ; InformLibrary.end_turn_sequence(); return true; 11: ! Si el jugador intenta "undo" al principio del juego print_ret (stparser) "No se puede ~deshacer~ lo que no has hecho."; 12: ! Si el jugador intenta "undo" dos veces seguidas print_ret (stparser) "No se pueden ~deshacer~ dos acciones seguidas."; 13: ! Éxito en el "undo" print_ret (stparser) "Retrocediendo al turno anterior."; 14: ! Error al usar el comando EEPA print_ret (stparser) "Eso no puede corregirse."; 16: ! Si el jugador pone EEPA seguido de dos o más palabras print_ret (stparser) "~Eepa~ sólo puede corregir una palabra."; 19: ! El PJ se examina a si mismo <>; 20: ! Cuando el jugador pone PNJ, REPITE para que el PNJ ! haga otra vez la última acción print_ret (stparser) "Para repetir un comando como ~rana, salta~, escribe ~repite~ en lugar de ~rana, repite~."; 21: ! El jugador pone REPITE como primer comando del juego print_ret (stparser) "No hay comando que repetir."; 22: ! El jugador ha comenzado la frase con una coma print_ret (stparser) "No se puede empezar la frase con una coma."; 23: ! El jugador intenta hablar con alguien no presente print_ret (stparser) "Parece que quieres hablar con alguien, pero no se puede ver con quién."; 25: ! Hay palabras no comprendidas entre el nombre de un ! PNJ y la coma, ej: PEPE ZAFDSRGG, SALTA print_ret (stparser) "Para iniciar una conversación, usa simplemente la orden HABLA (a) PERSONAJE."; } ]; !!------------------------------------------------------------------------------ !! Errores del analizador !!------------------------------------------------------------------------------ [ ParserError pe; st_parser(); if ( STPARSER_MSG1 ~= 0 ) print (string) STPARSER_MSG1; switch( pe ) { STUCK_PE: print "No se pudo entender esa frase."; UPTO_PE: print "Intenta de nuevo porque sólo se pudo entender "; PrintCommand(); print "."; NUMBER_PE: print "No se entendió ese número."; CANTSEE_PE: print "Te has referido a algo con lo que no se puede interactuar en este momento."; TOOLIT_PE: print "Parece que has indicado demasiada poca cosa."; NOTHELD_PE: print "No tienes eso en tu poder."; MULTI_PE: print "No puedes especificar objetos múltiples con '", (address) verb_word ,"'."; MMULTI_PE: print "Sólo puedes especificar objetos múltiples una vez por cada línea."; VAGUE_PE: print "No está claro a qué te refieres con '", (address) pronoun_word ,"'."; EXCEPT_PE: print "Has exceptuado algo que no estaba incluído."; ANIMA_PE: print "Sólo puedes hacer eso con personas u otras criaturas vivas."; VERB_PE: print "La acción que has introducido no está definida."; SCENERY_PE: print "No necesitas referirte a eso para terminar la historia."; ITGONE_PE: print "Ahora mismo no puedes ver lo que representa el pronombre '", (address) pronoun_word ,"' (", (the) pronoun_obj ,")."; JUNKAFTER_PE: print "No se pudo entender la última parte de la orden."; TOOFEW_PE: ! El jugador ha solicitado un número de objetos en una lista ! de objeto múltiples, pero el analizador no es capaz de ! encontrar tantos. (E.j. COGE DOCE CERILLAS ) if (multi_had == 0) print "No hay suficientes disponibles."; else { print "Sólo hay ", (number) multi_had ," disponible"; if ( multi_had ~= 1 ) print "s"; print "."; } NOTHING_PE: ! El jugador ha puesto TODO como objeto múltiple, pero el ! analizador no ha encontrado ningún objeto. En realidad ! este error parece no producirse nunca y en realidad el que ! acaba generándose es el siguiente (ASKSCOPE_PE). print "No hay nada de eso disponible."; default: print "No se pudo entender esa frase."; } if ( STPARSER_MSG2 ~= 0 ) print (string) STPARSER_MSG2; st_normal(); new_line; return true; ]; Constant AutoDeactivate; ! See Gtalk.h comments, Note #1 Include "Verblib"; ! Define cómo trabajan las acciones Include ">st_texto.h"; ! Rutinas para modificar el formato de texto Include ">gtalk.h"; ! Conversación con NPCs por medio de menú #Ifdef TARGET_GLULX; Include ">sgw+dmx.h"; ! Extensión SGW+DMX Include ">hhorcus.bli"; ! Recursos multimedia de la aventura #Endif; ! TARGET_GLULX; !!============================================================================== !! Definición de atributos y clases !!------------------------------------------------------------------------------ !Attribute injured; !Attribute introduced; Class Room with description "EN CONSTRUCCIÓN.", next_direction 0, next_room 0, previous_direction 0, previous_room 0, before [; Go: if (noun == 0) return false; if (noun == u_obj or d_obj or in_obj or out_obj) "No puedes ir por ahí."; if (noun == self.previous_direction) { PlayerTo(self.previous_room()); return true; } if (noun == self.next_direction) { PlayerTo(self.next_room()); return true; } if (self.next_direction == 0) { self.next_direction = noun; PlayerTo(self.next_room()); switch (noun) { n_obj: self.next_room().previous_direction = s_obj; s_obj: self.next_room().previous_direction = n_obj; e_obj: self.next_room().previous_direction = w_obj; w_obj: self.next_room().previous_direction = e_obj; ne_obj: self.next_room().previous_direction = sw_obj; nw_obj: self.next_room().previous_direction = se_obj; se_obj: self.next_room().previous_direction = nw_obj; sw_obj: self.next_room().previous_direction = ne_obj; } return true; } ], cant_go [; print "Una pared casi sólida de troncos, hojas y matorrales te corta el camino en esa dirección"; if (self.previous_direction == 0 && self.next_direction == 0) "."; print ". En cambio, puedes ver un paso abierto al"; if (self.previous_direction ~= 0) { switch (self.previous_direction) { n_obj: print " norte"; s_obj: print " sur"; e_obj: print " este"; w_obj: print " oeste"; ne_obj: print " noreste"; nw_obj: print " noroeste"; se_obj: print " sureste"; sw_obj: print " suroeste"; } } if (self.previous_direction ~= 0 && self.next_direction == 0) "."; if (self.previous_direction ~= 0) print " y otro al"; switch (self.next_direction) { n_obj: " norte."; s_obj: " sur."; e_obj: " este."; w_obj: " oeste."; ne_obj: " noreste."; nw_obj: " noroeste."; se_obj: " sureste."; sw_obj: " suroeste."; }], has light; Class Item with description [; "Tiene", (n) self ," el mismo aspecto que cualquier otr", (o) self , " ", (name) self ," que hayas visto antes."; ]; Class Atrezzo has static concealed; Class Chair class Atrezzo; Class NPC class Character ! definida en la librería 'gtalk' with life [; Answer, Ask, AskFor, Order, Tell: print_ret (stparser) "Para iniciar una conversación, usa simplemente la orden HABLA (a) PERSONA."; ], injured false, introduced false, has animate; Class Orc class NPC with before [; TalkTo: switch(random(5)) { 1: print (stcursiva) "---Bestia asquerosa..."; 2: print (stcursiva) "---Mi padre siempre decía: ~Los orcos son tan feos y tienen tan mal genio como los jabalíes, pero sólo son la mitad de inteligentes.~"; 3: print (stcursiva) "---Mierda de orcos."; 4: print (stcursiva) "---Bonita sonrisa, monstruo. Igualita a la de ese cerdo."; 5: print (stcursiva) "---Me gustaría ver la cara de la cochina troll que te parió, bestia asquerosa."; } new_line; return true; ]; Class Corpse with before [; Attack: "Ya está", (n) self ," muert", (o) self ,". Ahora es inútil emplear la violencia con ", (the) self ,"."; TalkTo: "Me temo que ", (the) self ," ya no te va a poder contar nada."; ], has static concealed; !!============================================================================== !! Definición de objetos !!------------------------------------------------------------------------------ !!------------------------------------------------------------------------------ Room LIMBO "En el limbo" with description [; print "Más allá de la barrera casi insuperable que separa la realidad de todo lo demás. Un lugar etéreo, donde la vida, la materia y la vitalidad no son necesariamente constantes; un lugar donde el tiempo y el espacio no existen tal y como los capta nuestro ser despierto...^"; if (self hasnt visited) "^Bienvenido al mundo del sueño, betatester."; ]; Item ropa "ropajes" LIMBO with name 'ropajes' 'ropa' 'jubon' 'calzas' 'botas' 'capa', adjectives 'tu' 'tus' 'tuya' 'tuyo' 'tuyas' 'tuyos' 'cuero' 'lana' 'desgastados' 'desgastadas' 'desgastado' 'desgastada', article "tus", description "Es la ropa sencilla de cualquier hombre de la zona: jubón, calzas y botas de cuero; y una gruesa capa de viaje algo desgastada y ajada por el uso.", has pluralname clothing; Item cuchillo "cuchillo" LIMBO with name 'cuchillo' 'hoja' 'punal' 'mango', adjectives 'negro' 'negra' 'largo' 'larga' 'hueso' 'afilado' 'afilada' 'acero' 'brillante', description "Es un cuchillo con mango de hueso negro y hoja, de unos veinte centímetros de largo, brillante y afilada.", before [; Drop, Give, Insert, PutOn, Remove, Transfer, ThrowAt: "Ese cuchillo es lo único que tienes para defenderte, y hay demasiados peligros en el bosque como para que vayas por ahí desarmado."; ]; !!------------------------------------------------------------------------------ Room BOSQUE1 "Atravesando el bosque" with description [; print "Estás en una de las zonas más profundas y frondosas del bosque. A tu alrededor se aprietan los troncos grisáceos de robles, cagigas, castaños y encinas; algunos derechos, otros inclinados, grandes o pequeños, gruesos o finos, retorcidos, encorvados, lisos o nudosos. Todos ellos están invadidos por un manto espeso de musgo y de viscosas e hirsutas excrecencias que los tintan parcialmente con salpicaduras de verde."; if (self hasnt visited) " El denso tejido de hojas sobre tu cabeza te impide ver el cielo, pero la creciente claridad anuncia el despertar del día."; new_line; ], before [; Listen: if (noun == 0) "No se oye nada, excepto el leve susurro del viento en las hojas de los árboles."; ], next_room [; return BOSQUE2; ]; Atrezzo "cielo" with found_in BOSQUE1 BOSQUE2 BOSQUE3 MATORRALES CLARO BOSQUE4, name 'cielo' 'sol' 'disco', adjectives 'azul' 'mañana' 'brillante' 'claro' 'nitido' 'solar' 'amarillento' 'anaranjado' 'matutino' 'despejado', description [; if (real_location == BOSQUE1 or BOSQUE2 or BOSQUE3 or BOSQUE4) "Las copas de los árboles se cierran sobre tu cabeza en una espesa cúpula de ramas y hojas que te impide ver el cielo."; if (real_location == MATORRALES) "Entre las copas de los árboles se atisban brillantes porciones del cielo azul."; ! El cielo en el claro "Allá arriba el cielo brilla azul y despejado. Se comienza a entrever el sol hacia el este, sobre las copas de los árboles que crecen en las lindes del claro."; ], react_before [; Examine, Search: if (noun == u_obj) <>; ]; Atrezzo "follaje" with found_in BOSQUE1 BOSQUE2 BOSQUE3 MATORRALES BOSQUE4, name 'hojas' 'hoja' 'raices' 'ramas' 'rama' 'rocas' 'roca' 'piedras' 'piedra' 'piedritas' 'piedrucas' 'musgo' 'excrecencias' 'follaje', adjectives 'caidas' 'caida' 'viscosas' 'hirsutas' 'manto' 'capa' 'espeso' 'espesa' 'denso' 'densa' 'pequenas' 'rotas' 'retorcidas', description "El suelo está cubierto de ramas rotas, musgo, pequeñas piedras, raíces retorcidas y una gran capa de hojas caídas.", before [; Examine: return false; default: "No necesitas preocuparte por eso."; ]; Atrezzo "matorrales" with found_in BOSQUE1 BOSQUE2 BOSQUE3 MATORRALES BOSQUE4, name 'matorrales' 'matorral' 'arbustos' 'arbusto' 'rastrojos' 'rastrojo' 'zarzales' 'zarzal' 'matojos' 'matojo' 'bardales' 'bardal' 'maleza', adjectives 'frondosos' 'frondoso' 'espesos' 'espeso' 'algunos', description "Hay algunos matorrales creciendo entre los árboles.", before [; Examine: return false; default: "No necesitas preocuparte por eso."; ], has pluralname; Atrezzo arboles "árboles" with found_in BOSQUE1 BOSQUE2 BOSQUE3 MATORRALES BOSQUE4, name 'arboles' 'arbol' 'troncos' 'tronco' 'robles' 'roble' 'cagigas' 'cagiga' 'castanos' 'castano' 'encinas' 'encina' 'laureles' 'laurel' 'copas' 'copa' 'bosque' 'robledal', adjectives 'grisaceos' 'grisaceas' 'grises' 'parduscos' 'parduscas' 'pardusco' 'derechos' 'derechas' 'derecho' 'inclinados' 'inclinadas' 'inclinado' 'grandes' 'grande' 'pequenos' 'pequenas' 'pequeno' 'gruesos' 'finos' 'fino' 'retorcidos' 'retorcidas' 'retorcido' 'encorvados' 'encorvadas' 'encorvado' 'lisos' 'nudosos' 'altos' 'bajos' 'altas' 'bajas', description [; if (parent(self) == BOSQUE2) "Alrededor del agujero putrefacto yacen varios árboles arrancados de raíz. En sus oscuras cortezas han tallado a golpes, con tosquedad y trazos sencillos, unas extrañas runas ilegibles y los contornos siniestros de varias calaveras."; "Robles, cagigas [NOTA 1], castaños, y algunas encinas y laureles; además de otros troncos que desconoces. No observas nada especial en ellos."; ], before [; Climb: "Ya no eres un niño para andar encaramándote a los árboles."; Examine: return false; default: "No necesitas preocuparte por eso."; ], has pluralname; !!------------------------------------------------------------------------------ Room BOSQUE2 "Atravesando el bosque" with description [; print "A medida que te internas en el bosque descubres algunas señales que revelan el paso de La Horda por esta zona: un foso lleno de inmundicias y detritus; árboles arrancados sin razón y abandonados a la muerte, con runas siniestras y toscos dibujos amenazadores tallados a golpes en sus cortezas; y algunos huesos mugrientos esparcidos aquí y allá entre las hojas y raíces del suelo."; if (self hasnt visited) " El viento murmura en las copas de los árboles. No puedes evitar estremecerte inquieto."; new_line; ], before [; Listen: if (noun == 0) "No se oye nada, excepto el leve susurro del viento en las hojas de los árboles."; Smell: if (noun == 0) "Hay en el aire un profundo hedor a putrefacción."; ], previous_room [; return BOSQUE1; ], next_room [; return BOSQUE3; ]; Atrezzo "marcas" BOSQUE2 with name 'marcas' 'marca' 'signos' 'signo' 'runas' 'runa' 'dibujos' 'dibujo' 'calaveras' 'calavera' 'craneos' 'craneo', adjectives 'siniestras' 'siniestros' 'toscas' 'toscos' 'tallados' 'talladas' 'ilegibles' 'ininteligibles', description [; return arboles.description(); ], before [; Examine: return false; default: "No necesitas preocuparte por eso."; ]; Atrezzo "foso lleno de inmundicias" BOSQUE2 with name 'foso' 'agujero' 'hoyo' 'hueco' 'astas' 'madera' 'masa', adjectives 'lleno' 'inmundicias' 'pestilente' 'putrefacto' 'detritus' 'podridos' 'podrido' 'ciervo' 'pedazos' 'oscura' 'informe', description "Es un hoyo poco profundo que alberga una pestilente masa oscura e informe. Entre las inmundicias alcanzas a distinguir algunos huesos, astas de ciervo, pedazos de madera podridos y algunas otras cosas menos agradables. El hedor a putrefacción se hace insoportable.", before [; Examine: return false; Smell: "El hedor a putrefacto que se alza del foso es inaguantable."; default: "No necesitas preocuparte por eso."; ]; Atrezzo "huesos" BOSQUE2 with name 'huesos', adjectives 'tirados' 'esparcidos' 'mugrientos' 'amarillentos', description "Hay algunos huesos tirados entre las hojas y ramas del suelo", before [; Examine: return false; default: "No necesitas preocuparte por eso."; ], has pluralname; !!------------------------------------------------------------------------------ Room BOSQUE3 "Atravesando el bosque" with description "Te abres paso como puedes esquivando árboles y arbustos, raíces, rocas y algunas ramas partidas por el viento que sobresalen del suelo irregular. A pesar del paso torpe y descuidado, un tapiz de oscuras hojas caídas logra ensordecer en gran medida el ruido de tus pisadas a través del bosque.", before [; Go: if (noun == 0) return false; if (noun == u_obj or d_obj or in_obj or out_obj) "No puedes ir por ahí."; if (noun == self.previous_direction) { PlayerTo(self.previous_room()); return true; } if (noun == self.next_direction) { PlayerTo(self.next_room()); return true; } if (self.next_direction == 0) { new_line; print "Conforme avanzas la luz se va haciendo cada vez más clara. Allá arriba, las copas de los árboles dejan entrever ya pequeños retazos de un cielo azul y luminoso, y sus hojas se muestran radiantes bajo el sol intenso de la mañana. Apenas das un par de pasos más, divisas un vasto espacio circular a través de los árboles y la maleza, a unos pocos metros de donde te encuentras. Entonces un sonido hace que te detengas en seco. Se escuchan voces. Con sigilo te ocultas tras unos arbustos en la misma linde del claro y echas un vistazo a lo que ocurre dentro. ^^ Dos personas ---un hombre y una niña de unos diez años que lleva un cerdo amarrado a una cuerda--- están rodeados por otras tres figuras. Son los tres asaltantes quienes te llaman la atención: visten con harapos y rudimentarias armaduras de aspecto andrajoso, tienen los brazos desproporcionadamente largos y musculosos, y la cara desfigurada y cubierta de tatuajes... ", (stnegrita) "orcos", ".^"; self.next_direction = noun; PlayerTo(self.next_room(), 1); switch (noun) { n_obj: self.next_room().previous_direction = s_obj; self.next_room().next_direction = noun; s_obj: self.next_room().previous_direction = n_obj; self.next_room().next_direction = noun; e_obj: self.next_room().previous_direction = w_obj; self.next_room().next_direction = noun; w_obj: self.next_room().previous_direction = e_obj; self.next_room().next_direction = noun; ne_obj: self.next_room().previous_direction = sw_obj; self.next_room().next_direction = noun; nw_obj: self.next_room().previous_direction = se_obj; self.next_room().next_direction = noun; se_obj: self.next_room().previous_direction = nw_obj; self.next_room().next_direction = noun; sw_obj: self.next_room().previous_direction = ne_obj; self.next_room().next_direction = noun; } StartDaemon(MATORRALES_gente); ! Inicia acción en el claro return true; } Listen: if (noun == 0) "No se oye nada, excepto el leve susurro del viento en las hojas de los árboles."; ], previous_room [; return BOSQUE2; ], next_room [; if (CLARO has general) return CLARO; return MATORRALES; ]; !!------------------------------------------------------------------------------ ! Se debería poder salir de entre los matorrales con la orden 'salir' Room MATORRALES "Oculto entre los matorrales" with description "Desde detrás de los arbustos puedes ver el claro frente a ti.", before [; Enter, Exit: <>; Go: if (noun == 0) return false; !! if (noun == u_obj or d_obj or in_obj or out_obj) if (noun == u_obj or d_obj) "No puedes ir por ahí."; if (noun == self.previous_direction) { PlayerTo(self.previous_room()); switch (self.next_direction) { n_obj: self.next_room().previous_direction = s_obj; s_obj: self.next_room().previous_direction = n_obj; e_obj: self.next_room().previous_direction = w_obj; w_obj: self.next_room().previous_direction = e_obj; ne_obj: self.next_room().previous_direction = sw_obj; nw_obj: self.next_room().previous_direction = se_obj; se_obj: self.next_room().previous_direction = nw_obj; sw_obj: self.next_room().previous_direction = ne_obj; } return true; } !! if (noun == self.next_direction) { if (noun == self.next_direction or in_obj or out_obj) { PlayerTo(self.next_room()); switch (noun) { n_obj: self.next_room().previous_direction = s_obj; s_obj: self.next_room().previous_direction = n_obj; e_obj: self.next_room().previous_direction = w_obj; w_obj: self.next_room().previous_direction = e_obj; ne_obj: self.next_room().previous_direction = sw_obj; nw_obj: self.next_room().previous_direction = se_obj; se_obj: self.next_room().previous_direction = nw_obj; sw_obj: self.next_room().previous_direction = ne_obj; } return true; } Listen: if (noun == 0) <>; ], previous_room [; return BOSQUE3; ], next_room [; return CLARO; ]; Object MATORRALES_gente "gente en el claro" MATORRALES with name 'claro' 'calvero' 'gente' 'personas' 'hombre' 'padre' 'mario' 'nina' 'pequena' 'chiquilla' 'orcos' 'orco' 'bestias' 'bestia' 'monstruos' 'monstruo' 'lazbuk' 'bubhosh' 'grishgul' 'hombres', adjectives 'asustada' 'grande' 'alto' 'fuerte' 'corpulento' 'fornido' 'lider' 'bajo' 'nervudo' 'enjuto' 'enclenque' 'mutilado' 'deformado' 'grande' 'pequeno' 'mas' 'menos', before [; Examine: self.daemon(); self.silence = true; return true; Listen: self.daemon(); self.silence = true; return true; default: "Sal de entre los matorrales antes."; ], contador 0, silence false, daemon [; if (self.silence) { self.silence = false; return true; } if (real_location == BOSQUE3 && self.contador <= 5) { StopDaemon(self); Mario.dies(); Bubhosh.dies(); Sara.injured = true; move Lazbuk to LIMBO; move Grishgul to LIMBO; move espada to LIMBO; move cerdo to LIMBO; give CLARO general; "^Escuchas unos gritos a lo lejos, entre los árboles. Después de unos momentos vuelve a hacerse el silencio..."; } if (real_location == BOSQUE3 && self.contador > 5) { StopDaemon(self); move Lazbuk to LIMBO; move Grishgul to LIMBO; move espada to LIMBO; move cerdo to LIMBO; give CLARO general; return true; } if (real_location == MATORRALES) { new_line; switch (self.contador) { 0: self.contador ++; "---El cerdo. De nosotros. ---Las palabras suenan espantosas en el acento áspero y ronco de una de las bestias.^ Si está asustado, el hombre no muestra el menor atisbo de temor. ---No. Ese cerdo es nuestro."; 1: self.contador ++; Lazbuk.introduced = true; give Lazbuk proper; "El orco que se dirige al hombre es realmente grande, ligeramente mayor a los otros dos ---te figuras que es él quien está al mando del pequeño grupo---. Agazapado tras la espesura, alcanzas a ver cómo el rostro de la bestia, del color de la arena, adopta un cierto gesto de sorpresa. Parece que la criatura no se esperaba esa actitud en el hombre y se lo queda mirando, clavando sus ojillos amarillos en las facciones resueltas y osadas del otro. Tras unos instantes vuelve a hablar con su voz profunda y hosca: ^^ ---Valientes palabras, humano. Pero yo soy Lazbuk. Soy yo quien dice cómo son las cosas. Ahora, dar el animal y después nosotros dejarros en paz.^ ---No podemos. ---las palabras del hombre siguen escuchándose pausadas y tranquilas---. Es todo cuanto tenemos. Dependemos de ese puerco para sobrevivir al invierno."; 2: self.contador ++; "La bestia desenfunda una cimitarra de larga hoja curvada. ---Ya. Nosotros también necesitamos él para sobrevivir.^ Esta vez el hombre guarda silencio. Sus ojos se mueven nerviosos del sable a los otros dos orcos que lo miran expectantes, ambos armados con rotundas porras de gran tamaño, y alcanzas a apreciar cómo su mano derecha se crispa alrededor de la empuñadura de la espada que lleva atada al cinto."; 3: self.contador ++; Bubhosh.introduced = true; give Bubhosh proper; "Uno de los otros dos orcos, algo más bajo y menos fornido, se revuelve inquieto y grita con una vocecilla estridente y malévola.^ ---¡Sólo son humanos! ¡Es fácil! Matamos y cogemos animal.^ ---¡Bubhosh! ¡Silencio! ---Lazbuk levanta la voz con enfado para acallar a su compañero. Cuando vuelve a dirigirse al hombre, sus palabras se escuchan algo más calmadas, aunque su tono sigue siendo el mismo dominante--- No pido. Ordeno. El cerdo."; 4: self.contador ++; "En ese momento la niña, que hasta ahora había permanecido, asustada, tras las piernas de su padre, da dos pasos decididos y se planta delante del orco Lazbuk con los brazos en jarras. Coge aire un momento antes de soltarle insolente:^ ---El señor Simón no se quiere ir con alguien tan feo como vosotros. ---y termina sacándole la lengua con desaire ante la mirada aterrada de su padre."; 5: self.contador ++; Mario.dies(); Bubhosh.dies(); Sara.injured = true; "Bubosh no puede contenerse y estalla: ---¡Mocosa!... ^^ El enjuto y nervioso orco agarra salvajemente a la pequeña por el pelo y tira de ella hacia atrás, arrancándola un doloroso alarido. Al momento su padre, con el rostro desencajado a partes iguales por el terror y la furia, desenvaina la espada con un movimiento automático y salta hacia adelante, descargando con todas sus fuerzas la hoja de acero sobre el orco. El ataque le alcanza justo en mitad del torso, quebrándole la coraza irregular y arrojando al aire fragmentos de latón y salpicaduras de sangre, negras y espesas. La bestia se desploma de espaldas, completamente inerte. ^^ La reacción de sus compañeros no se hace esperar y llega con la contundencia de quien está habituado y disfruta de tales lances violentos. Con un rápido ademán, Lazbuk hace volar su larga cimitarra directamente sobre la garganta del hombre. A continuación, dibuja un arco, gira la hoja y le cercena el cuello. La sangre mana de la garganta abierta como si de una fuente se tratara. El hombre cae al suelo y muere sin apenas darse cuenta, con la cabeza colgándole del cuerpo por una delgada tira de piel. ^^ La niña se queda petrificada frente al cuerpo sin vida de su padre, con los ojos abiertos de par en par y cuajados de lágrimas. Sin embargo no tiene tiempo para gritar de nuevo o echarse a llorar; el tercer orco le lanza un golpe con su cachiporra que le da en pleno lado de la cabeza. Hasta tus oídos llega el sonido espantoso del impacto. Al instante, sus pequeñas piernas flaquean y la chiquilla se desmorona como una muñeca desmadejada sobre el amplio charco de sangre de su padre."; 6: self.contador ++; Grishgul.introduced = true; give Grishgul proper; "Lazbuk guarda el sable entre sus ropas, empapadas en la roja sangre del hombre, y hace señas a su compañero:^ ---Grishgul, revisa la tienda. Quizá guarden algo más de valor.^ El otro asiente con la cabeza y obedece sin abrir la boca."; 7: self.contador ++; "El orco llamado Grishgul sale de la tienda.^ ---No hay nada.^ ---Entonces coge esa espada y vámonos.^ Grishgul se encamina al arma, tirada junto a los cuerpos caídos de los dos humanos y el de su compañero Bubhosh, pero se detiene al llegar al lado del orco:^ ---Vaya. Parece que Bubhosh aún respira.^ Lazbuk se acerca y agarra una cahiporra. Ves que permanece inmóvil durante un rato, como si estuviese estudiando detenidamente el tosco arma que tiene entre sus manos. Un momento después descarga, rápido y brutal, la gruesa estaca sobre la cabeza de Bubhosh, destrozándole completamente el cráneo contra el suelo.^ ---Ya está. Vamos."; 8: self.contador ++; move Lazbuk to LIMBO; move Grishgul to LIMBO; move espada to LIMBO; move cerdo to LIMBO; "Los dos orcos abandonan el claro por un extremo, llevándose consigo el cerdo y la espada del hombre tendido en el suelo. En pocos segundos, sus figuras se pierden entre los árboles y la maleza."; 9: StopDaemon(self); print "El claro ha quedado vacío, a excepción de los tres cuerpos inertes y la tienda. Decides salir de tu escondite y entrar en la pequeña extensión de pastos...^"; wait(); new_line; PlayerTo(CLARO); return true; } } ! Si el PJ interrumpe la escena, Lazbuk iniciaría conversación con ! él. (A la pregunta quién eres, la respuesta puede dar como lugar ! que le ataquen, que le obliguen a marcharse o seguir hablando. Si ! el PJ sigue hablando, Bubosh termina por echar a correr hacia él ! para atacarlo. Se da un turno al PJ. Si ataca al orco en la ! cabeza, los otros dos huirán. Si no, comienza una pelea con los ! tres. if (real_location == CLARO) { StopDaemon(self); "^", (The) Lazbuk ," acaricia su cimitarra con gesto amenazador.^ ---Uh... larrgo de aquí, humano."; } ], has static concealed; !!------------------------------------------------------------------------------ ! El claro tiene activado el atributo general si ya no quedan enemigos en él. Room CLARO "En el claro" with initial [flag; if (self hasnt visited) { if (Lazbuk in self) { StartDaemon(Lazbuk); flag = true; } if (Bubhosh in self) { StartDaemon(Bubhosh); flag = true; } if (Grishgul in self) { StartDaemon(Grishgul); flag = true; } if (flag) { print "^[NOTA: Al enfrentarte a un enemigo puedes dirigir tu ataque a alguna parte de su cuerpo usando la orden: ", (stespaciada) "> ataca a (enemigo) en (cabeza/cuerpo/brazo...)", "]^"; wait(); new_line; #Ifdef TARGET_GLULX; !! Imprime las imágenes de los orcos del claro if (Bubhosh in self) { if (glk_gestalt(gestalt_DrawImage, wintype_TextBuffer)) glk_image_draw(gg_mainwin, IMG_orcs, imagealign_InlineCenter,0); } else { if (glk_gestalt(gestalt_DrawImage, wintype_TextBuffer)) glk_image_draw(gg_mainwin, IMG_orcs2, imagealign_InlineCenter,0); } !! Reproduce la música de fondo durante la batalla Damusix.Tocar( MUS_theme ); #Endif; } else give self general; }], name 'pastos' 'plantas' 'zarzales' 'zarzal' 'perejil' 'ortigas' 'ortiga' 'cardos' 'cardo', description "Has entrado en un gran terreno circular en mitad del bosque donde apenas crecen árboles; sólo pastos duros y muchas plantas altas: algún zarzal pequeño, perejil silvestre, ortigas y cardos exuberantes. A algunos metros de distancia hay levantada una sencilla tienda de piel, delante de las ascuas apagadas de una pequeña hoguera. Sobre tu cabeza el cielo de la mañana brilla azul.", reload [ enemy i; ! Se cuenta el número de orcos que aún quedan en el claro i = 0; objectloop(enemy ofclass Orc) if (enemy in self) i++; ! Si aún quedan dos o más, la aventura continúa normalmente if (i > 1) return true; ! Si no queda ninguno, se activa la variable 'general' del CLARO if (i == 0) { !! Para la música de fondo #Ifdef TARGET_GLULX; Damusix.FadeOut( MUS_theme, 5000, 0 ); #Endif; give self general; return true; } ! Si sólo queda un orco, y se encuentra herido, trata de rendirse objectloop(enemy ofclass Orc) if (enemy in self && enemy.injured) enemy.select(1); ], previous_room [; if (self hasnt general) { StopDaemon(Lazbuk); StopDaemon(Bubhosh); StopDaemon(Grishgul); return BOSQUE4; } return BOSQUE3; ], next_room [; if (self hasnt general) { StopDaemon(Lazbuk); StopDaemon(Bubhosh); StopDaemon(Grishgul); } return BOSQUE4; ]; Object CLARO_gente "gente en el claro" CLARO with initial [; if (Mario in parent(self) && Sara in parent(self) && ~~Sara.injured) { if (Lazbuk in parent(self) && Bubhosh in parent(self) && Grishgul in parent(self) && self.llegada) { self.llegada = false; "En el centro del claro, tres orcos tienen rodeados a un hombre y una niña pequeña. Los cinco se han quedado quietos en cuanto has entrado, y ahora te miran sorprendidos."; } if (Lazbuk in parent(self) && Bubhosh in parent(self) && Grishgul in parent(self)) { "A unos pocos pasos tienes a tres orcos que te miran con aire amenazador. Adviertes que uno de ellos empuña un largo cuchillo de hoja mellada entre sus garras y los otros dos, sendas cachiporras de aspecto contundente. Tras ellos puedes ver a un hombre y una niña pequeña que parece asustada."; } if (Lazbuk_cuerpo in parent(self) && Bubhosh_cuerpo in parent(self) && Grishgul_cuerpo in parent(self)) { "Las figuras repulsivas de los tres orcos yacen inertes en mitad del calvero, tiradas sobre un amplio charco de sangre negra y espesa. Tras ellos, el hombre y la niña permanecen en pie, con los ojos clavados en cada uno de tus movimientos."; } print "En el centro del calvero se halla"; if (Lazbuk in parent(self)) print " ", (the) Lazbuk; if (Lazbuk_cuerpo in parent(self)) print ", el cuerpo de Lazbuk"; if (Bubhosh in parent(self)) print ", ", (the) Bubhosh; if (Bubhosh_cuerpo in parent(self)) print ", el cuerpo de Búbhosh"; if (Grishgul in parent(self)) print " y ", (the) Grishgul, "."; if (Grishgul_cuerpo in parent(self)) print " y el cuerpo sin vida de Grishgul."; " Tras ellos puedes ver a un hombre y una niña pequeña que parece asustada."; } ! Mario y Sara vivos if (Mario_cuerpo in parent(self) && ((Sara in parent(self) && Sara.injured) || (Sara_cuerpo in parent(self))) ) { if (Lazbuk in parent(self) && Grishgul in parent(self) && Bubhosh_cuerpo in parent(self) && self.llegada) { self.llegada = false; "Cerca de la tienda puedes ver los cuerpos abatidos del hombre y la niña, y el del orco llamado Búbhosh que yace boca arriba con una fea herida sangrante en la cara. Los otros dos orcos se giran sorprendidos al verte llegar."; } if (Lazbuk in parent(self) && Grishgul in parent(self) && Bubhosh_cuerpo in parent(self)) { "Cerca de la tienda puedes ver los cuerpos abatidos del hombre y la niña, y el del orco llamado Búbhosh que yace boca arriba con una fea herida en la cara. Los otros dos orcos te rodean amenazadoramente. Lazbuk, el más alto, haciendo girar su cuchillo negro entre las garras, y ", (the) Grishgul ," esgrimiendo su cachiporra con aspecto fiero y confiado."; } if (Lazbuk in LIMBO && Lazbuk_cuerpo in LIMBO && Grishgul in LIMBO && Grishgul_cuerpo in LIMBO && Bubhosh_cuerpo in parent(self)) { "Cerca de la tienda puedes ver los cuerpos abatidos del hombre y la niña, y el del orco llamado Búbhosh que yace boca arriba con la cabeza completamente destrozada."; } print "En el centro del calvero se halla"; if (Lazbuk in parent(self)) print " ", (the) Lazbuk; if (Lazbuk_cuerpo in parent(self)) print " el cuerpo de Lazbuk"; if (Bubhosh in parent(self)) print ", ", (the) Bubhosh; if (Bubhosh_cuerpo in parent(self)) print ", el cuerpo de Búbhosh"; if (Grishgul in parent(self)) print " y ", (the) Grishgul, "."; if (Grishgul_cuerpo in parent(self)) print " y el cuerpo sin vida de Grishgul."; " Cerca de la tienda puedes ver los cuerpos abatidos del hombre y la niña, que yacen sobre un gran charco de sangre carmesí."; } ! Mario y Sara abatidos ! Tras ellos puedes ver a un hombre arrodillado en el suelo, sosteniendo el ! cuerpo de una niña pequeña entre sus brazos. ! Tras ellos, una niña pequeña llora arrodillada junto al cuerpo sin vida de ! su padre. ], llegada true, react_before [; if (noun == self) { noun = Mario; return Mario.before(); }], has static female; NPC Mario CLARO with short_name [; if (self.introduced) { print "Mario"; return true; } print "hombre"; return true; ], name 'mario' 'hombre' 'padre' 'persona' 'personas', adjectives 'alto' 'delgado' 'fuerte', description "Es alto y delgado. De pelo rizado, abundante barba castaña y ojos verdes e inteligentes, iguales a los de la niña que lo acompaña. Lleva una sencilla blusa marrón, capa, y una espada corta envainada en la funda del cinturón. Por su porte ---o tal vez sea por la expresión de su cara--- adivinas cierto aire orgulloso.", conversacion_finalizada false, conversacion_pj_proscrito false, before [; Attack: "No. Tú no eres como otro de esos orcos... ¿o...?"; TalkTo: if (CLARO hasnt general) "Ahora no es el mejor momento para detenerte a hablar con ", (the) self ,"."; if (self.conversacion_finalizada) "No tienes nada más que hablar con Mario."; self.conversacion_finalizada = true; self.select(1); return true; ], quip [a b; switch(a) { !!------------------- !! MENÚ PRINCIPAL 11: ! No requiere nombre 12: ! No requiere réplica 13: qtype = MainMenu; qqon = true; killq = true; killz = true; if (self.qtest(11)) { print "Limpias la hoja del cuchillo con la capa y lo cuelgas del cinturón, aún bajo la silenciosa mirada del hombre, que permanece de pie a algunos pasos de distancia.^ ", (stcursiva) "---¿Estáis bien? ", "---preguntas."; wait(); new_line; new_line; print "La niña te observa con los ojos enrrojecidos por las lágrimas desde detrás de las piernas de su padre, pero ninguno de los dos parece herido.^ ---Si, si. Estamos bien, gracias.^", (stcursiva) "---¿Se puede saber qué demonios estabais haciendo aquí vosotros dos solos?"; wait(); new_line; new_line; print "---Nuestros asuntos no son de vuestra incumbencia. ---contesta cortante.^", (stcursiva) "---Ya... pues sean de mi incumbencia o no, está claro que deberíais ser menos estúpido. Hay demasiados peligros en el bosque para andar por ahí tan tranquilo con ese puerco y una niña pequeña; ", "---a medida que hablas te inclinas sobre los cuerpos sin vida de los orcos, en busca de algún objeto de valor escondido entre los pliegues andrajosos de sus túnicas---", (stcursiva) " están estas malditas bestias, los animales salvajes, los proscritos..."; wait(); new_line; new_line; print "---Vos también viajáis sólo.^", (stcursiva) "---Si... bueno..."; wait(); new_line; new_line; } 14: switch (b) { 0: return 3; ! 3 opciones 1: return 11; 2: return 12; 3: return 13; } !!------------------- 111: print_ret (stcursiva) "~Ya te he dicho que hay proscritos.~"; 112: self.qoff(11, 12, 13); self.qon(32); self.conversacion_pj_proscrito = true; print "El hombre te mira asustado.^", (stcursiva) "---Tranquilo. No tengo motivos para haceros daño."; wait(); new_line; new_line; print "Se hace un breve silencio. Sigue mirándote inquieto, como valorando el peligro que puedes suponer. Finalmente te pregunta a bocajarro:^ ---¿Matasteis a alguien?^", (stcursiva) "---¿Qué? ¿Que si maté...?"; wait(); new_line; new_line; print "---Ya sabes; ¿por qué os busca la ley? ¿Es que matasteis a algún hombre?^", (stcursiva) "---Oh, no. No. Aún no he matado a nadie... ya sabes, que no sea una de esas bestias de La Horda. ", "---señalas el cuerpo de uno de los orcos que tienes a los pies.---", (stcursiva) "En el bosque hay mucha gente peligrosa. Asesinos. Pero yo no. Nunca he matado a un ser humano."; wait(); new_line; new_line; print "---¿Entonces por qué crimen se os persigue?^", (stcursiva) "---¿Me estáis interrogando?"; wait(); new_line; new_line; print "---Disculpad... no quise...^ Le detienes con un gesto de la mano. ", (stcursiva) "---No. Da igual. Robé grano a un vecino."; wait(); new_line; new_line; print "---¿Grano? ---pregunta extrañado.^", (stcursiva) "---Ahá. Maíz. Tenía hambre."; wait(); new_line; new_line; print "---¿Sólo eso? ¿Y por qué escapasteis? ¿Por qué no cumplisteis la pena? Un crimen así se castiga con una pequeña multa. Quizá un dedo meñique cortado... o los dos, a lo sumo.^ No puedes evitar sonreir divertido. ", (stcursiva) "---En realidad estoy condenado a la horca."; wait(); new_line; new_line; print "El hombre te mira perplejo, así que continúas:^", (stcursiva) "---Verás: el señor de la ciudad llegaba tarde a una sesión de caza y tenía prisa por finalizar el juicio, de modo que eligió la opción más rápida. ", "---haces una pequeña pausa antes de añadir:--- ", (stcursiva) "No me pareció muy saludable saldar cuentas con la ley, por lo que me refugié en el bosque."; wait(); new_line; new_line; print "---Lo, lo siento mucho.^^ Vuelve a hacerse un breve silencio entre los dos. Dejas de inspeccionar los cuerpos de los orcos sin encontrar nada, y miras de nuevo al hombre:^", (stcursiva) "---¿Terminaste...? quiero decir, ¿terminASTEIS con el cuestionario?"; wait(); new_line; new_line; print "---Si, si. Claro. Disculpadme. Y por favor, permitid que me presente; yo soy Mario, y ella mi hija pequeña: Sara.^ Te tiende la mano en actitud amistosa, así que te acercas y le correspondes al gesto estrechándosela: ", (stcursiva) "---Tanto gusto. Yo soy Pedro.", "^^Entonces algo te llama la atención. El hombre luce en la mano un enorme anillo de oro con incrustaciones... es la segunda vez en toda tu vida que ves una joya así."; wait(); new_line; new_line; 113: qqon = true; qtransfer = 2; killq = true; killz = true; !!------------------- 121: print_ret (stcursiva) "~Mis asuntos tampoco son de vuestra incumbencia.~"; 122: self.qoff(11, 12, 13); print "Se hace el silencio entre los dos durante algunos momentos."; wait(); new_line; new_line; print "---Disculpadme... no quise... permitid que me presente. Mi nombre es Mario, ella es mi hija pequeña: Sara. ---el hombre tiende su mano hacia ti.^", (stcursiva) "---Claro, tanto gusto. Yo soy Pedro.", "^^Das dos pasos hacia Mario para estrecharle la mano, y entonces algo te llama la atención. El hombre luce en el dedo corazón un enorme anillo de oro con incrustaciones... es la segunda vez en toda tu vida que ves una joya así."; wait(); new_line; new_line; 123: qqon = true; qtransfer = 2; killq = true; killz = true; !!------------------- 131: print_ret (stcursiva) "~Me gusta viajar sólo. Me llamo Pedro.~"; 132: self.qoff(11, 12, 13); print "Tiendes la mano en actitud amistosa. El hombre da un par de pasos hacia ti y corresponde al gesto estrechándotela.^ ---Mi nombre es Mario. Ella es mi hija pequeña: Sara. ^^Entonces algo te llama la atención. El hombre luce en uno de los dedos un enorme anillo de oro con incrustaciones... es la segunda vez en toda tu vida que ves una joya así."; wait(); new_line; new_line; 133: qqon = true; qtransfer = 2; killq = true; killz = true; !!------------------- !! MENÚ PRINCIPAL 21: ! No requiere nombre 22: ! No requiere réplica 23: qtype = MainMenu; qqon = true; 24: switch (b) { 0: return 3; ! 3 opciones 1: return 21; 2: return 22; 3: return 23; } !!------------------- 211: print_ret (stcursiva) "~Un adorno muy bonito...~"; 212: self.qoff(21, 23); print "Inmediatamente, Mario esconde la mano entre los pliegues de su capa.^", (stcursiva) "---Algo así debe ser muuuy caro, ¿eh?"; wait(); new_line; new_line; print "---...^", (stcursiva) "---Venga, no alarguemos las cosas...^^"; 213: qqon = true; qtransfer = 3; killq = true; killz = true; !!------------------- 221: print_ret (stcursiva) "~Ese es el escudo de armas de Miranda.~"; 222: self.qoff(21, 22, 23); self.qoff(31, 32); self.qon (33, 35); print "Mario clava los ojos en el suelo, en silencio.^", (stcursiva) "---Sólo los señores de la ciudad pueden llevar ese sello."; wait(); new_line; new_line; print "El hombre permanece en silencio, con sus ojos oscilando nerviosamente entre el suelo y tú. Durante un momento lo estudias detenidamente; los ojos verdes, la barba castaña y espesa, el largo pelo ondulado... el gesto orgulloso, prepotente. Te sorprendes por no haber reconocido primero al hombre"; if (self.conversacion_pj_proscrito) print ": es él quien te condenó a muerte; es por su culpa que ahora eres un proscrito; fue él quien te separó de tu familia para siempre"; print ".^^", (stcursiva) "---...bueno, ellos y los ladrones, desde luego. Pero tú no lo has robado, ¿no es cierto Mario de Miranda?"; wait(); new_line; new_line; print "Una vez más se hace un breve silencio entre los dos. Al cabo, Mario comienza a hablar, pausadamente:^ ---No. No lo he robado. Pero os equivocais, ya no soy el señor de Miranda. ---Alza perceptiblemente el tono de voz, mientras fija sus ojos en los tuyos.--- Si lo que quereis es conseguir un rescate por mi, olvidaos de ello. Nadie va a venir a pagaros nada.^ Sonríes. ", (stcursiva) "---Por favor, no me toméis por estúpido. Las noticias también llegan hasta aquí. Se que vuestro hermano es el nuevo señor de la ciudad..."; wait(); new_line; new_line; print "---...^", (stcursiva) "---...y que os busca. Tal vez nadie venga a pagar un rescate, pero en su lugar quizá me ofrezcan una buena recompensa..."; wait(); new_line; new_line; print "Mario sigue en silencio...^", (stcursiva) "---En cualquier caso, decidme. De todas las noticias que llegan, hay algo que no encaja. O que no alcanzo a comprender... ¿por qué razón asesinasteis a Lady Elena? Era vuestra propia mujer... ¿problemas en el lecho quizá?"; wait(); new_line; new_line; print "El hombre se lanza sobre ti como un resorte y te aferra por el cuello. ---¡¿CÓMO TE ATREVES?! YO T...^", (stcursiva) "---Calma. Calma.", "---Has sacado el cuchillo de su funda y presionas suavemente con la hoja en el pecho de Mario, justo sobre su corazón."; wait(); new_line; new_line; print "Lentamente te suelta, y cae de rodillas al suelo, rendido. La pequeña corre junto a él sollozando. Con un hilillo de voz, Mario empieza a hablar, como para si mismo, sin dirigirse a nadie:^ ---Ellos... en-entraron en nuestra alcoba, dirigidos por mi hermano. Me traicionaron. ¡Mis propios hombres! Ellos... m-mat-mataron a... Elena..."; wait(); new_line; new_line; print "Tras coger aire durante un momento, continúa: ---Sara y yo logramos escapar con vida... pero ahora nos están buscando... se me... culpa. Del. ASESINATO. De. Mi. Mujer... Elena..."; wait(); new_line; new_line; 223: qqon = true; qtransfer = 3; killq = true; killz = true; !!------------------- 231: print_ret (stcursiva) "~Será mejor que siga mi camino.~"; 232: self.qoff(21, 22, 23); self.qoff(31, 32); print "---Si. Nosotros también debemos ponernos en marcha. Buena suerte, amigo.^", (stcursiva) "---No. Suerte a vosotros. Está claro que os va a hacer mucha más falta."; wait(); new_line; 233: qqon = true; killq = true; killz = true; !!------------------- !! MENÚ PRINCIPAL 31: ! No requiere nombre 32: ! No requiere réplica 33: qtype = MainMenu; qqon = true; 34: switch (b) { 0: return 6; ! 6 opciones 1: return 31; 2: return 32; 3: return 22; 4: return 33; 5: return 34; 6: return 35; } !!------------------- 311: print_ret (stcursiva) "~Dame el anillo.~"; 312: self.qoff(31, 32, 22); self.qon (33, 34); print "El hombre niega con la cabeza. ---No.^", (stcursiva) "---No pongas las cosas difíciles... dámelo."; wait(); new_line; new_line; print "Mario vuelve a hacer un gesto negativo con la cabeza. ---No. Vete.^ Mueves la mirada lentamente hacia la pequeña, sin decir nada."; wait(); new_line; new_line; print "Mario lee tus intenciones y echa rápidamente la mano sobre la empuñadura de su espada.^ ---Déjadnos en paz..."; wait(); print " por favor."; wait(); new_line; new_line; 313: qqon = true; qtransfer = 3; killq = true; killz = true; !!------------------- 321: print_ret "(Acaricia a Sara) ", (stcursiva) "~Dame el anillo, por favor.~"; 322: self.qoff(31, 32, 22); self.qoff(33, 34, 35); print "Mario empalidece por culpa del miedo.^ ---...deja... dejala en paz.^", (stcursiva) "---Claro. Tranquila Sara, no te voy a hacer daño. Mientras tu padre me de MI anillo..."; wait(); new_line; new_line; print "---...^ La niña se echa a llorar. Vuelves a dirigirte al padre:^", (stcursiva) "---No pongas las cosas difíciles..."; wait(); new_line; new_line; print "---...t-ten...^ Mario se saca el anillo del dedo con dificultad; le tiemblan las manos. Y te lo lanza a los pies.^", (stcursiva) "---Muy amable de tu parte.", " ---dices mientras te inclinas a recogerlo del suelo, dejando que la niña salga corriendo junto a su padre."; wait(); new_line; new_line; print "---Ya tenéis lo que queríais. ¡Ahora dejadnos en paz!^", (stcursiva) "---Desde luego, desde luego. Mucha suerte en vuestro camino, amigo."; wait(); new_line; move anillo to player; 323: qqon = false; killq = true; killz = true; !!------------------- 331: print_ret "(Róbale el anillo)"; 332: self.qoff(31, 32, 22); self.qoff(33, 34, 35); print "Con un rápido movimiento, haces volar la hoja de tu cuchillo de su funda en el cinturón hasta el pecho del hombre.^ ", (stcursiva) "---Venga... no pongas las cosas más difíciles. Quítate el anillo."; wait(); new_line; new_line; print "---T-ten... ---te dice mientras se saca el anillo del dedo con dificultad; le tiemblan las manos. Coges la joya con una sonrisa.^", (stcursiva) "---Bien. Muy bien. Gracias por el obsequio. Que tengáis suerte en vuestro camino..."; wait(); new_line; move anillo to player; 333: qqon = false; killq = true; killz = true; !!------------------- 341: print_ret (stcursiva) "Si, será mejor que siga mi camino."; 342: self.qoff(31, 32, 22); self.qoff(33, 34, 35); print "El hombre sigue mirándote fijamente, con la mano aún en la empuñadura de su espada.^", (stcursiva) "---Buena suerte. ", "---Te despides.---", (stcursiva) "Os va a hacer falta."; wait(); new_line; 343: qqon = false; killq = true; killz = true; !!------------------- 351: print_ret (stcursiva) "Creo... creo que será mejor que siga mi camino."; 352: self.qoff(31, 32, 22); self.qoff(33, 34, 35); print "El hombre sigue de rodillas en el suelo, en silencio, abrazado a la pequeña que gimotea quedamente, como un animalillo herido.^", (stcursiva) "---Buena suerte. Os va a hacer falta."; wait(); new_line; 353: qqon = false; killq = true; killz = true; }], dies [; move self to LIMBO; move Mario_cuerpo to CLARO; move espada to Mario_cuerpo; move anillo to Mario_cuerpo; ], has static concealed; Corpse Mario_cuerpo "cuerpo del hombre" LIMBO with name 'mario' 'hombre' 'padre' 'persona' 'personas' 'cuerpo' 'cuerpos' 'cadaver' 'cadaveres' 'muerto' 'muertos', adjectives 'alto' 'delgado' 'fuerte' 'decapitado' 'cabeza', description [; print_ret (The) self ," yace tendido en el suelo sobre un gran charco de sangre. Eres incapaz de evitar que el estómago se te encoja levemente al mirarle la cabeza, desprendida del cuerpo casi por completo."; ], before [; Search: if (anillo in self) { move anillo to CLARO; "Al inspeccionar el cuerpo del hombre descubres un gran sello de oro en su mano. Se lo sacas sin titubear."; } "No ves nada más que pueda ser valioso."; ]; Item espada "espada" Mario with name 'espada' 'arma' 'hoja', adjectives 'corta' 'hombre' 'mario' 'afilada' 'afilado', description "Una espada corta de aspecto muy afilado.", has female; Item anillo "anillo" Mario with name 'anillo' 'sello' 'joya', adjectives 'oro' 'escudo' 'miranda' 'incrustaciones' 'incrustacion' 'esmeralda' 'rubi', description "Es un gran anillo de oro con incrustaciones de esmeralda y rubí, símbolo de la casa de Miranda. No alcanzas a imaginar el valor de un objeto así. [NOTA 5]", has clothing; NPC Sara CLARO with short_name [; if (self.introduced) { print "Sara"; return true; } print "niña"; return true; ], name 'sara' 'nina' 'hija' 'pequena' 'chiquilla' 'persona' 'personas' 'cuerpo' 'cuerpos' 'cadaver' 'cadaveres' 'muertos', adjectives 'blusa' 'sencilla' 'pardusco' 'pardusca' 'marron' 'sandalias' 'cana' 'asustada' 'ojos' 'verdes' 'brillantes', description [; if (self in player) "Llevas el cuerpecito inconsciente de la niña en brazos. Entre sus largos cabellos oscuros ves el fino hilillo de sangre que brota de la herida de la cabeza."; if (self.injured) "Te acercas hasta la pequeña, desplomada junto al cuerpo de su padre. Tiene toda la ropa regada en sangre, aunque parece que la mayor parte es del hombre que yace a su lado. En ella, sólo adviertes un fino hilillo carmesí que le cae resbalándole por el cuero cabelludo justo a la altura en la que ha recibido el impacto del orco. A pesar de lo brutal del golpe, la niña está inconsciente pero aún respira con normalidad."; if (Mario in parent(self)) "Judgas que rondará los diez años. De largos cabellos oscuros, tiene los mismos ojos verdes y brillantes del hombre que está a su lado ---supones que se trata de su padre--- y viste de forma similar a él; sencilla blusa de color pardusco y sandalias de caña. Te devuelve la mirada, asustada, desde detrás de las piernas del hombre."; "Judgas que rondará los diez años. De largos cabellos oscuros y grandes ojos verdes y brillantes, enrrojecidos por las lágrimas. Viste con una sencilla blusa de color pardusco y sandalias de caña."; ], quip [; ], before [; Attack: "No. Tú no eres como otro de esos orcos... ¿o...?"; Take: if (self.injured) { move self to player; "Coges a la niña en brazos."; } TalkTo: "La pequeña no parece estar interesada en hablar contigo."; ], dies [; move self to LIMBO; move Sara_cuerpo to CLARO; ], has static concealed female; ! Por implementar: En caso de que el PJ matase a la pequeña Corpse Sara_cuerpo "cuerpo de la niña" LIMBO with name 'sara' 'nina' 'hija' 'pequena' 'chiquilla' 'persona' 'personas' 'cuerpo' 'cuerpos' 'muertos' 'cadaver' 'cadaveres', has female; Orc Lazbuk CLARO with short_name [; if (self.introduced) { print "Lazbuk"; return true; } print "orco grande"; return true; ], name 'lazbuk' 'jefe' 'lider' 'orco' 'orcos' 'trasgo' 'trasgos' 'goblin' 'goblins' 'bestia' 'bestias' 'monstruo' 'monstruos' 'tunica' 'coraza' 'harapos', adjectives 'grande' 'musculoso' 'fornido' 'alto' 'a' 'al' 'sobre' 'en' 'el' 'un' 'brazo' 'los' 'brazos' 'la' 'una' 'mano' 'las' 'manos' 'cabeza' 'cara' 'rostro' 'pierna' 'piernas' 'pie' 'pies' 'tronco' 'torso' 'pecho' 'cuerpo' 'laton' 'deslucido', description [; print "Se trata de un orco corpulento y alto, casi de tu misma altura a pesar de la espalda y las piernas encorvadas, de piel pardusca cubierta de mugre, numerosas cicatrices, marcas de sangre seca y restos de pintura. Tiene el cuerpo embutido en alguna especie de túnica negra toda hecha jirones, el torso protegido por una tosca coraza de latón deslucido, y empuña una larga cimitarra de hoja curvada."; if (self.injured) " Tiene varias heridas de las que brotan hilillos de sangre, negra y espesa."; new_line; ], before [; Attack: if (attack_focus == 33) <>; if (attack_focus == 34) <>; if (attack_focus == 35) <>; if (attack_focus == 36) <>; <>; AttackArm: if (~~self.injured) { self.injured = true; self.silence = true; print "Con un movimiento rápido saltas hacia adelante, arremetiendo con tu cuchillo a la bestia más alta y corpulenta. Trata de zafarse del ataque echándose a un lado, pero no puede evitar que la afilada hoja le alcance en un hombro arrancándole un gruñido de dolor. El orco hinca una rodilla en el suelo sujetándose el brazo ensangrentado.^"; CLARO.reload(); return true; } print "Clavas tu afilado cuchillo en el brazo de ", (the) self , ", que profiere un alarido y cae herido boca abajo, frente a ti. Antes de que intente levantarse de nuevo, vuelves a descargar la hoja del puñal sobre su cuerpo, esta vez atravesándole el corazón. El orco muere sobre un charco de sangre negra.^"; self.dies(); return true; AttackHead: print "Saltas a un lado para esquivar una estocada de ", (the) self ,". Desequilibrado por la finta, no tienes tiempo para asestar un golpe con la mano con la que empuñas el cuchillo antes de que el orco te ataque de nuevo, de manera que no lo piensas dos veces y le lanzas un puñetazo en la cara con la otra mano. La criatura se tambalea varios pasos hacia atrás, cubriéndose la nariz rota. Entonces alzas el cuchillo y lo descargas con fuerza sobre su cabeza; la hoja atraviesa el cráneo sin apenas dificultad y comienza a manar la sangre, espesa, empapando tus ropas y el mango del puñal.^"; self.dies(); return true; AttackLeg: if (~~self.injured) { self.injured = true; if (random(3) > 1) self.silence = true; print "Atacas al orco más alto y corpulento. El cuchillo le alcanza en un muslo, arrancándole un terrible aullido.^"; CLARO.reload(); return true; } print "Clavas tu afilado cuchillo en una pierna de ", (the) self ,", que pierde el equilibrio y cae herido frente a ti. Antes de que intente levantarse de nuevo, vuelves a descargar la hoja del puñal sobre su cuerpo, esta vez atravesándole el corazón. El orco muere sobre un charco de sangre negra.^"; self.dies(); return true; AttackTrunk: if (~~self.injured) { self.injured = true; self.silence = true; print "Con un movimiento rápido, saltas hacia adelante, arremetiendo con tu cuchillo a la bestia más alta y corpulenta. El ataque le coge por sorpresa y logras clavar la afilada hoja del cuchillo en su pecho. Al momento, el orco se revuelve dolorido y te golpea con el brazo arrojándote a un lado.^"; CLARO.reload(); return true; } print "Clavas tu afilado cuchillo en el estómago de ", (the) self ,", que profiere un alarido y cae herido frente a ti. Antes de que intente levantarse de nuevo, vuelves a descargar la hoja del puñal sobre su cuerpo, esta vez atravesándole el corazón. El orco muere sobre un charco de sangre negra.^"; self.dies(); return true; ], silence true, daemon [; if (self.silence) { self.silence = false; return true; } new_line; switch (life_points) { 4: print (The) self ," salta hacia ti, trazándo un amplio arco con la cimitarra. Tratas de esquivar la estocada echándote hacia atrás pero no eres lo suficientemente rápido y la hoja rasga la capa y te alcanza en el hombro izquierdo. Un momento después notas cómo empieza a resbalar la sangre por tu brazo."; 3: print (The) self ," descarga la cimitarra sobre ti con un tajo rápido. Intentas saltar a un lado pero no logras zafarte del ataque y la hoja curvada te alcanza en una pierna."; 2: print "Ves el destello del sol en la hoja apenas un momento antes de que la cimitarra te alcance. Intentas saltar a un lado pero ya es tarde para esquivar la estocada del orco, que te hiere en un brazo."; 1: print (The) self ," te propina un rodillazo en el estómago, haciendo que te inclines sobre ti mismo por culpa del dolor. Después, con un movimiento rápido, levanta su cimitarra y deja caer la afilada hoja sobre tu nuca..."; } life_points --; if (life_points == 0) PJdeath(); new_line; return true; ], quip [ a b; switch (a) { !!------------------- 11: ! MENÚ PRINCIPAL: no requiere nombre 12: ! MENÚ PRINCIPAL: no requiere réplica 13: qtype = MainMenu; qqon = true; killq = true; killz = true; !! Texto de inicio al primer menú de conversación if (self.qtest(11)) print "^Herido, ", (the) self ," se detiene y te mira aturdido durante unos momentos. La herida no le deja de sangrar y por el gesto de su cara parece que le duele con intensidad. ---Uh... por... por fa-vor. No me mates...^^"; !else qtransfer = 2; ! saltaría al segundo menú de conversación 14: switch (b) { 0: return 3; ! 3 opciones 1: return 11; 2: return 12; 3: return 13; } !!------------------- 111: print_ret (stcursiva) "~Vete... deja el sable en el suelo y vete corriendo.~"; 112: self.qoff(11); self.qoff(12); self.qoff(13); print "Si necesidad de que lo repitas dos veces, el orco arroja la cimitarra delante tuyo y desaparece tan rápido como puede entre los árboles, dejando un rastro de sangre y quimas rotas a su paso."; StopDaemon(self); move self to LIMBO; move cimitarra to CLARO; CLARO.reload(); wait(); new_line; !!------------------- 113: qqon = true; killq = true; killz = true; 121: print_ret (stcursiva) "~Jajajaja. En verdad sois más estúpidos de lo que parecéis.~"; 122: self.qoff(11); self.qoff(12); self.qoff(13); print "El orco aprieta los dientes y tensa el brazo con el que empuña su sable. Por un momento ves un destello de miedo en sus ojillos amarillos."; wait(); new_line; 123: qqon = true; killq = true; killz = true; !!------------------- 131: print_ret (stcursiva) "~...~", " (Guardar silencio)"; 132: self.qoff(11); self.qoff(12); self.qoff(13); print "Un destello de miedo cruza la mirada del orco. ---Por... favor.^ Haces oídos sordos a sus palabras y aferras el mango de hueso de tu cuchillo con más fuerza."; wait(); new_line; 133: qqon = true; killq = true; killz = true; }], dies [; move self to LIMBO; move Lazbuk_cuerpo to CLARO; move cimitarra to CLARO; StopDaemon(self); CLARO.reload(); ], has static concealed; Corpse Lazbuk_cuerpo "cuerpo de Lazbuk" LIMBO with name 'lazbuk' 'jefe' 'lider' 'orco' 'orcos' 'trasgo' 'trasgos' 'goblin' 'goblins' 'bestia' 'bestias' 'monstruo' 'monstruos' 'cuerpo' 'cuerpos' 'cadaver' 'cadaveres' 'muerto' 'muertos', adjectives 'grande' 'musculoso' 'fornido' 'tunica' 'coraza' 'laton' 'harapos', description "El cuerpo del orco yace tirado en el suelo, sobre un gran charco de sangre negra."; Item cimitarra "cimitarra" Lazbuk with name 'cimitarra' 'sable' 'hoja' 'shamsir' 'kilic' 'saif' 'talwar' 'nimcha' 'filo', adjectives 'curvada' 'fina' 'ligera' 'liviana', description "Se trata de un arma fina y ligera, con un solo filo. Su larga hoja curvada es perfecta para barrer con estocadas o acuchillar a los enemigos. Es un trabajo demasiado bueno para ser obra de orcos, sin duda debieron robársela a alguien menos afortunado que tú.", has female; Orc Bubhosh CLARO with short_name [; if (self.introduced) { print "Búbhosh"; return true; } print "orco bajo"; return true; ], name 'bubhosh' 'orco' 'orcos' 'trasgo' 'trasgos' 'goblin' 'goblins' 'bestia' 'bestias' 'monstruo' 'monstruos', adjectives 'bajo' 'enclenque' 'nervioso' 'pequeno' 'a' 'al' 'sobre' 'en' 'el' 'un' 'brazo' 'los' 'brazos' 'la' 'una' 'mano' 'las' 'manos' 'cabeza' 'cara' 'rostro' 'pierna' 'piernas' 'pie' 'pies' 'tronco' 'torso' 'pecho' 'cuerpo', description [; print "Es la bestia más pequeña de las tres con las que te has encontrado en el claro; un orco bajo, nervudo, de rostro afilado y aspecto enclenque. Tiene la piel amarillenta, pequeños ojillos oscuros y oblicuos, nariz chata y grandes orejas puntiagudas perforadas y atravesadas por varios pendientes de metal."; if (self.injured) " Se tapa con la mano una profunda herida que no deja de sangrar."; new_line; ], before [; Attack: if (attack_focus == 33) <>; if (attack_focus == 34) <>; if (attack_focus == 35) <>; if (attack_focus == 36) <>; <>; AttackArm: if (~~self.injured) { self.injured = true; self.silence = true; print "Con un rápido movimiento, haces saltar tu cuchillo sobre el brazo del orco, clavándo la hoja varios centímetros en la piel cetrina. La bestia aúlla dolorida.^"; CLARO.reload(); return true; } print "Lanzas la hoja del cuchillo sobre ", (the) self ,", alcanzándole en un brazo. La bestia aúlla de dolor y cae de rodillas al suelo, soltándo su arma para agarrarse el brazo herido. Resuelto, coges la cachiporra y la descargas con todas tus fuerzas sobre su cabeza antes de que tenga tiempo para reaccionar. El cráneo se fractura con un golpe sordo y el orco se desploma sin vida hacia atrás, como un muñeco desmadejado.^"; self.dies(); return true; AttackHead: print "El pequeño orco deja caer su porra y se abalanza sobre ti, arrojándote al suelo. Automáticamente, con la bestia encima tuyo, agarras la estaca de madera que ha dejado caer y le golpeas con todas tus fuerzas en el rostro. El impacto es tan brutal que le arranca varios dientecillos y hace girar su cuello con un desagradable crujido. Búbhosh se demploma hacia atrás, inerte, como un muñeco desmadejado.^"; self.dies(); return true; AttackLeg: if (~~self.injured) { self.injured = true; if (random(3) > 1) self.silence = true; print "Con un rápido movimiento, haces saltar tu cuchillo sobre el muslo del orco, rasgando su túnica negra y su piel cetrina. La bestia aúlla dolorida.^"; CLARO.reload(); return true; } print "Lanzas la hoja del cuchillo sobre ", (the) self ,", alcanzándole en una pierna. La bestia aúlla de dolor y cae de rodillas al suelo, soltándo su arma para taponarse con la mano la herida en el muslo. Resuelto, coges la cachiporra y la descargas con todas tus fuerzas sobre su cabeza antes de que tenga tiempo para reaccionar. El cráneo se fractura con un golpe sordo y el orco se desploma hacia atrás, sin vida, como un muñeco desmadejado.^"; self.dies(); return true; AttackTrunk: if (~~self.injured) { self.injured = true; self.silence = true; print "Con un rápido movimiento, haces saltar tu cuchillo sobre el pecho del orco y logras clavarle la hoja entre los resquicios de la deslustrada coraza de latón. La bestia deja escapar un agudo aullido por culpa del dolor.^"; CLARO.reload(); return true; } print "Lanzas la hoja del cuchillo sobre ", (the) self ,", alcanzándole en el abdómen. La bestia aúlla de dolor y cae de rodillas al suelo, soltándo su arma para taponarse la herida. Resuelto, coges la cachiporra y la descargas con todas tus fuerzas sobre su cabeza antes de que tenga tiempo para reaccionar. El cráneo se fractura con un golpe sordo y el orco se desploma sin vida hacia atrás, como un muñeco desmadejado.^"; self.dies(); return true; ], silence true, daemon [; if (self.silence) { self.silence = false; return true; } new_line; switch (life_points) { 4: print (The) self ," lanza su cachiporra sobre ti, alcanzándote en una pierna. Aprietas las mandíbulas intentando ignorar el dolor y aferras con fuerza el mango de tu cuchillo, dispuesto a devolver el golpe.^"; 3: print (The) self ," te ataca con la cachiporra. Puedes ver cómo se acerca la gruesa estaca de madera pero eres incapaz de esquivarla a tiempo y te golpea en el hombro, arrancándote un gruñido de dolor.^"; 2: print "Una enorme estaca de madera surca el aire a toda velocidad hasta impactar en tu espalda. Pierdes el equilibrio por un momento y caes al suelo de rodillas, dolorido por el golpe.^"; 1: print (The) self ," alza la porra sobre su cabeza y coge aire un momento antes de descargarla sobre ti. No tienes tiempo para esquivar el golpe y el impacto te alcanza de lleno en la parte superior del cráneo..."; } life_points --; if (life_points == 0) PJdeath(); return true; ], quip [ a b; switch (a) { !!------------------- 11: ! MENÚ PRINCIPAL: no requiere nombre 12: ! MENÚ PRINCIPAL: no requiere réplica 13: qtype = MainMenu; qqon = true; killq = true; killz = true; !! Texto de inicio al primer menú de conversación if (self.qtest(11)) print "^Herido, ", (the) self ," se detiene y te mira aturdido durante unos momentos. La herida no le deja de sangrar y por el gesto de su cara parece que le duele con intensidad. ---Uh... por... por fa-vor. No me mates...^^"; 14: switch (b) { 0: return 3; ! 3 opciones 1: return 11; 2: return 12; 3: return 13; } !!------------------- 111: print_ret (stcursiva) "~Vete... vete corriendo. Ya.~"; 112: self.qoff(11); self.qoff(12); self.qoff(13); print "Si necesidad de que lo repitas dos veces, el orco gira sobre si mismo y desaparece tan rápido como puede entre los árboles, dejando un rastro de sangre y quimas rotas a su paso."; StopDaemon(self); move self to LIMBO; CLARO.reload(); wait(); new_line; !!------------------- 113: qqon = true; killq = true; killz = true; 121: print_ret (stcursiva) "~Jajajaja. En verdad sois más estúpidos de lo que parecéis.~"; 122: self.qoff(11); self.qoff(12); self.qoff(13); print "El orco aprieta los dientes y tensa el brazo con el que empuña su porra. Por un momento ves un destello de miedo en sus ojillos amarillos."; wait(); new_line; 123: qqon = true; killq = true; killz = true; !!------------------- 131: print_ret (stcursiva) "~...~", " (Guardar silencio)"; 132: self.qoff(11); self.qoff(12); self.qoff(13); print "Un destello de miedo cruza la mirada del orco. ---Por... favor.^ Haces oídos sordos a sus palabras y aferras el mango de hueso de tu cuchillo con más fuerza."; wait(); new_line; 133: qqon = true; killq = true; killz = true; }], dies [; move self to LIMBO; move Bubhosh_cuerpo to CLARO; StopDaemon(self); CLARO.reload(); ], has static concealed; Corpse Bubhosh_cuerpo "cuerpo de Búbhosh" LIMBO with name 'bubhosh' 'orco' 'orcos' 'trasgo' 'trasgos' 'goblin' 'goblins' 'bestia' 'bestias' 'monstruo' 'monstruos' 'cuerpo' 'cuerpos' 'cadaver' 'cadaveres' 'muerto' 'muertos', adjectives 'bajo' 'enclenque' 'nervioso' 'pequeno', description "Tiene el cráneo destrozado por completo. No distingues de su cabeza más que una masa informe de sangre, sesos, hueso y pequeños pedazos de piel."; Orc Grishgul CLARO with short_name [; if (self.introduced) { print "Grishgul"; return true; } print "orco mutilado"; return true; ], name 'grishgul' 'orco' 'orcos' 'trasgo' 'trasgos' 'goblin' 'goblins' 'bestia' 'bestias' 'monstruo' 'monstruos', adjectives 'desfigurado' 'deformado' 'mutilado' 'a' 'al' 'sobre' 'en' 'el' 'un' 'brazo' 'los' 'brazos' 'la' 'una' 'mano' 'las' 'manos' 'cabeza' 'cara' 'rostro' 'pierna' 'piernas' 'pie' 'pies' 'tronco' 'torso' 'pecho' 'cuerpo', description [; print "Tiene el mismo aspecto andrajoso de los otros orcos; robusto, casi un pie más bajo que tú, de piel cetrina, llena de cicatrices y suciedad."; if (self has general && self.injured) " Está herido, y la boca sin labios esboza una repulsiva mueca por culpa del dolor."; if (self hasnt general) { give self general; print " Por un instante clava sus ojos amarillos en los tuyos, y entonces adviertes que tiene el rostro horriblemente mutilado. Le han cortado los labios, probablemente como castigo por una falta de respeto al jefe de su tribu, y su boca, contraída por el tejido de la cicatriz, presenta una mueca repulsiva."; if (self.injured) " Está herido."; } new_line; ], before [; Attack: if (attack_focus == 33) <>; if (attack_focus == 34) <>; if (attack_focus == 35) <>; if (attack_focus == 36) <>; <>; AttackArm: if (~~self.injured) { self.injured = true; self.silence = true; print "El orco alza su cachiporra y coge aire un instante antes de descargarla sobre ti. Rápidamente, te lanzas a un lado para esquivar el ataque y clavas tu cuchillo en uno de sus brazos. La bestia lanza un grito de dolor.^"; CLARO.reload(); return true; } print "Te abalanzas sobre el orco y le clavas la hoja del cuchillo en el brazo con el que esgrime la cachiporra, haciendo que suelte el arma y deje escapar un aullido. Antes de que se recupere, vuelves a levantar el cuchillo y se lo clavas en el pecho. La sangre mana a borbotones y la bestia cae al suelo entre sacudidas. Un momento después deja de moverse por completo.^"; self.dies(); return true; AttackHead: print "Te abalanzas sobre el orco y le clavas la hoja del cuchillo en un lado del cuello. La sangre mana a grandes chorros y él cae de rodillas, con las manos tratando en vano de taponar la herida. Un momento después, la bestia se desploma sin vida sobre un gran charco de sangre negra y espesa.^"; self.dies(); return true; AttackLeg: if (~~self.injured) { self.injured = true; if (random(3) > 1) self.silence = true; print "El orco alza su cachiporra y coge aire un instante antes de descargarla sobre ti. Rápidamente, te lanzas a un lado para esquivar el ataque y clavas tu cuchillo en uno de sus muslos. La bestia lanza un alarido de dolor y se tambalea hacia atrás unos pasos, herido.^"; CLARO.reload(); return true; } print "Te abalanzas sobre el orco y le clavas la hoja del cuchillo en un muslo, haciéndole que suelte un aullido de dolor y pierda el equilibrio. Antes de que se recupere, vuelves a levantar el cuchillo y se lo clavas en el pecho. La sangre mana a borbotones de la herida y la bestia muere entre sacudidas, sobre un charco negro y espeso.^"; self.dies(); return true; AttackTrunk: if (~~self.injured) { self.injured = true; self.silence = true; print "Golpeas al orco en la boca del estómago con la rodilla. La bestia se inclina hacia delante por culpa del dolor y aprovechas para clavarle el cuchillo en un costado, esquivando la deslustrada armadura de latón.^"; CLARO.reload(); return true; } print "Te abalanzas sobre el orco y le clavas la hoja del cuchillo directamente en el pecho. La sangre mana a borbotones y la bestia cae al suelo entre sacudidas. Un momento después deja de moverse por completo.^"; self.dies(); return true; ], silence true, daemon [; if (self.silence) { self.silence = false; return true; } new_line; switch (life_points) { 4: print (The) self ," salta hacia ti, porra en ristre. No eres lo suficientemente rápido para esquivar el ataque, y la bestia logra sacudirte en una pierna con la gruesa estaca. Tienes que apretar las mandíbulas para sofocar un grito de dolor.^"; 3: print (The) self ," te golpea en un brazo con su cachiporra, arrancándote un alarido.^"; 2: print "La cachiporra de ", (the) self ," traza un arco en el aire antes de estamparse brutalmente en tu espalda. No eres capaz de evitar soltar un grito por culpa del dolor.^"; 1: print (The) self ," te propina un puñetazo en la cara, rompiéndote la nariz y haciendo que caigas al suelo. Cuando levantas de nuevo la mirada, ves a la bestia justo frente a ti, descargando su cachiporra directamente sobre tu cabeza..."; } life_points --; if (life_points == 0) PJdeath(); return true; ], quip [ a b; switch (a) { !!------------------- 11: ! MENÚ PRINCIPAL: no requiere nombre 12: ! MENÚ PRINCIPAL: no requiere réplica 13: qtype = MainMenu; qqon = true; killq = true; killz = true; !! Texto de inicio al primer menú de conversación if (self.qtest(11)) print "^Herido, ", (the) self ," se detiene y te mira aturdido durante unos momentos. La herida no le deja de sangrar y por el gesto de su cara parece que le duele con intensidad. ---Uh... por... por fa-vor. No me mates...^^"; 14: switch (b) { 0: return 3; ! 3 opciones 1: return 11; 2: return 12; 3: return 13; } !!------------------- 111: print_ret (stcursiva) "~Vete... vete corriendo. Ya.~"; 112: self.qoff(11); self.qoff(12); self.qoff(13); print "Si necesidad de que lo repitas dos veces, el orco gira sobre si mismo y desaparece tan rápido como puede entre los árboles, dejando un rastro de sangre y quimas rotas a su paso."; StopDaemon(self); move self to LIMBO; CLARO.reload(); wait(); new_line; !!------------------- 113: qqon = true; killq = true; killz = true; 121: print_ret (stcursiva) "~Jajajaja. En verdad sois más estúpidos de lo que parecéis.~"; 122: self.qoff(11); self.qoff(12); self.qoff(13); print "El orco aprieta los dientes y tensa el brazo con el que empuña su porra. Por un momento ves un destello de miedo en sus ojillos amarillos."; wait(); new_line; 123: qqon = true; killq = true; killz = true; !!------------------- 131: print_ret (stcursiva) "~...~", " (Guardar silencio)"; 132: self.qoff(11); self.qoff(12); self.qoff(13); print "Un destello de miedo cruza la mirada del orco. ---Por... favor.^ Haces oídos sordos a sus palabras y aferras el mango de hueso de tu cuchillo con más fuerza."; wait(); new_line; 133: qqon = true; killq = true; killz = true; }], dies [; move self to LIMBO; move Grishgul_cuerpo to CLARO; StopDaemon(self); CLARO.reload(); ], has static concealed; Corpse Grishgul_cuerpo "cuerpo de Grishgul" LIMBO with name 'grishgul' 'orco' 'orcos' 'trasgo' 'trasgos' 'goblin' 'goblins' 'bestia' 'bestias' 'monstruo' 'monstruos' 'cuerpo' 'cuerpos' 'cadaver' 'cadaveres' 'muerto' 'muertos', adjectives 'desfigurado' 'deformado' 'mutilado', description "El cuerpo inerte del orco reposa tendido de espaldas sobre un gran charco de sangre, con una profunda herida en el pecho."; Atrezzo "tienda" CLARO with name 'tienda' 'jaima', adjectives 'piel', before [; Enter: "Te asomas a la entrada de la pequeña tienda de piel; dentro no hay nada que parezca útil."; Examine: return false; Search: <>; default: "No hace falta que te preocupes por eso."; ], has female; Atrezzo "hoguera" CLARO with name 'hoguera' 'fuego' 'ascuas' 'cenizas', adjectives 'apagada' 'apagado' 'restos', description "Son los restos de un fuego. Ahora sólo quedan frías cenizas y pequeños troncos ennegrecidos.", has female; Item cerdo "cerdo" CLARO with name 'cerdo' 'puerco' 'gorrino' 'chon', adjectives 'orondo' 'gordo' 'grueso' 'rosado' 'rosa', description "Es un puerco de aspecto orondo. Puede servir para mantener a una familia entera durante varios meses."; !!------------------- Room BOSQUE4 "Atravesando el bosque" with description [; if (self has general) "Vuelves a estar en mitad del bosque, rodeado por los troncos grisáceos de encinas y robles, cagigas y castaños."; give self general; ! Sales corriendo del claro para internarte de nuevo en la espesura, ! al abrigo de los árboles. if (self.previous_room() hasnt general) { print "Esquivas los apretados troncos a toda velocidad, sin atraverte a echar la vista atrás. Enseguida, el corazón comienza a palpitarte violentamente bajo el jubón. Algunas gotas de sudor resbalan ya por tu frente. Las piernas te empiezan a doler por culpa del esfuerzo y de los arañazos con el follje. Y entonces tropiezas con algo y te precipitas de bruces hacia adelante.^^ Magullado en el suelo, te afanas en recuperar la respiración mientras miras preocupado a tu espalda... parece que no te han seguido.^"; !! Para la música de fondo #Ifdef TARGET_GLULX; Damusix.FadeOut( MUS_theme, 5000, 0 ); #Endif; return true; } print "Sales del claro para internarte de nuevo en la espesura, bajo la densa cúpula del bosque"; if (Sara in player) print ", llevando en brazos el cuerpecito inconsciente de la pequeña"; else if (cerdo in player) print ", tratando de guiar a empujones al pesado cerdo, que se resiste a llevar tu paso"; else if (anillo in player) print ", contemplando tu nuevo anillo, que lanza fantásticos destellos dorados, verdes y rojos"; ". Las copas de los robles han vuelto a ocultar el cielo sobre tu cabeza."; ], before [; Go: if (noun == 0) return false; if (noun == u_obj or d_obj or in_obj or out_obj) "No puedes ir por ahí."; if (noun == self.previous_direction) { if (self.previous_room() hasnt general) "No tienes ninguna intención de volver allí."; else { PlayerTo(self.previous_room()); return true; } } print "Sigues tu camino a través del bosque...^"; print (stnegrita) "^^ *** FIN ***"; !! Imprime imágen final #Ifdef TARGET_GLULX; if (glk_gestalt(gestalt_DrawImage, wintype_TextBuffer)) glk_image_draw(gg_mainwin, IMG_pig, imagealign_InlineCenter,0); #Ifnot; new_line; new_line; new_line; #Endif; wait(); print "¿Quieres volver a empezar? "; if (YesOrNo() ~= 0) { @restart; L__M(##Restart, 2); } quit; Listen: if (noun == 0) "No se oye nada, excepto el leve susurro del viento en las hojas de los árboles."; ], previous_room [; return CLARO; ]; !!============================================================================== !! Puntos de entrada y otras rutinas !!------------------------------------------------------------------------------ #Ifdef TARGET_GLULX; !Include "./da_gwin/gimage.h"; ! GWindows widget !Include "./da_gwin/gtile.h"; ! GWindows widget !Include "./da_gwin/gwindows.h"; ! GWindows hooks !!------------------------------------------------------------------------------ !! Rutina que configurará todo lo necesario para inicializar la UI para GWindows !! [esta rutina es el equivalente de InitGlkWindow(0) de la librería Inform] !!------------------------------------------------------------------------------ ![ InitGWindows; ! Active_UI = UI_Root; ! Objeto raíz de la UI que se activará al inicio ! Main_GWindow = MainWin; ! Ventana principal !]; #Endif; [ Initialise; life_points = 4; ! puntos de vida iniciales del PJ move ropa to player; move cuchillo to player; location = BOSQUE1; ! Localidad inicial del PJ lookmode = 2; ! Modomirar largo por defecto EraseWindow(); #Ifdef TARGET_GLULX; if (~~Damusix.TestAudio()) { ! Si el intérprete no soporta el audio box "" "AVISO: Este programa incluye contenidos gráficos y " "de audio, pero su intérprete GLULX no los soporta " "correctamente. La aplicación se iniciará con parte o" "la totalidad de sus recursos multimedia desactivados" ""; wait("[...]"); EraseWindow(); } !! Imprime imágen inicial if (glk_gestalt(gestalt_DrawImage, wintype_TextBuffer)) glk_image_draw(gg_mainwin, IMG_skull, imagealign_InlineCenter, 0); !! Inicializa canal de audio ! Damusix.AsignarCanal( SONIDO, CANAL, VOLUMEN, REPETICIONES ); Damusix.AsignarCanal( MUS_theme, 0, -1, -1 ); ! vol. global / repetir infin. #Endif; banner(); wait(); wait("^^[Pulsa una tecla para empezar]"); EraseWindow(); return 2; ! Suprime la impresión del banner ]; !!------------------------------------------------------------------------------ ! ~De pronto Frodo notó que un hombre de rostro extraño, curtido por ! la intemperie, sentado a la sombra cerca de la pared, escuchaba también ! con atención la charla de los hobbits. Tenía un tazón delante de él, y ! fumaba una pipa de caño largo, curiosamente esculpida. Las piernas ! extendidas mostraban unas botas de cuero blando, que le calzaban bien, ! pero que habían sido muy usadas y estaban ahora cubiertas de barro. Un ! manto pesado, de color verde oliva, manchado por muchos viajes, le ! envolvía ajustadamente el cuerpo, y a pesar del calor que había en el ! cuarto llevaba una capucha que le ensombrecía la cara; sin embargo, se ! le alcanzaba a ver el brillo de los ojos, mientras observaba a los ! hobbits. [...] Frodo se acercó y el hombre se sacó la capucha ! descubriendo una hirsuta cabellera oscura con mechones canosos, y un ! par de ojos grises y perspicaces en una cara pálida y severa.~ [El ! Señor de los Anillos: La Comunidad del Anillo] [ PJdeath; wait(); print "^^Recibes el impacto sin sentir el menor temor o asombro; tampoco dolor alguno. Simplemente te quedas observando al orco con la misma mirada vacua, carente de toda emoción que vaga por los macizos troncos de los robles que crecen en las lindes del calvero. Después, todo se vuelve oscuro y ya no ves ni oyes nada más."; !! Para la música de fondo #Ifdef TARGET_GLULX; Damusix.FadeOut( MUS_theme, 5000, 0 ); #Endif; wait(); print (stnegrita) "^^^ *** HAS MUERTO ***"; !! Imprime imágen final #Ifdef TARGET_GLULX; if (glk_gestalt(gestalt_DrawImage, wintype_TextBuffer)) glk_image_draw(gg_mainwin, IMG_pig, imagealign_InlineCenter, 0); #Ifnot; new_line; new_line; new_line; #Endif; wait(); print "^^¿Quieres volver a empezar? "; if (YesOrNo() ~= 0) { @restart; L__M(##Restart, 2); } quit; ]; !!------------------- #Ifdef TARGET_ZCODE; [ BeforeParsing i j thisword thislength; ! x exceso; attack_focus = 0; ! se pone a 0 la variable de detección for (i=parse->1,j=1 : j<=i : j++) !in { thisword = WordAddress(j); thislength = WordLength(j); if ( thisword -> 0 >= 'a' && thisword -> 0 <= 'z' ) { if (thisword->0 == 'b' && thisword->1 == 'r' && thisword->2 == 'a' && thisword->3 == 'z') attack_focus = 33; if (thisword->0 == 'm' && thisword->1 == 'a' && thisword->2 == 'n') attack_focus = 33; if (thisword->0 == 'c' && thisword->1 == 'a' && thisword->2 == 'b' && thisword->3 == 'e' && thisword->4 == 'z' && thislength == 6 ) attack_focus = 34; if (thisword->0 == 'c' && thisword->1 == 'a' && thisword->2 == 'r') attack_focus = 34; if (thisword->0 == 'r' && thisword->1 == 'o' && thisword->2 == 's' && thisword->3 == 't' && thisword->4 == 'r' && thisword->5 == 'o' && thislength == 6) attack_focus = 34; if (thisword->0 == 'p' && thisword->1 == 'i' && thisword->2 == 'e' && thisword->3 == 'r' && thisword->4 == 'n') attack_focus = 35; if (thisword->0 == 'p' && thisword->1 == 'i' && thisword->2 == 'e') attack_focus = 35; if (thisword->0 == 't' && thisword->1 == 'r' && thisword->2 == 'o' && thisword->3 == 'n' && thisword->4 == 'c' && thisword->5 == 'o' && thislength == 6) attack_focus = 36; if (thisword->0 == 't' && thisword->1 == 'o' && thisword->2 == 'r' && thisword->3 == 's' && thisword->4 == 'o' && thislength == 5) attack_focus = 36; if (thisword->0 == 'p' && thisword->1 == 'e' && thisword->2 == 'c' && thisword->3 == 'h' && thisword->4 == 'o') attack_focus = 36; if (thisword->0 == 'c' && thisword->1 == 'u' && thisword->2 == 'e' && thisword->3 == 'r' && thisword->4 == 'p') attack_focus = 36; } } ]; #Ifnot; ! TARGET_GLULX; [ BeforeParsing i j thisword thislength; ! x exceso; attack_focus = 0; ! se pone a 0 la variable de detección for (i=parse-->0,j=1 : j<=i : j++) !in { thisword = WordAddress(j); thislength = WordLength(j); if ( thisword -> 0 >= 'a' && thisword -> 0 <= 'z' ) { if (thisword->0 == 'b' && thisword->1 == 'r' && thisword->2 == 'a' && thisword->3 == 'z') attack_focus = 33; if (thisword->0 == 'm' && thisword->1 == 'a' && thisword->2 == 'n') attack_focus = 33; if (thisword->0 == 'c' && thisword->1 == 'a' && thisword->2 == 'b' && thisword->3 == 'e' && thisword->4 == 'z' && thislength == 6 ) attack_focus = 34; if (thisword->0 == 'c' && thisword->1 == 'a' && thisword->2 == 'r') attack_focus = 34; if (thisword->0 == 'r' && thisword->1 == 'o' && thisword->2 == 's' && thisword->3 == 't' && thisword->4 == 'r' && thisword->5 == 'o' && thislength == 6) attack_focus = 34; if (thisword->0 == 'p' && thisword->1 == 'i' && thisword->2 == 'e' && thisword->3 == 'r' && thisword->4 == 'n') attack_focus = 35; if (thisword->0 == 'p' && thisword->1 == 'i' && thisword->2 == 'e') attack_focus = 35; if (thisword->0 == 't' && thisword->1 == 'r' && thisword->2 == 'o' && thisword->3 == 'n' && thisword->4 == 'c' && thisword->5 == 'o' && thislength == 6) attack_focus = 36; if (thisword->0 == 't' && thisword->1 == 'o' && thisword->2 == 'r' && thisword->3 == 's' && thisword->4 == 'o' && thislength == 5) attack_focus = 36; if (thisword->0 == 'p' && thisword->1 == 'e' && thisword->2 == 'c' && thisword->3 == 'h' && thisword->4 == 'o') attack_focus = 36; if (thisword->0 == 'c' && thisword->1 == 'u' && thisword->2 == 'e' && thisword->3 == 'r' && thisword->4 == 'p') attack_focus = 36; } } ]; #Endif; #Ifdef TARGET_ZCODE; [ wait msg delay k; if (msg~=0) print (string) msg; if (delay==0) @read_char 1 0 0 k; else @read_char 1 delay Retorna_true k; return k; ]; [ Retorna_true; rtrue; ]; [ EraseWindow; @erase_window -1; ]; #Ifnot; !! TARGET_GLULX [ EraseWindow; if (gg_quotewin) ! Cerrar la ventana de boxes { glk($0024, gg_quotewin, 0); ! close_window gg_quotewin = 0; } glk($002A, gg_mainwin); ! window_clear if (gg_statuswin) glk($002A, gg_statuswin); ! window_clear ]; #Endif; !!============================================================================== !! Gramática estándar y extendida !!------------------------------------------------------------------------------ Include "SpanishG"; ! Gramática española Include ">GramaticaExtendida.h"; ! Gramática española extendida !!------------------------------------------------------------------------------ Extend only 'corto' replace * -> LMode1; Extend only 'normal' replace * -> LMode2; #Ifdef TARGET_GLULX; Verb meta 'audio' 'sonidos' 'sonido' 'musica' 'music' * -> Audio * 'on' / 'si' -> AudioOn * 'encendido' / 'activado' -> AudioOn * 'off' / 'no' -> AudioOff * 'apagado' / 'desactivado' -> AudioOff ; VerboIrregular "establecer la reproducción de audio" with imperativo 'audio'; #Endif; Verb 'nota' 'footnote' * -> Footnote * number -> Footnote ; Extend 'habla' replace * noun -> TalkTo * 'a'/'con' noun -> TalkTo * creature -> TalkTo * 'a'/'con' creature -> TalkTo ; Verb 'conversa' 'platica' * noun -> TalkTo * 'a'/'con' noun -> TalkTo * creature -> TalkTo * 'a'/'con' creature -> TalkTo ; !!------------------------------------------------------------------------------ [ AttackArmSub; <>; ]; [ AttackHeadSub; <>; ]; [ AttackLegSub; <>; ]; [ AttackTrunkSub; <>; ]; #Ifdef TARGET_GLULX; [ AudioSub; !! Llama a 'AudioOnSub' o 'AudioOffSub' if ( Damusix.HayAudio() ) <>; else <>; ]; [ AudioOnSub; !! Activa la salida de audio de Damusix if ( Damusix.HayAudio() ) print_ret (stparser) "La reproducción de audio ya estaba activada."; Damusix.ActivarAudio(); print_ret (stparser) "Reproducción de audio activada."; ]; [ AudioOffSub; !! Desctiva la salida de audio de Damusix if ( ~~Damusix.HayAudio() ) print_ret (stparser) "La reproducción de audio ya estaba desactivada."; Damusix.DesactivarAudio(); print_ret (stparser) "Reproducción de audio desactivada."; ]; #Endif; [ FootnoteSub; if ( noun == 0) print_ret (stparser) "Especifica un número, por ejemplo: NOTA 3."; st_parser(); if ( STPARSER_MSG1 ~= 0 ) print (string) STPARSER_MSG1; switch( noun ) { 1: print "N1 -- Cagiga es el nombre que se da en la región cántabra a cierto tipo de roble; el ", (stcursiva) "Querqus robur", "."; 2: print "N2 -- La canción ~Thème de combat~ pertenece al disco ", (stcursiva) "Jean qui reve", " del artista Julien PETITJEAN. Se puede descargar libremente desde Jamendo: ", (stcursiva) "http://www.jamendo.com/es/album/38369"; 3: print "N3 -- Sólo era un ejemplo."; 4: print "N4 -- Los versos pertenecen al Canto XVII, 29 de ~Orlando Furioso~, un poema épico caballeresco escrito por Ludovico Ariosto y cuya redacción definitiva se publicó en 1532. [Extraído de Wikipedia]"; 5: "N5 -- Colocándotelo en el dedo no te volverás invisible; eso es de otra historia."; 6: "N6 -- Esta es la famosa nota autorreferencial [NOTA 6]."; default: "No hay ninguna nota ", (number) noun ,"."; } if ( STPARSER_MSG2 ~= 0 ) print (string) STPARSER_MSG2; st_normal(); new_line; return true; ]; [ TalkToSub; if ( noun == player ) "Hablar con uno mismo no resulta especialmente divertido."; if ( noun hasnt animate ) "Por norma general, es mejor intentar hablar con cosas que te puedan devolver una respuesta."; print (The) noun; if (noun has pluralname) print " no parecen estar interesad", (o) noun; else print " no parece estar interesad", (o) noun; " en hablar contigo."; ];