Bienvenido

Bienvenido a Knossos, el sistema de creación y visualización de ficción interactiva.
Antes de comenzar déjame darte unos links que pueden ser de utilidad:
Nuestro canal en Discord es https://discord.gg/S8aRvEM
Nuestro foro de debate y centro de soporte es ####
Ahora sí, empecemos con una breve guía de cómo usar este manual. La primera sección explica de forma sencilla y con algunos ejemplos la correcta utilización de la herramienta.
Luego, encontrarás una sección con ejemplos e ideas, ideal para inspirarse a crear las propias. Esta última sección es la más dinámica, ya que iremos publicando cosas de usuarios que así lo decidan.
En algunas secciones encontrarás un NERD ALERT, ésto es un aviso de que la siguiente información será muy técnica; no es necesario que la entiendas para entender el contexto, pero si eres desarrollador, puede ayudarte a resolver una duda que tengas al comparar el sistema con otros, o simplemente satisfacer esa necesidad de nerd que tenemos los developers.

La plataforma de lectura

Sí, sí, tu quieres empezar a crear historias. Pero debo tomarme un momento en explicar cómo funciona el sistema de lectura. Seré breve, lo prometo, porque es bastante sencillo.
El sistema cuenta con 5 listas:
   Novedades Donde aparecerán las útlmas historias actualizadas por los usuarios de la comunidad. Esta lista es dinámica y se actualiza automáticamente en función de la actividad de los usuarios.
   Tus juegos En esta lista se mostrarán tus creaciones. Cada una tiene indicado un número de versión. Esto es muy importante, porque sólo las que tienen una versión publicada se mostrarán en la lista de novedades. Desde aquí tendrás la oportunidad de crear una nueva historia.
   Quiero jugar Cuando veas un juego en la lista de novedades tal vez pienses "Se ve bien, pero no tengo tiempo de jugar ahora". Para que no se te escapen esas oportunidades, tienes la lista "Quiero jugar". Cuando selecciones un juego, desde la pantalla de detalles, encontrarás el botón "Agregar a tu lista de pendientes". Este guardará el juego en esta lista sin necesidad de jugar o agregarlo a tus favoritos.
   Jugando Esta lista es automática. Cuando jueges a un juego, tanto de la lista de novedades como de "Quiero jugar", éste se agregará inmediatamente aquí. Se registrará la fecha de tu última partida y la versión del juego. Si el autor hizo alguna actualización, podrás ver esta información de manera sencilla.
   Favoritos En esta lista estarán los juegos que quieras destacar. Sólo puedes agregar a favoritos juegos que hayas jugado, de otra forma no aparecerá la opción. Desde la pantalla de detalles del juego, si jugaste al menos una vez, encontrarás el botón "Agregar a favoritos"
Cuando juegues, todas tus partidas se guardarán en tiempo real en el servidor, así que puedes retomar tu juego en cualquier momento y desde cualquier dispositivo.
Eso fue todo. No mentí, ¿verdad? Bastante sencillo.

Estructura del juego

Cuando selecciones el botón "Nuevo juego" en la lista "Tus juegos" te encontrarás con el formulario de creación. Parece complicado pero en realidad es bastante sencillo. Para comprender todas sus opciones y las venideras tenemos que empezar a entender como se estructura un juego en Knossos.
En primer lugar tenemos el juego. Éste tiene un nombre, una descripción (o sinopsis) y un autor. Dentro del juego hay mapas. Puedes tener desde 1 mapa hasta todos los que necesites. Cada mapa tiene su propia estructura, pero de eso hablaremos más adelante.
Cada set de mapas tienen 3 copias. Una de publicación (o producción), una de testing y una de desarrollo. ¿Para qué? Bueno, pongamos que tienes un juego publicado, hay gente jugando, pero necesitas hacer un cambio, o quieres agregar algo que te faltó. En un sistema de un único entorno, tendrías que bajar la publicación, editarlo y subirla de nuevo.
Ahora, supongamos que estamos en ese escenario, en que no tienes más de un entorno disponible, pero tu cambio o mejora tarda un día, o una semana o un mes. Durante todo ese tiempo tu juego no estará disponible. No puedes hacerle eso a tus fanáticos. Para eso están los tres entornos. Tómate tu tiempo para desarrollar mientras tus seguidores juegan con la última versión estable.
Y, en todo esto, ¿cómo funciona el entorno de testing?. Buena pregunta. Cuando liberas una versión para "testing" puedes generar un link de pruebas. El link de pruebas será válido todo el tiempo que tu código de pruebas sea el mismo. Volvamos al ejemplo anterior. Desarrollas un gran cambio en tu juego, le pides a dos amigos que prueben tu versión, así que generas un código. Sigues trabajando en tu entorno de desarrollo, puesto que tu entorno de testing quedó protegido. Te dan su devolución, haces tus cambios y relanzas tu publicación. Pero resulta que uno de tus amigos no era tan amigo como pensabas y te robó la idea. No quieres que vuelva a probar tu juego. Así que generas un nuevo código de testeo. El anterior ya no es válido y ese mal amigo deberá esperar hasta que vuelvas a publicar una versión nueva.

