Skip to content

Instantly share code, notes, and snippets.

@elyukai
Last active May 12, 2021 10:23
Show Gist options
  • Save elyukai/9152a4985c2c1384840eeadaf451d848 to your computer and use it in GitHub Desktop.
Save elyukai/9152a4985c2c1384840eeadaf451d848 to your computer and use it in GitHub Desktop.
Character JSON Schema Proposal for Optolith Version 2.x.x (WIP)
{
"$schema": "http://json-schema.org/draft-07/schema",
"title": "Character",
"description": "An exported character object from Optolith. Properties that are intended for external use only and thus are ignored when imported by Optolith are marked as read-only.",
"type": "object",
"properties": {
"version": {
"title": "Optolith Version",
"description": "A valid semantic version (https://semver.org), representing the Optolith version this character was created with.",
"type": "string",
"pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$",
"$comment": "The pattern is the recommended regex for semantic versioning: https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string."
},
"name": {
"title": "Name",
"description": "The character's name.",
"type": "string",
"minLength": 1
},
"date_created": {
"title": "Date of Creation",
"description": "Date of character creation, in ISO8601 format.",
"type": "string",
"format": "date-time"
},
"date_last_modified": {
"title": "Date of Last Modification",
"description": "Date of character last modified, in ISO8601 format.",
"type": "string",
"format": "date-time"
},
"adventure_points": {
"title": "Adventure Points",
"description": "An object storing all kinds of basic and calculated adventure points.",
"type": "object",
"properties": {
"total": {
"description": "Total adventure points.",
"type": "integer",
"minimum": 1
},
"available": {
"description": "Adventure points available.",
"type": "integer",
"minimum": 0,
"readOnly": true
},
"spent": {
"description": "Adventure points spent.",
"type": "integer",
"minimum": 0,
"readOnly": true
},
"spent_on_advantages": {
"description": "Adventure points spent on advantages.",
"type": "integer",
"minimum": 0,
"readOnly": true
},
"spent_on_magical_advantages": {
"description": "Adventure points spent on magical advantages.",
"type": "integer",
"minimum": 0,
"readOnly": true
},
"spent_on_blessed_advantages": {
"description": "Adventure points spent on blessed advantages.",
"type": "integer",
"minimum": 0,
"readOnly": true
},
"spent_on_disadvantages": {
"description": "Adventure points spent on disadvantages.",
"type": "integer",
"minimum": 0,
"readOnly": true
},
"spent_on_magical_disadvantages": {
"description": "Adventure points spent on magical disadvantages.",
"type": "integer",
"minimum": 0,
"readOnly": true
},
"spent_on_blessed_disadvantages": {
"description": "Adventure points spent on blessed disadvantages.",
"type": "integer",
"minimum": 0,
"readOnly": true
},
"spent_on_race": {
"description": "Adventure points spent on race.",
"type": "integer",
"minimum": 0,
"readOnly": true
},
"spent_on_attributes": {
"description": "Adventure points spent on attributes.",
"type": "integer",
"minimum": 0,
"readOnly": true
},
"spent_on_skills": {
"description": "Adventure points spent on skills.",
"type": "integer",
"minimum": 0,
"readOnly": true
},
"spent_on_combat_techniques": {
"description": "Adventure points spent on combat techniques.",
"type": "integer",
"minimum": 0,
"readOnly": true
},
"spent_on_spells": {
"description": "Adventure points spent on spells, rituals and its enhancements.",
"type": "integer",
"minimum": 0,
"readOnly": true
},
"spent_on_cantrips": {
"description": "Adventure points spent on cantrips.",
"type": "integer",
"minimum": 0,
"readOnly": true
},
"spent_on_magical_actions": {
"description": "Adventure points spent on all kinds of magical actions.",
"type": "integer",
"minimum": 0,
"readOnly": true
},
"spent_on_liturgical_chants": {
"description": "Adventure points spent on liturgical chant, ceremonies and its enhancements.",
"type": "integer",
"minimum": 0,
"readOnly": true
},
"spent_on_blessings": {
"description": "Adventure points spent on blessings.",
"type": "integer",
"minimum": 0,
"readOnly": true
},
"spent_on_special_abilities": {
"description": "Adventure points spent on all kinds of special abilities.",
"type": "integer",
"minimum": 0,
"readOnly": true
},
"spent_on_energies": {
"description": "Adventure points spent on adding and buying back energy points.",
"type": "integer",
"minimum": 0,
"readOnly": true
}
},
"required": [
"total",
"available",
"spent",
"spent_on_advantages",
"spent_on_magical_advantages",
"spent_on_blessed_advantages",
"spent_on_disadvantages",
"spent_on_magical_disadvantages",
"spent_on_blessed_disadvantages",
"spent_on_race",
"spent_on_attributes",
"spent_on_skills",
"spent_on_combat_techniques",
"spent_on_spells",
"spent_on_cantrips",
"spent_on_magical_actions",
"spent_on_liturgical_chants",
"spent_on_blessings",
"spent_on_special_abilities",
"spent_on_energies"
],
"additionalProperties": false
},
"experience_level": {
"title": "Experience Level Settings",
"description": "An object storing the identifiers of the experience level the character started at and the current experience level, derived from total adventure points.",
"type": "object",
"properties": {
"start_id": {
"description": "The start experience level identifier.",
"type": "integer",
"minimum": 1,
"maximum": 7
},
"current_id": {
"description": "The current experience level identifier.",
"type": "integer",
"minimum": 1,
"maximum": 7,
"readOnly": true
}
},
"required": ["start_id", "current_id"],
"additionalProperties": false
},
"is_character_creation_finished": {
"title": "Character Creation Finished",
"description": "Describes whether the character creation is finished.",
"type": "boolean"
},
"race": {
"title": "Race Settings",
"description": "An object storing the identifiers of the race and its optional race variant.",
"type": "object",
"properties": {
"id": {
"description": "The base race identifier.",
"type": "integer",
"minimum": 1
},
"variant_id": {
"description": "The race variant identifier.",
"type": "integer",
"minimum": 1
},
"selected_attribute_adjustment_id": {
"description": "The identifier of the attribute adjustment that has been selected from the race.",
"type": "integer",
"minimum": 1,
"maximum": 8
}
},
"required": ["id", "selected_attribute_adjustment_id"],
"additionalProperties": false
},
"culture": {
"title": "Culture Settings",
"description": "An object storing the identifier of the culture and if the cultural package has been applied.",
"type": "object",
"properties": {
"id": {
"description": "The culture identifier.",
"type": "integer",
"minimum": 1
},
"is_cultural_package_applied": {
"description": "Describes whether the cultural package has been applied when creating the character.",
"type": "boolean"
}
},
"required": ["id", "is_cultural_package_applied"],
"additionalProperties": false
},
"profession": {
"title": "Profession Settings",
"description": "An object storing the identifiers of the profession, its instance and its optional race variant.",
"type": "object",
"properties": {
"id": {
"description": "The base profession identifier.",
"type": "integer",
"minimum": 1
},
"instance_id": {
"description": "The profession instance identifier. Profession instances are versions of the same profession but slightly different values, such as in extension rule books existing professions might get an additional style special ability.",
"type": "integer",
"minimum": 1
},
"variant_id": {
"description": "The profession variant identifier.",
"type": "integer",
"minimum": 1
},
"custom_name": {
"description": "A custom name for the profession, if provided.",
"type": "string",
"minLength": 1
}
},
"required": ["id", "instance_id"],
"additionalProperties": false
},
"curriculum": {
"title": "Curriculum Settings",
"description": "An object storing the identifiers of the profession, its instance and its optional race variant.",
"type": "object",
"properties": {
"educational_institution_id": {
"description": "The educational institution's curriculum identifier.",
"type": "integer",
"minimum": 1
},
"lesson_package_id": {
"description": "The lesson package identifier.",
"type": "integer",
"minimum": 1,
"maximum": 2
}
},
"required": ["educational_institution_id"],
"additionalProperties": false
},
"rules": {
"title": "Rules Settings",
"description": "The rules settings for the character.",
"type": "object",
"properties": {
"include_all_publications": {
"description": "Whether the character makes use of all publications except for publications with adult content, which have to be specified explicitly using \"include_publications\".",
"type": "boolean"
},
"include_publications": {
"description": "Explicitly used publications. If \"include_all_publications\" is set to \"true\", only affects publications that are not covered by \"include_all_publications\".",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "The publication identifier.",
"type": "integer",
"minimum": 1
}
},
"required": ["id"],
"additionalProperties": false
}
},
"active_focus_rules": {
"description": "Active focus rules.",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "The focus rule identifier.",
"type": "integer",
"minimum": 1
}
},
"required": ["id"],
"additionalProperties": false
}
},
"active_optional_rules": {
"description": "Active optional rules.",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "The focus rule identifier.",
"type": "integer",
"minimum": 1
},
"options": {
"description": "An array of one or more options. The exact meaning of each option varies based on the optional rule.",
"type": "array",
"items": {
"type": "integer",
"minimum": 1
},
"minItems": 1
}
},
"required": ["id"],
"additionalProperties": false
}
}
},
"required": [
"include_all_publications",
"include_publications",
"active_focus_rules",
"active_optional_rules"
],
"additionalProperties": false
},
"personal_data": {
"title": "Personal Data",
"description": "Personal data such as hair color and place of birth.",
"type": "object",
"properties": {
"sex": {
"description": "The character's sex. It does not have to be binary, although it always must be specified how to handle it in the context of binary sex prerequisites. You can also provide a custom sex with a custom name.",
"oneOf": [
{
"description": "A binary sex option.",
"enum": ["Male", "Female"]
},
{
"description": "A non-binary sex option.",
"type": "object",
"properties": {
"type": {
"enum": ["BalThani", "Tsajana"]
},
"value": {
"type": "object",
"properties": {
"binary_handling": {
"description": "How the sex should be handled in the context of a binary sex prerequisite.",
"type": "object",
"properties": {
"as_male": {
"description": "Defines if the sex should be treated as male when checking prerequisites.",
"type": "boolean"
},
"as_female": {
"description": "Defines if the sex should be treated as female when checking prerequisites.",
"type": "boolean"
}
},
"required": ["as_male", "as_female"],
"additionalProperties": false
}
},
"required": ["binary_handling"],
"additionalProperties": false
}
},
"required": ["type", "value"],
"additionalProperties": false
},
{
"description": "A custom non-binary sex option.",
"type": "object",
"properties": {
"type": {
"const": "Custom"
},
"value": {
"type": "object",
"properties": {
"name": {
"description": "The custom sex name.",
"type": "string",
"minLength": 1
},
"binary_handling": {
"description": "How the sex should be handled in the context of a binary sex prerequisite.",
"type": "object",
"properties": {
"as_male": {
"description": "Defines if the sex should be treated as male when checking prerequisites.",
"type": "boolean"
},
"as_female": {
"description": "Defines if the sex should be treated as female when checking prerequisites.",
"type": "boolean"
}
},
"required": ["as_male", "as_female"],
"additionalProperties": false
}
},
"required": ["name", "binary_handling"],
"additionalProperties": false
}
},
"required": ["type", "value"],
"additionalProperties": false
}
]
},
"family": {
"description": "The family names and/or family members.",
"type": "string",
"minLength": 1
},
"place_of_birth": {
"description": "The place where the character was born.",
"type": "string",
"minLength": 1
},
"date_of_birth": {
"description": "The date when the character was born.",
"type": "string",
"minLength": 1
},
"age": {
"description": "The age of the character.",
"type": "string",
"minLength": 1
},
"hair_color": {
"description": "The hair color of the character.",
"oneOf": [
{
"description": "A predefined hair color.",
"type": "object",
"properties": {
"type": {
"const": "Predefined"
},
"id": {
"description": "The hair color identifier.",
"type": "integer",
"minimum": 1
}
},
"required": ["type", "id"],
"additionalProperties": false
},
{
"description": "A custom hair color.",
"type": "object",
"properties": {
"type": {
"const": "Custom"
},
"name": {
"description": "The custom hair color name.",
"type": "string",
"minLength": 1
}
},
"required": ["type", "name"],
"additionalProperties": false
}
]
},
"eye_color": {
"description": "The eye color of the character.",
"oneOf": [
{
"description": "A predefined eye color.",
"type": "object",
"properties": {
"type": {
"const": "Predefined"
},
"id": {
"description": "The eye color identifier.",
"type": "string",
"minLength": 1
}
},
"required": ["type", "id"],
"additionalProperties": false
},
{
"description": "A custom eye color.",
"type": "object",
"properties": {
"type": {
"const": "Custom"
},
"name": {
"description": "The custom eye color name.",
"type": "string",
"minLength": 1
}
},
"required": ["type", "name"],
"additionalProperties": false
}
]
},
"size": {
"description": "The size of the character.",
"type": "string",
"minLength": 1
},
"weight": {
"description": "The weight of the character.",
"type": "string",
"minLength": 1
},
"title": {
"description": "The character's title(s).",
"type": "string",
"minLength": 1
},
"social_status_id": {
"description": "The social status identifier.",
"type": "string",
"minimum": 1,
"maximum": 5
},
"characteristics": {
"description": "The character's title(s).",
"type": "string",
"minLength": 1
},
"other_info": {
"description": "Other information about the character.",
"type": "string",
"minLength": 1
}
},
"required": [
"sex"
],
"additionalProperties": false
},
"advantages": {
"title": "Advantages",
"$ref": "#/definitions/Activatables"
},
"disadvantages": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables"
},
"special_abilities": {
"title": "Special Abilities",
"description": "Lists of active special abilities, by group.",
"type": "object",
"properties": {
"advanced_combat_special_abilities": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"advanced_karma_special_abilities": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"advanced_magical_special_abilities": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"advanced_skill_special_abilities": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"ancestor_glyphs": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"arcane_orb_enchantments": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"attire_enchantments": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"blessed_traditions": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"bowl_enchantments": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"brawling_special_abilities": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"cauldron_enchantments": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"ceremonial_item_special_abilities": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"chronicle_enchantments": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"combat_special_abilities": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"combat_style_special_abilities": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"command_special_abilities": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"dagger_rituals": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"familiar_special_abilities": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"fate_point_sex_special_abilities": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"fate_point_special_abilities": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"fools_hat_enchantments": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"general_special_abilities": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"instrument_enchantments": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"karma_special_abilities": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"krallenkettenzauber": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"liturgical_style_special_abilities": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"lycantropic_gifts": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"magical_runes": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"magical_special_abilities": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"magical_traditions": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"magic_style_special_abilities": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"orb_enchantments": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"pact_gifts": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"protective_warding_circle_special_abilities": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"ring_enchantments": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"sermons": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"sex_special_abilities": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"sickle_rituals": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"sikaryan_drain_special_abilities": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"skill_style_special_abilities": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"spell_sword_enchantments": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"staff_enchantments": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"toy_enchantments": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"trinkhornzauber": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"vampiric_gifts": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"visions": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"wand_enchantments": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
},
"weapon_enchantments": {
"title": "Disadvantages",
"$ref": "#/definitions/Activatables",
"minItems": 1
}
},
"required": [],
"additionalProperties": false
},
"attributes": {
"title": "Attributes",
"description": "A list of attributes with values above 8. Attributes that are not listed here default to 8.",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "The attribute identifier.",
"type": "integer",
"minimum": 1
},
"value": {
"description": "The attribute's value.",
"type": "integer",
"minimum": 9
}
},
"required": ["id", "value"],
"additionalProperties": false
},
"maxItems": 8
},
"derived_characteristics": {
"title": "Derived Characteristics",
"description": "Computed, set and bought values for/of derived characteristics.",
"type": "object",
"properties": {
"life_points": {
"title": "Life Points",
"type": "object",
"properties": {
"base": {
"description": "The life points base value.",
"type": "integer",
"readOnly": true
},
"modifier": {
"description": "The life points modifier depending on relevant advantages, disadvantages and special abilities.",
"type": "integer",
"readOnly": true
},
"purchased": {
"description": "The number of life points purchased.",
"type": "integer",
"minimum": 0
},
"permanently_lost": {
"description": "The number of life points permanently lost.",
"type": "integer",
"minimum": 0
},
"maximum": {
"description": "The (final) life points maximum.",
"type": "integer",
"readOnly": true
}
},
"required": ["base", "modifier", "purchased", "permanently_lost", "maximum"],
"additionalProperties": false
},
"arcane_energy": {
"title": "Arcane Energy",
"description": "This property does not exist if the character does not have the active advantage Spellcaster and an active magical tradition special ability.",
"type": "object",
"properties": {
"base": {
"description": "The arcane energy base value.",
"type": "integer",
"readOnly": true
},
"modifier": {
"description": "The arcane energy modifier depending on relevant advantages, disadvantages and special abilities.",
"type": "integer",
"readOnly": true
},
"purchased": {
"description": "The number of arcane energy points purchased.",
"type": "integer",
"minimum": 0
},
"permanently_lost": {
"description": "The number of arcane energy points permanently lost.",
"type": "integer",
"minimum": 0
},
"permanently_lost_bought_back": {
"description": "The number of permanently lost arcane energy points that have been bought back.",
"type": "integer",
"minimum": 0
},
"maximum": {
"description": "The (final) arcane energy maximum.",
"type": "integer",
"readOnly": true
}
},
"required": ["base", "modifier", "purchased", "permanently_lost", "permanently_lost_bought_back", "maximum"],
"additionalProperties": false
},
"karma_points": {
"title": "Karma Points",
"description": "This property does not exist if the character does not have the active advantage Blessed One and an active blessed tradition special ability.",
"type": "object",
"properties": {
"base": {
"description": "The karma points base value.",
"type": "integer",
"readOnly": true
},
"modifier": {
"description": "The karma points modifier depending on relevant advantages, disadvantages and special abilities.",
"type": "integer",
"readOnly": true
},
"purchased": {
"description": "The number of karma points points purchased.",
"type": "integer",
"minimum": 0
},
"permanently_lost": {
"description": "The number of karma points points permanently lost.",
"type": "integer",
"minimum": 0
},
"permanently_lost_bought_back": {
"description": "The number of permanently lost karma points points that have been bought back.",
"type": "integer",
"minimum": 0
},
"maximum": {
"description": "The (final) karma points maximum.",
"type": "integer",
"readOnly": true
}
},
"required": ["base", "modifier", "purchased", "permanently_lost", "permanently_lost_bought_back", "maximum"],
"additionalProperties": false
},
"spirit": {
"title": "Spirit",
"type": "object",
"properties": {
"base": {
"description": "The spirit base value.",
"type": "integer",
"readOnly": true
},
"modifier": {
"description": "The spirit modifier depending on relevant advantages, disadvantages and special abilities.",
"type": "integer",
"readOnly": true
},
"value": {
"description": "The (final) spirit value.",
"type": "integer",
"readOnly": true
}
},
"required": ["base", "modifier", "value"],
"additionalProperties": false
},
"toughness": {
"title": "Toughness",
"type": "object",
"properties": {
"base": {
"description": "The toughness base value.",
"type": "integer",
"readOnly": true
},
"modifier": {
"description": "The toughness modifier depending on relevant advantages, disadvantages and special abilities.",
"type": "integer",
"readOnly": true
},
"value": {
"description": "The (final) toughness value.",
"type": "integer",
"readOnly": true
}
},
"required": ["base", "modifier", "value"],
"additionalProperties": false
},
"dodge": {
"title": "Dodge",
"type": "object",
"properties": {
"base": {
"description": "The dodge base value.",
"type": "integer",
"readOnly": true
},
"modifier": {
"description": "The dodge modifier depending on relevant advantages, disadvantages and special abilities.",
"type": "integer",
"readOnly": true
},
"value": {
"description": "The (final) dodge value.",
"type": "integer",
"readOnly": true
}
},
"required": ["base", "modifier", "value"],
"additionalProperties": false
},
"initiative": {
"title": "Initiative",
"type": "object",
"properties": {
"base": {
"description": "The initiative base value.",
"type": "integer",
"readOnly": true
},
"modifier": {
"description": "The initiative modifier depending on relevant advantages, disadvantages and special abilities.",
"type": "integer",
"readOnly": true
},
"value": {
"description": "The (final) initiative value.",
"type": "integer",
"readOnly": true
}
},
"required": ["base", "modifier", "value"],
"additionalProperties": false
},
"movement": {
"title": "Movement",
"type": "object",
"properties": {
"base": {
"description": "The movement base value.",
"type": "integer",
"readOnly": true
},
"modifier": {
"description": "The movement modifier depending on relevant advantages, disadvantages and special abilities.",
"type": "integer",
"readOnly": true
},
"value": {
"description": "The (final) movement value.",
"type": "integer",
"readOnly": true
}
},
"required": ["base", "modifier", "value"],
"additionalProperties": false
},
"wound_threshold": {
"title": "Wound Threshold",
"description": "This property is not present if the required focus rules are not activated.",
"type": "object",
"properties": {
"base": {
"description": "The wound threshold base value.",
"type": "integer",
"readOnly": true
},
"modifier": {
"description": "The wound threshold modifier depending on relevant advantages, disadvantages and special abilities.",
"type": "integer",
"readOnly": true
},
"value": {
"description": "The (final) wound threshold value.",
"type": "integer",
"readOnly": true
}
},
"required": ["base", "modifier", "value"],
"additionalProperties": false
}
},
"required": [
"life_points",
"spirit",
"toughness",
"dodge",
"initiative",
"movement"
],
"additionalProperties": false
},
"skills": {
"title": "Skills",
"description": "A list of skills with values above 0. Skills that are not listed here default to 0.",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "The skill identifier.",
"type": "integer",
"minimum": 1
},
"value": {
"description": "The skill rating.",
"type": "integer",
"minimum": 1
}
},
"required": ["id", "value"],
"additionalProperties": false
}
},
"combat_techniques": {
"title": "Combat Techniques",
"description": "Lists of combat techniques, by group.",
"type": "object",
"properties": {
"melee": {
"title": "Melee Combat Techniques",
"description": "A list of melee combat techniques with values above 6. Combat techniques that are not listed here default to 6.",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "The melee combat technique identifier.",
"type": "integer",
"minimum": 1
},
"value": {
"description": "The combat technique rating.",
"type": "integer",
"minimum": 7
}
},
"required": ["id", "value"],
"additionalProperties": false
}
},
"ranged": {
"title": "Ranged Combat Techniques",
"description": "A list of ranged combat techniques with values above 6. Combat techniques that are not listed here default to 6.",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "The ranged combat technique identifier.",
"type": "integer",
"minimum": 1
},
"value": {
"description": "The combat technique rating.",
"type": "integer",
"minimum": 7
}
},
"required": ["id", "value"],
"additionalProperties": false
}
}
},
"required": [],
"additionalProperties": false
},
"cantrips": {
"title": "Cantrips",
"description": "A list of purchased cantrips.",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "The cantrip identifier.",
"type": "integer",
"minimum": 1
}
},
"required": ["id"],
"additionalProperties": false
}
},
"spells": {
"title": "Spells",
"description": "A list of active spells.",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "The spell identifier.",
"type": "integer",
"minimum": 1
},
"value": {
"description": "The skill rating.",
"type": "integer",
"minimum": 0
},
"enhancements": {
"description": "Purchased spell enhancements.",
"items": {
"type": "integer",
"minimum": 1
},
"uniqueItems": true,
"minItems": 1
}
},
"required": ["id", "value"],
"additionalProperties": false
}
},
"rituals": {
"title": "Rituals",
"description": "A list of active rituals.",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "The ritual identifier.",
"type": "integer",
"minimum": 1
},
"value": {
"description": "The skill rating.",
"type": "integer",
"minimum": 0
},
"enhancements": {
"description": "Purchased ritual enhancements.",
"items": {
"type": "integer",
"minimum": 1
},
"uniqueItems": true,
"minItems": 1
}
},
"required": ["id", "value"],
"additionalProperties": false
}
},
"magical_actions": {
"title": "Magical Actions",
"description": "Lists of magical actions, by group.",
"type": "object",
"properties": {
"curses": {
"title": "Curses",
"description": "A list of active curses.",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "The curse identifier.",
"type": "integer",
"minimum": 1
},
"value": {
"description": "The skill rating.",
"type": "integer",
"minimum": 0
}
},
"required": ["id", "value"],
"additionalProperties": false
}
},
"elven_magical_songs": {
"title": "Elven Magical Songs",
"description": "A list of active Elven magical songs.",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "The Elven magical song identifier.",
"type": "integer",
"minimum": 1
},
"value": {
"description": "The skill rating.",
"type": "integer",
"minimum": 0
}
},
"required": ["id", "value"],
"additionalProperties": false
}
},
"domination_rituals": {
"title": "Domination Rituals",
"description": "A list of active domination rituals.",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "The domination ritual identifier.",
"type": "integer",
"minimum": 1
},
"value": {
"description": "The skill rating.",
"type": "integer",
"minimum": 0
}
},
"required": ["id", "value"],
"additionalProperties": false
}
},
"magical_dances": {
"title": "Magical Dances",
"description": "A list of active magical dances.",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "The magical dance identifier.",
"type": "integer",
"minimum": 1
},
"value": {
"description": "The skill rating.",
"type": "integer",
"minimum": 0
}
},
"required": ["id", "value"],
"additionalProperties": false
}
},
"magical_melodies": {
"title": "Magical Melodies",
"description": "A list of active magical melodies.",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "The magical melody identifier.",
"type": "integer",
"minimum": 1
},
"value": {
"description": "The skill rating.",
"type": "integer",
"minimum": 0
}
},
"required": ["id", "value"],
"additionalProperties": false
}
},
"jester_tricks": {
"title": "Jester Tricks",
"description": "A list of active jester tricks.",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "The jester trick identifier.",
"type": "integer",
"minimum": 1
},
"value": {
"description": "The skill rating.",
"type": "integer",
"minimum": 0
}
},
"required": ["id", "value"],
"additionalProperties": false
}
},
"animist_powers": {
"title": "Animist Powers",
"description": "A list of active animist powers.",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "The animist power identifier.",
"type": "integer",
"minimum": 1
},
"value": {
"description": "The skill rating.",
"type": "integer",
"minimum": 0
}
},
"required": ["id", "value"],
"additionalProperties": false
}
},
"geode_rituals": {
"title": "Geode Rituals",
"description": "A list of active geode rituals.",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "The geode ritual identifier.",
"type": "integer",
"minimum": 1
},
"value": {
"description": "The skill rating.",
"type": "integer",
"minimum": 0
}
},
"required": ["id", "value"],
"additionalProperties": false
}
},
"zibilja_rituals": {
"title": "Zibilja Rituals",
"description": "A list of active zibilja rituals.",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "The zibilja ritual identifier.",
"type": "integer",
"minimum": 1
},
"value": {
"description": "The skill rating.",
"type": "integer",
"minimum": 0
}
},
"required": ["id", "value"],
"additionalProperties": false
}
}
},
"required": [],
"additionalProperties": false
},
"blessings": {
"title": "Blessings",
"description": "A list of purchased blessings.",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "The blessing identifier.",
"type": "integer",
"minimum": 1
}
},
"required": ["id"],
"additionalProperties": false
}
},
"liturgical_chants": {
"title": "Liturgical Chants",
"description": "A list of active liturgical chants.",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "The liturgical chant identifier.",
"type": "integer",
"minimum": 1
},
"value": {
"description": "The skill rating.",
"type": "integer",
"minimum": 0
},
"enhancements": {
"description": "Purchased liturgical enhancements.",
"items": {
"type": "integer",
"minimum": 1
},
"uniqueItems": true,
"minItems": 1
}
},
"required": ["id", "value"],
"additionalProperties": false
}
},
"ceremonies": {
"title": "Ceremonies",
"description": "A list of active ceremonies.",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "The ceremony identifier.",
"type": "integer",
"minimum": 1
},
"value": {
"description": "The skill rating.",
"type": "integer",
"minimum": 0
},
"enhancements": {
"description": "Purchased liturgical enhancements.",
"items": {
"type": "integer",
"minimum": 1
},
"uniqueItems": true,
"minItems": 1
}
},
"required": ["id", "value"],
"additionalProperties": false
}
},
"items": {},
"hit_zone_armors": {},
"purse": {
"title": "Purse",
"description": "The money the character owns.",
"type": "object",
"properties": {
"kreutzers": {
"description": "The kreutzers the character owns.",
"type": "integer",
"minimum": 0
},
"halers": {
"description": "The halers the character owns.",
"type": "integer",
"minimum": 0
},
"silverthalers": {
"description": "The silverthalers the character owns.",
"type": "integer",
"minimum": 0
},
"ducats": {
"description": "The ducats the character owns.",
"type": "integer",
"minimum": 0
}
},
"required": ["kreutzers", "halers", "silverthalers", "ducats"],
"additionalProperties": false
},
"creatures": {},
"pact": {}
},
"required": [
"version",
"name",
"date_created",
"date_last_modified",
"adventure_points",
"experience_level",
"is_character_creation_finished",
"race",
"culture",
"profession",
"rules",
"personal_data",
"advantages",
"disadvantages",
"special_abilities",
"attributes",
"attribute_adjustment_id",
"derived_characteristics",
"skills",
"combat_techniques",
"items",
"purse"
],
"additionalProperties": false,
"definitions": {
"Activatables": {
"title": "Activatables",
"description": "A list of active activatables. Activatables are advantages, disadvantages and special abilities.",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "The activatable identifier.",
"type": "integer",
"minimum": 1
},
"instances": {
"description": "One or multiple activations of the activatable.",
"type": "array",
"items": {
"description": "A single activation of the activatable.",
"type": "object",
"properties": {
"options": {
"description": "One or multiple options for the activatable. The meaning depends on the activatable.",
"type": "array",
"items": {
"oneOf": [
{
"description": "An identifier referencing a different entry.",
"type": "object",
"properties": {
"type": {
"description": "The entry type or \"Generic\" if it references a local select option.",
"enum": [
"Generic",
"Blessing",
"Cantrip",
"TradeSecret",
"Script",
"AnimalShape",
"ArcaneBardTradition",
"ArcaneDancerTradition",
"SexPractice",
"Race",
"Culture",
"BlessedTradition",
"Element",
"Property",
"Aspect",
"Disease",
"Poison",
"Language",
"Skill",
"MeleeCombatTechnique",
"RangedCombatTechnique",
"LiturgicalChant",
"Ceremony",
"Spell",
"Ritual"
]
},
"value": {
"description": "The numeric identifier.",
"type": "integer",
"minimum": 1
}
},
"required": ["type", "value"],
"additionalProperties": false
},
{
"description": "A user-entered text.",
"type": "object",
"properties": {
"type": {
"const": "Custom"
},
"value": {
"description": "The custom text.",
"type": "string",
"minLength": 1
}
},
"required": ["type", "value"],
"additionalProperties": false
}
]
},
"minItems": 1
},
"level": {
"description": "The instance level (if the activatable has levels).",
"type": "integer",
"minimum": 1
},
"custom_ap_value": {
"description": "If provided, a custom adventure points value has been set for this instance.",
"type": "integer",
"minimum": 1
}
},
"required": [],
"additionalProperties": false
},
"minItems": 1
}
},
"required": ["id", "instances"],
"additionalProperties": false
}
}
}
}
@mwberlindeu
Copy link

