#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
24 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]
otro>
\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]
otro>
\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{../DTD/mine_sala.dtd}
\end_inset
\layout Subsection
DTD de un objeto
\layout Standard
\begin_inset Include \verbatiminput{../DTD/mine_objeto.dtd}
\end_inset
\the_end