{
	"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"
		},
		"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"
		}
	}
}
