I7 Manual de Referencia

De WikiCAAD, la enciclopedia aventurera.

Este es un manual desenfadado de Inform 7, realizado en colaboración con toda la peña del CAAD.

No es un tutorial. Es un manual.

El curador actual es Sarganar, aunque todos pueden participar y agregar contenido.


Su estructura es tentativa y puede ir cambiando según sugerencias (es un wiki, vamos). La IDEA es tener un manual de referencia normalito, para conveniencia de los autores con antecedentes en programación. Las fuentes de información que se pueden usar son el propio manual en Línea de I7, el panel index, traducciones, scripts, etc. Sin violar licencias ni conciencias, claro.

Me parece que la mejor forma de discutirlo es en el foro del CAAD, ¿no? Su licencia es igual a la de todo el contenido del WikiCaad.


Contenido

Conceptos de programación literaria

El IDE de Inform 7

Inform 7: El lenguaje

Estructura de un programa I7

El código de una aventura I7 está dividido en 'párrafos'.

Ese es el nombre genérico de los bloques de código.

Es decir:

"Título de la aventura entre comillas"
 
[párrafo 1]
[párrafo 2]
[párrafo 3]
..
..
[párrafo n]

Un párrafo puede ser:

  • Título
  • Tabla
  • Oración/Oraciones


Las Oraciones se separan con:

  • Punto
  • Punto y aparte
  • Punto u otro signo de puntuación (?,!) al final de una cita entre comillas.