Estructura del mapa

Tocaste el botón "Nuevo mapa" ¿No podías contenerte verdad?. Lo que estás viendo ahora es el MapBuilder. La herramienta para la construcción de mapas. Antes de empezar con la sección de como usarlo, tengamos dos lineas más de teoría. Prometo ser breve.
Colorido, pero no se entiende mucho, ¿no?. Te explico, veras que no es tan complejo. El mapa se divide en secciones. Cada sección puede tener referencias a objetos y personas. Los objetos y las personas son del mapa (globales) no del sector. Pongamos un ejemplo para aclarar esto:
Un callejón mide 2 secciones. Por el callejón pueden verse ratas y un hombre que deambula. Creamos dos secciones, un objeto "Ratas" y una persona "Hombre que deambula". Ahora referenciamos a ambos en las dos secciones. Cuando estemos en la sección 1 (lado sur del callejón) veremos las ratas y al hombre. Cuando caminemos hacía el norte veremos exactamente lo mismo.
Ahora creamos un objeto "Bote de basura" y lo referenciamos solo a la sección 2. En la sección 1 (lado sur) veremos las ratas y al hombre, en la sección 2 (lado norte) veremos a las ratas, al hombre y al bote de basura. Vamos a revisar cada tipo de entidad y entender un poco mejor como funciona cada una.

Secciones

Una sección es una porción del mapa. Pongamos como ejemplo que construimos una ciudad, cada sección sería como una casa o un bloque de esa ciudad.
Las secciones tienen:
  • Navegación:
    Las secciones están vinculadas por sus cuatro lados: norte, este, sur y oeste. Cada sección puede determinar en que dirección tiene permitido moverse el jugador y bajo que condiciones. Por ejemplo, tenemos un pasillo que mide 3 secciones (zona azul) y es contiguo a una habitación de 3 x 3. (zona verde)
    La puerta de la habitación está en la mitad del pasillo así que la única sección que tiene permitido moverse hacía un lado debería ser donde está la puerta.
  • Objetos:
    Los objetos de la sección son referencias a objetos globales. Una sección no guarda objetos pero, cuando se crean, se vinculan automáticamente. Es importante enteder esto porque cuando se modifica un objeto, se esta modificando en todas las secciones donde esté referenciado.
  • Personas:
    Las personas son entidades globales, al igual que los objetos, pero tienen un flujo de conversación asociado. Discutiremos sobre este tema en la sección especifica.
  • Textos:
    La descripción del entorno se compone de bloques de texto. Puedes crear bloques para organizar la información que estás mostrando o por condición. Cada bloque tiene una validación si se debe mostrar o no. Los bloques aceptan tres marcadores de estilo: * para negritas (*texto* producirá texto), _ para las cursivas (_texto_ producirá texto) y ~ para el texto tachado (~texto~ producirá texto).

Bloques azarosos

Cuando cree un bloque de texto, puede seleccionar "Bloque azaroso". Esto le dará la posibilidad de definir un bloque que muestra un mensaje u otro y define objetos y tags en función de los parametros de chance definidos.
Por ejemplo, si queremos aparezca un fantasma con una probabilidad de 1:3 cuando entramos al sector, podremos en el cuadro "Chance" 1 y en el cuadro "En" 3. Dejamos el cuadro "Mensaje si no se da la chance" en blanco y en el cuadro "Mensaje si se da la chance" ponemos algo así como "_buuuuhhh_, un fantasma"

Navegación no lineal

Al activar una dirección pueden definirse dos acciones posibles: Ir al sector contiguo o Ir a otro mapa. La primera no requiere una configuración adicional, pero la segunda puede definirse de distintas maneras:
  • Si se define en el nombre del mapa el mismo mapa, se puede hacer un salto no lineal (por ejemplo, saltear una casilla)
  • Si se define en el nombre del mapa el nombre interno de otro mapa del mismo juego, se carga el otro mapa sin perder los tags, el inventario ni el nivel de los dialogos.
  • Si se define en el número de sección una sección inexistente, se cargará la sección inicial del mapa destino.