mwberlindeu commented Apr 10, 2021

The "skills" currently do not contain the scope of application (“Anwendungsgebiete”). Adding these allows some improvements on the character sheet by adding more information there. I give one example in German language.

Lebensmittelbearbeitung – Backen, Braten&Sieden, Brauen, Haltbarmachen

There are some general special abilities (“Allgemeine Sonderfertigkeiten”) that extend the scope of application of a talent. Such extension could be made visible in the list of skills making them much easier to find and apply. Example in German language.

Winzerei – erweitert Lebensmittelbearbeitung
Lebensmittelbearbeitung – Backen, Braten&Sieden, Brauen, Haltbarmachen, Winzerei

In my opinion having the scope extension visible on the skill itself is an improvement on the charactersheet where I would show such special abilities much less prominent.

In may also be possibile to store the scope of application somewhere else as it is more a part of the rules than a part of the character.

@mwberlindeu
Copy link

The "skills" currently do not contain specialisations (“Fertigkeitsspezialisierung”). Adding these allows some improvements on the character sheet by adding more information there, i.e. to set specialisations in bold. I give one example in German language.

Fertigkeitsspezialisierung (Körperbeherrschung: Kampfmanöver)
Körperbeherrschung - Akrobatik, Balance, Entwinden, Kampfmanöver, Laufen, Springen