"Modos" (los modos tienen reglas especiales de interpretación):

  • Texto entre Comillas: textos a imprimir
    • Convierten comillas simples (') en dobles excepto en el interior de una palabra. No permiten comillas dobles dentro (acaban modo). Colapsan espacios antes de fin de línea y fines de línea (evitable con boxed quotations, en Basic Screen Effects by Emily Short).
    • Escape del modo: Corchetes. Permiten código y signos de puntuación
    • Ejemplos: "[if ...] blah" (código, mensajes variables), "['] blah " (evitar la conversión de la comilla simple), "[quotation mark]" (mostrar comilla doble explícitamente)
  • Texto entre Corchetes (fuera de comillas): comentarios
    • Indican texto que ignora Inform7. [ comienza el comentario y ] lo acaba.
    • Ejemplo: Blah, blah [ esto es un comentario ] blah.


Las Oraciones en I7 pueden ser algunas de las siguientes (ordenadas según su popularidad en un código promedio):

  • Aserciones: Afirmaciones descriptivas (asertos), definen en mundo en su estado inicial (el modelo de datos).
  • Reglas: Claúsulas condicionales seguidas de frases de ejecución. Son triggers, la condición indica cuándo se disparan (el patrón).
  • Acciones: Una condición que se dispara al ejecutar el jugador un determinado comando de acción.
  • Includes de extensiones : Permiten importar código de librerías para su uso en nuestra aventura.
  • Líneas Understand (Sinónimos): Permiten que el párser mapee expresiones a otras ya conocidas o a objetos del juego.
  • Líneas Understand (Gramática): Permiten que el párser mapee los verbos/comandos asociados a una acción.
  • Línea de opciones (Use): Permiten cambiar parámetros generales personalizables del engine.
  • Línea de Test: Permiten crear scripts para testeo del juego.
  • Actividad: Permiten definir Subrutinas/Corutinas/Procedimientos.
  • Escenas: Permiten estructurar trozos de una aventura modificando la misma geografía en diferentes momentos del tiempo(?) o bajo diferentes condiciones.
  • Definición de recurso Imagen/Sonido
  • Definición de plural
  • Directiva de ubicación de regla: Permite mover la regla en la pila.
  • Directivas de publicación: Permiten añadir recursos y metadatos para la clasificación, empaquetado y publicación de la aventura.
  • Includes de código I6: Permiten añadir código procedural de Inform 6.
  • Línea de especificación de valores
  • Línea de definición por tabla: Asocia una propiedad a una tabla.
  • Definición de verbo nuevo: Permite crear un nuevo verbo relacional en el codigo.
  • Relaciones
  • Mapeo I7-I6
  • Líneas de Debugging para el compilador: Indica qué información se va a volcar en log de debug.
  • Directivas para el mapa a publicar
  • Sentencia Unicode
  • Definición de episodio (bibliografic)
  • Sentencias de documentación


Veamos un ejemplo de los distintos tipos de oraciones en la aventura Vampiro:



[Título de la aventura]
  "-Memorias de reXXe-"

[Título:]
 Part 0 - Library Card, Includes y Uses

[Aserciones:]
 The story headline is "(c) 1998 Jaume Alcanzo Castellarnau adaptada a Inform 7 por
 Sarganar".
 The story genre is "Terror".
 The release number is 2.
 The story creation year is 2007.

[Includes:]
  Include Spanish by Sebastian Arg.
  Include Exit Descriptions Sp by Matthew Fletcher.
  Include Basic Screen Effects Sp by Emily Short.

[Línea de opciones]
  Use full-length room descriptions and no scoring.
  Use Comando Salidas.

[Directivas de publicación:]
  Release along with the source text, cover art, a solution and a website.

[Título:]
 Part 1 - Inicializaciones

[Aserciones:]
 The carrying capacity of the player is 5.
 
 The player wear a traje barato.
    The description of the traje barato is "Es un traje barato comprado en las rebajas."
    It is female.

[Regla:]
   Report taking off the traje barato: say "'Cuando el vampiro me vea desnudo, flipa.'"

[Aserciones:]
  The pared is backdrop. It is everywhere.
   The description is "Las paredes son muy gruesas, húmedas y frías al contacto."

[Línea de Sinónimos]
  Understand "paredes" as pared.

[Regla:]
   Rule for deciding whether all includes scenery: it does not. [para que no entren en 'coge todo']

[Regla:]
 When play begins: change the command prompt to ">>";

[Actividad]
 Rule for printing a parser error when parser error is I beg your pardon: say " " instead.

[Regla:]
 Check requesting the score: say "No hay puntuación. El único objetivo es acabar
    con el vampiro." instead.
    
 Check examining a direction (called target):
	if the target is up then say "El techo está muy alto y es de piedras." instead;
	if the target is down then say "El suelo es de piedras y está muy frío." instead.

[Aserciones:]
 The elementos poseidos is a number that varies. The elementos poseidos is 0.

 The elemento is a kind of thing.
 
[Regla:]
 Report taking an elemento:
	increase the elementos poseidos by 1;
	say "El aire vibra un momento, densa y misteriosamente".

[Regla:]
    Report dropping an elemento: decrease the elementos poseidos by 1.

[Regla:]
    When play begins, say "Esta es la versión programada en Inform del juego 'Vampiro' original de Aventuras ALCAZO."

[Título:]
 Part 2 - El mundo del juego

[Título:]
 Section 1 - El Vestíbulo

[Aserciones:]
 The Vestibulo is a room. "Estás en el vestíbulo del castillo. El ambiente es muy húmedo y frío. Estás en un pasillo que se extiende hacia el norte. Al sur queda la puerta de entrada al castillo."

[Regla:]
 Instead of exiting when the player is in the vestibulo, say "¡Tu misión es aquí dentro!".

[Aserciones:]
 The puerta is a door."Es muy grande y está cerrada. No la vas a poder abrir."
    It is south of Vestibulo. Through it is the Jardin.
    The puerta is a female and scenery.
    
[Línea de Sinónimos]
    Understand "salida" and "entrada" as puerta.
    
[Regla:]
    Instead of opening the puerta, say "¡Te he dicho que no la puedes abrir, melón!".

[Aserciones:]
 The PasilloDesdeVestibulo is here. "Es el pasillo principal, se extiende hacia el norte."
    The printed name is "pasillo". It is scenery.
    
[Línea de Sinónimos]
    Understand "pasillo" as PasilloDesdeVestibulo.


[Aserciones:]
 The cielo is a backdrop. The description is "Un cielo alto y estrellado."
 The RegionJuego is a region.
 Pasillo, Jardin, Biblioteca, Vestibulo, Escaleras are in RegionJuego.
 The cielo is in RegionJuego.

[Reglas:]
 After examining the cielo when the actor is in Vestibulo:
	say "El techo no me deja verlo.";
	remove cielo from play.

 Before jumping when the actor is in Vestibulo:
	move cielo to RegionJuego.


Entonces en un juego normalito, el código tiene:

"Título de la aventura entre comillas"

[Informacion bibliográfica del juego - Aserciones]
[La inclusión de alguna extensión que agregue funcionalidad - Includes]

[La primera habitación en la que inicia el juego - esto es obligatorio - Aserciones]

[Definicion de los objetos que pueblan esa habitación - Aserciones - Líneas Understand]

[El resto del mapeado y los objetos - Aserciones]

[Reglas que gobiernan las respuestas del mundo del juego - Reglas]

[Nuevas acciones - Acciones - Líneas Understand]

[Definición de escenas para gestionar el flujo de la historia - Escenas ]

[Definición de comandos para testar el comportamiento - Líneas de Test]


Las respuestas del mundo del juego abarcan las acciones del jugador al interactuar con los objetos, al moverse por el mapeado del juego, al iniciar/finalizar el juego. Las reglas gestionan todo ello. Inform7 trae de fabrica muchas reglas que pueden usarse para infinidad de tareas.


La aventura Minima

La aventura minima compilable (con los elementos indispensables para que I7 compile) tiene la siguiente forma:

"La aventura minima"

The salon oval is a room.

Es decir, solo el título de la aventura y una aserción que declara un objeto room.

Pero hay que decir una cosa: el juego no es SOLAMENTE el código que se escribe en el panel Source. Antes de compilarlo, Inform le agrega (de manera automática) toda la LIBRERIA INFORM y la CAPA INFORM. Allí se declaran las clases y objetos de fábrica, las acciones de fábrica, etc. En la CAPA INFORM residen las rutinas que gestionan toda la filosofía de interacción hombre-juego de las conversacionales (segun el paradigma Inform); más la rutinas I6 de parseo, gestión de archivos y estructuras de datos, etc para las máquinas virtuales a la que compila Inform.

Y, si es que se agregan líneas Include, Inform también agrega el código de las extensiones solicitadas por tu código de juego.

Tipos de datos

'Version preliminar' - Viernes 23 de Mayo

Existen varios tipos de datos que se usan en Inform7. Aquí se nota la fuerte orientación a juego-conversacional del lenguaje y su naturaleza de 'envoltorio'; pues como se sabe, el código I7 es traducido a código I6 y luego a código máquina.

Muchos de estos tipos podrán usarse al declarar variables, propiedades y al definir reglas.


Ref:

  • Panel Index.Kinds,
  • Help:Extension.'Catalogue of named Inform 7 types'
  • I7_Syntax by E Short.

Básicos:

number (plural numbers)

Se traduce a I6 como enteros. Rango: -32768, -32767, ..., -2, -1, 0, 1, 2, 3, ..., 32767. Los numeros pequeños pueden escribirse con letras: 'one', 'two', 'three', ..., 'ten', 'eleven', 'twelve'. (Número mayores a estos se alcanzan solo si se compila para Glulx en lugar de Z-machine: ver el panel Settings)


time (plural times)

La hora, escrita de la forma '2:34 AM' o '12:51 PM', o una duración como '10 minutes' o '3 hours 31 minutes', que deben estar entre 0 minutes y 23 hours 59 minutes inclusive. Este tipo de dato se guarda segun la convencion I6.


text (plural texts)

Cualquier texto entre "comillas". Puede incluir sustituciones escritas [entre corchetes]. Los tipo text se guardan como constantes strings (si el texto es fijo) o como una rutina de impresión I6 (si es variable, conteniendo sustituciones). Las sustituciones pueden ser metaclass String, o metaclass Routine. Una definición I6 de frase podría necesitar distinguir cómo gestionar el tipo, usando la funcion "metaclass", o inclusive dos definiciones distintas, una que resulte del tipo "string-of-text" y la otra que sea del tipo "text-routine".


object (plural objects)

Objetos del juego, traducidos como objetos I6.


La declaraciones se realizan mediante aserciones. Ej:

The alien count is a number that varies. [definiendo variable global 'alien count' tipo number]

The murderer is a person that varies.[definiendo variable global 'murderer' tipo person (un objeto)]

The time of day is a time that varies.[definiendo variable global 'time of day' tipo time]

The current comment is some text that varies.[definiendo variable global 'current comment' tipo text]

A person has some text called the secret name. [Definiendo una propiedad 'secret name' tipo text para la clase 'person']


El Resto, exóticos:


action (not un valor).

Una acción I7 específica ,ej. "taking the wooden box" (pero no una descripcion vaga de una acción como "taking something portable"). Se traduce a I6 como código específico que causa la acción.

Ej:

To try (doing something - action)
	(documented at ph_try):
	(- {doing something}; -).

Muy exótico.


boxed-quotation (not un valor).

Se refiere al texto usado en la boxed quotation (cuadro de texto). Se traduce a los argumentos necesarios para la sentencia box. Es muy especifica para la Libreria Inform.


condition (not un valor).

Cualquier condición I7, ej, "the wooden box is open". Se traduce a un valor I6 que no es cero si y solo si la condicion se mantiene verdadera.



description (un valor, pero con limitaciones de uso).

Abarca cualquier descripción I7, ej. "open containers which are in dark rooms". Se traduce a una rutina I6 que determina si el objeto coincide o no con la descripción.

Ej:

To say a list of (OS - description):
	(- @push subst__v;
		objectloop (subst__v ofclass Object) if ({-bind-variable:OS})
		give subst__v workflag2; else give subst__v ~workflag2;
		WriteListOfMarkedObjects(ENGLISH_BIT);
		@pull subst__v; -).

Muy exotica.

No confundir con la propiedad 'description'. Eso es tema de la libreria Inform.


figure-name (un valor).

Nombre literal de un recurso de imágen. Se traduce a I6 como el ID Blorb de la imágen.

Ej:

	defining a global variable containing a figure-name
		The turn card image is a figure-name that varies.
		
	defining a local variable containing a figure-name
		let current-figure be the figure of cover art.
	
	defining a property containing a figure-name
		A room has a figure-name called the room image.
		
	defining a new figure
		Figure of Woodlands is the file "Woodlands.png". 

miscellaneous-value (un valor).

Algunos datos en I6 son conocidos como un objeto, una clase, una rutina o un texto, inclusive puede ser cualquiera de los cuatros (la misma propiedad o variable). I7 utiliza un tipo abarcativo llamado "miscellaneous-value" para tratar estas ambigüedades. Se traduce a I6 como el tipo de dato I6 apropiado, con código I6 extra que puede discernir el tipo usando la función "metaclass".

Ej:

To rule succeeds with result (O - a miscellaneous-value):
	(- RulebookSucceeds(true,{O}); rtrue; -) - in to only.

No parece un tipo de dato muy 'publico'; solo se ve en las Standard Rules.


property (not un valor).

Representa el nombre de una propiedad I7, una propiedad bipolar como "open" o una propiedad con valor como "capacity". Se traduce a I6 como el nombre de la correspondiente propiedad I6 (para el caso de propiedades con valor); o el nombre del correspondiente atributo I6 (para las propiedad bipolares), antecedido por '~' si el atributo referido está negado (como ~open, si está closed); salvo algunas propiedades bipolares que I7 guarda como propiedades I6 con valores "true/false" (para no superar el limite de atributos permitidos en la maquina Z).

Ej:

properties which are things
			The box has a thing called the lid. [Defaults to first available thing.]
			
properties which are values, using a predefined kind of value
			The battery has a number called charge. [default to 0]

Es decir la sintaxis habla de una asercion del tipo:

	The 'objeto o clase' has a 'tipo-dato' called 'nombre-propiedad'.

Hay más variantes. Ver la sección sobre Propiedades en Inform 7 La libreria.



rule (un valor).

Nombre literal de una rule (regla). Se traduce a I6 como el nombre una rutina I6 que lleva a cabo las tareas de la regla.


snippet (un valor).

El tipo Snippet describe al conjunto de palabras escritas por el jugador en la orden más reciente (en el prompt del juego). Los antiguos valores snippets son nulos cuando se escribe un nuevo comando o cuando se manipula la entrada del jugador. Las palabras se numeran comenzando por 1, como en el estandar I6; el snippet entre la palabra numero N a la palabra M inclusive se representa como 100*N + (M-N+1). Por ejemplo el snippet de 7 palabras comenzando en la palabra 3 se representa como 307. Los snippets se traducen a I6 como valores enteros. Aunque no es posible definir una constante tipo snippet, sí existen varias variables tipo snippet en la libreria I7, como "topic understood" o "the player's command" , que pueden pasarse a variables globales.

Ej:

	defining a global variable containing a snippet
		The quoted text is a snippet that varies.
		
	defining a local variable containing a snippet
		let the quoted text be the player's command.
	
	defining a property containing a snippet
		A thing has a snippet called last reference.

text-routine (un valor).

Tipo usado en textos que tienen al menos una sustitución de corchetes. Se traduce a I6 como la rutina I6 que imprime el material (y por lo tanto a un valor de I6 metaclass Routine).

Ej:

After examining something not handled, say "Vamos [cogelo]."

'cogelo' es una sustitución, una frase (rutina) que imprime 'cogelo' o 'tomalo' según el dialecto del juego.



unicode-character (se traduce a un valor).

Caracter unicode, ej. "unicode 78" o, si se han definido 'nombres Unicode' para los carácteres, "unicode Greek letter kappa". Se traduce a I6 como el número de caracter, e.g. 78 or 922.



Más Exóticos aún, solo son IDs de uso interno:

abstract-relation (se traduce a un valor).

Nombre literal de una 'relation', ej. "adjacency relation". Se traduce a I6 como un número único que indentifica a esa relation.

Ej:

To decide which object is next step via (R - abstract-relation)    [nueva frase]
	from (O1 - object) to (O2 - object):
	(- RelationRouteTo({R},{O1},{O2},false) -).

activity (se traduce a un valor).

Nombre literal de una activity (actividad). Se traduce a I6 como un número único que indentifica a esta actividad.



rulebook (se traduce a un valor).

Nombre literal de un rulebook (libro de reglas). Se traduce a I6 como un número único que indentifica a este rulebook.



scene (se traduce a un valor).

Nombre literal de un escena, ej. "Brief Encounter". Se traduce a I6 como un número único que indentifica la escena.

Ej:

defining a global variable containing a scene
		The current scene is a scene that varies. [default currently messy, but will be better in future versions of Inform]
	
defining a local variable containing a scene
		let current scene be Train Stop ['let N be a scene' is not allowed.]

defining a property containing a scene
		The actor has a scene called major scene.

defining a new scene
		Train Stop is a scene.

sound-name (un valor).

Nombre literal de un recurso de sonido. Se traduce a I6 como el ID Blorb del banco de sonidos.

Ej:

defining a global variable containing a sound-name
		The alarming noise is a sound-name that varies.
		
defining a local variable containing a sound-name
		let sound-name be the sound of silence.
	
defining a property containing a sound-name
		A room has a sound-name called the ambient sound.

defining a new sound
		Sound of rustling leaves is the file "Rustling leaves.ogg".

table-column (se traduce a un valor).

Nombre literal de una columna de tabla. Se traduce a I6 como un número único que indentifica al nombre de la columna. (Columnas del mismo nombre de dos tablas diferentes retornan el mismo valor).

Ej:

To sort (T - table-name) in (TC - table-column) order: 
    (- TableSort({T}, {TC}, 1); -). 

table-name (un valor).

Nombre literal de una tabla. Puede usarse tanto en variables globales y propiedades. Se traduce a I6 como una dirección única que apunta a la taba.

Ej:

The conversation table is a table-name that varies. [variable global]
A person has a table-name called the opinion table. [propiedad]
let current-chat be the Table of Bridget's Opinions; [variable local]

use-option (se traduce a un valor).

Nombre literal de una opción, ej: "American dialect". Se traduce a I6 como un número único que identifica a dicha opción. Su valor es independiente a si la opción se está utilizando o no.

Ej:

To decide whether using the/-- (UO - use-option) [nueva frase]
	(documented at ph_testuo):
	(- (TestUseOption({UO})) -).

action-name

Una acción en particular, sin el objeto de dicha accion. Se traduce al valor numérico I6 de dicha acción, ej. ##Go. Cuando se crea una nueva acción X, también se crea una constante relacionada llamada "the X action". Así, se tiene "the looking action", "the putting it on action", etc., todos valores de tipo action-name.

Es muy usada en el tema de las stored actions.


external-file

Nombre literal de un archivo. Se traduce a I6 a un valor ID que las rutinas de manejo de archivo de Glulx pueden manejar.

Usadas en las frases para gestionar archivos.

Ej:

	defining a global variable containing an external-file
		The notebook file is a external-file that varies.
		
	defining a local variable containing an external-file
		let external-file be the Figure of Boundaries.
	
	defining a property containing a external-file
		A room has a external-file called the room text.

truth state

Representa dos posibles valores: las constantes "true" y "false".

Ej:

defining a global variable containing a truth state
	started printing is a truth state that varies;

defining a local variable containing a truth state
	let N be true;

defining a property containing a truth state
	A person has a truth state called the historicity.

indexed text


stored action


list of


thing


direction



De los que pueden usarse, I7 adopta los valores por defecto (de inicializacion) siguientes:

Valores por defecto
kind of value default value
number 0
time 9:00 AM
text ""
snippet word 1 of command
object nothing
description matching nothing
rule the little-used do nothing rule
rulebook the action-processing rules
action-name waiting action
scene the Entire Game
table-name a table with no rows or columns
figure-name figure of cover
external-file value representing a non-file
truth state false
indexed text ""
stored action waiting
list of {}
thing the player
direction north
otros objetos recién el primer ejemplo que se cree

Constantes

Enumeraciones

Variables

Operadores

Estructuras de control

Listas

Tablas

Texto

Frases

Reglas

Archivos

Graficos

Sonidos

Inform 7: La Librería

Objetos

Propiedades

Acciones

Tiempo

Escenas

Relaciones

Gramáticas

Reglas

Actividades

Publicación

La Capa Inform

Colaboradores

  • Sarganar
  • Jb
Herramientas personales