1. Welcome To Adventuron

Adventuron is a TEXT ADVENTURE and GAMEBOOK game creation system.

Adventuron can be used to develop textual games (with optional graphics / multimedia) for desktop, mobile platforms (HTML5), and retro platforms.

Created text adventures can be exported as HTML for non-commercial use. Full details here

This document is an UNOFFICIAL reference guide for the BETA version of Adventuron and should not be used for learning Adventuron. Please see the Official Adventuron User Guide for that.

Adventuron Editor

Main Documentation

Other Documentation

Forums

Games

Articles and Media

These external links are provided as a courtesy, please check the individual licenses of these tools.

Browser based Pixel Font Creator:

Browser based :

Desktop based :

Visual Studio Code Plugin

Warning
Currently only syntax highlights (colours in the text). Future versions may add autocomplete functionality.

Visual Studio Code is a very popular text editors aimed at coders.

You can find a syntax highlighter for the object notation (used by Adventuron) in the VSCode marketplace, for free - here.

1.2. Document Change Log

The beta gets updated on a daily basis. This will document the changes.

  • [2021/02/10 CHANGED] move replaced go_dir
  • [2021/02/10 v68] NEW VERSIONBeta moved to Classroom - V68
  • [2021/02/08] Doc Update - Updated Object menu
    • Updated Object menu with functions
    • Added location_of
    • Added layout_dynamic
    • Added starts_with and ends_with
    • Added is_rendering_banner and is_rendering_graphic
    • Added on_examine_non_known_entity
    • Added experimental_wait_graphic
    • Added sentence_raw
    • Added 'back' as a parameter for goto
    • Added oxford_comma
  • [2021/01/01 v66m] Update new setting to auto propogate known status to children of containers.
    • experimental_new_parser = true
    • experimental_new_scoping = true
    • experimental_auto_propogate_known = true
  • [2021/01/01 v66h] Update.
  • [2020/12/13 v65z] Update Saving a game won't stop game execution.
  • [2020/12/11 v65x] Update.
  • [2020/12/08] Verb/Noun Mode - Added to User Guide.
  • [2020/12/07 v65s] Update.
  • [2020/11/15] Constants - Syntax for constants added.
  • [2020/11/02 v65b] Bug fixes.
  • [2020/11/?? v65] Classroom Update - Classroom now version 65
  • [2020/11/08 ADDED] has_command_been_handled() - command to check if a command hasn't been processed before it goes to the system commands.
  • [2020/11/02 v64i] Bug fixes.
  • [2020/10/29 ADDED v64h] Stats - Stats added to Cookbook.
  • [2020/10/28 game_settings updated - Documentation of on_describe_runs_straight_after_d_block.
  • [2020/10/26 ADDED v64g] Sentence rewriting - New way to match sentences in User Guide.
  • [2020/10/25 ADDED v64f] Bug fix
  • [2020/10/25 ADDED v64e] Disambiguation bug and Checkpoints - Disambiguation bug fixed with if_examine, and added checkpoints to Cookbook.
  • [2020/10/19 ADDED] Accessing System Messages - Added to Cookbook.
  • [2020/10/16 ADDED] substring - function to grab part of a string
  • [2020/10/16 CHANGED] index_of - added offset parameter
  • [2020/10/15 ADDED] index_of - function to match strings
  • [2020/10/14 ADDED] Google Webfonts - Added to Cookbook.
  • [2020/10/14 ADDED] is_can_go(int) - boolean function to check exits
  • [2020/10/14 CHANGED] fixed_text - status bar parameter updated to allow different font.
  • [2020/10/13 ADDED] experimental_new_scroll - fixes to scrolling in mobile
  • [2020/10/13 ADDED] ident_graphic - add branding to your game.
  • [2020/10/13 ADDED] ident_graphic_horz_percent
  • [2020/10/12 CHANGED] original "verb" / "noun" - experimental_parse_result_original has been updated.
  • [2020/10/10 ADDED] is_holding - check if carried but not inside containers
  • [2020/10/10 ADDED] update_graphic - temporary change the room graphic
  • [2020/10/8 CHANGED] play_incidental - play_sound has been changed to play_incidental
  • [2020/10/8 ADDED] set_volume - Set volume commands for the three music channels now work
  • [2020/09/24 ADDED] go_dir - go in a given direction

2. Reference Guide

Coding the flow of your game.

2.1. Locations

Each location is defined with an ID, which is used to refer to it in the code.

start_at = bottom_of_hill

locations {
   bottom_of_hill : location "You are standing at the bottom of the hill." ;
   top_of_hill    : location "You are standing at the top of the hill." ;
   valley         : location "You are standing in a valley." ;
   }

You can add further attributes to define a location.

attribute description
graphic = "GRAPHIC_ID"

Reference to a graphic resource to display before this location is described.

boundary_message = ""

A custom bump message to use (replaces "you cannot go in that direction"). If empty message provided here then standard bump message will be displayed.

layout = ""

Define the layout order of items when a location is described. This uses a simple textual format for describing the vertical layout.

header = ""

A single line header for this location or zone. If defined within a location, it overrides the zone description. A description header should be unique as it is used for mapping purposes.

2.1.1. Connections

Direction mappings are bidirectional, but can be unidirectional by appending "_oneway"

Directional Mappings
connections {
   from, direction, to = [
      bottom_of_hill, up, top_of_hill,
      top_of_hill, down_oneway, valley
   ]
}

2.2. Objects

Objects are entities in the game and can also represent characters.

An object has a parent. The parent can be a location, or another object, or the 'ether', which is a special object which holds objects that don’t exist in the game world.

The weight of an object is "1" by default. The default weight limit that the player can carry is 200 by default. The default object carry limit (independent of weight) is 10. To override the inventory limits, see the Adventuron Cookbook Example "1.1 Inventory Limits".

2.2.1. Defining Objects

Object Type Details

object

A normal takeable/droppable object.

scenery

An object that cannot be taken, but will be listed (configurable).

2.2.2. Object Identifiers

An Object's identifier has TWO uses: 1) a unique identifier for referring to them from the code and 2) define the adjective and the noun associated with the object.

Declaration How it is used
key = object "a key";

Defines noun as "key", description as "a key";

blue_key = object "a bluish key";

Defines noun as "key", adjective as "blue", description as "a bluish key".

You can switch off this entity id (to adjective / noun) association in the game_settings {} section, but it is enabled by default. Set the object's noun and adjective attributes instead.

game_settings {
   scan_entity_ids_for_vocab_items = false
}

2.2.3. Object Attributes

An object has a number of attributes

Attribute Description
adjective = ""

Override adjective specified by identifier.

at = "LOCATION_ID"

Alias for "start_at"

conspicuous = "false/true"

If an object is inconspicuous, then it will not be listed in the current location (but still present). Examining an object makes it conspicuous, the text of a location or context of a location should enable the player to guess what to examine to bring the object to attention. All objects are conspicuous by default

get_message = "…""

A message to display when we successfully pick up an object.

msg = ""

The examine mesage to display by default. If the 'on_examine' trigger is used, this message will be ignored.

noun = ""

Override noun specified by identifier.

treasure = "false/true"

If true, then this object is flagged as a treasure.

initially_worn = "false/true"

Only used if the object is placed with a character. Attribute wearable becomes implicitly true when this is set.

start_at = "LOCATION_ID"

The start location of the object.

wearable = "false/true"

Is the object wearable?

Note
'at' and 'start_at' can both be used to describe the start location of an object, but only start_at can be used to describe the start location of the player.
Examples
objects {
   blue_spoon  : object "a blue spoon";
   red_spoon   : object "a red spoon"   at="inventory"; // Held by player on game start
   green_spoon : object "a green spoon" at="barn";
   hat         : object "a plain hat"   at="barn"      wearable="true";
   stylish_hat : object "a stylish hat" at="inventory" worn="true";
   // Wearable is implicitly true if an object is initially worn

   boulder     : scenery "a boulder"    at = "cliff";
   anything    : scenery "anytext"      noun="lump"    adjective ="yellow";

}

2.2.4. Multiple Objects With Same Adjective Noun

There are multiple ways to deal with this scenario, but the simplest way is to simply add a numeric suffix to the object name. This only works in the adjective_noun variant.

Example:
objects {
   blue_spoon_1 : object "a blue spoon" at="barn";
   blue_spoon_2 : object "a blue spoon" at="kitchen";
   blue_spoon_3 : object "a blue spoon" at="well";
   blue_spoon_4 : object "a blue spoon" at="castle";
   blue_spoon_5 : object "a blue spoon" at="dungeon";
}

In all 5 cases, the objects will be created with noun = spoon, adjective = blue.

2.2.5. Object Aliases (Synonyms)

You can create noun, verb, and adjective groups that the parser will automatically collect together:

vocabulary {
   : verb      / aliases = [pet, stroke]
   : noun      / aliases = [cat, creature, feline]
   : adjective / aliases = [yellow, golden]
}

In the : match "" {} section, you can use any item in a noun group to match on, and it will treat it the same as any other member of the group.

If you want a completely different noun to represent the same object, but the noun is not a synonym, then you can also chain together nouns in match statements like this:

// "lump" is not a synonym for cat, therefore it's listed as a different match item

: match "stroke cat; stroke lump" {
   : print "Cat Purrs."
}

2.2.5. Object Functions

These functions will return an object or a location.

Function Name Description
location_of "ENTITY_ID" Returns the location of an entity (object, scenery, character). If the supplied entity is not a valid entity id, then 'unknown' will be returned. If not in the game world, 'ether' will be returned. Otherwise, the containing location of an object will be returned, even if an object is in a container, in a player inventory. Can also use parameter s1() when using brackets.
original_parent_of "ENTITY_ID"

Returns the parent (as of the start of the game) of an object or entity (can be a location id, an object id, 'inventory', or 'ether'. If an invalid item is specified, then "unknown" is returned. If the item is carried by the player then 'inventory' will be returned. If the item does not exist, then "ether" will be returned.

parent_of "ENTITY_ID"

Returns the direct parent of an object or entity (can be a location id, an object id, 'inventory', or 'ether'. If an invalid item is specified, then "unknown" is returned. If the item is carried by the player then 'inventory' will be returned. If the item does not exist, then "ether" will be returned (ether is the parent of non exitent objects).

previous_location()

Returns the id of the location the player was in in the last tick.

2.3. Variables

Variables must be declared in their subsequent sections before use.

A variable can also be persistent: it will surive past a restart of the game. This can be done by setting its scope attribute to "survivor:. For more information, see the Adventuron Cookbook example "1.9 Persistent Variables".

2.3.1. Booleans

Boolean Variables

Booleans are referred to by using the identifier of the variable inside an expression block.

Define Example
booleans { has_flossed : boolean "false"; } : match "floss _" { : if (has_flossed) { : print "You already flossed!"; } : else { : print "You floss."; : set_true "has_flossed"; } }
Boolean Operators

NOTE1 : Expressions can be surrounded by () characters,to clarify the order of evaluation.

Name Operator Usage

AND

expression1 && expression2

OR

expression1 || expression2

NOT

!expression1

EQUALITY

expression1 == true

NON-EQUALITY

expression1 != true

GREATER THAN

expression1 > expression2

GREATER THAN OR EQUAL TO

expression1 >= expression2

LESS THAN

expression1 < expression2

LESS THAN OR EQUAL TO

expression1 <= expression2

TRUE

true

FALSE

false
Boolean Functions

These functions will return a value. For commands related to variables, see in this document "2.8.4. Variable Commands".

Note: For functions with an OBJECT_ID parameter, if "*" is entered then the current subject is used (if supplied).

Function Name Description
chance(n) True x% of the time. (x = value or expression that's a number between 0 and 100).
has_command_been_handled() True if some action has been performed in the on_command {} block, false otherwise. Should only be called in an on_command {} block.
has_not_created "OBJECT_ID" True if object has never been created once (including being destroyed).
has_stashed_all_treasure() True if all treasure is currently in the treasure room.
has_theme_tag "TAG" True if the current theme has been tagged with the selected tag category.
has_visited "LOCATION_ID" True if location or zone has been visited one or more times.
is_at "LOCATION_ID" True if player is at the location or zone specified.
is_at_initial_location "OBJECT_ID" True if object is at the same start location (not including any movements that happen in on_startup{}).
is_beside "OBJECT_ID" True if the object exists in a current location but not held nor concealed).
is_blocking "DOOR_ID" True if door, block, or block_path is currently blocking. Can test if a door is closed too.
is_carried "OBJECT_ID" True if object is carried (in inventory or in a container in inventory).
is_can_go "DIRECTION#" True if there's an unblocked connection from the current location to another location in the direction represented by the number (1 to 12). If provided number is NOT between 1 and 12, then this function will return false. 1 = north, 2 = northeast, 3 = east, 4 = southeast, 5 = south, 6 = southwest, 7 = west, 8 = northwest, 9 = up, 10 = down, 11 = enter, 12 = exit
is_exists "OBJECT_ID" True if object exists somewhere in the game world.
is_first_entered() True if player entered current location for the first time. NOTE : Always false if used from an on_command{} event handler.
is_holding "OBJECT_ID" True if object is directly carried (not in a held container).
is_int(STRING_EXPRESSION) True if string expression is an integer number.
is_just_entered() True if previous command was in another location. NOTE : Always false if called from a T1 block.
is_locked "DOOR_ID" True if door is locked.
is_mobile() True if client is running on mobile. False for tablets.
is_movement_command "VERB" True if player entered a standard movement command (n,s,e,w, etc). Result is undefined if not called from the on_command {} block.
is_pocketable "OBJECT_ID" True if taking an object exceeds weight or item carry limits. If object is held, then returns true.
is_present "OBJECT_ID" True if object exists in a given location or is part of the inventory (worn or unworn) and is not concealed.
is_rendering_banner () Returns true if the game is currently rendering a location graphic. This will only ever return true if inside an on_render {} block of code.
is_rendering_graphic"GRAPHIC_ID" Returns true if the game is currently drawing a graphic. This will only ever return true if inside an on_render {} block of code.
is_within { outer="location_or_zone_id" inner="object_id" } True if object is indirectly contained within another entity or location.
is_within_direct { outer="location_or_zone_id" inner="object_id" } True if object directly contained within another entity or location.
is_worn "OBJECT_ID" True if object is carried and worn by the player.
noun1_is "noun" True if the 1st noun in the sentence equals the provided noun (or synonym).
noun2_is "noun" True if the 2nd noun in the sentence equals the provided noun (or synonym).
adjective1_is "adjective" True if the 1st adjective in the sentence equals the provided adjective (or synonym).
adjective2_is "adjective" True if the 2st adjective in the sentence equals the provided adjective (or synonym). The second adjective must always come after the first noun.
preposition_is "preposition" True if the preposition in the sentence equals the provided preposition (or synonym).
verb_is "verb" True if the verb in the sentence equals the provided verb (or synonym).
adverb_is "adverb" True if the adverb in the sentence equals the provided verb (or synonym).
subject1_is "word" True if the text matches the current 1st entity.

condition ? ( true ) : ( false )

Inline if-then-else block, whereby a single boolean expression will determine which sub block of code to execute. The 'true' part in the case of a positive result, the 'false' part in a case of a negative result.

2.3.2. Integers

Integer Ranges

An integer has a minimum value of 0. If you wish to use an integer to hold negative values then use the min="" parameter when declaring your integer.

The ABSOLUTE minumum and maximum values that an integer variable can hold are -2,147,483,648 and 2,147,483,647 (inclusive) respectively.

Declaration Example
integers { well_visits : integer "0"; hut_visits : integer "0" max="5"; lake_visits : integer "0" min="-5" max="5"; : if (hut_visits > 5) { : print "You've had too much hut."; }
Integer Assignment Commands

You can set an integer to fixed values and expressions.

 : set_integer var = "well_visits"  value = "5" ;
 : set_integer var = "hut_visits"   {( 1 + 2 + 2 )}
 : set_integer var = "lake_visits"  {( hut_visits + 5 )}
Integer Operators
Name Operator Result Type
expression1 + expression2

+ (add)

Integer

expression1 - expression2

- (subtract)

Integer

expression1 * expression2

* (multiply)

Integer

expression1 / expression2

/ (divide)

Integer - Fractional parts are ignored.

expression1 % expression2

% (modulo)

Integer

Integer Functions

This is a list of integer functions that will return a value. For commands related to variables, see in this document "2.8.4. Variable Commands".

Name Description
abs(EXPRESSION)

Returns a positive (absolute) version of the value returned by resolving the inner expression (always 0 or above).

back_id()

Returns the id of the previous location described (that is not the current location). If ran out of buffer, then return empty string. NOTE: This function will typically only offer 12 levels of lookback, unless configured differently in the game_settings.

carried()

Returns the number of items carried by the player excluding worn items (shallow).

(carried() + worn())

A count of all items held, and all items worn by the player (shallow).

carry_limit()

Returns the limit of the number of items that are permitted to be carried by the player. By default in adventuron, worn items are counted towards this limit.

child_count()

Creates a tally of children in the supplied node.

distance_to "LOCATION_ID"

Returns the shortest number of moves required to move to the nominated location from the current location. If the location is the same location as the current player location, then return 0, if there is no path, then returns -1, otherwise will return an integer number. Can be useful for environmental messages.

inputs()

Returns the number of words the player entered.

int()

Turns a string into a number. Behaviour is undefined if the input does not represent an integer.

linger()

Returns the number of ticks the player has been in the current location since arriving (this is reset to zero upon entering a new location). This can be useful for per-location timed events, or messages.

locno()

Returns the locations number of the current location. If the current location does not have a location number, returns a value less than 0.

object_count""

Creates a tally of the number of known takeable items (only) in a location, person, or container object. This excludes non takeable items (scenery, anything else that is fixed in place).

num_choices()

Gets the number of choices in the choices buffer.

random()

Returns a number between 0 and 99 (inclusive).

random(999)

Returns a number between 0 and 999 (inclusive).

ticks()

Returns the number of ticks that have been performed in the game. This will return 0 in the on_startup {} block, but the first time on_tick is executed, ticks() will contain a value of 1, incrementng by one every time the on_ticks() block is executed.

treasure_total()

Returns the total amount of treasure objects defined in the game (set the treasure="true" attribute on an object).

treasure_deposited()

Returns the total amount of treasure currently located in the treasure destination location.

turns()

Returns the number of turns that have been performed in the game. This is the number of individual sentences processed by on_command(). This is incremented BEFORE on_command() runs. Note that a GET ALL or DROP all will be processed as multiple sentences.

worn()

Returns the number of items worn by the player (shallow).

worn_limit()

Returns the limit of the number of items that are permitted to be worn by the player. NOTE: Only use this if configured that wear and carry limits are seperate in game_settings{}, or else using this will result in an error.

2.3.3. Strings

Strings

Strings cannot be null.

Declaration Assigning
strings { npc_name : string "Suzy"; } : set_string var="lost_description" text="You are lost.";
String Functions

These string functions will return a value related to string variables. For commands related to variables, see in this document "2.8.4. Variable Commands".

Name Description
back_id()

Returns the id of the previous location described (that is not the current location). If ran out of buffer, then return empty string. NOTE: This function will typically only offer 12 levels of lookback, unless configured differently in the game_settings.

camel(param1)

Capitalises the first letter of every word. e.g. upper ( "i am GOOD") would return 'I Am Good'.

command_text()

Gets the direct text from the command line.

current_location()

Returns the id of the location the player is currently

d()

Returns the description of the current location.

d(param1)

Returns the description of the named objects, scenery, location or page item.

e.g. d("lamp") might return 'a dusty old lamp', if there existed an object with id 'lamp' that had description 'a dusty old lamp'.

index_of { outer = "STRING" inner = "STRING" offset = "INTEGER" }

Returns the index of a string inside an outer string - base 0. Returns -1 if inner string not found

original "verb"

Returns the verb that the player entered (untrimmed and unaliased). If the player types one word, then this is always the original verb. (originally 'experimental_parse_result_original').

original "noun1"

Returns the first noun that the player entered (untrimmed and unaliased). If the player types one word, then this may be empty. It will never be empty if the player types two words, but it may be empty if the player types three or more words and none of those words are matched nouns. When typing two words, one word is always understood as a verb and one word is understood as a noun, whether or not the verb or noun are found in the vocabulary.

lower(param1)

Converts some input text to lower case. e.g. upper("TEXT") would return 'text'.

sentence_raw(input)

Returns the raw input the player typed in.

substring { string = "STRING" offset = "INTEGER" length = "INTEGER" }

Collects a substring from an outer string. If out of bounds then will return string up to the edge of the bound. Will never throw an exception.

upper(param1)

Converts some input text to upper case. e.g. upper ("text") would return 'TEXT'.

starts_with { outer = "STRING" inner = "STRING"" }

Returns true if the outer string starts with the inner string

ends_with { outer = "STRING" inner = "STRING"" }

Returns true if the outer string ends with the inner string

Dynamically set a string with Expression Form

We can use EXPRESSION FORM to dynamically calculate the value of a string.

  • An expression can be contained between "{(" and ")}" (without quotes).

  • + is used to append.

: set_string var="tmp" {( tmp + " bar")}             // Append to a string
: set_string var="nice_location_description" {(
   "I am in location with id " + current_location()  // Append to a string with a function
)}
Dynamically setting the value of a string

Printing the contents of a variable is possible using the expression form, which is a contained by these brackets as shown {( )}.

start_at = village

locations {
   village  : location "You are in the village. Type SCORE to see your score." ;
}

integers {
   // Set the default score to zero here
   score : integer "0" ;
}

on_command {
   : match "score _"  {
      // Note that CONTROL + SPACE only works on blank lines in these blocks
      // Pressing CONTROL + SPACE once will show string functions only
      // Pressing CONTROL + SPACE twice in a row will show all functions (integer, string, and boolean functions)
      : print {(
         "Your score is " +
         score +
         "."
      )}
   }
}

2.3.4. Constants

Constants are processed before anything else.

They are defined outside of any event, prefixed by two underscores, and are referenced by $${}.

// Defined outside of events, on its own line.
__objectcolour = <4> 
									
on_command {
	: match	"test -" {
		: print	"This is an <object$${__objectcolour}>.";
	}
}

2.4. Collections

Collections are similar to arrays and an experimental feature. For more information, see the page "Adventuron - Experiment Features".

All items in a collection are strings. If you want to cast the text to a number then use the int() function.

There are two types of collections:

Type Details
collections {

Start collection block

my_list : list { items = [ dog, cat, bat, dog ] }

A list of items allowing for the same value multiple times. The insertion order is maintained by default.

my_set : set { items = [ dog, cat, bat, rat ] }

A list of items with unique items. The insertion order is maintained by default.

2.4.1. Collection Commands

Collections can also be used to list sub-ojects. See "Adventuron - Experiment Features" for the example.

Name Details
: print {( item () )}

Return the string at the current element (see examples). Always returns a string, so wrap in int() to process as a number.

: collection_clear "my_list_1";

Empty a collection

: print {( collection_get { collection -> ("my_list") index -> (2) } )}

A function (called within an expression) that returns a string result. Index starts at 0.

: if (collection_count ("my_list") > 0 {}

A function (called within an expression) that returns an integer result.

: collection_intersect { collection_1 = my_list_1 collection_2 = my_list_2 result = my_list_3 }

Store the common items between my_list_1 and my_list_2 in my_list_3. All three lists should be initialized.

: collection_iterate "my_list" { : print {( item () )} }

Iterates over each element in 'my_list' starting from the last element. The item() function will return the string at the current element.

: collection_modify { collection -> "my_list" index -> (1) content -> ("new_item") }

Modify an item in the list.

: collection_push { collection -> "my_list" content -> ("new_first_item") }

Pushes an item into the first item of the collection.

: collection_pop { collection -> "my_list" var -> "tmp_var" }

Removes the first item of a collection and store it in a variable.

: collection_remove { collection -< ("my_list") index -< (0) }

Remove an element from a list.

: collection_sort collection = "my_list" algorithm = "algorithm";

Algorithms to sort by: ascending, descending, ascending_nocase, descending_nocase, reverse, shuffle.

: collection_subtract { collection_1 = my_list_1 collection_2 = my_list_2 result = my_list_3 }

Store the non-common items between my_list_1 and my_list_2 in my_list_3. All three lists should be initialized.

: collection_union { collection_1 = my_list_1 collection_2 = my_list_2 result = my_list_3 }

Combines items between my_list_1 and my_list_2 in my_list_3. Duplicates are removed.

2.5. Barriers

There are three ways to to block or intercept movement to another location, on a conditional basis.

Block Type Details

block

Blocks entry to a location from any adjacent location.

block_path

Blocks entry to a location, but only in one direction (from another particular location)

door

A door needs to be opened, and if locked, it needs to be nominated with a particular key.

2.5.1. Block activation conditions.

Blocks are dynamically evaluated by Adventuron. They generally are controlled by the contents of a boolean variable, or by the existence or non-existence of an object.

Example 1 - Block if an object exists
barriers {
   throneroom_block : block {
      block_when_exists   = king
      location            = throne_room
      message             = The king is far too busy and orders you out of the room.
    }
}
Example 2 - Block if an object is not carried
barriers {
   mines_block : block {
     block_when_not_carried = glowing_sword
     location               = emerald_mine_1
     message                = The mines are far too dark to venture into unaided.
   }
}
Example 3 - Block when boolean variable is false
barriers {
   maze_block : block {
      block_when_not = is_read_map
      location       = maze_1
      message        = You dare not enter the maze without knowing more about it first.
   }
}

2.5.2. Block Path

Block path work in exactly the same way as a 'block' except you must specify from and to.

barriers {
   throneroom_block : block_path {
      from                = hallway
      to                  = throne_room
      block_when_exists   = king
      message             = The king is far too busy and orders you out of the room.
   }
}

2.5.3. Doors (Basic)

Doors require a 'from' and 'to' locations, same as block path, but doors don’t require an activation condition. They may simply be open and close doors, or they may require a key.

A Locked Door
barriers {
   shed_door : door {
      from  = garden
      to    = shed
      key   = shed_key
   }
}
  • Doors are closed and locked by default. A door defined without a key will not be locked, and will not be lockable or unlockable.
  • Unlike objects, the identifier for doors do not imply a noun or an adjective.
  • Each room is currently only permitted to have one door.

For more information on using the is_blocked and is_locked to test a door, please see the Adventuron Cookbook entry "1.37. Door Interrogation".

2.6. Events

When things happen inside an adventure games, those things are called events and are handled by event handlers.

Event Handler Details
on_startup { }

(T0) A block of code that is executed prior to describing the first player location. This can set up objects, puzzles, and display some intro messages or questions for the player. If introduction text is already supplied, then that will be displayed before the initialization subroutine is called.

It is NOT executed when reloading a saved game. It is only executed once per NEW GAME, and before any other event handler.

on_debug{ }

On debug is executed instead of on_startup{} (if defined). It is used for debugging particular scenerios in a game.

on_command { }

(T1) Handlers to respond to commands input by the player. The on_command{} event handler usually contains : match {} records

on_describe { }

(T2) Triggered after a location is described. If not changing a location or 'look'ing then this will not be triggered.

on_pre_describe { }

Executed BEFORE describing a location when entering or redescribing it. This is before any part of the location is described (graphic, object list, exit list, description). A done executing in this block will not stop the rendering of the location.

on_pre_tick{ }

Before on_tick.

on_tick{ }

(T3) Triggered after system actions, and movements. Executed after T2 where a location is describing itself, but sometimes T2 is not executed at all (where there has been an action that didn't trigger a redescribe), in that case, T3 follows T1.

on_post_tick{ }

After on_tick.

pages{ }

Contains pages in the virtual gamebook. A page is a physical location, or situation, that will be explained to the player.

2.6.1. Local Handlers

Note
Local Event Handlers are not compatible with 8-bit compatibility mode.

A location can also define its own local event handlers. These event handlers only trigger for when the player is present in a given location, and are executed before the global handlers.

How to define local event handlers
locations {
   bottom_of_hill : location "You are standing at the bottom of the hill." {

      on_command {
         // Local command handlers here
      }

      on_describe {
         // Local description events here
      }

      on_tick {
         // Local tick events here
      }

   }
}

2.7. Text Matching

To parse text, Adventurong uses the match command.

: match "verb noun" {
   // Do something
}

You can also use a semi colon to add additional verb noun patterns to match. Any number of verb noun pairs can be listed using ';' as the delimiter.

: match "read sign;examine sign" {
   // Do something
}

In match records the following symbols can be used to test for the following conditions

Symbol Example Details
* : match "dig *" : match "* hole"

Must include a value in this slot (verb or noun).

- : match "dig -"

Must not include a value in this slot (verb or noun).

_ : match "dig _"

May or may not include a value in this slot (verb or noun).

2.7.1. Pre-Processing

Adventuron has a certain number of language-specific sentence pre-processors.

These pre-processors look for consecutive patterns of words and replace with a different word (or words). This occurs before any of the matching routines are checked in Adventuron.

This (langauge specific) feature is currently not able to be disabled, and not able to be configured. Configuration will be enabled in a later version of Adventuron.

For English:

Pattern To Replace Replaced With

PUT ON

WEAR

PUT DOWN

DROP

PICK UP

GET

TAKE OFF

REMOVE

LOOK AT

EXAMINE

AND THEN

THEN

GO <direction>

<direction>

2.8. Commands

Once an event occurs, commands will run to execute different actions.

2.8.1. Control Of Flow Commands

Name Description
: match "VERB NOUN" {}

Matches a verb and noun, and executes the contained commands if the current logical sentence matches the verb and noun.

: if (CONDITION) {}

Executes the inner commands { … } IF the supplied boolean condition is true.

: else_if (CONDITION) { …​ }

If all immediately preceeding if and else_if statements evaluate to false in their conditions, and the else_if’s condition evaluates to true, then execute the inner commands.

: else {}

If all immediately preceeding if and else_if statements evaluate to false in their conditions, then execute the inner commands.

: if_examine "OBJECT_ID" {}

Executes instructions if the player uses the examine verb and the referenced object is either held or in the current location.

: while (CONDITION) {}

While the condition evaluates to true, keep executing the inner commands. For more information, see Adventuron's "2.9. Loops""

: gosub "SUBROUTINE_ID" mask = "false/true";

Execute subroutine with the supplied subroutine id.

: done ;

Stops executing the current event handler, no further items are evaluated.

: return ;

Stop executing the current subroutine and return to the calling handler.

: nope ;

Print the system message like "You can’t do that", and then acts like : done.

: break ;

Break out of a while loop and resume execution on the next line

: mask {}

Run a block of code in addition to the event handler it's called in. For more information, see the Cookbook's article 1.35. Masking Commands

2.8.2. Common Commands

Remember to use CTRL+SPACE within a command to see more help. The plus (⊕) indicates optional attributes.

Name Description
: print "message text" align = "left/center/right" bottom_spacing = "true/false" category = "" graphic = "GRAPHIC_ID" do_not_add_to_known_nouns = "false/true";

Prints the given message. Learn more about text layout and formatting codes.

: append "message text" bottom_spacing = "true/false" category = "" do_not_add_to_known_nouns = "false/true";

Prints the given message, but does not start a new paragraph.

: goto "LOCATION_ID" character = "" describe_new_location = "false/true" secret = "false/true";

Moves the player character to the given location (does not redescribe). If you use 'back', player character moves to location they were in prior to the current location.
NOTE: This does not keep a buffer of all movements, it only remembers the last location.

: move numeric_dir = "[1...12]";

Moves the player in a direction. N=1, NE=2, E=3, SE=4, S=5, SW=6, W=7, NW=8, Up=9, D=10, Enter=11, Exit=12

: pause "MILLISECONDS";

Pauses the game for the amount of milliseconds. Value should be between 50 to 5500.

: beep millis="MILLISECONDS" pitch="PITCH";

Plays the nominated pitch for the nominated amount of milliseconds. 0 is middle C.

: success;

Plays a success 'jingle' sound (if enabled in the theme settings). See the Cookbook about Sound Effects.

: failure;

Plays a failure 'jingle' sound (if enabled in the theme settings). See the Cookbook about Sound Effects.

: press_any_key;

Wait until the player presses ENTER, SPACE, touches the screen, or clicks the mouse.

: save target = "slot";

Shows the save game dialog.

: load target = "slot";

Shows the load game dialog.

: redescribe; force_instant_redescribe = "false/true";

Redescribe current location and stops the current event handler. Triggers on_describe{} and on_tick{} from the top of both of the tables.

: lose_game;

Prompts to press any key, and then restarts the game - display intro screen, call on_startup{}, etc. Will play the lose jingle if enabled.

: win_game;

Prompts to press any key, and then restarts the game - display intro screen, call on_startup{}, etc. Will play the win jingle if enabled.

: end_game; // DEPRECATED

Deprecated - use win_game, or lose_game instead.

: set_graphic graphic = "GRAPHIC_ID" target = "LOCATION_ID" immediate = "false/true";

Changes a location's graphic to a different one. Immediate parameter refreshes the graphic and displays immediately.

: print_graphic "GRAPHIC_ID" align = "left/center/right" clear_screen = "false/true" has_bottom_margin = "true/false" width = "percentage" scaling_mode = "X";

Prints graphic to the screen.

: update_graphic graphic = "GRAPHIC_ID";

Temporarily changes location's graphic to a different one. Graphic reverts to original on redescribe.

: door_operation door = "DOOR_ID" operation = "OP";

Manually manipulate the state of a door barrier.

The operations with an underscore indicates that two state changes will occur at the same time. By default, these operations are silent (even if trying to unlock a non lockable door, or opening an open door, etc.).

OPs: ( open_unlock | lock_close | close | unlock )

: set_theme "THEME_ID";

Changes the current theme of the game to the specified theme, instantly updating the screen style but not updating the screen content or issuing a redescribe.

2.8.3. Object Commands

Remember to use CTRL+SPACE within a command to see more help. The plus (⊕) indicates optional attributes.

Name Description
: inventory crawl_type = "" for = "" show_header = "false/true";

Shows objects player is holding.

: create "OBJECT_ID" target = "inventory/LOCATION_ID" worn = "false/true";

Create an object in the the location, zone, or character as specified by the 'target'. Use 'player' or 'inventory' to create an object in the players inventory (weight limits will not be applied). If no target is supplied then create object at current location. If object currently exists, it will be moved from its previous location.

: destroy "OBJECT_ID";

Destroys object. If held it is removed from the inventory. Destroying moves the object to a special non-existence location.

: swap o1 = "OBJECT_ID1" o2 = "OBJECT_ID2";

Swaps the location of object1 and object2. Swap will also swap their existence status.

: get "OBJECT_ID" quiet = "false/true";

Get the specified OBJECT_ID if available and takeable in the current location. If no OBJECT_ID specified, this will get the object corresponding to the adjective and noun in the current parse sentence.

If quiet="true", then getting will not print the default get message (from the theme system messages). A message will always be printed if a get is not possible.

Note: This command will perform weight checks by default but these checks can be disabled in the game settings. Be very careful if using this command then moving the player immediately somewhere else. If the player can’t hold the item you are taking for them, the item may end up inaccessible (if the player can’t return to the location where the item was given). Consider the : pocket "object_id" command instead which is fail-safe.

: drop; "OBJECT_ID" quiet = "false/true";

Drops the specified OBJECT_ID if available and dropable in the current location. If no OBJECT_ID specified, this will drop the object corresponding to the adjective and noun in the current parse sentence.

If quiet="true" is specified, then dropping will not print the default drop message (from the theme system messages). A message will always be printed if a drop is not possible.

: drop_all;

Drops all objects.

: pocket "OBJECT_ID";

Creates an item and places it in the player's inventory silently, if there is enough space (uses weight + item limits).

If the player cannot take the object, then the object is created in the location where the player is located when the location is redescribed or the prompt is redisplayed (whichever comes first). Furthermore, the appropriate error message (You’re holding too many items, you’re can’t take that) will be displayed. Pocket failing does not stop execution of subsequent commands.

Pocketing a held item does nothing. Omitting the OBJECT_ID will pocket s1().

: wear "OBJECT_ID" perform_limit_check = "false/true" quiet = "false/true";

Wears the specified OBJECT_ID if available and wearable in the current location. If no OBJECT_ID specified, this will wear the object corresponding to the adjective and noun in the current parse sentence.

: unwear "OBJECT_ID" quiet = "false/true";

Takes off the specified OBJECT_ID if worn and removable. If no OBJECT_ID specified, this will remove the object corresponding to the adjective and noun in the current parse sentence.

2.8.4. Variable Commands

Remember to use CTRL+SPACE within a command to see more help. The plus (⊕) indicates optional attributes.

Name Description
: set_true "BOOLEAN_ID";

Sets boolean variable to a true value.

: set_false "BOOLEAN_ID";

Sets boolean variable to a false value.

: toggle "BOOLEAN_ID";

Inverses boolean variable.

: add var = "INT_VAR" value = "VALUE";

Adds value to integer variable. For more information, refer to Integer Assignment Commands.

: store_random var = "INT_VAR" max = "integer";

Generates a random value between 0 and 99.

: set_integer var = "INT_VAR" value = "VALUE" sysvar = "";

Sets an integer variable. For more information, refer to Integer Assignment Commands.

: set_string var = "STRING_VAR" value = "VALUE";

Sets a string variable. For dynamic text, refer to Dynamically Set a String with Expression Forms

: increment "INT_VAR";

Increment integer variable, but not past max value.

: decrement "INT_VAR";

Decrement integer variable, but not below min value.

: ask_bool { var = BOOL_VAR question = QUESTION TO ASK? do_not_show_answers = false/true force_show_numbering = false/true invert_the_value = false/true no_answer = no yes_answer = yes; }

Asks a question and stores the result in a boolean variable.

: ask_int { var = INT_VAR question = QUESTION TO ASK? min = integer max = integer }

Asks for an integer (a number) in a range and stores in an integer variable. Min and max must be specified.

: ask_string { var = STRING_VAR question = QUESTION? confirm_negative_question = Not sure? confirm_positive_question = Sure? empty_is_ok = false/true }

Asks for a string (some text) and stores in a string variable.

2.8.5. Sound Commands

These commands control how sound is played. Sounds must first be defined in assets.

There are three distinct channels for sound, one each for music, ambient, and incidental. These three types of sounds can overlap: e.g., a door slamming will not interrupt the ambient music.

Name Description
: play_ambient sound = "AMBIENT_SOUND_ID";

Play a ambient_sound on the ambient channel which always loop.

: play_music sound = "SONG_SOUND_ID" loop = "true/false";

Play a song_sound on the music channel. Set to loop by default.

: play_incidental sound = "INCIDENTAL_SOUND_ID";

Play an incidental_sound on the sound channel. Never loops.

: stop_ambient millis = "";

Stops the ambient channel.

: stop_music millis = "";

Stops the music channel.

: stop_sound millis = "";

Stops the sound channel.

: set_ambient_vol volume = "0…100";

Sets volume for ambient channel.

: set_music_vol volume = "0…100";

Sets volume for music channel.

: set_sound_vol volume = "0…100";

Sets volume for sound channel.

2.8.6. Advanced Commands

Commands you'll find in the Cookbook or by pressing CTRL+SPACE. The plus (⊕) indicates optional attributes.

Name Description
: add_choice "CHOICE" {}

Adds a choice to the choice list. See Cookbook's "1.41. Multiple Choice (Beta)".

: choose "Your choice?";

Presents choices. See Cookbook's "1.41. Multiple Choice (Beta)".

: clear_choices;

Clears choices. See Cookbook's "1.41. Multiple Choice (Beta)".

: cycle key = "enter_unique_cycle_id_here" predictable_order = "false" allow_back_to_back = "false" max_loops = "int" reset_var = "" skip_interval = "int" {}

For more information, see Cookbook's "1.11. Picking Commands One At A Time Without Repetition (aka Cycling)".

: execute_one_at_random {}

Execute one of the commands at random. For more information, see Cookbook's "1.12. Semi Random Messages".

: push "string";

Push a string value on the stack. The stack only support 8192 entries by default. The stack is serialised.

: play_music sound = "SOUND_ID";

Experimental. Refer to Codebook's entry "1.19. Music".

: stop_music;

Experimental. Refer to Codebook's entry "1.19. Music".

: refresh_status_bar;

Triggers a staus bar refresh.

: scan {}

Iterate over every child of a node (location, entity, or zone).

: set_sentence "replacement sentence";

This will replace the current sentence with the sentence inside the double quotes.

2.8.7. Undocumented Commands

The following commands are undocumented, and the parameters are unknown. They may or may not work. Use them at your peril.

Name Description
add_trait

adhoc_block

adhoc_block_path

adhoc_unblock

adhoc_unblock_path

adjust_time

apply_block

ask_permission

ask_string_multi

become

clear_stack

compat

complete_objective

debug

describe

discover

do_all

experimental_confirm

experimental_do_nothing

experimental_dummy_command

experimental_retake_location_snapshot

insert_in_container

keyboard_hint

look_inside

ok_done

pen

pop

preload

print_list

print_list_verbose

print_stagger

remove_block

remove_from_container

remove_trait

set_adjective1

set_adjective2

set_adverb

set_noun1

set_noun2

set_preposition

set_stat

set_subject1

set_system_flag

set_verb

show_exits

show_separator

stop_tick

subcommands

Run multiple instructions in one execution of a cycle.

submit_command

Execute a command as if the player typed it in themselves.

system_command_whereis

throw_dice_1

throw_dice_2

throw_dice_3

toggle_trait

unvisit

vibrate

warn

2.9. Loops

A 'while' loop is used to repeat a set of commands until a particular condition is satisfied.

2.9.1. Example: Input validation with a While loop

A basic while loop can be used to validate some kind of input.

start_at  = location

locations {
   location : location "You win, the answer is indeed {answer}!" ;
}

strings {
   answer : string "" ;
}

on_startup {
   : while (lower(answer) != "paris") {
      : ask_string question = "What is the capital of France?"  var = "answer" ;
   }
}

2.9.2. Example: Calculations Using A While Loop

While loops can be used within while loops, as in the example shown below, which prints out the times tables.

start_at = my_location
locations { my_location : location "Type <TEST<4>>" ; }

integers  {
   x : integer "1" ;
   y : integer "1" ;
}

on_command {
   : match "test _"  {
      : print "Start While" ;
      : set_integer var = "x"  value = "1" ;
      : while ( x <= 12 ) {
         : set_integer var = "y"  value = "1" ;
         : while ( y <= 12 ) {
            : print {(x + " x " + y + " = " +(x*y) )}
            : increment"y";
         }
         : increment"x";
      }
      : print "End While" ;
   }
}

2.10. Text Formatting

Adventuron supports various codes that can be embedded into the text to style the text.

2.10.1. Text Formatting Codes

Syntax Description
"Var is {var}.";

Use expression form {} in text to import the value of a string variable.

"\n";

New paragraph (a linefeed).

"\\n";

\\ is used to represent a \ character. Will print \n.

"\"Hi.\"";

\" is used to represent a " character. Will print "Hi."

"2^^4";

^^ is used to represent a ^ character. Will print 2^4.

"object{{}}.";

{{ and }} is used to represent { and } respectively. Will print object {}.

"x<<>>y.";

<< and >> is used to represent > and < respectively. Will print x<>y.

"[[x]].";

[[ and ]] is used to represent [ and ] respectively. Will print [x].

"``Hi.``";

`` is used to represent a ` character. Will print `Hi.`

2.10.2. Aligning Text with Paragraph tags.

Paragraph tags affect text until a new paragraph tag is used.using the ^r^ tag.

Syntax Description
"^l^Left aligned.\nAlso left aligned.";

All text after ^l^ is left aligned.

"^r^Right aligned.\nAlso right aligned.";

All text after ^r^ is right aligned.

"^c^Center aligned.\nAlso centered.";

All text after ^c^ is center aligned.

"^n^No paragraph padding.\nNext line.^m^Padding restored.";

Paragraphs usually have padding between lines. ^n^ removes the padding. ^m^ turns padding back on for paragraphs after it.

2.10.3. Text Colouring and Standard Palette

To colour text, you can use the palette color or the rgb hex code. Use the pattern <YOUR TEXT<COLOUR CODE>> to colour in some text. For more information on colour, see Adventuron's 3.12.9. Settings Colours In The Theme and the rest of the sections after that.

Code Example Code Example
0 | Black   | #000

This is black.

15 | White         | #fff

This is white.

1 | Blue    | #00c

This is blue.

 9 | Light Blue    | #00c

This is light blue.

2 | Red     | #c00

This is red.

10 | Light Red     | #c00

This is light red.

3 | Magenta | #c0c

This is magenta.

11 | Light Magenta | #f0f

This is light magenta.

4 | Green   | #0c0

This is green.

12 | Light Green   | #0f0

This is light green.

5 | Cyan    | #0cc

This is cyan.

13 | Light Cyan    | #0cc

This is light cyan.

6 | Yellow  | #cc0

This is yellow.

14 | Light Yellow  | #ff0

This is light yellow.

7 | Grey    | #ccc

This is grey.

8 |  Orange        | #f60

This is orange.

2.10.4. Hyperlinks (Experimental) - Subject to change

Hyperlinks are supported in Adventuron via the following pattern:

: print "Click <here<4>>[https://adventuron.io] to go to the website.";

You can also put a command within the square brackets, and clicking it in the browser will execute that command.

: print "Click <this<4>>[examine book] to examine the book.";

2.11. Assets

You can add graphics and external sounds and images within the assets {} block.

2.11.1. Graphic Assets

Graphics can be imported and stored inline in base64. For more information on how to display graphics, refer to "2.8.2. Common Commands" for graphic commands.

assets {
	graphics {
		pic_id  : placeholder;   // No image shown.
		gif_id  : base64_gif  ""; // Gif or animated gif image ideally under 12kb.
		jpeg_id : base64_jpeg ""; // JPG image.
		png_id  : base64_png  ""; // PNG image ideally under 12kb.
		webp_id : base64_webp ""; // webp image ideally under 48kb.
		
		dg_id : dynamic_graphic {(  )}; 
		// For more information, see Cookbook's entry "1.42. Dynamic Graphics".		
	}
}

Graphics can also be linked externally. For more information, refer to the Cookbook entry "1.24. Linking External Assets".

assets {
	graphics {
		// Below images have relative paths and must be in the same path as game HTML file
		external_gif_id  : gif  "mygif.png"; 
		external_jpeg_id : jpeg "myjpeg.png";
		external_png_id  : png  "mypng.png";
		
		// Absolute path good for testing, not recommended for packaging.
		png_id  : png "https://mydomain.com/path/image.png";
	}
}

2.11.2. Sound Assets

Note the prefix for the different types of sound in the below example (song_, ambient_, incidental_). These prefixes are required.

For more information on playing sound, see ...

assets {
	sounds {
		song_sound       : sound_sample "https://domain.com/path/sound1.mp3";
		ambient_sound    : sound_sample "https://domain.com/path/sound2.mp3";
		incidental_sound : sound_sample "https://domain.com/path/sound3.mp3";		
	}
}

2.11.3. Other Assets

The following assets are experimental.

assets {

	fonts { // Refer to user guide's "3.21. Fonts".
		userfont_myfont : base64_ttf
			description                      = "" 
			horz_pixels                      = "8" 
			vert_pixels                      = "8" 
			monospace                        = "false/true" 
			font_scale_multiplier            = "1.0" 
			snap_vert                        = "false/true" 
			supports_arrows                  = "false/true"
			preferred_num_columns            = ""
			preferred_num_columns_mobile     = ""
			experimental_line_height_ratio   = "1" 
			experimental_always_bold         = "false/true"
			experimental_status_bar_padding_top      = "1" 
			experimental_status_bar_padding_bottom   = "1" 
			"BASE64TTF";
	}

	// Following found in CTRL+SPACE but haven't found documentation yet.
	attributions {}
	experimental_stylesets {}
	palettes {}	
	separators {}
	style_sheets {}
	sprites {}
	videos {}
}

3. Game Configuration

3.1. Game Information

Adventuron will complain if you have not set up the game_information{} section when you compile. For more information on how the game saves, see Adventurone's "3.10. Load / Save".

Game Information Description
game_information {

Start the code block.

game_name =

Your game name.

game_version =

Game version. e.g. 0.5.0

game_shortname =

Short game name (13 characters max).

written_by =

Author.

uuid =

Unique ID used for save games. You may use Online UUID Generator to create one.

year_of_release =

Year it was released.

copyright_message = ©…

Copyright message. Independent to licensing.

compatibility_version =

An integer number that ensures latest version is being loaded for the player.

short_synopsis =

One sentence description of game. For use in indexes.

additional_credits =

Credit your contributors!

ported_by =

Author of the ported game.

translated_by =

If you have translators.

year_of_original =

Year of the original if game is a port.

aimed_at = [ ]

A list of those the game is targetted for: children, teeeagers, adults.

icon_128 =

A reference to a graphic asset identifier, which should contain a 128x128 pixel icon, required for packaging as PWAs. NOTE : Currently, this will not be validated for correctness.

icon_512 =

A reference to a graphic asset identifier, which should contain a 512x512 pixel icon, required for packaging as PWAs. NOTE : Currently, this will not be validated for correctness.

license_full =

Full license pertaining to your game.

long_synopsis =

A longer description of the story / content of the adventure. For use in indexes. Should be no longer than a paragraph and should not contain spoilers.

may_be_scary = false/true

A longer description of the story / content of the adventure. For use in indexes. Should be no longer than a paragraph and should not contain spoilers.

notes =

Any additional comments.

packaged_html_header_message =

Takes priority over copyright message.

suitable_for = [ ]

A list of those the game is suitable for: children, teeeagers, adults.

tags =

Tags to help users discover adventures. Typically use camel case with no spaces for tags.

translated_from =

The language the original version of this adventure was written in (pre translation). This should be ENGLISH fullname versions of the language (see the sample values).

} End game_information block.

3.2. Game Settings

Configures settings related to the game engine. Some of these settings can be overridden by UI settings in a client.

Game Settings Description
game_settings {

Start the code block.

auto_pluralize_nouns = true/false

If the current language supports it, this looks for nouns that end in 's' (not double 'ss') and automatically add a noun alias for the noun if it doesn't exist yet. NOTE: Pluralize will always be disabled if 'n_char_parser' is provided. Refer to user guide's "3.20.1. Plurality".

dark_expression =

If this is true, then we enter 'dark' mode which overrides the location description and hides object lists if appropriate.

default_location_graphic =

The graphic to display when there are no graphics to display in a location.

enable_standard_all_behaviour = true / false

Disable get all, take all, etc.

experimental_new_scroll = false / true

If enabled, then use the new scrolling mechanism (experimental).

gamebook_page_scan_regex =

If in gamebook mode, then configure the pattern to scan for page numbers. Any one of the regular expressions supplied here will be used, multiple regular expressions can be split by \n. The default regex (for English language) is "page (\d+)". The page number should be in the quotes and should always match a numeric. This scan will only be performed if:

  1. Currently in gamebook mode running as the top level choice.
  2. No explicit goto="" is supplied for the choice.
  3. All locations have an id.
  4. No actions are defined for the choice.
  5. Choice text does not start with a numeric followed by a colon (this format is for quick navigation).

ident_graphic = GRAPHIC_ID

Used to brand your game.

ident_graphic_horz_percent =

Width of ident_graphic.

image_load_strategy = synchronous / asynchronous

Determines if an image should load synchronously (wait for the asset to load before displaying), or asynchronously (display asset before checking if it is loaded).

initially_known_verbs = []

Verbs known by the parser for tab-completion. If specified, then all verbs must be added (does not affect parser, only tab-complete).

inventory_items_limit_var =

If the player is constrained by how many items they can carry, then set a numeric limit of the number of items that the player can carry or wear. NOTE: If this is not supplied, then a combined inventory limit of 10 items will be imposed.

inventory_weight_limit_var =

If the player is constrained by how much weight they can carry, then set a numeric limit of the weight that the player can carry. Simple inventory systems might set all objects to have a weight of 1, therefore the weight limit of 200 would allow the player to carry 200 items simultaniously. NOTE: If this is not supplied, then an inventory limit of 200 weight units will be imposed.

inventory_worn_items_limit_var =

[] If supplied, then worn items will have a seperate item limit (not shared with 'inventory_items_limit_var'). If not supplied, then 'inventory_items_limit_var' will represent the limit of carried and worn items.

on_describe_runs_straight_after_d_block = true/false

on_describe() usually runs after everything in the layout. This will have it run right after D is executed (as specified in the layout).

on_examine_non_known_entity = you_see_nothing_special | you_see_nothing_special_2 | cant_see_one_of_those

'you_see_nothing_special_2' (default) is the message used when you examine a noun that does not relate to a known object.

precache_strategy = no_cache/precache_all

Determines how Adventuron should pre-cache assets in the game (whether it should load as an asset is needed, or not).

rewind_enabled = false/true

Alow undo. See Cookbook's "1.50. Rewinding"

rollback_enabled = false/true

On a LOSE_GAME, ask the player to undo their last move. See Cookbook's "1.49. Sudden Death and 'Rollback'"

scan_entity_ids_for_vocab_items = true/false

You can switch off the entity id (to adjective / noun) association.

treasure_hunt_mode = default/bespoke

By default, if the player defines objects to be treasures, and a treasure target, then the game will go into auto-treasure-hunt mode, where a handler will be added to the on_tick{} message, that will display a "You have won the game" message. If set to bespoke mode, treasure hunt win-game logic is not added and you can code a bespoke handler. See Cookbook's "1.31. Treasure Hunt Customization".

} End game_settings block.

3.3. Game Themes

Theme settings, not to be confused with the game settings, define the look of the game. Adventuron has a default basic theme, but you can choose to use the TWO theme (See Cookbook "1.48. TWO Theme"), or customize your own.

Multiple themes can be specified in the themes section, and can be change at runtime during the game.

3.3.1. Theme Components

A theme is made up of the following blocks. They will be covered in more detail in following sections.

Theme Component Description
themes { my_theme : theme {

Start a custom theme within the themes {} codeblock.

theme_settings {}

General settings for the theme.

colors {}

Specify default colors to use for different text displayed during the adventure. For example, you may wish to specify that the command line entry colour is different to the main text colour, or the inventory list is a different colour.

lister_choices {}

Settings for configuring the multiple choice UI.

lister_exits {}

Configure the way that exit lists are rendered.

lister_inventory {}

If value supplied here, then can be used to override the default theme.

lister_objects {}

Values to override default theme.

screen {}

Values for the virtual screen.

status_bar {}

If the game requires a top bar that is stuck to the top of the screen, not matter where the scrolling occurs, then reference a status_bar here.

system_messages {}

Override common standard responses to player commands.

} }

End theme block.

3.3.2. Theme Settings

Set up the general settings for the theme.

Theme Definition Description
themes { my_theme : theme { theme_settings {

Start theme_settings {}.

font =

For more information, see user guide's "3.22. Fonts". Press CTRL+SPACE to get a list of built-in fonts to use.

columns =

Number of PREFERRED columns to AIM for (this is an approximation for calculating the px value assigned to a font). Depending on the font, the default can vary, but usually in the range 48 to 80. Depending on the snap mode there may be significant difference between the aimed for columns and the actual columns displayed. In full_snap mode, the screen is sized based on factors content_width pixels and the font, if specified integer scaling only, might not fit. In this case, the number of columns is the loser.

columns_mobile =

Number of PREFERRED columns to AIM for on mobile. This does not inherit from 'columns' and has a sensible default for the selected font. Default varies on font, but usually in the range 24 to 40. Depending on the snap mode there may be significant difference between the aimed for columns and the actual columns displayed.

capitalization = lower/upper/camel/original

Controls capitalization of everything printed.

delay =

(in milliseconds) Default parser delay, for *most* categories. NOTE: Delays may be disabled by the user. See Codebook's "1.29. Eliminating Parser Delay".

experimental_wait_graphic =

The graphic used for press_any_key.

failure_jingle = on/off

Enable failure sound effect (when 'failure' command is called). See Codebook's "1.25. Changing Default Sound Effect (Jingles)".

hide_status_bar_on_clearscreen = false/true

If true, then hide the header on clear screen. Default is 'true'.

hide_status_bar_on_endgame = false/true

If true, then hide the status_bar when in the endgame block. Defaults to 'true'.

keyboard_click = off/on

Enable click of the text entry, or not. Default is 'off'.

keyboard_click_pattern = 2, 26

Text entry click sound. First item is number of milliseconds (between 1 and 25), second item is pitch (between -60 and 60). Default is "2, 26".

layout = "H G- D X O"

Define the vertical layout order of items when a location is described. See Screen Layout.

losegame_jingle = on/off

Enable failure sound effect (when 'failure' command is called). See Codebook's "1.25. Changing Default Sound Effect (Jingles)".

redescribe = auto/manual

Change screen refresh. See Codebook's "1.23. Auto Redescribe Mode" and for more advanced users, "1.40.1. Auto Beta Mode 2".

success_jingle = on/off

Enable success sound effect (when 'success' command is called. See Codebook's "1.25. Changing Default Sound Effect (Jingles)".

textbox_capitalization = true/false

Hint to capitalize user entry in the textbox. Some clients may not support this. Default is true.

wingame_jingle = on/off

Enable wingame sound effect (for when the game is won). See Codebook's "1.25. Changing Default Sound Effect (Jingles)".

theme_tags = []

This can be used to interrogate a theme about its properties..

} }

End theme_settings block.

3.3.3. Theme Colours

Colors can be set up using palette numbers or RGB hex codes. See "2.10.3. Text Colouring and Standard Palette".

For a number of the colours, if nothing is provided, then the default colour of the style set (or client override) will be used.

Theme Definition Description
themes { my_theme : theme { colors {

Start colors {}.

border =

The border color of the panel containing the adventure. Different from the background colour of the text. Ignored on mobile platforms.

paper =

The background colour of the panel containing the adventure. Different from the background colour of the text.

pen =

The default foreground colour of the story text of the adventure game. This is the text that is displayed in T1 (on_command) and T2 (on_redescribe) by default.

status_bar_paper =

The color of the panel containing the top bar.

status_bar_pen =

The color of the text in the top status bar.

choice_paper = []

The multiple choice option paper color(s) for generic options. If more than one is provided, then the colors will cycle as new links are printed. See Codebook's "1.41.1. Colour cycling for multiple choice options".

choice_pen = []

The multiple choice option pen color(s) for generic options. If more than one is provided, then the colors will cycle as new links are printed. See Codebook's "1.41.1. Colour cycling for multiple choice options".

choice_selected_paper = []

The selected multiple choice option paper color(s).

choice_selected_pen = []

The selected multiple choice option pen color(s).

dark_pen =

The default colour of text in a dark location.

default_entity_link_pen =

The default direction link colour. If not supplied, then will use link pen. If link pen not supplied, then will use default contextual pen.

default_link_pen =

The default entity link colour (typically in the location description). If not supplied, then will use link pen, if link pen not supplied, then will use default contextual pen. Entities in object or inventory lists are styled independently.

default_linkmanual_pen =

The default manual link colour of the adventure (typically in the location description).

exit_list_header_pen =

Colour corresponding to text such as "Exits:", some modes do not have a header and work exits into the paragraph text.

exit_list_item_pen =

The default direction link colour of the adventure. If not supplied, then will use link pen, if link pen not supplied, then will use default contextual pen.

exit_list_punctuation_pen =

The default colour of punctuation in exits section.

header_pen =

Pen colour of header.

help_pen =

PThe default colour of the text that is flagged as help.

incidental_pen =

The colour of the non-interactive events (by default).

inventory_header_pen =

The colour of "You are carrying:".

inventory_punctuation_pen =

The colour of punctuation when listing out items.

ondescribe_pen =

The colour of the print statements inside the on_describe {} block (by default).

question_header_pen =

Colour for questions being asked.

response_pen =

The colour of the parser responses. Responses are text that is printed from event handlers.

response_pen_negative =

The colour of the parser responses.

treasure_pen =

The colour of a treasure, when listed in the per-location object list.

yousee_header_pen =

Colour for "You See:" text when listing items of interest.

yousee_item_pen =

The default colour of the listed items of interest in the current location.

yousee_item_punctuation_pen =

The default colour of the listed items punctuation.

yousee_nothing_pen =

The default colour of a special item, representing NOTHING when listing items.

} }

End theme colors block.

3.3.4. Theme Status Bar

If SB is specified in the layout, then the current theme MUST specify a status_bar {} section.

Although there are a few options to choose from, the Status Bar only has two slots, so only two elemetns defined: one for the left slot of the status bar, and another for the right slot of the status bar.

Status Bar Element Description
themes { my_theme : theme { status_bar {

Start status_bar {}.

header_text;

Prints the standard header content in this slot (current location falling back to current zone).

exit_list;

Render type for choice list on mobile.

location_text;

Render choice list for top level choice (in gamebook mode). Inherits from choice_list_style.

fixed_text = "" font = "";

Prints a fixed piece of text in this header slot.

treasure_text;

Prints the current treasure score (if the game is a treasure hunt type game), otherwise prints a blank string. If you wish to override the treasure score, then create a string variable called 'treasure_score' and that will be used instead of the system treasure score (useful for context sensitive displays).

dynamic_text = ""

Prints the content of the chosen variable (including dynamically evaluated variables).

} }

End status_bar block.

3.3.5. Theme Lister Choices

Settings for configuring the multiple choice UI.

Theme Definition Description
themes { my_theme : theme { lister_choices {

Start lister_choices {}.

choice_list_style =

Choose the default type of way to render the choice list.

choice_list_style_mobile =

Render type for choice list on mobile.

gamebook_choice_list_style =

Render choice list for top level choice (in gamebook mode). Inherits from choice_list_style.

gamebook_choice_list_style_mobile =

Render choice list for top level choice (in gamebook mode) for mobile. Inherits from choice_list_style_mobile.

} }

End lister_choices block.

For each of the above lister choices, the following options are available:

Option Description
= default

Default way to render choices for the client (according to theme).

= no_list

Only show question (only on clients that support keyboard).

= numeric_list

Print numeric choices ahead of choices, if numbers inside one or more of the options overlap with one of the options, then use letters as prefixes instead.

= numeric_list_always

Print numeric choices ahead of choices, even if the numeric choices overlap some of the content of the choices (not recommended for selecting options involving numbers).

= alpha_list

Print alphabetic choices as a list.

= list

Do not print choices (only show question). This only applies to text based clients, as non-text based clients will need something to click.

= inline

Print the choices, inline, after the question. Only on clients that have a keyboard.

= inline_no_question

Print the choices, inline, and do not print a question. Only on clients that have a keyboard.

3.3.6. Theme Lister Inventory

How the player's inventory is displayed.

Theme Definition Description
themes { my_theme : theme { lister_inventory {

Start lister_inventory {}.

experimental_auto_group_singular_objects = false / true

If true then will present multiple objects that have a singular article with a counter and a pluralised noun. e.g. "a bar of gold, a bar of gold, a bar of gold" become "some bars of gold (5)"

header_capitalization = original / lower / upper/camel / first_camel_then_lower / original

Describes the capitalization policy for the header of the lists. Default is "original".

header_margin =

The amount of margin to place after the list header is displayed. This is a ratio, where 0.0 represents no vertical margin after the header is displayed, and 1.0 represents the line height. 0.5 represents half the line height.

item_capitalization = original / lower / upper/camel / first_camel_then_lower / original

Describes the capitalization policy for objects when in lists, including the inventory. Default is "original".

list_type = verbose / list / list_no_article single_line / single_line_no_article / single_line_no_article_no_adjective

Describes how we should list objects when visiting a location. Default is "list".

list_type_mobile = verbose / list / list_no_article single_line / single_line_no_article / single_line_no_article_no_adjective

Describes how we should list objects when visiting a location. Default is "single_line" on mobile.

oxford_comma = true / false

You love it, or you don't.

sort_order = description / id / ""

The sort order of the entity list (including object list). Options include: description = (ascending), "id" = id of the entity (ascending), "" - empty string, do not sort (default).

} }

End lister_inventory block.

3.3.7. Theme Lister Objects

How objects are displayed.

Theme Definition Description
themes { my_theme : theme { lister_objects {

Start lister_objects {}.

experimental_auto_group_singular_objects = false / true

If true then will present multiple objects that have a singular article with a counter and a pluralised noun. e.g. "a bar of gold, a bar of gold, a bar of gold" become "some bars of gold (5)"

header_capitalization = original / lower / upper/camel / first_camel_then_lower / original

Describes the capitalization policy for the header of the lists. Default is "original".

header_margin =

The amount of margin to place after the list header is displayed. This is a ratio, where 0.0 represents no vertical margin after the header is displayed, and 1.0 represents the line height. 0.5 represents half the line height.

item_capitalization = original / lower / upper/camel / first_camel_then_lower / original

Describes the capitalization policy for objects when in lists, including the inventory. Default is "original".

list_type = verbose / list / list_no_article single_line / single_line_no_article / single_line_no_article_no_adjective

Describes how we should list objects when visiting a location. Default is "list".

list_type_mobile = verbose / list / list_no_article single_line / single_line_no_article / single_line_no_article_no_adjective

Describes how we should list objects when visiting a location. Default is "single_line" on mobile.

oxford_comma = true / false

You love it, or you don't.

show_when_empty = false/true

By default, the location object list is not shown when there are zero items to be listed. Use this to show it always. Default = 'false'.

sort_order = description / id / ""

The sort order of the entity list (including object list). Options include: description = (ascending), "id" = id of the entity (ascending), "" - empty string, do not sort (default).

} }

End lister_inventory block.

3.3.8. Theme System Messages

System messages are standard responses to certain commands which can be customized.

start_at    = start_location
start_theme = my_theme

locations {
   start_location : location "This is the start location.";
}

themes {
 my_theme : theme {
    // Control+Space here and selecting 'system_messages' inserts below template. 
	// Commented out responses are not in template.
	system_messages {
      // Control+Space here brings up specific message not already in list	
      all_treasures_found_win_game = Congratulations, you found all the treasures. You have won!
      already_in_container         = ${entity} is already inside the ${entity2}.
      ask_new_game                 = Would you like to start a new game?
      ask_quit                     = Do you wish to quit the game?
      be_more_specific             = Be more specific ...\s
      cannot_carry_any_more        = You cannot carry any more items.
      cannot_carry_any_more_weight = It's too heavy for you to carry.
      cant_see_one_of_those        = You can't see one of those.
      cant_take                    = You can't take it.
      dont_have_one_of_those       = You don't have one of those!
      door_bang_into_door                            = // …
      door_cant_close_closed_door                    = // …
      door_cant_lock_already_locked_door             = // …
      door_cant_lock_door_with_it                    = // …
      door_cant_lock_non_lockable_door               = // …
      door_cant_lock_open_door                       = // …
      door_cant_open_locked_door                     = // …
      door_cant_open_open_door                       = // …
      door_cant_unlock_already_unlocked_door         = // …
      door_cant_unlock_door_with_it                  = // …
      door_cant_unlock_non_lockable_door             = // …
      door_close                                     = // …
      door_door_slams_shut                           = // Auto shutting door
      door_lock                                      = // …
      door_lock_door_with_what                       = // …
      door_no_door_here                              = // …
      door_open                                      = // …
      door_unlock                                    = // …
      door_unlock_door_with_what                     = // …
      exit_list_additional_exits_are_located_verbose = Additional exits are located\s
      exit_list_end_text                             = 
      exit_list_end_text_verbose                     = .
      exit_list_from_here_you_can_go_verbose         = You can go\s
      exit_list_header_concise                       = Exits :\s
      exit_list_last_sep_verbose                     = \sand\s
      exit_list_sep_verbose                          = ,\s
      exit_list_there_are_no_obvious_exits           = There are no obvious exits.
      exit_list_to_the_verbose                       = to the
      exit_list_you_can_also_go_verbose              = You can also go\s
      gamebook_question                              = Select An Option ...
      i_cant_do_that                                 = Not right now.
      invalid_choice                                 = Invalid choice.
      inventory_list_bullet_point  = // Prefix for items in non-verbose inventory lists.
      inventory_list_empty                           = Nothing
      inventory_list_end_text                        = .
      inventory_list_final_separator                 = \sand\s
      inventory_list_header                          = You are carrying:\s
      inventory_list_header_verbose                  = You are carrying\s
      inventory_list_separator                       = ,\s
      it_is_dark                   = It is dark. You can't see a thing.
      must_remove_first            = Try taking it off first.
      not_carried                  = You can't ${verb} something you are not carrying.
      not_present                  = ${entity} is not here.
      nothing_here                 = There is nothing here.
      nothing_to_get               = You look around but can't see any ${noun} anywhere!
      object_list_bullet_point     = // Prefix in non-verbose object lists.
      object_list_empty            = Nothing
      object_list_end_text         = .
      object_list_final_separator  = \sand\s
      object_list_header           = You see :\s
      object_list_header_mobile    = // ...
      object_list_header_verbose   = You see\s
      object_list_separator        = ,\s
      ok                           = OK
      on_drop                      = You drop ${entity}.
      on_get                       = You take ${entity}.
      on_put                       = You put ${entity} inside ${entity2}.
      on_put_non_container         = ${entity} is not a container.
      on_put_non_surface           = ${entity} is not a surface.
      on_remove                    = You take off ${entity}.
      on_wear                      = You wear ${entity}.
      post_quit                    = You have quit the game.
      prior_prompt                 = What Now?
      prompt                       = >>
      prompt_expression            = // string variable
      question_prompt_char         = ?
      restore_from_autosave        = // end game rewind prompt
      there_is_nothing_you_can     = There is nothing you can ${verb} at the moment.
      treasure_message             = 
      treasure_suffix              = 
      unknown_noun                 = This game does not require use of the word "${noun}".
      unknown_verb                 = This game does not require use of the word "${verb}".
      worn_suffix                  = \s(worn)
      you_already_wear             = You are already wearing that.
      you_are_already_carrying     = You already have ${entity}.
      you_are_not_holding          = You are not holding ${entity}.
      you_cant_go_that_direction   = You can't go that way.
      you_cant_wear                = You can't wear that.
      you_cant_wear_anything_else  = You can't wear anything else without removing something first.
      you_dont_wear                = You are not wearing that.
      you_see_nothing_special      = You see nothing special.
   }
}

3.3.9. Screen Layout

The layout of the game screen is referenced in game_settings {}, but warrants its own section. You can have different layouts for desktop and mobile.

For more information, the user guide's "3.16. Screen Layout".

Sample Theme With A Custom Layout
themes {
   my_theme : theme {
      theme_settings {
         layout = D X O
      }
   }
}

Items in the layout section must be chosen from this list of layout elements. All items in a layout are rendered from top to bottom.

Option Description Top Pad Bottom Pad

SB

Adds a scroll-locked status bar. Current theme MUST specify a status_bar {} section if added. A clear screen command might remove this unless configured to maintain the status bar.

Currently only works if first item in layout.

No

No

H

Header (if exists for location).

No

Yes

H -

Header (if exists for location).

No

No

G

Graphic (if exists).

No

Yes

G -

Graphic (if exists).

No

No

+ G

Graphic (if exists).

Yes

Yes

+ G -

Graphic (if exists).

Yes

No

D

Description (if exists for location)

No

Yes

HD

Header in capital letters, following by description, without a linefeed between the header and the description (space added).

No

Yes

X

Exit List (if exists for location).

No

Yes

P* "string_id"

Pointer to a string id. This can be a dynamic string which will resolve lazily.

No

Yes

O

Object list for conspicious objects in location (if exists for location)

No

Yes

SEP "seperator_id"

horizontal line break across the screen. Currently just supports 'adv_line_red'. DO NOT USE CUSTOM SEPERATORS RIGHT NOW AS IMPLEMENTATION WILL CHANGE.

No

Yes

LOCK

Lock scrolling. All screen layout items prior to the lock will not scroll off the screen.

Note that on mobile phones that LOCK is (typically) ignored unless it follows a graphics block.

No

No

Dynamic Layouts

You can also set up layouts dynamically if you don't wish to switch through different themes.

Example Dynamic Layout - is_dark_bool is an example boolean variable
themes {
    my_theme : theme {
      theme_settings {
        layout_dynamic { -> (
            (is_mobile() ? ("SB G-" : "SB G LOCK") +
            " D" +
            (is_dark_bool ? "" : " X O" )
        )
      }
    }		
}

3.4. Default Vocabulary

List of default game vocabulary along with their default actions.

System Command Synonyms Purpose

look -

l, r, redescribe

Redescribes the current location.

examine *

x, look, (look at), ex, exam, exami

Accesses the description or message for the examined object.

get *

take, (pick up)

Takes an object. Subject to taking rules.

drop *

(put down), discard

Drops an object. Subject to dropping rules.

inventory _

i, inv, inven, holding, pockets

Lists what player is carrying.

wear *

(put on)

Wears carried object. Subject to wearing rules.

open *

Opens an object or a door.

close *

Closes an object or a door.

lock *

Locks an object or a door.

unlock *

Unlocks an object or a door.

remove *

(take off), unwear

Removes worn item. Subject to removing rules.

ramload _

Quick loads to an in-memory save slot.

ramsave _

Quick save to an in-memory save slot.

load _

Loads the game from a save slot.

save _

Saves a game to a save slot.

loadf _

Loads a game from a text file.

savef _

Saves a game to a text file.

paper 0-15, #000 - #fff

Sets the background colour of the game.

pen 0-15, #000 - #fff

Sets the foreground colour of the game.

columns 16 - 120

Sets the number of characters on a row.

normal -

Sets all presentation overrides (pen, paper, columns, theme, etc) back to the author specified default values.

quit _

restart

Asks if the player wants to quit the game, then if they answer yes, restarts the game.

help _

Displays the system level help command.

north _

n

Tries to move north (if possible).

northeast _

ne

Tries to move northeast (if possible).

east _

e

Tries to move east (if possible).

southeast _

se

Tries to move southeast (if possible).

south _

s

Tries to move south (if possible).

southwest _

sw

Tries to move southwest (if possible).

west _

w

Tries to move west (if possible).

northwest _

nw

Tries to move northwest (if possible).

up _

u

Tries to move up (if possible).

down _

d

Tries to move down (if possible).

enter _

in

Tries to enter (if possible).

exit _

leave

Tries to exit (if possible).

exits _

Lists the current exits in the current room.

4. Adventuron Classroom Editor

Information useful for when editing in Adventuron Classroom Editor.

4.1. Hotkeys

The Adventuron editor has a number of shortcut keys that help. On a Mac, you may need to use the Command Key instead of Control.

Action / Button Description

Click Top Bar of Editor

(When Red) Go to line of error.
(When Blue) Show Quick Nav Bar.

Click Adventuron Classroom ∨

Dropdown menu to jump to different code blocks.

CTRL + SPACE

Contextual menu for inserting code templates. Use arrow keys to select different options.

Control + F

Search for text in the document.

Control + C

Copy the selected text (to the clipboard).

Control + X

Cut the selected text (to the clipboard)

Control + V

Paste the selected text (from the clipboard)

Home

Moves the cursor to the beginning of the current line (but after the leading spaces).

End

Moves the cursor to the end of the current line.

Control + Home

Scrolls to the top of the document.

Control + End

Scrolls to the bottom of the document.

Control + L

Displays dialogue box to go to a specified line number.

Control + Z

Undo the last edit

Control + Y

Redo the last undo

Control + A

Select All Text

Control + S

Save All Text (to the current document buffer), and execute your game in the right hand panel.

TAB (selected text)

Will indent a line or selected lines.

SHIFT + TAB (selected text)

Will un-indent a line or selected lines.

Control + / (selected text)

Toggle between commenting or uncommenting a line or selected lines.

4.2. Search

CONTROL + F brings up a search bar at the top-right of the editor. Press ENTER to cycle through found entries of your search term.

INFO: (Advanced users only) Regular expression searches are also supported. Click the ".*" icon to switch on regular expression search mode.

Button Description

+

Selecting the "plus" icon will open up the find and replace option.

.*

The ".*" icon toggles the search to use regular expressions.

A

The "A" icon toggles case sensitive searching.

\b

The "\b" icon toggles whole word searching.

S

The "S" icon toggles searching restricted to text selected.

s

The small "x" icon closes the search panel.

find

4.3. Adventuron Syntax

Adventuron uses the Rion object notation, and Rion allows for blocks to be defined in multiple ways, as shown the examples below:

// Form 1

lamp : object {
   text = a dusty lamp
   at   = forest
   msg  = A very very dusty lamp
}

// Form 2

lamp : object {
   text = "a dusty lamp"
   at   = "forest"
   msg  = "A very very dusty lamp"
}

// Form 3

lamp : object "a dusty lamp" at="forest" msg="A very very dusty lamp." ;

// Form 4 (hybrid)

lamp : object "a dusty lamp" {
   at   = "forest"
   msg  = A very very dusty lamp
}

4.4. Reserved IDs

Objects IDs and location IDs are not permitted to be one the following:

all

ambiguous

back

blocked

cannot_move

current_location

direct

error

ether

forward

indirect

inventory

inventory_notworn

inventory_worn

it

not_created

player

player_zone

root

s1

s2

story

surface

unknown

5. Debugging

5.1. Debugging With Code

The on_debug {} block, if provided, will be executed INSTEAD OF the on_startup {} event handler, and this can be used to set up the game state prior to Adventuron describing the location for the first time.

Authors can use the on_debug {} event handler to move the player to a location, set variable values, move objects around, give objects to players, prior to first redescribe.

Authors can "comment-in" and "comment-out" the on_debug {} event handler by selecting the entire block then pressing CONTROL and / together. This will toggle comment markers on all the lines on and off.

start_at  = study

on_debug {
   // Setup the game ready for the test you want to perform.
   // After this block of code is executed, Adventuron
   // Will redescribe the location that the player is in.
   : goto     "library" ;
   : pocket   "book" ;
   : set_true "has_talked_colonel" ;
}

locations {
   study   : location "You are in the study." ;
   library : location "You are in the library." ;
}

connections {
   from, direction, to = [
      study, east, library,
   ]
}

objects {
   book : object "an old book" ;
}

booleans {
   has_talked_colonel : boolean "false" ;
}

5.2. Debugging In Game

The version of Adventuron that runs in the editor has a number of built-in debugging functions that can be used at the command line (the non-editor version of adventuron has these features disabled).

Note that references to objects are by their ID. It is not the noun or aliases corresponding to the object.

// Will list all the variables you have declared in the game as well as their current values
								
showvars


// Moves player to the specified location but does not redescribe automatically. 
//   e.g. goto library

goto <<location_id>>

// Brings the object or scenery corresponding to the object id
// into the same room as the player.
//   e.g. summon shiny_ant_1

summon <<object_id>>

// Sets a variable to a particular value. 
//   e.g. *is_noisy = true

*variable_id = variable_value

5.3. Transcripts

A transcript is a way to see what players are doing with your game for the purpose of improving your design, or locating bugs.

To enable recording a game transcript, ask your beta testers to type "TSTART":

> TSTART

To disable recording a game transcript, ask your beta testers to type "TSTOP":

> TSTOP

Stopping recording of the game will save a .txt file (in your default browser downloads folder) containing the transcript.

If you close the tab containing the game that is being recorded, adventuron will save the transcript when you reload the game (browser permissions make it impossible to save when the tab is closing directly).

If you reload the game or repoen the tab, transcript recording will have to be restarted, and will only start from the point where TSTART is entered.

2.17.4. Testing Mobile On Desktop

Sometimes you may wish to execute different logic on mobile versus desktop. The is_mobile() boolean function can be used for this purpose.

To test this logic, you can force Adventuron to override the detected device type ( is_mobile() will follow the override ).

start_at = my_location

locations {
   my_location : location "By default, mobile devices will run in mobile mode, and desktop devices will run in desktop mode.\nYou can type <DEVICETYPE DESKTOP<12>> or <DEVICETYPE MOBILE<12>> to force adventuron to run in mobile or desktop mode.\nType <DEVICETYPE<12>> to set the devicetype to the default device type." ;
}

on_tick {
   : if (is_mobile()) {
      : print "<on_tick() : We are running on mobile.<11>>" ;
   }
   : else {
      : print "<on_tick() : We are running on desktop.<11>>" ;
   }
}

6. Troubleshooting

Adventuron Hangs on loading (Lots of messages apologising for the wait)

The first port of call is to hold CONTROL and press F5 in your browser window.

It is possible that your browser is caching a partially loaded version of the page and this will reload everything (refreshing the cache).

Control + Space doesn’t work in Opera

Opera browser decided that it wants CONTROL + SPACE for itself, and mapped this to its search functionality.

This means that code completion is not able to be used in Opera BY DEFAULT.

There is a remedy however.

Go to the Opera Menu (in the top left of the browser), then select SETTINGS from the menu.

Then go to the bottom of the setting spage, and click ADVANCED, then in that very long page of setttings, locate the setting:

CONFIGURE SHORTCUTS

In this page, locate an item that says "Ctrl + Space" and hover over it and click the X icon. This will allow Adventuron to use CONTROL + SPACE for itself.

Recursion Error

If you see an error message like the following, it (likely) means that you have accidentally triggered an infinite redescribe loop.

DEBUGEXCEPTION : Redescribe recursion detected in T2, T3 or T4 blocks.

or

DEBUGEXCEPTION : Class$S300: (RangeError) : Maximum call stack size exceeded

When executing the code shown below, start the game, and move west. An error will be displayed in the gameplay window.

start_at = village

locations {
   village  : location "You are in the village" ;
   forest_1 : location "You are in a forest" ;
   forest_2 : location "You are in a spooky forest" ;
}
connections {
   from, direction, to = [
      village, east, forest_1,
      forest_1, east, forest_2,
   ]
}
on_describe {
   : if (is_at "forest_1") {
      : redescribe;
   }
}

The cause of the error is this block of code.

on_describe {
   : if (is_at "forest_1") {
      : redescribe;
   }
}

Adventuron does the following logic upon describing a location (simplified to illustrate the point):

  1. Hide (or disable) the prompt.

  2. Describe the location

  3. Run the on_describe {} block

  4. Run the on_tick {} block.

  5. Update some system settings.

  6. Show the prompt again ready for next input.

During step 3 (on_describe{})and step 4 (on_tick{}), Adventuron allows the author to execute the : redescribe command, which will go back to step 2, and move forward again. This is sometimes necessary, for example, a cut scene may occur, and some story delivered, then at the end of it, we wish to redisplay the location afresh.

The recursion error happens if the redescribe is not sufficiently "guarded". That is, every time it redescribes, it re-runs the redescribe.

To stop this from happening, make sure that your redescribe is guarded, so that when you redescribe, it doesn’t just redescribe again.

e.g.

   : if (is_at "forest_1" && is_just_entered()) {
      : redescribe;
   }

Why isn’t my sound playing?

Adventuron uses a permissions system that requires active consent for playing sounds and music. Graphics consent is assumed true but can be revoked with GRAPHICS OFF.

If your sound isn’t playing when in development, check the following diagnostics

https://adventuron.io/documentation/cookbook.html#CheckingPermissions
on_command {
   : match "permissions _" {
      : print {( "sysvar_features_sound : "   + sysvar_bool "sysvar_features_sound" )}
      : print {( "sysvar_features_music : "   + sysvar_bool "sysvar_features_music" )}
      : print {( "sysvar_features_blip : "    + sysvar_bool "sysvar_features_blip" )}
      : print {( "sysvar_has_asked_blip : "   + sysvar_bool "sysvar_has_asked_blip" )}
      : print {( "sysvar_has_asked_music : "  + sysvar_bool "sysvar_has_asked_music" )}
      : print {( "sysvar_has_asked_sound : "  + sysvar_bool "sysvar_has_asked_sound" )}
      : print {( "sysvar_blip_enabled : "     + sysvar_bool "sysvar_blip_enabled" )}
      : print {( "sysvar_sound_enabled : "    + sysvar_bool "sysvar_sound_enabled" )}
      : print {( "sysvar_music_enabled : "    + sysvar_bool "sysvar_music_enabled" )}
      : print {( "sysvar_sfx_enabled : "      + sysvar_bool "sysvar_sfx_enabled" )}
      : print {( "sysvar_ambient_enabled : "  + sysvar_bool "sysvar_ambient_enabled" )}
      : print {( "sysvar_graphics_enabled : " + sysvar_bool "sysvar_graphics_enabled" )}
   }
}

7. Licenses / Acknowledgements

Adventuron Classroom License

Adventuron & Adventuron Classroom is licensed for personal non-commercial use.

Adventuron Classroom License
Adventuron Classroom - Personal Non Commercial Use EULA

Copyright of Adventuron Software Limited, 2017-2020, all rights reserved.

Licensed for personal non-commercial use only.

Adventuron is intended to be a CREATIVE TOOL. Adventuron should NOT be used to recreate or resemble existing game titles WITHOUT EXPRESS PERMISSION of all copyright holders.

In no event will Adventuron Software Limited be liable for any loss or damage including without limitation, indirect or consequential loss or damage, or any loss or damage whatsoever arising from loss of data or profits arising out of, or in connection with, the use of this website.

All adventure data is stored locally, and not transmitted nor stored on the server. Some functions may communicate with the server but no personal information will be transmitted.

Adventuron's engine / generated HTML gamefiles are not licensed for commercial use.

By clicking on the "I Agree" button below, you agree to NOT infringe upon any copyright. In addition, by clicking the "I Agree" button you also agree to the use of cookies and web storage for storing data pertinent to the application purpose.

"Adventuron Classroom" Tutorial Documentation

This tutorial is written by Chris Ainsley, and copyright of Adventuron Software Limited.

This tutorial may not be redistributed on any other domain than adventuron.io.

The Cave of Magic

The Cave of Magic was designed and written by Chris Ainsley is placed into the public domain.

The graphics in the DX version of the game were created and are copyright of Ricardo Oyón. Ricardo has licensed the graphics for use with Adventuron’s tooling but the graphics should not be re-used anywhere else without express permission.

Excalibur: Sword of Kings

The original ZX Spectrum version of Excalibur was written in 1987 by Ian Smith and Shaun McClure.

The version used in this course written by Chris Ainsley based on the behaviour of the original.

The source code used in this tutorial was written by Chris Ainsley and is copyright of Adventuron Software Limited.

Excalibur: Sword of Kings (all versions) is Copyright of Adventuron Software Limited, All Rights Reserved.

Adventuron Engine License

Adventuron’s game engine is licensed for non-commercial use only.

Created text adventures can be exported as HTML for non-commercial use.

Games exported to 8-bit text adventure engines are subject to those licenses.

Full license text here:

/* ADVENTURON Engine 1.0.0 - NON COMMERCIAL USE EULA                               */
/* Copyright (C) 2017 - 2020 Adventuron Software Limited                           */
/*                                                                                 */
/* ADVENTURON Engine is permitted to be redistributed for personal non-commercial  */
/* use except when game content contains one or more of the following items:       */
/*  (1) Hate Speech (such as racism, sexism, ableism, homophobia, religious
        hatred, etc).                                                              */
/*  (2) Content for which you do not own the intellectual property rights.         */
/*  (3) Adult content (including innuendo), express or implied, that is not        */
/*      clearly marked/warned via the title screen as such.                        */
/*  (4) Pornograpic Content.                                                       */
/*  (5) Illegal content.                                                           */
/*  (6) Grossly offensive material, express or implied.                            */
/*  (7) Content involving the exploitation of minors, express or implied.          */
/*  (8) Libellous speech or content, express or implied.                           */
/*  (9) Harassment, threats or intimidation, express or implied.                   */
/*                                                                                 */
/* The software is provided "as is", without warranty of any kind, express or      */
/* implied, including but not limited to the warranties of merchantability,        */
/* fitness for a particular purpose and noninfringement. In no event shall         */
/* the authors or copyright holders be liable for any claim, damages or            */
/* other liability, whether in an action of contract, tort or otherwise,           */
/* arising from, out of or in connection with the software or the use or           */
/* other dealings in the software.                                                 */

Adventuron’s brand name and image is trademark of Adventuron Software Limited.

The platform (editor / tutorial / etc), is strictly not for redistribution.

Libraries Used By Adventuron Engine (1.0.0)

Supporting Library Licenses:

/* ------------------------------------------------------------------------------- */
/* OPEN SOURCE LICENSES                                                            */
/* ------------------------------------------------------------------------------- */
/* GWT - https://github.com/gwtproject                                             */
/*                                                                                 */
/* Apache Version 2.0 License                                                      */
/* http://www.gwtproject.org/terms.html                                            */

/* Elemental 2 - https://github.com/google/elemental2                              */
/* Apache Version 2.0 License                                                      */
/* http://www.gwtproject.org/terms.html                                            */
/* Blazing Chain LZW Library :                                                     */

/* https://github.com/tommyettinger/BlazingChain                                   */

/* MIT License                                                                     */

/* Copyright (c) 2016 Tommy Ettinger                                               */

/* Permission is hereby granted, free of charge, to any person obtaining a copy    */
/* of this software and associated documentation files (the "Software"), to deal   */
/* in the Software without restriction, including without limitation the rights    */
/* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell       */
/* copies of the Software, and to permit persons to whom the Software is           */
/* furnished to do so, subject to the following conditions:                        */

/* The above copyright notice and this permission notice shall be included in all  */
/* copies or substantial portions of the Software.                                 */

/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR      */
/* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,        */
/* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE     */
/* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER          */
/* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,   */
/* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE   */
/* SOFWARE.                                                                        */

/*! howler.js v2.0.14 | (c) 2013-2018, James Simpson of GoldFire Studios | MIT License | howlerjs.com */

/* ------------------------------------------------------------------------------- */

/* JSZip - A Javascript class for generating and reading zip files                 */
/* <http://stuartk.com/jszip>                                                      */

/* (c) 2009-2014 Stuart Knightley <stuart [at] stuartk.com>                        */
/* Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown. */

/* JSZip uses the library zlib.js released under the following license :           */
/* zlib.js 2012 - imaya [ https://github.com/imaya/zlib.js ] The MIT License       */

/* ------------------------------------------------------------------------------- */

/* Beepbox by John Nesky*/

/*
Copyright (C) 2018 John Nesky

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/

/* ------------------------------------------------------------------------------- */

/* GWT Promptly - https://github.com/ainslec/gwt-promptly                          */
/*
 * Copyright 2017, Chris Ainsley
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

Libraries Used by Adventuron Platform - Including Adventuron and Adventuron Classroom (1.0.0)

The platform uses the same open source licenses as the engine, some privately licensed non-open-source libraries, and the following open source libraries:

/* DOMINO UI - https://github.com/DominoKit/domino-ui */

/*
 * Copyright 2019, Domino UI Team
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/* Ace Editor - https://github.com/ajaxorg/ace */
/* Copyright (c) 2010, Ajax.org B.V. */
/* All rights reserved.
/*
/* Redistribution and use in source and binary forms, with or without */
/* modification, are permitted provided that the following conditions are met: */
/*     * Redistributions of source code must retain the above copyright */
/*       notice, this list of conditions and the following disclaimer. */
/*     * Redistributions in binary form must reproduce the above copyright */
/*       notice, this list of conditions and the following disclaimer in the */
/*       documentation and/or other materials provided with the distribution. */
/*     * Neither the name of Ajax.org B.V. nor the */
/*       names of its contributors may be used to endorse or promote products */
/*       derived from this software without specific prior written permission. */

/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND */
/* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED */
/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE */
/* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY */
/* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES */
/* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; */
/* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND */
/* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT */
/* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */
/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */


/* ACE GWT https://github.com/daveho/AceGWT */
/* MIT License - Copyright (c) 2011 - 2019 David Hovemeyer & AceGWT Contributers */

/* asciidoctor.js - https://github.com/asciidoctor/asciidoctor.js */

/* The MIT License
 *
 * Copyright (C) 2014-2019 Dan Allen, Guillaume Grossetie, Anthonny Quérouil and the Asciidoctor Project
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
 /* akjava / GWTJSZip by Aki Miyazaki                                               */
  /* Apache Version 2.0 License                                                      */
  /* https://github.com/akjava/GWTJSZip/blob/master/LICENSE                          */
  /* FileSaver.js - https://github.com/eligrey/FileSaver.js */
  /* Copyright © 2016 Eli Grey. */
  /* MIT License */


 /* Mali Font - https://github.com/cadsondemak/Mali */

 /* Copyright 2018 The Mali Project Authors
  * (https://github.com/cadsondemak/Mali)
  *
  * This Font Software is licensed under the SIL Open Font License, Version 1.1.
  * This license is copied below, and is also available with a FAQ at:
  * http://scripts.sil.org/OFL
  */

Acknowledgements

  • Thank you to Mark Harrison for the excellent art present in the embedded version of this document, in addition to his superb work in the Retro Gamer full page ad (issue 193). Check out Mark’s Facebook group here.

  • Thank you to the creators of the AsciiDoc documentation format, and the AsciiDoctor team, for the amazing AsciiDoctor JS project.

  • Thank you to the GWT project, and especially to Colin Alworth for his support and passion behind the project.

  • Thank you to Nick Manarin for the really rather good ScreenToGif utility, which was used in the production of this documentation.

  • Thank you to the Domino UI team, for their excellent UI framework (used in the documentation).

  • Thank you to Andy Green, Shaun McClure, Steve Horsley, Gareth Pitchford, Tim Gilberts, Richard Pettigrew, Mark Hardisty, and others for their encouragement and support.

  • Thank you to Shaun McClure and Ian Smith for writing Excalibur - which I believe was an ideal adventure game with which to teach the concepts of building a basic adventure.

  • Thank you to Alternative Software Limited for selling the rights to Excalibur, and to Ian & Shaun for their blessing of the sale.

  • Thank you to the Font Awesome team for their icon set, and to the Mali Font creators for an excellent legible yet fun font.

  • Thank you to John Wilson, Gareth Pitchford, and Richard Pettigrew for being early adopters of the system.

  • Thank you to Andrés Samudio for making the DAAD system, and the DAAD system font public domain, and for his enthusiastic support of this project.

  • Thank you to Paul Van Der Laan, for making the Clairsys font, and for making the Clairsys 10 variant, both available under the SIL font license.

  • Thank you to Fergus McNeill for allowing commercial and non-commercial use of the Delta 4 font (adapted as the Delta 10 font).

  • Thank you to Ricardo Oyón for donating the wonderful graphics used in The Cave of Magic DX (tutorial A), plus for his supplemental art (including the volcano landscape used at the top of the user guide).

Contact

Adventuron was developed by Chris Ainsley, and is copyright of Adventuron Software Limited.

Full credits are available here.