Strictly speaking though you do not necessarily have to move the information to the skills sections as the information is already contained in the special abilities (“Allgemeine Sonderfertigkeiten”).
In my opinion having the skill specialisations visible on the skill itself is an improvement on the charactersheet where I would show skill specialisations under the special abilities much less prominent.

@elyukai
Copy link
Author

elyukai commented Apr 10, 2021

@mwberlindeu Thank you for your feedback! But … I'm a bit confused: You mention the character sheet, but this is not the character sheet …? 🙈

@mwberlindeu
Copy link

I know. I hinted at the end use with mentioning the charactersheet, and thought that you may have to do something on the Character JSON Schema to make the suggestions possible.

@elyukai
Copy link
Author

elyukai commented Apr 10, 2021

Ah, okay, well, the character JSON schema is only for the JSON export of Optolith to share characters with others or "third-party" tools. It does not have any influence on the character sheet or other UI, which is handled internally.

@soulflyman
Copy link

Maybe I missed it, but is it planed to have derived values for attack and parry of each weapon in the exported json?

@elyukai
Copy link
Author

elyukai commented May 6, 2021

Maybe I missed it, but is it planed to have derived values for attack and parry of each weapon in the exported json?

You didn't miss it, since items are not included there yet 😅🙈 – the database schema still needs to be finalized and it doesn't make much sense to work on this before.

