1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-24 22:14:36 +02:00

- H3 creatures use subset of mod creature format (todo - unify code)

- creatures configs moved into confg/creatures files, similar to factions.
 - creatures ID's use same camelCase format as the rest of the game
This commit is contained in:
Ivan Savenko 2012-12-22 16:47:12 +00:00
parent 406d43dc27
commit 8824f5e2d5
35 changed files with 4086 additions and 3495 deletions

View File

@ -145,6 +145,7 @@ bool isCloser(const EnemyInfo & ei1, const EnemyInfo & ei2, const ReachabilityIn
}
//FIXME: unused function
/*
static bool willSecondHexBlockMoreEnemyShooters(const BattleHex &h1, const BattleHex &h2)
{
int shooters[2] = {0}; //count of shooters on hexes
@ -157,6 +158,7 @@ static bool willSecondHexBlockMoreEnemyShooters(const BattleHex &h1, const Battl
return shooters[0] < shooters[1];
}
*/
template <typename Container, typename Pred>
auto sum(const Container & c, Pred p) -> decltype(p(*boost::begin(c)))

View File

@ -17,7 +17,7 @@ option(DISABLE_ERM "Disable compilation of ERM scripting module" ON)
if (APPLE)
# Default location for thirdparty libs
set(CMAKE_INCLUDE_PATH "../include")
set(CMAKE_INCLUDE_PATH "../include ${CMAKE_OSX_SYSROOT}/usr/include")
set(CMAKE_LIBRARY_PATH "../lib")
set(CMAKE_FRAMEWORK_PATH "../Frameworks")
set(BOOST_ROOT "../")

View File

@ -1,19 +1,5 @@
{
//Map faction - commander creature
//Using "attacking creature" from WoG - whatever it means
"factionCreatures":
[
{"faction": 0, "id": 174},
{"faction": 1, "id": 175},
{"faction": 2, "id": 176},
{"faction": 3, "id": 177},
{"faction": 4, "id": 178},
{"faction": 5, "id": 179},
{"faction": 6, "id": 180},
{"faction": 7, "id": 181},
{"faction": 8, "id": 182}
],
//Commander receives these bonuses on level-up
"bonusPerLevel":
[
@ -133,4 +119,4 @@
]
}
]
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,297 @@
{
"pikeman" :
{
"id": 0,
"level": 1,
"faction": "castle",
"upgrades": ["halberdier"],
"abilities": [ [ "CHARGE_IMMUNITY", 0, 0, 0 ] ], //pikeman immunity to Champion charge bonus
"graphics" :
{
"animation": "CPKMAN.DEF"
},
"sound" :
{
"attack": "PIKEATTK.wav",
"defend": "PIKEDFND.wav",
"killed": "PIKEKILL.wav",
"move": "PIKEMOVE.wav",
"wince": "PIKEWNCE.wav"
}
},
"halberdier" :
{
"id": 1,
"level": 1,
"faction": "castle",
"abilities": [ [ "CHARGE_IMMUNITY", 0, 0, 0 ] ], //halberdier immunity to Champion charge bonus
"graphics" :
{
"animation": "CHALBD.DEF"
},
"sound" :
{
"attack": "HALBATTK.wav",
"defend": "HALBDFND.wav",
"killed": "HALBKILL.wav",
"move": "HALBMOVE.wav",
"wince": "HALBWNCE.wav"
}
},
"archer" :
{
"id": 2,
"level": 2,
"extraNames": [ "lightCrossbowman" ],
"faction": "castle",
"upgrades": ["marksman"],
"graphics" :
{
"animation": "CLCBOW.DEF",
"missile" :
{
"projectile": "PLCBOWX.DEF",
"spinning": false
}
},
"sound" :
{
"attack": "LCRSATTK.wav",
"defend": "LCRSDFND.wav",
"killed": "LCRSKILL.wav",
"move": "LCRSMOVE.wav",
"shoot": "LCRSSHOT.wav",
"wince": "LCRSWNCE.wav"
}
},
"marksman" :
{
"id": 3,
"level": 2,
"faction": "castle",
"graphics" :
{
"animation": "CHCBOW.DEF",
"missile" :
{
"projectile": "PLCBOWX.DEF",
"spinning": false
}
},
"sound" :
{
"attack": "HCRSATTK.wav",
"defend": "HCRSDFND.wav",
"killed": "HCRSKILL.wav",
"move": "HCRSMOVE.wav",
"shoot": "HCRSSHOT.wav",
"wince": "HCRSWNCE.wav"
}
},
"griffin" :
{
"id": 4,
"level": 3,
"faction": "castle",
"abilities": [ [ "ADDITIONAL_RETALIATION", 1, 0, 0 ] ], //griffins retaliate twice
"upgrades": ["royalGriffin"],
"graphics" :
{
"animation": "CGRIFF.DEF"
},
"sound" :
{
"attack": "GRIFATTK.wav",
"defend": "GRIFDFND.wav",
"killed": "GRIFKILL.wav",
"move": "GRIFMOVE.wav",
"wince": "GRIFWNCE.wav"
}
},
"royalGriffin" :
{
"id": 5,
"level": 3,
"faction": "castle",
"abilities": [ [ "UNLIMITED_RETALIATIONS", 0, 0, 0 ] ], //royal griffins retaliate always
"graphics" :
{
"animation": "CRGRIF.DEF"
},
"sound" :
{
"attack": "RGRFATTK.wav",
"defend": "RGRFDFND.wav",
"killed": "RGRFKILL.wav",
"move": "RGRFMOVE.wav",
"wince": "RGRFWNCE.wav"
}
},
"swordsman" :
{
"id": 6,
"level": 4,
"faction": "castle",
"upgrades": ["crusader"],
"graphics" :
{
"animation": "CSWORD.DEF"
},
"sound" :
{
"attack": "SWRDATTK.wav",
"defend": "SWRDDFND.wav",
"killed": "SWRDKILL.wav",
"move": "SWRDMOVE.wav",
"wince": "SWRDWNCE.wav"
}
},
"crusader" :
{
"id": 7,
"level": 4,
"faction": "castle",
"graphics" :
{
"animation": "CCRUSD.DEF"
},
"sound" :
{
"attack": "CRUSATTK.wav",
"defend": "CRUSDFND.wav",
"killed": "CRUSKILL.wav",
"move": "CRUSMOVE.wav",
"wince": "CRUSWNCE.wav"
}
},
"monk" :
{
"id": 8,
"level": 5,
"faction": "castle",
"upgrades": ["zealot"],
"graphics" :
{
"animation": "CMONKK.DEF",
"missile" :
{
"projectile": "CPRZEAX.DEF",
"spinning": false
}
},
"sound" :
{
"attack": "MONKATTK.wav",
"defend": "MONKDFND.wav",
"killed": "MONKKILL.wav",
"move": "MONKMOVE.wav",
"shoot": "MONKSHOT.wav",
"wince": "MONKWNCE.wav"
}
},
"zealot" :
{
"id": 9,
"level": 5,
"faction": "castle",
"graphics" :
{
"animation": "CZEALT.DEF",
"missile" :
{
"projectile": "CPRZEAX.DEF",
"spinning": false
}
},
"sound" :
{
"attack": "ZELTATTK.wav",
"defend": "ZELTDFND.wav",
"killed": "ZELTKILL.wav",
"move": "ZELTMOVE.wav",
"shoot": "ZELTSHOT.wav",
"wince": "ZELTWNCE.wav"
}
},
"cavalier" :
{
"id": 10,
"level": 6,
"faction": "castle",
"upgrades": ["champion"],
"graphics" :
{
"animation": "CCAVLR.DEF"
},
"sound" :
{
"attack": "CAVAATTK.wav",
"defend": "CAVADFND.wav",
"killed": "CAVAKILL.wav",
"move": "CAVAMOVE.wav",
"wince": "CAVAWNCE.wav"
}
},
"champion" :
{
"id": 11,
"level": 6,
"faction": "castle",
"graphics" :
{
"animation": "CCHAMP.DEF"
},
"sound" :
{
"attack": "CHMPATTK.wav",
"defend": "CHMPDFND.wav",
"killed": "CHMPKILL.wav",
"move": "CHMPMOVE.wav",
"wince": "CHMPWNCE.wav"
}
},
"angel" :
{
"id": 12,
"level": 7,
"faction": "castle",
"abilities": [ [ "HATE", 50, 55, 0 ], //angels hate archdevils
[ "HATE", 50, 54, 0 ] ], //angels hate devils
"upgrades": ["archangel"],
"graphics" :
{
"animation": "CANGEL.DEF"
},
"sound" :
{
"attack": "ANGLATTK.wav",
"defend": "ANGLDFND.wav",
"killed": "ANGLKILL.wav",
"move": "ANGLMOVE.wav",
"wince": "ANGLWNCE.wav"
}
},
"archangel" :
{
"id": 13,
"level": 7,
"faction": "castle",
"abilities": [ [ "SPECIFIC_SPELL_POWER", 100, 38, 0 ], // 100 hp per Archangel
[ "SPELLCASTER", 0, 38, 0 ], //archangels cast resurrection
[ "HATE", 50, 55, 0 ], //archangels hate arch
[ "HATE", 50, 54, 0 ] , //archangels hate devils
[ "CASTS", 1, 0, 0]],
"graphics" :
{
"animation": "CRANGL.DEF"
},
"sound" :
{
"attack": "AAGLATTK.wav",
"defend": "AAGLDFND.wav",
"killed": "AAGLKILL.wav",
"move": "AAGLMOVE.wav",
"wince": "AAGLWNCE.wav"
}
}
}

View File

@ -0,0 +1,336 @@
{
"airElemental" :
{
"id": 112,
"level": 2,
"extraNames": [ "airElementals" ],
"faction": "conflux",
"abilities": [ [ "SPELL_IMMUNITY", 0, 61, 0 ], //air elementals are immune to mind spells (forgetfulness) //earth elementals are non-living
[ "SPELL_IMMUNITY", 0, 60, 0 ], //air elementals are immune to mind spells (hypnotize)
[ "SPELL_IMMUNITY", 0, 59, 0 ], //air elementals are immune to mind spells (berserk)
[ "SPELL_IMMUNITY", 0, 50, 0 ], //air elementals are immune to mind spells (sorrow)
[ "SPELL_IMMUNITY", 0, 23, 0 ], //air elementals are immune to meteor shower
[ "NON_LIVING", 0, 0, 0 ],
[ "MORE_DAMAGE_FROM_SPELL", 100, 19, 0 ], //air elementals are vulnerable to chain lightning
[ "MORE_DAMAGE_FROM_SPELL", 100, 17, 0 ] ], //air elementals are vulnerable to lightning bolt //air elementals are non-living
"upgrades": ["stormElemental"],
"graphics" :
{
"animation": "CAELEM.DEF"
},
"sound" :
{
"attack": "AELMATTK.wav",
"defend": "AELMDFND.wav",
"killed": "AELMKILL.wav",
"move": "AELMMOVE.wav",
"wince": "AELMWNCE.wav"
}
},
"earthElemental" :
{
"id": 113,
"level": 5,
"faction": "conflux",
"abilities": [ [ "SPELL_IMMUNITY", 0, 61, 0 ], //earth elementals are immune to mind spells (forgetfulness)
[ "SPELL_IMMUNITY", 0, 60, 0 ], //earth elementals are immune to mind spells (hypnotize)
[ "SPELL_IMMUNITY", 0, 59, 0 ], //earth elementals are immune to mind spells (berserk)
[ "SPELL_IMMUNITY", 0, 50, 0 ], //earth elementals are immune to mind spells (sorrow)
[ "SPELL_IMMUNITY", 0, 19, 0 ], //earth elementals are immune to chain lightning
[ "SPELL_IMMUNITY", 0, 17, 0 ], //earth elementals are immune to lightning bolt
[ "NON_LIVING", 0, 0, 0 ],
[ "MORE_DAMAGE_FROM_SPELL", 100, 23, 0 ] ], //earth elementals are vulnerable to meteor shower
"upgrades": ["magmaElemental"],
"graphics" :
{
"animation": "CEELEM.DEF"
},
"sound" :
{
"attack": "EELMATTK.wav",
"defend": "EELMDFND.wav",
"killed": "EELMKILL.wav",
"move": "EELMMOVE.wav",
"wince": "EELMWNCE.wav"
}
},
"fireElemental" :
{
"id": 114,
"level": 4,
"faction": "conflux",
"abilities": [ [ "SPELL_IMMUNITY", 0, 61, 0 ], //fire elementals are immune to mind spells (forgetfulness)
[ "SPELL_IMMUNITY", 0, 60, 0 ], //fire elementals are immune to mind spells (hypnotize) //water elemental should be treated as double-wide
[ "SPELL_IMMUNITY", 0, 59, 0 ], //fire elementals are immune to mind spells (berserk)
[ "SPELL_IMMUNITY", 0, 50, 0 ], //fire elementals are immune to mind spells (sorrow)
[ "NON_LIVING", 0, 0, 0 ], //fire elementals are non-living
[ "MORE_DAMAGE_FROM_SPELL", 100, 20, 0 ], //fire elementals are vulnerable to frost ring
[ "MORE_DAMAGE_FROM_SPELL", 100, 16, 0 ], //fire elementals are vulnerable to ice bolt
[ "FIRE_IMMUNITY", 0, 0, 0 ] ], //fire elementals are immune to fire spells
"upgrades": ["energyElemental"],
"graphics" :
{
"animation": "CFELEM.DEF"
},
"sound" :
{
"attack": "FELMATTK.wav",
"defend": "FELMDFND.wav",
"killed": "FELMKILL.wav",
"move": "FELMMOVE.wav",
"wince": "FELMWNCE.wav"
}
},
"waterElemental" :
{
"id": 115,
"level": 3,
"extraNames": [ "waterElementals" ],
"faction": "conflux",
"abilities": [ [ "SPELL_IMMUNITY", 0, 61, 0 ], //water elementals are immune to mind spells (forgetfulness)
[ "SPELL_IMMUNITY", 0, 60, 0 ], //water elementals are immune to mind spells (hypnotize)
[ "SPELL_IMMUNITY", 0, 59, 0 ], //water elementals are immune to mind spells (berserk)
[ "SPELL_IMMUNITY", 0, 50, 0 ], //water elementals are immune to mind spells (sorrow)
[ "SPELL_IMMUNITY", 0, 20, 0 ], //water elementals are immune to frost ring
[ "SPELL_IMMUNITY", 0, 16, 0 ], //water elementals are immune to ice bolt
[ "NON_LIVING", 0, 0, 0 ], //water elementals are non-living
[ "MORE_DAMAGE_FROM_SPELL", 100, 29, 0 ], //water elementals are vulnerable to fire shield
[ "MORE_DAMAGE_FROM_SPELL", 100, 22, 0 ], //water elementals are vulnerable to inferno
[ "MORE_DAMAGE_FROM_SPELL", 100, 21, 0 ], //water elementals are vulnerable to fireball
[ "MORE_DAMAGE_FROM_SPELL", 100, 13, 0 ], //water elementals are vulnerable to fire wall
[ "DOUBLE_WIDE", 0, 0, 0 ] ],
"upgrades": ["iceElemental"],
"graphics" :
{
"animation": "CWELEM.DEF"
},
"sound" :
{
"attack": "WELMATTK.wav",
"defend": "WELMDFND.wav",
"killed": "WELMKILL.wav",
"move": "WELMMOVE.wav",
"wince": "WELMWNCE.wav"
}
},
"pixie" :
{
"id": 118,
"level": 1,
"extraNames": [ "pixies" ],
"faction": "conflux",
"upgrades": ["sprite"],
"graphics" :
{
"animation": "CPIXIE.DEF"
},
"sound" :
{
"attack": "PIXIATTK.wav",
"defend": "PIXIDFND.wav",
"killed": "PIXIKILL.wav",
"move": "PIXIMOVE.wav",
"wince": "PIXIWNCE.wav"
}
},
"sprite" :
{
"id": 119,
"level": 1,
"faction": "conflux",
"graphics" :
{
"animation": "CSPRITE.DEF"
},
"sound" :
{
"attack": "SPRTATTK.wav",
"defend": "SPRTDFND.wav",
"killed": "SPRTKILL.wav",
"move": "SPRTMOVE.wav",
"wince": "SPRTWNCE.wav"
}
},
"psychicElemental" :
{
"id": 120,
"level": 6,
"faction": "conflux",
"abilities": [ [ "NON_LIVING", 0, 0, 0 ] ], //magic elementals shouldn't get morale
"ability_remove": [ "DOUBLE_WIDE" ],
"upgrades": ["magicElemental"],
"graphics" :
{
"animation": "CPSYEL.DEF"
},
"sound" :
{
"attack": "PSYCATTK.wav",
"defend": "PSYCDFND.wav",
"killed": "PSYCKILL.wav",
"move": "PSYCMOVE.wav",
"wince": "PSYCWNCE.wav"
}
},
"magicElemental" :
{
"id": 121,
"level": 6,
"faction": "conflux",
"abilities": [ [ "NON_LIVING", 0, 0, 0 ], //ice elementals shouldn't get morale
[ "LEVEL_SPELL_IMMUNITY", 5, 0, 0 ] ], //magic elementals are immune to all spells
"ability_remove": [ "DOUBLE_WIDE" ],
"graphics" :
{
"animation": "CMAGEL.DEF"
},
"sound" :
{
"attack": "MGELATTK.wav",
"defend": "MGELDFND.wav",
"killed": "MGELKILL.wav",
"move": "MGELMOVE.wav",
"wince": "MGELWNCE.wav"
}
},
"iceElemental" :
{
"id": 123,
"level": 3,
"faction": "conflux",
"abilities": [ [ "NON_LIVING", 0, 0, 0 ],
[ "DOUBLE_WIDE", 0, 0, 0 ], //ice elemental should be treated as double-wide
[ "CREATURE_ENCHANT_POWER", 6, 0, 0 ],
[ "CASTS", 3, 0, 0 ],
[ "SPELLCASTER", 2, 32, 0 ]],
"graphics" :
{
"animation": "CICEE.DEF",
"missile" :
{
"projectile": "PICEE.DEF",
"spinning": false
}
},
"sound" :
{
"attack": "ICELATTK.wav",
"defend": "ICELDFND.wav",
"killed": "ICELKILL.wav",
"move": "ICELMOVE.wav",
"shoot": "ICELSHOT.wav",
"wince": "ICELWNCE.wav"
}
},
"magmaElemental" :
{
"id": 125,
"level": 5,
"faction": "conflux",
"abilities": [ [ "NON_LIVING", 0, 0, 0 ], //magma elementals shouldn't get morale
[ "CREATURE_ENCHANT_POWER", 6, 0, 0 ],
[ "CASTS", 3, 0, 0 ],
[ "SPELLCASTER", 2, 33, 0 ]],
"graphics" :
{
"animation": "CSTONE.DEF"
},
"sound" :
{
"attack": "MAGMATTK.wav",
"defend": "MAGMDFND.wav",
"killed": "MAGMKILL.wav",
"move": "MAGMMOVE.wav",
"wince": "MAGMWNCE.wav"
}
},
"stormElemental" :
{
"id": 127,
"level": 2,
"faction": "conflux",
"abilities": [ [ "NON_LIVING", 0, 0, 0 ], //storm elementals shouldn't get morale
[ "CREATURE_ENCHANT_POWER", 6, 0, 0 ],
[ "CASTS", 3, 0, 0 ],
[ "SPELLCASTER", 2, 30, 0 ]],
"graphics" :
{
"animation": "CSTORM.DEF",
"missile" :
{
"projectile": "CPRGTIX.DEF",
"spinning": false
}
},
"sound" :
{
"attack": "STORATTK.wav",
"defend": "STORDFND.wav",
"killed": "STORKILL.wav",
"move": "STORMOVE.wav",
"shoot": "STORSHOT.wav",
"wince": "STORWNCE.wav"
}
},
"energyElemental" :
{
"id": 129,
"level": 4,
"faction": "conflux",
"abilities": [ [ "NON_LIVING", 0, 0, 0 ] , //energy elementals shouldn't get morale //Crystal Dragons do not fly
[ "CREATURE_ENCHANT_POWER", 6, 0, 0 ],
[ "CASTS", 3, 0, 0 ],
[ "SPELLCASTER", 2, 31, 0 ]],
"graphics" :
{
"animation": "CNRG.DEF"
},
"sound" :
{
"attack": "ENERATTK.wav",
"defend": "ENERDFND.wav",
"killed": "ENERKILL.wav",
"move": "ENERMOVE.wav",
"wince": "ENERWNCE.wav"
}
},
"firebird" :
{
"id": 130,
"level": 7,
"faction": "conflux",
"upgrades": ["phoenix"],
"graphics" :
{
"animation": "CFBIRD.DEF"
},
"sound" :
{
"attack": "FIRBATTK.wav",
"defend": "FIRBDFND.wav",
"killed": "FIRBKILL.wav",
"move": "FIRBMOVE.wav",
"wince": "FIRBWNCE.wav"
}
},
"phoenix" :
{
"id": 131,
"level": 7,
"faction": "conflux",
"abilities": [ [ "CASTS", 1, 0, 0 ], //Phoenix rebirths once
[ "REBIRTH", 20, 0, 0 ] ], //20% of stack is resurrected
"graphics" :
{
"animation": "CPHX.DEF"
},
"sound" :
{
"attack": "PHOEATTK.wav",
"defend": "PHOEDFND.wav",
"killed": "PHOEKILL.wav",
"move": "PHOEMOVE.wav",
"wince": "PHOEWNCE.wav"
}
}
}

