#LyX 1.2 created this file. For more info see http://www.lyx.org/ \lyxformat 220 \textclass scrbook \begin_preamble \date{} \end_preamble \language spanish \inputencoding auto \fontscheme pslatex \graphics default \float_placement !hbt \paperfontsize default \spacing single \papersize a4paper \paperpackage widemarginsa4 \use_geometry 0 \use_amsmath 0 \use_natbib 0 \use_numerical_citations 0 \paperorientation portrait \secnumdepth 3 \tocdepth 3 \paragraph_separation indent \defskip medskip \quotes_language swedish \quotes_times 2 \papercolumns 1 \papersides 2 \paperpagestyle default \layout Title Esquema general de Minë \newline \emph on Una guía para el colaborador \newline \family typewriter \series bold \size small \emph default versión \series default 1.0 \newline 16 de Agosto de 2002 \series bold \newline Siempre actualizada en http://eutherpe.org \layout Author Pablo Ruiz Múzquiz \emph on Aranarth \emph default , \newline Andrés Moya Velázquez \emph on Hirunatan \newline \emph default y Diego Moya Velázquez \emph on Hizgael \newline \begin_inset Graphics FormatVersion 1 filename logo_mine_musgo_300_sinletras.jpg display default size_type 2 scale 60 rotateOrigin center lyxsize_type 0 \end_inset \layout Dedication \size footnotesize \emph on Ancho, alto y profundo es el reino de los cuentos de hadas, y lleno todo él de cosas diversas: hay allí toda suerte de bestias y pájaros; mares sin riberas e incontables estrellas; belleza que embelesa y un peligro siempre presente; la alegría, lo mismo que la tristeza, son afiladas como espadas. Tal vez un hombre pueda sentirse dichoso de haber vagado por ese reino, pero su misma plenitud y condición arcana atan la lengua del viajero que desee describirlo. Y mientras está en él le resulta peligroso hacer demasiadas preguntas, no vaya a ser que las puertas se cierren y desaparezcan las llaves. \size default \emph default \newline \size normal \SpecialChar ~ \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \series bold Sobre los Cuentos de Hadas, JRR Tolkien \layout Standard \begin_inset LatexCommand \tableofcontents{} \end_inset \layout Chapter \line_bottom \pagebreak_top \pagebreak_bottom Introducción \layout Standard En esta \emph on guía \emph default de Minë pretendemos elaborar un documento que facilite al máximo la contribució n de código y de ficheros de descripción de salas, objetos y personajes no jugadores (PNJs). \layout Standard Para ello, hemos dividido la guía en dos apartados muy diferenciados; en el primero hablamos de cómo puede construirse un área de juego completa con salas y objetos pero sin PNJs y en el segundo describimos el diseño del programa a nivel de código fuente para dar a conocer las entrañas y animar a los programadores a participar en el desarrollo del núcleo. Además, acompañamos todo esto con varios apéndices que sirven de apoyo a estas dos primeras partes. \layout Standard Los conocimientos o el trabajo derivado del uso de esta guía no ha de repercutir necesariamente en Minë. Ni el equipo de Minë tomará por la fuerza nada que una persona ajena haya construido ni estamos obligados aceptar cualquier trabajo o estudio realizado en este sentido. La única restricción que imponemos es que las modificaciones realizadas a una copia privada del código fuente de Minë han de acogerse también a la Licencia Pública General (visite http://www.gnu.org). \layout Standard Si no tienes conocimientos de programación, sólo has de leer la sección 2 y los apéndices 4.1, 4.2 y 4.3. Si deseas contribuir con código fuente, es necesario que leas por encima primero las partes dedicadas al núcleo en sí -sección 3 y apéndices 4.4 y 4.5-, luego leas las secciones dedicadas a los no programadores y luego vuelvas ya en serio a tus apartados. \layout Standard Los autores de esta guía somos Andrés \emph on Hirunatan \emph default , Diego \emph on Hizgael \emph default y yo mismo, Pablo \emph on Aranarth \emph default . Cada uno se ha dedicado a un aspecto, Andrés a explicar el código fuente de Minë, Diego a todo lo relacionado con los personajes no jugadores (PNJs) y yo para los manuales, los comentarios y el armazón final del documento. \layout Standard Quisiéramos agradecer al equipo que forma el proyecto Minë su apoyo mostrado hasta ahora \begin_inset Foot collapsed false \layout Standard El logotipo de Minë es obra de Jaime 'Dwalin'. \end_inset . Ellos son los suscritos a la lista de correo de usuarios. \layout Standard Esperamos que de alguna forma u otra (jugando, informando de fallos, escribiendo áreas o código) disfrutéis de Minë tanto como nosotros. \layout Chapter \line_bottom \pagebreak_top \pagebreak_bottom Construcción de un área \layout Section Conceptos generales \layout Standard Minë es un juego tipo MUD/MUSH. Esto quiere decir que el ordenador que ejecuta Minë construye un mundo virtual al que pueden conectarse otros jugadores por internet (o red local). La forma en que los jugadores ven el mundo de Minë es muy peculiar ya que, al contrario de lo acostumbrado, el entorno de juego no es gráfico sino textual. \layout Standard De hecho, cuando un jugador se conecta al servidor que tiene Minë \begin_inset Foot collapsed false \layout Standard el servidor es una máquina física que ejecuta Minë y a la que se puede acceder de alguna forma con un programa específico. \end_inset , lo primero que ve es un mensaje de bienvenida en texto simple. Este modelo de traspaso de información se mantiene siempre. El jugador escribe lo que desea hacer y Minë responde con texto. Para aquellos que frecuenten los \emph on chats \emph default (sobre todo IRC) resultará fácil hacerse una idea de lo que estamos diciendo. \layout Standard En un \series bold juego de rol \series default , los jugadores se desplazan por lugares muy diversos. Pueden estar andando por un camino, registrando una casa, inspeccionando una posada, vagando por un laberinto o escalando una montaña. En todos estos lugares el Director de Juego \shape italic divide \shape default mentalmente el área de juego en pequeñas secciones. A veces no es obligatorio que el director de juego tenga diferenciados cada trozo del camino como si fuesen independientes y prefiere, todo lo más, tener clara la entrada al camino, un punto concreto de éste, el resto del camino y la salida o bifurcación más cercana. Si el Director de Juego fuese estricto debería informar a los jugadores de que según van avanzando, van pasando de un trozo del camino (llamémoslo parte 4 del camino) al siguiente (parte 5 del camino) pero esto raras veces sucede pues sacrifica demasiada jugabilidad. Si nos encontramos en una casa, la situación cambia radicalmente y solemos tener delante un pequeño mapa con las salas o cuartos bien diferenciados, ya que si sucede algo inesperado, no es lo mismo estar cerca de la escalera que al final del pasillo, es decir, cada lugar cuenta. \layout Standard Cuando la situación la controla un ordenador en vez de una persona, todos los casos han de manejarse como la situación en la casa descrita arriba pues éste es incapaz de diferenciar cuándo es importante la división en zonas del terreno y cuándo no. Por tanto, en Minë hay que documentar cada trozo más o menos grande de terreno. Veamos, el objetivo es construir una Tierra Media virtual que contenga en su interior detalles de un cuarto trastero de una taberna de un poblacho del sur del extinto reino de Cardolan, pero también que haga mención explícita a un recodo en el camino que cruza el Anduin a la altura de Minas Tirith o un pequeño oasis muy al sur de Harad que sirve de descanso para los comercian tes de la zona. Nosotros nos centraremos en una pequeña casa anónima de un poblado del Reino de Arthedain alrededor del año 2000 de la Tercera Edad. \layout Standard El propósito de esta guía es construir paso a paso cada \shape italic sala \shape default del lugar, así como los objetos contenidos en ella. Para seguir correctamente el tutorial es muy importante que tengáis en todo momento una buena imagen mental del lugar que ocupamos en cada instante. \layout Standard Las salas se componen básicamente de 4 cosas. \layout Itemize Descripción \begin_deeper \layout Itemize del lugar \layout Itemize detalles del lugar \end_deeper \layout Itemize Objetos existentes \layout Itemize Personajes no jugadores presentes \layout Itemize Salidas posibles \layout Section \pagebreak_top Cómo dar forma a la imaginación \layout Standard Todo diseño de un área comienza con un dibujo a mano alzada de ésta para tener siempre claro la relación entre los cuartos o espacios considerados independientes. Es cierto que hay gente que posee una gran visión espacial y memoria pero para la mayoría es recomendable seguir en el papel todo lo que hacemos por escrito. \layout Standard Como podéis ver en la figura 1 de una casa inventada que hemos llamado "Casa de Seroth, el comerciante" y a la que nos referiremos a partir de ahora como área \series bold seroth \series default , nos hemos limitado a dibujar dos plantas, la de abajo -al nivel de la calle- y la de arriba -un simple y pequeño primer piso al que se accede por medio de una escalera de caracol-. En este ejemplo no pretendemos ser fieles a lo que sería una casa de un comerciante de telas en Arthedain y obviaremos muchos detalles. \layout Standard Lo que hay en cada habitación o \series bold sala \series default no aparece dibujado porque no interesa ni merece la pena. Como ya hemos dicho, lo importante es dominar la ubicación de los cuartos a fin de tener claro desde dónde se puede venir al lugar en que nos encontramos o hacia dónde podemos irnos desde una posición concreta. La descripción detallada se deja para la redacción posterior. \layout Standard Por tanto, en el dibujo deben quedar claras la colocación de las salas y las salidas de que disponen, marcando aquellas que estén ocultas o sean difíciles de detectar así como aquellas que se encuentren cerradas con llave o con algún tipo de encantamiento (esto último resultará muy raro de encontrar). \layout Standard \begin_inset Float figure placement htbp wide false collapsed false \layout Standard \align center \begin_inset Graphics FormatVersion 1 filename manual_mine_grafico01.ps display color size_type 0 rotateOrigin center lyxsize_type 0 \end_inset \end_inset \layout Section \pagebreak_top Pasamos a la acción. ¿Cómo escribo una habitación? \layout Standard Los detalles de cómo es el fichero de una sala se describen en el Apéndice titulado \series bold Cómo construir una sala \series default . \layout Standard En esta sección pondremos el contenido de cada fichero asociado a una sala. \layout Standard Para escribir estos ficheros hemos utilizado un editor de textos sencillo, capaz de escribir en formato TXT simple y como guía el mencionado manual de los apéndices. \layout Standard Creamos un directorio de nombre el del área que vayamos a crear. En nuestro caso, creamos un directorio llamado \series bold seroth. \series default Dentro de este directorio vamos creando diferentes ficheros con diferentes nombres, siempre de acuerdo al manual mencionado. Veamos nuestro ejemplo. \layout Subsection Planta baja \layout Paragraph Recibidor \layout Standard \family typewriter \size small \begin_inset Include \verbatiminput{../desc_salas/seroth/seroth-recibidor01.xml} \end_inset \layout Paragraph Almacén \layout Standard \family typewriter \size small \begin_inset Include \verbatiminput{../desc_salas/seroth/seroth-almacen01.xml} \end_inset \layout Paragraph Salón \layout Standard \family typewriter \size small \begin_inset Include \verbatiminput{../desc_salas/seroth/seroth-salon01.xml} \end_inset \layout Paragraph Cocina \layout Standard \family typewriter \size small \begin_inset Include \verbatiminput{../desc_salas/seroth/seroth-cocina01.xml} \end_inset \layout Paragraph Cuarto del servicio \layout Standard \family typewriter \size small \begin_inset Include \verbatiminput{../desc_salas/seroth/seroth-servicio01.xml} \end_inset \layout Paragraph Letrinas del servicio \layout Standard \family typewriter \size small \begin_inset Include \verbatiminput{../desc_salas/seroth/seroth-servicio_letrinas01.xml} \end_inset \layout Paragraph Escaleras \layout Standard \family typewriter \size small \begin_inset Include \verbatiminput{../desc_salas/seroth/seroth-escaleras01.xml} \end_inset \layout Subsection Planta de arriba \layout Paragraph Escaleras \layout Standard \family typewriter \size small \begin_inset Include \verbatiminput{../desc_salas/seroth/seroth-escaleras02.xml} \end_inset \newline \layout Paragraph Distribuidor \layout Standard \family typewriter \size small \begin_inset Include \verbatiminput{../desc_salas/seroth/seroth-distribuidor01.xml} \end_inset \layout Paragraph Cuarto de Seroth \layout Standard \family typewriter \size small \begin_inset Include \verbatiminput{../desc_salas/seroth/seroth-cuarto_seroth01.xml} \end_inset \layout Paragraph Tocador \layout Standard \family typewriter \size small \begin_inset Include \verbatiminput{../desc_salas/seroth/seroth-tocador01.xml} \end_inset \layout Paragraph Letrinas \layout Standard \family typewriter \size small \begin_inset Include \verbatiminput{../desc_salas/seroth/seroth-letrinas01.xml} \end_inset \layout Section \pagebreak_top ¿Qué hay de los objetos? \layout Standard Recordemos que en un entorno MUD/MUSH podemos pensar en 4 tipos de entes fundamentalmente: \layout Itemize Personajes jugadores. Son personas físicas que se conectan por internet y realizan acciones conscient emente. \layout Itemize Personajes no jugadores. Son programas de ordenador capaces de reaccionar a eventos y que se aparecen a los otros personajes jugadores como ellos. \layout Itemize Objetos. Son elementos virtuales que simulan ser objetos físicos que pueden ser manipulados por PJs o PNJs. \layout Itemize Salas. Son los espacios físicos virtuales por donde circulan personajes jugadores (PJs) personajes no jugadores (PNJs) y en donde se encuentran los objetos. \layout Standard En las salas que hemos descrito anteriormente hemos mencionado la existencia de tres objetos muy diferentes. Unas ramitas de tomillo, un cuchillo de cocina y una pluma de ave para escribir. \layout Standard Veamos cómo son por dentro exactamente estos ficheros (véase el apéndice titulado \series bold Cómo fabricar objetos \series default ) \layout Paragraph Tomillo \layout Standard \family typewriter \size small \begin_inset Include \verbatiminput{../desc_objetos/tomillo01.xml} \end_inset \layout Paragraph Cuchillo \layout Standard \family typewriter \size small \begin_inset Include \verbatiminput{../desc_objetos/cuchillo01.xml} \end_inset \layout Paragraph Pluma de ave \layout Standard \family typewriter \size small \begin_inset Include \verbatiminput{../desc_objetos/pluma_de_ave01.xml} \end_inset \layout Standard Estos ficheros \emph on NO \emph default se guardan en el directorio \series bold seroth \series default dentro del directorio \series bold desc_salas. \series default Se almacenan todos juntos en el directorio \series bold desc_objetos \series default . \layout Section El paso final. Pasear por nuestras salas \layout Standard Existen varias formas de poder visitar nuestras salas o áreas pero aquí explicaremos la que, a nuestro entender, es más sencilla. \layout Standard Para empezar, las salas han de estar localizadas en un directorio de área (en nuestro caso, \series bold seroth \series default ) y éste dentro del directorio \series bold desc_salas. \series default Es necesario, por tanto, conseguir una copia de la versión de Minë que aparece en la página web del proyecto (http://eutherpe.org) concretamente, en la sección \series bold jugar ya! \series default . Habréis de montar un servidor de Minë en vuestro propio pc para poder ver las salas. Tras haber seguido las instrucciones de la página, tendréis un Minë propio corriendo en vuestro ordenador y podréis conectaros a él con cualquier cliente MUD indicando que la IP del servidor Minë es \series bold 127.0.0.1 \series default (una dirección IP especial que siempre se refiere a la máquina en la que estáis). El puerto, naturalmente, seguirá siendo \series bold 2000 \series default . Cuando hayáis comprobado que podéis jugar a Minë en vuestro ordenador (sin necesidad de estar conectados a Internet), id al directorio \series bold poblado \series default dentro del directorio \series bold desc_salas \series default y modificad un fichero de sala cualquiera añadiendo una salida más que apunte a uno de los ficheros de vuestra área. \layout Standard Por ejemplo, podréis poner algo así en el fichero de \series bold poblado \series default que elijáis: \newline \newline \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ el recibidor de la Casa de Seroth \newline \newline \family default \size default Y al llegar a la sala en cuestión veréis aparecer una nueva salida que os conducirá (a modo de portal interdimensional) a una de las salas de vuestra área. \layout Standard Normalmente \emph on NO \emph default es necesario reiniciar Minë cada vez que se efectúan cambios en los ficheros de \series bold desc_salas \series default , ya que estos se reconocen automáticamente. \layout Standard Los ficheros de objetos, simplemente colocadlos en el directorio \series bold desc_objetos \series default . \layout Standard Es natural que se nos escapen algunas comillas o que hayamos cerrado mal un paréntesis del tipo '<>'. Cada vez que se produzca un error (Minë los detecta), la conexión al servidor se verá interrumpida (aparecerá un mensaje en el cliente MUD) y en la ventana en donde salen los mensajes del servidor se os mostrará el mensaje del error que provocó la desconexión. A veces será sencillo, tras leer las últimas líneas del error, entender qué salió mal (y qué ficheros hay que revisar). En otras ocasiones no lo será tanto. En estos casos, no despesperéis, revisadlo todo bien y si seguís sin encontrar el error (o errores) enviados a los desarrolladores principales (Aranarth pabloruiz@gnu.org y Hirunatan hirunatan@hammo.org) el directorio comprimido del área (o las salas sueltas que creáis que tienen el error). \layout Standard También podéis enviarnos salas o áreas que deseéis que pasen a formar parte del servidor de pruebas de Minë y así permitir que otras personas puedan explorar lo que hayáis construido (no os olvidéis de enviar los ficheros de objetos conjuntamente con el fichero comprimido del área o áreas). \layout Chapter \line_bottom \pagebreak_top \pagebreak_bottom Contribuir con código \layout Section El código fuente de Minë \layout Standard Ésta es la otra forma de ayudar al proyecto Minë. Puedes incorporarte al equipo de programadores y escribir código fuente del programa. Tenemos una lista de correo especialmente dedicada a tratar este tipo de temas (que a los usuarios normales no les importan en absoluto) ambar-dev@mail.f reesoftware.fsf.org. \layout Standard El código fuente de Minë es 100% \series bold python \series default . Utilizamos \series bold python \series default como lenguaje de programación por motivos históricos (el fundador del proyecto, Pablo Ruiz Múzquiz comenzó a programar 'ambar' -precursor de Minë- en \series bold python \series default ) y por motivos prácticos ( \series bold python \series default resuelve con elegancia muchos de los problemas que aparecen en el diseño de un juego de estas características, es multiplataforma y la curva de aprendizaje es muy suave, lo que facilita nuevos colaboradores). \layout Standard También utilizamos \series bold XML \series default para los ficheros fuente de las salas, PNJs y objetos ya que apostamos por estándares asentados y versátiles. \layout Section \pagebreak_top El mapa del código \layout Standard Para no perdernos en el proceloso mar de líneas de código (actualmente los ficheros fuente de Minë ocupan cerca de 10.000 líneas), mantenemos a modo de mapa un diagrama de clases, hecho con UML. La última versión está disponible en la página electrónica de Minë, http://euth erpe.org/desarrollo.html. \layout Standard Los diagramas muestran el diseño de alto nivel del programa, y son imprescindibl es para conocer su estructura, antes de empezar a leer las clases de una en una. Hay tres grandes bloques: \layout Itemize Modelo de datos \begin_inset Formula $\longrightarrow $ \end_inset una representación abstracta del mundo y sus habitantes, independiente del interfaz (debería poder usarse tal cual si cambiáramos el interfaz, por ejemplo a uno gráfico). \layout Itemize Control \begin_inset Formula $\longrightarrow $ \end_inset el interfaz de usuario. Aquí se interactúa con los jugadores y se controla (o sea, se da órdenes) a los PJ y PNJ. \layout Itemize Infraestructura \begin_inset Formula $\longrightarrow $ \end_inset algunas clases no relacionadas entre sí, con utilidades genéricas usadas por el resto de módulos. \layout Standard \begin_inset Float figure placement htbp wide true collapsed false \layout Standard \begin_inset Graphics FormatVersion 1 filename mine.png BoundingBox 0 0 307bp 391bp display default size_type 2 scale 40 rotateOrigin center lyxsize_type 2 \end_inset \end_inset \layout Subsection Modelo de datos \layout Standard Éste es el bloque más significativo, que contiene el diseño \emph on conceptual \emph default . Cada clase de aquí representa una entidad del juego tal como lo ven los usuarios (personajes, salas, objetos...). \layout Standard \begin_inset Float figure placement htbp wide true collapsed false \layout Standard \begin_inset Graphics FormatVersion 1 filename mine-modelo.png display default size_type 2 scale 45 rotateOrigin center lyxsize_type 0 \end_inset \end_inset \layout Standard El diagrama se lee mejor de arriba a abajo. Al principio parece un poco confuso, pero todos los elementos tienen un sentido intuitivo. \layout Standard El Mundo es único y representa eso, todo el mundo de Minë y lo que hay en él. Contiene una lista de Salas (el rombo en UML significa contener), y cada Sala, a su vez, contiene personajes: los personajes que se encuentran dentro de esa sala. Los Objetos ahora no están modelados del todo, pero en principio podrán estar dentro de una Sala o de un Personaje. \layout Standard Un Personaje, a su vez, puede ser PersonajeJugador o PersonajeNoJugador (la línea de puntos con un triángulo, en UML, significa subclasificación). Todos los personajes conocen de 1 a 5 idiomas, y los jugadores tienen además una Raza y una Profesión. \layout Standard Finalmente, todo Personaje es manejado por un objeto Controlador, que es quien le da las ordenes de lo que debe hacer, y a quien informa de las cosas que le ocurren. Controlador no es una clase, sino un interfaz, lo que significa que no contiene código, sino sólo la declaración de qué métodos debe tener una clase que pueda controlar Personajes. Las clases que implementan ese interfaz pertenecen al siguiente bloque del diagrama. \layout Standard Hay algunas asociaciones más entre clases, que se pueden entender observando el código fuente. Las clases que tienen un único rectángulo (por ejemplo ConnectionHandler) no pertenecen a este diagrama, se muestran aquí sólo para poder ver las asociaciones. \layout Subsection Control. \layout Standard Este bloque es un poco más abstracto. Contiene las clases que llevan el control del programa y la interacción con el jugador. \layout Standard \begin_inset Float figure placement htbp wide true collapsed false \layout Standard \begin_inset Graphics FormatVersion 1 filename mine-control.png display default size_type 2 scale 50 rotateOrigin center lyxsize_type 0 \end_inset \end_inset \layout Standard La clase Mine es el programa en sí. Es el fichero que se ejecuta al inicio y contiene el bucle principal. Inicializa el Mundo y los InterfacesPJ (las flechas punteadas en UML representa n una asociación no permanente). \layout Standard Un InterfazPJ es el objeto que controla a un PersonajeJugador. Acepta conexiones telnet para recibir comandos de un jugador y enviarle sus respuestas, y también da órdenes al personaje y recibe los "sucesos" o "eventos" que éste genera. \layout Standard La funcionalidad de un InterfazPJ, al ser bastante complicada, está repartida en diferentes Diálogos. Cada Dialogo es una "máquina de estados" que representa una situación de diálogo con el jugador (por ejemplo, creación de un personaje nuevo, juego normal, modo combate, etc.). \layout Standard Una máquina de estados es un objeto que tiene un "estado" en cada momento, y responde a "sucesos" que le ocurren bien cambiando a otro estado o realizando una acción. Por ejemplo, en el dialogo "crear un pj", al entrar en estado 1 pregunta el nombre del pj, y espera que ocurra algo. Si el jugador teclea un nombre correcto, lo registra y pasa al estado 2. Si teclea un nombre incorrecto (que ya existe, por ejemplo), devuelve un mensaje de error y continúa en estado 1. \layout Standard Un InterfazPNJ tiene la misma misión, pero esta vez sobre un PersonajeNoJugador. La diferencia es que no tiene ningún socket telnet, sino que las órdenes a ejecutar las decide un programa de inteligencia artificial (más o menos "inteligente"). \layout Subsection Infraestructura \layout Standard En este bloque tenemos clases que representan conceptos genéricos que tienen más relación con el sistema operativo que con un juego MUD. \layout Standard \begin_inset Float figure placement htbp wide true collapsed false \layout Standard \begin_inset Graphics FormatVersion 1 filename mine-infraestructura.png display default size_type 2 scale 50 rotateOrigin center lyxsize_type 0 \end_inset \end_inset \layout Standard ConnectionHandler y Connection representan "sockets" TCP/IP, es decir, los canales de comunicación que implementan el protocolo telnet, usado para hablar con los jugadores. \layout Standard TimerHandler y Timer son temporizadores, o cronómetros, útiles para medir tiempos. Utils es un módulo "cajón de sastre" para meter funciones sencillitas y variadas. \layout Section \pagebreak_top Entendiendo el código \layout Standard Hemos seguido unas reglas básicas de codificación, para mantener un estilo coherente en distintos ficheros hechos por diferentes programadores. En primer lugar, tenemos un fichero fuente por cada clase, con el mismo nombre de la clase en minúsculas (p. ej. la clase \family typewriter \size small DialogoCrear \family default \size default está en dialogocrear.py). Todos los ficheros tienen al principio la nota de "CopyLeft", el comentario que indica su contenido, los import, y la clase. Todas las clases tienen un bloque de comentarios explicando la clase con detalle. Al final se incluye un trozo de código para pruebas unitarias del módulo. \layout Standard Al escribir el código se siguen unas normas de diseño, que se pueden consultar en el apéndice titulado \series bold Normas de diseño de código fuente de Minë \series default . \layout Standard Al leer el código es fundamental leer las clases siguiendo el diagrama, de arriba a abajo, y leer y entender en primer lugar la cabecera donde se explica qué representa, y cuales son sus atributos. \layout Standard El bucle principal del programa está en mine.py, pero casi no hace falta ni que lo mires. El programa se comporta como si todos los objetos del sistema estuvieran "vivos" y funcionando al mismo tiempo. Cuando ocurre cualquier cosa, el objeto correspondiente recibe un mensaje de "evento", es decir, "alguien" llama a un método de un objeto diciéndole que ha ocurrido algo (al principio no es necesario que sepas quién es ese alguien). Por ejemplo, si un jugador escribe algo desde su terminal, el objeto de tipo InterfazPJ correspondiente a ese jugador recibe una llamada al método \family typewriter \size small comando_recibido() \family default \size default . \layout Chapter \line_bottom \pagebreak_top \pagebreak_bottom Apéndices \layout Section Descripción del sistema de conversaciones con los PNJ \layout Standard Los Personajes No Jugadores tienen su importancia dentro de la ambientación del mundo de la Tierra Media. Son sus residentes naturales, los vecinos con los que puedes mantener una conversación formal pero agradable, y que te pueden revelar algún secreto de la región que estás visitando. A continuación se describe el mecanismo que se incluirá en Minë para hablar con ellos. \layout Standard El sistema de conversación con los PNJ está ideado para facilitar a los jugadores las tareas de: \layout Itemize Crear nuevas conversaciones PJ - PNJ por parte de los maestros de lugares. \layout Itemize Interactuar con los PNJs durante el juego. \layout Standard Otro objetivo importante es el permitir que los PNJs ayuden a crear un entorno de juego creíble y una historia interesante. La conversación que se puede sostener con un PNJ la creará un Maestro de Lugares, con un mecanismo similar al que se usa para crear habitaciones. \layout Standard Cada conversación estará centrada en "temas" que tienen asociado un fragmento de diálogo. El jugador, en función de cómo transcurra el diálogo, escoge el siguiente tema por el que quiere preguntar. Normalmente escogerá alguno que se acabe de mencionar, aunque puede preguntar por alguno del que se haya hablado un rato antes, o que no haya salido en la conversación. \layout Standard Los jugadores dispondrán de los comandos "+decir" y "+preguntar por". Con el comando +decir se supone que el PJ ofrece información que el PNJ no conoce, y con +preguntar (más frecuente) intenta sonsacarle. El estilo literario del texto puede hacer que se consiga un diálogo bastante bueno. Este tipo de conversación se podría adornar con verbos adicionales, sobre todo de comunicación no verbal ( \family typewriter \size footnotesize +tocar, +abrazar, +pellizcar, +carraspear \family default \size default , incluso \family typewriter \size footnotesize +besar \family default \size default !) que pueden ayudar a cambiar el humor del PNJ. \layout Standard Como muestra, éste es un fragmento del diálogo que se puede mantener con el "Tutor", un PNJ que aparecerá a la entrada del juego para enseñar a los jugadores nuevos los comandos de Minë: \newline \layout Standard \family typewriter \size footnotesize ? +decir hola \layout Standard \family typewriter \size footnotesize - Saludos, buen mentor. \layout Standard \family typewriter \size footnotesize - Bienvenido, mi joven aprendiz. ¿Estás preparado para comenzar tu instrucción sobre habilidades de supervivenci a en el mundo de la Tierra Media? \layout Standard \family typewriter \size footnotesize - Asientes con admiración y respeto. \layout Standard \family typewriter \size footnotesize - Para hablar conmigo, escribe "+preguntar por", seguido por el tema del que quieras hablar. Con este comando puedes preguntarme sobre cualquier duda que tengas. También puedes escribir "+?" para obtener una ayuda, con un resumen de todo lo que puedes hacer. ¿Has entendido bien? \layout Standard \family typewriter \size footnotesize - Sí, maestro. \layout Standard \family typewriter \size footnotesize - De acuerdo, vamos allá. Pregúntame sobre lo primero que quieras aprender. \layout Standard \family typewriter \size footnotesize ? +preguntar por habilidades de supervivencia \layout Standard \family typewriter \size footnotesize - Maestro, ¿qué es lo mas importante para sobrevivir en el mundo de la Tierra Media? \layout Standard \family typewriter \size footnotesize - Lo primero que debes dominar es el funcionamiento de la línea de comandos. No irás muy lejos si no sabes siquiera cómo desplazarte, ¿verdad? También es importante que sepas cómo combatir, y por cierto que deberás aprender el arte de una buena conversación si quieres llegar a alguna parte. \layout Standard \family typewriter \size footnotesize ? +preguntar por linea de comandos \layout Standard \family typewriter \size footnotesize - Si escribes texto directamente, dirás en voz alta lo que has escrito, en idioma oestron. Puedes escoger en qué idioma quieres hablar, de todos modos. En cambio, para realizar cualquier acción, primero debes conocer el comando adecuado. Ya conoces "+preguntar por" y "+?". Los comandos empiezan por el signo "+". Todo lo que escribas detrás de este signo es un comando que intentarás realizar. \layout Standard \family typewriter \size footnotesize ? +preguntar por ejemplo \layout Standard \family typewriter \size footnotesize - ¿Podrías darme algún ejemplo de manejo de la línea de comandos, mi buen mentor? \layout Standard \family typewriter \size footnotesize El tutor se rasca la cabeza unos instantes, meditando la respuesta. \layout Standard \family typewriter \size footnotesize - Si escribes: "Estoy de buen humor, ¿tú no?", dirás ese texto y te podrán oír todos los que estén en la misma habitación. También puedes escribir el comando: "+preguntar por supervivencia" para comenzar una conversación sobre ese tema. \layout Standard \family typewriter \size footnotesize ? +preguntar por combate \layout Standard \family typewriter \size footnotesize - Para atacar a un personaje, escribe "+atacar" y el nombre del personaje. Esto comenzará una pelea. No te recomiendo que empieces un combate a muerte, sin embargo, hasta que llegues a ser un gran guerrero. \layout Standard \family typewriter \size footnotesize ? +preguntar por personaje \layout Standard \family typewriter \size footnotesize - Maestro, ¿qué tipo de criaturas me puedo encontrar en mis viajes? \layout Standard \family typewriter \size footnotesize - Es pronto para que te preocupes por eso. Más adelante podrás estudiar este asunto, si te interesa. \layout Standard \family typewriter \size footnotesize ? +preguntar por mundo \layout Standard \family typewriter \size footnotesize El tutor parece un poco desorientado por tu pregunta. \layout Standard \family typewriter \size footnotesize - ¿Por qué este mundo se llama Tierra Media, por cierto? \layout Standard \family typewriter \size footnotesize - ¡Ah! Se llenaría un tratado entero para responder con propiedad esa pregunta. ¿Por qué no me pides que te lo explique... en otra ocasión? \layout Subsection Creación de conversaciones \layout Standard Una conversación estará repartida en varios ficheros de "contexto"; en cada fichero estarán incluidos varios temas fuertemente relacionados. Puedes pensar que un contexto es como una habitación: mientras hables de temas parecidos permaneces en el mismo contexto, y si preguntas por algo no directamente relacionado, te mueves a otro contexto. El diálogo se debe diseñar como un edificio, lleno de habitaciones y recovecos por explorar. Un diálogo puede ser pequeño y confortable como la sala de estar de un hobbit, o profundo y extenso como el palacio de un Señor Enano. \layout Standard Lo más importante a destacar es que un mismo tema puede aparecer en distintos contextos. Si el jugador pregunta por ese tema, obtendrá primero la respuesta contenida en el contexto actual, o la del contexto más cercano. También se puede partir el texto asociado a un tema en varios fragmentos sucesivos. De esta forma se consigue que se pueda preguntar varias veces por un mismo tema y obtener respuestas diferentes en cada ocasión, haciendo avanzar el diálogo. \layout Standard Para que el escritor tenga control sobre qué texto se va a mostrar en un momento dado, dispondrá de al menos estos 2 mecanismos: \layout Enumerate Aislamiento de los temas. Los temas estarán agrupados en contextos. Si el jugador cambia bruscamente de contexto, se activará la respuesta por defecto del tema solicitado; pero si se mantiene preguntando por tópicos del mismo contexto, se pueden ir activando respuestas preparadas más sutilmente , que formen una línea argumental de diálogo. El atributo de inteligencia del PJ debería permitir detectar, como si fuesen objetos ocultos, los temas de conversación más relacionados con el que se está diciendo ahora mismo. Esto representa que los personajes más inteligentes pueden encontrar más fácilmente los matices en la conversación con el PNJ, y aprenden qué es de lo que más le interesa hablar. Así, un jugador con un PJ inteligente podrá mantener mejores diálogos con los PNJs que uno tonto. \layout Enumerate Estado previo del diálogo: memoria, humor del PNJ, y requisitos. No se debería repetir dos veces un mismo fragmento de texto. Se debe registrar si de este tema se hablado ya, y en ese caso mostrar un texto alternativo de entre varios. Al acceder a ciertos items de texto se pueden definir hitos en el diálogo, indicando que el jugador ha descubierto algo de información. Puede haber items ocultos que sólo se presenten si se ha alcanzado un hito concreto, o items que dependan de requisitos (características del jugador, presencia de algún objeto en la sala...). Algunos de estos hitos pueden representar distintos estados de ánimo del PNJ (alegre, miedoso, enfadado...) y estar almacenados en una variable que se cambie cuando el escritor quiera. \layout Standard El siguiente es un ejemplo de cómo crear un contexto de conversación: \newline \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ hola \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ buenos días \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ Saludos, buen mentor. \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ Bienvenido, mi joven aprendiz. ¿Estás preparado para comenzar tu instrucción sobre habilidades de supervivenci a en el mundo de la Tierra Media? \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ Asientes asiente con admiración y respeto. \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ Para hablar conmigo, escribe "+preguntar por", seguido por el tema del que quieras hablar. Con este comando puedes preguntarme sobre cualquier duda que tengas. También puedes escribir "+?" para obtener una ayuda, con un resumen de todo lo que puedes hacer. ¿Has entendido bien? \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ Sí, maestro. \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ De acuerdo, vamos allá. Pregúntame sobre lo primero que quieras aprender. \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ ¡Hola de nuevo! \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ ¿Cuántas veces me piensas saludar hoy, jovenzuelo? \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \newline \layout Standard Este contexto contiene un sólo tema, con dos items de texto. El segundo ítem sólo aparecerá si vuelves a preguntar por el mismo tema, en este caso el tema "saludos". Se pueden definir sinónimos para detectar las distintas palabras que el jugador puede usar para referirse al tema. \layout Standard Cada ítem puede tener asociado un conjunto de temas relacionados, que a pesar de estar en otro contexto tienen relación con lo que se dice en el texto. Si el personaje pregunta por un tema que no está en el mismo contexto ni está relacionado con los items utilizados, la pregunta está "fuera de contexto" y el personaje no jugador se extrañará por el cambio brusco del diálogo. \layout Subsection Confianza entre el PNJ y los PJs \layout Standard Otra idea importante es la de que la conversación dependa del grado de confianza del PNJ con cada uno de los personajes de la sala. El PNJ tendrá un humor (o 'ánimo') base, que al inicializarse depende de los personajes presentes en la sala. Por ejemplo, el posadero puede empezar la conversación de mal humor porque la taberna se le ha llenado de enanos (este posadero, ha salido un poco racista). \layout Standard El humor cambiará a mejor o peor, como efectos por activar items de texto específicos. También bajará (¡mostrando mensajes de ambientación como efecto secundario!) si el PJ cambia constantemente entre temas no relacionados; esto favorece que los jugadores procuren mantenerse "dentro de contexto" y mejora mucho la apariencia de realidad del diálogo. \layout Standard Además, si un PJ hace subir el humor, la confianza del PNJ en él aumenta, o si le estorba o dice algo raro, disminuye. La confianza inicial en cada personaje estará en proporción con su atributo de Carisma. Ciertos contextos o items de la conversación sólo serán accesibles si la confianza en el PJ está por encima de un umbral. \layout Subsection Salas llenas de gente \layout Standard ¿Cómo se comporta el sistema de conversaciones con varios jugadores acosando a preguntas al PNJ desde varios frentes? Los diálogos hacen mejor efecto cuando un solo jugador habla con el PNJ. \layout Standard El efecto confianza puede ayudar a resolver este problema. El PNJ sólo tocará los textos más delicados (es decir, que requieren una secuenciación correcta), si los PJ hablan de uno en uno. Además, sólo se dirigirá en este caso al PJ con el que tenga más confianza. Esto aproxima la conversación a un diálogo entre dos personajes. \layout Standard Otra idea para mejorar esto es que, si varios jugadores hablan a la vez, el PNJ sólo responda a aquél con el que ya estaba hablando, o bien con el que tenga más confianza. Esto último refuerza la ambientación de la característica Carisma: los PNJs tenderán a hablar con los PJ más carismáticos. \layout Subsection Iniciativa de los PNJ \layout Standard El personaje no jugador puede tener su propia agenda de intereses. Al tocar un cierto tema, se puede despertar su curiosidad por algún otro relacionado. Si el jugador no pregunta por este otro tema posteriormente, el PNJ tomará la iniciativa y lo introducirá en la conversación ('¿Te he dicho ya que maté 80 orcos en la Batalla de los 5 Ejércitos?'), en cuanto el diálogo decaiga. \layout Standard Además, el incluir temas con la iniciativa del PNJ puede valer para que reaccione a palabras clave de los diálogos entre los PJ, sin que resulte demasiado forzado. Por ejemplo, si el grupo de jugadores se pone a discutir a voz en grito sobre el Nigromante en medio de la posada, seguro que alguno de los aldeanos intervendrá en la conversación para recriminarles. Para hacer esto, no hace falta que el sistema sea capaz de entender el lenguaje natural de los mensajes entre jugadores; basta que reaccione a la palabra clave "Nigromante". \layout Standard Este sistema puede forzar a que los jugadores hablen con el PNJ más interesante de la sala, si antes les había pasado desapercibido. \layout Subsection Efectos especiales durante la conversación \layout Standard Los diálogos entre PJ y PNJ deberían estar plagados de 'frases de ambientación' que reflejen la actitud que presentan los personajes frente a cómo se está desarrollando el diálogo; o que refuercen el efecto dramático de los pasajes más importantes. Por ejemplo, cuando Gandalf lee en el Concilio de Elrond el texto inscrito en el Único en Lengua Negra, todos los presentes en la sala se estremecen, y un velo de oscuridad parece cubrir el sol. \layout Standard Estos 'trucos de ambientación' son especialmente efectivos si se refieren a posturas y expresiones de los personajes. Si aparecen frecuentemente durante el diálogo, se evita el efecto de bustos parlantes, personajes entre los cuales sólo se intercambia texto. Al describir su actitud corporal, la ambientación se enriquece y la credibilida d aumenta. \layout Standard Las frases de ambientación no necesariamente deben estar ligadas a un ítem de texto concreto; habrá un mecanismo para que la frase se pueda activar automáticamente en momentos claves del diálogo, por ejemplo cada vez que el humor del PNJ cambia, o bien cuando desciende por debajo de un cierto umbral. \layout Standard En realidad, este mecanismo de efectos especiales debería estar disponible para ser utilizado fácilmente en todos los comandos del juego: uso de objetos, magia, movimiento, combate... La diferencia entre Petria y Minë puede estar en que, en el combate, en vez de 'El monstruo de la cueva te pega un zurriagazo. Estás malherido' el mensaje que se muestre sea de tipo: 'El Trasgo Maloliente hace girar su bastón nudoso sobre su cabeza. Intentas esquivarlo echándote a un lado, pero dada la estrechez de la sala no consigues apartarte lo bastante rápido y el garrotazo te alcanza en el cuerpo. ¡Aï! ¡Ese último golpe parece haberte dejado sin respiración!' \layout Section \pagebreak_top Cómo construir una sala \layout Standard Abrimos un editor de textos cualquiera del que podamos estar seguros que será capaz de guardar en formato TXT simple. Nosotros recomendamos siempre el uso de software libre. \layout Standard Para los que deseen saber qué es lo que escribirán exactamente, podemos decir que se trata de un fichero XML. Un fichero XML es un documento con un lenguaje interno que nos permite conocer luego los elementos que lo conforman. La sintaxis puede resultar algo extraña para un profano pero no es necesario entenderla para escribir correctamente un fichero de éstos correctamente. \layout Subsection Datos generales en toda sala \layout Standard Nada más comenzar a escribir colocamos 'de regalo' estas dos líneas: \newline \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \series bold \newline \layout Standard No importa qué sala vayas a hacer, estas dos líneas aseguran que nuestro programa pueda dar por válido o no tu fichero. \layout Standard Una vez escritas esas dos líneas, ponemos: \newline \layout Standard \family typewriter \size footnotesize \series bold \newline \layout Standard en donde cada uno puede cambiar tanto el autor como el área pero no la version (¡ojo! NO poner tildes en \family typewriter \size small area="loquesea" \family default \size default ). Lo de \family typewriter \size small version="1.0" \family default \size default dejadlo así, es una manera de que el programa no se haga líos según vayamos evolucionando el formato de este fichero. Cada vez que se haga un cambio aumentaremos el número de versión, y el programa se negará a cargar ficheros con una versión distinta a la que él entiende. Para no desaprovechar el trabajo realizado, normalmente proporcionaremos un \emph on script \emph default para convertir automáticamente los ficheros a las nuevas versiones (si es posible hacerlo). Esto lo decimos para que la gente no se lleve a engaño y crea que \family typewriter \size small version="1.0" \family default \size default se refiere a la versión de su sala... Si deseáis realizar algún comentario, hacedlo en el campo -opcional- de \family typewriter \size small comentario="" \family default \size default (ej: \family typewriter \size small comentario="Sala de pruebas, intento de tener una sala con personajes no jugadores" \family default \size default ). No confundir tampoco con la version del lenguaje XML de la primera línea del fichero. \layout Standard Bien. Lo siguiente es bastante sencillo. \newline \layout Standard \family typewriter \size footnotesize moria-entrada01 \series bold \newline \layout Standard dentro de \family typewriter \size small \family default \size default habréis de poner un texto \series bold que no contenga espacios \series default y que identifique de forma unívoca al fichero en donde se guarda la sala. Para ello, la regla es que escribáis \newline \layout Standard \family typewriter \size small nombre_de_area-nombre_de_sala. \newline \layout Standard Es decir, dos partes separadas por un guión \begin_inset Quotes sld \end_inset - \begin_inset Quotes srd \end_inset , la primera coincide con el nombre del área que hemos puesto arriba, y la segunda es un nombre que no se repite dentro de ese área. En cada nombre se pueden usar únicamente letras, números y el signo \begin_inset Quotes sld \end_inset _ \begin_inset Quotes srd \end_inset para separar palabras. \layout Standard \series bold Importante \series default : el nombre del fichero que estáis editando será SIEMPRE el id de la sala + la coletilla '.xml'. Éste puede ser un buen momento para guardar el archivo con el nombre indicado. \layout Standard Si existe un área llamada "poblado" y creéis que la posada del poblado se merece un área para ella sola, indicadlo escribiendo \family typewriter \size footnotesize poblado_posada \family default \size default en el campo área de todas las salas que pertenezcan a la posada del poblado. La parte del id de una sala que se refiere a la sala en sí también puede contener más de dos palabras pero siempre separadas por guiones bajos (a modo de espacios), como por ejemplo; \family typewriter \size small piso01_cuarto02 \family default \size default . Con lo que el id completo resultaría ser: \newline \layout Standard \family typewriter \size footnotesize poblado_posada-piso01_cuarto02 \newline \layout Standard Al principio puede costar un poco acostumbrarse pero con el tiempo veréis que es mucho más inteligente para llevar buena cuenta de las áreas y las salas. \layout Itemize ejemplos válidos para id: \family typewriter \size footnotesize moria-sala07, moria-pasillo77, lorien_sur-estancia03, \begin_deeper \layout Standard \family typewriter \size footnotesize tharbad_oeste-posada03_piso02_cuarto01. \end_deeper \layout Itemize ejemplos no válidos: \family typewriter \size footnotesize lorienflet03 \family default \size default (no habéis puesto \family typewriter - \family default entre área y nombre de sala), \family typewriter \size footnotesize moriamazarbul \family default \size default (no habéis puesto \family typewriter - \family default ni un número, aunque sea 01), \family typewriter \size footnotesize tharbad-cocina8 \family default \size default (el número debería tener al menos dos cifras). \layout Standard Un área puede ser una construcción grande (+20 salas) o un pueblo, o una sección de un camino muy largo, etc. En general se apela al sentido común de la gente. No puede haber áreas de 5 salas porque sería fragmentar demasiado todo. Recomendamos que las áreas tengan un mínimo de 30 salas aunque hay casos particulares en donde podemos bajar a 20. \layout Standard Ahora viene algo bastante fácil, el nombre 'normal' de la sala, lo que aparecerá como título del lugar a los visitantes. \newline \layout Standard \family typewriter \size footnotesize la entrada a Moria \series bold \newline \layout Standard Intentad que se quede en menos de 6 palabras pero que sirva de referencia. El nombre debe contener un artículo y empezar por minúscula, ya que será mostrado de la forma "Estás en la entrada a Moria". \layout Subsection La descripción de la sala \layout Standard Ahora nos encontramos algo más largo pero que es a la vez lo más importante, sin duda. La descripción de la estancia en sí. \newline \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ Una gran sala se aparece ante ti. Tanto el techo como las paredes son de color rojizo oscuro y notas que la atmósfera es bastante húmeda debido, sin duda, a las filtraciones de agua del cercano lago. Tres columnas impiden que la estancia se derrumbe. \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ Hace tiempo que nadie limpia por aquí. \layout Standard \family typewriter \size footnotesize \series bold \newline \layout Standard Vayamos por partes. Lo primero que has de notar es que hemos escrito \family typewriter \size footnotesize \family default \size default . Exacto, nos hemos metido en el 'modo descripción'. Es aquí donde se demuestra la habilidad descriptiva del Maestro de lugares porque ha de tener en cuenta los siguientes elementos. \layout Enumerate La descripción ha de estar comprendida entre 3 y 10 líneas a ser posible. \layout Enumerate Esta descripción ha de ser intemporal y no depender de ninguna futura circunstan cia. Nada de 'un enorme orco de da la bienvenida' porque no sabemos cuánto tiempo va a durar ese pobre orco ahí (poco, lo más probable) y quedaría muy mal que la gente leyese algo que \series bold no \series default es verdad. \series bold Tampoco \series default alusiones a \series bold objetos \series default que se puedan coger son bienvenidas por el mismo motivo. Quizá en versiones posteriores de Minë esto pueda modificarse pero de momento no es posible. Entended que hemos de ir por partes. \layout Enumerate Ha de provocar al viajante una sensación global del lugar. \layout Standard Si leéis los dos 'items' dentro de \family typewriter \size footnotesize \family default \size default veréis que uno lleva un \family typewriter \size footnotesize dificultad='12' \family default \size default y el otro no. ¿Por qué? Digamos que una sala \series bold siempre \series default tiene un \family typewriter \size footnotesize \family default \size default sin dificultad que se le aparecerá a cualquier jugador que entre ahí mientras que aquellos \family typewriter \size footnotesize \family default \size default con dificultad aparecerán impresos sólo a aquellos personajes que superen una tirada interna de percepción del programa. Para que os hagáis una idea de a qué equivalen ciertos valores en la dificultad ahí va una tabla resumen orientativa. \layout Standard Dificultad de los items descriptivos en una sala: \layout Standard \begin_inset Tabular \begin_inset Text \layout Standard 0 \end_inset \begin_inset Text \layout Standard Para eso no pongas dificultad. Lo ve todo el mundo por muy cegato que esté. \end_inset \begin_inset Text \layout Standard 10 \end_inset \begin_inset Text \layout Standard Hombre, con un poco que se fije uno aparece. \end_inset \begin_inset Text \layout Standard 20 \end_inset \begin_inset Text \layout Standard Se podría decir que uno debe tener buen ojo para ver esto \end_inset \begin_inset Text \layout Standard 30 \end_inset \begin_inset Text \layout Standard La cosa se complica pero con mucha atención se acaba descubriendo. \end_inset \begin_inset Text \layout Standard 40 \end_inset \begin_inset Text \layout Standard Aquí aparece una barrera natural. Mucha gente no superará esta dificultad hasta que sume bastante experiencia. \end_inset \begin_inset Text \layout Standard 50 \end_inset \begin_inset Text \layout Standard Difícil aunque un elfo no tendría muchos problemas. \end_inset \begin_inset Text \layout Standard 60 \end_inset \begin_inset Text \layout Standard Aquí el humano corriente puede abandonar porque se dejaría los ojos antes que descubrir la descripción extra. \end_inset \begin_inset Text \layout Standard 70 \end_inset \begin_inset Text \layout Standard Aquí los elfos tienen ya problemas serios para ver algo. \end_inset \begin_inset Text \layout Standard 80 \end_inset \begin_inset Text \layout Standard Esta descripción se reserva para Istari en la práctica. \end_inset \begin_inset Text \layout Standard 90 \end_inset \begin_inset Text \layout Standard Gandalf tendría serios problemas. \end_inset \begin_inset Text \layout Standard 100 \end_inset \begin_inset Text \layout Standard Reservado a Maiar de alto linaje. \end_inset \end_inset \layout Standard Para que os hagáis más idea aún, diremos que en igualdad de tiempo jugado, de un grupo de humano, elfo, orco, hobbit o enano en los primeros niveles tendríamos que un humano apenas pasaría del 30, el elfo lograría quizá llegar al 50 en contadas ocasiones, el orco como el humano o un poco más, el hobbit como el humano y el enano se queda en el 40. \layout Standard Podéis poner tantos items descriptivos como queráis, con o sin dificultad pero intentad que el resultado final no sea excesivo o inundaréis de letras la pantalla del jugador (con la consiguiente desgana lectora de éste) \layout Subsection Las salidas en una sala \layout Standard \series bold Importante \series default : los siguientes datos se refieren a las posibles salidas. se recomienda que se relacionen items de descripción con alguna salida. De vez en cuando colocad el mismo valor de dificultad en aquellos \family typewriter \size footnotesize \family default \size default y salidas relacionados. Luego pondremos un ejemplo. \layout Standard Esto es bastante simple pero hay que entenderlo bien porque es lo que relaciona esta sala con el resto de ellas. \newline \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ la cocina \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ el salon \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ un cuartucho oscuro \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ la entrada \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ el baño \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ un estrecho [tunel] \layout Standard \family typewriter \size footnotesize \series bold \newline \layout Standard \series bold Importante \series default : También son válidas las salidas 'noreste, noroeste, sureste y suroeste'. \layout Standard Analicemos esto detenidamente. \layout Standard lo primero es escribir \family typewriter \size footnotesize \family default \size default (y lo último \family typewriter \size footnotesize \family default \size default ). Entremedias, y en este caso, tenemos 7 -siete- posibles direcciones a las que ir. Escribe tan sólo aquellas que de verdad existan o déjalas vacías. \layout Standard Por ej: \family typewriter \size footnotesize \family default \size default quiere decir que no hay nada hacia abajo. Para eso, simplemente no lo escribas. \layout Standard Cojamos la primera salida de nuestro ejemplo: \newline \layout Standard \family typewriter \size footnotesize la cocina \series bold \newline \layout Standard \family typewriter \size footnotesize ... de dicho fichero. \layout Standard \family typewriter \size footnotesize la cocina \size default \family default <-- Escribid en medio algo descriptivo que pudiese dar una idea al personaje de lo que hay en esa dirección. Puede coincidir exactamente con el verdadero nombre de la sala al oeste o puede que no. Por ejemplo, si Kloin el enano está vagando por los túneles de Moria y llega a una bifurcación del camino oeste-este puede que el este aparezca como "Al este divisas un pasadizo oscuro" \layout Standard \family typewriter \size footnotesize un pasadizo oscuro \layout Standard y el oeste como "Al oeste divisas un pasadizo con [restos] humanos" \layout Standard \family typewriter \size footnotesize un pasadizo con [restos] humanos \layout Standard Si Kloin el enano decide ir hacia el oeste se encontrará con que ha entrado en "La Antesala de Mazarbul" que, desde lejos, parecía un simple 'pasadizo con restos humanos'. \layout Standard Los jugadores también pueden usar la primera palabra de la descripción para moverse (exceptuando artículos: el, la, los, las, un, uno, una, unos, unas). En el ejemplo anterior es lo mismo decir "+sur" que "+entrada". Si no interesa la primera palabra, o hay varias salidas que repiten, se puede indicar otra rodeándola entre corchetes. En el caso que tenemos aquí, "+pasadizo" seria igual que "+este", y "+restos" seria "+oeste". Ojo, solo puede haber una palabra entre corchetes, sin espacios. Esto es imprescindible si se usan salidas con dirección . \layout Standard Bien. también está la dificultad. Si creéis que una de las salidas no es visible a simple vista podéis poner un \family typewriter \size footnotesize dificultad="37" \family default \size default que se aplicará de la misma forma que los items de la descripción de antes. \layout Standard Un personaje que sea capaz de ver un ítem de descripción de \family typewriter \size footnotesize dificultad='35' \family default \size default podrá ver cualquier salida con dificultad igual o menor a 35. Así que un \emph on combo descripción-salida \emph default puede ser el siguiente: \newline \layout Standard \family typewriter \size footnotesize Arriba alcanzas a ver una trampilla \layout Standard \family typewriter \size footnotesize ... \layout Standard \family typewriter \size footnotesize una trampilla \newline \layout Standard cada uno en su respectivo sitio dentro del fichero, claro. No abuséis mucho de las \family typewriter \size footnotesize dificultad=' ' \family default \size default . Usadlo con mesura. Se trata de la Tierra Media, no de un laberinto oscuro. Una salida con dificultad por sala es una auténtica burrada. Una por cada diez salas, aceptable, una por cada 20, correcto. Por otro lado, un personaje incapaz de ver una salida, podrá cruzarla si sigue a otro que pueda. \layout Standard Finalmente, tenemos los cierres. Las salidas normalmente se pueden transitar libremente, pero a veces nos podemos encontrar puertas con candado o algún otro tipo de obstáculo. De ello trata el \family typewriter \size footnotesize tipo_cierre \family default \size default , que por el momento puede tener los siguientes valores: \layout Itemize ninguno \begin_inset Formula $\rightarrow $ \end_inset éste significa que no hay cierre, es el que se sobreentiende si no ponemos nada. \layout Itemize cerradura \begin_inset Formula $\rightarrow $ \end_inset cualquier tipo de cerradura o candado que se abra con una llave. \layout Itemize horario \begin_inset Formula $\rightarrow $ \end_inset un cierre controlado por alguien que lo abre o cierra a determinadas horas. \layout Itemize magia \begin_inset Formula $\rightarrow $ \end_inset éste de momento no está hecho, pero en el futuro permitiremos bloquear mágicamente una puerta. \layout Standard Si ponemos un tipo de cierre distinto de "ninguno", pondremos también datos_cier re, que sera: \layout Itemize para \family typewriter \size footnotesize "cerradura" \family default \size default \begin_inset Formula $\rightarrow $ \end_inset el id del objeto llave \layout Itemize para \family typewriter \size footnotesize "horario" \family default \size default \begin_inset Formula $\rightarrow $ \end_inset las horas en las que está abierto (sólo horas completas, de 0 a 24). Por ejemplo, "10-14,17-21" está abierto de las 10:00 a las 14:00 y de las 17:00 a las 21:00. \layout Itemize para \family typewriter \size footnotesize "magia" \family default \size default \begin_inset Formula $\rightarrow $ \end_inset aquí pondremos el id del hechizo o algo así, cuando esté hecho. \layout Standard Y no nos queda más que \family typewriter \size footnotesize mensaje_cerrado \family default \size default , con el texto que le aparecerá al jugador si intenta pasar y no puede. \layout Standard Ejemplos de cierre podrían ser: \newline \layout Standard \family typewriter \size footnotesize \newline \layout Standard \family typewriter \size footnotesize \series bold \newline \layout Subsection Propiedades globales de la sala \layout Standard Ahora pasamos a una de las partes más sencillas, más rápidas y que más vida le dan al juego. \newline \layout Standard \family typewriter \size footnotesize \series bold \newline \layout Standard A simple vista parece sencillo rellenar este campo. Y lo es, para qué negarlo. \layout Standard Estas 'propiedades' se refieren a atributos muy específicos de la sala en la que estamos y la elección de los valores determinará mucho de lo que pueda acontecer en ella. \layout Standard Vayamos uno por uno. \layout Itemize tipo: Se refiere al campo semántico al que pertenece la sala. Puedes elegir entre: población, edificio, campo, agua, montaña y caverna. \layout Itemize subtipo: No es obligatorio pero sí muy recomendable. Se trata de especificar más sobre el tipo de sala. A continuación mostramos una lista de los tipos y sus subtipos correspondientes : \begin_deeper \layout Standard \begin_inset Tabular \begin_inset Text \layout Standard \series bold Población \end_inset \begin_inset Text \layout Standard \series bold Edificio \end_inset \begin_inset Text \layout Standard \series bold Campo \end_inset \begin_inset Text \layout Standard \series bold Agua \end_inset \begin_inset Text \layout Standard \series bold Montaña \end_inset \begin_inset Text \layout Standard \series bold Caverna \end_inset \begin_inset Text \layout Standard \size footnotesize \emph on cielo abierto, suelo liso \end_inset \begin_inset Text \layout Standard \size footnotesize \emph on techo, suelo liso \end_inset \begin_inset Text \layout Standard \size footnotesize \emph on cielo abierto, suelo irregular \end_inset \begin_inset Text \layout Standard \size footnotesize \emph on cielo abierto, suelo irregular, agua \end_inset \begin_inset Text \layout Standard \size footnotesize \emph on cielo abierto, suelo irregular, mucha altura \end_inset \begin_inset Text \layout Standard \size footnotesize \emph on techo, suelo irregular \end_inset \begin_inset Text \layout Standard \size footnotesize calle \end_inset \begin_inset Text \layout Standard \size footnotesize salon \end_inset \begin_inset Text \layout Standard \size footnotesize llanura \end_inset \begin_inset Text \layout Standard \size footnotesize ribera \end_inset \begin_inset Text \layout Standard \size footnotesize cima \end_inset \begin_inset Text \layout Standard \size footnotesize entrada \end_inset \begin_inset Text \layout Standard \size footnotesize callejon \end_inset \begin_inset Text \layout Standard \size footnotesize habitacion \end_inset \begin_inset Text \layout Standard \size footnotesize bosque \end_inset \begin_inset Text \layout Standard \size footnotesize costa \end_inset \begin_inset Text \layout Standard \size footnotesize ladera \end_inset \begin_inset Text \layout Standard \size footnotesize cueva \end_inset \begin_inset Text \layout Standard \size footnotesize plaza \end_inset \begin_inset Text \layout Standard \size footnotesize pasillo \end_inset \begin_inset Text \layout Standard \size footnotesize claro del bosque \end_inset \begin_inset Text \layout Standard \size footnotesize acantilado \end_inset \begin_inset Text \layout Standard \size footnotesize promontorio \end_inset \begin_inset Text \layout Standard \size footnotesize pasadizo \end_inset \begin_inset Text \layout Standard \size footnotesize portal \end_inset \begin_inset Text \layout Standard \size footnotesize escaleras \end_inset \begin_inset Text \layout Standard \size footnotesize colina \end_inset \begin_inset Text \layout Standard \size footnotesize cala \end_inset \begin_inset Text \layout Standard \size footnotesize grieta \end_inset \begin_inset Text \layout Standard \size footnotesize sima \end_inset \begin_inset Text \layout Standard \size footnotesize pasadizo \end_inset \begin_inset Text \layout Standard \size footnotesize vestibulo \end_inset \begin_inset Text \layout Standard \size footnotesize valle \end_inset \begin_inset Text \layout Standard \size footnotesize rio \end_inset \begin_inset Text \layout Standard \size footnotesize desfiladero \end_inset \begin_inset Text \layout Standard \size footnotesize rio subterraneo \end_inset \begin_inset Text \layout Standard \size footnotesize puerto \end_inset \begin_inset Text \layout Standard \size footnotesize cuarto sin ventanas \end_inset \begin_inset Text \layout Standard \size footnotesize pantano \end_inset \begin_inset Text \layout Standard \size footnotesize lago \end_inset \begin_inset Text \layout Standard \size footnotesize quebrada \end_inset \begin_inset Text \layout Standard \size footnotesize lago subterraneo \end_inset \begin_inset Text \layout Standard \size footnotesize arco \end_inset \begin_inset Text \layout Standard \size footnotesize sotano \end_inset \begin_inset Text \layout Standard \size footnotesize paramo \end_inset \begin_inset Text \layout Standard \size footnotesize mar \end_inset \begin_inset Text \layout Standard \size footnotesize abismo \end_inset \begin_inset Text \layout Standard \end_inset \begin_inset Text \layout Standard \size footnotesize embarcadero \end_inset \begin_inset Text \layout Standard \size footnotesize calabozo \end_inset \begin_inset Text \layout Standard \size footnotesize desierto \end_inset \begin_inset Text \layout Standard \size footnotesize islote \end_inset \begin_inset Text \layout Standard \size footnotesize cornisa \end_inset \begin_inset Text \layout Standard \end_inset \begin_inset Text \layout Standard \size footnotesize azotea \end_inset \begin_inset Text \layout Standard \size footnotesize alcantarilla \end_inset \begin_inset Text \layout Standard \end_inset \begin_inset Text \layout Standard \end_inset \begin_inset Text \layout Standard \end_inset \begin_inset Text \layout Standard \end_inset \begin_inset Text \layout Standard \end_inset \begin_inset Text \layout Standard \size footnotesize tejado \end_inset \begin_inset Text \layout Standard \end_inset \begin_inset Text \layout Standard \end_inset \begin_inset Text \layout Standard \end_inset \begin_inset Text \layout Standard \end_inset \begin_inset Text \layout Standard \end_inset \begin_inset Text \layout Standard \size footnotesize balcon \end_inset \begin_inset Text \layout Standard \end_inset \begin_inset Text \layout Standard \end_inset \begin_inset Text \layout Standard \end_inset \begin_inset Text \layout Standard \end_inset \begin_inset Text \layout Standard \end_inset \begin_inset Text \layout Standard \size footnotesize letrina \end_inset \begin_inset Text \layout Standard \end_inset \begin_inset Text \layout Standard \end_inset \begin_inset Text \layout Standard \end_inset \begin_inset Text \layout Standard \end_inset \end_inset \end_deeper \layout Itemize volumen: Se refiere, no al volumen físico sino a la capacidad de albergar a personas. Escribir un número entre 0 y lo que vuestra imaginación considere que es MUY grande. una persona normal ocupa 1 unidad de volumen (un hobbit 0.5 u.vol). Un dragón puede ocupar desde 30 hasta 500 u.vol. Si ponéis \family typewriter \size footnotesize volumen="0" \family default \size default nadie podrá entrar. si ponéis \family typewriter \size footnotesize volumen="0.5" \family default \size default , sólo los hobbits podrán entrar y sólo de uno en uno. Esto puede dar mucho juego. \begin_deeper \layout Standard Una plaza del pueblo, si la consideráis una sala única, podría tener \family typewriter \size footnotesize volumen='200' \family default \size default ó mucho más si se trata de Minas Tirith pero recomendamos que a partir de 200 subdividáis la estancia en varias o incluso convirtáis una zona con ambiente propio en un área diferente. Es decir, es mejor escribir ' \family typewriter \size footnotesize minastirith_ciudad-plaza01_norte01 \family default \size default ' \family typewriter \size footnotesize volumen='80' \family default \size default \family typewriter \size footnotesize 'minastirith_ciudad-plaza01_sur01' \family default \size default \family typewriter \size footnotesize volumen='90' \family default \size default que \family typewriter \size footnotesize 'mintastirith_ciudad-plaza01 \family default \size default ' \family typewriter \size footnotesize volumen='170' \family default \size default . Siempre habrá excepciones, naturalmente, pero se apela al sentido común del 'maestro de lugares'. Un cuarto corriente estaría entre \family typewriter \size footnotesize volumen='6' \family default \size default y \family typewriter \size footnotesize volumen='15' \family default \size default . \layout Standard Si una sala está repleta no podrás acceder a ella. Te aparecerá un mensaje como 'la Cocina está llena de gente, no puedes pasar'. \end_deeper \layout Itemize luz: esto que parece una tontería NO lo es. la luz tomará un valor entre 0 (oscuridad total) y 100 (¿el negro? ¿qué es el negro?). No cometáis el error de describir la sala como 'oscura y viscosa' y poner \family typewriter \size footnotesize luz='78' \family default \size default . \begin_deeper \layout Standard Al mediodía en la plaza mayor podríamos tener \family typewriter \size footnotesize luz='70' \family default \size default . Por la noche, con luna llena, \family typewriter \size footnotesize luz='27' \family default \size default En un cuarto con ventana, a media tarde, \family typewriter \size footnotesize luz='50' \family default \size default . En los pasadizos de Moria, \family typewriter \size footnotesize luz='20' \family default \size default \layout Standard Escribid el \family typewriter \size footnotesize luz="" \family default \size default el máximo posible de luz atendiendo al mediodía. El programa, según qué hora sea, hará un pequeño ajuste automático. \layout Standard La luz afecta a la percepción del personaje (vital para encontrar objetos, salidas o personajes escondidos), al combate (poca luz lo entorpece pero demasiada también), a los atributos de ciertas razas como los orcos por ejemplo, etc. Una \family typewriter \size footnotesize luz='90' \family default \size default se considera mágica, al igual que una \family typewriter \size footnotesize luz='10' \family default \size default se considera obra de algún tipo de hechicería oscura. \end_deeper \layout Itemize aura: Llegamos a una de las propiedades más importantes de todas. El aura no es realmente algo espiritual pero sirve bien para hacernos una idea. El aura es la sensación de bondad o maldad que desprende una sala. Un 0 significaría encontrarse en las propias entrañas de Melkor y un 100 haber cantado con los Ainur el Ainulindalë. Los valores con los que se trabajará normalmente estarán en el rango [25-75] y sólo de forma MUY excepcional se debería poner un 85 (el mismo centro de Lórien) o un 15 (el trono de Sauron). El aura es algo que también tienen los objetos y los personajes, tanto jugadores como controlados por el ordenador. Esto quiere decir que un orco tendrá típicamente un valor de \family typewriter \size footnotesize aura='35' \family default \size default mientras que un elfo, dependiendo de su casta podrá alcanzar \family typewriter \size footnotesize aura='70' \family default \size default . El aura de la sala no sólo sirve para hacernos una idea del ambiente que se 'respira' en ella sino que puede afectar de forma directa a los personajes que se encuentren en ella y que posean auras muy diferentes a las de la sala. Un orco de \family typewriter \size footnotesize aura='30' \family default \size default que entre en un santuario élfico de \family typewriter \size footnotesize aura='70' \family default \size default verá disminuido su potencial a prácticamente la mitad o incluso puede morir con sólo tocar un objeto puesto que una diferencia de 40 puntos en aura es excesiva. Un camino perdido en mitad de la Tierra Media tendrá un \family typewriter \size footnotesize aura='50' \family default \size default . Tened en cuenta en qué época estáis escribiendo vuestra área. Si lo hacéis a mediados de la tercera edad los valores son los que os hemos dicho pero según avanza el señor oscuro y llegamos al Señor de los Anillos no estaría de más restar 5 a todos los lugares normalitos. \layout Itemize combate: puede tomar dos valores. 'si' o 'no'. en principio todo sitio permite el combate (así que si no pones, se sobreentien de que has puesto \family typewriter \size footnotesize combate='si' \family default \size default ) pero a veces conviene reservar ciertos lugares para la curación o para charlar sin ser molestados, o quizá es que no hay apenas sitio ( \family typewriter \size footnotesize volumen='2' \family default \size default ) para hacerlo, y entonces podéis poner \family typewriter \size footnotesize combate="no" \family default \size default . \layout Itemize ocultabilidad: esto resume dos aspectos de la sala. por un lado lo abigarrada que está de trastos o lo llena de piedras y ramas, por otro la facilidad para ocultarse en ella. un valor de cero '0' indica que es imposible ocultarse por los motivos que sean mientras que un valor de 100 quiere decir que ni tú mismo serías capaz de encontrarte aunque te palparas. Un valor estándar para estancias en casas podría ser de \family typewriter \size footnotesize ocultabilidad='15' \family default \size default . No convirtamos la Tierra Media en el juego del escondite, no te pases dando facilidades para ocultarse. Este valor también se tendrá en cuenta a la hora de intentar descubrir personajes escondidos en la sala. Naturalmente, el valor de la ocultabilidad se verá modificado dependiendo del número de personas que en esa sala ya se encuentran ocultas. \layout Subsection Objetos en la sala \layout Standard Y llegamos a los objetos, otra de las partes más interesantes de una sala. En principio un objeto o lo tiene un personaje o lo tiene una sala. Cada \family typewriter \size footnotesize \family default \size default tiene un \family typewriter \size footnotesize id="identificativo" \family default \size default , una \family typewriter \size footnotesize cantidad \family default \size default mayor que 1 (si no se especifica se sobreentiende que es 1) y una \family typewriter \size footnotesize dificultad \family default \size default de encontrarlo (se aplica el mismo criterio que arriba) aparte, naturalmente, de un breve texto o una palabra que haga referencia a él. \newline \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize una poción recuperadora \layout Standard \family typewriter \size footnotesize una espada brillante \layout Standard \family typewriter \size footnotesize una poción curativa \layout Standard \family typewriter \size footnotesize \newline \layout Standard El texto o palabra descriptivo (lo que se encuentra dentro de los signos \family typewriter \size footnotesize > \family default \size default y \family typewriter \size footnotesize < \family default \size default ) no ha de ser necesariamente el texto 'verdadero' del objeto aunque sí tiene que ver algo con él. \layout Standard Una espada herrumbrosa no debería hacer referencia al fichero \family typewriter \size footnotesize id="vino34" \family default \size default , por ejemplo. Pero una poción élfica reconstituyente sí podría verse a simple vista como una 'poción vitalizante' que hace referencia oculta al fichero con \family typewriter \size footnotesize id="pocion_elfica02" \family default \size default . Es decir, el personaje verá sólo aquellos objetos con una dificultad aceptable (si un objeto no dispone de dificultad se sobreentiende que se ve a simple vista) y de éstos, sólo la descripción y la cantidad. Si un personaje decide recoger un objeto, automáticamente descubrirá su nombre verdadero pero no sus efectos hasta que no lo examine (a no ser que ya lo sepa porque haya tenido previamente uno de ellos) , y aún así podría no conocerlo todo sobre el objeto en cuestión hasta que no se decida a usarlo. Además, la \family typewriter \size footnotesize probabilidad \family default \size default marca la facilidad (de 1 a 100) de que aparezca \emph on espontáneamente \emph default ese objeto en la sala cuando entra un personaje). Esto sirve para lugares en donde de vez en cuando aparecen hierbas curativas o pequeños trozos de pan, etc. Hay que usar esto con mucho cuidado. Recordad que la cantidad marca el número inicial de regalo de esos objetos, una vez que se acaben se comenzará a aplicar la probabilidad que será 0 si no pusiste tal atributo. El \family typewriter \size footnotesize maximo \family default \size default indica el tope de número de ese objeto que puede generarse en esa sala. Tened en cuenta que si hay una probabilidad alta de que aparezca un objeto al entrar un personaje, al cabo de unos días aquello podría ser imposible de transitar. Si colocamos un \family typewriter \size footnotesize maximo="3" \family default \size default nos aseguramos que nunca se superará esa cantidad para ese objeto en particular y esa sala. Si no colocas un máximo, se sobreentiende el valor inicial que aparece en la sala. Si el máximo es 0, no hay límite y la cantidad puede crecer indefinidamente ¡cuidado!. \layout Standard En cualquier caso, cada objeto tiene un fichero y tendrás que leerte el apéndice \series bold Cómo fabricar un objeto \series default para entender del todo cómo funcionan. \layout Standard La descripción del objeto sigue las mismas normas que el \family typewriter \size footnotesize \family default \size default de un objeto, tal como se explica en el apéndice mencionado. \layout Subsection Personajes no jugadores (en construcción) \layout Standard Y por último nos encontramos con los encuentros de personajes no jugadores. \newline \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize un unicornio \layout Standard \family typewriter \size footnotesize un orco \layout Standard \family typewriter \size footnotesize \series bold \newline \layout Standard Un encuentro se compone de - \family typewriter \size footnotesize id \family default \size default -, que es el fichero en donde residen sus datos, una - \family typewriter \size footnotesize probabilidad \family default \size default - que indica la facilidad con la que puede aparecer 'mágicamente' en el lugar (de 0 a 100 siendo 0 imposible y 100 todo el rato que alguien entre en la sala), una - \family typewriter \size footnotesize dificultad \family default \size default - que marca la fácil o difícil que es descubrir al encuentro en la sala y - \family typewriter \size footnotesize cantidad \family default \size default - que indica el valor inicial del número de ese tipo de encuentros y el posterior número de unicornios u orcos que mágicamente pueden aparecer cuando entre un personaje en la sala. Si se omite la probabilidad, se sobreentiende 0 y si se omite la cantidad se sobreentiende 1. El máximo funciona igual que en los objetos. Luego está la descripción genérica para que sepáis cómo hacer referencia a ellos en vuestras acciones de compra-venta, charla o combate. \layout Subsection Finalmente... \layout Standard Y por último. \newline \layout Standard \family typewriter \size footnotesize \series bold \newline \layout Standard Guardad este fichero como uno de tipo xml. \layout Standard ejemplo: moria-entrada01.xml \layout Standard Bien, un texto completo quedaría tal que así: \layout Standard ---------------------- \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize moria-entrada01 \layout Standard \family typewriter \size footnotesize la sala nueva \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ Una sala nueva se aparece ante ti. Tanto el techo como las paredes son de color rojizo oscuro y notas que la atmósfera es bastante húmeda debido, sin duda, a las filtraciones de agua del cercano lago. Tres columnas impiden que la estancia se derrumbe. \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ Hace tiempo que nadie limpia por aquí. \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ la cocina \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ el salon \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ un cuartucho oscuro \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ la entrada \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ el baño \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ un estrecho [tunel] \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ una pocion recuperadora \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ una espada brillante \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ una pocion curativa \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ un unicornio \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ u n orco \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \layout Standard ---------------------- \layout Standard Lo que un personaje estándar vería, por ejemplo, sería algo como: \newline \newline \layout Standard Estás en la sala nueva: \newline \layout Standard ********* \layout Standard Una sala nueva se aparece ante ti. Tanto el techo como las paredes son de color rojizo oscuro y notas que la atmósfera es bastante húmeda debido, sin duda, a las filtraciones de agua del cercano lago. Tres columnas impiden que la estancia se derrumbe. \newline \layout Standard Hace tiempo que nadie limpia por aquí. \layout Standard ********* \newline \layout Standard Al oeste ves la cocina \layout Standard Al este ves el salón \layout Standard Al norte ves un cuartucho oscuro \layout Standard Al sur ves la entrada \layout Standard Hacia arriba ves el baño \layout Standard También ves un estrecho [tunel] \newline \layout Standard Aquí se encuentran: \layout Standard un unicornio \layout Standard un orco \layout Standard Galran el elfo \newline \layout Standard Aquí hay: \layout Standard una pocion recuperadora (3) \layout Standard una espada brillante \layout Standard una pocion curativa (2) \layout Standard ? \layout Standard ------------------------ \layout Subsection Consejos \layout Enumerate Sé coherente. primero escribe la descripción general, luego las especiales y luego las propiedades, asegúrate que el sentido común impera. Un baúl en un sitio con \family typewriter \size footnotesize luz="75" \family default \size default y \family typewriter \size footnotesize ocultabilidad="2" \family default \size default no puede tener \family typewriter \size footnotesize dificultad="70" \family default \size default porque es que se ve a simple vista. \layout Enumerate No hagas lugares generadores de monstruos. hacer algo como \family typewriter \size footnotesize orco enorme \family default \size default sólo tiene sentido en mitad de Mordor. \layout Enumerate Para los caminos o lugares cuya descripción es muy repetitiva no te comas la cabeza, copia varias veces el mismo fichero, retoca el nombre de ese trozo del camino y hacia adonde apuntan las salidas y poco más. \begin_deeper \layout Standard ejemplo: \layout Standard Estás en un lugar del camino de Bree: \layout Standard ******* \layout Standard Un trozo de camino igual que tantos otros. Algo de vegetación y surcos de ruedas en la blanda tierra. \layout Standard ******* \layout Standard Al norte ves que el camino sigue. \layout Standard Al sur ves que el camino sigue. \newline \layout Standard No encuentras nada. \layout Standard Aquí no hay nadie. \layout Standard ? \layout Standard ------ \layout Standard cuyo fichero sería algo como: \layout Standard ------------------------- \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize camino_bree-camino34 \layout Standard \family typewriter \size footnotesize un lugar del camino de Bree \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ Un trozo de camino igual que tantos otros. Algo de vegetación y surcos de \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ ruedas en la blanda tierra. \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ que el camino sigue \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ que el camino sigue \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \layout Standard ------------------ \end_deeper \layout Enumerate Intenta no forzar a que la gente escriba con tildes porque si bien los creadores de este juego defendemos la ortografía creemos que dificultaría el disfrute de gente con teclados americanos. Por lo tanto los objetos o cualquier encuentro o lo que sea que haya que escribir su nombre no debe tener ni tildes ni nuestra preciada eñe. En lugar de la eñe, escribid una simple 'n'. \layout Enumerate Todos los atributos que sean \family typewriter \size footnotesize dificultad="3" \family default \size default o \family typewriter \size footnotesize atributo="constitucion" \family default \size default DEBEN tener comillas en los valores. Serán no válidos cosas como \family typewriter \size footnotesize aura=3 \family default \size default ó \family typewriter \size footnotesize volumen=34 \family default \size default , cuidad que las comillas son las mismas y no se os escapa una mezcla como \family typewriter \size footnotesize ocultabilidad='3" \family default \size default , por ejemplo. \layout Enumerate Ningún \family typewriter \size footnotesize \family default \size default debe contener '.xml' al final. sólo el fichero en donde se guardan esos datos. \layout Section \pagebreak_top Cómo fabricar un objeto \layout Standard Lo primero es abrir un editor de textos simple con un nombre del estilo de \family typewriter abrigo03.xml \family default o \family typewriter pocion_elfica11.xml \family default , etc. \layout Subsection Inicialmente \layout Standard Escribimos estas dos líneas tal cual. \newline \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \series bold \size small \newline \layout Standard luego escribimos esta línea modificando en cada caso el autor. El comentario y el área son opcionales (el área raras veces se escribe ya que los objetos son móviles y no parece que tengan que pertenecer a un área concreta). \newline \layout Standard \family typewriter \size footnotesize \layout Subsection Datos generales \layout Standard Ponemos \family typewriter \size footnotesize \family default \size default y entremedias el nombre del fichero que estamos editando y que corresponde al identificador del objeto SIN .xml. \newline \layout Standard \family typewriter \size footnotesize pocion01 \series bold \size small \newline \layout Standard luego ponemos entre \family typewriter \size footnotesize \family default \size default y \family typewriter \size footnotesize \family default \size default una par o tres de palabras por el que queremos que se conozca nuestro objeto (es mucho mejor sin tildes) \newline \layout Standard \family typewriter \size footnotesize una pocion recuperadora \newline \layout Standard El nombre del objeto normalmente empezará por un artículo, ya que en las listas de objetos aparecerá algo así: \begin_inset Quotes sld \end_inset Aquí hay una pocion recuperadora \begin_inset Quotes srd \end_inset . \layout Standard La primera palabra (que no sea artículo) del nombre servirá para que los jugadores se refieran a ese objeto cuando esté dentro de una lista. Por ejemplo, un jugador puede escribir \family typewriter \size footnotesize +beber pocion \family default \size default para usar el objeto del ejemplo. \layout Standard Si queremos usar otra palabra que no sea la primera, o varias palabras, las rodearemos por un par de corchetes [ ]. En el caso anterior, si queremos que el usuario tenga que escribir \family typewriter \size footnotesize +beber recuperadora \family default \size default , escribiremos: \newline \layout Standard \family typewriter \size footnotesize una pocion [recuperadora] \layout Subsection Descripción \layout Standard Llega la descripción. ponemos \family typewriter \size footnotesize \family default \size default y luego tantos \family typewriter \size footnotesize \family default \size default 's como queramos (mínimo 1). No hay que poner muchos, con uno basta, aunque si queremos poner algún ítem secreto podemos hacerlo especificando una \family typewriter \size footnotesize dificultad='nn' \family default \size default como aparece en el ejemplo de abajo. \newline \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize Se trata de un elixir fabricado a partir de hojas frescas de diversas plantas y que devuelve un poco de vitalidad a la persona que la ingiere. \layout Standard \family typewriter \size footnotesize Devuelve hasta 15 pv. si se conoce Hierbas \layout Standard \family typewriter \size footnotesize \size small \newline \layout Subsection Propiedades generales \layout Standard Y llegamos a las propiedades generales. Para \family typewriter \size footnotesize aura \family default \size default consúltese el Apéndice \series bold Cómo construir una sala \series default . \family typewriter \size footnotesize volumen \family default \size default : lo que ocupa. desde 0 (despreciable) hasta infinito. Una caja de zapatos ocupa \family typewriter \size footnotesize volumen='0.2' \family default \size default . \family typewriter \size footnotesize volumen='1' \family default \size default es como un humano adulto así que con esa referencia debería valer. \layout Itemize tipo: madera, metal, cristal, piel, tejido, piedra, organico, cera, liquido o barro (de momento). \layout Itemize categoria (no es obligatorio): mobiliario, arma, recipiente, joya, armadura, herramienta, vestimenta, escritura, recipiente, comestible o accesorio (de momento) \layout Itemize peso: en kilos \layout Itemize cargas: un valor numérico que indica cuántas veces se puede usar hasta que el objeto sea descartado. un valor de '0' quiere decir que siempre se puede usar y es típico de objetos permanentes. \layout Itemize valor: en monedas de estaño. una barra de pan o una jarra de cerveza cuestan 1me. una espada corriente cuesta 8 monedas de plata. una hierba curativa muy rara cuesta, por ej, 4 monedas de oro. \begin_deeper \layout Standard TABLA de precios (copiado de MERP) 10me = 1 moneda de cobre 10mc = 1 moneda de plata 10mp = 1 moneda de oro 100mo= 1 moneda de mithril \layout Standard Así, si algo cuesta 3 monedas de oro, en valor pon \family typewriter \size footnotesize valor="3000" \family default \size default . \end_deeper \layout Itemize estado: el estado en el que está el objeto. 100 quiere decir que está como nuevo (o lo que 'nuevo' pueda significar en cada caso) y si llega a '0' el objeto se pierde irremisiblemente. Para subir el valor de estado habrá que utilizar ciertas habilidades. Un objeto no tiene por qué comenzar con un estado="100", pero si empieza con estado="0" se romperá en cuanto alguien lo coja. \newline \layout Standard \family typewriter \size footnotesize \newline \layout Subsection Usos \layout Standard Llamamos uso a una forma concreta de utilizar el objeto. Una espada puede empuñarse o arrojarse (dos usos), una botella puede beberse, arrojarse o empuñarse (tres usos) y así con muchos objetos. \layout Standard La sintaxis de los usos va como sigue: \newline \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ ... \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ ... \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ ... \layout Standard \family typewriter \size footnotesize \family default \size default \newline \newline Como puede apreciarse, un objeto puede tener varios usos y cada uso puede tener ninguno o varios requisitos y ninguno o varios efectos. Los tipos posibles para el uso son: \series bold comer \series default , \series bold beber \series default , \series bold poner \series default (ponerse una pieza de ropa, un collar, un anillo, etc), \series bold lanzar \series default (algo que se arroja y golpea, causando daño) y \series bold usar \series default (uso genérico, como en un artefacto mecánico). El uso \begin_inset Quotes eld \end_inset lanzar \begin_inset Quotes erd \end_inset puede ser obviado ya que todo objeto es \emph on lanzable \emph default . Minë calculará unos requisitos y efectos genéricos para el objeto cuando se desee lanzar. Sin embargo, Minë no realizará estos cálculos automáticos si encuentra un uso de tipo 'lanzar' explícito en el fichero descriptivo del objeto. \layout Standard Las diferentes posiciones en las que un objeto se puede \series bold poner \series default son: \series bold cabeza, cuello, tronco, brazo-izq, mano-izq, brazo-der, mano-der, dos-manos, pierna-izq, pierna-der, pie-izq, pie-der \series default (para los otros usos no es necesario indicar posición). Naturalmente, un arma puede empuñarse tanto con la mano derecha como con la izquierda así que pondremos dos usos diferentes para las dos manos. Suponiendo que los PJs son todos diestros (aunque esto es fácilmente cambiable) tendremos que los requisitos de destreza con la mano izquierda serán mayores y el efecto en el combate será menor. \layout Standard El \series bold gasto \series default es el número de cargas que gasta este uso. 0 = no gasta. * = gasta todas las que resten. Si se cumplen los requisitos pero no hay suficientes cargas para un uso concreto Minë avisará al jugador. \layout Standard La \series bold duración \series default en el efecto se refiere al número de segundos que dura el efecto (pon 0 si es definitivo, o no pongas \family typewriter \size footnotesize duración='' \family default \size default ). El tiempo lo lleva el servidor de Minë así que será independiente de los ordenadores de los jugadores. En el momento en el que un uso activa una \emph on cuenta atrás \emph default , Minë se hace cargo del tiempo y avisará cuando el efecto haya pasado (si es menester). La duración en el uso se refiere al tiempo que existe ese uso con ese objeto. Esto permite añadir usos a objetos durante el juego mediante habilidades especiales (encender una antorcha, por ejemplo). \layout Standard Los \series bold requisitos \series default pueden pedir ciertos valores mínimos a los atributos: \series bold Fuerza, Destreza, Constitución, Inteligencia, Sabiduría, Carisma, luz \series default y \series bold Aura \series default . Los efectos incluyen estos atributos y añaden: \series bold Vida, Ataque \series default y \series bold Defensa \series default . \layout Standard En nuestro ejemplo particular: \newline \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \layout Standard \family typewriter \size footnotesize \series bold \newline \layout Standard Como vemos, este objeto requiere una mínima coordinación cabeza-mano ( \family typewriter \size footnotesize destreza='3' \family default \size default ) y un aura aceptable ( \family typewriter \size footnotesize aura='47 \family default \size default '). Si se cumplen estos requisitos, la vida subirá 15 puntos. Es posible que personajes con habilidades especiales puedan sacar más partido a esta poción. \layout Standard Uniendo todos los pedazos de nuestro fichero descriptor del objeto pocion01, tenemos: \newline \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \layout Standard \family typewriter \size footnotesize \SpecialChar ~ pocion01 \layout Standard \family typewriter \size footnotesize \SpecialChar ~ una pocion recuperadora \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ Se trata de un elixir fabricado a partir de hojas frescas de diversas plantas y que devuelve un poco de vitalidad a la persona que la ingiere. \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ Devuelve hasta 15 pv. \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \newline \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \layout Standard \family typewriter \size footnotesize \SpecialChar ~ \layout Standard \family typewriter \size footnotesize \layout Section \pagebreak_top Normas de diseño de código fuente en Minë \layout Itemize Es pérdida de tiempo escribir código para que haga cosas en seguida, y luego borrarlo y volverlo a escribir para que haga cosas bien. Esto sólo es válido para hacer prototipos de alguna técnica nueva que aún no se conoce. \layout Itemize Para el resto del código, hay que diseñar primero el interfaz de las clases y luego el código. El interfaz consiste en las declaraciones de clase y de métodos, incluyendo los "doc comments". \layout Itemize Dicho de otra manera, hay que escribir primero el "contrato" de la clase y luego la implementación del contrato (para saber qué significa esto, seguir leyendo). El contrato es la parte más "creativa" de escribir, si está bien hecho, la implementación es casi automática. \layout Subsection Diseño por contrato \layout Paragraph Tipos Abstractos de Datos \layout Standard Según esta técnica, cada clase representa un Tipo Abstracto de Datos, en el sentido matemático: es decir, una pieza de información, con propiedades (o atributos), y operaciones que realizan cálculos sobre esas propiedades o cambian el valor de las mismas. El interfaz de la clase debe coincidir con el T.A.D., y el resto de la clase debe ser oculto (privado). \layout Description ejemplo una Sala es una habitación o lugar del juego. Sus propiedades son el id, autor, nombre, volumen, personajes que contiene, etc. Sus operaciones son crear una sala nueva, entrar y salir un personaje, etc. \begin_deeper \layout Standard En Python, el mapa entre T.A.D. y clase no está perfectamente definido, pero \emph on grosso modo \emph default , las propiedades corresponden a los atributos públicos, y las operaciones a las funciones miembro, públicas también. La parte privada de la clase no tiene reflejo en el T.A.D., y no debe ser conocida por ningún otro trozo de código. \layout Description ejemplo Sala.id, Sala.autor, etc. son atributos, y \family typewriter \size footnotesize Sala.__init__(), Sala.entrar_personaje() \family default \size default , etc. son funciones miembro. \end_deeper \layout Paragraph Requisitos de las propiedades: dominios e invariantes \layout Standard Las propiedades deben cumplir una serie de requisitos. Por un lado, el DOMINIO o conjunto de valores que puede tomar (es decir, el tipo: string, int, etc.). \layout Description ejemplo El dominio del id de una Sala son los números enteros (int), el del autor son las cadenas de caracteres (string), etc. \begin_deeper \layout Standard En Python, los tipos existen pero no son declarados (es un lenguaje dinámicament e tipado), e incluso una variable puede adoptar valores de distintos tipos. Esto puede ser cómodo en proyectos pequeños, pero en los medianos o grandes, hay que indicar los tipos en el interfaz, y para ello se pueden usar los strings de documentación. Estoy buscando una forma más o menos estándar de hacerlo, pero de momento lo haremos así (si un atributo puede tener distintos tipos, se comenta también, pero no es algo tan frecuente): \layout Standard \family typewriter \size footnotesize > class Sala: \layout Standard \family typewriter \size footnotesize > """ \layout Standard \family typewriter \size footnotesize > \layout Standard \family typewriter \size footnotesize > \layout Standard \family typewriter \size footnotesize > \layout Standard \family typewriter \size footnotesize > Contiene los siguientes atributos: \layout Standard \family typewriter \size footnotesize > - id (string): \layout Standard \family typewriter \size footnotesize > - luz (int): \layout Standard \family typewriter \size footnotesize > [...] \layout Standard \family typewriter \size footnotesize > """ \layout Standard Por otro, las propiedades tienen restricciones o condiciones que deben cumplirse siempre. A estas condiciones se les denomina INVARIANTES. Una instancia cuyas propiedades cumplen todas las invariantes es una instancia válida. NO SE ADMITEN INSTANCIAS NO VÁLIDAS EN NINGÚN MOMENTO, excepto durante la creación de la instancia o la ejecución de una única de sus funciones miembro públicas. A la salida de cualquier función miembro pública, el código debe asegurar que ninguna invariante se ha roto, en ningún caso (esto no es necesario en las privadas). \layout Description ejemplo son invariantes \family typewriter \size footnotesize Sala.area != None, aura in range(0,100), n_jugadores >= 0, n_jugadores <= len(personajes) \family default \size default , etc. El \family typewriter \size footnotesize __init__() \family default \size default debe dar valores a todos los atributos que satisfagan todas las invariantes. No se admite, por ejemplo, crear una sala con area == None, y luego darle un valor más tarde. Sí se admite que el \family typewriter \size footnotesize __init__() \family default \size default la inicialice a None y más tarde llame a una función que lee el área de un fichero y actualice el valor, siempre y cuando todo ello ocurra dentro de la ejecución de \family typewriter \size footnotesize __init__() \family default \size default . \layout Standard En Python no hay ningún mecanismo para expresar invariantes, así que lo haremos también en la documentación. También estoy buscando una forma estándar. De momento será como sigue. Durante la depuración, si se quiere verificar algunas invariantes, se puede usar la instrucción assert justo antes del return de todas las funciones (no hacerlo sistemáticamente con todas, porque puede cargar mucho). \layout Standard \family typewriter \size footnotesize > class Sala: \layout Standard \family typewriter \size footnotesize > """[...] \layout Standard \family typewriter \size footnotesize > [...] \layout Standard \family typewriter \size footnotesize > Invariantes: \layout Standard \family typewriter \size footnotesize > id != None \layout Standard \family typewriter \size footnotesize > aura in range(0,100) \layout Standard \family typewriter \size footnotesize > n_jugadores <= len(personajes) \layout Standard \family typewriter \size footnotesize > [...] \layout Standard \family typewriter \size footnotesize > """ \layout Standard \family typewriter \size footnotesize > \layout Standard \family typewriter \size footnotesize > def entrar_personaje(self, personaje): \layout Standard \family typewriter \size footnotesize > [...] \layout Standard \family typewriter \size footnotesize > assert self.n_jugadores <= len(self.personajes) \layout Standard \family typewriter \size footnotesize > \layout Standard \family typewriter \size footnotesize > def salir_personaje(self, personaje): \layout Standard \family typewriter \size footnotesize > [...] \layout Standard \family typewriter \size footnotesize > assert self.n_jugadores <= len(self.personajes) \end_deeper \layout Paragraph Requisitos de las operaciones: declaración, precondiciones y postcondiciones \layout Standard Las operaciones también tienen requisitos. Por un lado, está la DECLARACIÓN (el nombre y tipo de los parámetros, y el tipo de valor devuelto). \layout Description ejemplo, la operación "entrar personaje en una sala" tiene un parámetro que es la sala y otro que es el personaje que entra; sus tipos son las clases Sala y Personaje. No devuelve ningún valor. \begin_deeper \layout Standard En Python los parámetros vienen explícitos, y los tipos se pueden poner en el comentario, si no son obvios. Pueden ser obvios en los siguientes casos: si el nombre coincide con el de una clase, el tipo es esa clase; si coincide con el de un atributo de la clase actual, el tipo es el mismo que el del atributo; si el tipo es int o string, en muchos casos queda claro con sólo el nombre. Lo mismo con el valor de retorno. \layout Standard \family typewriter \size footnotesize > def entrar_personaje(self, personaje): \layout Standard \family typewriter \size footnotesize > """[...] \layout Standard \family typewriter \size footnotesize > self(Sala) -- obvio, el self siempre está claro \layout Standard \family typewriter \size footnotesize > personaje(Personaje) -- obvio, mismo nombre que clase \layout Standard \family typewriter \size footnotesize > """ \layout Standard \family typewriter \size footnotesize > \layout Standard \family typewriter \size footnotesize > def mensaje_filtrado(self, mensaje, idioma, oyente): \layout Standard \family typewriter \size footnotesize > """[...] \layout Standard \family typewriter \size footnotesize > mensaje(string) -- puede ser obvio, no hay clase mensaje así que \layout Standard \family typewriter \size footnotesize > será un string \layout Standard \family typewriter \size footnotesize > idioma(Idioma) -- obvio, nombre de clase \layout Standard \family typewriter \size footnotesize > oyente(Personaje) -- en principio no es obvio, pero se sabe \layout Standard \family typewriter \size footnotesize > por la descripción del método \layout Standard \family typewriter \size footnotesize > \layout Standard \family typewriter \size footnotesize > Devuelve string -- puede ser obvio también por la descripción \layout Standard \family typewriter \size footnotesize > """ \layout Standard Las PRECONDICIONES son requisitos que hay que cumplir antes de llamar a una operación. Pueden referirse a los parámetros de la operación o a las propiedades de la clase. Su comprobación es responsabilidad del código llamante (lo puede hacer bien explícitamente, con algún if, o bien apoyándose en una invariante o postcondición). La función debe asumir que las precondiciones se cumplen, y no debe volverlas a chequear. Así se asegura que cada chequeo se realiza sólo una vez, y se evitan redundanci as. \layout Description ejemplo, la sala tiene una invariante que dice que el aura es mayor que 0. Si el constructor lee los datos de la sala de un fichero, al leer el aura debe comprobar que cumple la invariante, y si no, dar un error y no crear la sala. A partir de ahí, todo el resto del código asume que el aura es mayor que 0, y se puede pasar como parámetro a una función que tenga esto como precondici ón. \layout Standard En Python las precondiciones las colocaremos en el texto del comentario, de la \layout Standard siguiente manera. Durante la depuración, también se puede usar assert para \layout Standard comprobar algunas precondiciones, justo al principio de la función: \layout Standard \family typewriter \size footnotesize > def salir_personaje(self, personaje): \layout Standard \family typewriter \size footnotesize > """[...] \layout Standard \family typewriter \size footnotesize > Requiere: \layout Standard \family typewriter \size footnotesize > personaje != None \layout Standard \family typewriter \size footnotesize > personaje in self.personajes.values() \layout Standard \family typewriter \size footnotesize > [...] \layout Standard \family typewriter \size footnotesize > """ \layout Standard \family typewriter \size footnotesize > assert personaje in self.personajes.values() \layout Standard Las POSTCONDICIONES son requisitos que una operación se compromete a asegurar que se cumplen una vez que la misma haya terminado con éxito. Pueden referirse a las propiedades de la clase o al valor de retorno, si lo hay. El código llamante no debe volverlos a chequear. En cierta forma, las postcondiciones representan la información semántica de la operación (su utilidad prevista), frente a la información sintáctica de la declaración. \layout Description ejemplo, la operación salir personaje de una sala asegura que si se completa con éxito, el personaje ya no está dentro de la sala. \layout Standard En Python, se colocan de forma similar a las precondiciones. Si se usa el assert, se puede poner justo antes de volver, o en el código llamante justo después de hacer la llamada: \layout Standard \family typewriter \size footnotesize > def salir_personaje(self, personaje): \layout Standard \family typewriter \size footnotesize > """[...] \layout Standard \family typewriter \size footnotesize > Asegura: \layout Standard \family typewriter \size footnotesize > personaje not in self.personajes.values() \layout Standard \family typewriter \size footnotesize > """ \end_deeper \layout Paragraph El contrato \layout Standard El conjunto de requisitos de propiedades y operaciones se conoce como el CONTRATO del T.A.D. Se llama así porque se asemeja a un contrato real: existe un proveedor (la clase), clientes (cualquiera que lea sus propiedades o use sus operaciones) y cláusulas (los requisitos). \layout Standard Igual que en un contrato real, cada parte se compromete a cumplir su obligación, y hay un sistema para tratar los incumplimientos. El cliente se compromete a asegurar las precondiciones. Si no se puede cumplir alguna de ellas, no debe llamar a la operación en ningún caso. Una función no debe añadir código para protegerse contra precondiciones no cumplidas (puede permitirse incluso dejar el ordenador colgado o matar el programa si quiere), ya que nunca se va a dar el caso cuando el programa esté depurado (durante la depuración se puede usar assert). \layout Standard El constructor de la clase debe asegurar todas las invariantes. Si no es posible cumplir alguna de ellas, debe lanzar una EXCEPCIÓN y abortar la creación de la instancia. En ese caso el cliente debe tirar la instancia a medias sin usarla. \layout Standard Finalmente, las operaciones de la clase se comprometen a verificar tanto las invariantes como las postcondiciones. Si no pueden cumplir alguna, se debe lanzar una EXCEPCIÓN. En ese caso, puede que algunas postcondiciones estén cumplidas y otras no (no se puede asegurar), pero al menos la instancia tiene que seguir siendo válida y la operación tiene que restaurar todas las invariantes que puedan estar temporalmente deshabilitadas. \layout Standard Las excepciones no son un mecanismo de control de flujo. Sólo deberían ocurrir en caso de incumplimiento de invariantes o postcondicione s, y en casos excepcionales (tipo disco duro lleno, datos corruptos, versiones incompatibles, etc.). Para situaciones que puedan ocurrir en una ejecución normal del programa (por ejemplo, el usuario introduce un nombre que no existe, se ha llegado al final de una lista, etc.) es mejor usar condiciones explícitas (con if, while, etc.). Del mismo modo, las excepciones sólo se deben capturar en dos casos: cuando haya que restaurar alguna invariante, y luego seguir pasando la excepción hacia arriba, o cuando se llegue a un punto en el que se pueda volver a intentar la operación. En particular está prohibido capturar una excepción y luego hacer return normal, devolviendo un valor falso o que no cumple las postcondiciones. \layout Section \pagebreak_top Descripción formal de los ficheros de salas y objetos \layout Standard Un DTD (Document Type Definition) es la plantilla que especifica de manera formal el contenido de un fichero XML, para que un programa lo pueda leer. Si no sabes XML, no es necesario que entiendas estas plantillas, son útiles para los colaboradores que quieran participar en la parte de código que trata los ficheros. \layout Subsection DTD de una sala \layout Standard \begin_inset Include \verbatiminput{mine_sala.dtd} \end_inset \layout Subsection DTD de un objeto \layout Standard \begin_inset Include \verbatiminput{mine_objeto.dtd} \end_inset \the_end