#. In that folder, use your text editor to create this source file
``Heidi.inf``:
- .. code-block:: inform
+ .. code-block:: inform6
!% -SD
!============================================================================
character. On this line, the first ``!`` is part of the sequence (or
string) of characters to be displayed:
- .. code-block:: inform
+ .. code-block:: inform6
print "Hello world!"; ! <- is the start of this comment
space (except when the spaces are part of a character string). So, these
two rules tell us that we *could* have typed the source file like this:
- .. code-block:: inform
+ .. code-block:: inform6
Constant Story "Heidi";
Constant Headline
* Every game needs the three lines which ``Include`` the standard library
files -- that is, they merge those files' contents into your source file:
- .. code-block:: inform
+ .. code-block:: inform6
Include "Parser";
Include "VerbLib";
* Every game needs to define an ``Initialise`` routine (note the British
spelling):
- .. code-block:: inform
+ .. code-block:: inform6
[ Initialise; ];
that's why we were able to take three lines to define the ``Headline``
constant
- .. code-block:: inform
+ .. code-block:: inform6
Constant Headline
"^A simple Inform example
this example none of them has four walls. So let's use Inform to define
those rooms. Here's a first attempt:
-.. code-block:: inform
+.. code-block:: inform6
Object "In front of a cottage"
with description
routes, we also need to explicitly add them to the room definitions in a
form that the game itself can make sense of. Like this:
-.. code-block:: inform
+.. code-block:: inform6
Object before_cottage "In front of a cottage"
with description
with the sketch map until you're comfortable that you understand how to
create simple rooms and define the connections between them.
-.. code-block:: inform
+.. code-block:: inform6
!============================================================================
Constant Story "Heidi";
bird and its nest are Inform objects. We'll start their definitions like
this:
-.. code-block:: inform
+.. code-block:: inform6
Object bird "baby bird"
with description "Too young to fly, the nestling tweets helplessly.",
appropriate to her, with a good chance of it being understood. We add a
line to each definition:
-.. code-block:: inform
+.. code-block:: inform6
Object bird "baby bird"
with description "Too young to fly, the nestling tweets helplessly.",
Furthermore, we label it as ``open``; this prevents the interpreter from
asking us to open it before putting in the bird.
-.. code-block:: inform
+.. code-block:: inform6
Object nest "bird's nest"
with description "The nest is carefully woven of twigs and moss.",
them. Let's say that the bird is found in the forest, while the nest is in
the clearing. This is how we set this up:
-.. code-block:: inform
+.. code-block:: inform6
Object bird "baby bird" forest
with description "Too young to fly, the nestling tweets helplessly.",
they're found. This means adding the bird just after the forest, and the
nest just after the clearing. Here's the middle piece of the source file:
-.. code-block:: inform
+.. code-block:: inform6
!============================================================================
! The game objects
The description of the clearing mentions a tall sycamore tree, up which the
player character supposedly "climbs". We'd better define it:
-.. code-block:: inform
+.. code-block:: inform6
Object tree "tall sycamore tree" clearing
with description
from being picked up by the player character. One final object: the branch
at the top of the tree. Again, not many surprises in this definition:
-.. code-block:: inform
+.. code-block:: inform6
Object branch "wide firm bough" top_of_tree
with description "It's flat enough to support a small object.",
normally be both a ``container`` and a ``supporter``.) And so here are our
objects again:
-.. code-block:: inform
+.. code-block:: inform6
!============================================================================
! The game objects
put the bird into the nest first. One easy way to enforce this is by
adding a line near the top of the file:
-.. code-block:: inform
+.. code-block:: inform6
!============================================================================
Constant Story "Heidi";
place it on the branch; when that happens, the game should be over. This
is one way of making it happen:
-.. code-block:: inform
+.. code-block:: inform6
Object branch "wide firm bough" top_of_tree
with description "It's flat enough to support a small object.",
+++ /dev/null
-"""
-Inform syntax highlighting.
-
-TODO: get it working!
-"""
-
-from pygments.lexer import RegexLexer
-from pygments.token import (Text, Comment, Operator, Keyword, Name,
- String, Number, Punctuation, Token)
-
-objects = ["Class", "Nearby", "Object"]
-
-directives = ["Abbreviate", "Array", "Attribute", "Btrace", "Class",
- "Constant", "Default", "Dictionary", "End", "Endif", "Etrace",
- "Extend", "Fake_action", "Global", "Ifdef", "Iffalse",
- "Ifndef", "Ifnot", "Iftrue", "Ifv3", "Ifv5", "Import",
- "Include", "Link", "Listsymbols", "Listdict", "Listverbs",
- "Lowstring", "Ltrace", "Message", "Nearby", "Nobtrace",
- "Noetrace", "Noltrace", "Notrace", "Object", "Property",
- "Release", "Replace", "Serial", "Statusline", "Stub",
- "Switches", "System_file", "Trace", "Verb", "Version",
- "Zcharacter"]
-
-defining = ["[", "array", "attribute", "class", "constant", "fake_action",
- "global", "lowstring", "nearby", "object", "property"]
-
-attributes = ["absent", "animate", "clothing", "concealed", "container",
- "door", "edible", "enterable", "female", "general", "light",
- "lockable", "locked", "male", "moved", "neuter", "on", "open",
- "openable", "pluralname", "proper", "scenery", "scored",
- "static", "supporter", "switchable", "talkable", "transparent",
- "visited", "workflag", "worn"]
-
-properties = ["n_to", "s_to", "e_to", "w_to", "ne_to", "se_to", "nw_to",
- "sw_to", "u_to", "d_to", "in_to", "out_to", "add_to_scope",
- "after", "article", "articles", "before", "cant_go", "capacity",
- "daemon", "describe", "description", "door_dir", "door_to",
- "each_turn", "found_in", "grammar", "initial",
- "inside_description", "invent", "life", "list_together",
- "name", "number", "orders", "parse_name", "plural",
- "react_after", "react_before", "short_name", "short_name_indef",
- "time_left", "time_out", "when_closed", "when_open", "when_on",
- "when_off", "with_key"]
-
-keywords = ["box", "break", "continue", "do", "else", "font off", "font on",
- "for", "give", "has", "hasnt", "if", "in", "inversion", "jump",
- "move", "new_line", "notin", "objectloop", "ofclass", "or",
- "print", "print_ret", "provides", "quit", "read", "remove",
- "restore", "return", "rfalse", "rtrue", "save", "spaces",
- "string", "style bold", "style fixed", "style reverse",
- "style roman", "style underline", "switch", "to", "until",
- "while"]
-
-action_re = r"\s-*\*"
-
-def wordlist(list):
- return "(" + "|".join(list) + r")\b"
-
-class InformLexer(RegexLexer):
- """
- Inform code lexer.
- """
-
- name = 'Inform'
- aliases = ['inform']
- filenames = ['*.inf']
- mimetypes = ['text/x-inform', 'application/x-inform']
-
- tokens = {
- 'root': [
- (r'\n', Text),
- (r'[^\S\n]+', Text),
- (r'!.*$', Comment.Single),
- (r'\\\n', Text),
- (r'\\', Text),
- (r'=', Operator),
- (r'"[^"]*"', String.Double),
- (r"'[^']*'", String.Single),
- (r"\S+:", Name.Label),
- (r"<<.+>>", Name.Label),
-
- (wordlist(objects), Name.Class),
- (wordlist(keywords), Token.Keyword.Reserved),
- (wordlist(properties), Name.Builtin),
- (wordlist(directives), Name.Entity),
- (wordlist(attributes), Name.Attribute),
-
- (r'[a-zA-Z_][a-zA-Z0-9_.]*', Name),
- (r'(\d+\.?\d*|\d*\.\d+)([eE][+-]?[0-9]+)?', Number.Float),
- (r'\d+', Number.Integer),
-
- (r'.', Punctuation),
- ],
- }