Version 1/080917 of Spanish by Sebastian Arg begins here. "Spanish agrupa el trabajo de traducción necesario para la programación y jugabilidad en español." Part SL1 - Spanish Initials and Kinds Include Version 2/080430 of the Standard Rules by Graham Nelson. [asegurarse que la version de base de I7 es la adecuada] A thing can be female. [Habilita genero a inanimados, como containers, supporters, etc. Caracteristica necesaria en espanol] A room can be female. [Habilita genero a habitaciones. Caracteristica necesaria (a veces) en espanol, sobre todo al listar las habitaciones.] A room can be plural-named or singular-named. [spanish need: al listar rooms como 'las Escaleras'] The description of yourself is "Tan buen mozo como siempre." Use Comando Salidas translates as (- Constant ADMITIR_COMANDO_SALIDAS; -). Use Dialecto Castellano translates as (- Global dialecto_sudamericano = 0; Constant DIALECTO_SPANISH; !Set to Castellano -). Use Dialecto Sudamericano translates as (- Global dialecto_sudamericano = 1; Constant DIALECTO_SPANISH; !Set to Sudamericano -). To decide if Dialecto Sudamericano: (- dialecto_sudamericano -); To decide if Dialecto Castellano: (- dialecto_sudamericano==0 -); Use Manual Pronouns translates as (- Constant MANUAL_PRONOUNS; -). Use Auto Pronouns translates as (- Constant AUTO_PRONOUNS; -). [Use Auto Pronouns.] [ Activar actualizacion de pronombres al mencionar cosas. De fábrica viene comentariado] To notice (o - an object): [actualizar pronombres. Ej:  Before printing the name of the cuchillo: notice the cuchillo. Permite usar correctamente >>COGELO,etc)] (- PronounNotice({o}); -). Before printing the name of something (called new_obj): If using the Auto Pronouns option, notice the new_obj.[actualizar pronombres para ESE objeto] To allow no response: (- PreguntaSiNo=1; -). [ admitir 'no' como respuesta y no como 'noroeste', english. Urba work ] To permitir no como respuesta: (- PreguntaSiNo=1; -). [ admitir 'no' como respuesta y no como 'noroeste', spanish. Urba work ] [Section SR2/6 translated - Use options SPANISH] [TODO: faltan algunos Uses] Use coma serial translates as (- Constant I7_SERIAL_COMMA; -). [the serial comma] Use descripciones de localidad completas translates as (- Constant I7_LOOKMODE = 2; -). [full-length room descriptions] Use descripciones de localidad abreviadas translates as (- Constant I7_LOOKMODE = 3; -). [abbreviated room descriptions] Use economia de memoria translates as (- Constant MEMORY_ECONOMY; -). [memory economy] Use no puntuacion translates as (- Constant NO_SCORING; -). [no scoring] Use eco de linea de comandos translates as (- Constant ECHO_COMMANDS; -). [command line echoing] Use sin undo translates as (- Constant PREVENT_UNDO; -). [undo prevention] Use random predecible translates as (- Constant FIX_RNG; -). [predictable randomisation] Part SL2 - Part Two Section SL2/2 - Spanish Compass [TODO Estas relaciones agregan rutinas parse_name (grandes) a los ocho objetos de la brujula. ¿Es para tanto? Pensar otra solucion] Understand "norte" as north. Understand "sur" as south. Understand "este" as east. Understand "o/oeste" as west. Understand "no/noroeste" as northwest. Understand "noreste" as northeast. Understand "sureste" as southeast. Understand "so/suroeste" as southwest. Understand "arriba/sube/techo/lado/cielo" as up. Understand "abajo/b/baja/suelo" as down. Understand "adentro/dentro" as inside. [entra no funciona aqui pues se superpone con verbo 'entra..'] Understand "fuera/afuera" as outside. A direction has a text called printed name. [Eric Forgeot] The printed name of north is "norte". The printed name of south is "sur". The printed name of east is "este". The printed name of west is "oeste". The printed name of northeast is "noreste". The printed name of southwest is "suroeste". The printed name of southeast is "sureste". The printed name of northwest is "noroeste". The printed name of inside is "adentro". The printed name of outside is "afuera". The printed name of up is "arriba". The printed name of down is "abajo". Include (- has proper, -) when defining up. [para evitar 'el arriba', gracias RML] Include (- has proper, -) when defining down. Include (- has proper, -) when defining inside. Include (- has proper, -) when defining outside. Section SL2/1 - Replacing English verbs [ Propósito: Para no incluir el bloque de gramaticas (y verbos) ingleses en el fuente.] [               Si deseas mantener alguno, solo comenta la linea correspondiente] Understand the command "take" as something new. Understand the command "carry" as something new. Understand the command "hold" as something new. Understand the command "get" as something new. Understand the command "pick" as something new. Understand the command "stand" as something new. Understand the command "remove" as something new. Understand the command "shed" as something new. Understand the command "doff" as something new. Understand the command "disrobe" as something new. Understand the command "don" as something new. Understand the command "wear" as something new. Understand the command "put" as something new. Understand the command "drop" as something new. Understand the command "throw" as something new. Understand the command "discard" as something new. Understand the command "give" as something new. Understand the command "pay" as something new. Understand the command "offer" as something new. Understand the command "feed" as something new. Understand the command "present" as something new. Understand the command "display" as something new. Understand the command "show" as something new. Understand the command "go" as something new. Understand the command "walk" as something new. Understand the command "leave" as something new. Understand the command "run" as something new. Understand the command "inventory" as something new. Understand the command "i" as something new. Understand the command "inv" as something new. Understand the command "look" as something new. Understand the command "l" as something new. Understand the command "consult" as something new. Understand the command "open" as something new. Understand the command "unwrap" as something new. Understand the command "uncover" as something new. Understand the command "shut" as something new. Understand the command "cover" as something new. Understand the command "close" as something new. Understand the command "cross" as something new. Understand the command "enter" as something new. Understand the command "sit" as something new. Understand the command "exit" as something new. Understand the command "out" as something new. Understand the command "x" as something new. Understand the command "watch" as something new. Understand the command "describe" as something new. Understand the command "check" as something new. Understand the command "examine" as something new. Understand the command "read" as something new. Understand the command "yes" as something new. Understand the command "y" as something new. Understand the command "yes" as something new. Understand the command "no" as something new. Understand the command "sorry" as something new. Understand the command "shit" as something new. Understand the command "fuck" as something new. Understand the command "damn" as something new. Understand the command "bother" as something new. Understand the command "curses" as something new. Understand the command "drat" as something new. Understand the command "darn" as something new. Understand the command "search" as something new. Understand the command "wave" as something new. Understand the command "adjust" as something new. Understand the command "set" as something new. Understand the command "drag" as something new. Understand the command "pull" as something new. Understand the command "push" as something new. Understand the command "move" as something new. Understand the command "shift" as something new. Understand the command "clear" as something new. Understand the command "press" as something new. Understand the command "rotate" as something new. Understand the command "twist" as something new. Understand the command "unscrew" as something new. Understand the command "screw" as something new. Understand the command "turn" as something new. Understand the command "switch" as something new. Understand the command "lock" as something new. Understand the command "unlock" as something new. Understand the command "attack" as something new. Understand the command "break" as something new. Understand the command "smash" as something new. Understand the command "hit" as something new. Understand the command "fight" as something new. Understand the command "torture" as something new. Understand the command "wreck" as something new. Understand the command "crack" as something new. Understand the command "destroy" as something new. Understand the command "murder" as something new. Understand the command "kill" as something new. Understand the command "punch" as something new. Understand the command "thump" as something new. Understand the command "wait" as something new. Understand the command "z" as something new. Understand the command "answer" as something new. Understand the command "say" as something new. Understand the command "shout" as something new. Understand the command "speak" as something new. Understand the command "tell" as something new. Understand the command "ask" as something new. Understand the command "eat" as something new. Understand the command "sleep" as something new. Understand the command "nap" as something new. Understand the command "sing" as something new. Understand the command "climb" as something new. Understand the command "scale" as something new. Understand the command "purchase" as something new. Understand the command "buy" as something new. Understand the command "squeeze" as something new. Understand the command "swim" as something new. Understand the command "dive" as something new. Understand the command "swing" as something new. Understand the command "blow" as something new. Understand the command "pray" as something new. Understand the command "wake" as something new. Understand the command "awake" as something new. Understand the command "awaken" as something new. Understand the command "kiss" as something new. Understand the command "embrace" as something new. Understand the command "hug" as something new. Understand the command "think" as something new. Understand the command "sniff" as something new. Understand the command "smell" as something new. Understand the command "listen" as something new. Understand the command "hear" as something new. Understand the command "feel" as something new. Understand the command "touch" as something new. Understand the command "rub" as something new. Understand the command "shine" as something new. Understand the command "polish" as something new. Understand the command "sweep" as something new. Understand the command "clean" as something new. Understand the command "dust" as something new. Understand the command "wipe" as something new. Understand the command "scrub" as something new. Understand the command "attach" as something new. Understand the command "fix" as something new. Understand the command "tie" as something new. Understand the command "light" as something new. Understand the command "burn" as something new. Understand the command "swallow" as something new. Understand the command "sip" as something new. Understand the command "drink" as something new. Understand the command "fill" as something new. Understand the command "slice" as something new. Understand the command "prune" as something new. Understand the command "chop" as something new. Understand the command "cut" as something new. Understand the command "jump" as something new. Understand the command "skip" as something new. Understand the command "hop" as something new. Understand the command "dig" as something new. Understand the command "score" as something new. Understand the command "full score" as something new. Understand the command "quit" as something new. Understand the command "q" as something new. Understand the command "save" as something new. Understand the command "restart" as something new. Understand the command "restore" as something new. Understand the command "verify" as something new. Understand the command "version" as something new. Understand the command "script" as something new. Understand the command "transcript" as something new. Understand the command "superbrief" as something new. Understand the command "short" as something new. Understand the command "verbose" as something new. Understand the command "long" as something new. Understand the command "brief" as something new. Understand the command "normal" as something new. Understand the command "nouns" as something new. Understand the command "pronouns" as something new. Understand the command "notify" as something new. Understand the command "insert" as something new. Understand the command "purchase" as something new. Understand the command "squash" as something new. Understand the command "taste" as something new. Understand the command "fasten" as something new. Part SL3 - Actions [ Gramatica basada en InformATE! (by Zak)] [ Verbos irregulares: filosofia usada en informATE!] [ Cada vez que aparece un nuevo 'container' o 'Adirection', I7 crea otra rutina filtro, ¿está desperdiciando recursos?] [ Para algunas acciones no estan permitidas ciertas variantes de la gramatica de informATE, como el uso de second noun como token.  esto hace la respuesta del parser mucho mas tonta: Ej, corta el pan o corta el pan con el cuchillo. ToDo: podrá resolverse esto?] Section SL3/0 - Grammar for Actions in the Game World Understand "toma [things]" as taking. Understand the commands "coge" and "recoge" as "toma". Understand "toma a [someone]" as taking. Understand "toma [things inside] de [something]" as removing it from. Understand "saca [things inside] de [something]" as removing it from. Understand "saca a [someone] de [something]" as removing it from. Understand "quita [things inside] de [something]" as removing it from. Understand "quita a [someone] de [something]" as removing it from. Understand "quita [things inside] a [something]" as removing it from. Understand the command "quitale" as "quita". [Understand "quita cerrojo/pestillo/cierre a [something]" as unlocking it with.] [TODO Unlock no soporta call sin segundo argumento 'second noun' y dice: 'You must supply a second noun.'] [Understand "quita el cerrojo/pestillo/cierre a [something]" as unlocking it with.] Understand "quita cerrojo/pestillo/cierre a [something] con [something preferably held]" as unlocking it with. Understand "quita el cerrojo/pestillo/cierre a [something] con [something preferably held]" as unlocking it with. Understand "sacate [something preferably held]" as taking off. Understand the commands "quitate","sacarse","quitarse","quitarte","sacarte","sacarme","quitarme","quitame" and "sacame" as "sacate". Understand "ponte [something preferably held]" as wearing. Understand "ponte con [something preferably held]" as wearing. Understand the commands  "viste","vistete","ponerse","vestirse","ponerte","vestirte","ponerme","vestirme","ponme" and "visteme" as "ponte". Understand "pon [other things] en [container]" as inserting it into. Understand the commands  "mete","echa","inserta" and "coloca"  as "pon". Understand "pon [other things] en/sobre [something]" as putting it on. Understand "pon [other things] dentro de [something]" as inserting it into. Understand "pon [something] a [text]" as setting it to. Understand "pon a [someone] en [container]" as inserting it into. Understand "pon a [someone] en [something]" as putting it on. Understand "pon a [someone] dentro de [something]" as inserting it into.[todo no seria [container]?] Understand "pon a [someone] sobre [something]" as putting it on. Understand "pon [other things] encima de [something]" as putting it on. Understand "pon a [someone] encima de [something]" as putting it on. Understand "pon cerrojo/pestillo/cierre a [something]" as locking it with. Understand "pon el cerrojo/pestillo/cierre a [something]" as locking it with. Understand "pon cerrojo/pestillo/cierre a [something] con [something preferably held]" as locking it with. Understand "pon el cerrojo/pestillo/cierre a [something] con [something preferably held]" as locking it with. Understand "deja [things preferably held]" as dropping. Understand the command "suelta" as "deja". Understand "deja a [someone]" as dropping. Understand "deja [other things] en [container]" as inserting it into. Understand "deja [other things] en/sobre [something]" as putting it on. Understand "deja [other things] dentro de [something]" as inserting it into. Understand "deja [other things] encima de [something]" as putting it on. Understand "lanza [something preferably held] a/por/contra [something]" as throwing it at. Understand the command "arroja" as "lanza". Understand "lanza a [someone] por/contra [something]" as throwing it at. Understand "tira de [something]" as pulling. Understand "tira [things preferably held]" as dropping. Understand "tira a [things preferably held]" as dropping. [added] Understand "tira [other things] en [container]" as inserting it into. Understand "tira [other things] en/sobre [something]" as putting it on. Understand "tira [other things] dentro de [something]" as inserting it into. Understand "tira [other things] encima de [something]" as putting it on. Understand "tira [something preferably held] a/contra [something]" as throwing it at. Understand "tira [things preferably held] por [something]" as inserting it into. Understand "da [something preferably held] a [someone]" as giving it to. Understand "da a [someone] [something preferably held]" as giving it to (with nouns reversed). Understand "da [someone] [something preferably held]" as giving it to (with nouns reversed). Understand "da una patada a [something]" as attacking. Understand "da un punetazo a [something]" as attacking. Understand "da un golpe a [something]" as attacking. Understand the commands   "regala","dale","dase","ofrece" and "darse" as "da". Understand "muestra [someone] [something preferably held]" as showing it to (with nouns reversed). Understand the command "ensena" as "muestra". Understand "muestra a [someone] [something preferably held]" as showing it to (with nouns reversed). Understand "muestra [something preferably held] a [someone]" as showing it to. Understand "vete" as going. [TODO produce texto: You'll have to say which compass direction to go in. Esto reemplazaria la accion VagueGo. Traducir] Understand "vete [direction]" as going. Understand the commands  "ve","camina","anda","corre","vuelve" and "ir" as "vete". Understand "vete a/hacia [direction]" as going. Understand "vete [something]" as entering. Understand "vete a/hacia/por [something]" as entering. Understand "pasa por [something]" as entering. Understand "inventario" as taking inventory. Understand the commands "inv" and "i" as "inventario". [todo: falta el 'breve'/'estrecho'] Understand "look" as looking. Understand the commands "mira","m","l" and "ver" as "look". Understand "look a [someone]" as examining. Understand "look [something]" as examining. Understand "look a/hacia [something]" as examining. [for compass] Understand "look en/sobre/por [something]" as searching. Understand "look dentro de [something]" as searching. Understand "look bajo [something]" as looking under. Understand "look debajo de [something]" as looking under. Understand "look a traves de [something]" as searching. Understand "consulta [someone] sobre [text]" as asking it about. Understand "consulta a [someone] sobre [text]" as asking it about. Understand "consulta sobre [text] a [someone]" as asking it about (with nouns reversed). Understand "consulta [something] sobre [text]" as consulting it about. Understand "consulta [something] acerca de [text]" as consulting it about. Understand "consulta [text] en [something]" as consulting it about (with nouns reversed). Understand "abre [something]" as opening. Understand "abre a [someone]" as opening. Understand "abre [something] con [something preferably held]" as unlocking it with. Understand "cierra [something]" as closing. Understand "cierra [something] con pestillo" as locking it with. Understand "cierra [something] con [something preferably held]" as locking it with. Understand "destapa [something]" as opening. Understand the command "descubre" as "destapa". Understand "tapa [something]" as closing. Understand the command "cubre" as "tapa". Entering to room is an action applying to nothing. The specification of the entering to room action is "Esta acción se ejecuta con el comando 'entra', asumiendo que en realidad se quiere entrar a alguna localidad que se tenga enfrente, y que en el juego esté correctamente mapeada de manera que corresponda al 'inside' de la localidad actual." Carry out entering to room (this is the intentar entrar rule): try going inside. Understand "entra" as entering to room. Understand "entra en/por/a [something]" as entering. Understand the command "cruza" as "entra". Understand "entra [something]" as entering. Understand "entra dentro de [something]" as entering. Understand "metete en/por [something]" as entering. Understand the commands "meterse","meterte","meterme" and "meteme" as "metete". Understand "atraviesa [something]" as entering. Understand "sienta en [something]" as entering. Understand the commands "echate","sientate","echarse","sentarse","echarte" and "sentarte" as "sienta". Understand "sal" as exiting. Understand "sal de [something]" as getting off. [Understand "sal por [something]" as entering.] [comentariado en informate] Understand "sal fuera/afuera" as exiting. Understand the commands "fuera","afuera","salte","bajate","levantate","bajarse","levantarse","salirse","bajarte","levantarte" and "salirte" as "sal". Understand "examina [something]" as examining. Understand "examina a [someone]" as examining. Understand the commands  "describe","inspecciona","observa","ex","x" as "examina". Understand "lee [something]" as examining. Understand "lee sobre [text] en [something]" as consulting it about (with nouns reversed). Understand "lee [text] en [something]" as consulting it about (with nouns reversed). Understand "si" or "sí" as saying yes. [TODO: arreglar unicode] Understand "nx" as saying no. Understand "sorry" as saying sorry. Understand the commands "perdon","perdona","siento","lamento" and "disculpa" as "sorry". [TODO no permite argumento 'topic'] Understand "lo siento/lamento" as saying sorry. Understand "lo siento/lamento mucho" as saying sorry. Understand "shit" as swearing obscenely. Understand the commands "mierda", "jode","joder","puta","cono","cabron","puto","damn" and "fuck" as "shit". Insultando is an action applying to one topic. Understand "shit [text]" as insultando. The specification of the insultando action is "En inglés existe la acción 'swearing obscenely' pero no permite al jugador agregar texto después de una palabrota. Por ello, este 'insultando' sí lo permite (como lo hacía InformATE)." Check insultando:    say "Los verdaderos aventureros no usan ese vocabulario." Understand "aburrido" as swearing mildly. Understand the commands "idiota","tonto" and "bobo" as "aburrido". InsultandoSuave is an action applying to one topic. Understand "aburrido [text]" as insultandosuave. The specification of the insultandosuave action is "En inglés existe la acción 'swearing mildly' pero no permite al jugador agregar texto después de un insulto suave. Por ello, este 'insultando suave' sí lo permite (como lo hacía InformATE)." Check insultandosuave:    say "Bastante." Understand "busca en [something]" as searching. Understand "busca [text] en [something]" as consulting it about (with nouns reversed). Understand "busca en [something] sobre [text]" as consulting it about. Understand "busca en [something] [text]" as consulting it about. Understand "busca en [something] acerca de [text]" as consulting it about. Understand "registra a [someone]" as searching. Understand the command "rebusca" as "registra". Understand "registra [something]" as searching. Understand "registra en [something]" as searching. Understand "ondea [someone]" as attacking. Understand the command "sacude" and "agita" as "ondea". Understand "ondea a [someone]" as attacking. Understand "ondea la mano" as waving hands. Understand "ondea las manos" as waving hands. Understand "ondea [something]" as waving. Understand "gesticula" as waving hands. Understand "saluda con la mano" as waving hands. Understand "saluda" as waving hands. [new] Understand "ajusta [something] en/a [text]" as setting it to. Understand the command "fija" and "set" as "ajusta". Understand "pulsa [something]" as pushing. Understand "empuja [something]" as pushing. Understand the command "mueve","desplaza" and "menea" as "empuja". Understand "empuja a [someone]" as pushing. Understand "empuja [something] hacia [direction]" or "empuja [something] [direction]" as pushing it to. Understand "gira [something]" as turning. Understand the command  "atornilla" and "desatornilla" as "gira". Understand "conecta [something]" as switching on. Understand "conecta [something] a/con [something]" as tying it to. Understand "enciende [a device]" as switching on. Understand the command "prende" as "enciende". Understand "enciende [something]" as burning. Understand "desconecta [something]" as switching off. Understand the command "apaga" as "desconecta". Understand "desconecta a [someone]" as switching off. Understand "rompe [something]" as attacking. Understand "rompe a [someone]" as attacking. Understand the commands "aplasta","golpea","destruye","patea" and "pisotea" as "rompe". Understand "ataca a [someone]" as attacking. Understand "ataca [something]" as attacking. Understand the commands  "mata","asesina","tortura" and "noquea" as "ataca". Understand "lucha con [someone]" as attacking. Understand "lucha [someone]" as attacking. Understand "espera" or "z" as waiting. Understand "responde a [someone] [text]" as answering it that. Understand "responde [text] a [someone]" as answering it that (with nouns reversed). [TODO ¿como es el orden correcto?] Understand "responde [someone] [text]" as answering it that. Understand the commands "di","grita" and "dile" as "responde". Understand "cuenta [someone] de/sobre [text]" as telling it about. Understand "cuenta [someone] [text]" as telling it about. Understand "cuenta a [someone] de/sobre [text]" as telling it about. Understand "cuenta a [someone] [text]" as telling it about. Understand "cuenta con [someone] sobre/de [text]" as telling it about. Understand "cuenta con [someone] acerca de [text]" as telling it about. Understand "cuenta sobre [text] con [someone]" as telling it about (with nouns reversed). Understand "cuenta acerca de [text] con [someone]" as telling it about (with nouns reversed). Understand "cuenta de [text] con/a [someone]" as telling it about (with nouns reversed). Understand "cuenta [text] a [someone]" as telling it about (with nouns reversed). Understand the commands "narra","explica" and "habla" as "cuenta". Understand "pregunta [someone] sobre/por [text]" as asking it about. Understand the command "interroga" as "pregunta". Understand "pregunta a [someone] sobre/por [text]" as asking it about. Understand "pregunta sobre/por [text] a [someone]" as asking it about (with nouns reversed). Understand "pregunta [text] a [someone]" as asking it about (with nouns reversed). Understand "pregunta a [someone] acerca de [text]" as asking it about. Understand "pide a [someone] [something]" as asking it for. Understand the command "pidele" as "pide". Understand "pide [something] a [someone]" as asking it for (with nouns reversed). Understand "come [something preferably held]" as eating. Understand the commands  "comete","traga","ingiere","mastica","comerse" and "comerte" as "come". Understand "duerme" or "ronca" or "descansa" as sleeping. Understand "canta" as singing. Understand "escala a [something]" as climbing. Understand the command "trepa" as "escala". Understand "escala [something]" as climbing. Understand "escala por [something]" as climbing. Understand "baja [something]" as getting off. Understand "baja de [something]" as getting off. Understand "baja" as bajando. Bajando is an action applying to nothing. The specification of the bajando action is "Esta acción se ejecuta con el comando 'baja', asumiendo que en realidad se quiere bajar a alguna localidad que se tenga debajo, y que en el juego esté correctamente mapeada de manera que corresponda al 'down' de la localidad actual." Carry out bajando: try going down. Understand "subete a/en [something]" as entering. Understand the command "subirse" and "subirte" as "subete". Subiendo is an action applying to nothing. The specification of the subiendo action is "Esta acción se ejecuta con el comando 'sube', asumiendo que en realidad se quiere subir a alguna localidad que se tenga arriba, y que en el juego esté correctamente mapeada de manera que corresponda al 'up' de la localidad actual." Carry out subiendo: try going up. Understand "sube" as subiendo. Understand "sube arriba" as subiendo. Understand "sube [something]" as entering. Understand "sube a/en/por [something]" as entering. Understand "baja a/en/por [something]" as entering. Understand "compra [something]" or "adquiere [something]" as buying. Understand "retuerce [something]" as squeezing. Understand "retuerce a [someone]" as squeezing. Understand the commands "aprieta","estruja" and "tuerce" as "retuerce". [Understand "nada" as swimming.] [Actions withdrawn] Understand "balanceate en [something]" as swinging. Understand the commands "columpiate","meneate","balancearse","columpiarse","menearse","balancearte","columpiarte" and "menearte" as "balanceate". [Understand "sopla [something]" as blowing.] [Actions withdrawn] [Understand "rezar" as praying.][ action withdrawn] Understand "despierta" as waking up. Understand "despierta [someone]" or "despierta a [someone]" as waking. Understand the command "espabila" as "despierta". Understand "espabilate" or "espabilarse" or "espabilarte" as waking up. Understand "besa [someone]" as kissing. Understand the command "abraza" as "besa". Understand "besa a [someone]" as kissing. Understand "piensa" as thinking. Understand "huele" as smelling. Understand the command "olfatea" as "huele". Understand "huele a [something]" as smelling. Understand "huele [something]" as smelling. Understand "escucha" as listening. Understand the command "oye" as "escucha". Understand "escucha a [something]" as listening. Understand "escucha [something]" as listening. Understand "saborea [something]" as tasting. Understand the commands  "paladea","prueba" and "lame" as "saborea". Understand "saborea a [something]" as tasting. Understand "toca [something]" as touching. Understand the command "palpa" as "toca". Understand "toca a [someone]" as touching. Understand "lava [something]" as rubbing. Understand the commands "limpia","pule","abrillanta","friega" and "frota" as "lava". Understand "lava a [someone]" as rubbing. Understand "ata [something]" as tying it to. Understand the commands  "enlaza","enchufa" and "une" as "ata". Understand "ata a [someone]" as tying it to. Understand "ata a [someone] a [something]" as tying it to. Understand "ata [something] a [something]" as tying it to. Understand "quema [something]" as burning. Understand "quema a [someone]" as burning. [Understand "quema a [someone] con [something preferably held]" as burning.] [Understand "quema [something] con [something preferably held]" as burning.] [TODO La accion Burn no contempla second noun] Understand "bebe [something]" as drinking. [Understand "llena [something]" as filling. Understand the command "rellena" as "llena".] [Actions withdrawn] Understand "corta [something]" as cutting. Understand the command "rasga" as "corta". [Understand "corta [something] con [something preferably held]" as cutting.] [TODO no contempla second noun] Understand "salta" as jumping. [Understand "salta [something]" as jumping over.] [Actions withdrawn] Understand "salta a [something]" as entering.Understand the command "brinca" as "salta". [Understand "salta sobre [something]" as jumping over.] [Understand "salta por encima de [something]" as jumping over.] [Understand "cava en [something]" as digging. Understand the command "excava" as "cava".] [Actions withdrawn] [Understand "cava [something]" as digging. Understand "cava [something] con [something preferably held]" as digging. Understand "cava en [something] con [something preferably held]" as digging.] Section SL3/1 - Grammar for Actions which happen out of world Understand "score" or "puntos" or "puntuacion" as requesting the score. [Understand "full score" or "fullscore" as requesting the full score.] Understand "quit" or "q" or "terminar" or "fin" or "acabar" or "abandonar" as quitting the game. Understand "save" or "guardar" or "salvar" as saving the game. Understand "restart" or "reiniciar" as restarting the game. Understand "restore" or "recuperar" or "cargar" or "load" or "restaurar" as restoring the game. Understand "verify" or "verificar" as verifying the story file. Understand "version" as requesting the story file version. Understand "script" or "script on/si" as switching the story transcript on. Understand the command "transcripcion" as "script". Understand "script off/no" as switching the story transcript off. Understand  "noscript" or "unscript" or "notranscripcion" as switching the story transcript off. Understand "superbreve" or "corto" as preferring abbreviated room descriptions. Understand "verbose" or "largo" as preferring unabbreviated room descriptions. Understand "breve" or "normal" as preferring sometimes abbreviated room descriptions. Understand "pronombres" or "p" as requesting the pronoun meanings. Understand "notify" or "notify on/si" as switching score notification on. Understand the commands "notificar" and "notificacion" as "notify". Understand "notify off/no" as switching score notification off. Section SL3/2 - Grammar for Actions Exclusive from InformATE [ TODO tratar de colocar aqui grammars and actions para BajarSub y otras ] Section SL3/9 - Activities rules Spanish Replacement The you-can-also-see rule is not listed in any rulebook. For printing the locale description (this is the spanish-you-can-also-see rule): let the domain be the parameter-object; let the mentionable count be 0; repeat with item running through things: now the item is not marked for listing; repeat through the Table of Locale Priorities: [say "[notable-object entry] - [locale description priority entry].";] if the locale description priority entry is greater than 0, now the notable-object entry is marked for listing; increase the mentionable count by 1; if the mentionable count is greater than 0: repeat with item running through things: if the item is mentioned: now the item is not marked for listing; begin the listing nondescript items activity; if the number of marked for listing things is 0: abandon the listing nondescript items activity; otherwise: if handling the listing nondescript items activity: if the domain is a room: if the domain is the location, say "Puedes "; otherwise say "En [the domain] puedes "; otherwise if the domain is a supporter: say "Sobre [the domain] puedes "; otherwise: say "En [the domain] puedes "; say "ver [if the locale paragraph count is greater than 0]también [end if]"; let the common holder be nothing; let contents form of list be true; repeat with list item running through marked for listing things: if the holder of the list item is not the common holder: if the common holder is nothing, now the common holder is the holder of the list item; otherwise now contents form of list is false; if the list item is mentioned, now the list item is not marked for listing; filter list recursion to unmentioned things; if contents form of list is true and the common holder is not nothing, list the contents of the common holder, as a sentence, including contents, giving brief inventory information, tersely, not listing concealed items, listing marked items only; otherwise say "[a list of marked for listing things including contents]"; [if the domain is the location, say " here";] say ".[paragraph break]"; unfilter list recursion; end the listing nondescript items activity; continue the activity. The use initial appearance in room descriptions rule is not listed in any rulebook. For printing a locale paragraph about a thing (called the item) (this is the spanish use initial appearance in room descriptions rule): if the item is not mentioned: if the item provides the property initial appearance and the item is not handled: increase the locale paragraph count by 1; say "[initial appearance of the item]"; say "[paragraph break]"; if a locale-supportable thing is on the item: repeat with possibility running through things on the item: now the possibility is marked for listing; if the possibility is mentioned: now the possibility is not marked for listing; say "Sobre [the item] "; list the contents of the item, as a sentence, including contents, giving brief inventory information, tersely, not listing concealed items, prefacing with is/are, listing marked items only; say ".[paragraph break]"; now the item is mentioned; continue the activity. The describe what's on scenery supporters in room descriptions rule is not listed in any rulebook. For printing a locale paragraph about a thing (called the item) (this is the spanish describe what's on scenery supporters in room descriptions rule): if the item is not undescribed and the item is scenery and the item does not enclose the player: set pronouns from the item; if a locale-supportable thing is on the item: repeat with possibility running through things on the item: now the possibility is marked for listing; if the possibility is mentioned: now the possibility is not marked for listing; increase the locale paragraph count by 1; say "Sobre [the item] "; list the contents of the item, as a sentence, including contents, giving brief inventory information, tersely, not listing concealed items, prefacing with is/are, listing marked items only; say ".[paragraph break]"; continue the activity. The print the final question rule is not listed in any rulebook. The spanish print the final question rule is listed in before handling the final question. This is the spanish print the final question rule: let named options count be 0; repeat through the Table of Spanish Final Question Options: if the only if victorious entry is false or the game ended in victory: if there is a final response rule entry or the final response activity entry [activity] is not empty: if there is a final question wording entry, increase named options count by 1; if the named options count is less than 1, abide by the immediately quit rule; say "¿Quieres "; repeat through the Table of Spanish Final Question Options: if the only if victorious entry is false or the game ended in victory: if there is a final response rule entry or the final response activity entry [activity] is not empty: if there is a final question wording entry: say final question wording entry; decrease named options count by 1; if the named options count is 0: say "?[line break]"; otherwise if the named options count is 1: if using the serial comma option, say ","; say " o "; otherwise: say ", ". The standard respond to final question rule is not listed in any rulebook. The spanish standard respond to final question rule is listed last in for handling the final question. This is the spanish standard respond to final question rule: repeat through the Table of Spanish Final Question Options: if the only if victorious entry is false or the game ended in victory: if there is a final response rule entry or the final response activity entry [activity] is not empty: if the player's command matches the topic entry: if there is a final response rule entry, abide by final response rule entry; otherwise carry out the final response activity entry activity; rule succeeds; issue miscellaneous library message number 8. Section SL3/10 - Final question options - Spanish Replacement Table of Spanish Final Question Options final question wording only if victorious topic final response rule final response activity "REINICIAR" false "reiniciar" immediately restart the VM rule -- "RECUPERAR un juego guardado" false "recuperar" immediately restore saved game rule -- "ver algunas CURIOSIDADES" true "curiosidades" -- amusing a victorious player "TERMINAR" false "terminar" immediately quit rule -- -- false "undo" immediately undo rule -- Section SL3/11 - Declaraciones VerboIrregular [Hay problemas con los Unicode y los acentos. Tener cuidado al editar esto con editores no UTF-8] Include (- ! Objetos VerboIrregular, necesarios para el parseo de verbos irregulares en espanol (Added by SL) VerboIrregular "abandonar el juego" with imperativo 'q//' 'quit' 'terminar' 'fin' 'acabar' 'abandonar'; VerboIrregular "abrir" with imperativo 'abre'; VerboIrregular "activar la transcripcin a disco" with imperativo 'script' 'transcripcion'; VerboIrregular "adquirir" with imperativo 'adquiere'; VerboIrregular "ajustar" with imperativo 'set'; VerboIrregular "apretar" with imperativo 'aprieta'; VerboIrregular "atravesar" with imperativo 'atraviesa'; VerboIrregular "bajar" with imperativo 'bajate' 'bajarse' 'irte'; VerboIrregular "balancear" with imperativo 'balanceate' 'meneate' 'balancearse' 'menearse' 'balancearse' 'menearse'; VerboIrregular "cambiar a modo LARGO" with imperativo 'verbose' 'largo'; VerboIrregular "cambiar a modo NORMAL" with imperativo 'breve' 'normal'; VerboIrregular "cambiar a modo SUPERBREVE" with imperativo 'superbreve' 'corto'; VerboIrregular "cambiar el dialecto del juego" with imperativo 'dialecto'; VerboIrregular "cambiar el estado de la NOTIFICACION de PUNTOS" with imperativo 'notificar' 'notify'; VerboIrregular "cargar un juego previamente guardado en disco" with imperativo 'cargar' 'recuperar' 'load' 'restaurar' 'restore'; VerboIrregular "cerrar" with imperativo 'cierra'; VerboIrregular "columpiar" with imperativo 'columpiate' 'columpiarse' 'columpiarse'; VerboIrregular "comer" with imperativo 'comete' 'comerse' 'comerte'; VerboIrregular "ingerir" with imperativo 'ingiere'; VerboIrregular "conocer el número de VERSION del juego" with imperativo 'version'; VerboIrregular "conocer la puntuación" with imperativo 'score' 'puntos' 'puntuacion'; VerboIrregular "conocer la puntuación detallada" with imperativo 'total' 'pt'; VerboIrregular "contar" with imperativo 'cuenta'; VerboIrregular "cubrir" with imperativo 'cubre'; VerboIrregular "darle" with imperativo 'dale' 'dase' 'darse'; VerboIrregular "decir" with imperativo 'di' 'dile'; VerboIrregular "desactivar la transcripción a disco" with imperativo 'unscript' 'noscript' 'notranscripcion'; VerboIrregular "descubrir" with imperativo 'descubre'; VerboIrregular "despertar" with imperativo 'despierta' 'espabilate' 'espabilarse' 'espabilarte'; VerboIrregular "destruir" with imperativo 'destruye'; VerboIrregular "disculparte" with imperativo 'sorry' 'perdon'; VerboIrregular "dormir" with imperativo 'duerme'; VerboIrregular "echar" with imperativo 'echate' 'echarse'; VerboIrregular "encender" with imperativo 'enciende'; VerboIrregular "esperar" with imperativo 'z//'; VerboIrregular "examinar" with imperativo 'x//' 'describe' 'ex'; VerboIrregular "fregar" with imperativo 'friega'; VerboIrregular "guardar en disco el estado del juego" with imperativo 'save' 'guardar' 'salvar'; VerboIrregular "ir" with imperativo 've' 'vete' 'ir'; VerboIrregular "volver" with imperativo 'vuelve'; VerboIrregular "levantar" with imperativo 'levantate' 'levantarse' 'levantarte'; VerboIrregular "listar los lugares visitados" with imperativo 'places' 'lugares'; VerboIrregular "listar los objetos que se han tenido" with imperativo 'objects' 'objetos'; VerboIrregular "meter" with imperativo 'metete' 'meterse' 'meterte' 'meterme' 'meteme'; VerboIrregular "mirar" with imperativo 'l//' 'look' 'm//'; VerboIrregular "mostrar" with imperativo 'muestra'; VerboIrregular "mostrar inventario" with imperativo 'i//' 'inv' 'inventario'; VerboIrregular "mover" with imperativo 'mueve'; VerboIrregular "oir" with imperativo 'oye'; VerboIrregular "oler" with imperativo 'huele'; VerboIrregular "pedir" with imperativo 'pide' 'pidele'; VerboIrregular "pensar" with imperativo 'piensa'; VerboIrregular "poner" with imperativo 'pon' 'ponte' 'viste' 'vistete' 'ponerse' 'vestirse' 'ponerte' 'vestirte' 'ponerme' 'vestirme' 'ponme' 'visteme'; VerboIrregular "probar" with imperativo 'prueba'; VerboIrregular "pulir" with imperativo 'pule'; VerboIrregular "quitar" with imperativo 'sacate' 'quitate' 'sacarse' 'quitarse' 'quitarte' 'sacarte' 'sacarme' 'quitarme' 'quitame' 'sacame'; VerboIrregular "quitarle" with imperativo 'quitale'; VerboIrregular "reiniciar el juego" with imperativo 'reiniciar'; VerboIrregular "responder ~no~" with imperativo 'nx'; VerboIrregular "responder ~sí~" with imperativo 'si' 'y//'; VerboIrregular "sacudir" with imperativo 'sacude'; VerboIrregular "salir" with imperativo 'sal' 'fuera' 'afuera' 'salte' 'salirse' 'salirte'; VerboIrregular "sentar" with imperativo 'sienta' 'sientate' 'sentarse' 'echarte' 'sentarte'; VerboIrregular "soltar" with imperativo 'suelta'; VerboIrregular "subir" with imperativo 'sube' 'subete' 'subirse' 'subirte'; VerboIrregular "torcer" with imperativo 'tuerce'; VerboIrregular "retorcer" with imperativo 'retuerce'; VerboIrregular "transferir" with imperativo 'transfiere'; VerboIrregular "unir" with imperativo 'une'; VerboIrregular "ver el estado de los pronombres" with imperativo 'pronombres'; VerboIrregular "verificar la corrección del juego" with imperativo 'verificar'; VerboIrregular "mostrar las salidas" with imperativo 'salidas'; ! Urba touch #ifdef DEBUG; VerboIrregular "purloin" with imperativo 'purloin'; VerboIrregular "hacer con abstract" with imperativo 'abstract' 'xmueve'; VerboIrregular "hacer con gonear (indica lugar)" with imperativo 'gonear' 'xmueve'; #endif; -). Understand "sarganar" or "infsp" as a mistake ("Hola! Soy sarganar, argentino de pura sepa. Implementé la mayor parte de la librería hispana para Inform 7. Quiero dar las gracias a Zak (y equipo) por su estupenda labor con informATE (librería madre de infsp), a Urbatain por su incomparable entusiasmo y testeos, a Mel Hython por su endemoniada necesidad de llevar al parser a su máximo, a Eliuk Blau por su pujante trabajo en infsp 6, a los chicos del plurilingüe rakontointeractiva (merci, grazie y danke!), a toda la comunidad hispana del CAAD (son muchos amigos, vaya) por hacer tan ameno el mundillo IF y a Graham Nelson y todo su equipo, por su dedicación en esta belleza de autoría que es Inform7."). Part SL4 - Spanish Phrasebook Section SL4/0 - Spanish Saying, basados en la rutinas de impresión de InformATE! [ Documentacion de esta seccion: DocumentATE: Descripciones y Parsing: Descripcion de objetos y lugares ] [Articulos ] To say el (something - object): (- print (the) {something}; -). To say El (something - object): (- print (The) {something}; -). To say un (something - object): (- print (un) {something}; -). To say Un (something - object): (- print (_Un) {something}; -). To say nombre (something - object): [withdrawn: esto ya no deberia ser usado, simplemete poniendo [objeto] ya imprime el nombre corto en I7] (- print (name) {something}; -). To say del (something - object): (- print (del) {something}; -). To say al (something - object): (- print (al) {something}; -). To say Al (something - object): (- print (_Al) {something}; -). [ Terminaciones para adjetivos ] To say o (something - object):         [say "Cogid[o noun]".] (- print (o) {something}; -). To say s (something - object):         [withdrawn: I7 ya incluye esta posibilidad con 'objeto[s]'   ] (- print (s) {something}; -). To say _s (something - object): (- print (_s) {something}; -). [ Terminaciones para verbos ] To say es (something - object): (- print (es) {something}; -). To say Es (something - object): (- print (_Es) {something}; -). To say n (something - object): (- print (n) {something}; -). To say lo (something - object): [say "Cóge[lo noun]".] (- print (lo) {something}; -). [ Verbo COGER/TOMAR segun dialecto ] To say coge: (- coge(0); -). To say Coge : (- Mcoge(0); -). To say MMcoge : (- MMcoge(0); -). [Misc] To say (something - time) in spanish: [decir la hora en español] (- print (PrintTimeOfDayEnglish) {something}; -). [To say (something - time) con palabras:             [decir la hora en español] [vamos a dejar esto por un tiempo] (- print (PrintTimeOfDaySpanish) {something}; -).] [ -------------------------------------------------------------------------------------------------------------------------- ] [ hasta aquí cualquier aventurero puede circular. Pasando esta linea, oh curioso joven,   no puedo asegurarte el regreso a la cordura.......] Part 5 - Redefinition of Language Template Section 1 - Asuntos preliminares Include (- ! ===================================================================== ! INFSP (Spanish Inform Library) ! ===================================================================== !        Author: INFSP Task Team !       Version: 0.9 !      Released: 3 - Mayo - 2008 ! Serial Number: 805.3 Message "^Compilando con Spanish: Mensajes y rutinas de idioma [INFSP 0.9]"; ! Chekeo de correcta extension I7 instalada en correcta Build de I7 Message "   Asegurate de estar corriendo I7 Build 5U92^"; Array  buffer_nversion string 7;    ! infsp debug: Buffers for cheking I7 IDE correct version Array  buffer_bversion string 7;    ! See LanguageInitialise, below. Constant NI_NEEDED_VERSION "5U92"; ! --------------------------------------------------------------------------- !   Parte I.   Asuntos preliminares ! --------------------------------------------------------------------------- !infsp debug : check correct I7 Build Version #ifdef DEBUG; [ LanguageInitialise    ;   if ( ~~CheckI7version() ){    print "^^^ INFSP ATENCION : Este juego fue compilado con una version distinta de     Inform.^                   Asegurate de compilar con la ";    ImprimeTodoElBuffer(buffer_nversion);    print ". ^^^"; !     deadflag = 3; !     quit;   } !     deadflag = 2; ]; [ CheckI7version   l i; !  print "^ CheckI7version: ^";  l = VM_PrintToBuffer(buffer_nversion, 4, NI_NEEDED_VERSION);  l = VM_PrintToBuffer(buffer_bversion, 4, NI_BUILD_COUNT);  ! comparar caracter x caracter:  for (i=WORDSIZE:ii ~= buffer_nversion->i) rfalse;  rtrue; ]; #endif; ! DEBUG Constant LanguageVersion = "  * Librería I6 Española [INFSP 0.9/809.15], basada en InformATE! *"; ! Definición de caractéres "baratos". Esto permite que estas letras ! ocupen menos bits en la máquina Z. No funciona si se intenta la ! compilación por módulos (viejo método) #ifdef TARGET_ZCODE;  Zcharacter 'á';                    ! a con acento  Zcharacter 'é';                    ! e con acento  Zcharacter 'í';                    ! i con acento  Zcharacter 'ó';                    ! o con acento  Zcharacter 'ú';                    ! u con acento  Zcharacter 'ñ';                    ! n con virguilla  Zcharacter 'Ñ';                    ! N con virguilla  Zcharacter 'ü';                    ! u con dieresis  Zcharacter '¿';                    ! abrir interrogación  Zcharacter '¡';                    ! abrir exclamación #endif; !---------------------------------------------- ! CONSTANTES Y CLASES ESPECIFICAS DE INFORMATE !---------------------------------------------- !Constant G_MASCULINO = 0; !Constant G_FEMENINO  = 1; !Constant G_PLURAL    = 3; Constant G_MASCULINO = 1; ! infsp new approach: para hacerlo bicompatible: I6/I7 Constant G_FEMENINO  = 2; Constant G_PLURAL    = 2; Class VerboIrregular; !------------------------------------ ! Globales específicas de InformatE! !------------------------------------ global PreguntaCualExactamente = 0; ! Esta variable se pone a 1 cuando se le pregunta al jugador ¿Cuál ! exactamente...? esto indica que puede ser necesario re-traducir la ! respuesta que el jugador dé, ya que puede que simplemente el jugador ! cambie de idea y en lugar de responder a nuestra pregunta introduzca ! un comando completamente nuevo. global PreguntaSiNo = 0; ! Esta variable debe ponerse a 1 manualmente si queremos que el verbo ! 'no' sea accesible como respuesta (y no como punto cardinal). La ! variable sólo afecta a la siguiente respuesta del jugador y vuelve a ! hacerse cero automáticamente. !Global bandera_todo_vale; ! ¿y esta para qué sirve? Global quitacentos = 1; Array  texto_impreso --> 52; #ifndef NI_BUILD_COUNT; Global dialecto_sudamericano = 0; #ifnot;    #ifndef DIALECTO_SPANISH; ! seteado desde el I7 environment    Global dialecto_sudamericano = 0;    #endif; #endif; !--------------------------------------------------------------------------- ! Atributos y propiedades específicas de InformatE!, tambien usados en INFSP !--------------------------------------------------------------------------- !Property additive adjectives; Property gender 0; Property imperativo alias name; Property irrelevante alias name; !Property name_m alias name; !Property additive name_f; !Property additive name_fp; !Property additive name_mp; Property synomym_f; ! hace falta definirlos como 'common property', para que funcione bien la prueba (obj provides propiedad) Property synomym_fp; Property synomym_m; Property synomym_mp; #ifdef ADMITIR_COMANDO_SALIDAS_OFF;  Property salidas; #endif; Attribute nombreusado; ! usado internamente cuando se matchea el objeto por el nombre usado -) after "Definitions.i6t". Include (- ! Definicion de bufferaux y parseraux, usados en DictionaryLookup [001115] #ifdef TARGET_ZCODE;  Array bufferaux -> 123;  Array parseaux  buffer 63; #ifnot; ! TARGET_GLULX  Array  bufferaux    buffer INPUT_BUFFER_LEN;  Array parseaux  --> PARSE_BUFFER_LEN; #endif; ! TARGET_ ! Tremendo bug corregido. Antes usaba el buffer buf2, el cual usa ! tambien el parser para leer commandos incompletos del estilo de "¿a ! cual te refieres exactamente?" ! Este bug estaba en la libreria original, pero nunca aparecia porque ! apenas se usa DictionaryLookup. En cambio InformATE lo usa para ! comprobar si quitando la R a un verbo se obtiene una palabra válida. ! ! [Gracias a Presi por detectarlo] [ DictionaryLookup texto longitud    i; ! copiar texto a bufferaux (copiado especial) for (i=0:i(WORDSIZE+i) = texto->i; ! completar correctamente cabeceras de los buffers ! para la rutina Tokenise. #ifdef TARGET_ZCODE;  bufferaux->1 = longitud; !  bufferaux->0 = longitud;  bufferaux->0 = 120;  parseaux-> 0 = 1; #ifnot; ! TARGET_GLULX  bufferaux-->0 = longitud; #endif; ! TARGET_            if (parser_trace>=9) { ! infsp debug                print "    DictionaryLookup: texto a procesar: |";                  ImprimeTodoElBuffer(bufferaux);                print "|^";            }  VM_Tokenise(bufferaux,parseaux); ! procesar texto de bufferaux, el resultado está en parseaux-->1  return parseaux-->1; ! retornar address del token encontrado (-1 si falla) ]; -) before "Vocabulary" in "Language.i6t". Section 2 - Brujula Include (- Class CompassDirection with capacity 0, article "el", description [; L__M(##Look, 7, self); ],  has scenery; Object Compass "brújula" has concealed  female; -) instead of "Compass" in "Output.i6t". Section 3 - Vocabulary Include (- Constant AGAIN1__WD = 'repetir'; Constant AGAIN2__WD = 're'; Constant AGAIN3__WD = 'g//'; Constant OOPS1__WD    = 'oops'; Constant OOPS2__WD    = 'epa'; Constant OOPS3__WD    = 'eepa'; Constant UNDO1__WD  = 'undo'; Constant UNDO2__WD  = 'deshacer'; Constant UNDO3__WD  = 'anular'; Constant ALL1__WD    = 'todos'; Constant ALL2__WD    = 'todas'; Constant ALL3__WD    = 'todo'; Constant ALL4__WD    = 'ambos'; Constant ALL5__WD    = 'ambas'; Constant AND1__WD       = 'y//'; Constant AND2__WD       = 'y//'; Constant AND3__WD       = 'e//'; Constant BUT1__WD   = 'excepto'; Constant BUT2__WD   = 'menos'; Constant BUT3__WD   = 'salvo'; Constant ME1__WD      = '-me'; Constant ME2__WD      = '-te'; Constant ME3__WD      = '-se'; Constant OF1__WD      = '.de';       ! no usados nunca, pues provocan Constant OF2__WD      = '.de';       ! interferencia con la preposición "de" Constant OF3__WD      = '.de';       ! usada por algunos verbos, como en Constant OF4__WD      = '.de';       ! "saca objeto de la caja" Constant OTHER1__WD    = 'otro'; Constant OTHER2__WD    = 'otra'; Constant OTHER3__WD    = 'otro'; Constant THEN1__WD = 'ydespues'; Constant DESPUES11_WD = 'despues'; Constant THEN2__WD = 'yluego'; Constant DESPUES21_WD = 'luego'; Constant THEN3__WD = 'yentonces'; Constant DESPUES31_WD = 'entonces'; Constant NO1__WD      = 'n//'; Constant NO2__WD      = 'no'; Constant NO3__WD      = 'no'; Constant YES1__WD      = 's//'; Constant YES2__WD      = 'si'; Constant YES3__WD      = 'sí'; Constant AMUSING__WD = 'curiosidades'; Constant FULLSCORE1__WD  = 'puntuacion'; Constant FULLSCORE2__WD  = 'punt'; Constant QUIT1__WD    = 'q//'; Constant QUIT2__WD    = 'terminar'; Constant RESTART__WD    = 'reiniciar'; Constant RESTORE__WD    = 'recuperar'; -) instead of "Vocabulary" in "Language.i6t". Section 4 - Pronouns and Descriptors Include (- Array LanguagePronouns table !   palabra  GNAs que pueden                conectado !            seguirle:                      a: !              a     i !              s  p  s  p !              mfnmfnmfnmfn    '-lo' $$101000100001                    NULL    '-los' $$000101000101                    NULL    '-la' $$010000010000                    NULL    '-las' $$000010000010                    NULL    '-le' $$110000110000                    NULL    '-les' $$000110000110                    NULL    'él' $$100000100000                    NULL    'ella' $$010000010000                    NULL    'ellos' $$000100000100                    NULL    'ellas' $$000010000010                    NULL; -) instead of "Pronouns" in "Language.i6t". Include (- Array LanguageDescriptors table    !palabra  GNAs que pueden     tipo de   conectado    !              seguirles:  descriptor:       con:    !          a     i    !          s  p  s  p    !          mfnmfnmfnmfn                     'mi' $$110110110110    POSSESS_PK      0    'este' $$100000100000    POSSESS_PK      0    'estos' $$000100000100    POSSESS_PK      0    'esta' $$010000010000    POSSESS_PK      0    'estas' $$000010000010    POSSESS_PK      0    'ese' $$100000100000    POSSESS_PK      1    'esa' $$010000010000    POSSESS_PK      1    'esos' $$000100000100    POSSESS_PK      1    'esas' $$000010000010    POSSESS_PK      1    'su' $$110000110000    POSSESS_PK      '-le'    'sus' $$000110000110    POSSESS_PK      '-le'    'el' $$100000100000    DEFART_PK       NULL    'la' $$010000010000    DEFART_PK       NULL    'los' $$000100000100    DEFART_PK       NULL    'las' $$000010000010    DEFART_PK       NULL    'un' $$100000100000    INDEFART_PK     NULL    'una' $$010000010000    INDEFART_PK     NULL    'unos' $$000100000100    INDEFART_PK     NULL    'unas' $$000010000010    INDEFART_PK     NULL    'algún' $$100000100000    INDEFART_PK     NULL   'algunos' $$000100000100    INDEFART_PK     NULL   'algunas' $$000010000010    INDEFART_PK     NULL 'encendido' $$100000100000    light             NULL 'encendida' $$010000010000    light             NULL 'encendidos' $$000100000100    light             NULL 'encendidas' $$000010000010    light             NULL   'apagado' $$100000100000    (-light)          NULL   'apagada' $$010000010000    (-light)          NULL  'apagados' $$000100000100    (-light)          NULL  'apagadas' $$000010000010    (-light)          NULL; -) instead of "Descriptors" in "Language.i6t". Section 5 - Numbers Include (- Array LanguageNumbers table    'un' 1 'uno' 1 'una' 1 'dos' 2 'tres' 3 'cuatro' 4 'cinco' 5    'seis' 6 'siete' 7 'ocho' 8 'nueve' 9 'diez' 10    'once' 11 'doce' 12 'trece' 13 'catorce' 14 'quince' 15    'dieciséis' 16 'diecisiete' 17 'dieciocho' 18 'diecinueve' 19    'veinte' 20; [ LanguageNumber n venti m;    if (n==0) { print "cero"; rfalse; }    if (n<0) { print "menos "; n=-n; }    if (n>=1000) {        if (n<2000) print "mil";        else { LanguageNumber(n/1000,1); print " mil";}        n=n%1000;        if (n~=0) print " ";    }    if (n>=100)  {     CientosEspanol(n/100);         if (n%100~=0) print " ";     n=n%100;    }    if (n==0) rfalse;    if (n<10) { DigitoEspanol(n); rfalse;    }    if (n>=20) {  m=n/10;            if (n%10~=0) {              if (m==2) print "veinti";            } else {              if (m==2) print "veinte";            }            if (m==3) print "treinta";    if (m==4) print "cuarenta";            if (m==5) print "cincuenta";            if (m==6) print "sesenta";            if (m==7) print "setenta";            if (m==8) print "ochenta";            if (m==9) print "noventa";            if (n%10==0) rfalse;            if (m>2) print " y ";            DigitoEspanol(n%10, (m==2)&&(venti==0)); rfalse;        }    if (n==10) { print "diez"; rfalse; }    if (n==11) { print "once"; rfalse; }    if (n==12) { print "doce"; rfalse; }    if (n==13) { print "trece"; rfalse; }    if (n==14) { print "catorce"; rfalse; }    if (n==15) { print "quince"; rfalse; }    if (n==16) { print "dieciséis"; rfalse; }    if (n==17) { print "diecisiete"; rfalse; }    if (n==18) { print "dieciocho"; rfalse; }    print "diecinueve"; ]; [ DigitoEspanol n venti;    if (n==1) { print "un"; rfalse; }    if (n==2) {         if (venti) {print "dós";} else {print "dos"; };         rfalse; }    if (n==3) {         if (venti) {print "trés";} else {print "tres"; };         rfalse; }    if (n==4) { print "cuatro"; rfalse; }    if (n==5) { print "cinco"; rfalse; }    if (n==6) {         if (venti) {print "séis";} else {print "seis"; };         rfalse; }    if (n==7) { print "siete"; rfalse; }    if (n==8) { print "ocho"; rfalse; }    if (n==9) { print "nueve"; rfalse; } ]; [ CientosEspanol n; if (n==1) { print "ciento"; rfalse; } if (n==2) { print "dos";} if (n==3) { print "tres";} if (n==4) { print "cuatro";} if (n==5) { print "quinientos"; rfalse;} if (n==6) { print "seis";} if (n==7) { print "sete";} if (n==8) { print "ocho";} if (n==9) { print "nove";} print "cientos"; rfalse; ]; -) instead of "Numbers" in "Language.i6t". Section 5 - Directions [Include (- [ LanguageDirection d; ! [INFSP] Se agregaron los articulos, para una correcta impresion.    switch(d)          !         Usado en PrintCommand y en Salidas. {   n_to: print "al norte";     s_to: print "al sur";     e_to: print "al este";     w_to: print "al oeste";     ne_to: print "al nordeste";     nw_to: print "al noroeste";     se_to: print "al sudeste";     sw_to: print "al suroeste";     u_to: print "arriba";     d_to: print "abajo";     in_to: print "dentro";     out_to: print "fuera";     default: return RunTimeError(9,d);    } ]; -) instead of "Directions" in "Language.i6t". ] Section 6 - Translation Include (- ! --------------------------------------------------------------------------- !   Parte III.   Traducción ! --------------------------------------------------------------------------- !------------------------------------ ! Funciones de ayuda a la depuración !------------------------------------ [ ImprimeBuffer b desde l i;    for (i=desde:ii; ]; [ ImprimeTodoElBuffer b; #ifdef TARGET_ZCODE;   ImprimeBuffer(b, 2, b->1); #ifnot; !TARGET_GLULX   ImprimeBuffer(b, WORDSIZE, b-->0); #endif; ]; #ifdef TARGET_GLULX; ! TARGET_GLULX [ PasarAMinuscula buffer   ! [INFSP] Necesario en EspanolAInformes (en modo Glulx), para q el buffer        i;                          !         sea reconocido (al usar infinitivo en mayuscula (EXAMINAR) o verbos pronominales (EXAMINALA)    for (i=WORDSIZE:i<(WORDSIZE+(buffer-->0)):i++)        buffer->i = VM_UpperToLowerCase (buffer->i);    return buffer; ]; #endif; !TARGET_ !---------------------------------------------------------------- ! [010515] Rutina nueva, que recibe una palabra de diccionario y un ! lugar donde buscar, y retorna "true" si alguno de los objetos de ese ! lugar tiene esa palabra en su campo nombre, name_f... ! ! Es usada por la rutina ArreglarLosY, pues se mira si la palabra que ! viene detrás de la Y es un nombre, y si lo es, si es aplicable a algún ! objeto cercano. Observar que fallará en los objetos que proporcionen ! su propio parse_name. !---------------------------------------------------------------- [ EncajeSimplon w donde i;  objectloop(i in donde) {    if (WordInProperty(w, i, name)) rtrue;    if (i provides synomym_f)    if (TextInProperty (i,synomym_f,w)==1) rtrue;    if (i provides synomym_fp)   if (TextInProperty (i,synomym_fp,w)==1) rtrue;    if (i provides synomym_m)   if (TextInProperty (i,synomym_m,w)==1) rtrue;    if (i provides synomym_mp)  if (TextInProperty (i,synomym_mp,w)==1) rtrue; !    if (WordInProperty(w, i, name_f)) rtrue; !    if (WordInProperty(w, i, name_mp)) rtrue; !    if (WordInProperty(w, i, name_fp)) rtrue; !    if (WordInProperty(w, i, adjectives)) rtrue;    if (children(i) && EncajeSimplon(w, i)) rtrue;  }  rfalse; ]; ! ---------------------------------------------------------------------------- !  Las siguientes pueden ser útiles para los programadores de los !  ficheros de definición de lenguaje ! ---------------------------------------------------------------------------- [ BorrarBuffer b p i; ! infsp TODO : esta funcion no se usa, la borramos?    ! Rellena con espacios el buffer    for (i=2:ii=' ';    VM_Tokenise(b, p); ]; !---------------------------------------------------------------- ! QuitarAcentos ! ! La siguiente función prueba a quitar los acentos de las palabras que ! no hayan podido ser interpretadas. De este modo, el jugador puede usar ! o no los acentos. Para ello el juego debe definir las palabras sin acentos ! por ejemplo: ! object sillon "sillón confortable" ! with name 'sillon' 'confortable' ! ! Si el jugador pone: "mira sillon", la palabra encaja directamente y es ! comprendida. Si pone "mira sillón", no es comprendida, de modo que se ! le quita el acento y se reintenta el parsing. ! ! Este caso no es especialmente importante, pues el programador ! siempre puede definir 'sillon' y 'sillón', ambos como nombres para ! el objeto. Pero el asunto es más importante para el caso de los ! verbos, ya que si el jugador teclea "cógelo" este es separado en ! "cóge" y "-lo" y el verbo "cóge" (con acento) no sería ! comprendido. ! ! La llamada a esta función puede desactivarse con el comando de ! debugging "acentos sí" de modo que los acentos que teclee el jugador ! no serán eliminados (con propósitos de depuración) [ QuitarAcentos buf pars x i word at len;    if (parser_trace >= 7) ! imprimir el buffer recibido    {          print "^[ QuitarAcentos:  ";          print "Buffer recibido: |";             ImprimeTodoElBuffer(buf);          print "|^";    }    VM_Tokenise(buf, pars);    for (x=1:x<=tokenCount(pars):x++) ! para cada token    { word = tokenDict (pars,x); !dictionary value of token 1,2,3... at = tokenPos (pars,x); ! position in buffer of token 1,2,3... len = WordLength (x);! length in chars of token 1,2,3... if (word==0) ! no comprendida       { if (parser_trace>=7) {    print "    QuitarAcentos:NO COMPRENDIDO: |"; ImprimeBuffer(buf, at, len);    print "|^"; } for (i=at:ii)  { 'á': buf->i='a'; 'é': buf->i='e'; 'ë': buf->i='e'; 'í': buf->i='i'; 'ó': buf->i='o'; 'ú': buf->i='u'; 'ü': buf->i='u'; 'ñ': buf->i='n'; !             '?': buf->i=' '; !             '¿': buf->i=' '; !             '!': buf->i=' '; !         '¡': buf->i=' ' ;       }        VM_Tokenise(buf, pars);        }    }    if (parser_trace>=7){        print "    Buffer sin acentos: |";        ImprimeTodoElBuffer(buf);        print "|^";    } ]; ! funciones de soporte para gestionar parse y buffer !  From InformFAQ - Roger Firth [ tokenDict pars w; ! dictionary value of token 1,2,3... #Ifdef TARGET_ZCODE; return pars-->(2*w - 1); #Ifnot; ! TARGET_GLULX return pars-->(3*w - 2); #Endif; ! TARGET_ ]; [ tokenLen pars w; ! length in chars of token 1,2,3... #Ifdef TARGET_ZCODE; return pars->(4*w); #Ifnot; ! TARGET_GLULX return pars-->(3*w - 1); #Endif; ! TARGET_ ]; [ tokenPos pars w; ! position in buffer of token 1,2,3... #Ifdef TARGET_ZCODE; return pars->(4*w + 1); #Ifnot; ! TARGET_GLULX return pars-->(3*w); #Endif; ! TARGET_ ]; [ tokenCount pars; #Ifdef TARGET_ZCODE; return pars->1; #Ifnot; ! TARGET_GLULX return pars-->0; #Endif; ! TARGET_ ]; !----------------------------------------------------- ! LanguageToInformese ! ! Esta parte es interesante. Debe separar los sufijos pronominales ! como en "cogela" "mirale", claro que no basta con ver si las dos ! últimas letras del verbo son "la" "le", etc, pues el verbo podría ! terminar de forma "natural" en esas letras (como en "habla"). Así ! que hay que separar el sufijo sólo si el verbo no ha sido hallado en ! el diccionario. ! [ LanguageToInformese ;    EspanolAInformes(buffer, parse); ]; ! La función que verdaderamente hace la traducción es la siguiente. Ha ! sido separada de LanguageToInformese porque es llamada también desde ! LanguageIsVerb, pero recibe un buffer diferente para procesar. [ EspanolAInformes buf pars x i word at len romper_en siguiente retokenise at2; !    print "   EspanolAInformes called^"; ! infsp debug     #ifdef TARGET_GLULX; ! TARGET_GLULX    buf = PasarAMinuscula (buf); ![INFSP] Necesario para q no cazque al procesar infinitivos #endif;    VM_Tokenise( buf, pars);     retokenise=0;    if (parser_trace>=7) !imprimir el buf recibido    {          print "^[ EspanolAInformes:  ";          print "Buffer recibido: |"; ImprimeTodoElBuffer(buf);          print "|^  ";    }    if (quitacentos) QuitarAcentos(buf, pars);     for (x=1:x<=tokenCount(pars):x++) ! para cada token    { word = tokenDict (pars,x); !dictionary value of token 1,2,3... at = tokenPos (pars,x); ! position in buffer of token 1,2,3... len = tokenLen (pars,x);! length in chars of token 1,2,3... if (parser_trace>=7){          print "Palabra ",x," : ";          if (word==0)            print "";          else            print (address) word," ^";          print " ^";        }         if (dialecto_sudamericano && (word == 'coge')) {  ! Un poco bestia, pero funciona. En caso de dialecto sudamericano,  ! cambiar un par de letras convierte "coge" en "jode"  buf->(at)     = 'j';  buf->(at + 2) = 'd';  retokenise    = 1;  if (dialecto_sudamericano == 1)  ! [071030_git]  {    print "[Este juego utiliza por defecto el dialecto sudamericano,    por lo que aquí COGER es entendido como una palabra    malsonante. Por favor, utiliza TOMAR en su lugar, o bien    elige el dialecto castellano con DIALECTO CASTELLANO.]^";    dialecto_sudamericano = 2;  } }    if (word=='del' or 'al')    {        buf->(at+len-1)=' ';    ! convertir "del" "al" en "de"                                       ! "a" respectivamente        retokenise=1;    }    ! Si el jugador ha escrito "no", y previamente el programador    ! había puesto a 1 el flag "PreguntaSiNo" (que indica que    ! acaba de hacerse una pregunta que podría admitir NO como    ! respuesta), en ese caso cambiamos "no" por "xo". La    ! gramática define el verbo "xo" para generar la acción NO    ! (negar), y así lo distinguimos de la acción "Ir noroeste"    if ((word=='no')&&(PreguntaSiNo==1))    {        buf->(at+len-1)='x';        PreguntaSiNo=0;        retokenise=1;    }        ! "pegar" las expresiones "y luego" "y despues" "y entonces"        ! para que queden "yluego" "ydespues" "yentonces"        ! que es como las reconoce el parser     if (word=='y//')    {       siguiente= tokenDict (pars,x+1); ! palabra siguiente if (siguiente==DESPUES11_WD or DESPUES21_WD or DESPUES31_WD)       {   at2 = tokenPos (pars,x+1); ! position in buffer of token 1,2,3...           for (i=0:i(at2+i) = ' '; ! borrar palabra 'entonces' (pisándola con espacios)   }           buf->(at+len)='l'; ! agregar 'luego' inmediatamente despues de 'y', formando 'yluego'           buf->(at+len+1)='u';           buf->(at+len+2)='e';           buf->(at+len+3)='g';           buf->(at+len+4)='o';           retokenise=1;           if (parser_trace>=7) !imprimir el buf recibido   { print "^[   YLUEGO:  "; print "Buffer recibido: |"; ImprimeTodoElBuffer(buf); print "|^  ";    }       }    }     if (word==0) ! no comprendida    {        if (parser_trace>=7)        {            print "NO COMPRENDIDO: |";            ImprimeBuffer(buf, at, len);            print "|^";        }        if (len > 2) !sólo si tiene más de tres letras        {           romper_en=0;           if ((buf->(at+len-1)=='s') &&            (buf->(at+len-2)=='a' or 'o' or 'e') &&            (buf->(at+len-3)=='l'))            romper_en=3;           if ((buf->(at+len-1)=='a' or 'o' or 'e') &&            (buf->(at+len-2)=='l'))            romper_en=2;           if ((buf->(at+len-1)=='e') &&            (buf->(at+len-2)=='m' or 't' or 's'))            romper_en=2;  ! [001108] Antes ponía == ¡seré burro!           if (romper_en)           {            ! [990524]            ! Antes de modificar el buffer, comprobemos si            ! servirá para algo, es decir, si la palabra que            ! queda una vez separado el sufijo existe en el            ! diccionario y es un verbo            i=DictionaryLookup(buf+at, len-romper_en);              if (i) if ((i->#dict_par1)&1)              {                LTI_Insert(at+len-romper_en, '-', buf);                LTI_Insert(at+len-romper_en, ' ', buf);                VM_Tokenise(buf,pars);               }              if (QuitandoRFinal(buf+at, len-romper_en)||                  BuscarEntreVerbosIrregulares(buf+at, len-romper_en))              {                LTI_Insert(at+len-romper_en, '-', buf);                LTI_Insert(at+len-romper_en, ' ', buf);                VM_Tokenise(buf,pars);               }             } ! if (romper_en        } ! if (len > 2    } ! if (word==0    } ! for (x=0:    if (retokenise==1) ! [INFSP] Agregado if, como en la seccion Glulx       VM_Tokenise(buf, pars);    ArreglarLosY(buf, pars);    ! Como paso final, quitamos las palabras que aparezcan dos veces    ! seguidas. Esto puede ocurrir si el jugador teclea un comando    ! incompleto, como "MIRA HACIA", y el parser le pregunta "¿Hacia    ! donde quieres mirar?" y el jugador responde "HACIA EL NORTE". En    ! este caso se construiría la orden concatenada: "MIRA HACIA HACIA    ! EL NORTE".    if (PreguntaCualExactamente==1){        PreguntaCualExactamente=0;        EliminarDuplicados(buf, pars);    }    if (parser_trace>=7){       print "Buffer traducido a informese: ^|";        ImprimeTodoElBuffer(buf);       print "| (", pars->1," palabras) ^";    } ]; [ ArreglarLosY buf pars    word at len x i retoke;    for (x=1:x<=tokenCount(pars):x++) ! para cada token    { word = tokenDict (pars,x); !dictionary value of token 1,2,3...        if (word=='y//') { i = tokenDict (pars,x+1); ! palabra siguiente        ! [010515] arreglado bug. at y len no apuntaban a la        ! palabra siguiente, sino a la propia 'y', por lo que no        ! eran reconocidos los verbos en infinitivo at = tokenPos (pars,x+1); ! position in buffer of token siguiente len = tokenLen (pars,x+1);! length in chars of token siguiente        ! [010515] Añadido. Si la palabra es noun, se retorna        ! (aunque pueda ser también un verbo) de este modo, en        ! COGE VINO Y CAVA, si el juego tiene un objeto llamado        ! "cava", la frase será parseada como tratando de coger        ! dos objetos, llamados "vino" y "cava". Si el juego no        ! define el sustantivo "cava", la frase será parseada como        ! dos acciones en secuencia <> y <> if (i && (i->#dict_par1)&128) { if (EncajeSimplon(i, location)) continue; } if (i && ((i->#dict_par1)&1)||QuitandoRFinal(buf+at,len)|| BuscarEntreVerbosIrregulares(buf+at, len)) { at = tokenPos (pars,x); ! position in buffer of token siguiente buf->(at)='.'; retoke=true; } }    }    if (retoke) VM_Tokenise(buf, pars); ]; [ EliminarDuplicados buf pars    word at len x i siguiente retokenise; !    VM_Tokenise(buf, pars);    if (parser_trace>=8) !imprimir el buffer recibido    {          print "^[ EliminarDuplicados:  ";          print "Buffer recibido: |";              ImprimeTodoElBuffer(buf);          print "| (", pars->1, " palabras)^";    }    for (x=1:x<=tokenCount(pars):x++) ! para cada token    { word = tokenDict (pars,x); !dictionary value of token 1,2,3... siguiente = tokenDict (pars,x+1); !dictionary value of token 1,2,3... at = tokenPos (pars,x); ! position in buffer of token 1,2,3... len = tokenLen (pars,x);! length in chars of token 1,2,3...    if ((word==siguiente) && (word~=0))    {        if (parser_trace>=8) print "Encontrados duplicados!:", (address) word, "=", (address) siguiente, ".^";        for (i=at:ii=' ';        retokenise=1;    }    }    if (retokenise)    VM_Tokenise(buf, pars);    if (parser_trace>=8) !imprimir el buffer recibido    {          print "Buffer resultante: |";        ImprimeTodoElBuffer(buf);          print "| (", pars->1, " palabras)^";    } ]; ! La siguiente función debe devolver si el verbo recibido es ! reconocido o no. Se recibe el buffer completo y "pos" indica qué ! palabra dentro del buffer "pars" es el supuesto verbo. ! Hay que devolver la dirección de diccionario del verbo en cuestión. ! ! Lo usamos para admitir infinitivos. El método es: !   Si la palabra corresponde a una palabra de diccionario, no hacemos !   nada (retornamos esa palabra, sin molestarnos en comprobar que sea !   un verbo. Ya lo hará el parser). ! !   Si la palabra no está en el diccionario, miramos si termina en !   'r', y de ser así se la quitamos y re-tokenizamos. Si de este modo !   se obtiene una palabra en el diccionario, retornamos su valor (sin !   comprobar que sea un verbo, ya lo hará el parser). ! !   Si tampoco de este modo se reconoce, comparamos la palabra dada !   con todos los verbos irregulares conocidos. Si en uno de ellos !   encontramos coincidencia, retornamos el primer elemento de la !   propiedad "imperativo" del verbo en cuestión. ! !   En el caso de la desambiguacion, puede darse que el jugador responda !   con un verbo nuevo, pero con sufijo pronominal la/le/lo/me/te/se (ej. examinala) !   Por ello se hace una llamada a EspanolAInformes [ LanguageIsVerb buf pars pos    i word at len;    if (parser_trace>=7) !imprimir el buffer recibido    { print "^[ LanguageIsVerb:  "; print "Buffer recibido: |"; ImprimeTodoElBuffer(buf); print "|, pos=", pos, "^  ";    }    if (PreguntaCualExactamente) ! caso de desambiguación EspanolAInformes(buf, pars); ! revisar la existencia de sufijos pronominales la/le/lo/me/te/se    word = tokenDict (pars,pos); !dictionary value of token 1,2,3...    at = tokenPos (pars,pos); ! position in buffer of token 1,2,3...    len = tokenLen (pars,pos);! length in chars of token 1,2,3...    ! Si la palabra se reconoce, devolverla sin más     if (word~=0 && word->#dict_par1 & 1 ~= 0)    { if (parser_trace>=7) print " la palabra ~", (address) word, "~ está en el diccionario.^"; return    (word);    }    ! Si no, probar a ver si se reconoce sin la 'r' final    i=QuitandoRFinal(buf + at,len);    ! Si no la ha reconocido, intentamos ver si es un verbo irregular    if (i~=0)    { if (parser_trace>=7) print "^ Verbo reconocido al quitarle la 'r' final.^";    }    else    { if (parser_trace>=7) print "^ Verbo no reconocido sin la 'r'. ^Probando irregulares..."; i=BuscarEntreVerbosIrregulares(buf + at,len); if (parser_trace>=7) { if (i==0) print "No reconocido como irregular.^"; else print "      Reconocido como el verbo ", (address) i, "^"; }    }     if (parser_trace>=7)        print " ^                   -- end LanguageIsVerb ]^";    return i;     ]; [ QuitandoRFinal texto longitud    i;    if (parser_trace>=9) { print "^[ QuitandoRFinal: buffer recibido |"; ImprimeBuffer(texto, 0, longitud); print "|^";    }     if (texto->(longitud-1)~='r')    { if (parser_trace>=9) print "No termina en 'r'^"; return 0;    }    i=DictionaryLookup(texto, longitud-1);     if (dialecto_sudamericano && (i == 'coge'))    {      if (dialecto_sudamericano == 1)  ! [071030] git      {        print "[Este juego utiliza por defecto el dialecto sudamericano,                por lo que aquí COGER es entendido como una palabra                malsonante. Por favor, utiliza TOMAR en su lugar, o bien                elige el dialecto castellano con DIALECTO CASTELLANO.]^";        dialecto_sudamericano = 2;      }      return 'jode';    }     if ((i->#dict_par1)&1) return i;    else    {    if (parser_trace>=9) print "Está en el diccionario, pero no es verbo.^";    return 0;    } ]; [ BuscarEntreVerbosIrregulares texto longitud    verbo i k;    objectloop (verbo ofclass VerboIrregular)    { if (parser_trace>=8) print "^[Bucando irregulares. Probando con ~", (name) verbo, "~.-->"; k = VM_PrintToBuffer (texto_impreso,46,verbo);        !Si sus longitudes no coinciden no es necesario seguir comparando        if (k~=longitud) jump NoCoincide;        !Si sus longitudes coinciden, miramos letra a letra        for (i=0:ii)~=(texto_impreso->(i+WORDSIZE))) jump NoCoincide; ! si una sola letra no coincide, ! Si ha pasado los test anteriores, hemos hallado una ! coincidencia if (parser_trace>=8) print "¡coincide!^"; return (verbo.&imperativo-->0); .NoCoincide; if (parser_trace>=8) print "no coincide^";    }    return 0; ]; -) instead of "Translation" in "Language.i6t". Section 7 - Articles Include (- Constant LanguageAnimateGender   = male; Constant LanguageInanimateGender = male; Constant LanguageContractionForms = 1;     ! Para el español ! No se produce contracción del artículo. Sólo de las preposiciones ! como en "del" y "al", pero eso no está contemplado por el manual ! del traductor, por lo que es necesario otro tipo de truco [ LanguageContraction ;    return 0; ]; Array LanguageArticles -->    ! Forma de contracción 0:    ! Cdef   Def  Indef      "El " "el " "un "        "La " "la " "una "       "Los " "los " "unos "      "Las " "las " "unas ";                   !             a           i                   !             s     p     s     p                   !             m f n m f n m f n m f n                  Array LanguageGNAsToArticles --> 0 1 0 2 3 2 0 1 0 2 3 2; -) instead of "Articles" in "Language.i6t". Section 8 - Commands Include (- [ LanguageVerb i aux;    if (ImprimirIrregular(i)==0){        !print "^   LanguageVerb: Verbo no es irregular.^"; ! infsp debug      ! Tatar de matchear con la brújula - 807.7 infsp      objectloop (aux ofclass CompassDirection){        if (WordInProperty(i, aux, name)) {          print "ir hacia algún lado"; !          !LanguageDirection (aux.door_dir); ! the direction name as adverb          rtrue; ! no avanzar más en la rutina        }           }       ! Un ultimo intento, con una rutina stub a proveer por el autor       if (PrintVerb(i)==0){         print (address) i; print "r";        }    }    if (i=='mete') rtrue; #ifdef TARGET_ZCODE;    ! Comprobemos si era un verbo reflexivo (-te)    texto_impreso-->0 = 50;    @output_stream 3 texto_impreso;    print (address) i;    @output_stream -3;    aux=2; !    print "^   LanguageVerb: i : ",(address) i,"^"; ! infsp debug    if (texto_impreso->(texto_impreso->1+1)=='e')     if (texto_impreso->(texto_impreso->1) == 't' or 's' or 'm')     { !     print "^   LanguageVerb:Verbo reflexivo."; ! infsp debug       if (actor ~= player) print "se";        else print (string) PARTICULA_TE; ! "te"     } #endif; #ifdef TARGET_GLULX;    aux=Glulx_PrintAnyToArray(texto_impreso, 50, i);    if ((texto_impreso->(aux-1)=='e')&&        (texto_impreso->(aux-2) == 't' or 's' or 'm'))    {       if (actor ~= player) print "se";        else print (string) PARTICULA_TE;    } #endif;    rtrue; ]; [ ImprimirIrregular v i;  ! Imprime los verbos irregulares (es decir, aquellos en los que no basta  ! añadir una "r" al imperativo). Por ejemplo, si el jugador teclea "friega"  ! la respuesta por defecto sería "¿Qué quieres friegar?"  ! Para evitar esto, el programador debe definir un objeto de la clase  ! VerboIrregular, con nombre "fregar" y propiedad name = "friega"  ! Esta rutina busca entre los verbos así definidos, en el campo name  ! y si encuentra una coincidencia imprime el nombre del objeto para  ! el cual se halló.  ! Para mayor flexibilidad aún, se permite que el programador incluya  ! una rutina en la propiedad nombre_corto del verbo, por si el nombre  ! del verbo a imprimir es variable según el momento en que se llame.  ! Si existe nombre_corto para el verbo en cuestión, se ejecuta dicha rutina  ! de lo contrario se imprime el nombre de ese verbo sin más.  ! Ver SpanishG.h para ejemplos de declaración de verbos irregulares.  objectloop (i ofclass VerboIrregular)   if (WordInProperty(v, i, imperativo)) {     if (i.&short_name~=0) return(PrintOrRun(i, short_name, 1));     else { print (name) i; rtrue;}}  rfalse; ]; !  LanguageVerbLikesAdverb is called by PrintCommand when printing an UPTO_PE !  error or an inference message.  Words which are intransitive verbs, i.e., !  which require a direction name as an adverb ('walk west'), not a noun !  ('I only understood you as far as wanting to touch /the/ ground'), should !  cause the routine to return true. [ LanguageVerbLikesAdverb w;    if (w == 'vete' or 've' or 'camina' or        'anda' or 'corre' or 'vuelve' or 'ir')        rtrue;    rfalse; ]; !  LanguageVerbMayBeName is called by NounDomain when dealing with the !  player's reply to a "Which do you mean, the short stick or the long !  stick?" prompt from the parser. If the reply is another verb (for example, !  LOOK) then then previous ambiguous command is discarded /unless/ !  it is one of these words which could be both a verb /and/ an !  adjective in a 'name' property. [ LanguageVerbMayBeName w;    if (w == 'long' or 'short' or 'normal'                    or 'brief' or 'full' or 'verbose')        rtrue;    rfalse; ]; -) instead of "Commands" in "Language.i6t". Section 9 - Short Texts Include (- Constant NKEY__TX   = "S = Siguiente"; Constant PKEY__TX   = "    P=Previo"; Constant QKEY1__TX      = "Q=Volver al juego"; Constant QKEY2__TX      = "Q = Menú anterior"; Constant RKEY__TX       = "INTRO = leer este tema"; Constant NKEY1__KY  = 'S'; Constant NKEY2__KY  = 's'; Constant PKEY1__KY  = 'P'; Constant PKEY2__KY  = 'p'; Constant QKEY1__KY      = 'Q'; Constant QKEY2__KY      = 'q'; Constant SCORE__TX = "Punt.: "; Constant MOVES__TX    = "Movim.: "; Constant TIME__TX       = "Hora: "; Global CANTGO__TX         = "No puedes ir por ahí."; Global FORMER__TX         = "tu antiguo ~yo~"; Global YOURSELF__TX       = "ti mismo"; Constant YOU__TX            = "Tú"; Constant DARKNESS__TX  = "Oscuridad"; Constant PARTICULA_TE       = "te"; Constant THOSET__TX      = "esas cosas"; Constant THAT__TX        = "eso"; Constant OR__TX          = " o "; Constant NOTHING__TX       = "nada"; Global IS__TX             = " ves"; Global ARE__TX            = " ves"; Global IS2__TX            = "ves "; Global ARE2__TX           = "ves "; Global IS3__TX        = "ves"; Global ARE3__TX       = "ves"; Constant AND__TX          = " y "; #ifdef I7_SERIAL_COMMA; Constant LISTAND__TX   = ", y "; Constant LISTAND2__TX  = " y "; #ifnot; Constant LISTAND__TX   = " y "; Constant LISTAND2__TX  = " y "; #endif; ! I7_SERIAL_COMMA Constant WHOM__TX      = "que ";  ! Al parecer, aquí sobraban los espacios Constant WHICH__TX     = "que ";  ! de antes de los 'que'. [020423] Constant COMMA__TX      = ", "; -) instead of "Short Texts" in "Language.i6t". Section 10 - Printed Inflections Include (- ! Definimos una función para imprimir el verbo coger. Esto hace más fácil ! la adaptación de los juegos a los dialectos sudamericanos, en los ! que debe usarse "tomar" en lugar de "coger" ! ! La variable global que elige el dialecto se fija en tiempo de ! ejecución con el meta-verbo "dialecto". También puede fijarse en ! Initialize para que su valor por defecto sea 1. ! [ coge sufijo;    if (dialecto_sudamericano)      print "toma";    else print "coge";    if (sufijo ~= 0)       print (string) sufijo; !    #ifndef NI_BUILD_COUNT; print (string) sufijo;#endif; !desde I7 no puede usarse 'sufijo' ]; ! La siguiente es la versión con la primera letra mayúscula [ MCoge sufijo;    if (dialecto_sudamericano)    print "Toma";    else print "Coge";    if (sufijo ~= 0)       print (string) sufijo; !    #ifndef NI_BUILD_COUNT; print (string) sufijo;#endif; !desde I7 no puede usarse 'sufijo' ]; ! Y finalmente una versión con todo mayúsculas [ MMCoge sufijo;    if (dialecto_sudamericano)    print "TOMA";    else print "COGE";    if (sufijo ~= 0)       print (string) sufijo; !    #ifndef NI_BUILD_COUNT; print (string) sufijo;#endif; !desde I7 no puede usarse 'sufijo' ]; -) before "Printed Inflections" in "Language.i6t". Include (- ! Funciones para manejar concordancias de género y número en los ! mensajes de respuesta genéricos. ! ! o -> escribe la terminación -o -a -os -as según el género y número ! del objeto recibido, para hacer concordar los adjetivos. ! ! n -> escribe la terminación -"" -n según el número del objeto, para ! hacer concordar el verbo en plural. ! ! esta -> escribe "está" o "están" según el número del objeto. ! ! del -> escribe "del" "de la" "de los" "de las" según el género y ! número del objeto. En realidad, determina qué artículo habría de ir ! y si éste es "el" realiza la contracción "del". ! ! al -> como del, pero con "al" "a la" "a los" "a las". ! ! lo -> Escribe "lo" "la" "le" "los" "las" "les" (proname) según el ! género y número del objeto y según sea animate o no. ! [ o obj gna;    gna=GetGNAOfObject(obj);    switch(gna)    {     0,6: print "o";     1,7: print "a";     3,9: print "os";     4,10: print "as";    } ];     [ e obj gna;    gna=GetGNAOfObject(obj);    switch(gna)    {     0,6: print "e";     1,7: print "a";     3,9: print "es";     4,10: print "as";    } ]; [ n obj;    if (obj == player) print "s";    else if (obj has pluralname) print "n"; ]; [ s obj;    if (obj has pluralname) print "s"; ]; [ esta obj;    print "está", (n) obj; ]; [ es obj;    if (obj has pluralname) print "son";    else print "es"; ]; [ _Es obj;    if (obj has pluralname) print "Son";    else print "Es"; ]; [ _s obj;    if (obj has pluralname) print "es"; ]; [ el_ obj;    if (obj hasnt proper) PrefaceByArticle(obj,1,-1); ]; [ un_ obj;    if (obj hasnt proper) PrefaceByArticle(obj,2,-1); ]; [ el obj;    print (the) obj; ]; [ _El obj;    print (The) obj; ]; ![ un obj; !    if (un_(obj)) print " "; !    print (name) obj; !]; [ un obj; !  if (obj has proper) print "a "; ![infsp] ya se incluyó esta linea en el hackeo de Indefart.  print (a) obj; ]; [ _Un obj; ! indefinido con la primera letra en mayuscula. -Eliuk Blau  print (A) obj; ]; [ _nombre_ obj;    print (name) obj; ]; [ numero obj;    print (number) obj; ]; ! "al" y "del" plantean un bonito problema. La contracción debe ! producirse si el artículo es "el", pero esto no se sabe consultando ! el GNA, pues hay palabras como "aguila" que son femeninas y no ! obstante usan "el" como artículo. ! El truquillo consiste en llamar a (the) para averiguar qué artículo ! se imprimiría (pero capturando la salida de ese print y guardándola ! en una variable). Si el artículo en cuestión empieza por 'e', se ! produce la contracción. ! ! Para capturar la salida a una variable, es necesario descender al ! lenguaje ensamblador de la Z machine. Este truco lo aprendí del ! Designers manual (respuesta al ejercicio 96, página 249) ! [ del_ obj;    if (obj has proper) {        ! 030305            print "de ";            rtrue;    } !print " (del) "; ! infsp debug #ifdef TARGET_ZCODE;    texto_impreso-->0 = 50;    @output_stream 3 texto_impreso;    print (the)obj;    @output_stream -3;    if (texto_impreso->2 == 'e') print "d";    else print "de "; #ifnot; !TARGET_GLULX    Glulx_PrintAnyToArray(texto_impreso, 50, PrefaceByArticle, obj, 1, -1);    if (texto_impreso->0 == 'e') print "d";    else print "de "; #endif;        if (obj hasnt proper) PrefaceByArticle(obj, 1, -1); ]; ! Con "al" el truco es más complejo, ya que si el artículo impreso por ! el_ empieza por "e", hay que cambiar esta "e" por una "a". Y si no ! empieza por "e" hay que poner una "a" delante. ! Además debemos capturar el caso de que no se imprima artículo alguno ! (si el objeto proporciona una propiedad "articulos" con cadenas ! vacías). !------------------------------------------------------------------------------ ! ELIUK BLAU: He re-implementado la rutina para permitir que la primera letra ! se imprima en mayuscula si se activa el argumento 'flag' durante la llamada. [ al_ obj flag; ! ELIUK: 'flag' es usado solo por rutina de impresion (_Al)    #ifdef TARGET_ZCODE;      texto_impreso-->0 = 50;      @output_stream 3 texto_impreso;      print (the) obj;      @output_stream -3;      ! print "^  ";for (i=2:i<50:i++) print (char)texto_impreso->i;print "   "; ! infsp debug    #ifnot; !TARGET_GLULX      ! PrintAnyToArray(texto_impreso, 50, PrefaceByArticle, obj, 1, -1);      Glulx_PrintAnyToArray(texto_impreso, 50, Defart, obj);! 070809 infsp fix: corrige mal funcionamiento con Propios - gracias Eliuk      ! print "^  ";for (i=0:i<2:i++) print (char)texto_impreso->i;print "   "; ! infsp debug    #endif; !TARGET_    ! ELIUK: aqui se decide si se pone mayuscula o no    if (flag) { print "A"; } ! 'flag' activado    else { print "a"; }      ! 'flag' desactivado    ! ELIUK: completamos el resto del texto que se imprimira finalmente    #ifdef TARGET_ZCODE;      if (texto_impreso->2 == 'e') { print "l "; }      else {        print " ";        if (obj hasnt proper) { PrefaceByArticle(obj, 1, -1); }      }    #ifnot; !TARGET_GLULX      if (texto_impreso->0 == 'e') { print "l "; }      else {        print " ";        if (obj hasnt proper) { PrefaceByArticle(obj, 1, -1); }      }    #endif; !TARGET_ ]; [ del obj;    print (del_) obj;    print (name) obj; ]; [ al obj;    print (al_) obj;    print (name) obj; ]; ! ELIUK BLAU: Rutina de impresion "A", "Al", "A la", "A los", "A las" con la primera ! letra en mayuscula. Se usa como base el funcionamiento de la rutina al_() de INFSP. [ _Al obj;    al_(obj,1); ! con 1 se activa 'flag' para imprimir primera letra en mayuscula    print (name) obj;    ! NOTA: SI POSTERIORMENTE SE INTENTA MEJORAR ESTA RUTINA, JUNTO CON al_(),    ! LA SOLUCION JAMAS DEBE SER IMPRIMIR A UN BUFFER PORQUE LOS RESULTADOS    ! PUEDEN SER INESPERADOS. LA PROPIA al_() YA IMPRIME A UN BUFFER, ASI QUE    ! OTRO TRABAJO DEL MISMO TIPO IMPLICARIA TENER QUE CREAR UN NUEVO ARRAY    ! CON EL QUE TRABAJAR O USAR EL ARRAY COMUN StorageForShortName DE LA    ! PROPIA LIBRERIA INFORM. EN ESTE ULTIMO CASO ES CUANDO SE PRODUCEN LOS    ! PROBLEMAS... POR OTRO LADO: CREAR UN NUEVO ARRAY SOLO PARA QUE LO USE    ! ESTA RUTINA NO TIENE SENTIDO. POR ESO LA NECESIDAD DEL 'flag' EN al_() ]; [ lo obj gna;    gna=GetGNAOfObject(obj);    switch(gna)    {     0,6: print "lo";     1,7: print "la";     3,9: print "los";     4,10: print "las";    } ]; #ifdef NI_BUILD_COUNT; [ IsOrAre obj;  !I7 stuffs, in Verbs.i6/GenericVerbSub    if (obj == player)             { print "Eres"; return; }    if (obj has pluralname)        { print "Son"; return; }    print "Es"; ]; #endif; ! NI_BUILD_COUNT [ ThatorThose obj;      ! Used in the accusative    if (obj == player)            { print "you"; return; }    if (obj has pluralname)       { print "those"; return; }    if (obj has animate) {        if (obj has female)       { print "her"; return; }        else            if (obj hasnt neuter) { print "him"; return; }    }    print "that"; ]; [ ItorThem obj;    if (obj == player)            { print "yourself"; return; }    if (obj has pluralname)       { print "them"; return; }    if (obj has animate) {        if (obj has female)       { print "her"; return; }        else            if (obj hasnt neuter) { print "him"; return; }    }    print "it"; ]; ![ IsorAre obj; !    if (obj has pluralname || obj == player) print "are"; else print "is"; !]; [ HasorHave obj;    if (obj has pluralname || obj == player) print "have"; else print "has"; ]; [ CThatorThose obj;     ! Used in the nominative    if (obj == player)            { print "You"; return; }    if (obj has pluralname)       { print "Those"; return; }    if (obj has animate) {        if (obj has female)       { print "She"; return; }        else            if (obj hasnt neuter) { print "He"; return; }    }    print "That"; ]; [ CTheyreorThats obj;    if (obj == player)             { print "You're"; return; }    if (obj has pluralname)        { print "They're"; return; }    if (obj has animate) {        if (obj has female)        { print "She's"; return; }        else if (obj hasnt neuter) { print "He's"; return; }    }    print "That's"; ]; [ HisHerTheir o; if (o has pluralname) { print "their"; return; } if (o has female) { print "her"; return; } if (o has neuter) { print "its"; return; } print "his"; ]; [ HimHerItself o; if (o has pluralname) { print "theirselves"; return; } if (o has female) { print "herself"; return; } if (o has neuter) { print "itself"; return; } print "himself"; ]; -) instead of "Printed Inflections" in "Language.i6t". Section 11 - Long Texts - Mensajes de la libreria Include (- [ LanguageLM n x1 x2;  say__p = 1;  Answer, Ask : "No hay respuesta."; ! Ask:      see Answer  Attack:    "La violencia no es la solución.";  Burn:      "Con esa peligrosa acción no lograrías nada.";  Buy:       "No hay nada en venta.";  Climb:     "No creo que vayas a lograr nada así.";  Close:    switch(n)    { 1: print_ret "No es algo que pueda cerrarse."; 2: "Ya estaba", (n) x1, " cerrad", (o)x1, "."; 3: "Cierras ", (the) x1, "."; 4: print (The) actor, " cierra ", (the) x1, ".^"; 5: print (The) x1, " se cierra.^";    }  Consult: switch (n) { 1: "No descubres nada interesante en ", (the) x1," sobre ese tema.";   2: print (The) actor, " consulta ", (the) x1, ".^";    }  Cut:      "Cortándo", (lo) x1, " no lograrás gran cosa.";  Disrobe:    switch(n)    { 1: "No llevas puesto eso."; 2: "Te quitas ", (the) x1, "."; 3: print (The) actor, " se quita ", (the) x1, ".^";    }  Drink:       "Eso no parece potable.";  Drop:    ! 2 mensajes de error, 1 aviso y 1 de éxito:    !   1: Error, el objeto dejado no está en poder del jugador, pero    !      está en la localidad.    !   2: Error, el objeto dejado no está en poder del jugador ni en    !      la localidad.    !   3: Aviso, el objeto era una prenda que el jugador llevaba    !      puesta y la librería va a quitarsela automáticamente para    !      poder dejarla.    !   4: Exito    switch(n)    { 1: "Para dejar ", (the)x1, " deberías tener", (lo) x1, "."; 2: "No ", (lo) x1, " tienes.";        3:  print "(primero te quitas ", (the) x1, ")^"; say__p = 0; return; 4: "Dejad", (o) x1, ".";        5: "No hay más lugar sobre ", (the) x1, ".";        6: "No hay más lugar en ", (the) x1, ".";        7: print (The) actor, " deja ", (the) x1, ".^";    }  Eat:    !  1: Error, el objeto no tiene el atributo "comestible"    !  2: Exito. [NOTA: la librería permite por defecto comerse    !    cualquier cosa que tenga el atributo "comestible", pero la    !    única acción que causa esto es que el objeto en cuestión    !    desaparece del juego al ser comido]    switch(n)    { 1: "Eso es simplemente incomestible."; 2: "Te comes ", (the) x1, ". No está mal.";        3: print (The) actor, " se come ", (the) x1, ".^";    }  Enter: ! [infsp] GoIn (Meterse) se cambio por Enter.    ! CUIDADO. La acción Meterse se genera en muy diversas    ! circunstancias: VETE HACIA EL PUENTE, VETE AL PUENTE, VETE POR    ! EL PUENTE, PASA POR EL PUENTE, ENTRA EN EL PUENTE, ENTRA AL    ! PUENTE, CRUZA EL PUENTE, CRUZA POR EL PUENTE, METETE EN EL    ! PUENTE, METETE POR EL PUENTE, ATRAVIESA EL PUENTE, BAJA POR EL    ! PUENTE.  Todas ellas generarían la acción    !    ! Además, los intentos de entrar en un "entrable", también, como    ! por ejemplo: SIENTATE EN EL BANCO, ECHATE EN EL BANCO, SUBETE AL    ! BANCO, SUBETE EN EL BANCO, SUBE AL BANCO, SUBE POR EL BANCO,    ! SALTA AL BANCO. Todas ellas generarían    !    ! Puesto que hay muchos verbos diferentes que dan lugar a la misma    ! acción, es necesaria alguna forma de imprimir qué verbo concreto    ! ha sido el que la ha desencadenado, para poder generar mensajes    ! como "No puedes entrar ahi", "No puedes sentarte ahi", "No    ! puedes subirte ahi", etc.. según el verbo usado. Para esto puede    ! usarse una llamada a IdiomaVerbo(palabra_verbo). palabra_verbo    ! contiene el verbo usado por el jugador (convertido en forma    ! imperativa), y IdiomaVerbo lo que hace es imprimir la forma    ! infinitiva.    !    ! Mensajes que puede generar esta acción:    !  1: Error, el jugador ya está en/sobre el objeto en cuestión    !  2: Error, el objeto al que intenta entrar/subirse/meterse no    !     tiene el atributo "entrable"    !  3: Error, el objeto en que intenta entrar/meterse/subirse, es    !     un entrable y recipiente, pero está cerrado.    !  4: Error, el objeto en que intenta entrar/meterse/subirse, está    !     en poder del jugador    !  5: Exito, el jugador sube/entra en el objeto    !  6: Aviso, el jugador estaba en otro objeto, la librería    !     intentará una acción automática, antes de reintentar lo    !     que el jugador le ha ordenado.    !  7: Aviso, el objeto en que el jugador intenta meterse, está    !     dentro de otros objetos. La librería intentará de forma    !     automática meter al jugador en el objeto desde el cual pueda    !     acceder al que el jugador ha indicado.    switch(n) {     1: print "Pero si ya estás ";    if (x1 has supporter) print "sobre "; else print "en ";    print_ret (the) x1, ".";     2: print "No es algo donde puedas "; LanguageVerb(verb_word); ".";     3: "No puedes entrar en ", (the) x1, " porque está", (n) x1,        " cerrad", (o) x1, ".";     4: print "No puedes "; LanguageVerb(verb_word);        " ahí mientras no lo sueltes.";     5:    if (x1 has supporter) print "Subes ", (al) x1;    else print "Entras en ", (the) x1;    print_ret ".";     6:    if (x1 has supporter) print "(te bajas "; else print "(sales ";    print (del) x1; ")";            say__p = 0; return;        7:  ! say__p = 0;            if (x1 has supporter) "(te subes ", (al) x1, ")";            if (x1 has container) "(te metes en ", (the) x1, ")";            "(entras en ", (the) x1, ")"; 8: print (The) actor, " se mete en ", (the) x1, ".^";        9:  print (The) actor, " se sube a ", (the) x1, ".^";    }  Examine:    !  1: Error, el jugador intenta examinar un objeto, pero está a    !     oscuras.    !  2: Exito, pero el objeto examinado no tiene descripcion    !  3: Exito, pero el objeto examinado no tiene descripcion, aunque    !     tiene el atributo conmutable, por lo que la librería genera    !     este mensaje para indicar si está apagado o encendido.    switch(n)    {     1: "Está demasiado oscuro, no puedes ver nada.";     2: "No observas nada especial en ", (the) x1, ".";     3: print (The) x1, " ", (esta) x1;    if (x1 has on) " encendid", (o)x1, ".";    else " apagad", (o)x1,"."; 4: print (The) actor, " mira de cerca ", (al) x1, ".^"; 5: "No ves nada en especial al mirar en esa dirección.";    }  Exit:    ! 1: Error, el jugador no está subido/sentado/metido en ningún    !    objeto. [Nota, si la localidad tiene la propiedad "afuera",    !    entonces la acción Salir lo sacará de la localidad. En caso    !    contrario es cuando se genera este error]    ! 2: Error, el jugador está dentro de un recipiente cerrado.    ! 3: Exito, el jugador sale/baja del objeto    ! 4: Error, mas especifico. [6/11]    switch(n)    {     1: print "No estás en ningún sitio del que debas ";    LanguageVerb(verb_word); ".";     2: "No puedes salir ", (del) x1, " porque está cerrad", (o)x1, ".";     3: if (x1 has supporter) print "Bajas ";    else print "Sales ";    print_ret (del) x1, ".";     4:  print "Pero es que no estás ";            if (x1 has supporter) print "encima de  "; else print "dentro de ";            print_ret (the) x1, "."; 5: print (The) actor, " sale ", (del) x1, ".^"; 6: print (The) actor, " sale ", (del) x1, ".^";    }  GetOff:    ! Esta acción se genera ante la frase SAL DEL ARMARIO o    ! similares. Ante SAL a secas la acción es Salir.    ! Si el jugador no está en el objeto indicado, se genera el    ! siguiente mensaje de error. Si está, la librería generará una    ! acción Salir, por lo que el mensaje de éxito será el de Salir.    "Pero si no estás en ", (the) x1, ".";  Give:    ! 1: Error, el jugador intenta dar un objeto que no tiene    ! 2: Error, el jugador se da el objeto a sí mismo    ! 3: Aviso, se ha enviado la acción Dar al PNJ, pero este no ha    !    respondido. En este caso ml_o apunta al PNJ y no al objeto    !    que le hemos dado.    ! [Observar que por defecto el objeto sigue en poder del    ! jugador. Si queremos que el PNJ lo acepte, hay que programarlo    ! como parte de su rutina Vida]    switch(n)    {     1: "No tienes ", (the) x1, ".";     2: "Manoseas ", (the) x1,     " un ratito, pero no consigues gran cosa.";     3: print_ret (The) x1, " no parece", (n) x1, " interesad", (o)x1, ".";        4:  print (The) x1;            if (x1 has pluralname) print " no pueden";            else print " no puede";            " recibir cosas."; 5: "Le das ", (the) x1, " a ", (the) second, "."; 6: print (The) actor, " te da ", (the) x1, ".^"; 7: print (The) actor, " da ", (the) x1, " a ", (the) second, ".^";    }  Go:    ! La acción Ir se genera si el jugador pone IR NORTE, o si pone    ! simplemente NORTE.    !   1: Error, el jugador está dentro/subido en un objeto del que    !      tiene que salir antes    !   2: Error, la localidad no tiene salida en esa dirección (y    !      tampoco tiene la propiedad no_puedes_ir, ya que en este caso    !      se habría impreso el valor de esa propiedad    !   3: Error, el jugador ha intentado ir hacia arriba, pero allí    !      hay una puerta cerrada    !   4: Error, el jugador ha intentado ir hacia abajo, pero alli    !      hay una puerta cerrada.    !   5: Error, en la dirección que ha dicho el jugador hay una    !      puerta cerrada    !   6: Error, en la dirección que ha dicho el jugador hay una    !      puerta, pero ésta no tiene una propiedad puerta_a    !      (probablemente un error de programación del juego)    switch(n)    {     1: print "Tienes que ";         if (x1 has supporter) print "bajarte "; else print "salir ";         print_ret (del) x1, " antes.";     2: "No puedes ir por ahí.";     3: "Eres incapaz de trepar por ", (the) x1, ".";     4: "Eres incapaz de bajar por ", (the) x1, ".";     5: "No puedes pasar a través ", (del) x1, ".";     6: "No puedes ir porque ", (the) x1, " no lleva", (n) x1, " a ningún sitio."; 7: "Tienes que especificar en qué dirección ir."; 8: print (The) actor, " se va hacia arriba"; 9: print (The) actor, " se va hacia abajo"; 10: print (The) actor, " se va hacia ", (name) x1; 11: print (The) actor, " llega desde arriba"; 12: print (The) actor, " llega desde abajo"; 13: print (The) actor, " llega desde ", (name) x1; 14: print (The) actor, " llega"; 15: print (The) actor, " llega a ", (the) x1, " desde arriba"; 16: print (The) actor, " llega a ", (the) x1, " desde abajo"; 17: print (The) actor, " llega a ", (the) x1, " desde ", (name) x2; 18: print (The) actor, " se va por ", (the) x1; 19: print (The) actor, " llega desde ", (the) x1; 20: print "sobre ", (the) x1; 21: print "en ", (the) x1; 22: print ", llevando ", (the) x1, ", contigo dentro"; 23: print ", llevando ", (the) x1; 24: print ", llevandose ", (the) x1; 25: print ", llevando ", (the) x1, " dentro"; 26: print ", llevándote a ti también";    }  Insert:    ! 1: Error, el objeto no está en poder del jugador. [Nota,    !    conviene mirar en este caso si el objeto es animado o no,    !    para generar un mensaje más adecuado]    ! 2: Error, el jugador intenta meter el objeto en otro que no    !    tiene el atributo "recipiente"    ! 3: Error, el jugador intenta meter el objeto en un recipiente    !    cerrado.    ! 4: Error, el objeto es una prenda que el jugador lleva puesta.    !    [ESTE MENSAJE NO SE GENERA NUNCA, PARECE UN BUG DE LA    !    LIBRERIA. Véase en su lugar el mensaje 6]    ! 5: Error, se intenta poner un objeto dentro de sí mismo    ! 6: Aviso, el objeto es una prenda puesta, la librería va a    !    quitársela de forma automática antes de reintentar Meter.    ! 7: Error, no queda sitio en el recipiente (el número de objetos    !    que un recipiente puede contener se indica en su propiedad    !    "capacidad").    ! 8: Exito. Mensaje a mostrar para cada objeto metido cuando se    !    meten muchos (ej: METE TODO EN LA BOLSA)    ! 9: Exito. Mensaje a mostrar cuando se mete un solo objeto dentro    !    de otro    switch(n)    {     1:          if (x1 has animate) "Antes tendrías que ", (coge)"rl", (o) x1,       " y no sé si se dejará",(n)x1,".";      else        "Necesitas tener ", (the) x1,        " para poder meter", (lo) x1,        " donde sea.";     2: "No se pueden meter cosas dentro ", (del) x1, ".";     3: print_ret (The) x1, " ", (esta) x1, " cerrad", (o) x1, ".";     4: "Tienes que quitarte", (lo) x1, " antes.";     5: "No puedes poner un objeto dentro de sí mismo.";        #ifdef NI_BUILD_COUNT;     6: "(primero te ", (lo) x1, " quitas)^"; say__p = 0; return;     7: "No queda sitio en ", (the) x1, ".";     8: "Hecho.";     9: "Metes ", (the) x1, " dentro ", (del) second, "."; 10:  print (The) actor, " pone ", (the) x1, " en ", (the) second, ".^";    } Inv:    ! Inventario    !  1: Mensaje si el inventario está vacío    !  2: Encabezado del inventario, antes de la lista de objetos    !     generada por la librería    !  3 y 4: [6/11]    switch(n)    {     1: "No llevas nada.";     2: print "Llevas";     3:  print ":^";     4:  print ".^"; 5: print (The) x1, " consulta su inventario.^";    }  Jump:      "Saltas en el sitio, sin ningún resultado.";  Kiss:         "No creo que debas.";  Listen:      "No escuchas nada fuera de lo común.";  ListMiscellany:    ! Los siguientes mensajes se muestran como aclaraciones cuando se    ! está listando el inventario del jugador, o los objetos que hay    ! en una localidad. Junto a cada mensaje se comenta qué    ! condiciones deben darse en ese objeto para que se muestre ese    ! mensaje aclaratorio    switch(n)    {     1: print " (alumbrando)";    ! El objeto tiene "luz" y la localidad no        2:  print " (cerrad", (o) x1, ")";        4:  print " (vací", (o) x1, ")";        6:  print " (cerrad", (o) x1, " y vací",(o) x1, ")";     3: print " (cerrad", (o) x1, " y alumbrando)";    ! Casos 2 y 1 juntos     5: print " (vací", (o) x1, " y alumbrando)";    ! Casos 1 y 4 juntos     7: print " (cerrad", (o) x1, ", vací", (o) x1, " y        alumbrando)";    ! Casos 1 y 6 juntos ! Los casos siguientes son similares, pero se muestran cuando ! se solicita a la rutina EscribirListaDesde la opcion INFOTOTAL ! La librería puede combinar varios de estos mensajes, por eso no ! deben llevar el cerrar paréntesis al final, que lo añade la ! propia librería ! ************************************ !  NO SE ACONSEJA CAMBIAR ESTOS ! ************************************     8: print " (alumbrando y que llevas puest", (o) x1;    ! El objeto tiene "luz" y "puesto"     9: print " (alumbrando";    ! El objeto tiene "luz" pero no "puesto"     10: print " (que llevas puest", (o) x1;    ! El objeto tiene "puesto" pero no "luz"        11: print " (";     12: print "abiert", (o)x1;    ! Objeto tiene "recipiente", "abrible" y "abierto" (y cosas dentro)     13: print "abiert", (o)x1, " pero vací", (o) x1;    ! Objeto tiene "recipiente", "abrible" y "abierto (pero vacio)     14: print "cerrad", (o) x1;    ! Objeto tiene "recipiente", "abrible"  y no "abierto"     15: print "cerrad", (o) x1, " con llave";    ! Objeto tiene "recipiente", "abrible" y "cerrojoechado" o "cerrojo"     16: print " vací", (o) x1;    ! Objeto tiene "recipiente", no "abrible" y "transparente"        17: print " (vací", (o) x1, ")";     18: print " que contiene ";    ! encabezado a la lista de lo que hay dentro del objeto     19: print " (sobre ", (el_) x1;    ! Si el objeto tiene "soporte", la librería va a listar sus    ! contenidos. Este es el encabezado de la lista     20: print ", encima ", (del_) x1;    ! Como e l9, pero en otra modalidad (que se activa si    ! EscribirListaDesde es llamada sin el modo BREVE_BIT)     21: print " (en ", (el_) x1;    ! Si el contenido tiene "recipiente" y puede verse su interior    ! y hay cosas, la librería va a mostrar sus contenidos. Este    ! es el encabezado de la lista     22: print ", dentro ", (del_) x1;    ! Como el 21, pero en otra modalidad (que se activa si    ! EscribirListaDesde es llamada sin el modo BREVE_BIT)    } LMode1:    ! La acción ModoM1 se genera ante el comando BREVE (o NORMAL). La    ! librería imprime la constante Historia y a continuación este    ! mensaje.    " está ahora en su modo normal ~breve~, que da sólo descripciones    largas de los lugares la primera vez que son visitadas, y    descripciones cortas en otro caso."; LMode2:    ! La acción ModoM2 se genera ante el comando LARGO. La    ! librería imprime la constante Historia y a continuación este    ! mensaje.    " está ahora en su modo ~largo~, que siempre da descripciones    largas de los lugares (incluso si ya habías estado antes)."; LMode3:    ! La acción ModoM3 se genera ante el comando SUPERBREVE. La    ! librería imprime la constante Historia y a continuación este    ! mensaje.    " está ahora en su modo ~superbreve~, que siempre da descripciones    cortas de los lugares (incluso si nunca habías estado antes).";   Lock:    ! EcharCerrojo se genera con CIERRA CON , o    ! tambien ante ECHA CERROJO A . (sin especificar un    ! segundo objeto en este caso)    !    !  1: Error, el objeto que se intenta cerrar no tiene la propiedad    !     "cerrojo".    !  2: Error, el objeto que se intenta cerrar tiene la propiedad    !     "cerrojo", pero ya tiene también "cerrojoechado    !  3: Error, el objeto tiene "cerrojo", pero está "abierto". No se    !     le puede echar el cerrojo hasta que no se cierre.    !  4: Error, el especificado no coincide con el que el    !      indica en su propiedad "con_llave".    !  5: Exito, el es cerrado (con si este es    !     specificado, el cual puede encontrarse en la variable    !     "otro")    switch(n)    {      1: "No parece", (n) x1, " tener ningún tipo de cerrojo.";      2: if (x1 provides with_key)      print_ret (The) x1, " ya estaba", (n) x1, " cerrad", (o) x1,      " con llave.";    else      print_ret (The) x1, " ya tiene",(n) x1, " echado el cerrojo.";      3: "Primero tendrás que cerrar ", (the) x1, ".";      4: if (second) "No parece", (n) x1, " encajar en la cerradura.";    "Necesitas algún tipo de llave.";      5: if (second) "Cierras ", (the) x1," con ", (the) second, ".";    "Echas el cerrojo ", (al) x1, "."; 6: print (The) actor, " echa cerrojo a ", (the) x1, ".^";    } Look:    ! La acción Look se genera cuando el player pone MIRAR, pero    ! también de forma automática al entrar en una localidad nueva, o    ! cuando el player sale/se baja de un objeto en el que estaba.    !    ! Algnouns de los mensajes que se definen aqui aparecen en el    ! "título" de la localidad (lo que aparece en negrita before de la    ! descripción de la localidad)    !    !  1: aclaración a añadir tras el título si el player está subido    !     en un objeto    !  2: aclaración a añadir tras el título si el player está dentro    !     de un objeto    !  3: aclaración a añadir tras el título si el player ha sido    !     transformado en otro personaje, mediante una llamada a    !     ChangePlayer(nuevo, 1); (si el 1, la librería no intentará    !     mostrar este mensaje)    !  4: Una vez que la librería ha mostrado la descrcipció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    !  Restante: 5,6 [6/11] antes 'default'    !     Son usados por la librería para listar los objetos "simples"    !     que hay en la localidad. Son objetos "simples" los que no    !     dan su propia auto-descrcipcion a través de la propiedad    !     "describe" o "initial".    !  7: Respuesta estandar para MirarHacia [6/11]    switch(n)    {     1: print " (sobre ", (the) x1, ")";     2: print " (en ", (the) x1, ")";     3: print " (como ", (object) x1,")";     4: print "Sobre ", (the) x1;    WriteListFrom(child(x1),                      ENGLISH_BIT + RECURSE_BIT + PARTINV_BIT                      + TERSE_BIT + ISARE_BIT + CONCEAL_BIT);    ".";     5,6:         if (x1~=location)         {      if (x1 has supporter) print "Sobre "; else print "En ";                 print (the) x1;                 print " puedes ver ";         }         else print "Puedes ver ";         if (n==5) print "también ";         WriteListFrom(child(x1),                      ENGLISH_BIT + WORKFLAG_BIT + RECURSE_BIT                      + PARTINV_BIT + TERSE_BIT + CONCEAL_BIT);         if (x1~=location) ".";         ".";     7: "No observas nada más digno de mención al mirar hacia ", (the) x1, ".";![6/11]     8:  if (x1 has supporter) print " (sobre "; else print " (en "; ! added in 6/11N 4U65         print (the) x1, ")"; 9: print (The) actor, " mira alrededor.^";    }  LookUnder:    ! Dos casos:    !  1: Error, estamos a oscuras    !  2: Exito, mensaje por defecto.    switch(n)    {     1: "Está muy oscuro.";     2: "No ves nada interesante."; 3: print (The) actor, " mira debajo ", (del) x1, ".^";    }  Mild:        "Bastante.";  ! Y esta si usa como primera palabra algún insulto más suave !================================================================ ! MISCELANEA !================================================================ ! Esta es una falsa acción, que se usa simplemente para agrupar aquí ! todos los mensajes de error del parser, los mensajes ante algunos ! metacommandos, o algnouns mensajes de librería no relacionados con ! acción alguna. La asignación de números a mensajes es bastante ! caprichosa. ! Debajo de cada mensaje un comentario indica en qué condiciones se ! genera. Miscellany:    switch(n)    {     1: "(Sólo considero los dieciséis primeros objetos)^";    ! El player ha especificado objetos multiples, pero el parser    ! tiene una lista que no admite más de 16, de modo que los    ! restbefore objetos no serán procesados.     2: "¡No sé a qué objetos te refieres!";    ! El player ha usado objetos multiples, pero por alguna razón    ! la lista del parser está vacía.     3: !         TextoLlamativo(" Has muerto ");         print " Has muerto ";    ! Mensaje fin de juego. Has muerto.     4: !          TextoLlamativo(" Has ganado ");          print " Has ganado ";    ! Mensaje fin de juego de victoria.     5: ! Mensaje a mostrar tras el fin del juego, para pedir al    ! player si quiere reniciar, recuperar, anular, puntuación,    ! curiosidades o terminar.       print "^¿Quieres REINICIAR, RECUPERAR un juego guardado";       #IFDEF DEATH_MENTION_UNDO;         print ", ANULAR tu último movimiento";       #ENDIF;       #ifdef I7_SERIAL_COMMA;          print " ,";       #endif;      " o TERMINAR?";     6: "[Tu intérprete no puede ~deshacer~ acciones, ¡lo siento!]";    ! Error si el intérprete no tiene "undo"            #Ifdef TARGET_ZCODE; ![6/11]     7: "~deshacer~ falló. [No todos los intérpretes lo tienen.]";            #Ifnot; ! TARGET_GLULX     7:  "[No puedes ~deshacer~ más.]";            #Endif; ! TARGET_    ! Otro error si el intérprete no tiene "undo", pero no había    ! sido detectado correctamente     8: "Por favor, da una de las respuestas anteriores.";    ! Si el player no responde correctamente a la pregunta del    ! mensaje [Miscellany,5]     9: "¡Te has quedado a oscuras!";    ! Mensaje cuando se detecta, al final del turno, que ya no hay    ! light.     10: "¿Perdón?";    ! Mensaje cuando el player introduce una linea en blanco (no    ! llega a generarse acción alguna, por tanto no se consume    ! turno ni se ejecutan daemons)     11: "[No puedes ~deshacer~ lo que no has hecho.]";    ! Si el player intenta "undo" al principio del juego     12: "[No puedes ~deshacer~ dos veces seguidas. ¡Lo siento!]";    ! Si el player pone "undo" dos veces     13: "[Retrocediendo al turno anterior.]";    ! Exito en el "undo"     14: "Lo siento, eso no puede corregirse.";    ! Si el player pone EEPA (verbo para corregir), pero el    ! parser no recordaba ninguna palabra mal    ! El commando EEPA se usa así, por ejemplo:    !   > SACA MAZANA VERDE DE LA CESTA    !   No veo eso por aquí    !   > EEPA MANZANA    !   Sacas la manzana verde de la cesta de mimbre.     15: "No te preocupes.";    ! Si el player pone EEPA sólo (sin especificar la palabra    ! corregida)     16: "~eepa~ sólo puede corregir una palabra.";    ! S