mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-28 23:06:24 +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
734 lines
12 KiB
JSON
734 lines
12 KiB
JSON
{
|
|
"quicksand" : {
|
|
"index" : 10,
|
|
"targetType" : "NO_TARGET",
|
|
|
|
"sounds": {
|
|
"cast": "QUIKSAND"
|
|
},
|
|
"levels" : {
|
|
"base":{
|
|
"range" : "X",
|
|
"battleEffects" : {
|
|
"obstacle" : {
|
|
"type":"core:obstacle",
|
|
"hidden" : true,
|
|
"passable" : true,
|
|
"trap" : true,
|
|
"trigger" : false,
|
|
"patchCount" : 4,
|
|
"turnsRemaining" : -1,
|
|
"attacker" :{
|
|
"animation" : "C17SPE1",
|
|
"appearAnimation" : "C17SPE0",
|
|
"offsetY" : -42
|
|
},
|
|
"defender" :{
|
|
"animation" : "C17SPE1",
|
|
"appearAnimation" : "C17SPE0",
|
|
"offsetY" : -42
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"advanced":{
|
|
"battleEffects":{
|
|
"obstacle":{
|
|
"patchCount" : 6
|
|
}
|
|
}
|
|
},
|
|
"expert":{
|
|
"battleEffects":{
|
|
"obstacle":{
|
|
"patchCount" : 8
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"flags" : {
|
|
"indifferent": true
|
|
}
|
|
},
|
|
"landMine" : {
|
|
"index" : 11,
|
|
"targetType" : "NO_TARGET",
|
|
|
|
"sounds": {
|
|
"cast": ""
|
|
},
|
|
"levels" : {
|
|
"base":{
|
|
"range" : "X",
|
|
"battleEffects" : {
|
|
"obstacle" : {
|
|
"type":"core:obstacle",
|
|
"hidden" : true,
|
|
"passable" : true,
|
|
"trap" : false,
|
|
"trigger" : true,
|
|
"removeOnTrigger" : true,
|
|
"patchCount" : 4,
|
|
"turnsRemaining" : -1,
|
|
"attacker" :{
|
|
"animation" : "C09SPF1",
|
|
"appearAnimation" : "C09SPF0"
|
|
},
|
|
"defender" :{
|
|
"animation" : "C09SPF1",
|
|
"appearAnimation" : "C09SPF0"
|
|
}
|
|
},
|
|
"damage":{
|
|
"type":"core:damage",
|
|
"optional":false,
|
|
"indirect":true,
|
|
"customEffectId" : 82
|
|
}
|
|
}
|
|
},
|
|
"advanced":{
|
|
"battleEffects":{
|
|
"obstacle":{
|
|
"patchCount" : 6
|
|
}
|
|
}
|
|
},
|
|
"expert":{
|
|
"battleEffects":{
|
|
"obstacle":{
|
|
"patchCount" : 8
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"flags" : {
|
|
"damage": true,
|
|
"indifferent": true
|
|
},
|
|
"targetCondition" : {
|
|
"noneOf" : {
|
|
"bonus.DIRECT_DAMAGE_IMMUNITY" : "normal"
|
|
}
|
|
}
|
|
},
|
|
"forceField" : {
|
|
"index" : 12,
|
|
"targetType" : "LOCATION",
|
|
|
|
"sounds": {
|
|
"cast": "FORCEFLD"
|
|
},
|
|
"levels" : {
|
|
"base":{
|
|
"range" : "0",
|
|
"targetModifier":{
|
|
"clearAffected": true
|
|
},
|
|
"battleEffects":{
|
|
"obstacle":{
|
|
"type":"core:obstacle",
|
|
"hidden" : false,
|
|
"passable" : false,
|
|
"trap" : false,
|
|
"trigger" : false,
|
|
"patchCount" : 1,
|
|
"turnsRemaining" : 2,
|
|
"attacker" :{
|
|
"range" : [[""]],
|
|
"shape" : [[""], ["TR"]],
|
|
"animation" : "C15SPE1",
|
|
"appearAnimation" : "C15SPE0"
|
|
},
|
|
"defender" :{
|
|
"range" : [[""]],
|
|
"shape" : [[""], ["TL"]],
|
|
"animation" : "C15SPE4",
|
|
"appearAnimation" : "C15SPE0"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"advanced":{
|
|
"battleEffects":{
|
|
"obstacle":{
|
|
"attacker" :{
|
|
"shape" : [[""], ["TR"], ["TR", "TL"]],
|
|
"animation" : "C15SPE10",
|
|
"appearAnimation" : "C15SPE9"
|
|
},
|
|
"defender" :{
|
|
"shape" : [[""], ["TL"], ["TL", "TR"]],
|
|
"animation" : "C15SPE7",
|
|
"appearAnimation" : "C15SPE6"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"expert":{
|
|
"battleEffects":{
|
|
"obstacle":{
|
|
"attacker" :{
|
|
"shape" : [[""], ["TR"], ["TR", "TL"]],
|
|
"animation" : "C15SPE10",
|
|
"appearAnimation" : "C15SPE9"
|
|
},
|
|
"defender" :{
|
|
"shape" : [[""], ["TL"], ["TL", "TR"]],
|
|
"animation" : "C15SPE7",
|
|
"appearAnimation" : "C15SPE6"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"flags" : {
|
|
"indifferent": true
|
|
}
|
|
},
|
|
"fireWall" : {
|
|
"index" : 13,
|
|
"targetType" : "LOCATION",
|
|
|
|
"sounds": {
|
|
"cast": "FIREWALL"
|
|
},
|
|
"levels" : {
|
|
"base":{
|
|
"range" : "0",
|
|
"targetModifier":{
|
|
"clearAffected": true
|
|
},
|
|
"battleEffects":{
|
|
"obstacle":{
|
|
"type":"core:obstacle",
|
|
"hidden" : false,
|
|
"passable" : true,
|
|
"trap" : false,
|
|
"trigger" : true,
|
|
"patchCount" : 1,
|
|
"turnsRemaining" : 2,
|
|
"attacker" :{
|
|
"shape" : [[""]],
|
|
"range" : [[""], ["TR"]],
|
|
"animation" : "C07SPF61",
|
|
"appearAnimation" : "C07SPF60"
|
|
},
|
|
"defender" :{
|
|
"shape" : [[""]],
|
|
"range" : [[""], ["TL"]],
|
|
"animation" : "C07SPF61",
|
|
"appearAnimation" : "C07SPF60"
|
|
}
|
|
},
|
|
"damage":{
|
|
"type":"core:damage",
|
|
"optional":false,
|
|
"indirect":true
|
|
}
|
|
}
|
|
},
|
|
"advanced":{
|
|
"battleEffects":{
|
|
"obstacle":{
|
|
"attacker" :{
|
|
"range" : [[""], ["TR"], ["TR", "TL"]]
|
|
},
|
|
"defender" :{
|
|
"range" : [[""], ["TL"], ["TL", "TR"]]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"expert":{
|
|
"battleEffects":{
|
|
"obstacle":{
|
|
"attacker" :{
|
|
"range" : [[""], ["TR"], ["TR", "TL"]]
|
|
},
|
|
"defender" :{
|
|
"range" : [[""], ["TL"], ["TL", "TR"]]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"flags" : {
|
|
"damage": true,
|
|
"indifferent": true
|
|
},
|
|
"targetCondition" : {
|
|
"noneOf" : {
|
|
"bonus.DIRECT_DAMAGE_IMMUNITY" : "normal"
|
|
}
|
|
}
|
|
},
|
|
"earthquake" : {
|
|
"index" : 14,
|
|
"targetType" : "NO_TARGET",
|
|
|
|
"sounds": {
|
|
"cast": "ERTHQUAK"
|
|
},
|
|
"levels" : {
|
|
"base":{
|
|
"targetModifier":{"smart":true},
|
|
"battleEffects":{
|
|
"catapult":{
|
|
"type":"core:catapult",
|
|
"targetsToAttack": 2
|
|
}
|
|
},
|
|
"range" : "X"
|
|
},
|
|
"advanced":{
|
|
"battleEffects":{
|
|
"catapult":{
|
|
"targetsToAttack": 3
|
|
}
|
|
}
|
|
},
|
|
"expert":{
|
|
"battleEffects":{
|
|
"catapult":{
|
|
"targetsToAttack": 4
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"flags" : {
|
|
"indifferent": true
|
|
}
|
|
},
|
|
|
|
"dispel" : {
|
|
"index" : 35,
|
|
"targetType" : "CREATURE",
|
|
|
|
"animation":{
|
|
"affect":["C05SPW"] //C05SPW0
|
|
},
|
|
"sounds": {
|
|
"cast": "DISPELL"
|
|
},
|
|
"levels" : {
|
|
"base":{
|
|
"targetModifier":{
|
|
"smart":true
|
|
},
|
|
"battleEffects":{
|
|
"dispel":{
|
|
"type":"core:dispel",
|
|
"optional":false,
|
|
"ignoreImmunity" : true,
|
|
"dispelNegative":true,
|
|
"dispelNeutral":true,
|
|
"dispelPositive":true
|
|
}
|
|
},
|
|
"range" : "0"
|
|
},
|
|
"advanced":{
|
|
"targetModifier":{"smart":false}
|
|
},
|
|
"expert":{
|
|
"targetModifier":{"smart":false},
|
|
"battleEffects":{
|
|
"dispel":{
|
|
"optional":true
|
|
},
|
|
"removeObstacle":{
|
|
"optional":true,
|
|
"type":"core:removeObstacle",
|
|
"removeAllSpells" : true
|
|
}
|
|
},
|
|
"range" : "X"
|
|
}
|
|
},
|
|
"flags" : {
|
|
"positive": true
|
|
}
|
|
},
|
|
"cure" : {
|
|
"index" : 37,
|
|
"targetType" : "CREATURE",
|
|
"animation":{
|
|
"affect":["C03SPW"]//C03SPW0
|
|
},
|
|
|
|
"sounds": {
|
|
"cast": "CURE"
|
|
},
|
|
"levels" : {
|
|
"base":{
|
|
"targetModifier":{"smart":true},
|
|
"battleEffects":{
|
|
"heal":{
|
|
"type":"core:heal",
|
|
"healLevel":"heal",
|
|
"healPower":"permanent",
|
|
"optional":true
|
|
},
|
|
"cure":{
|
|
"type":"core:dispel",
|
|
"optional":true,
|
|
"dispelNegative":true,
|
|
"dispelNeutral":false,
|
|
"dispelPositive":false
|
|
}
|
|
},
|
|
"range" : "0"
|
|
},
|
|
"expert":{
|
|
"range" : "X"
|
|
}
|
|
},
|
|
"flags" : {
|
|
"positive": true
|
|
}
|
|
},
|
|
"resurrection" : {
|
|
"index" : 38,
|
|
"targetType" : "CREATURE",
|
|
|
|
"animation":{
|
|
"affect":["C01SPE0"]
|
|
},
|
|
"sounds": {
|
|
"cast": "RESURECT"
|
|
},
|
|
"levels" : {
|
|
"base":{
|
|
"range" : "0",
|
|
"battleEffects":{
|
|
"heal":{
|
|
"type":"core:heal",
|
|
"healLevel":"resurrect",
|
|
"healPower":"oneBattle",
|
|
"minFullUnits" : 1
|
|
},
|
|
"cure":{
|
|
"type":"core:dispel",
|
|
"indirect": true,
|
|
"optional":true,
|
|
"dispelNegative":true,
|
|
"dispelNeutral":false,
|
|
"dispelPositive":false
|
|
}
|
|
},
|
|
"targetModifier":{"smart":true}
|
|
},
|
|
"advanced":{
|
|
"battleEffects":{
|
|
"heal":{
|
|
"healPower":"permanent"
|
|
}
|
|
}
|
|
},
|
|
"expert":{
|
|
"battleEffects":{
|
|
"heal":{
|
|
"healPower":"permanent"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"flags" : {
|
|
"rising": true,
|
|
"positive": true
|
|
},
|
|
"targetCondition" : {
|
|
"noneOf" : {
|
|
"bonus.NON_LIVING" : "absolute",
|
|
"bonus.SIEGE_WEAPON" : "absolute",
|
|
"bonus.UNDEAD" : "absolute"
|
|
}
|
|
}
|
|
},
|
|
"animateDead" : {
|
|
"index" : 39,
|
|
"targetType" : "CREATURE",
|
|
|
|
"animation":{
|
|
"affect":["C01SPE0"]
|
|
},
|
|
"sounds": {
|
|
"cast": "ANIMDEAD"
|
|
},
|
|
"levels" : {
|
|
"base":{
|
|
"range" : "0",
|
|
"battleEffects":{
|
|
"heal":{
|
|
"type":"core:heal",
|
|
"healLevel":"resurrect",
|
|
"healPower":"permanent",
|
|
"minFullUnits" : 1
|
|
}
|
|
},
|
|
"targetModifier":{"smart":true}
|
|
}
|
|
},
|
|
"flags" : {
|
|
"rising": true,
|
|
"positive": true
|
|
},
|
|
"targetCondition" : {
|
|
"allOf" : {
|
|
"bonus.UNDEAD" : "absolute"
|
|
}
|
|
}
|
|
},
|
|
"sacrifice" : {
|
|
"index" : 40,
|
|
"targetType" : "CREATURE",
|
|
|
|
"animation":{
|
|
"affect":["C01SPE0"]
|
|
},
|
|
"sounds": {
|
|
"cast": "SACRIF1"
|
|
},
|
|
"levels" : {
|
|
"base":{
|
|
"range" : "0",
|
|
"battleEffects":{
|
|
"sacrifice":{
|
|
"type":"core:sacrifice",
|
|
"healLevel":"resurrect",
|
|
"healPower":"permanent",
|
|
"minFullUnits" : 0
|
|
}
|
|
},
|
|
"targetModifier":{"smart":true}
|
|
}
|
|
},
|
|
"flags" : {
|
|
"rising": true,
|
|
"positive": true
|
|
},
|
|
"targetCondition" : {
|
|
"noneOf" : {
|
|
"bonus.NON_LIVING" : "absolute",
|
|
"bonus.SIEGE_WEAPON" : "absolute",
|
|
"bonus.UNDEAD" : "absolute"
|
|
}
|
|
}
|
|
},
|
|
"teleport" : {
|
|
"index" : 63,
|
|
"targetType" : "CREATURE",
|
|
|
|
"sounds": {
|
|
"cast": "TELPTOUT"
|
|
},
|
|
"levels" : {
|
|
"base":{
|
|
"range" : "0",
|
|
"battleEffects":{
|
|
"teleport":{
|
|
"type":"core:teleport"
|
|
}
|
|
},
|
|
"targetModifier":{"smart":true}
|
|
}
|
|
},
|
|
"flags" : {
|
|
"positive": true
|
|
},
|
|
"targetCondition" : {
|
|
"noneOf" : {
|
|
"bonus.SIEGE_WEAPON" : "absolute"
|
|
}
|
|
}
|
|
},
|
|
"removeObstacle" : {
|
|
"index" : 64,
|
|
"targetType" : "OBSTACLE",
|
|
"animation":{
|
|
"cast":[2]
|
|
},
|
|
"sounds": {
|
|
"cast": "REMOVEOB"
|
|
},
|
|
"levels" : {
|
|
"base":{
|
|
"range" : "0",
|
|
"battleEffects": {
|
|
"removeObstacle" : {
|
|
"optional":false,
|
|
"type":"core:removeObstacle",
|
|
"removeUsual" : true
|
|
}
|
|
}
|
|
},
|
|
"advanced" : {
|
|
"battleEffects": {
|
|
"removeObstacle" : {
|
|
"removeSpells" : ["fireWall"]
|
|
}
|
|
}
|
|
},
|
|
"expert" : {
|
|
"battleEffects": {
|
|
"removeObstacle" : {
|
|
"removeAllSpells" : true
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"flags" : {
|
|
"indifferent": true
|
|
}
|
|
},
|
|
"clone" : {
|
|
"index" : 65,
|
|
"targetType" : "CREATURE",
|
|
"animation":{
|
|
"cast":[2]
|
|
},
|
|
"sounds": {
|
|
"cast": "CLONE"
|
|
},
|
|
"levels" : {
|
|
"base":{
|
|
"range" : "0",
|
|
"battleEffects":{
|
|
"clone":{
|
|
"maxTier":5,
|
|
"type":"core:clone"
|
|
}
|
|
},
|
|
"targetModifier":{"smart":true}
|
|
},
|
|
"advanced":{
|
|
"battleEffects":{
|
|
"clone":{
|
|
"maxTier":6
|
|
}
|
|
}
|
|
},
|
|
"expert":{
|
|
"battleEffects":{
|
|
"clone":{
|
|
"maxTier":1000
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"flags" : {
|
|
"positive": true
|
|
},
|
|
"targetCondition" : {
|
|
"noneOf" : {
|
|
"bonus.SIEGE_WEAPON" : "absolute"
|
|
}
|
|
}
|
|
},
|
|
"fireElemental" : {
|
|
"index" : 66,
|
|
"targetType" : "NO_TARGET",
|
|
"animation":{
|
|
"cast":[2]
|
|
},
|
|
"sounds": {
|
|
"cast": "SUMNELM"
|
|
},
|
|
"levels" : {
|
|
"base":{
|
|
"range" : "X",
|
|
"battleEffects":{
|
|
"summon":{
|
|
"exclusive":true,
|
|
"id":"fireElemental",
|
|
"permanent":false,
|
|
"type":"core:summon"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"flags" : {
|
|
"indifferent": true
|
|
}
|
|
},
|
|
"earthElemental" : {
|
|
"index" : 67,
|
|
"targetType" : "NO_TARGET",
|
|
"animation":{
|
|
"cast":[2]
|
|
},
|
|
"sounds": {
|
|
"cast": "SUMNELM"
|
|
},
|
|
"levels" : {
|
|
"base":{
|
|
"range" : "X",
|
|
"battleEffects":{
|
|
"summon":{
|
|
"exclusive":true,
|
|
"id":"earthElemental",
|
|
"permanent":false,
|
|
"type":"core:summon"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"flags" : {
|
|
"indifferent": true
|
|
}
|
|
},
|
|
"waterElemental" : {
|
|
"index" : 68,
|
|
"targetType" : "NO_TARGET",
|
|
"animation":{
|
|
"cast":[2]
|
|
},
|
|
"sounds": {
|
|
"cast": "SUMNELM"
|
|
},
|
|
"levels" : {
|
|
"base":{
|
|
"range" : "X",
|
|
"battleEffects":{
|
|
"summon":{
|
|
"exclusive":true,
|
|
"id":"waterElemental",
|
|
"permanent":false,
|
|
"type":"core:summon"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"flags" : {
|
|
"indifferent": true
|
|
}
|
|
},
|
|
"airElemental" : {
|
|
"index" : 69,
|
|
"targetType" : "NO_TARGET",
|
|
"animation":{
|
|
"cast":[2]
|
|
},
|
|
"sounds": {
|
|
"cast": "SUMNELM"
|
|
},
|
|
"levels" : {
|
|
"base":{
|
|
"range" : "X",
|
|
"battleEffects":{
|
|
"summon":{
|
|
"exclusive":true,
|
|
"id":"airElemental",
|
|
"permanent":false,
|
|
"type":"core:summon"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"flags" : {
|
|
"indifferent": true
|
|
}
|
|
}
|
|
}
|