View File

@ -0,0 +1,310 @@
{
"troglodyte" :
{
"id": 70,
"level": 1,
"faction": "dungeon",
"abilities": [ [ "SPELL_IMMUNITY", 0, 62, 0 ] ], //troglodytes are immune to blind
"upgrades": ["infernalTroglodyte"],
"graphics" :
{
"animation": "CTROGL.DEF"
},
"sound" :
{
"attack": "TROGATTK.wav",
"defend": "TROGDFND.wav",
"killed": "TROGKILL.wav",
"move": "TROGMOVE.wav",
"wince": "TROGWNCE.wav"
}
},
"infernalTroglodyte" :
{
"id": 71,
"level": 1,
"faction": "dungeon",
"abilities": [ [ "SPELL_IMMUNITY", 0, 62, 0 ] ], //infernal troglodytes are immune to blind
"graphics" :
{
"animation": "CITROG.DEF"
},
"sound" :
{
"attack": "ITRGATTK.wav",
"defend": "ITRGDFND.wav",
"killed": "ITRGKILL.wav",
"move": "ITRGMOVE.wav",
"wince": "ITRGWNCE.wav"
}
},
"harpy" :
{
"id": 72,
"level": 2,
"faction": "dungeon",
"abilities": [ [ "RETURN_AFTER_STRIKE", 0, 0, 0 ] ], //Harpies return after attack
"upgrades": ["harpyHag"],
"graphics" :
{
"animation": "CHARPY.DEF"
},
"sound" :
{
"attack": "HARPATTK.wav",
"defend": "HARPDFND.wav",
"killed": "HARPKILL.wav",
"move": "HARPMOVE.wav",
"shoot": "silence",
"wince": "HARPWNCE.wav"
}
},
"harpyHag" :
{
"id": 73,
"level": 2,
"faction": "dungeon",
"abilities": [ [ "RETURN_AFTER_STRIKE", 0, 0, 0 ], //Harpy Hags return after attack
[ "BLOCKS_RETALIATION", 0, 0, 0 ] ], //Harpy Hags
"graphics" :
{
"animation": "CHARPH.DEF"
},
"sound" :
{
"attack": "HHAGATTK.wav",
"defend": "HHAGDFND.wav",
"killed": "HHAGKILL.wav",
"move": "HHAGMOVE.wav",
"shoot": "HHAGSHOT.wav",
"wince": "HHAGWNCE.wav"
}
},
"beholder" :
{
"id": 74,
"level": 3,
"faction": "dungeon",
"upgrades": ["evilEye"],
"graphics" :
{
"animation": "CBEHOL.DEF",
"missile" :
{
"projectile": "SMBALX.DEF",
"spinning": false
}
},
"sound" :
{
"attack": "BHDRATTK.wav",
"defend": "BHDRDFND.wav",
"killed": "BHDRKILL.wav",
"move": "BHDRMOVE.wav",
"shoot": "BHDRSHOT.wav",
"wince": "BHDRWNCE.wav",
"ext1": "BHDRDETH.wav"
}
},
"evilEye" :
{
"id": 75,
"level": 3,
"faction": "dungeon",
"graphics" :
{
"animation": "CEVEYE.DEF",
"missile" :
{
"projectile": "SMBALX.DEF",
"spinning": false
}
},
"sound" :
{
"attack": "EVLIATTK.wav",
"defend": "EVLIDFND.wav",
"killed": "EVLIKILL.wav",
"move": "EVLIMOVE.wav",
"shoot": "EVLISHOT.wav",
"wince": "EVLIWNCE.wav",
"ext1": "EVLIDETH.wav"
}
},
"medusa" :
{
"id": 76,
"level": 4,
"faction": "dungeon",
"abilities": [ [ "SPELL_AFTER_ATTACK", 20, 70, 2000 ] ], //medusas //minotaurs
"upgrades": ["medusaQueen"],
"graphics" :
{
"animation": "CMEDUS.DEF",
"missile" :
{
"projectile": "PMEDUSX.DEF",
"spinning": false
}
},
"sound" :
{
"attack": "MEDUATTK.wav",
"defend": "MEDUDFND.wav",
"killed": "MEDUKILL.wav",
"move": "MEDUMOVE.wav",
"shoot": "MEDUSHOT.wav",
"wince": "MEDUWNCE.wav"
}
},
"medusaQueen" :
{
"id": 77,
"level": 4,
"faction": "dungeon",
"abilities": [ [ "SPELL_AFTER_ATTACK", 20, 70, 2000 ] ], //medusa queens //minotaur kings
"graphics" :
{
"animation": "CMEDUQ.DEF",
"missile" :
{
"projectile": "PMEDUSX.DEF",
"spinning": false
}
},
"sound" :
{
"attack": "MEDQATTK.wav",
"defend": "MEDQDFND.wav",
"killed": "MEDQKILL.wav",
"move": "MEDQMOVE.wav",
"shoot": "MEDQSHOT.wav",
"wince": "MEDQWNCE.wav"
}
},
"minotaur" :
{
"id": 78,
"level": 5,
"faction": "dungeon",
"abilities": [ [ "SELF_MORALE", 0, 0, 0 ] ],
"upgrades": ["minotaurKing"],
"graphics" :
{
"animation": "CMINOT.DEF"
},
"sound" :
{
"attack": "MINOATTK.wav",
"defend": "MINODFND.wav",
"killed": "MINOKILL.wav",
"move": "MINOMOVE.wav",
"wince": "MINOWNCE.wav"
}
},
"minotaurKing" :
{
"id": 79,
"level": 5,
"faction": "dungeon",
"abilities": [ [ "SELF_MORALE", 0, 0, 0 ] ],
"graphics" :
{
"animation": "CMINOK.DEF"
},
"sound" :
{
"attack": "MINKATTK.wav",
"defend": "MINKDFND.wav",
"killed": "MINKKILL.wav",
"move": "MINKMOVE.wav",
"shoot": "MINKSHOT.wav",
"wince": "MINKWNCE.wav"
}
},
"manticore" :
{
"id": 80,
"level": 6,
"faction": "dungeon",
"upgrades": ["scorpicore"],
"graphics" :
{
"animation": "CMCORE.DEF"
},
"sound" :
{
"attack": "MANTATTK.wav",
"defend": "MANTDFND.wav",
"killed": "MANTKILL.wav",
"move": "MANTMOVE.wav",
"shoot": "MANTSHOT.wav",
"wince": "MANTWNCE.wav"
}
},
"scorpicore" :
{
"id": 81,
"level": 6,
"faction": "dungeon",
"abilities": [ [ "SPELL_AFTER_ATTACK", 20, 74, 0 ] ], //scorpicore
"graphics" :
{
"animation": "CCMCOR.DEF"
},
"sound" :
{
"attack": "SCRPATTK.wav",
"defend": "SCRPDFND.wav",
"killed": "SCRPKILL.wav",
"move": "SCRPMOVE.wav",
"shoot": "SCRPSHOT.wav",
"wince": "SCRPWNCE.wav"
}
},
"redDragon" :
{
"id": 82,
"level": 7,
"faction": "dungeon",
"abilities": [ [ "DRAGON_NATURE", 0, 0, 0 ], //red dragon is a dragon
[ "TWO_HEX_ATTACK_BREATH", 0, 0, 0 ], //Red Dragon has breath attack
[ "LEVEL_SPELL_IMMUNITY", 3, 0, 0 ] ], //red dragon's spell immunity
"upgrades": ["blackDragon"],
"graphics" :
{
"animation": "CRDRGN.DEF"
},
"sound" :
{
"attack": "RDDRATTK.wav",
"defend": "RDDRDFND.wav",
"killed": "RDDRKILL.wav",
"move": "RDDRMOVE.wav",
"wince": "RDDRWNCE.wav"
}
},
"blackDragon" :
{
"id": 83,
"level": 7,
"faction": "dungeon",
"abilities": [ [ "DRAGON_NATURE", 0, 0, 0 ], //black dragon is a dragon
[ "TWO_HEX_ATTACK_BREATH", 0, 0, 0 ], //Black Dragon has breath attack
[ "HATE", 50, 41, 0 ], //Hate Titans
[ "HATE", 50, 40, 0 ], //Hate Giants
[ "LEVEL_SPELL_IMMUNITY", 5, 0, 0 ] ], //black dragon's spell immunity
"graphics" :
{
"animation": "CBDRGN.DEF"
},
"sound" :
{
"attack": "BKDRATTK.wav",
"defend": "BKDRDFND.wav",
"killed": "BKDRKILL.wav",
"move": "BKDRMOVE.wav",
"wince": "BKDRWNCE.wav"
}
}
}

View File

