{ "type":"object", "$schema": "http://json-schema.org/draft-04/schema", "title" : "VCMI spell format", "description" : "Format used to define new spells in VCMI", "definitions" : { "animationQueue":{ "type": "array", "items":{ "anyOf":[ { //dummy animation, pause, Value - frame count "type": "number" }, { //assumed verticalPosition: top "type": "string", "format": "defFile" }, { "type": "object", "properties":{ "verticalPosition": {"type":"string", "enum":["top","bottom"]}, "defName": {"type":"string", "format": "defFile"} }, "additionalProperties" : false } ] } }, "animation":{ "type": "object", "additionalProperties" : false, "properties":{ "affect":{"$ref" : "#/definitions/animationQueue"}, "hit":{"$ref" : "#/definitions/animationQueue"}, "cast":{"$ref" : "#/definitions/animationQueue"}, "projectile":{ "type":"array", "items":{ "type": "object", "properties":{ "minimumAngle": {"type":"number", "minimum" : 0}, "defName": {"type":"string", "format": "defFile"} }, "additionalProperties" : false } } } }, "flags" :{ "type" : "object", "additionalProperties" : { "type":"boolean" } }, "levelInfo":{ "type": "object", "required":["range","description","cost","power","aiValue","range"], "additionalProperties" : false, "properties":{ "description":{ "type": "string", "description": "Localizable description. Use {xxx} for formatting" }, "cost":{ "type": "number", "description":"Cost in mana points" }, "power":{ "type": "number", }, "aiValue":{ "type": "number", }, "range":{ "type": "string", "description": "spell range description in SRSL" }, "effects":{ "type": "object", "description": "Timed effects", "additionalProperties" : { "$ref" : "vcmi:bonus" } }, "targetModifier":{ "type": "object", "additionalProperties": false, "properties":{ "smart":{ "type": "boolean", "description": "true: friendly/hostile based on positiveness; false: all targets" }, "clearTarget": { "type": "boolean", "description": "LOCATION target only. Target hex/tile must be clear" }, "clearAffected": { "type": "boolean", "description": "LOCATION target only. All affected hexes/tile must be clear" } } } } }, "texts":{ "type": "object", "additionalProperties" : false } }, "required" : ["type", "name", "school", "level", "power","gainChance","flags","levels"], "additionalProperties" : false, "properties": { "index":{ "type": "number", "description": "numeric id of spell required only for original spells, prohibited for new spells" }, "type":{ "type": "string", "enum": ["adventure", "combat", "ability"], "description":"Spell type" }, "name":{ "type": "string", "description": "Localizable name" }, "school":{ "type": "object", "description": "Spell schools", "additionalProperties": false, "properties":{ "air":{"type": "boolean"}, "fire":{"type": "boolean"}, "earth":{"type": "boolean"}, "water":{"type": "boolean"} } }, "level":{ "type": "number", "description": "Spell level", "minimum" : 0, "maximum" : 5 }, "power":{ "type": "number", "description": "Base power", }, "defaultGainChance":{ "type": "number", "description": "Gain chance by default for all factions" }, "gainChance":{ "type": "object", "description": "Chance in % to gain for faction. NOTE: this field is merged with faction config", "additionalProperties" : { "type": "number", "minimum" : 0 } }, "targetType":{ "type": "string", "description": "NO_TARGET - instant cast no aiming, default; CREATURE - target is unit; OBSTACLE - target is OBSTACLE; LOCATION - target is location", "enum": ["NO_TARGET","CREATURE","OBSTACLE","LOCATION"] }, "counters":{ "$ref" : "#/definitions/flags", "description": "Flags structure ids of countering spells" }, "flags":{ "type": "object", "description": "Various flags", "additionalProperties" : false, "properties":{ "indifferent": { "type":"boolean", "description": "Spell is indifferent for target" }, "negative": { "type":"boolean", "description": "Spell is negative for target" }, "positive": { "type":"boolean", "description": "Spell is positive for target" }, "damage": { "type":"boolean", "description": "Spell does damage (direct or indirect)" }, "offensive": { "type":"boolean", "description": "Spell does direct damage (implicitly sets damage and negative)" }, "rising":{ "type":"boolean", "description": "Rising spell (implicitly sets positive)" }, "special":{ "type": "boolean", "description": "Special spell. Can be given only by Bonus::SPELL" } } }, "immunity":{ "$ref" : "#/definitions/flags", "description": "flags structure of bonus names, any one of these bonus grants immunity" }, "absoluteImmunity":{ "$ref" : "#/definitions/flags", "description": "flags structure of bonus names. Any one of these bonus grants immunity, can't be negated" }, "limit":{ "$ref" : "#/definitions/flags", "description": "flags structure of bonus names, presence of all bonuses required to be affected by." }, "absoluteLimit":{ "$ref" : "#/definitions/flags", "description": "flags structure of bonus names, presence of all bonuses required to be affected by, can't be negated." }, "animation":{"$ref": "#/definitions/animation"}, "graphics":{ "type": "object", "additionalProperties" : false, "properties":{ "iconImmune":{ "type": "string", "description": "Resourse path of icon for SPELL_IMMUNITY bonus (relative to DATA or SPRITES)", "format" : "imageFile" }, "iconScenarioBonus":{ "type": "string", "description": "Resourse path of icon for scenario bonus" , "format" : "imageFile" }, "iconEffect":{ "type": "string", "description": "Resourse path of icon for spell effects during battle" , "format" : "imageFile" }, "iconBook":{ "type": "string", "description":"Resourse path of icon for spellbook" , "format" : "imageFile" }, "iconScroll":{ "type": "string", "description": "Resourse path of icon for spell scrolls", "format": "imageFile" } } }, "sounds":{ "type": "object", "additionalProperties" : false, "properties":{ "cast":{ "type": "string", "description": "Resourse path of cast sound" } } }, "levels":{ "type": "object", "additionalProperties" : false, "required" : ["none", "basic", "advanced", "expert"], "properties":{ "base":{ "type": "object", "description": "will be merged with all levels", "additionalProperties": true }, "none":{ "$ref" : "#/definitions/levelInfo" }, "basic":{ "$ref" : "#/definitions/levelInfo" }, "advanced":{ "$ref" : "#/definitions/levelInfo" }, "expert":{ "$ref" : "#/definitions/levelInfo" } } } } }