{ "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" : "animationFile" }, { "type" : "object", "properties" : { "verticalPosition" : {"type" : "string", "enum" :["top","bottom"]}, "defName" : {"type" : "string", "format" : "animationFile"}, "effectName" : { "type" : "string" } }, "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" : { "defName" : {"type" : "string", "format" : "animationFile"}, "minimumAngle" : {"type" : "number", "minimum" : 0} }, "additionalProperties" : false } } } }, "flags" : { "type" : "object", "additionalProperties" : { "type" : "boolean" } }, "levelInfo" : { "type" : "object", "required" :["range", "description", "cost", "power", "aiValue"], "additionalProperties" : false, "properties" : { "description" : { "type" : "string", "description" : "Localizable description. Use {xxx} for formatting" }, "cost" : { "type" : "number", "description" : "Cost in mana points" }, "power" : { "type" : "number" }, "range" : { "type" : "string", "description" : "spell range description in SRSL" }, "aiValue" : { "type" : "number" }, "effects" : { "type" : "object", "description" : "Timed effects (updated by prolongation)", "additionalProperties" : { "$ref" : "bonus.json" } }, "cumulativeEffects" : { "type" : "object", "description" : "Timed effects (updated by unique bonus)", "additionalProperties" : { "$ref" : "bonus.json" } }, "battleEffects" : { "type" : "object", "additionalProperties" : { "type" : "object" } }, "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" }, "name" : { "type" : "string", "description" : "Localizable name of this spell" }, "type" : { "type" : "string", "enum" : ["adventure", "combat", "ability"], "description" : "Spell type" }, "school" : { "type" : "object", "description" : "List of spell schools this spell belongs to", "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 of the spell" }, "defaultGainChance" : { "type" : "number", "description" : "Gain chance by default for all factions" }, "canCastOnSelf" : { "type" : "boolean", "description" : "If used as creature spell, unit can cast this spell on itself" }, "canCastOnlyOnSelf" : { "type" : "boolean", "description" : "If used as creature spell, unit can cast this spell only on itself" }, "canCastWithoutSkip" : { "type" : "boolean", "description" : "If used the creature will not skip the turn after casting a spell." }, "gainChance" : { "type" : "object", "description" : "Chance for this spell to appear in Mage Guild of a specific faction", "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 BonusType::SPELL" }, "nonMagical" : { "type" : "boolean", "description" : "Non-magical ability. Usually used by some creatures. Should not be affected by sorcery and generic magic resistance. School resistances apply. Examples: dendroid bind, efreet fire shield." } } }, "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." }, "targetCondition" : { "type" : "object", "additionalProperties" : true }, "animation" : {"$ref" : "#/definitions/animation"}, "graphics" : { "type" : "object", "additionalProperties" : false, "properties" : { "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" }, "iconEffect" : { "type" : "string", "description" : "Resourse path of icon for spell effects during battle" , "format" : "imageFile" }, "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" } } }, "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" } } }, "onlyOnWaterMap" : { "type" : "boolean", "description" : "If true, spell won't be available on a map without water" } } }