@ -0,0 +1,287 @@
{
"gnoll" :
{
"id": 98,
"level": 1,
"faction": "fortress",
"upgrades": ["gnollMarauder"],
"graphics" :
{
"animation": "CGNOLL.DEF"
},
"sound" :
{
"attack": "GNOLATTK.wav",
"defend": "GNOLDFND.wav",
"killed": "GNOLKILL.wav",
"move": "GNOLMOVE.wav",
"wince": "GNOLWNCE.wav"
}
},
"gnollMarauder" :
{
"id": 99,
"level": 1,
"faction": "fortress",
"graphics" :
{
"animation": "CGNOLM.DEF"
},
"sound" :
{
"attack": "GNLMATTK.wav",
"defend": "GNLMDFND.wav",
"killed": "GNLMKILL.wav",
"move": "GNLMMOVE.wav",
"wince": "GNLMWNCE.wav"
}
},
"lizardman" :
{
"id": 100,
"level": 2,
"extraNames": [ "primitiveLizardman", ],
"faction": "fortress",
"upgrades": ["lizardWarrior"],
"graphics" :
{
"animation": "CPLIZA.DEF",
"missile" :
{
"projectile": "PPLIZAX.DEF",
"spinning": false
}
},
"sound" :
{
"attack": "PLIZATTK.wav",
"defend": "PLIZDFND.wav",
"killed": "PLIZKILL.wav",
"move": "PLIZMOVE.wav",
"shoot": "PLIZSHOT.wav",
"wince": "PLIZWNCE.wav"
}
},
"lizardWarrior" :
{
"id": 101,
"level": 2,
"faction": "fortress",
"graphics" :
{
"animation": "CALIZA.DEF",
"missile" :
{
"projectile": "PPLIZAX.DEF",
"spinning": false
}
},
"sound" :
{
"attack": "ALIZATTK.wav",
"defend": "ALIZDFND.wav",
"killed": "ALIZKILL.wav",
"move": "ALIZMOVE.wav",
"shoot": "ALIZSHOT.wav",
"wince": "ALIZWNCE.wav"
}
},
"gorgon" :
{
"id": 102,
"level": 5,
"faction": "fortress",
"upgrades": ["mightyGorgon"],
"graphics" :
{
"animation": "CCGORG.DEF"
},
"sound" :
{
"attack": "CGORATTK.wav",
"defend": "CGORDFND.wav",
"killed": "CGORKILL.wav",
"move": "CGORMOVE.wav",
"wince": "CGORWNCE.wav"
}
},
"mightyGorgon" :
{
"id": 103,
"level": 5,
"faction": "fortress",
"abilities": [ [ "DEATH_STARE", 10, 0, 0 ] ], //mighty gorgons
"graphics" :
{
"animation": "CBGOG.DEF"
},
"sound" :
{
"attack": "BGORATTK.wav",
"defend": "BGORDFND.wav",
"killed": "BGORKILL.wav",
"move": "BGORMOVE.wav",
"wince": "BGORWNCE.wav"
}
},
"serpentFly" :
{
"id": 104,
"level": 3,
"extraNames": [ "dragonFly" ],
"faction": "fortress",
"abilities": [ [ "SPELL_AFTER_ATTACK", 100, 78, 0 ] ], //serpent fly
"upgrades": ["fireDragonFly"],
"graphics" :
{
"animation": "CDRFLY.DEF"
},
"sound" :
{
"attack": "DFLYATTK.wav",
"defend": "DFLYDFND.wav",
"killed": "DFLYKILL.wav",
"move": "DFLYMOVE.wav",
"wince": "DFLYWNCE.wav"
}
},
"fireDragonFly" : // dragonFly is correct in-game, incorrect in HOTRAITS
{
"id": 105,
"level": 3,
"faction": "fortress",
"abilities": [ [ "SPELL_AFTER_ATTACK", 100, 78, 0 ], //dragon fly
[ "SPELL_AFTER_ATTACK", 100, 45, 0 ] ], //mighty gorgons
"graphics" :
{
"animation": "CDRFIR.DEF"
},
"sound" :
{
"attack": "FDFLATTK.wav",
"defend": "FDFLDFND.wav",
"killed": "FDFLKILL.wav",
"move": "FDFLMOVE.wav",
"shoot": "FDFLSHOT.wav",
"wince": "FDFLWNCE.wav"
}
},
"basilisk" :
{
"id": 106,
"level": 4,
"faction": "fortress",
"abilities": [ [ "SPELL_AFTER_ATTACK", 20, 70, 0 ] ], //basilisks
"upgrades": ["greaterBasilisk"],
"graphics" :
{
"animation": "CBASIL.DEF"
},
"sound" :
{
"attack": "BASLATTK.wav",
"defend": "BASLDFND.wav",
"killed": "BASLKILL.wav",
"move": "BASLMOVE.wav",
"wince": "BASLWNCE.wav"
}
},
"greaterBasilisk" :
{
"id": 107,
"level": 4,
"faction": "fortress",
"abilities": [ [ "SPELL_AFTER_ATTACK", 20, 70, 0 ] ], //greater basilisks
"graphics" :
{
"animation": "CGBASI.DEF"
},
"sound" :
{
"attack": "GBASATTK.wav",
"defend": "GBASDFND.wav",
"killed": "GBASKILL.wav",
"move": "GBASMOVE.wav",
"wince": "GBASWNCE.wav"
}
},
"wyvern" :
{
"id": 108,
"level": 6,
"faction": "fortress",
"upgrades": ["wyvernMonarch"],
"graphics" :
{
"animation": "CWYVER.DEF"
},
"sound" :
{
"attack": "WYVNATTK.wav",
"defend": "WYVNDFND.wav",
"killed": "WYVNKILL.wav",
"move": "WYVNMOVE.wav",
"wince": "WYVNWNCE.wav"
}
},
"wyvernMonarch" :
{
"id": 109,
"level": 6,
"faction": "fortress",
"abilities": [ [ "SPELL_AFTER_ATTACK", 20, 71, 0 ] ], //Wyvern Monarch
"graphics" :
{
"animation": "CWYVMN.DEF"
},
"sound" :
{
"attack": "WYVMATTK.wav",
"defend": "WYVMDFND.wav",
"killed": "WYVMKILL.wav",
"move": "WYVMMOVE.wav",
"wince": "WYVMWNCE.wav"
}
},
"hydra" :
{
"id": 110,
"level": 7,
"faction": "fortress",
"abilities": [ [ "BLOCKS_RETALIATION", 0, 0, 0 ], //hydras
[ "ATTACKS_ALL_ADJACENT", 0, 0, 0 ] ], //hydras
"upgrades": ["chaosHydra"],
"graphics" :
{
"animation": "CHYDRA.DEF"
},
"sound" :
{
"attack": "HYDRATTK.wav",
"defend": "HYDRDFND.wav",
"killed": "HYDRKILL.wav",
"move": "HYDRMOVE.wav",
"wince": "HYDRWNCE.wav"
}
},
"chaosHydra" :
{
"id": 111,
"level": 7,
"faction": "fortress",
"abilities": [ [ "BLOCKS_RETALIATION", 0, 0, 0 ], //chaos hydras
[ "ATTACKS_ALL_ADJACENT", 0, 0, 0 ] ], //chaos hydras
"graphics" :
{
"animation": "CCHYDR.DEF"
},
"sound" :
{
"attack": "CHYDATTK.wav",
"defend": "CHYDDFND.wav",
"killed": "CHYDKILL.wav",
"move": "CHYDMOVE.wav",
"wince": "CHYDWNCE.wav"
}
}
}

View File

@ -0,0 +1,309 @@
{
"imp" :
{
"id": 42,
"level": 1,
"faction": "inferno",
"upgrades": ["familiar"],
"graphics" :
{
"animation": "CIMP.DEF"
},
"sound" :
{
"attack": "IMPPATTK.wav",
"defend": "IMPPDFND.wav",
"killed": "IMPPKILL.wav",
"move": "IMPPMOVE.wav",
"wince": "IMPPWNCE.wav"
}
},
"familiar" :
{
"id": 43,
"level": 1,
"faction": "inferno",
"abilities": [ [ "MANA_CHANNELING", 20, 0, 0 ] ], //familiars
"graphics" :
{
"animation": "CFAMIL.DEF"
},
"sound" :
{
"attack": "FMLRATTK.wav",
"defend": "FMLRDFND.wav",
"killed": "FMLRKILL.wav",
"move": "FMLRMOVE.wav",
"wince": "FMLRWNCE.wav"
}
},
"gog" :
{
"id": 44,
"level": 2,
"faction": "inferno",
"upgrades": ["magog"],
"graphics" :
{
"animation": "CGOG.DEF",
"missile" :
{
"projectile": "CPRGOGX.DEF",
"spinning": false
}
},
"sound" :
{
"attack": "GOGGATTK.wav",
"defend": "GOGGDFND.wav",
"killed": "GOGGKILL.wav",
"move": "GOGGMOVE.wav",
"shoot": "GOGGSHOT.wav",
"wince": "GOGGWNCE.wav",
"ext1": "GOGFLAME.wav"
}
},
"magog" :
{
"id": 45,
"level": 2,
"faction": "inferno",
"abilities": [ [ "SPELL_LIKE_ATTACK", 0, 21, 0 ] ], //magogs fire with fireballs
"graphics" :
{
"animation": "CMAGOG.DEF",
"missile" :
{
"projectile": "CPRGOGX.DEF",
"spinning": false
}
},
"sound" :
{
"attack": "MGOGATTK.wav",
"defend": "MGOGDFND.wav",
"killed": "MGOGKILL.wav",
"move": "MGOGMOVE.wav",
"shoot": "MGOGSHOT.wav",
"wince": "MGOGWNCE.wav",
"ext1": "GOGFLAME.wav"
}
},
"hellHound" :
{
"id": 46,
"level": 3,
"faction": "inferno",
"upgrades": ["cerberus"],
"ability_remove": [ "FLYING" ], //hell hound doesn't fly
"graphics" :
{
"animation": "CHHOUN.DEF"
},
"sound" :
{
"attack": "HHNDATTK.wav",
"defend": "HHNDDFND.wav",
"killed": "HHNDKILL.wav",
"move": "HHNDMOVE.wav",
"wince": "HHNDWNCE.wav"
}
},
"cerberus" :
{
"id": 47,
"level": 3,
"faction": "inferno",
"abilities": [ [ "THREE_HEADED_ATTACK", 0, 0, 0 ],
[ "BLOCKS_RETALIATION", 0, 0, 0 ] ],
"ability_remove": [ "FLYING" ], //cerberus doesn't fly
"graphics" :
{
"animation": "CCERBU.DEF"
},
"sound" :
{
"attack": "CERBATTK.wav",
"defend": "CERBDFND.wav",
"killed": "CERBKILL.wav",
"move": "CERBMOVE.wav",
"wince": "CERBWNCE.wav"
}
},
"demon" :
{
"id": 48,
"level": 4,
"faction": "inferno",
"upgrades": ["hornedDemon"],
"graphics" :
{
"animation": "COHDEM.DEF"
},
"sound" :
{
"attack": "SHDMATTK.wav",
"defend": "SHDMDFND.wav",
"killed": "SHDMKILL.wav",
"move": "SHDMMOVE.wav",
"wince": "SHDMWNCE.wav"
}
},
"hornedDemon" :
{
"id": 49,
"level": 4,
"faction": "inferno",
"graphics" :
{
"animation": "CTHDEM.DEF"
},
"sound" :
{
"attack": "DHDMATTK.wav",
"defend": "DHDMDFND.wav",
"killed": "DHDMKILL.wav",
"move": "DHDMMOVE.wav",
"wince": "DHDMWNCE.wav"
}
},
"pitFiend" :
{
"id": 50,
"level": 5,
"faction": "inferno",
"upgrades": ["pitLord"],
"graphics" :
{
"animation": "CPFIEN.DEF"
},
"sound" :
{
"attack": "PFNDATTK.wav",
"defend": "PFNDDFND.wav",
"killed": "PFNDKILL.wav",
"move": "PFNDMOVE.wav",
"wince": "PFNDWNCE.wav"
}
},
"pitLord" :
{
"id": 51,
"level": 5,
"faction": "inferno",
"abilities": [ [ "DAEMON_SUMMONING", 50, 48, 0 ],
[ "CASTS", 1, 0, 0] ], //pit lord
"graphics" :
{
"animation": "CPFOE.DEF"
},
"sound" :
{
"attack": "PFOEATTK.wav",
"defend": "PFOEDFND.wav",
"killed": "PFOEKILL.wav",
"move": "PFOEMOVE.wav",
"wince": "PFOEWNCE.wav"
}
},
"efreet" :
{
"id": 52,
"level": 6,
"faction": "inferno",
"abilities": [ [ "HATE", 50, 37, 0 ],
[ "HATE", 50, 36, 0 ],
[ "FLYING", 0, 0, 0 ], //efreeti hate master genies
[ "FIRE_IMMUNITY", 0, 0, 0 ] ], //efreeti hate genies
"upgrades": ["efreetSultan"],
"graphics" :
{
"animation": "CEFREE.DEF"
},
"sound" :
{
"attack": "EFRTATTK.wav",
"defend": "EFRTDFND.wav",
"killed": "EFRTKILL.wav",
"move": "EFRTMOVE.wav",
"wince": "EFRTWNCE.wav"
}
},
"efreetSultan" :
{
"id": 53,
"level": 6,
"faction": "inferno",
"abilities": [ [ "HATE", 50, 37, 0 ],
[ "HATE", 50, 36, 0 ],
[ "FLYING", 0, 0, 0 ], //efreet sultans hate master genies
[ "FIRE_SHIELD", 0, 36, 0 ], //efreet sultans hate genies
[ "FIRE_IMMUNITY", 0, 0, 0 ] ], //efreet sultan //Efreet Sultan
"graphics" :
{
"animation": "CEFRES.DEF"
},
"sound" :
{
"attack": "ESULATTK.wav",
"defend": "ESULDFND.wav",
"killed": "ESULKILL.wav",
"move": "ESULMOVE.wav",
"shoot": "ESULSHOT.wav",
"wince": "ESULWNCE.wav"
}
},
"devil" :
{
"id": 54,
"level": 7,
"faction": "inferno",
"ability_remove": [ "FLYING" ], //use teleport instead
"abilities": [ [ "HATE", 50, 13, 0 ],
[ "FLYING", 0, 1, 0], //teleport
[ "HATE", 50, 12, 0 ],
[ "ENEMY_LUCK_DECREASING", 1, 0, 0 ], //devils //devils hate archangles
[ "BLOCKS_RETALIATION", 0, 0, 0 ] ], //devils //devils hate angels
"upgrades": ["archDevil"],
"graphics" :
{
"animation": "CDEVIL.DEF"
},
"sound" :
{
"attack": "DEVLATTK.wav",
"defend": "DEVLDFND.wav",
"killed": "DEVLKILL.wav",
"move": "DEVLMOVE.wav",
"wince": "DEVLWNCE.wav",
"ext1": "DEVLEXT1.wav",
"ext2": "DEVLEXT2.wav"
}
},
"archDevil" :
{
"id": 55,
"level": 7,
"faction": "inferno",
"ability_remove": [ "FLYING" ], //use teleport instead
"abilities": [ [ "HATE", 50, 13, 0 ],
[ "HATE", 50, 12, 0 ],
[ "FLYING", 0, 1, 0],
[ "ENEMY_LUCK_DECREASING", 1, 0, 0 ], //archdevils //archdevils hate archangles
[ "BLOCKS_RETALIATION", 0, 0, 0 ] ], //archdevils //archdevils hate angels
"graphics" :
{
"animation": "CADEVL.DEF"
},
"sound" :
{
"attack": "ADVLATTK.wav",
"defend": "ADVLDFND.wav",
"killed": "ADVLKILL.wav",
"move": "ADVLMOVE.wav",
"wince": "ADVLWNCE.wav",
"startMoving": "ADVLEXT1.wav",
"stopMoving": "ADVLEXT2.wav"
}
}
}

View File

@ -0,0 +1,294 @@
{
"skeleton" :
{
"id": 56,
"level": 1,
"faction": "necropolis",
"upgrades": ["skeletonWarrior"],
"graphics" :
{
"animation": "CSKELE.DEF"
},
"sound" :
{
"attack": "SKELATTK.wav",
"defend": "SKELDFND.wav",
"killed": "SKELKILL.wav",
"move": "SKELMOVE.wav",
"wince": "SKELWNCE.wav"
}
},
"skeletonWarrior" :
{
"id": 57,
"level": 1,
"faction": "necropolis",
"graphics" :
{
"animation": "CWSKEL.DEF"
},
"sound" :
{
"attack": "SKLWATTK.wav",
"defend": "SKLWDFND.wav",
"killed": "SKLWKILL.wav",
"move": "SKLWMOVE.wav",
"wince": "SKLWWNCE.wav"
}
},
"walkingDead" :
{
"id": 58,
"level": 2,
"extraNames": [ "zombie" ], //FIXME: zombie is a name of upgrade but not in HOTRAITS
"faction" : "necropolis",
"upgrades": ["zombieLord"],
"graphics" :
{
"animation": "CZOMBI.DEF"
},
"sound" :
{
"attack": "ZOMBATTK.wav",
"defend": "ZOMBDFND.wav",
"killed": "ZOMBKILL.wav",
"move": "ZOMBMOVE.wav",
"wince": "ZOMBWNCE.wav"
}
},
"zombieLord" : //FIXME: zombie is a correct in-name but not in HOTRAITS.TXT
{
"id": 59,
"level": 2,
"faction": "necropolis",
"graphics" :
{
"animation": "CZOMLO.DEF"
},
"sound" :
{
"attack": "ZMBLATTK.wav",
"defend": "ZMBLDFND.wav",
"killed": "ZMBLKILL.wav",
"move": "ZMBLMOVE.wav",
"wince": "ZMBLWNCE.wav"
}
},
"wight" :
{
"id": 60,
"level": 3,
"faction": "necropolis",
"abilities": [ [ "FULL_HP_REGENERATION", 0, 1, 0 ] ], //wight
"upgrades": ["wraith"],
"graphics" :
{
"animation": "CWIGHT.DEF"
},
"sound" :
{
"attack": "WGHTATTK.wav",
"defend": "WGHTDFND.wav",
"killed": "WGHTKILL.wav",
"move": "WGHTMOVE.wav",
"wince": "WGHTWNCE.wav"
}
},
"wraith" :
{
"id": 61,
"level": 3,
"faction": "necropolis",
"abilities": [ [ "FULL_HP_REGENERATION", 0, 1, 0 ], //wraith
[ "MANA_DRAIN", 2, 0, 0 ] ],
"graphics" :
{
"animation": "CWRAIT.DEF"
},
"sound" :
{
"attack": "WRTHATTK.wav",
"defend": "WRTHDFND.wav",
"killed": "WRTHKILL.wav",
"move": "WRTHMOVE.wav",
"wince": "WRTHWNCE.wav"
}
},
"vampire" :
{
"id": 62,
"level": 4,
"faction": "necropolis",
"abilities": [ [ "BLOCKS_RETALIATION", 0, 0, 0 ] ], //vampires //vampire lords
"upgrades": ["vampireLord"],
"graphics" :
{
"animation": "CVAMP.DEF"
},
"sound" :
{
"attack": "VAMPATTK.wav",
"defend": "VAMPDFND.wav",
"killed": "VAMPKILL.wav",
"move": "VAMPMOVE.wav",
"wince": "VAMPWNCE.wav",
"startMoving": "VAMPEXT1.wav",
"stopMoving": "VAMPEXT2.wav"
}
},
"vampireLord" :
{
"id": 63,
"level": 4,
"faction": "necropolis",
"abilities": [ [ "LIFE_DRAIN", 0, 0, 0 ],
[ "BLOCKS_RETALIATION", 0, 0, 0 ] ], //vampire lords
"graphics" :
{
"animation": "CNOSFE.DEF"
},
"sound" :
{
"attack": "NOSFATTK.wav",
"defend": "NOSFDFND.wav",
"killed": "NOSFKILL.wav",
"move": "NOSFMOVE.wav",
"shoot": "NOSFSHOT.wav",
"wince": "NOSFWNCE.wav",
"ext1": "NOSFEXT1.wav",
"ext2": "NOSFEXT2.wav"
}
},
"lich" :
{
"id": 64,
"level": 5,
"faction": "necropolis",
"abilities": [ [ "SPELL_LIKE_ATTACK", 0, 76, 0 ] ], //liches
"upgrades": ["powerLich"],
"graphics" :
{
"animation": "CLICH.DEF",
"missile" :
{
"projectile": "PLICH.DEF",
"spinning": false
}
},
"sound" :
{
"attack": "LICHATTK.wav",
"defend": "LICHDFND.wav",
"killed": "LICHKILL.wav",
"move": "LICHMOVE.wav",
"shoot": "LICHSHOT.wav",
"wince": "LICHWNCE.wav",
"ext1": "LICHATK2.wav"
}
},
"powerLich" :
{
"id": 65,
"level": 5,
"faction": "necropolis",
"abilities": [ [ "SPELL_LIKE_ATTACK", 0, 76, 0 ] ], //power liches
"graphics" :
{
"animation": "CPLICH.DEF",
"missile" :
{
"projectile": "PLICH.DEF",
"spinning": false
}
},
"sound" :
{
"attack": "PLCHATTK.wav",
"defend": "PLCHDFND.wav",
"killed": "PLCHKILL.wav",
"move": "PLCHMOVE.wav",
"shoot": "PLCHSHOT.wav",
"wince": "PLCHWNCE.wav"
}
},
"blackKnight" :
{
"id": 66,
"level": 6,
"faction": "necropolis",
"abilities": [ [ "SPELL_AFTER_ATTACK", 20, 42, 0 ] ], //black knights
"upgrades": ["dreadKnight"],
"graphics" :
{
"animation": "CBKNIG.DEF"
},
"sound" :
{
"attack": "BKNTATTK.wav",
"defend": "BKNTDFND.wav",
"killed": "BKNTKILL.wav",
"move": "BKNTMOVE.wav",
"wince": "BKNTWNCE.wav"
}
},
"dreadKnight" :
{
"id": 67,
"level": 6,
"faction": "necropolis",
"abilities": [ [ "SPELL_AFTER_ATTACK", 20, 42, 0 ], //dread knights
[ "DOUBLE_DAMAGE_CHANCE", 20, 0, 0 ] ], //vampire lords
"graphics" :
{
"animation": "CBLORD.DEF"
},
"sound" :
{
"attack": "BLRDATTK.wav",
"defend": "BLRDDFND.wav",
"killed": "BLRDKILL.wav",
"move": "BLRDMOVE.wav",
"wince": "BLRDWNCE.wav"
}
},
"boneDragon" :
{
"id": 68,
"level": 7,
"faction": "necropolis",
"abilities": [ [ "DRAGON_NATURE", 0, 0, 0 ] ], //bone dragon is a dragon
"upgrades": ["ghostDragon"],
"graphics" :
{
"animation": "CNDRGN.DEF"
},
"sound" :
{
"attack": "BODRATTK.wav",
"defend": "BODRDFND.wav",
"killed": "BODRKILL.wav",
"move": "BODRMOVE.wav",
"wince": "BODRWNCE.wav"
}
},
"ghostDragon" :
{
"id": 69,
"level": 7,
"faction": "necropolis",
"abilities": [ [ "DRAGON_NATURE", 0, 0, 0 ], //ghost dragon is a dragon
[ "SPELL_AFTER_ATTACK", 20, 75, 0 ] ], //ghost dragon
"graphics" :
{
"animation": "CHDRGN.DEF"
},
"sound" :
{
"attack": "GHDRATTK.wav",
"defend": "GHDRDFND.wav",
"killed": "GHDRKILL.wav",
"move": "GHDRMOVE.wav",
"wince": "GHDRWNCE.wav"
}
}
}

View File

@ -0,0 +1,333 @@
// Neutral creatures as in SoD
{
"goldGolem" :
{
"id": 116,
"level": 4,
"faction": "neutral",
"abilities": [ [ "SPELL_DAMAGE_REDUCTION", 85, -1, 0 ], //gold golems reduce dmg from spells
[ "NON_LIVING", 0, 0, 0 ] ], //diamond golems are non-living
"graphics" :
{
"animation": "CGGOLE.DEF"
},
"sound" :
{
"attack": "GGLMATTK.wav",
"defend": "GGLMDFND.wav",
"killed": "GGLMKILL.wav",
"move": "GGLMMOVE.wav",
"wince": "GGLMWNCE.wav"
}
},
"diamondGolem" :
{
"id": 117,
"level": 5,
"faction": "neutral",
"abilities": [ [ "SPELL_DAMAGE_REDUCTION", 95, -1, 0 ], //diamond golems reduce dmg from spells
[ "NON_LIVING", 0, 0, 0 ] ], //psychic elementals shouldn't get morale
"graphics" :
{
"animation": "CDGOLE.DEF"
},
"sound" :
{
"attack": "DGLMATTK.wav",
"defend": "DGLMDFND.wav",
"killed": "DGLMKILL.wav",
"move": "DGLMMOVE.wav",
"wince": "DGLMWNCE.wav"
}
},
"azureDragon" :
{
"id": 132,
"level": 10,
"faction": "neutral",
"abilities": [ [ "DRAGON_NATURE", 0, 0, 0 ],
[ "TWO_HEX_ATTACK_BREATH", 0, 0, 0 ], //azure dragon's breath
[ "FEARLESS", 0, 0, 0 ], //azure dragon is immune to fear
[ "LEVEL_SPELL_IMMUNITY", 3, 0, 0 ], //immunity spell levels 1-3
[ "FEAR", 0, 0, 0]], //azure dragon is a dragon
"graphics" :
{
"animation": "CADRGN.DEF"
},
"sound" :
{
"attack": "AZURATTK.wav",
"defend": "AZURDFND.wav",
"killed": "AZURKILL.wav",
"move": "AZURMOVE.wav",
"wince": "AZURWNCE.wav"
}
},
"crystalDragon" :
{
"id": 133,
"level": 10,
"faction": "neutral",
"abilities": [ [ "DRAGON_NATURE", 0, 0, 0 ] ], //crystal dragon is a dragon
"ability_remove": [ "FLYING" ],
"graphics" :
{
"animation": "CCDRGN.DEF"
},
"sound" :
{
"attack": "CRYSATTK.wav",
"defend": "CRYSDFND.wav",
"killed": "CRYSKILL.wav",
"move": "CRYSMOVE.wav",
"wince": "CRYSWNCE.wav"
}
},
"fairieDragon" :
{
"id": 134,
"level": 8,
"faction": "neutral",
"abilities": [ [ "DRAGON_NATURE", 0, 0, 0 ], //faerie dragon is a dragon
[ "CASTS", 5, 0, 0 ],
[ "CREATURE_SPELL_POWER", 500, 0, 0], //5 spell power per dragon
[ "SPELLCASTER", 2, 15, 10 ], //magic arrow
[ "SPELLCASTER", 2, 16, 22 ], //ice bolt
[ "SPELLCASTER", 2, 17, 22 ], //thunderbolt
[ "SPELLCASTER", 2, 19, 5 ], //chain lightning
[ "SPELLCASTER", 2, 20, 10 ], //frost ring
[ "SPELLCASTER", 2, 21, 21 ], //fireball
[ "SPELLCASTER", 2, 22, 5 ], //inferno
[ "SPELLCASTER", 2, 23, 5 ]], //meteor shower
"graphics" :
{
"animation": "CFDRGN.DEF"
},
"sound" :
{
"attack": "FAERATTK.wav",
"defend": "FAERDFND.wav",
"killed": "FAERKILL.wav",
"move": "FAERMOVE.wav",
"shoot": "FAERSHOT.wav",
"wince": "FAERWNCE.wav"
}
},
"rustDragon" :
{
"id": 135,
"level": 10,
"faction": "neutral",
"abilities": [ [ "SPELL_AFTER_ATTACK", 100, 80, 0 ], //always reduce defense
[ "ACID_BREATH", 25, 0, 20 ], //20% chance to do 25 damage
[ "DRAGON_NATURE", 0, 0, 0 ] ], //rust dragon is a dragon
"graphics" :
{
"animation": "CRSDGN.DEF"
},
"sound" :
{
"attack": "RUSTATTK.wav",
"defend": "RUSTDFND.wav",
"killed": "RUSTKILL.wav",
"move": "RUSTMOVE.wav",
"wince": "RUSTWNCE.wav"
}
},
"enchanter" :
{
"id": 136,
"level": 6,
"extraNames": [ "enchanters" ],
"faction": "neutral",
"abilities": [ [ "NO_WALL_PENALTY", 0, 0, 0 ],
[ "ENCHANTER", 3, 28, 3], //air shield
[ "ENCHANTER", 3, 41, 3], //bless
[ "ENCHANTER", 3, 45, 3], //wealness
[ "ENCHANTER", 3, 46, 3], //stone skin
[ "ENCHANTER", 3, 53, 3], //slow
[ "ENCHANTER", 3, 54, 3], //haster
[ "CASTS", 5, 0, 0]], //Enchanter
"graphics" :
{
"animation": "CENCH.DEF",
"missile" :
{
"projectile": "SMBALX.DEF",
"spinning": false
}
},
"sound" :
{
"attack": "ENCHATTK.wav",
"defend": "ENCHDFND.wav",
"killed": "ENCHKILL.wav",
"move": "ENCHMOVE.wav",
"shoot": "ENCHSHOT.wav",
"wince": "ENCHWNCE.wav"
}
},
"sharpshooter" :
{
"id": 137,
"level": 4,
"extraNames": [ "sharpshooters" ],
"faction": "neutral",
"abilities": [ [ "NO_WALL_PENALTY", 0, 0, 0 ],
[ "NO_DISTANCE_PENALTY", 0, 0, 0 ] ], //Sharpshooter
"graphics" :
{
"animation": "CSHARP.DEF",
"missile" :
{
"projectile": "PELFX.DEF",
"spinning": false
}
},
"sound" :
{
"attack": "HCRSATTK.wav",
"defend": "HCRSDFND.wav",
"killed": "HCRSKILL.wav",
"move": "HCRSMOVE.wav",
"shoot": "HCRSSHOT.wav",
"wince": "HCRSWNCE.wav"
}
},
"halfling" :
{
"id": 138,
"level": 1,
"faction": "neutral",
"graphics" :
{
"animation": "CHALF.DEF",
"missile" :
{
"projectile": "PHALF.DEF",
"spinning": true
}
},
"sound" :
{
"attack": "HALFATTK.wav",
"defend": "HALFDFND.wav",
"killed": "HALFKILL.wav",
"move": "HALFMOVE.wav",
"shoot": "HALFSHOT.wav",
"wince": "HALFWNCE.wav"
}
},
"peasant" :
{
"id": 139,
"level": 1,
"faction": "neutral",
"graphics" :
{
"animation": "CPEAS.DEF"
},
"sound" :
{
"attack": "PSNTATTK.wav",
"defend": "PSNTDFND.wav",
"killed": "PSNTKILL.wav",
"move": "PSNTMOVE.wav",
"wince": "PSNTWNCE.wav"
}
},
"boar" :
{
"id": 140,
"level": 2,
"faction": "neutral",
"abilities": [ [ "DOUBLE_WIDE", 0, 0, 0 ] ], //boar should be treated as double-wide
"graphics" :
{
"animation": "CBOAR.DEF"
},
"sound" :
{
"attack": "BOARATTK.wav",
"defend": "BOARDFND.wav",
"killed": "BOARKILL.wav",
"move": "BOARMOVE.wav",
"wince": "BOARWNCE.wav"
}
},
"mummy" :
{
"id": 141,
"level": 3,
"faction": "neutral",
"abilities": [ [ "UNDEAD", 0, 0, 0 ] ],
"graphics" :
{
"animation": "CMUMMY.DEF"
},
"sound" :
{
"attack": "MUMYATTK.wav",
"defend": "MUMYDFND.wav",
"killed": "MUMYKILL.wav",
"move": "MUMYMOVE.wav",
"wince": "MUMYWNCE.wav"
}
},
"nomad" :
{
"id": 142,
"level": 3,
"faction": "neutral",
"abilities": [ [ "DOUBLE_WIDE", 0, 0, 0 ] ], //nomads should be treated as double-wide
"graphics" :
{
"animation": "CNOMAD.DEF"
},
"sound" :
{
"attack": "NMADATTK.wav",
"defend": "NMADDFND.wav",
"killed": "NMADKILL.wav",
"move": "NMADMOVE.wav",
"wince": "NMADWNCE.wav"
}
},
"rogue" :
{
"id": 143,
"level": 2,
"faction": "neutral",
"graphics" :
{
"animation": "CROGUE.DEF"
},
"sound" :
{
"attack": "ROGUATTK.wav",
"defend": "ROGUDFND.wav",
"killed": "ROGUKILL.wav",
"move": "ROGUMOVE.wav",
"wince": "ROGUWNCE.wav"
}
},
"troll" :
{
"id": 144,
"level": 5,
"faction": "neutral",
"abilities": [ [ "FULL_HP_REGENERATION", 0, 0, 0 ] ], //troll
"graphics" :
{
"animation": "CTROLL.DEF"
},
"sound" :
{
"attack": "TRLLATTK.wav",
"defend": "TRLLDFND.wav",
"killed": "TRLLKILL.wav",
"move": "TRLLMOVE.wav",
"wince": "TRLLWNCE.wav"
}
}
}

View File

@ -0,0 +1,291 @@
{
"centaur" :
{
"id": 14,
"level": 1,
"faction": "rampart",
"upgrades": ["centaurCaptain"],
"graphics" :
{
"animation": "CCENTR.DEF"
},
"sound" :
{
"attack": "CNTRATTK.wav",
"defend": "CNTRDFND.wav",
"killed": "CNTRKILL.wav",
"move": "CNTRMOVE.wav",
"shoot": "CNTRSHOT.wav",
"wince": "CNTRWNCE.wav"
}
},
"centaurCaptain" :
{
"id": 15,
"level": 1,
"faction": "rampart",
"graphics" :
{
"animation": "CECENT.DEF"
},
"sound" :
{
"attack": "ECNTATTK.wav",
"defend": "ECNTDFND.wav",
"killed": "ECNTKILL.wav",
"move": "ECNTMOVE.wav",
"wince": "ECNTWNCE.wav"
}
},
"dwarf" :
{
"id": 16,
"level": 2,
"faction": "rampart",
"abilities": [ [ "MAGIC_RESISTANCE", 20, 0, 0 ] ], //dwarf's magic resistance 20%
"upgrades": ["battleDwarf"],
"graphics" :
{
"animation": "CDWARF.DEF"
},
"sound" :
{
"attack": "DWRFATTK.wav",
"defend": "DWRFDFND.wav",
"killed": "DWRFKILL.wav",
"move": "DWRFMOVE.wav",
"wince": "DWRFWNCE.wav"
}
},
"battleDwarf" :
{
"id": 17,
"level": 2,
"faction": "rampart",
"abilities": [ [ "MAGIC_RESISTANCE", 40, 0, 0 ] ], //battle dwarf's magic resistance 40%
"graphics" :
{
"animation": "CBDWAR.DEF"
},
"sound" :
{
"attack": "BDRFATTK.wav",
"defend": "BDRFDFND.wav",
"killed": "BDRFKILL.wav",
"move": "BDRFMOVE.wav",
"wince": "BDRFWNCE.wav"
}
},
"woodElf" :
{
"id": 18,
"level": 3,
"faction": "rampart",
"upgrades": ["grandElf"],
"graphics" :
{
"animation": "CELF.DEF",
"missile" :
{
"projectile": "PELFX.DEF",
"spinning": false
}
},
"sound" :
{
"attack": "WELFATTK.wav",
"defend": "WELFDFND.wav",
"killed": "WELFKILL.wav",
"move": "WELFMOVE.wav",
"shoot": "WELFSHOT.wav",
"wince": "WELFWNCE.wav"
}
},
"grandElf" :
{
"id": 19,
"level": 3,
"faction": "rampart",
"graphics" :
{
"animation": "CGRELF.DEF",
"missile" :
{
"projectile": "PELFX.DEF",
"spinning": false
}
},
"sound" :
{
"attack": "GELFATTK.wav",
"defend": "GELFDFND.wav",
"killed": "GELFKILL.wav",
"move": "GELFMOVE.wav",
"shoot": "GELFSHOT.wav",
"wince": "GELFWNCE.wav"
}
},
"pegasus" :
{
"id": 20,
"level": 4,
"faction": "rampart",
"abilities": [ [ "CHANGES_SPELL_COST_FOR_ENEMY", 2, 0, 0 ] ], //pegasus makes spell cost higher for enemy mage
"upgrades": ["silverPegasus"],
"graphics" :
{
"animation": "CPEGAS.DEF"
},
"sound" :
{
"attack": "PEGAATTK.wav",
"defend": "PEGADFND.wav",
"killed": "PEGAKILL.wav",
"move": "PEGAMOVE.wav",
"wince": "PEGAWNCE.wav"
}
},
"silverPegasus" :
{
"id": 21,
"level": 4,
"faction": "rampart",
"abilities": [ [ "CHANGES_SPELL_COST_FOR_ENEMY", 2, 0, 0 ] ], //silver pegasus makes spell cost higher for enemy mage
"graphics" :
{
"animation": "CAPEGS.DEF"
},
"sound" :
{
"attack": "APEGATTK.wav",
"defend": "APEGDFND.wav",
"killed": "APEGKILL.wav",
"move": "APEGMOVE.wav",
"wince": "APEGWNCE.wav"
}
},
"dendroidGuard" :
{
"id": 22,
"level": 5,
"faction": "rampart",
"abilities": [ [ "SPELL_AFTER_ATTACK", 100, 72, 0 ] ], //dendroids cast bind
"upgrades": ["dendroidSoldier"],
"graphics" :
{
"animation": "CTREE.DEF"
},
"sound" :
{
"attack": "TREEATTK.wav",
"defend": "TREEDFND.wav",
"killed": "TREEKILL.wav",
"move": "TREEMOVE.wav",
"wince": "TREEWNCE.wav"
}
},
"dendroidSoldier" :
{
"id": 23,
"level": 5,
"faction": "rampart",
"abilities": [ [ "SPELL_AFTER_ATTACK", 100, 72, 0 ] ], //dendroid guards cast bind
"graphics" :
{
"animation": "CBTREE.DEF"
},
"sound" :
{
"attack": "BTREATTK.wav",
"defend": "BTREDFND.wav",
"killed": "BTREKILL.wav",
"move": "BTREMOVE.wav",
"wince": "BTREWNCE.wav"
}
},
"unicorn" :
{
"id": 24,
"level": 6,
"faction": "rampart",
"abilities": [ [ "SPELL_RESISTANCE_AURA", 0, 55, 0 ], //unicorn
[ "SPELL_AFTER_ATTACK", 20, 62, 0 ] ], //unicorns cast blind with 20% probability
"upgrades": ["warUnicorn"],
"graphics" :
{
"animation": "CUNICO.DEF"
},
"sound" :
{
"attack": "UNICATTK.wav",
"defend": "UNICDFND.wav",
"killed": "UNICKILL.wav",
"move": "UNICMOVE.wav",
"wince": "UNICWNCE.wav"
}
},
"warUnicorn" :
{
"id": 25,
"level": 6,
"faction": "rampart",
"abilities": [ [ "SPELL_RESISTANCE_AURA", 20, 55, 0 ], //war unicorn
[ "SPELL_AFTER_ATTACK", 20, 62, 0 ] ], //war unicorns cast blind with 20% probability
"graphics" :
{
"animation": "CWUNIC.DEF"
},
"sound" :
{
"attack": "WUNCATTK.wav",
"defend": "WUNCDFND.wav",
"killed": "WUNCKILL.wav",
"move": "WUNCMOVE.wav",
"shoot": "WUNCSHOT.wav",
"wince": "WUNCWNCE.wav"
}
},
"greenDragon" :
{
"id": 26,
"level": 7,
"faction": "rampart",
"abilities": [ [ "DRAGON_NATURE", 0, 0, 0 ], //green dragon is a dragon
[ "TWO_HEX_ATTACK_BREATH", 0, 0, 0 ], //green dragon's breath
[ "LEVEL_SPELL_IMMUNITY", 3, 0, 0 ] ], //green dragon's spell immunity
"upgrades": ["goldDragon"],
"graphics" :
{
"animation": "CGDRAG.DEF"
},
"sound" :
{
"attack": "GRDRATTK.wav",
"defend": "GRDRDFND.wav",
"killed": "GRDRKILL.wav",
"move": "GRDRMOVE.wav",
"wince": "GRDRWNCE.wav"
}
},
"goldDragon" :
{
"id": 27,
"level": 7,
"faction": "rampart",
"abilities": [ [ "DRAGON_NATURE", 0, 0, 0 ], //gold dragon is a dragon
[ "TWO_HEX_ATTACK_BREATH", 0, 0, 0 ], //gold dragon's breath
[ "LEVEL_SPELL_IMMUNITY", 4, 0, 0 ] ], //gold dragon's spell immunity
"graphics" :
{
"animation": "CDDRAG.DEF"
},
"sound" :
{
"attack": "GODRATTK.wav",
"defend": "GODRDFND.wav",
"killed": "GODRKILL.wav",
"move": "GODRMOVE.wav",
"wince": "GODRWNCE.wav"
}
}
}

View File

@ -0,0 +1,122 @@
{
// Several unused in H3 creatures
// TODO: better way to disable them
"unused122" :
{
"faction": "neutral",
"special" : true,
"id" : 122
},
"unused124" :
{
"faction": "neutral",
"special" : true,
"id" : 124
},
"unused126" :
{
"faction": "neutral",
"special" : true,
"id" : 126
},
"unused128" :
{
"faction": "neutral",
"special" : true,
"id" : 128
},
"catapult" :
{
"special" : true,
"id": 145,
"level": 0,
"faction": "neutral",
"graphics" :
{
"animation": "SMCATA.DEF",
"missile" :
{
"projectile": "SMCATX.DEF",
"spinning": true
}
},
"sound" :
{
"killed": "CATAKILL.wav",
"shoot": "CATASHOT.wav",
"wince": "CATAWNCE.wav"
}
},
"ballista" :
{
"special" : true,
"id": 146,
"level": 0,
"faction": "neutral",
"graphics" :
{
"animation": "SMBAL.DEF",
"missile" :
{
"projectile": "SMBALX.DEF",
"spinning": false
}
},
"sound" :
{
"killed": "BALLKILL.wav",
"shoot": "BALLSHOT.wav",
"wince": "BALLWNCE.wav"
}
},
"firstAidTent" :
{
"special" : true,
"id": 147,
"level": 0,
"faction": "neutral",
"abilities": [ [ "HEALER", 0, 0, 0 ] ],
"graphics" :
{
"animation": "SMTENT.DEF"
},
"sound" :
{
"killed": "FAIDKILL.wav",
"wince": "FAIDWNCE.wav"
}
},
"ammoCart" :
{
"special" : true,
"id": 148,
"level": 0,
"faction": "neutral",
"abilities": [ [ "NOT_ACTIVE", 0, 0, 0 ] ],
"graphics" :
{
"animation": "SMCART.DEF"
},
"sound" :
{
"killed": "CARTKILL.wav",
"wince": "CARTWNCE.wav"
}
},
"arrowTower" :
{
"special" : true,
"id": 149,
"level": 0,
"faction": "neutral",
"abilities": [ [ "SHOOTER", 0, 0, 0 ] ],
"graphics" :
{
"missile" :
{
"projectile": "SMBALX.DEF", //workaround for crash
}
}
}
}

View File

@ -0,0 +1,295 @@
{
"goblin" :
{
"id": 84,
"level": 1,
"extraNames": [ "goblins" ],
"faction": "stronghold",
"upgrades": ["hobgoblin"],
"graphics" :
{
"animation": "CGOBLI.DEF"
},
"sound" :
{
"attack": "GBLNATTK.wav",
"defend": "GBLNDFND.wav",
"killed": "GBLNKILL.wav",
"move": "GBLNMOVE.wav",
"wince": "GBLNWNCE.wav"
}
},
"hobgoblin" :
{
"id": 85,
"level": 1,
"faction": "stronghold",
"graphics" :
{
"animation": "CHGOBL.DEF"
},
"sound" :
{
"attack": "HGOBATTK.wav",
"defend": "HGOBDFND.wav",
"killed": "HGOBKILL.wav",
"move": "HGOBMOVE.wav",
"wince": "HGOBWNCE.wav"
}
},
"goblinWolfRider" :
{
"id": 86,
"level": 2,
"faction": "stronghold",
"upgrades": ["hobgoblinWolfRider"],
"graphics" :
{
"animation": "CBWLFR.DEF"
},
"sound" :
{
"attack": "GWRDATTK.wav",
"defend": "GWRDDFND.wav",
"killed": "GWRDKILL.wav",
"move": "GWRDMOVE.wav",
"wince": "GWRDWNCE.wav"
}
},
"hobgoblinWolfRider" :
{
"id": 87,
"level": 2,
"faction": "stronghold",
"abilities": [ [ "ADDITIONAL_ATTACK", 1, 0, 0 ] ], //wolf raider
"graphics" :
{
"animation": "CUWLFR.DEF"
},
"sound" :
{
"attack": "HGWRATTK.wav",
"defend": "HGWRDFND.wav",
"killed": "HGWRKILL.wav",
"move": "HGWRMOVE.wav",
"wince": "HGWRWNCE.wav"
}
},
"orc" :
{
"id": 88,
"level": 3,
"faction": "stronghold",
"upgrades": ["orcChieftain"],
"graphics" :
{
"animation": "CORC.DEF",
"missile" :
{
"projectile": "PORCHX.DEF",
"spinning": true
}
},
"sound" :
{
"attack": "OORCATTK.wav",
"defend": "OORCDFND.wav",
"killed": "OORCKILL.wav",
"move": "OORCMOVE.wav",
"shoot": "OORCSHOT.wav",
"wince": "OORCWNCE.wav"
}
},
"orcChieftain" :
{
"id": 89,
"level": 3,
"faction": "stronghold",
"graphics" :
{
"animation": "CORCCH.DEF",
"missile" :
{
"projectile": "PORCHX.DEF",
"spinning": true
}
},
"sound" :
{
"attack": "ORCCATTK.wav",
"defend": "ORCCDFND.wav",
"killed": "ORCCKILL.wav",
"move": "ORCCMOVE.wav",
"shoot": "ORCCSHOT.wav",
"wince": "ORCCWNCE.wav"
}
},
"ogre" :
{
"id": 90,
"level": 4,
"faction": "stronghold",
"upgrades": ["ogreMage"],
"graphics" :
{
"animation": "COGRE.DEF"
},
"sound" :
{
"attack": "OGREATTK.wav",
"defend": "OGREDFND.wav",
"killed": "OGREKILL.wav",
"move": "OGREMOVE.wav",
"wince": "OGREWNCE.wav"
}
},
"ogreMage" :
{
"id": 91,
"level": 4,
"faction": "stronghold",
"abilities": [ [ "SPELLCASTER", 2, 43, 0 ],
[ "CASTS", 3, 0, 0],
[ "CREATURE_ENCHANT_POWER", 3, 0, 0]], //ogre magi cast bloodlust
"graphics" :
{
"animation": "COGMAG.DEF"
},
"sound" :
{
"attack": "OGRMATTK.wav",
"defend": "OGRMDFND.wav",
"killed": "OGRMKILL.wav",
"move": "OGRMMOVE.wav",
"shoot": "OGRMSHOT.wav",
"wince": "OGRMWNCE.wav"
}
},
"roc" :
{
"id": 92,
"level": 5,
"faction": "stronghold",
"upgrades": ["thunderbird"],
"graphics" :
{
"animation": "CROC.DEF"
},
"sound" :
{
"attack": "ROCCATTK.wav",
"defend": "ROCCDFND.wav",
"killed": "ROCCKILL.wav",
"move": "ROCCMOVE.wav",
"wince": "ROCCWNCE.wav"
}
},
"thunderbird" :
{
"id": 93,
"level": 5,
"faction": "stronghold",
"abilities": [ [ "SPECIFIC_SPELL_POWER", 10, 77, 0 ], //10 damage per unit
[ "SPELL_AFTER_ATTACK", 20, 77, 0 ] ], //thunderbirds
"graphics" :
{
"animation": "CTBIRD.DEF"
},
"sound" :
{
"attack": "TBRDATTK.wav",
"defend": "TBRDDFND.wav",
"killed": "TBRDKILL.wav",
"move": "TBRDMOVE.wav",
"wince": "TBRDWNCE.wav"
}
},
"cyclop" :
{
"id": 94,
"level": 6,
"faction": "stronghold",
"upgrades": ["cyclopKing"],
"graphics" :
{
"animation": "CCYCLR.DEF",
"missile" :
{
"projectile": "PCYCLBX.DEF",
"spinning": true
}
},
"sound" :
{
"attack": "CCYCATTK.wav",
"defend": "CCYCDFND.wav",
"killed": "CCYCKILL.wav",
"move": "CCYCMOVE.wav",
"shoot": "CCYCSHOT.wav",
"wince": "CCYCWNCE.wav"
}
},
"cyclopKing" :
{
"id": 95,
"level": 6,
"faction": "stronghold",
"graphics" :
{
"animation": "CCYCLLOR.DEF",
"missile" :
{
"projectile": "PCYCLBX.DEF",
"spinning": true
}
},
"sound" :
{
"attack": "CYCLATTK.wav",
"defend": "CYCLDFND.wav",
"killed": "CYCLKILL.wav",
"move": "CYCLMOVE.wav",
"shoot": "CYCLSHOT.wav",
"wince": "CYCLWNCE.wav"
}
},
"behemoth" :
{
"id": 96,
"level": 7,
"faction": "stronghold",
"abilities": [ [ "ENEMY_DEFENCE_REDUCTION", 40, 0, 0 ] ], //behemots
"upgrades": ["ancientBehemoth"],
"graphics" :
{
"animation": "CYBEHE.DEF"
},
"sound" :
{
"attack": "YBMHATTK.wav",
"defend": "YBMHDFND.wav",
"killed": "YBMHKILL.wav",
"move": "YBMHMOVE.wav",
"wince": "YBMHWNCE.wav"
}
},
"ancientBehemoth" :
{
"id": 97,
"level": 7,
"faction": "stronghold",
"abilities": [ [ "ENEMY_DEFENCE_REDUCTION", 80, 0, 0 ] ], //ancient behemots
"graphics" :
{
"animation": "CABEHE.DEF"
},
"sound" :
{
"attack": "BMTHATTK.wav",
"defend": "BMTHDFND.wav",
"killed": "BMTHKILL.wav",
"move": "BMTHMOVE.wav",
"wince": "BMTHWNCE.wav"
}
}
}

308
config/creatures/tower.json Normal file
View File

@ -0,0 +1,308 @@
{
"gremlin" :
{
"id": 28,
"level": 1,
"extraNames": [ "apprenticeGremlin" ],
"faction": "tower",
"upgrades": ["masterGremlin"],
"graphics" :
{
"animation": "CGREMA.DEF"
},
"sound" :
{
"attack": "AGRMATTK.wav",
"defend": "AGRMDFND.wav",
"killed": "AGRMKILL.wav",
"move": "AGRMMOVE.wav",
"shoot": "AGRMSHOT.wav",
"wince": "AGRMWNCE.wav"
}
},
"masterGremlin" :
{
"id": 29,
"level": 1,
"faction": "tower",
"graphics" :
{
"animation": "CGREMM.DEF",
"missile" :
{
"projectile": "CPRGRE.DEF",
"spinning": false
}
},
"sound" :
{
"attack": "MGRMATTK.wav",
"defend": "MGRMDFND.wav",
"killed": "MGRMKILL.wav",
"move": "MGRMMOVE.wav",
"shoot": "MGRMSHOT.wav",
"wince": "MGRMWNCE.wav"
}
},
"stoneGargoyle" :
{
"id": 30,
"level": 2,
"faction": "tower",
"abilities": [ [ "NON_LIVING", 0, 0, 0 ] ], //stone gargoyles are non-living
"upgrades": ["obsidianGargoyle"],
"graphics" :
{
"animation": "CGARGO.DEF"
},
"sound" :
{
"attack": "SGRGATTK.wav",
"defend": "SGRGDFND.wav",
"killed": "SGRGKILL.wav",
"move": "SGRGMOVE.wav",
"wince": "SGRGWNCE.wav"
}
},
"obsidianGargoyle" :
{
"id": 31,
"level": 2,
"faction": "tower",
"abilities": [ [ "NON_LIVING", 0, 0, 0 ] ], //obsidian gargoyles are non-living
"graphics" :
{
"animation": "COGARG.DEF"
},
"sound" :
{
"attack": "OGRGATTK.wav",
"defend": "OGRGDFND.wav",
"killed": "OGRGKILL.wav",
"move": "OGRGMOVE.wav",
"wince": "OGRGWNCE.wav"
}
},
"ironGolem" : //FIXME correct ID is stoneGolem, unchangeable due to HOTRAITS.TXT
{
"id": 32,
"level": 3,
"faction": "tower",
"abilities": [ [ "SPELL_DAMAGE_REDUCTION", 50, -1, 0 ], //stone golems reduce dmg from spells
[ "NON_LIVING", 0, 0, 0 ] ], //stone golems are non-living
"upgrades": ["stoneGolem"],
"graphics" :
{
"animation": "CSGOLE.DEF"
},
"sound" :
{
"attack": "SGLMATTK.wav",
"defend": "SGLMDFND.wav",
"killed": "SGLMKILL.wav",
"move": "SGLMMOVE.wav",
"wince": "SGLMWNCE.wav"
}
},
"stoneGolem" : //FIXME correct ID is ironGolem, unchangeable due to HOTRAITS.TXT
{
"id": 33,
"level": 3,
"faction": "tower",
"abilities": [ [ "SPELL_DAMAGE_REDUCTION", 75, -1, 0 ], //iron golems reduce dmg from spells
[ "NON_LIVING", 0, 0, 0 ] ], //iron golems are non-living
"graphics" :
{
"animation": "CIGOLE.DEF"
},
"sound" :
{
"attack": "IGLMATTK.wav",
"defend": "IGLMDFND.wav",
"killed": "IGLMKILL.wav",
"move": "IGLMMOVE.wav",
"wince": "IGLMWNCE.wav"
}
},
"mage" :
{
"id": 34,
"level": 4,
"faction": "tower",
"abilities": [ [ "CHANGES_SPELL_COST_FOR_ALLY", 2, 0, 0 ] ], //mages reduce spell cost
"upgrades": ["archMage"],
"graphics" :
{
"animation": "CMAGE.DEF",
"missile" :
{
"projectile": "PMAGEX.DEF",
"spinning": false
}
},
"sound" :
{
"attack": "MAGEATTK.wav",
"defend": "MAGEDFND.wav",
"killed": "MAGEKILL.wav",
"move": "MAGEMOVE.wav",
"shoot": "MAGESHOT.wav",
"wince": "MAGEWNCE.wav"
}
},
"archMage" :
{
"id": 35,
"level": 4,
"faction": "tower",
"abilities": [ [ "CHANGES_SPELL_COST_FOR_ALLY", 2, 0, 0 ]], //archmages reduce spell cost
"graphics" :
{
"animation": "CAMAGE.DEF",
"missile" :
{
"projectile": "PMAGEX.DEF",
"spinning": false
}
},
"sound" :
{
"attack": "AMAGATTK.wav",
"defend": "AMAGDFND.wav",
"killed": "AMAGKILL.wav",
"move": "AMAGMOVE.wav",
"shoot": "AMAGSHOT.wav",
"wince": "AMAGWNCE.wav"
}
},
"genie" :
{
"id": 36,
"level": 5,
"faction": "tower",
"abilities": [ [ "HATE", 50, 53, 0 ], //master genies hate efreets
[ "HATE", 50, 52, 0 ] ], //genies hate efreet sultans
"upgrades": ["masterGenie"],
"graphics" :
{
"animation": "CGENIE.DEF"
},
"sound" :
{
"attack": "GENIATTK.wav",
"defend": "GENIDFND.wav",
"killed": "GENIKILL.wav",
"move": "GENIMOVE.wav",
"wince": "GENIWNCE.wav"
}
},
"masterGenie" :
{
"id": 37,
"level": 5,
"faction": "tower",
"abilities": [ [ "CREATURE_ENCHANT_POWER", 5, 0, 0 ], //spells last 5 turns
[ "RANDOM_SPELLCASTER", 2, 0, 0 ], //master genies cast spells on advanced level
[ "CASTS", 3, 0, 0],
[ "HATE", 50, 53, 0 ],
[ "HATE", 50, 52, 0 ] ], //master genies hate efreet sultans
"graphics" :
{
"animation": "CSULTA.DEF"
},
"sound" :
{
"attack": "CALFATTK.wav",
"defend": "CALFDFND.wav",
"killed": "CALFKILL.wav",
"move": "CALFMOVE.wav",
"shoot": "CALFSHOT.wav",
"wince": "CALFWNCE.wav"
}
},
"naga" :
{
"id": 38,
"level": 6,
"faction": "tower",
"abilities": [ [ "BLOCKS_RETALIATION", 0, 0, 0 ] ], //nagas block retaliation
"upgrades": ["nagaQueen"],
"graphics" :
{
"animation": "CNAGA.DEF"
},
"sound" :
{
"attack": "NSENATTK.wav",
"defend": "NSENDFND.wav",
"killed": "NSENKILL.wav",
"move": "NSENMOVE.wav",
"wince": "NSENWNCE.wav"
}
},
"nagaQueen" :
{
"id": 39,
"level": 6,
"faction": "tower",
"abilities": [ [ "BLOCKS_RETALIATION", 0, 0, 0 ] ], //naga queens block retaliation
"graphics" :
{
"animation": "CNAGAG.DEF"
},
"sound" :
{
"attack": "NGRDATTK.wav",
"defend": "NGRDDFND.wav",
"killed": "NGRDKILL.wav",
"move": "NGRDMOVE.wav",
"wince": "NGRDWNCE.wav"
}
},
"giant" :
{
"id": 40,
"level": 7,
"faction": "tower",
"abilities": [ ["MIND_IMMUNITY", 0, 0, 0] ], //giants are immune to mind spells
"upgrades": ["titan"],
"graphics" :
{
"animation": "CLTITA.DEF"
},
"sound" :
{
"attack": "LTITATTK.wav",
"defend": "LTITDFND.wav",
"killed": "LTITKILL.wav",
"move": "LTITMOVE.wav",
"wince": "LTITWNCE.wav"
}
},
"titan" :
{
"id": 41,
"level": 7,
"faction": "tower",
"abilities": [ ["MIND_IMMUNITY", 0, 0, 0], //Titans are immune to mind spells
[ "HATE", 50, 83, 0 ] ], //titans hate black dragons
"graphics" :
{
"animation": "CGTITA.DEF",
"missile" :
{
"projectile": "CPRGTIX.DEF",
"spinning": false
}
},
"sound" :
{
"attack": "GTITATTK.wav",
"defend": "GTITDFND.wav",
"killed": "GTITKILL.wav",
"move": "GTITMOVE.wav",
"shoot": "GTITSHOT.wav",
"wince": "GTITWNCE.wav"
}
}
}

729
config/creatures/wog.json Normal file
View File

@ -0,0 +1,729 @@
{
"supremeArchangel" :
{
"id": 150,
"level": 0,
"faction": "castle",
"graphics" :
{
"animation": "ZM150Z.DEF"
}
},
"diamondDragon" :
{
"id": 151,
"level": 8,
"faction": "rampart",
"abilities": [ [ "DRAGON_NATURE", 0, 0, 0 ] ], //diamond dragon is a dragon //psychic elemental
"graphics" :
{
"animation": "ZM151Z.DEF"
}
},
"lordofThunder" :
{
"id": 152,
"level": 8,
"faction": "tower",
"graphics" :
{
"animation": "ZM152Z.DEF",
"missile" :
{
"projectile": "CPRGTIX.DEF",
"spinning": false
}
}
},
"hellBaron" :
{
"id": 153,
"level": 8,
"faction": "inferno",
"graphics" :
{
"animation": "ZM153Z.DEF"
}
},
"bloodDragon" :
{
"id": 154,
"level": 8,
"faction": "necropolis",
"abilities": [ [ "DRAGON_NATURE", 0, 0, 0 ] ], //blood dragon is a dragon //magic elemental
"graphics" :
{
"animation": "ZM154Z.DEF"
}
},
"darknessDragon" :
{
"id": 155,
"level": 8,
"faction": "dungeon",
"abilities": [ [ "DRAGON_NATURE", 0, 0, 0 ] ], //darkness dragon is a dragon
"graphics" :
{
"animation": "ZM155Z.DEF"
}
},
"ghostBehemoth" :
{
"id": 156,
"level": 8,
"faction": "stronghold",
"graphics" :
{
"animation": "ZM156Z.DEF"
}
},
"hellHydra" :
{
"id": 157,
"level": 8,
"faction": "fortress",
"ability_remove": [ "SHOOTER" ], //Hell Hydra certainly does not shoot
"graphics" :
{
"animation": "ZM157Z.DEF"
}
},
"sacredPhoenix" :
{
"id": 158,
"level": 8,
"faction": "conflux",
"graphics" :
{
"animation": "ZM158Z.DEF"
}
},
"ghost" :
{
"id": 159,
"level": 0,
"faction": "neutral",
"graphics" :
{
"animation": "ZM159G.DEF"
}
},
"godWar" :
{
"special" : true,
"id": 160,
"level": 0,
"faction": "neutral",
"graphics" :
{
"animation": "ZM160G.DEF"
}
},
"godPeace" :
{
"special" : true,
"id": 161,
"level": 0,
"faction": "neutral",
"graphics" :
{
"animation": "ZM161G.DEF"
}
},
"godMana" :
{
"special" : true,
"id": 162,
"level": 0,
"faction": "neutral",
"graphics" :
{
"animation": "ZM162G.DEF"
}
},
"godLore" :
{
"special" : true,
"id": 163,
"level": 0,
"faction": "neutral",
"graphics" :
{
"animation": "ZM163G.DEF"
}
},
"minotaurKing2" :// WTF is this? Same ID as Minotaur King from Dungeon
{
"id": 164,
"level": 0,
"faction": "neutral",
"graphics" :
{
"animation": "ZM164GD.DEF"
}
},
"mineralElemental" :
{
"id": 165,
"level": 0,
"faction": "neutral",
"graphics" :
{
"animation": "ZM165GD.DEF"
}
},
"electricityElemental" :
{
"id": 166,
"level": 0,
"faction": "neutral",
"graphics" :
{
"animation": "ZM166GD.DEF"
}
},
"ancientBasilisk" :
{
"id": 167,
"level": 0,
"faction": "neutral",
"graphics" :
{
"animation": "ZM167GD.DEF"
}
},
"gorynych" :
{
"id": 168,
"level": 0,
"faction": "neutral",
"abilities": [ [ "FLYING", 0, 0, 0 ] ], //Gorynyches fly
"graphics" :
{
"animation": "ZM168DG.DEF"
}
},
"warZealot" :
{
"id": 169,
"level": 0,
"faction": "neutral",
"graphics" :
{
"animation": "ZM169ZL.DEF",
"missile" :
{
"projectile": "CPRZEAX.DEF",
"spinning": false
}
}
},
"myriad" :
{
"id": 170,
"level": 0,
"faction": "neutral",
"graphics" :
{
"animation": "ZM170SW.DEF",
"missile" :
{
"projectile": "PLCBOWX.DEF",
"spinning": false
}
}
},
"medusaMatriarch" :
{
"id": 171,
"level": 0,
"faction": "neutral",
"graphics" :
{
"animation": "ZM171SR.DEF",
"missile" :
{
"projectile": "PLCBOWX.DEF",
"spinning": false
}
}
},
"nightmare" :
{
"id": 172,
"level": 0,
"faction": "neutral",
"graphics" :
{
"animation": "ZM172N.DEF"
}
},
"santaGremlin" :
{
"id": 173,
"level": 0,
"faction": "neutral",
"graphics" :
{
"animation": "ZM173M.DEF",
"missile" :
{
"projectile": "CPRGRE.DEF",
"spinning": true
}
},
},
"paladin1" :
{
"special" : true,
"id": 174,
"level": 0,
"faction": "neutral",
"abilities": [ [ "MAGIC_RESISTANCE", 5, 0, 0 ],
[ "CASTS", 1, 0, 0 ] ,
[ "CREATURE_ENCHANT_POWER", 1, 0, 0 ] ,
[ "SPELLCASTER", 3, 37, 0 ] ], //expert cure
"graphics" :
{
"animation": "ZM174NPC.DEF",
"missile" :
{
"projectile": "PLCBOWX.DEF"
}
},
"sounds" :
{
"attack": "CRUSATTK.wav",
"defend": "CRUSDFND.wav",
"killed": "CRUSKILL.wav",
"move": "CRUSMOVE.wav",
"wince": "CRUSWNCE.wav"
}
},
"hierophant1" :
{
"special" : true,
"id": 175,
"level": 0,
"faction": "neutral",
"abilities": [ [ "MAGIC_RESISTANCE", 5, 0, 0 ],
[ "CASTS", 1, 0, 0 ] ,
[ "CREATURE_ENCHANT_POWER", 1, 0, 0 ] ,
[ "SPELLCASTER", 3, 27, 0 ] ], //expert shield
"graphics" :
{
"animation": "ZM175NPC.DEF",
"missile" :
{
"projectile": "CPRZEAX.DEF"
}
},
"sounds" :
{
"attack": "MONKATTK.wav",
"defend": "MONKDFND.wav",
"killed": "MONKKILL.wav",
"move": "MONKMOVE.wav",
"shoot": "MONKSHOT.wav",
"wince": "MONKWNCE.wav"
}
},
"templeGuardian1" :
{
"special" : true,
"id": 176,
"level": 0,
"faction": "neutral",
"abilities": [ [ "MAGIC_RESISTANCE", 5, 0, 0 ],
[ "CASTS", 1, 0, 0 ] ,
[ "CREATURE_ENCHANT_POWER", 1, 0, 0 ] ,
[ "SPELLCASTER", 3, 44, 0 ] ], //expert precision
"graphics" :
{
"animation": "ZM176NPC.DEF",
"missile" :
{
"projectile": "PLCBOWX.DEF"
}
},
"sounds" :
{
"attack": "LICHATTK.wav",
"defend": "LICHDFND.wav",
"killed": "LICHKILL.wav",
"move": "LICHMOVE.wav",
"shoot": "LICHSHOT.wav",
"wince": "LICHWNCE.wav",
"ext1": "LICHATK2.wav"
}
},
"succubus1" :
{
"special" : true,
"id": 177,
"level": 0,
"faction": "neutral",
"abilities": [ [ "MAGIC_RESISTANCE", 5, 0, 0 ],
[ "CASTS", 1, 0, 0 ] ,
[ "CREATURE_ENCHANT_POWER", 1, 0, 0 ] ,
[ "SPELLCASTER", 3, 29, 0 ] ], //expert fire shield
"graphics" :
{
"animation": "ZM177NPC.DEF",
"missile" :
{
"projectile": "PLCBOWX.DEF"
}
},
"sounds" :
{
"attack": "SGRGATTK.wav",
"defend": "SGRGDFND.wav",
"killed": "SGRGKILL.wav",
"move": "SGRGMOVE.wav",
"wince": "SGRGWNCE.wav"
}
},
"soulEater1" :
{
"special" : true,
"id": 178,
"level": 0,
"faction": "neutral",
"abilities": [ [ "MAGIC_RESISTANCE", 5, 0, 0 ],
[ "CASTS", 1, 0, 0 ] ,
[ "CREATURE_ENCHANT_POWER", 1, 0, 0 ] ,
[ "SPELLCASTER", 3, 39, 0 ] ], //expert animate dead
"graphics" :
{
"animation": "ZM178NPC.DEF",
"missile" :
{
"projectile": "PLCBOWX.DEF"
}
},
"sounds" :
{
"attack": "GNOLATTK.wav",
"defend": "GNOLDFND.wav",
"killed": "GNOLKILL.wav",
"move": "GNOLMOVE.wav",
"wince": "GNOLWNCE.wav"
}
},
"brute1" :
{
"special" : true,
"id": 179,
"level": 0,
"faction": "neutral",
"abilities": [ [ "MAGIC_RESISTANCE", 5, 0, 0 ],
[ "CASTS", 1, 0, 0 ] ,
[ "CREATURE_ENCHANT_POWER", 1, 0, 0 ] ,
[ "SPELLCASTER", 3, 46, 0 ] ], //expert stone skin
"graphics" :
{
"animation": "ZM179NPC.DEF",
"missile" :
{
"projectile": "PLCBOWX.DEF"
}
},
"sounds" :
{
"attack": "PFOEATTK.wav",
"defend": "PFOEDFND.wav",
"killed": "PFOEKILL.wav",
"move": "PFOEMOVE.wav",
"wince": "PFOEWNCE.wav"
}
},
"ogreLeader1" :
{
"special" : true,
"id": 180,
"level": 0,
"faction": "neutral",
"abilities": [ [ "MAGIC_RESISTANCE", 5, 0, 0 ],
[ "CASTS", 1, 0, 0 ] ,
[ "CREATURE_ENCHANT_POWER", 1, 0, 0 ] ,
[ "SPELLCASTER", 3, 37, 0 ] ], //expert cure
"graphics" :
{
"animation": "ZM180NPC.DEF",
"missile" :
{
"projectile": "PLCBOWX.DEF"
}
},
"sounds" :
{
"attack": "TRLLATTK.wav",
"defend": "TRLLDFND.wav",
"killed": "TRLLKILL.wav",
"move": "TRLLMOVE.wav",
"wince": "TRLLWNCE.wav"
}
},
"shaman1" :
{
"special" : true,
"id": 181,
"level": 0,
"faction": "neutral",
"abilities": [ [ "MAGIC_RESISTANCE", 5, 0, 0 ],
[ "CASTS", 1, 0, 0 ] ,
[ "CREATURE_ENCHANT_POWER", 1, 0, 0 ] ,
[ "SPELLCASTER", 3, 53, 0 ] ], //expert haste
"graphics" :
{
"animation": "ZM181NPC.DEF",
"missile" :
{
"projectile": "PLCBOWX.DEF"
}
},
"sounds" :
{
"attack": "AMAGATTK.wav",
"defend": "AMAGDFND.wav",
"killed": "AMAGKILL.wav",
"move": "AMAGMOVE.wav",
"shoot": "AMAGSHOT.wav",
"wince": "AMAGWNCE.wav"
}
},
"astralSpirit1" :
{
"special" : true,
"id": 182,
"level": 0,
"faction": "neutral",
"abilities": [ [ "MAGIC_RESISTANCE", 5, 0, 0 ],
[ "CASTS", 1, 0, 0 ] ,
[ "CREATURE_ENCHANT_POWER", 1, 0, 0 ] ,
[ "SPELLCASTER", 3, 58, 0 ] ], //expert counterstrike
"graphics" :
{
"animation": "ZM182NPC.DEF",
"missile" :
{
"projectile": "PLCBOWX.DEF"
}
},
"sounds" :
{
"attack": "GENIATTK.wav",
"defend": "GENIDFND.wav",
"killed": "GENIKILL.wav",
"move": "GENIMOVE.wav",
"wince": "GENIWNCE.wav"
}
},
"paladin2" :
{
"special" : true,
"id": 183,
"level": 0,
"faction": "neutral",
"graphics" :
{
"animation": "ZM174NPC.DEF"
}
},
"hierophant2" :
{
"special" : true,
"id": 184,
"level": 0,
"faction": "neutral",
"graphics" :
{
"animation": "ZM175NPC.DEF"
}
},
"templeGuardian2" :
{
"special" : true,
"id": 185,
"level": 0,
"faction": "neutral",
"graphics" :
{
"animation": "ZM176NPC.DEF"
}
},
"succubus2" :
{
"special" : true,
"id": 186,
"level": 0,
"faction": "neutral",
"graphics" :
{
"animation": "ZM177NPC.DEF"
}
},
"soulEater2" :
{
"special" : true,
"id": 187,
"level": 0,
"faction": "neutral",
"graphics" :
{
"animation": "ZM178NPC.DEF"
}
},
"brute2" :
{
"special" : true,
"id": 188,
"level": 0,
"faction": "neutral",
"graphics" :
{
"animation": "ZM179NPC.DEF"
}
},
"ogreLeader2" :
{
"special" : true,
"id": 189,
"level": 0,
"faction": "neutral",
"graphics" :
{
"animation": "ZM180NPC.DEF"
}
},
"shaman2" :
{
"special" : true,
"id": 190,
"level": 0,
"faction": "neutral",
"graphics" :
{
"animation": "ZM181NPC.DEF"
}
},
"astralSpirit2" :
{
"special" : true,
"id": 191,
"level": 0,
"faction": "neutral",
"graphics" :
{
"animation": "ZM182NPC.DEF"
}
},
"sylvanCentaur" :
{
"id": 192,
"level": 0,
"faction": "neutral",
"graphics" :
{
"animation": "ZM192Z.DEF",
"missile" :
{
"projectile": "PELFX.DEF",
"spinning": false
}
}
},
"sorceresses" :
{
"id": 193,
"level": 0,
"faction": "neutral",
"graphics" :
{
"animation": "ZM193Z.DEF",
"missile" :
{
"projectile": "CPRZEAX.DEF",
"spinning": false
}
}
},
"werewolf" :
{
"id": 194,
"level": 0,
"faction": "neutral",
"graphics" :
{
"animation": "ZM194Z.DEF"
}
},
"hellSteed" :
{
"id": 195,
"level": 0,
"faction": "neutral",
"graphics" :
{
"animation": "ZM195Z.DEF"
}
},
"dracolich" :
{
"id": 196,
"level": 0,
"faction": "neutral",
"graphics" :
{
"animation": "ZM196Z.DEF",
"missile" :
{
"projectile": "SMBALX.DEF",
"spinning": false
}
}
}
}
// For future reference. Creatures from WoG and their sound prefixes.
//aagl ZM150Z.def SupremeArchangel
//godr ZM151Z.def DiamondDragon
//gtit ZM152Z.def LordofThunder
//advl ZM153Z.def HellBaron
//ghdr ZM154Z.def BloodDragon
//bkdr ZM155Z.def DarknessDragon
//bmth ZM156Z.def GhostBehemoth
//chyd ZM157Z.def HellHydra
//phoe ZM158Z.def SacredPhoenix
//wrth ZM159G.def Ghost
//aagl ZM160G.def God1War
//aagl ZM161G.def God2Peace
//aagl ZM162G.def God3Mana
//aagl ZM163G.def God4Lore
//sglm ZM164GD.def MinotaurKing
//sglm ZM165GD.def MineralElemental
//sglm ZM166GD.def ElectricityElemental
//sglm ZM167GD.def AncientBasilisk
//bkdr ZM168DG.def Gorynych
//zelt ZM169ZL.def WarZealot
//hcrs ZM170SW.def Myriad
//hcrs ZM171SR.def MedusaMatriarch
//bgor ZM172N.def Nightmare
//aagl ZM173M.def SantaGremlin
//crus ZM174NPC.def Paladin2
//monk ZM175NPC.def Hierophant2
//lich ZM176NPC.def TempleGuardian2
//sgrg ZM177NPC.def Succubus2
//gnol ZM178NPC.def SoulEater2
///pfoe ZM179NPC.def Brute2
//trll ZM180NPC.def OgreLeader2
//amag ZM181NPC.def Shaman2
//geni ZM182NPC.def AstralSpirit2
//ecnt ZM192Z.def SylvanCentaur
//monk ZM193Z.def Sorceress
//monk ZM194Z.def Werewolf
//bgor ZM195Z.def HellSteed
//ghdr ZM196Z.def Dracolich

View File

@ -4,7 +4,7 @@
"index" : 0,
"nativeTerrain": "grass",
"alignment" : "good",
"commander" : "Paladin1",
"commander" : "paladin1",
"creatureBackground" :
{
"120px" : "TPCASCAS",
@ -137,17 +137,17 @@
],
"creatures" :
[
["Pikeman", "Halberdier"],
["Archer", "HeavyCrossbowman"],
["Griffin", "RoyalGriffin"],
["Swordsman", "Crusader"],
["Monk", "Zealot"],
["Cavalier", "Champion"],
["Angel", "Archangel"]
["pikeman", "halberdier"],
["archer", "marksman"],
["griffin", "royalGriffin"],
["swordsman", "crusader"],
["monk", "zealot"],
["cavalier", "champion"],
["angel", "archangel"]
],
"horde" : [ 2, -1 ],
"mageGuild" : 4,
"warMachine" : "Ballista",
"warMachine" : "ballista",
"buildings" :
[
@ -196,7 +196,7 @@
"siege" :
{
"shooter" : "Archer",
"shooter" : "archer",
"imagePrefix" : "SGCS",
"gate" :
{

View File

@ -4,7 +4,7 @@
"index" : 8,
"nativeTerrain": "grass",
"alignment" : "neutral",
"commander" : "AstralSpirit1",
"commander" : "astralSpirit1",
"creatureBackground" :
{
"120px" : "TPCASELE",
@ -139,18 +139,18 @@
],
"creatures" :
[
["Pixie", "Sprite"],
["AirElemental", "StormElemental"],
["WaterElemental", "IceElemental"],
["FireElemental", "ElectricityElemental"],
["EarthElemental", "StoneElemental"],
["PsiElemental", "MagicElemental"],
["Firebird", "Pheonix"]
["pixie", "sprite"],
["airElemental", "stormElemental"],
["waterElemental", "iceElemental"],
["fireElemental", "energyElemental"],
["earthElemental", "magmaElemental"],
["psychicElemental", "magicElemental"],
["firebird", "phoenix"]
],
"horde" : [ 0, -1 ],
"mageGuild" : 5,
"primaryResource" : "mercury",
"warMachine" : "Ballista",
"warMachine" : "ballista",
"buildings" :
[
@ -198,7 +198,7 @@
"siege" :
{
"shooter" : "StormElemental",
"shooter" : "stormElemental",
"imagePrefix" : "SGEL",
"gate" :
{

View File

@ -4,7 +4,7 @@
"index" : 5,
"nativeTerrain": "subterra",
"alignment" : "evil",
"commander" : "Brute1",
"commander" : "brute1",
"creatureBackground" :
{
"120px" : "TPCASDUN",
@ -134,18 +134,18 @@
],
"creatures" :
[
["Troglodyte", "InfernalTroglodyte"],
["Harpy", "HarpyHag"],
["Beholder", "EvilEye"],
["Medusa", "MedusaQueen"],
["Minotaur", "MinotaurKing"],
["Manticore", "Scorpicore"],
["RedDragon", "BlackDragon"]
["troglodyte", "infernalTroglodyte"],
["harpy", "harpyHag"],
["beholder", "evilEye"],
["medusa", "medusaQueen"],
["minotaur", "minotaurKing"],
["manticore", "scorpicore"],
["redDragon", "blackDragon"]
],
"horde" : [ 0, -1 ],
"mageGuild" : 5,
"primaryResource" : "sulfur",
"warMachine" : "Ballista",
"warMachine" : "ballista",
"buildings" :
[
@ -193,7 +193,7 @@
"siege" :
{
"shooter" : "Beholder",
"shooter" : "beholder",
"imagePrefix" : "SGDN",
"gate" :
{

View File

@ -4,7 +4,7 @@
"index" : 7,
"nativeTerrain": "swamp",
"alignment" : "neutral",
"commander" : "Shaman1",
"commander" : "shaman1",
"creatureBackground" :
{
"120px" : "TPCASFOR",
@ -135,17 +135,17 @@
],
"creatures" :
[
["Gnoll", "GnollMarauder"],
["PrimitiveLizardman", "AdvancedLizardman"],
["Dragonflies", "FireDragonFly"],
["Basilisk", "GreaterBasilisk"],
["CopperGorgon", "BronzeGorgon"],
["Wyvern", "WyvernMonarch"],
["Hydra", "ChaosHydra"]
["gnoll", "gnollMarauder"],
["lizardman", "lizardWarrior"],
["serpentFly", "fireDragonFly"],
["basilisk", "greaterBasilisk"],
["gorgon", "mightyGorgon"],
["wyvern", "wyvernMonarch"],
["hydra", "chaosHydra"]
],
"horde" : [ 0, -1 ],
"mageGuild" : 3,
"warMachine" : "FirstAidTent",
"warMachine" : "firstAidTent",
"buildings" :
[
@ -194,7 +194,7 @@
"siege" :
{
"shooter" : "PrimitiveLizardman",
"shooter" : "lizardman",
"imagePrefix" : "SGFR",
"gate" :
{

View File

@ -4,7 +4,7 @@
"index" : 3,
"nativeTerrain": "lava",
"alignment" : "evil",
"commander" : "Succubus1",
"commander" : "succubus1",
"creatureBackground" :
{
"120px" : "TPCASINF",
@ -135,18 +135,18 @@
],
"creatures" :
[
["Imp", "Familiar"],
["Gog", "Magog"],
["HellHound", "Cerberus"],
["Single-HornedDemon", "Dual-HornedDemon"],
["PitFiend", "PitFoe"],
["Efreet", "EfreetSultan"],
["Devil", "ArchDevil"]
["imp", "familiar"],
["gog", "magog"],
["hellHound", "cerberus"],
["demon", "hornedDemon"],
["pitFiend", "pitLord"],
["efreet", "efreetSultan"],
["devil", "archDevil"]
],
"horde" : [ 0, 2 ],
"mageGuild" : 5,
"primaryResource" : "mercury",
"warMachine" : "Ballista",
"warMachine" : "ballista",
"buildings" :
[
@ -196,7 +196,7 @@
"siege" :
{
"shooter" : "Gog",
"shooter" : "gog",
"imagePrefix" : "SGIN",
"gate" :
{

View File

@ -4,7 +4,7 @@
"index" : 4,
"nativeTerrain": "dirt",
"alignment" : "evil",
"commander" : "SoulEater1",
"commander" : "soulEater1",
"creatureBackground" :
{
"120px" : "TPCASNEC",
@ -139,17 +139,17 @@
],
"creatures" :
[
["Skeleton", "SkeletonWarrior"],
["Zombie", "ZombieLord"],
["Wight", "Wraith"],
["Vampire", "Nosferatu"],
["Lich", "PowerLich"],
["BlackKnight", "BlackLord"],
["BoneDragon", "GhostDragon"]
["skeleton", "skeletonWarrior"],
["walkingDead", "zombieLord"],
["wight", "wraith"],
["vampire", "vampireLord"],
["lich", "powerLich"],
["blackKnight", "dreadKnight"],
["boneDragon", "ghostDragon"]
],
"horde" : [ 0, -1 ],
"mageGuild" : 5,
"warMachine" : "FirstAidTent",
"warMachine" : "firstAidTent",
"buildings" :
[
@ -198,7 +198,7 @@
"siege" :
{
"shooter" : "Lich",
"shooter" : "lich",
"imagePrefix" : "SGNC",
"gate" :
{

View File

@ -8,6 +8,6 @@
"120px" : "TPCASNEU",
"130px" : "CRBKGNEU"
},
"commander" : "Enchanter" //just in case
"commander" : "enchanter" //just in case
}
}

View File

@ -4,7 +4,7 @@
"index" : 1,
"nativeTerrain": "grass",
"alignment" : "good",
"commander" : "Hierophant1",
"commander" : "hierophant1",
"creatureBackground" :
{
"120px" : "TPCASRAM",
@ -140,18 +140,18 @@
],
"creatures" :
[
["Centaur", "EliteCentaur"],
["Dwarf", "BattleDwarf"],
["WoodElf", "GrandElf"],
["Pegasus", "SilverPegasus"],
["Treefolk", "BriarTreefolk"],
["Unicorn", "WarUnicorn"],
["GreenDragon", "GoldDragon"]
["centaur", "centaurCaptain"],
["dwarf", "battleDwarf"],
["woodElf", "grandElf"],
["pegasus", "silverPegasus"],
["dendroidGuard", "dendroidSoldier"],
["unicorn", "warUnicorn"],
["greenDragon", "goldDragon"]
],
"horde" : [ 1, 4 ],
"mageGuild" : 5,
"primaryResource" : "crystal",
"warMachine" : "FirstAidTent",
"warMachine" : "firstAidTent",
"buildings" :
[
@ -201,7 +201,7 @@
"siege" :
{
"shooter" : "WoodElf",
"shooter" : "woodElf",
"imagePrefix" : "SGRM",
"gate" :
{

View File

@ -4,7 +4,7 @@
"index" : 6,
"nativeTerrain": "rough",
"alignment" : "neutral",
"commander" : "OgreLeader1",
"commander" : "ogreLeader1",
"creatureBackground" :
{
"120px" : "TPCASSTR",
@ -133,17 +133,17 @@
],
"creatures" :
[
["Goblin", "Hobgoblin"],
["GoblinWolfRider", "HobgoblinWolfRider"],
["Orc", "OrcChieftain"],
["Ogre", "OgreMage"],
["Roc", "Thunderbird"],
["Cyclops", "CyclopsLord"],
["YoungBehemoth", "AncientBehemoth"]
["goblin", "hobgoblin"],
["goblinWolfRider", "hobgoblinWolfRider"],
["orc", "orcChieftain"],
["ogre", "ogreMage"],
["roc", "thunderbird"],
["cyclop", "cyclopKing"],
["behemoth", "ancientBehemoth"]
],
"horde" : [ 0, -1 ],
"mageGuild" : 3,
"warMachine" : "AmmoCart",
"warMachine" : "ammoCart",
"buildings" :
[
@ -191,7 +191,7 @@
"siege" :
{
"shooter" : "Orc",
"shooter" : "orc",
"imagePrefix" : "SGST",
"gate" :
{

View File

@ -4,7 +4,7 @@
"index" : 2,
"nativeTerrain" : "snow",
"alignment" : "good",
"commander" : "TempleGuardian1",
"commander" : "templeGuardian1",
"creatureBackground" :
{
"120px" : "TPCASTOW",
@ -135,18 +135,18 @@
],
"creatures" :
[
["ApprenticeGremlin", "MasterGremlin"],
["StoneGargoyle", "ObsidianGargoyle"],
["IronGolem", "StoneGolem"],
["Mage", "ArchMage"],
["Genie", "Caliph"],
["NagaSentinel", "NagaGuardian"],
["LesserTitan", "GreaterTitan"]
["gremlin", "masterGremlin"],
["stoneGargoyle", "obsidianGargoyle"],
["ironGolem", "stoneGolem"],
["mage", "archMage"],
["genie", "masterGenie"],
["naga", "nagaQueen"],
["giant", "titan"]
],
"horde" : [ 1, -1 ],
"primaryResource" : "gems",
"mageGuild" : 5,
"warMachine" : "AmmoCart",
"warMachine" : "ammoCart",
"buildings" :
[
@ -194,7 +194,7 @@
"siege" :
{
"shooter" : "Mage",
"shooter" : "mage",
"imagePrefix" : "SGTW",
"gate" :
{

View File

@ -11,5 +11,24 @@
"config/factions/fortress.json",
"config/factions/conflux.json",
"config/factions/neutral.json"
],
"creatures" :
[
"config/creatures/castle.json",
"config/creatures/rampart.json",
"config/creatures/tower.json",
"config/creatures/necropolis.json",
"config/creatures/inferno.json",
"config/creatures/dungeon.json",
"config/creatures/stronghold.json",
"config/creatures/fortress.json",
"config/creatures/conflux.json",
"config/creatures/neutral.json",
"config/creatures/special.json",
"config/creatures/wog.json"
]
}

View File

@ -310,11 +310,14 @@ void CCreatureHandler::loadCreatures()
while (parser.endLine());
// loading creatures properties
tlog5 << "\t\tReading config/creatures.json" << std::endl;
const JsonNode config(ResourceID("config/creatures.json"));
tlog5 << "\t\tReading creatures json configs" << std::endl;
BOOST_FOREACH(const JsonNode &creature, config["creatures"].Vector())
const JsonNode gameConf(ResourceID("config/gameConfig.json"));
const JsonNode config(JsonUtils::assembleFromFiles(gameConf["creatures"].convertTo<std::vector<std::string> >()));
BOOST_FOREACH(auto & node, config.Struct())
{
const JsonNode &creature = node.second;
int creatureID = creature["id"].Float();
const JsonNode *value;
@ -355,7 +358,7 @@ void CCreatureHandler::loadCreatures()
}
}
value = &creature["ability_add"];
value = &creature["abilities"];
if (!value->isNull()) {
BOOST_FOREACH(const JsonNode &ability, value->Vector())
{
@ -363,23 +366,37 @@ void CCreatureHandler::loadCreatures()
}
}
c->nameRef = creature["name"].Vector().at(0).String();
c->special = creature["special"].Bool();
if ( c->special )
notUsedMonsters.insert(c->idNumber);
/* A creature can have several names. */
BOOST_FOREACH(const JsonNode &name, creature["name"].Vector())
const JsonNode & sounds = creature["sound"];
#define GET_SOUND_VALUE(value_name) c->sounds.value_name = sounds[#value_name].String()
GET_SOUND_VALUE(attack);
GET_SOUND_VALUE(defend);
GET_SOUND_VALUE(killed);
GET_SOUND_VALUE(move);
GET_SOUND_VALUE(shoot);
GET_SOUND_VALUE(wince);
GET_SOUND_VALUE(ext1);
GET_SOUND_VALUE(ext2);
GET_SOUND_VALUE(startMoving);
GET_SOUND_VALUE(endMoving);
#undef GET_SOUND_VALUE
// Main reference name, e.g. royalGriffin
c->nameRef = node.first;
VLC->modh->identifiers.registerObject("creature." + node.first, c->idNumber);
// Alternative names, if any
BOOST_FOREACH(const JsonNode &name, creature["extraNames"].Vector())
{
VLC->modh->identifiers.registerObject(std::string("creature.") + name.String(), c->idNumber);
VLC->modh->identifiers.registerObject("creature." + name.String(), c->idNumber);
}
}
BOOST_FOREACH(const JsonNode &creature, config["unused_creatures"].Vector())
{
notUsedMonsters += creature.Float();
}
loadAnimationInfo();
loadSoundsInfo();
//reading creature ability names
const JsonNode config2(ResourceID("config/bonusnames.json"));
@ -574,41 +591,6 @@ void CCreatureHandler::loadUnitAnimInfo(CCreature & unit, CLegacyConfigParser &
parser.endLine();
}
void CCreatureHandler::loadCreatureSounds(JsonNode node, si32 creaID) // passing node by value to get clearer binding code
{
/* This is a bit ugly. Maybe we should use an array for
* sound ids instead of separate variables and define
* attack/defend/killed/... as indexes. */
#define GET_SOUND_VALUE(value_name) do { creatures[creaID]->sounds.value_name = node[#value_name].String(); } while(0)
GET_SOUND_VALUE(attack);
GET_SOUND_VALUE(defend);
GET_SOUND_VALUE(killed);
GET_SOUND_VALUE(move);
GET_SOUND_VALUE(shoot);
GET_SOUND_VALUE(wince);
GET_SOUND_VALUE(ext1);
GET_SOUND_VALUE(ext2);
GET_SOUND_VALUE(startMoving);
GET_SOUND_VALUE(endMoving);
#undef GET_SOUND_VALUE
}
void CCreatureHandler::loadSoundsInfo()
{
tlog5 << "\t\tReading config/cr_sounds.json" << std::endl;
const JsonNode config(ResourceID("config/cr_sounds.json"));
if (!config["creature_sounds"].isNull())
{
BOOST_FOREACH(const JsonNode &node, config["creature_sounds"].Vector())
{
VLC->modh->identifiers.requestIdentifier(std::string("creature.") + node["name"].String(),
boost::bind(&CCreatureHandler::loadCreatureSounds, this, node, _1));
}
}
}
void CCreatureHandler::load(const JsonNode & node)
{
BOOST_FOREACH(auto & entry, node.Struct())

View File

@ -32,7 +32,6 @@ public:
//damage, hp. etc are handled by Bonuses
ui32 fightValue, AIValue, growth, hordeGrowth;
ui32 ammMin, ammMax;
ui8 level; // 0 - unknown
std::string abilityText; //description of abilities
std::string abilityRefs; //references to abilities, in text format
std::string animDefName;
@ -40,7 +39,9 @@ public:
si32 idNumber;
si32 iconIndex; // index of icon in files like twcrport
TFaction faction; //-1 = neutral
ui8 level; // 0 - unknown
ui8 doubleWide;
ui8 special; // Creature is not available normally (war machines, commanders, etc
///animation info
double timeBetweenFidgets, walkAnimationTime, attackAnimationTime, flightAnimationDistance;
@ -157,9 +158,6 @@ public:
void loadAnimationInfo();
/// read one line from cranim.txt
void loadUnitAnimInfo(CCreature & unit, CLegacyConfigParser &parser);
/// load cr_sounds.json config
void loadCreatureSounds(JsonNode node, si32 creaID);
void loadSoundsInfo();
/// parse crexpbon.txt file from H3
void loadStackExp(Bonus & b, BonusList & bl, CLegacyConfigParser &parser);
/// help function for parsing CREXPBON.txt

View File

@ -381,6 +381,7 @@ void CHeroHandler::loadHeroes()
std::string refName = parser.readString();
boost::algorithm::replace_all(refName, " ", ""); //remove spaces
refName[0] = std::tolower(refName[0]); // to camelCase
VLC->modh->identifiers.requestIdentifier(std::string("creature.") + refName, [=](si32 creature)
{
hero->initialArmy[x].creature = creature;

View File

@ -21,19 +21,30 @@
*
*/
class CArtHandler;
class CHeroHandler;
class CCreatureHandler;
class CSpellHandler;
class CBuildingHandler;
class CObjectHandler;
class CDefObjInfoHandler;
class CTownHandler;
class CGeneralTextHandler;
class ResourceLocator;
void CIdentifierStorage::checkIdentifier(std::string & ID)
{
if (boost::algorithm::ends_with(ID, "."))
tlog0 << "BIG WARNING: identifier " << ID << " seems to be broken!\n";
else
{
size_t pos = 0;
do
{
if (std::tolower(ID[pos]) != ID[pos] ) //Not in camelCase
{
tlog0 << "Warning: identifier " << ID << " is not in camelCase!\n";
ID[pos] = std::tolower(ID[pos]);// Try to fix the ID
}
pos = ID.find('.', pos);
}
while(pos++ != std::string::npos);
}
}
void CIdentifierStorage::requestIdentifier(std::string name, const boost::function<void(si32)> & callback)
{
checkIdentifier(name);
auto iter = registeredObjects.find(name);
if (iter != registeredObjects.end())
@ -44,6 +55,8 @@ void CIdentifierStorage::requestIdentifier(std::string name, const boost::functi
void CIdentifierStorage::registerObject(std::string name, si32 identifier)
{
checkIdentifier(name);
// do not allow to register same object twice
assert(registeredObjects.find(name) == registeredObjects.end());

View File

@ -26,6 +26,8 @@ class CIdentifierStorage
std::map<std::string, si32 > registeredObjects;
std::map<std::string, std::vector<boost::function<void(si32)> > > missingObjects;
//Check if identifier can be valid (camelCase, point as separator)
void checkIdentifier(std::string & ID);
public:
/// request identifier for specific object name. If ID is not yet resolved callback will be queued
/// and will be called later

View File

@ -520,7 +520,7 @@ void CTownHandler::load(const JsonNode &source)
[=](si32 commanderID)
{
factions[id].commander = commanderID;
}); //TODO: resolve string id
});
faction.creatureBg120 = node.second["creatureBackground"]["120px"].String();
faction.creatureBg130 = node.second["creatureBackground"]["130px"].String();

View File

@ -176,7 +176,6 @@ public:
ui8 nativeTerrain;
ui8 alignment; // uses EAlignment enum
//std::string commanderClass;
TCreature commander;
std::string creatureBg120;