Objetos

Los objetos tienen distintas propiedades, en su mayoría acumulativas, y cada una va a determinar las acciones que puedan realizarse con ellos. Cuando se selecciona, aparece un popup con la descripción y las acciones posibles. Veamos cada una en particular:
  • Recolectable:
    Habilita la opción "Recoger" cuando se selecciona en el mapa. Al usar esta acción, el objeto puede agregarse al mapa.
    Los objetos del inventario, por defecto, no son únicos. Puedes tener tantos objetos de un mismo tipo como te permita la historia. Si quieres que tu jugador no recolecte más de uno debes activar la casilla "Ocultar el objeto si ya está en el inventario" en la sección Visibilidad de la configuración del objeto.
  • Usable:
    Habilita la opción "Usar" cuando se selecciona en el mapa o en el inventario. Al usar esta acción, el objeto puede agregar un objeto, definir un tag o transportar al jugador a otra sección (en la sección de ejemplos se muestran varias opciones de esto)
  • Contenedor:
    Habilita la opción "Abrir" cuando se selecciona en el mapa o en el inventario. Al usar esta acción, el objeto mostrará una lista de objetos que contiene. Se usa para cofres, cajones, bolsos, etc.

Personas

Las personas son entidades globlales con un flujo de dialogo asociado. Primero debemos crearlas, asignarle sus propiedades y luego se habilitá la opción "Dialogos". Estos pueden ser de dos tipos: Mensajes y opciones.
Los mensajes a su vez, pueden ser de 3 tipos: hablas tú, habla el/ella o notificación. Esto determina su visual en la pantalla (alineado a la derecha, a la izquierda o centrado respectivamente)
Las opciones dan la posibilidad al jugador de seleccionar que quieren que diga el personaje.
Los dialogos son secuenciales y se muestran de arriba hacía abajo. Para ordenarlos correctamente, solo debes arrastrarlos y acomodarlos donde quieras que se muestren. Las opciones se muestran todas juntas y detienen el flujo hasta que el jugador elija una.
El "nivel" del dialogo, o el punto al que llegó la conversación se guarda en la información del juego, por tanto, si salgo de una conversación y vuelvo a entrar el dialogo continuará desde el último punto.

Tags

Los "tags" o etiquetas, son marcadores lógicos. Se registran a nivel global pero no pueden gestionarse. Hay distintas acciones que las crean cuando es necesario o las destruyen dinámicamente. Hablaremos puntualmente de esto en la sección "Set & Get" pero debes entender que esto sirve para marcar un punto o evento en la historia.
Por ejemplo, si hablé con una persona en un momento del juego y quiero que esa persona no vuelva a aparecer, debo crear un tag.

Acciones

Las acciones son un elemento transversal a las secciones y permiten al jugador ingresar, a través de un texto libre, una acción. Claro que no podemos poner una IA que entienda todo lo que pida y ejecutar sus deseos libremente (bueno, tal vez podríamos, pero me da miedo que genere una conciencia y nos mate a todos), así que debemos definir cada acción posible y los eventos que esta dispara.
Tal vez un ejemplo simplifique esta cuestión. Pongamos que en nuestra historia hay puertas normales que se abren sin problema, puertas con llave que requieren de un objeto particular (la llave correspondiente) y puertas mágicas que solo se abren con la frase "Ábrete sésamo". Creamos una acción con este texto y cuando se diga esta frase se marca un tag que permite abrir estas puertas.
El bloque de "Ingresar texto" solo aparecerá en el juego si hay, por lo menos, una acción creada.

Estamos hechos de unos y ceros

Tanto los tags como los objetos pueden definirse (set) y validarse a través de condiciones (get). A diferencia de otros sistemas, aquí decidimos simplificarlo en binarios. ¿Esto es bueno o malo? En realidad no lo sabemos, creemos que es bueno.
Por tanto, cuando validemos un tag o un objeto, o cuando lo definamos, "marcamos" el mismo como "existe" o "no existe". Veamos algunos ejemplos:
Si en un getter (condición) ponemos llave_amarilla estamos diciendo que esa condición se cumplirá sólo si tenemos la llave amarilla en el inventario.
Por otra parte, si ponemos !llave_amarilla la condición solo se cumplirá si NO tenemos la llave con nosotros.
Si en un setter (dar/quitar) ponemos llave_amariila nos agregará una copia de la llave a nuestro inventario.
Al igual que en el getter, si ponemos !llave_amariila nos quitará la llave del inventario si la tuvieramos.
Recuerda que los objetos no son únicos. Si quieres guardar solo una copia de la llave, puedes definir !llave_amariila, llave_amariila. De esta forma, primero valida si tenemos una copia de la llave, de tenerla la quita y luego agrega una nueva copia.

Set & Get

Suena a una pareja de una extraña novela romantica, pero no tiene nada que ver. Set y Get son tipos de acciones que se realizan sobre los objetos. Set para definir, y Get para consultar.
La mayoría de las entidades tienen una sección "Visibilidad", esta responde a una condición de objetos y una condición de tags. Estos, son casos puntuales de getters. En esta instancia, el motor no define ninguna etiqueta ni agrega objetos al inventario, solo consulta por su existencia.
Por otra parte, varios elementos (objetos usables, dialogos, secciones, acciones) definen tags y objetos. Estos son setters. Cuando el motor encuentra estas definiciones, agrega o quita tags al juego u objetos al inventario.
Ya se mencionaron varios ejemplos de esto, pero vamos a un escenario puntual, para que quede mas claro (entre parentesís se muestra el tipo de entidad):
En una sección hay una puerta (navegación) y junto a la puerta hay un portero (persona). Cuando quieres acceder a la puerta se valida si tienes un pase (objeto) y el tag portero. Cuando inicia el juego se define que inicias con el pase (objeto)(sección información del mapa). Cuando hablas con el portero (persona), va a preguntarte si tienes el pase (mensaje), si le dices "Si, aquí lo tengo" (opción) se define el tag portero y así podrás pasar
Todos los getters y setters referencian los objetos por su nombre interno. Por eso es tán importante definir un nombre sencillo, sin espacios y único. En la sección de la derecha, debajo del mapa, se muestra un cuadro que te ayudará a recordar tus definiciones, sin embargo, sin un código de nombres esto puede resultar confuso. Por ejemplo, si tengo una llave que abre una puerta y otra que abre la siguiente, no puedo ponerles a ambas "llave" como nombre interno. Deberían ser "llave_exterior" y "llave_interior".

Condiciones

El sistema maneja una definición de condicionales sencilla con tres opciones lógicas: NOT, AND y OR. Para explicarte como funciona esto, primero necesito explicarte algunos conceptos básico de algebra booleana.
CondicionalResultadoEjemplo
NOTInvierte el valorNOT VERDADERO = FALSO
ANDAmbos valores deben ser verdaderos para que devuelva un valor verdaderoVERDADERO AND VERDADERO = VERDADERO
VERDADERO AND FALSO = FALSO
FALSO AND FALSO = FALSO
ORAl menos un valor debe ser verdadero para que devuelva un valor verdaderoVERDADERO AND VERDADERO = VERDADERO
VERDADERO AND FALSO = VERDADERO
FALSO AND FALSO = FALSO
Antes de que te explote la cabeza, déjame darte unos ejemplos:
Si quiero validar que no tengo una pieza de queso, debería evaluar !queso
Si quiero validar si tengo la llave amarilla y la roja, debería evaluar llave_amariila AND llave_roja
Si quiero validar si tengo algún tipo de hacha, sin importar cual, debería evaluar hacha_roja OR hacha_azul OR hacha_verde
¿Cómo se aplica esto a Knossos? los condicionales se definen por defecto en una lógica AND separada por comas. O sea, si pones llave_amariila, llave_roja el sistema va a evaluar la condición llave_amariila AND llave_roja
Para evaluar un NOT debes agregar un signo exclamación adelante. Para evaluar un OR debes encerrar las opciones entre corchetes, separadas por coma, por ejemplo [hacha_roja, hacha_azul, hacha_verde]
Tambien puedes agrupar condiciones usando parentesís. Por ejemplo ([hacha_roja, hacha_azul, hacha_verde]),permiso_talar generará (hacha_roja OR hacha_azul OR hacha_verde) AND permiso_talar que sólo será verdadero si tienes algún tipo de hacha y un permiso para talar.
Si ya te asustaste, te digo que no preocupes, usualmente con los elementos separados por coma y algún signo de exclamación puedes hacer un flujo de juego bastante complejo.

Ejemplos e ideas

Objetos

Un auto: Creamos un objeto cuyo nombre sea "Auto". Marcamos la opción "El objeto puede usarse". En la sección "Objetos" del bloque usable escribimos "llaves_auto" en el mensaje de error "No puede usar el auto sin las llaves". En la sección "Mensaje cuando se usa" escribe "Arrancas el auto" y en la sección "Sectores a los que te traslada el objeto cuando se usa" escribimos los números de sección a dónde puedes viajar.

Un cofre: En la sección objetos agrega cinco objetos:
Nombre del objetoNombre interno del objetoDescripción
Ropas viejasropaUnas prendas viejas. Nada importante.
Zapatos de hombrezapatosZapatos de cuero ajados. Deben tener unos cuantos años.
Libro antiguolibroUn libro, parece muy antiguo.
Llave del cofrellaveUna llave muy ornamentada.
CofrecofreUn cofre de madera. Tiene un cerrojo en un lado.
Edita el libro y marca las opciónes "El objeto puede recogerse" y "El objeto puede usarse". En "Sectores donde se usa" escribe el signo asterisco (*). En "Mensaje cuando se usa" escribe "El libro dice que debo decir "Ábrete sésamo" para abrir las puertas.". En el bloque "Visibilidad" marca la opción "Ocultar el objeto si ya está en el inventario".
Haz click en "Eliminar" en los objetos "Ropas viejas", "Zapatos de hombre", "Libro antiguo". En el mensaje de advertencia selecciona la opción "Borrar solo aquí"
Edita la llave del cofre. Marca las opciones "El objeto puede recogerse" y "Ocultar el objeto si ya está en el inventario".
Edita el cofre. Marca la opción "El objeto es un contenedor". En el campo "Contenido" escribe "ropa, zapatos, libro". En la sección "Requeridos para mostrar contenido", en el campo objetos escribe "llave" y en el mensaje de error escribe "No puedes abrir el cerrojo sin la llave".

Personas

Vendedor: En la sección personas creamos una persona cuyo nombre sea "Vendedor". Agregamos una descripción acorde al lugar dónde estará (por ejemplo "Un hombre misterioso, con un ojo purulento").
Vamos a la sección dialgo y agregamos un mensaje. En tipo de dialogo seleccionas "Habla él/ella", en el mensaje escribe "¿Cómo puedo ayudarte?". En el bloque "Definir tag" escribe "!vendio"
Ahora agrega una opción. En el mensaje escribe "Quiero una manzana", en la sección "Visibilidad" agrega el objeto "!manzana".En la sección "Al seleccionar esta opción pasar al mensaje" escribe 3.
Agrega otra opción. En el mensaje escribe "Quiero una pera", en la sección "Visibilidad" agrega el objeto "!pera".En la sección "Al seleccionar esta opción pasar al mensaje" escribe 4.
Agrega un mensaje. En el tipo de dialogo selecciona "Habla él/ella", en el mensaje escribe "Aquí tiene joven". En la sección "Acciones" agrega el objeto "manzana". En la sección "tags" agrega "vendio"
Agrega un mensaje. En el tipo de dialogo selecciona "Habla él/ella", en el mensaje escribe "Aquí tiene joven". En la sección visibilidad, agrega "!vendio" en el bloque de tags y marca el tilde "Pasar al siguiente si no se cumple la condición". En la sección "Acciones" agrega el objeto "pera".
Agrega una opción. En el mensaje escribe "Eso es todo", Asegurate de dejar en blanco la sección "Al seleccionar esta opción pasar al mensaje".
Finalmente agrega otra opción. En el mensaje escribe "Quiero otra cosa", en el bloque Visibilidad, escribe en la parte de objetos "[!manzana,!pera]". En el campo "Al seleccionar esta opción pasar al mensaje" escribe 0.

Acciones

Fuerza: Crea un mapa con 2 sectores. En el sector 1, en el menú navegación, selecciona la dirección que corresponde con el sector nuevo y marca la opción "Se puede navegar en esta dirección desde aquí". En el bloque "Requeridos", en el campo tags escribe "fuerza" y en el mensaje de error escribe "No tienes suficiente fuerza para abrir esta puerta".
En el menú de acciones crea una nueva acción. En nombre escribe "Fuerza", en acción escribe "Gimme Tha Power", en mensaje escribe "Un halo de fuerza ancestral te posee", en el campo "Definir Tag(s)" escribe "fuerza"
Espada energizada: Agrega un objeto con nombre "Espada". En el nombre interno escribe "espada". En descripción escribe "Una espada regular, aunque parece tener un halo místico". Marca la opción "El objeto puede recogerse" y "Ocultar el objeto si ya está en el inventario".
En la sección de acciones crea una nueva acción. En el nombre escribe "Espada ancestral". En acción escribe "Virtutem ignis". En el mensaje escribe "Unas llamas brotan de la hoja de tu espada volviéndola más poderosa". En requeridos escribe, en el campo Objetos "espada" y en tags "!mistica". En definir tags escribe "mistica".