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.
1.1. Adventuron Links
Adventuron Editor
-
adventuron.io/beta - Beta version. This document is based on the beta build of Adventuron.
-
adventuron.io/classroom - Online editor to create your game.
Main Documentation
-
Adventuron Cookbook - a collection of code snippets
Other Documentation
-
Tutorial A "The Cave of Magic" - 60 minute written guide
-
Tutorial B "Excalibur" - 180 minute written guide.
-
Adding graphics to your Adventuron Game - youtube vid.
-
Using a custom font installing a custom font for Adventuron
-
Experimental Features - how to implement Collections (lists)
-
How to share your game for others to play, by uploading to itch.io.
Forums
-
The Interactive Fiction Community Forum is frequently monitored. Use the Adventuron tag.
-
If you want instant support, please use the Telegram Group (for users over the age of 18).
-
Cavejam forum - The first game jam. Aug 31-Sep 22, 2019
-
Halloween Jam forum - Oct 4-Nov 1, 2019
-
Treasure Hunt Jam forum - Feb 5-Mar 10, 2020
-
Next Adventure Jam forum - Jun 5-Jul 5, 2020
Adventuron Issue Tracker - FRs and bugs tracked on github
Games
-
List of games made with Adventuron (non exhaustive).
Articles and Media
-
Text Adventure Design in 2020 by Chris Ainsley.
-
Look, Search, & Examine by Chris Ainsley.
-
The Text Adventure Literacy Project by Chris Ainsley.
-
Go foraging in lovely free text adventure Mushroom Hunt (PCGamer).
-
Interview With Chris Ainsley, Creator of Adventuron Classroom
-
The Classic Adventurer Magazine by Mark Hardisty (Adventuron interview in issue 5).
-
(Audio) Adventure Games Podcast (Adventuron Interview).
-
(Audio) Retro Hour Podcast Episode 238 (Text Adventure History / Adventuron).
Pixel Art Editors
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 :
-
http://multipaint.kameli.net (useful for ZX Spectrum, C64, retro compliant images).
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"
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. |
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.
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. |
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.
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.
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. |
: 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. |
: 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. |
: 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. |
: 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). |
: 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:
|
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".
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. |
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. |
No |
No |
Dynamic Layouts
You can also set up layouts dynamically if you don't wish to switch through different themes.
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.
|
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. |

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):
-
Hide (or disable) the prompt.
-
Describe the location
-
Run the on_describe {} block
-
Run the on_tick {} block.
-
Update some system settings.
-
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#CheckingPermissionson_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 - 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.
-
Email: info@adventuron.io
-
Twitter - @LearnAdventuron.