mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-24 22:14:36 +02:00
0b70baa95e
* Indirect spell effects loading * Json serializer improvements * spell->canBeCastAt do not allow useless cast for any spell * Added proxy caster class for spell-created obstacles * Handle damage from spell-created obstacles inside mechanics * Experimental GameState integration/regression tests * Ignore mod settings and load only "vcmi" mod when running tests * fixed https://bugs.vcmi.eu/view.php?id=2765 (with tests) * Huge improvements of BattleAI regarding spell casts * AI can cast almost any combat spell except TELEPORT, SACRIFICE and obstacle placement spells. * Possible fix for https://bugs.vcmi.eu/view.php?id=1811 * CStack factored out to several classes * [Battle] Allowed RETURN_AFTER_STRIKE effect on server side to be optional * [Battle] Allowed BattleAction have multiple destinations * [Spells] Converted limit|immunity to target condition * [Spells] Use partial configuration reload for backward compatibility handling * [Tests] Started tests for CUnitState * Partial fixes of fire shield effect * [Battle] Do HP calculations in 64 bits * [BattleAI] Use threading for spell cast evaluation * [BattleAI] Made AI be able to evaluate modified turn order (on hypothetical battle state) * Implemented https://bugs.vcmi.eu/view.php?id=2811 * plug rare freeze when hypnotized unit shots vertically * Correctly apply ONLY_MELEE_FIGHT / ONLY_DISTANCE_FIGHT for unit damage, attack & defense * [BattleAI] Try to not waste a cast if battle is actually won already * Extended JsonSerializeFormat API * fixed https://bugs.vcmi.eu/view.php?id=2847 * Any unit effect can be now chained (not only damage like Chain Lightning) ** only damage effect for now actually uses "chainFactor" * Possible quick fix for https://bugs.vcmi.eu/view.php?id=2860
332 lines
8.3 KiB
JSON
332 lines
8.3 KiB
JSON
{
|
|
|
|
"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 (updated by prolongation)",
|
|
"additionalProperties" : {
|
|
"$ref" : "vcmi:bonus"
|
|
}
|
|
},
|
|
"cumulativeEffects":{
|
|
"type": "object",
|
|
"description": "Timed effects (updated by unique bonus)",
|
|
"additionalProperties" : {
|
|
"$ref" : "vcmi:bonus"
|
|
}
|
|
},
|
|
"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"
|
|
},
|
|
"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."
|
|
},
|
|
"targetCondition":{
|
|
"type": "object",
|
|
"additionalProperties" : true
|
|
},
|
|
"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"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|