And no, I haven't considered including AT/PA/RC yet, although it would make sense! 😮 Thank you! I wonder, tho, if it would make more sense to wait with this for Item Sets, since then the value will be completely calculated. Currently it is not that clear which entries influence the values, but especially for tooling authors it would be important to know if a value is a "final" value, and if not, which exact influence entries have. At least this is what I guess.

And I don't think it would make sense to include both versions of those values – with and without item set. And even tho I try to provide easier-to-use value calculations I also think it would make sense to not "overload" the documents with very fine-grained and detailed values. And, again, this is what I assume.

What do you think about that?

@soulflyman
Copy link

And I don't think it would make sense to include both versions of those values – with and without item set. And even tho I try to provide easier-to-use value calculations I also think it would make sense to not "overload" the documents with very fine-grained and detailed values. And, again, this is what I assume.

What do you think about that?

Overloading or cluttering the export is not a good idea. I think of the derived values as a machine readable version of the printed character sheet. Everything that is calculated and printed on the character sheet should be in the export as derived value, everything else, that a player needs to take care off during game play, should not be printed/exported as calculated/derived value.

So the derived AT/PA value should match that values that are printed on the character sheet in the row of the weapon.

For example Optodice, the dice rolling tool I develop, could just use the derived AT value that Optolith does export. If anything influences this I would expect that Optolith does take care of it and gives me a final value that I can work with. But I can just speak for my tool and I don't know if other tools have to know if the value is influenced by something else 🤷

@elyukai
Copy link
Author

elyukai commented May 7, 2021

Thanks for your input (again)!

Following that I would tend to not include AT/PA values for separate weapons and instead wait for items sets so that you'll definitely have final values.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment