This is the core rules engine that defines a lot of things. It has many sections, each with their own dictionary of values, and each section may have separate documentation.

Entities

This game supports these types of player (or NPC) characters and this is what they look like. The default is usually just "character" but think also "ground_vehicle", "air_vehicle", "voidship", etc. If two entities can't use the same character sheet, they should be different sheets.

{ "entities":{ "character":{ "primer":{ }, "attributes":{ }, "collections":{ } }, "entitytype":{ "primer":{ }, "attributes":{ }, "collections":{ } } } }

Collections

This defines complex objects that are used by the game, such as a "spell" or "weapon". These are things that characters may have 0 or more of, and the thing they have can be pulled from a list.

Collection Identifiers (collectionId) is important. They must be unique and simple. When a module or catalog is imported, it may include additional entries for the collection. Sometimes you may have to say "use these items as this type of collection" which will force the Game engine to see the data as that type of object.

Collections define a bunch of things, they are the meat of content in many ways. They are used in many ways. Collections are defined at the engine level (so that it knows what to do with them), and later they are also referenced in the Character definition as well.

{ "collections":{ "items":{ "id":"items", "type":"complex_object", "label":"items", "static":false, "fields":{ "bonus":{ "type":"meta", "label":"bonus", "value":"number", "default":1 }, "label":{ "name":"label", "type":"meta", "label":"name", "value":"string" }, "description":{ "name":"description", "type":"meta", "label":"description", "value":"string" } }, "additem":true, "catalog":true, "default":true, "generic":{ "bonus":0, "label":"Generic Item", "source":"Custom", "description":"", "nonsearchable":true }, "personal":true, "targeted":false, "testable":false } } }

Collection Definitions

Collection definitions have many possible keys. They describe both how a thing, such a a Skill or Weapon, looks and behaves inside the Game, as well as how its Catalog windows and Flyouts can behave. Some Games may say "this collection contains only these items, and cannot be modified" (like with a skill tree).

Not all collections have all traits, and some traits are exclusionary to each other. We shall discuss them in sections.

Basic Attributes

The basic attributes of a collection definition are:

  • id: String, the same ID
  • label: String, this is run through Babel for translation/localization
  • itemname: String, run through Babel, this is the single unit name of the item ("skill" vs. "skills").
  • type: "complex_object" - you only ever want this, but it's important, there's vestigial stuff about arrays
  • default: Boolean - Is this granted to the character by default? Not sure this works or is needed anymore
  • static: Boolean - If true, this Catalog does not have child elements and is a definition only (like "armor points")
  • testable: Boolean - Can you test this item?
  • targetable: Boolean - Can you target this item? [UNIMPLEMENTED]
  • defaultvalue: Variable; depends on the data type
  • default_action: Testname (if present, this is the action for the item when it is executed

Value Attributes

'When I ask for the value of this item, what are you sending me?' This can have several meanings depending on the Game. For a Skill, we could be returning the total value of it, or the ranks, or the dice to be rolled - it depends.

  • value: Enumeration, described below
  • calc: A calculation, and only used if value = "calculation".
  • ranked: Boolean, only present if item is ranked (ranked only)
  • ranks: A dictionary of values that show how the value can change based on the rank (ranked only)

The values that can given to the value field are:

  • raw: Just the raw value of the collection item. Do no processing or lookup (reads "value" field).
  • calculation: Take the value of "calc" and run it against this item
  • rank_calculation: With ranks, return the value of the rank's calc
  • $fieldname: Return the value of the field in the collection item (similar to raw)

Ranked Items

For ranked items, we have an addition sub-dictionary that can describe different effects at different ranks. This field, ranks, is only used if both ranked is true the value of value is "rank_calculation".

{ "ranks":[ { "rank":1, "label":"basic", "calc":"floor(self[attribute] * .5)" }, { "rank":2, "label":"trained", "calc":"self[attribute] +0" }, { "rank":3, "label":"+10", "calc":"self[attribute] +10" }, { "rank":4, "label":"+20", "calc":"self[attribute] +20" } ] }

Catalog and Gamespace Behaviors

  • additem: Boolean (if false, the catalog won't allow you to add items from it)
  • canfavorite: Boolean (Can these items be favorited?)
  • singular: Boolean (If true, the same catalog items cannot be added twice. This is for things like 'skills'.)

Catalog Values

The catalog field describes what to show in this field when viewing the catalog.

  • catalog: Enumeration, see below

Values for the catalog field can be:

  • value: Give me the value of the field, parsed through the language dictionaries
  • raw: Give me the value of the field, no parsing
  • lookup_value: For enumerations, give me the value from the options

Fields

The collection definition's fields dictionary describes the Collection Item and what it looks like. Some fields (such as description) exist whether you define them or not.

Each field in an item can have the following attributes:

  • name: String, the name of the field, machine readable
  • label: String, the label of the field, run through the dictionary lookup (human readable)
  • type: Enumeration, values: string, meta, int
  • default: Variable, what to use if no value
  • catalog: Enumeration
  • value: Enumeration
  • values: Dictionary, only present if value is "enumeration"
{ "fields":{ "label":{ "name":"label", "type":"string", "label":"name" }, "attribute":{ "name":"attribute", "label":"attribute", "type":"meta", "catalog":"lookup_value", "value":"enumeration", "values":{ "weapons_skill":"weapons_skill", "ballistic_skill":"ballistic_skill", "strength":"strength", "toughness":"toughness", "agility":"agility", "intelligence":"intelligence", "perception":"perception", "willpower":"willpower", "fellowship":"fellowship" } }, "ranks":{ "name":"ranks", "label":"ranks", "type":"int" }, "bonus":{ "name":"bonus", "label":"bonus", "type":"int", "default":0 }, "type":{ "name":"type", "label":"type", "catalog":"value", "type":"enumeration", "options":[ { "label":"basic", "value":"basic" }, { "label":"advanced", "value":"advanced" } ] } } }

Tests

These are really atomic parts of interactivity. Before you think "why not balkanize these," a lot of these actions are system-dependent - for instance, not every game has "initiative".

{ "tests":{ "grant_xp":{ "special":"grant", "resultinto":"total_xp" }, "roll_initiative":{ "die":"d10", "modifier":"+ attribute[agility_bonus]", "resultinto":"initiative" }, "d100_less_or_equal_to_value":{ "die":"d100", "successcriteria":"less_or_equal" }, "melee_attack":{ "die":"d100", "successcriteria":"less_or_equal", "stat":"weapons_skill" } } }

Actions

Actions are passed actors and targets by context. These then execute the test, or have it executed on them, etc. They are not defined here but are passed as arguments.

- You cannot have both eachactor and eachtarget

  • targeted: Boolean (needs a target attribute)
  • isattack: Boolean (is an attack) [poorly implemented]
  • eachactor: Enumeration, see below
  • eachtarget: Enumeration, see below
  • test: Which test [see above] to execute inside this action
  • message: message_key (Use this message in the Table Log)
  • prefertoolmessage: Boolean (If there is a tool and the tool has a message, let it override)
  • special: Special_action_name (use a special action, see below)
  • metrics: Dictionary (additional metrics to include when displaying)

The values for eachactor and eachtarget can be:

  • map_entity: "Living" tokens on the map, both player and storyteller
  • map_corpse: "Dead" tokens on the map
  • map_player: Player-controlled tokens on the map
  • player: Every player-controlled entity
  • map_npc: Every storyteller-controlled entity on the map [UNIMPLEMENTED]

Special Actions

These are special actions, and handled by the system.

"special" : "view_character_sheet"
  • view_character_sheet: Pop open the feather
  • edit_permissions: Open the edit perms dialog for an entity
  • clear_map_tokens: Clear all tokens from the current map
  • start_combat: Start the combat sequence
  • end_combat: End the combat sequence
  • take_control: Take operational control of an entity
  • remove_from_map: Remove an entity token from the map
{ "actions":{ "roll_initiative_for_map":{ "eachactor":"map_entity", "test":"roll_initiative" }, "roll_initiative":{ "test":"roll_initiative" }, "grant_xp_to_party":{ "eachtarget":"player", "test":"grant_xp" }, "grant_xp":{ "test":"grant_xp" }, "skill_test":{ "test":"d100_less_or_equal_to_value", "message":"skill_test_generic", "metrics":{ "successes":"$[difference] / 10", "label":"successes" } }, "melee_attack":{ "test":"melee_attack", "prefertoolmessage":true, "message":"actor_attacked_target_with_weapon-melee_generic", "targeted":true, "isattack":true, "metrics":{ "successes":"$[difference] / 10", "label":"successes" } } } }