浏览代码

- 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

Ivan Savenko 13 年之前
父节点
当前提交
8824f5e2d5

+ 2 - 0
AI/BattleAI/BattleAI.cpp

@@ -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)))

+ 1 - 1
CMakeLists.txt

@@ -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 "../")

+ 1 - 15
config/commanders.json

@@ -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 @@
 			]
 		}
 	]
-}
+}

+ 0 - 1330
config/cr_sounds.json

@@ -1,1330 +0,0 @@
-{
-	"creature_sounds": 
-	[
-		{
-			"name": "AdvancedLizardman",
-			"attack": "ALIZATTK.wav",
-			"defend": "ALIZDFND.wav",
-			"killed": "ALIZKILL.wav",
-			"move": "ALIZMOVE.wav",
-			"shoot": "ALIZSHOT.wav",
-			"wince": "ALIZWNCE.wav"
-		},
-		{
-			"name": "AirElemental",
-			"attack": "AELMATTK.wav",
-			"defend": "AELMDFND.wav",
-			"killed": "AELMKILL.wav",
-			"move": "AELMMOVE.wav",
-			"wince": "AELMWNCE.wav"
-		},
-		{
-			"name": "AmmoCart",
-			"killed": "CARTKILL.wav",
-			"wince": "CARTWNCE.wav"
-		},
-		{
-			"name": "AncientBehemoth",
-			"attack": "BMTHATTK.wav",
-			"defend": "BMTHDFND.wav",
-			"killed": "BMTHKILL.wav",
-			"move": "BMTHMOVE.wav",
-			"wince": "BMTHWNCE.wav"
-		},
-		{
-			"name": "Angel",
-			"attack": "ANGLATTK.wav",
-			"defend": "ANGLDFND.wav",
-			"killed": "ANGLKILL.wav",
-			"move": "ANGLMOVE.wav",
-			"wince": "ANGLWNCE.wav"
-		},
-		{
-			"name": "ApprenticeGremlin",
-			"attack": "AGRMATTK.wav",
-			"defend": "AGRMDFND.wav",
-			"killed": "AGRMKILL.wav",
-			"move": "AGRMMOVE.wav",
-			"shoot": "AGRMSHOT.wav",
-			"wince": "AGRMWNCE.wav"
-		},
-		{
-			"name": "ArchDevil",
-			"attack": "ADVLATTK.wav",
-			"defend": "ADVLDFND.wav",
-			"killed": "ADVLKILL.wav",
-			"move": "ADVLMOVE.wav",
-			"wince": "ADVLWNCE.wav",
-			"startMoving": "ADVLEXT1.wav",
-			"stopMoving": "ADVLEXT2.wav"
-		},
-		{
-			"name": "ArchMage",
-			"attack": "AMAGATTK.wav",
-			"defend": "AMAGDFND.wav",
-			"killed": "AMAGKILL.wav",
-			"move": "AMAGMOVE.wav",
-			"shoot": "AMAGSHOT.wav",
-			"wince": "AMAGWNCE.wav"
-		},
-		{
-			"name": "Archangel",
-			"attack": "AAGLATTK.wav",
-			"defend": "AAGLDFND.wav",
-			"killed": "AAGLKILL.wav",
-			"move": "AAGLMOVE.wav",
-			"wince": "AAGLWNCE.wav"
-		},
-		{
-			"name": "AzureDragon",
-			"attack": "AZURATTK.wav",
-			"defend": "AZURDFND.wav",
-			"killed": "AZURKILL.wav",
-			"move": "AZURMOVE.wav",
-			"wince": "AZURWNCE.wav"
-		},
-		{
-			"name": "Ballista",
-			"killed": "BALLKILL.wav",
-			"shoot": "BALLSHOT.wav",
-			"wince": "BALLWNCE.wav"
-		},
-		{
-			"name": "Basilisk",
-			"attack": "BASLATTK.wav",
-			"defend": "BASLDFND.wav",
-			"killed": "BASLKILL.wav",
-			"move": "BASLMOVE.wav",
-			"wince": "BASLWNCE.wav"
-		},
-		{
-			"name": "BattleDwarf",
-			"attack": "BDRFATTK.wav",
-			"defend": "BDRFDFND.wav",
-			"killed": "BDRFKILL.wav",
-			"move": "BDRFMOVE.wav",
-			"wince": "BDRFWNCE.wav"
-		},
-		{
-			"name": "Beholder",
-			"attack": "BHDRATTK.wav",
-			"defend": "BHDRDFND.wav",
-			"killed": "BHDRKILL.wav",
-			"move": "BHDRMOVE.wav",
-			"shoot": "BHDRSHOT.wav",
-			"wince": "BHDRWNCE.wav",
-			"ext1": "BHDRDETH.wav"
-		},
-		{
-			"name": "BlackDragon",
-			"attack": "BKDRATTK.wav",
-			"defend": "BKDRDFND.wav",
-			"killed": "BKDRKILL.wav",
-			"move": "BKDRMOVE.wav",
-			"wince": "BKDRWNCE.wav"
-		},
-		{
-			"name": "BlackKnight",
-			"attack": "BKNTATTK.wav",
-			"defend": "BKNTDFND.wav",
-			"killed": "BKNTKILL.wav",
-			"move": "BKNTMOVE.wav",
-			"wince": "BKNTWNCE.wav"
-		},
-		{
-			"name": "BlackLord",
-			"attack": "BLRDATTK.wav",
-			"defend": "BLRDDFND.wav",
-			"killed": "BLRDKILL.wav",
-			"move": "BLRDMOVE.wav",
-			"wince": "BLRDWNCE.wav"
-		},
-		{
-			"name": "Boar",
-			"attack": "BOARATTK.wav",
-			"defend": "BOARDFND.wav",
-			"killed": "BOARKILL.wav",
-			"move": "BOARMOVE.wav",
-			"wince": "BOARWNCE.wav"
-		},
-		{
-			"name": "BoneDragon",
-			"attack": "BODRATTK.wav",
-			"defend": "BODRDFND.wav",
-			"killed": "BODRKILL.wav",
-			"move": "BODRMOVE.wav",
-			"wince": "BODRWNCE.wav"
-		},
-		{
-			"name": "BriarTreefolk",
-			"attack": "BTREATTK.wav",
-			"defend": "BTREDFND.wav",
-			"killed": "BTREKILL.wav",
-			"move": "BTREMOVE.wav",
-			"wince": "BTREWNCE.wav"
-		},
-		{
-			"name": "BronzeGorgon",
-			"attack": "BGORATTK.wav",
-			"defend": "BGORDFND.wav",
-			"killed": "BGORKILL.wav",
-			"move": "BGORMOVE.wav",
-			"wince": "BGORWNCE.wav"
-		},
-		{
-			"name": "Caliph",
-			"attack": "CALFATTK.wav",
-			"defend": "CALFDFND.wav",
-			"killed": "CALFKILL.wav",
-			"move": "CALFMOVE.wav",
-			"shoot": "CALFSHOT.wav",
-			"wince": "CALFWNCE.wav"
-		},
-		{
-			"name": "Catapult",
-			"killed": "CATAKILL.wav",
-			"shoot": "CATASHOT.wav",
-			"wince": "CATAWNCE.wav"
-		},
-		{
-			"name": "Cavalier",
-			"attack": "CAVAATTK.wav",
-			"defend": "CAVADFND.wav",
-			"killed": "CAVAKILL.wav",
-			"move": "CAVAMOVE.wav",
-			"wince": "CAVAWNCE.wav"
-		},
-		{
-			"name": "Centaur",
-			"attack": "CNTRATTK.wav",
-			"defend": "CNTRDFND.wav",
-			"killed": "CNTRKILL.wav",
-			"move": "CNTRMOVE.wav",
-			"shoot": "CNTRSHOT.wav",
-			"wince": "CNTRWNCE.wav"
-		},
-		{
-			"name": "Cerberus",
-			"attack": "CERBATTK.wav",
-			"defend": "CERBDFND.wav",
-			"killed": "CERBKILL.wav",
-			"move": "CERBMOVE.wav",
-			"wince": "CERBWNCE.wav"
-		},
-		{
-			"name": "Champion",
-			"attack": "CHMPATTK.wav",
-			"defend": "CHMPDFND.wav",
-			"killed": "CHMPKILL.wav",
-			"move": "CHMPMOVE.wav",
-			"wince": "CHMPWNCE.wav"
-		},
-		{
-			"name": "ChaosHydra",
-			"attack": "CHYDATTK.wav",
-			"defend": "CHYDDFND.wav",
-			"killed": "CHYDKILL.wav",
-			"move": "CHYDMOVE.wav",
-			"wince": "CHYDWNCE.wav"
-		},
-		{
-			"name": "CopperGorgon",
-			"attack": "CGORATTK.wav",
-			"defend": "CGORDFND.wav",
-			"killed": "CGORKILL.wav",
-			"move": "CGORMOVE.wav",
-			"wince": "CGORWNCE.wav"
-		},
-		{
-			"name": "Crusader",
-			"attack": "CRUSATTK.wav",
-			"defend": "CRUSDFND.wav",
-			"killed": "CRUSKILL.wav",
-			"move": "CRUSMOVE.wav",
-			"wince": "CRUSWNCE.wav"
-		},
-		{
-			"name": "CrystalDragon",
-			"attack": "CRYSATTK.wav",
-			"defend": "CRYSDFND.wav",
-			"killed": "CRYSKILL.wav",
-			"move": "CRYSMOVE.wav",
-			"wince": "CRYSWNCE.wav"
-		},
-		{
-			"name": "Cyclops",
-			"attack": "CCYCATTK.wav",
-			"defend": "CCYCDFND.wav",
-			"killed": "CCYCKILL.wav",
-			"move": "CCYCMOVE.wav",
-			"shoot": "CCYCSHOT.wav",
-			"wince": "CCYCWNCE.wav"
-		},
-		{
-			"name": "CyclopsLord",
-			"attack": "CYCLATTK.wav",
-			"defend": "CYCLDFND.wav",
-			"killed": "CYCLKILL.wav",
-			"move": "CYCLMOVE.wav",
-			"shoot": "CYCLSHOT.wav",
-			"wince": "CYCLWNCE.wav"
-		},
-		{
-			"name": "Devil",
-			"attack": "DEVLATTK.wav",
-			"defend": "DEVLDFND.wav",
-			"killed": "DEVLKILL.wav",
-			"move": "DEVLMOVE.wav",
-			"wince": "DEVLWNCE.wav",
-			"ext1": "DEVLEXT1.wav",
-			"ext2": "DEVLEXT2.wav"
-		},
-		{
-			"name": "DiamondGolem",
-			"attack": "DGLMATTK.wav",
-			"defend": "DGLMDFND.wav",
-			"killed": "DGLMKILL.wav",
-			"move": "DGLMMOVE.wav",
-			"wince": "DGLMWNCE.wav"
-		},
-		{
-			"name": "DragonFly",
-			"attack": "DFLYATTK.wav",
-			"defend": "DFLYDFND.wav",
-			"killed": "DFLYKILL.wav",
-			"move": "DFLYMOVE.wav",
-			"wince": "DFLYWNCE.wav"
-		},
-		{
-			"name": "Dual-HornedDemon",
-			"attack": "DHDMATTK.wav",
-			"defend": "DHDMDFND.wav",
-			"killed": "DHDMKILL.wav",
-			"move": "DHDMMOVE.wav",
-			"wince": "DHDMWNCE.wav"
-		},
-		{
-			"name": "Dwarf",
-			"attack": "DWRFATTK.wav",
-			"defend": "DWRFDFND.wav",
-			"killed": "DWRFKILL.wav",
-			"move": "DWRFMOVE.wav",
-			"wince": "DWRFWNCE.wav"
-		},
-		{
-			"name": "EarthElemental",
-			"attack": "EELMATTK.wav",
-			"defend": "EELMDFND.wav",
-			"killed": "EELMKILL.wav",
-			"move": "EELMMOVE.wav",
-			"wince": "EELMWNCE.wav"
-		},
-		{
-			"name": "Efreet",
-			"attack": "EFRTATTK.wav",
-			"defend": "EFRTDFND.wav",
-			"killed": "EFRTKILL.wav",
-			"move": "EFRTMOVE.wav",
-			"wince": "EFRTWNCE.wav"
-		},
-		{
-			"name": "EfreetSultan",
-			"attack": "ESULATTK.wav",
-			"defend": "ESULDFND.wav",
-			"killed": "ESULKILL.wav",
-			"move": "ESULMOVE.wav",
-			"shoot": "ESULSHOT.wav",
-			"wince": "ESULWNCE.wav"
-		},
-		{
-			"name": "ElectricityElemental",
-			"attack": "ENERATTK.wav",
-			"defend": "ENERDFND.wav",
-			"killed": "ENERKILL.wav",
-			"move": "ENERMOVE.wav",
-			"wince": "ENERWNCE.wav"
-		},
-		{
-			"name": "EliteCentaur",
-			"attack": "ECNTATTK.wav",
-			"defend": "ECNTDFND.wav",
-			"killed": "ECNTKILL.wav",
-			"move": "ECNTMOVE.wav",
-			"wince": "ECNTWNCE.wav"
-		},
-		{
-			"name": "Enchanter",
-			"attack": "ENCHATTK.wav",
-			"defend": "ENCHDFND.wav",
-			"killed": "ENCHKILL.wav",
-			"move": "ENCHMOVE.wav",
-			"shoot": "ENCHSHOT.wav",
-			"wince": "ENCHWNCE.wav"
-		},
-		{
-			"name": "EvilEye",
-			"attack": "EVLIATTK.wav",
-			"defend": "EVLIDFND.wav",
-			"killed": "EVLIKILL.wav",
-			"move": "EVLIMOVE.wav",
-			"shoot": "EVLISHOT.wav",
-			"wince": "EVLIWNCE.wav",
-			"ext1": "EVLIDETH.wav"
-		},
-		{
-			"name": "FairieDragon",
-			"attack": "FAERATTK.wav",
-			"defend": "FAERDFND.wav",
-			"killed": "FAERKILL.wav",
-			"move": "FAERMOVE.wav",
-			"shoot": "FAERSHOT.wav",
-			"wince": "FAERWNCE.wav"
-		},
-		{
-			"name": "Familiar",
-			"attack": "FMLRATTK.wav",
-			"defend": "FMLRDFND.wav",
-			"killed": "FMLRKILL.wav",
-			"move": "FMLRMOVE.wav",
-			"wince": "FMLRWNCE.wav"
-		},
-		{
-			"name": "FireDragonFly",
-			"attack": "FDFLATTK.wav",
-			"defend": "FDFLDFND.wav",
-			"killed": "FDFLKILL.wav",
-			"move": "FDFLMOVE.wav",
-			"shoot": "FDFLSHOT.wav",
-			"wince": "FDFLWNCE.wav"
-		},
-		{
-			"name": "FireElemental",
-			"attack": "FELMATTK.wav",
-			"defend": "FELMDFND.wav",
-			"killed": "FELMKILL.wav",
-			"move": "FELMMOVE.wav",
-			"wince": "FELMWNCE.wav"
-		},
-		{
-			"name": "Firebird",
-			"attack": "FIRBATTK.wav",
-			"defend": "FIRBDFND.wav",
-			"killed": "FIRBKILL.wav",
-			"move": "FIRBMOVE.wav",
-			"wince": "FIRBWNCE.wav"
-		},
-		{
-			"name": "FirstAidTent",
-			"killed": "FAIDKILL.wav",
-			"wince": "FAIDWNCE.wav"
-		},
-		{
-			"name": "Genie",
-			"attack": "GENIATTK.wav",
-			"defend": "GENIDFND.wav",
-			"killed": "GENIKILL.wav",
-			"move": "GENIMOVE.wav",
-			"wince": "GENIWNCE.wav"
-		},
-		{
-			"name": "GhostDragon",
-			"attack": "GHDRATTK.wav",
-			"defend": "GHDRDFND.wav",
-			"killed": "GHDRKILL.wav",
-			"move": "GHDRMOVE.wav",
-			"wince": "GHDRWNCE.wav"
-		},
-		{
-			"name": "Gnoll",
-			"attack": "GNOLATTK.wav",
-			"defend": "GNOLDFND.wav",
-			"killed": "GNOLKILL.wav",
-			"move": "GNOLMOVE.wav",
-			"wince": "GNOLWNCE.wav"
-		},
-		{
-			"name": "GnollMarauder",
-			"attack": "GNLMATTK.wav",
-			"defend": "GNLMDFND.wav",
-			"killed": "GNLMKILL.wav",
-			"move": "GNLMMOVE.wav",
-			"wince": "GNLMWNCE.wav"
-		},
-		{
-			"name": "Goblin",
-			"attack": "GBLNATTK.wav",
-			"defend": "GBLNDFND.wav",
-			"killed": "GBLNKILL.wav",
-			"move": "GBLNMOVE.wav",
-			"wince": "GBLNWNCE.wav"
-		},
-		{
-			"name": "GoblinWolfRider",
-			"attack": "GWRDATTK.wav",
-			"defend": "GWRDDFND.wav",
-			"killed": "GWRDKILL.wav",
-			"move": "GWRDMOVE.wav",
-			"wince": "GWRDWNCE.wav"
-		},
-		{
-			"name": "Gog",
-			"attack": "GOGGATTK.wav",
-			"defend": "GOGGDFND.wav",
-			"killed": "GOGGKILL.wav",
-			"move": "GOGGMOVE.wav",
-			"shoot": "GOGGSHOT.wav",
-			"wince": "GOGGWNCE.wav",
-			"ext1": "GOGFLAME.wav"
-		},
-		{
-			"name": "GoldDragon",
-			"attack": "GODRATTK.wav",
-			"defend": "GODRDFND.wav",
-			"killed": "GODRKILL.wav",
-			"move": "GODRMOVE.wav",
-			"wince": "GODRWNCE.wav"
-		},
-		{
-			"name": "GoldGolem",
-			"attack": "GGLMATTK.wav",
-			"defend": "GGLMDFND.wav",
-			"killed": "GGLMKILL.wav",
-			"move": "GGLMMOVE.wav",
-			"wince": "GGLMWNCE.wav"
-		},
-		{
-			"name": "GrandElf",
-			"attack": "GELFATTK.wav",
-			"defend": "GELFDFND.wav",
-			"killed": "GELFKILL.wav",
-			"move": "GELFMOVE.wav",
-			"shoot": "GELFSHOT.wav",
-			"wince": "GELFWNCE.wav"
-		},
-		{
-			"name": "GreaterBasilisk",
-			"attack": "GBASATTK.wav",
-			"defend": "GBASDFND.wav",
-			"killed": "GBASKILL.wav",
-			"move": "GBASMOVE.wav",
-			"wince": "GBASWNCE.wav"
-		},
-		{
-			"name": "GreaterTitan",
-			"attack": "GTITATTK.wav",
-			"defend": "GTITDFND.wav",
-			"killed": "GTITKILL.wav",
-			"move": "GTITMOVE.wav",
-			"shoot": "GTITSHOT.wav",
-			"wince": "GTITWNCE.wav"
-		},
-		{
-			"name": "GreenDragon",
-			"attack": "GRDRATTK.wav",
-			"defend": "GRDRDFND.wav",
-			"killed": "GRDRKILL.wav",
-			"move": "GRDRMOVE.wav",
-			"wince": "GRDRWNCE.wav"
-		},
-		{
-			"name": "Griffin",
-			"attack": "GRIFATTK.wav",
-			"defend": "GRIFDFND.wav",
-			"killed": "GRIFKILL.wav",
-			"move": "GRIFMOVE.wav",
-			"wince": "GRIFWNCE.wav"
-		},
-		{
-			"name": "Halberdier",
-			"attack": "HALBATTK.wav",
-			"defend": "HALBDFND.wav",
-			"killed": "HALBKILL.wav",
-			"move": "HALBMOVE.wav",
-			"wince": "HALBWNCE.wav"
-		},
-		{
-			"name": "Halfling",
-			"attack": "HALFATTK.wav",
-			"defend": "HALFDFND.wav",
-			"killed": "HALFKILL.wav",
-			"move": "HALFMOVE.wav",
-			"shoot": "HALFSHOT.wav",
-			"wince": "HALFWNCE.wav"
-		},
-		{
-			"name": "Harpy",
-			"attack": "HARPATTK.wav",
-			"defend": "HARPDFND.wav",
-			"killed": "HARPKILL.wav",
-			"move": "HARPMOVE.wav",
-			"shoot": "silence",
-			"wince": "HARPWNCE.wav"
-		},
-		{
-			"name": "HarpyHag",
-			"attack": "HHAGATTK.wav",
-			"defend": "HHAGDFND.wav",
-			"killed": "HHAGKILL.wav",
-			"move": "HHAGMOVE.wav",
-			"shoot": "HHAGSHOT.wav",
-			"wince": "HHAGWNCE.wav"
-		},
-		{
-			"name": "HeavyCrossbowman",
-			"attack": "HCRSATTK.wav",
-			"defend": "HCRSDFND.wav",
-			"killed": "HCRSKILL.wav",
-			"move": "HCRSMOVE.wav",
-			"shoot": "HCRSSHOT.wav",
-			"wince": "HCRSWNCE.wav"
-		},
-		{
-			"name": "HellHound",
-			"attack": "HHNDATTK.wav",
-			"defend": "HHNDDFND.wav",
-			"killed": "HHNDKILL.wav",
-			"move": "HHNDMOVE.wav",
-			"wince": "HHNDWNCE.wav"
-		},
-		{
-			"name": "Hobgoblin",
-			"attack": "HGOBATTK.wav",
-			"defend": "HGOBDFND.wav",
-			"killed": "HGOBKILL.wav",
-			"move": "HGOBMOVE.wav",
-			"wince": "HGOBWNCE.wav"
-		},
-		{
-			"name": "HobgoblinWolfRider",
-			"attack": "HGWRATTK.wav",
-			"defend": "HGWRDFND.wav",
-			"killed": "HGWRKILL.wav",
-			"move": "HGWRMOVE.wav",
-			"wince": "HGWRWNCE.wav"
-		},
-		{
-			"name": "Hydra",
-			"attack": "HYDRATTK.wav",
-			"defend": "HYDRDFND.wav",
-			"killed": "HYDRKILL.wav",
-			"move": "HYDRMOVE.wav",
-			"wince": "HYDRWNCE.wav"
-		},
-		{
-			"name": "IceElemental",
-			"attack": "ICELATTK.wav",
-			"defend": "ICELDFND.wav",
-			"killed": "ICELKILL.wav",
-			"move": "ICELMOVE.wav",
-			"shoot": "ICELSHOT.wav",
-			"wince": "ICELWNCE.wav"
-		},
-		{
-			"name": "Imp",
-			"attack": "IMPPATTK.wav",
-			"defend": "IMPPDFND.wav",
-			"killed": "IMPPKILL.wav",
-			"move": "IMPPMOVE.wav",
-			"wince": "IMPPWNCE.wav"
-		},
-		{
-			"name": "InfernalTroglodyte",
-			"attack": "ITRGATTK.wav",
-			"defend": "ITRGDFND.wav",
-			"killed": "ITRGKILL.wav",
-			"move": "ITRGMOVE.wav",
-			"wince": "ITRGWNCE.wav"
-		},
-		{
-			"name": "StoneGolem",
-			"attack": "IGLMATTK.wav",
-			"defend": "IGLMDFND.wav",
-			"killed": "IGLMKILL.wav",
-			"move": "IGLMMOVE.wav",
-			"wince": "IGLMWNCE.wav"
-		},
-		{
-			"name": "LesserTitan",
-			"attack": "LTITATTK.wav",
-			"defend": "LTITDFND.wav",
-			"killed": "LTITKILL.wav",
-			"move": "LTITMOVE.wav",
-			"wince": "LTITWNCE.wav"
-		},
-		{
-			"name": "Lich",
-			"attack": "LICHATTK.wav",
-			"defend": "LICHDFND.wav",
-			"killed": "LICHKILL.wav",
-			"move": "LICHMOVE.wav",
-			"shoot": "LICHSHOT.wav",
-			"wince": "LICHWNCE.wav",
-			"ext1": "LICHATK2.wav"
-		},
-		{
-			"name": "LightCrossbowman",
-			"attack": "LCRSATTK.wav",
-			"defend": "LCRSDFND.wav",
-			"killed": "LCRSKILL.wav",
-			"move": "LCRSMOVE.wav",
-			"shoot": "LCRSSHOT.wav",
-			"wince": "LCRSWNCE.wav"
-		},
-		{
-			"name": "Mage",
-			"attack": "MAGEATTK.wav",
-			"defend": "MAGEDFND.wav",
-			"killed": "MAGEKILL.wav",
-			"move": "MAGEMOVE.wav",
-			"shoot": "MAGESHOT.wav",
-			"wince": "MAGEWNCE.wav"
-		},
-		{
-			"name": "MagicElemental",
-			"attack": "MGELATTK.wav",
-			"defend": "MGELDFND.wav",
-			"killed": "MGELKILL.wav",
-			"move": "MGELMOVE.wav",
-			"wince": "MGELWNCE.wav"
-		},
-		{
-			"name": "Magog",
-			"attack": "MGOGATTK.wav",
-			"defend": "MGOGDFND.wav",
-			"killed": "MGOGKILL.wav",
-			"move": "MGOGMOVE.wav",
-			"shoot": "MGOGSHOT.wav",
-			"wince": "MGOGWNCE.wav",
-			"ext1": "GOGFLAME.wav"
-		},
-		{
-			"name": "Manticore",
-			"attack": "MANTATTK.wav",
-			"defend": "MANTDFND.wav",
-			"killed": "MANTKILL.wav",
-			"move": "MANTMOVE.wav",
-			"shoot": "MANTSHOT.wav",
-			"wince": "MANTWNCE.wav"
-		},
-		{
-			"name": "MasterGremlin",
-			"attack": "MGRMATTK.wav",
-			"defend": "MGRMDFND.wav",
-			"killed": "MGRMKILL.wav",
-			"move": "MGRMMOVE.wav",
-			"shoot": "MGRMSHOT.wav",
-			"wince": "MGRMWNCE.wav"
-		},
-		{
-			"name": "Medusa",
-			"attack": "MEDUATTK.wav",
-			"defend": "MEDUDFND.wav",
-			"killed": "MEDUKILL.wav",
-			"move": "MEDUMOVE.wav",
-			"shoot": "MEDUSHOT.wav",
-			"wince": "MEDUWNCE.wav"
-		},
-		{
-			"name": "MedusaQueen",
-			"attack": "MEDQATTK.wav",
-			"defend": "MEDQDFND.wav",
-			"killed": "MEDQKILL.wav",
-			"move": "MEDQMOVE.wav",
-			"shoot": "MEDQSHOT.wav",
-			"wince": "MEDQWNCE.wav"
-		},
-		{
-			"name": "Minotaur",
-			"attack": "MINOATTK.wav",
-			"defend": "MINODFND.wav",
-			"killed": "MINOKILL.wav",
-			"move": "MINOMOVE.wav",
-			"wince": "MINOWNCE.wav"
-		},
-		{
-			"name": "MinotaurKing",
-			"attack": "MINKATTK.wav",
-			"defend": "MINKDFND.wav",
-			"killed": "MINKKILL.wav",
-			"move": "MINKMOVE.wav",
-			"shoot": "MINKSHOT.wav",
-			"wince": "MINKWNCE.wav"
-		},
-		{
-			"name": "Monk",
-			"attack": "MONKATTK.wav",
-			"defend": "MONKDFND.wav",
-			"killed": "MONKKILL.wav",
-			"move": "MONKMOVE.wav",
-			"shoot": "MONKSHOT.wav",
-			"wince": "MONKWNCE.wav"
-		},
-		{
-			"name": "Mummy",
-			"attack": "MUMYATTK.wav",
-			"defend": "MUMYDFND.wav",
-			"killed": "MUMYKILL.wav",
-			"move": "MUMYMOVE.wav",
-			"wince": "MUMYWNCE.wav"
-		},
-		{
-			"name": "NagaGuardian",
-			"attack": "NGRDATTK.wav",
-			"defend": "NGRDDFND.wav",
-			"killed": "NGRDKILL.wav",
-			"move": "NGRDMOVE.wav",
-			"wince": "NGRDWNCE.wav"
-		},
-		{
-			"name": "NagaSentinel",
-			"attack": "NSENATTK.wav",
-			"defend": "NSENDFND.wav",
-			"killed": "NSENKILL.wav",
-			"move": "NSENMOVE.wav",
-			"wince": "NSENWNCE.wav"
-		},
-		{
-			"name": "Nosferatu",
-			"attack": "NOSFATTK.wav",
-			"defend": "NOSFDFND.wav",
-			"killed": "NOSFKILL.wav",
-			"move": "NOSFMOVE.wav",
-			"shoot": "NOSFSHOT.wav",
-			"wince": "NOSFWNCE.wav",
-			"ext1": "NOSFEXT1.wav",
-			"ext2": "NOSFEXT2.wav"
-		},
-		{
-			"name": "ObsidianGargoyle",
-			"attack": "OGRGATTK.wav",
-			"defend": "OGRGDFND.wav",
-			"killed": "OGRGKILL.wav",
-			"move": "OGRGMOVE.wav",
-			"wince": "OGRGWNCE.wav"
-		},
-		{
-			"name": "Ogre",
-			"attack": "OGREATTK.wav",
-			"defend": "OGREDFND.wav",
-			"killed": "OGREKILL.wav",
-			"move": "OGREMOVE.wav",
-			"wince": "OGREWNCE.wav"
-		},
-		{
-			"name": "OgreMage",
-			"attack": "OGRMATTK.wav",
-			"defend": "OGRMDFND.wav",
-			"killed": "OGRMKILL.wav",
-			"move": "OGRMMOVE.wav",
-			"shoot": "OGRMSHOT.wav",
-			"wince": "OGRMWNCE.wav"
-		},
-		{
-			"name": "OgreShaman",
-			"attack": "TRLLATTK.wav",
-			"defend": "TRLLDFND.wav",
-			"killed": "TRLLKILL.wav",
-			"move": "TRLLMOVE.wav",
-			"wince": "TRLLWNCE.wav"
-		},
-		{
-			"name": "Orc",
-			"attack": "OORCATTK.wav",
-			"defend": "OORCDFND.wav",
-			"killed": "OORCKILL.wav",
-			"move": "OORCMOVE.wav",
-			"shoot": "OORCSHOT.wav",
-			"wince": "OORCWNCE.wav"
-		},
-		{
-			"name": "OrcChieftain",
-			"attack": "ORCCATTK.wav",
-			"defend": "ORCCDFND.wav",
-			"killed": "ORCCKILL.wav",
-			"move": "ORCCMOVE.wav",
-			"shoot": "ORCCSHOT.wav",
-			"wince": "ORCCWNCE.wav"
-		},
-		{
-			"name": "Peasant",
-			"attack": "PSNTATTK.wav",
-			"defend": "PSNTDFND.wav",
-			"killed": "PSNTKILL.wav",
-			"move": "PSNTMOVE.wav",
-			"wince": "PSNTWNCE.wav"
-		},
-		{
-			"name": "Pegasus",
-			"attack": "PEGAATTK.wav",
-			"defend": "PEGADFND.wav",
-			"killed": "PEGAKILL.wav",
-			"move": "PEGAMOVE.wav",
-			"wince": "PEGAWNCE.wav"
-		},
-		{
-			"name": "Pheonix",
-			"attack": "PHOEATTK.wav",
-			"defend": "PHOEDFND.wav",
-			"killed": "PHOEKILL.wav",
-			"move": "PHOEMOVE.wav",
-			"wince": "PHOEWNCE.wav"
-		},
-		{
-			"name": "Pikeman",
-			"attack": "PIKEATTK.wav",
-			"defend": "PIKEDFND.wav",
-			"killed": "PIKEKILL.wav",
-			"move": "PIKEMOVE.wav",
-			"wince": "PIKEWNCE.wav"
-		},
-		{
-			"name": "PitFiend",
-			"attack": "PFNDATTK.wav",
-			"defend": "PFNDDFND.wav",
-			"killed": "PFNDKILL.wav",
-			"move": "PFNDMOVE.wav",
-			"wince": "PFNDWNCE.wav"
-		},
-		{
-			"name": "PitFoe",
-			"attack": "PFOEATTK.wav",
-			"defend": "PFOEDFND.wav",
-			"killed": "PFOEKILL.wav",
-			"move": "PFOEMOVE.wav",
-			"wince": "PFOEWNCE.wav"
-		},
-		{
-			"name": "Pixie",
-			"attack": "PIXIATTK.wav",
-			"defend": "PIXIDFND.wav",
-			"killed": "PIXIKILL.wav",
-			"move": "PIXIMOVE.wav",
-			"wince": "PIXIWNCE.wav"
-		},
-		{
-			"name": "PowerLich",
-			"attack": "PLCHATTK.wav",
-			"defend": "PLCHDFND.wav",
-			"killed": "PLCHKILL.wav",
-			"move": "PLCHMOVE.wav",
-			"shoot": "PLCHSHOT.wav",
-			"wince": "PLCHWNCE.wav"
-		},
-		{
-			"name": "PrimitiveLizardman",
-			"attack": "PLIZATTK.wav",
-			"defend": "PLIZDFND.wav",
-			"killed": "PLIZKILL.wav",
-			"move": "PLIZMOVE.wav",
-			"shoot": "PLIZSHOT.wav",
-			"wince": "PLIZWNCE.wav"
-		},
-		{
-			"name": "PsiElemental",
-			"attack": "PSYCATTK.wav",
-			"defend": "PSYCDFND.wav",
-			"killed": "PSYCKILL.wav",
-			"move": "PSYCMOVE.wav",
-			"wince": "PSYCWNCE.wav"
-		},
-		{
-			"name": "RedDragon",
-			"attack": "RDDRATTK.wav",
-			"defend": "RDDRDFND.wav",
-			"killed": "RDDRKILL.wav",
-			"move": "RDDRMOVE.wav",
-			"wince": "RDDRWNCE.wav"
-		},
-		{
-			"name": "Roc",
-			"attack": "ROCCATTK.wav",
-			"defend": "ROCCDFND.wav",
-			"killed": "ROCCKILL.wav",
-			"move": "ROCCMOVE.wav",
-			"wince": "ROCCWNCE.wav"
-		},
-		{
-			"name": "Rogue",
-			"attack": "ROGUATTK.wav",
-			"defend": "ROGUDFND.wav",
-			"killed": "ROGUKILL.wav",
-			"move": "ROGUMOVE.wav",
-			"wince": "ROGUWNCE.wav"
-		},
-		{
-			"name": "RoyalGriffin",
-			"attack": "RGRFATTK.wav",
-			"defend": "RGRFDFND.wav",
-			"killed": "RGRFKILL.wav",
-			"move": "RGRFMOVE.wav",
-			"wince": "RGRFWNCE.wav"
-		},
-		{
-			"name": "RustDragon",
-			"attack": "RUSTATTK.wav",
-			"defend": "RUSTDFND.wav",
-			"killed": "RUSTKILL.wav",
-			"move": "RUSTMOVE.wav",
-			"wince": "RUSTWNCE.wav"
-		},
-		{
-			"name": "Scorpicore",
-			"attack": "SCRPATTK.wav",
-			"defend": "SCRPDFND.wav",
-			"killed": "SCRPKILL.wav",
-			"move": "SCRPMOVE.wav",
-			"shoot": "SCRPSHOT.wav",
-			"wince": "SCRPWNCE.wav"
-		},
-		{
-			"name": "SilverPegasus",
-			"attack": "APEGATTK.wav",
-			"defend": "APEGDFND.wav",
-			"killed": "APEGKILL.wav",
-			"move": "APEGMOVE.wav",
-			"wince": "APEGWNCE.wav"
-		},
-		{
-			"name": "Single-HornedDemon",
-			"attack": "SHDMATTK.wav",
-			"defend": "SHDMDFND.wav",
-			"killed": "SHDMKILL.wav",
-			"move": "SHDMMOVE.wav",
-			"wince": "SHDMWNCE.wav"
-		},
-		{
-			"name": "Sharpshooter",
-			"attack": "HCRSATTK.wav",
-			"defend": "HCRSDFND.wav",
-			"killed": "HCRSKILL.wav",
-			"move": "HCRSMOVE.wav",
-			"shoot": "HCRSSHOT.wav",
-			"wince": "HCRSWNCE.wav"
-		},
-		{
-			"name": "Skeleton",
-			"attack": "SKELATTK.wav",
-			"defend": "SKELDFND.wav",
-			"killed": "SKELKILL.wav",
-			"move": "SKELMOVE.wav",
-			"wince": "SKELWNCE.wav"
-		},
-		{
-			"name": "SkeletonWarrior",
-			"attack": "SKLWATTK.wav",
-			"defend": "SKLWDFND.wav",
-			"killed": "SKLWKILL.wav",
-			"move": "SKLWMOVE.wav",
-			"wince": "SKLWWNCE.wav"
-		},
-		{
-			"name": "Sprite",
-			"attack": "SPRTATTK.wav",
-			"defend": "SPRTDFND.wav",
-			"killed": "SPRTKILL.wav",
-			"move": "SPRTMOVE.wav",
-			"wince": "SPRTWNCE.wav"
-		},
-		{
-			"name": "StoneElemental",
-			"attack": "MAGMATTK.wav",
-			"defend": "MAGMDFND.wav",
-			"killed": "MAGMKILL.wav",
-			"move": "MAGMMOVE.wav",
-			"wince": "MAGMWNCE.wav"
-		},
-		{
-			"name": "StoneGargoyle",
-			"attack": "SGRGATTK.wav",
-			"defend": "SGRGDFND.wav",
-			"killed": "SGRGKILL.wav",
-			"move": "SGRGMOVE.wav",
-			"wince": "SGRGWNCE.wav"
-		},
-		{
-			"name": "IronGolem",
-			"attack": "SGLMATTK.wav",
-			"defend": "SGLMDFND.wav",
-			"killed": "SGLMKILL.wav",
-			"move": "SGLMMOVE.wav",
-			"wince": "SGLMWNCE.wav"
-		},
-		{
-			"name": "StormElemental",
-			"attack": "STORATTK.wav",
-			"defend": "STORDFND.wav",
-			"killed": "STORKILL.wav",
-			"move": "STORMOVE.wav",
-			"shoot": "STORSHOT.wav",
-			"wince": "STORWNCE.wav"
-		},
-		{
-			"name": "Swordsman",
-			"attack": "SWRDATTK.wav",
-			"defend": "SWRDDFND.wav",
-			"killed": "SWRDKILL.wav",
-			"move": "SWRDMOVE.wav",
-			"wince": "SWRDWNCE.wav"
-		},
-		{
-			"name": "Thunderbird",
-			"attack": "TBRDATTK.wav",
-			"defend": "TBRDDFND.wav",
-			"killed": "TBRDKILL.wav",
-			"move": "TBRDMOVE.wav",
-			"wince": "TBRDWNCE.wav"
-		},
-		{
-			"name": "Treefolk",
-			"attack": "TREEATTK.wav",
-			"defend": "TREEDFND.wav",
-			"killed": "TREEKILL.wav",
-			"move": "TREEMOVE.wav",
-			"wince": "TREEWNCE.wav"
-		},
-		{
-			"name": "Troglodyte",
-			"attack": "TROGATTK.wav",
-			"defend": "TROGDFND.wav",
-			"killed": "TROGKILL.wav",
-			"move": "TROGMOVE.wav",
-			"wince": "TROGWNCE.wav"
-		},
-		{
-			"name": "Unicorn",
-			"attack": "UNICATTK.wav",
-			"defend": "UNICDFND.wav",
-			"killed": "UNICKILL.wav",
-			"move": "UNICMOVE.wav",
-			"wince": "UNICWNCE.wav"
-		},
-		{
-			"name": "Vampire",
-			"attack": "VAMPATTK.wav",
-			"defend": "VAMPDFND.wav",
-			"killed": "VAMPKILL.wav",
-			"move": "VAMPMOVE.wav",
-			"wince": "VAMPWNCE.wav",
-			"startMoving": "VAMPEXT1.wav",
-			"stopMoving": "VAMPEXT2.wav"
-		},
-		{
-			"name": "warrior",
-			"attack": "NMADATTK.wav",
-			"defend": "NMADDFND.wav",
-			"killed": "NMADKILL.wav",
-			"move": "NMADMOVE.wav",
-			"wince": "NMADWNCE.wav"
-		},
-		{
-			"name": "WarUnicorn",
-			"attack": "WUNCATTK.wav",
-			"defend": "WUNCDFND.wav",
-			"killed": "WUNCKILL.wav",
-			"move": "WUNCMOVE.wav",
-			"shoot": "WUNCSHOT.wav",
-			"wince": "WUNCWNCE.wav"
-		},
-		{
-			"name": "WaterElemental",
-			"attack": "WELMATTK.wav",
-			"defend": "WELMDFND.wav",
-			"killed": "WELMKILL.wav",
-			"move": "WELMMOVE.wav",
-			"wince": "WELMWNCE.wav"
-		},
-		{
-			"name": "Wight",
-			"attack": "WGHTATTK.wav",
-			"defend": "WGHTDFND.wav",
-			"killed": "WGHTKILL.wav",
-			"move": "WGHTMOVE.wav",
-			"wince": "WGHTWNCE.wav"
-		},
-		{
-			"name": "WoodElf",
-			"attack": "WELFATTK.wav",
-			"defend": "WELFDFND.wav",
-			"killed": "WELFKILL.wav",
-			"move": "WELFMOVE.wav",
-			"shoot": "WELFSHOT.wav",
-			"wince": "WELFWNCE.wav"
-		},
-		{
-			"name": "Wraith",
-			"attack": "WRTHATTK.wav",
-			"defend": "WRTHDFND.wav",
-			"killed": "WRTHKILL.wav",
-			"move": "WRTHMOVE.wav",
-			"wince": "WRTHWNCE.wav"
-		},
-		{
-			"name": "Wyvern",
-			"attack": "WYVNATTK.wav",
-			"defend": "WYVNDFND.wav",
-			"killed": "WYVNKILL.wav",
-			"move": "WYVNMOVE.wav",
-			"wince": "WYVNWNCE.wav"
-		},
-		{
-			"name": "WyvernMonarch",
-			"attack": "WYVMATTK.wav",
-			"defend": "WYVMDFND.wav",
-			"killed": "WYVMKILL.wav",
-			"move": "WYVMMOVE.wav",
-			"wince": "WYVMWNCE.wav"
-		},
-		{
-			"name": "YoungBehemoth",
-			"attack": "YBMHATTK.wav",
-			"defend": "YBMHDFND.wav",
-			"killed": "YBMHKILL.wav",
-			"move": "YBMHMOVE.wav",
-			"wince": "YBMHWNCE.wav"
-		},
-		{
-			"name": "Zealot",
-			"attack": "ZELTATTK.wav",
-			"defend": "ZELTDFND.wav",
-			"killed": "ZELTKILL.wav",
-			"move": "ZELTMOVE.wav",
-			"shoot": "ZELTSHOT.wav",
-			"wince": "ZELTWNCE.wav"
-		},
-		{
-			"name": "Zombie",
-			"attack": "ZOMBATTK.wav",
-			"defend": "ZOMBDFND.wav",
-			"killed": "ZOMBKILL.wav",
-			"move": "ZOMBMOVE.wav",
-			"wince": "ZOMBWNCE.wav"
-		},
-		{
-			"name": "ZombieLord",
-			"attack": "ZMBLATTK.wav",
-			"defend": "ZMBLDFND.wav",
-			"killed": "ZMBLKILL.wav",
-			"move": "ZMBLMOVE.wav",
-			"wince": "ZMBLWNCE.wav"
-		},
-		// Commanders
-		{
-			"name": "AstralSpirit1",
-			"attack": "GENIATTK.wav",
-			"defend": "GENIDFND.wav",
-			"killed": "GENIKILL.wav",
-			"move": "GENIMOVE.wav",
-			"wince": "GENIWNCE.wav"
-		},
-		{
-			"name": "Shaman1",
-			"attack": "AMAGATTK.wav",
-			"defend": "AMAGDFND.wav",
-			"killed": "AMAGKILL.wav",
-			"move": "AMAGMOVE.wav",
-			"shoot": "AMAGSHOT.wav",
-			"wince": "AMAGWNCE.wav"
-		},
-		{
-			"name": "OgreLeader1",
-			"attack": "TRLLATTK.wav",
-			"defend": "TRLLDFND.wav",
-			"killed": "TRLLKILL.wav",
-			"move": "TRLLMOVE.wav",
-			"wince": "TRLLWNCE.wav"
-		},
-		{
-			"name": "Brute1",
-			"attack": "PFOEATTK.wav",
-			"defend": "PFOEDFND.wav",
-			"killed": "PFOEKILL.wav",
-			"move": "PFOEMOVE.wav",
-			"wince": "PFOEWNCE.wav"
-		},
-		{
-			"name": "SoulEater1",
-			"attack": "GNOLATTK.wav",
-			"defend": "GNOLDFND.wav",
-			"killed": "GNOLKILL.wav",
-			"move": "GNOLMOVE.wav",
-			"wince": "GNOLWNCE.wav"
-		},
-		{
-			"name": "Succubus1",
-			"attack": "SGRGATTK.wav",
-			"defend": "SGRGDFND.wav",
-			"killed": "SGRGKILL.wav",
-			"move": "SGRGMOVE.wav",
-			"wince": "SGRGWNCE.wav"
-		},
-		{
-			"name": "TempleGuardian1",
-			"attack": "LICHATTK.wav",
-			"defend": "LICHDFND.wav",
-			"killed": "LICHKILL.wav",
-			"move": "LICHMOVE.wav",
-			"shoot": "LICHSHOT.wav",
-			"wince": "LICHWNCE.wav",
-			"ext1": "LICHATK2.wav"
-		},
-		{
-			"name": "Hierophant1",
-			"attack": "MONKATTK.wav",
-			"defend": "MONKDFND.wav",
-			"killed": "MONKKILL.wav",
-			"move": "MONKMOVE.wav",
-			"shoot": "MONKSHOT.wav",
-			"wince": "MONKWNCE.wav"
-		},
-		{
-			"name": "Paladin1",
-			"attack": "CRUSATTK.wav",
-			"defend": "CRUSDFND.wav",
-			"killed": "CRUSKILL.wav",
-			"move": "CRUSMOVE.wav",
-			"wince": "CRUSWNCE.wav"
-		}
-	]
-}
-
-// 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

+ 0 - 1992
config/creatures.json

@@ -1,1992 +0,0 @@
-// Defines creatures.
-
-// The following properties are mandatory:
-//  id:      number of the creature
-//  name:    array of names for the creature
-//  defname: graphics for the creature
-//  level:   its level (1 to 7)
-//  faction: its faction (0 to 8)
-
-// The following properties are optional:
-//  upgrades:           id of the creatures to upgrade to
-//  projectile_defname: if the creature is a shooter, graphics for the projectile
-//  projectile_spin:    if the creature is a shooter, indicate whether the projectile spins
-//  turret_shooter:     indicates whether the shooter appears in the castle turrets
-//  ability_add:        adding a abilities ( [ABILITY] [value] [subtype] [additional info] )
-//	ability_remove:     removing an existing ability ( [ABILITY] )
-
-{
-	"creatures":
-		[
-			{
-				"id": 0,
-				"level": 1,
-				"name": [ "Pikeman" ],
-				"faction": "castle",
-				"upgrades": ["Halberdier"],
-				"ability_add": [ [ "CHARGE_IMMUNITY", 0, 0, 0 ] ], 		//pikeman immunity to Champion charge bonus
-				"defname": "CPKMAN.DEF"
-			},
-
-			{
-				"id": 1,
-				"level": 1,
-				"name": [ "Halberdier" ],
-				"faction": "castle",
-				"ability_add": [ [ "CHARGE_IMMUNITY", 0, 0, 0 ] ], 		//halberdier immunity to Champion charge bonus
-				"defname": "CHALBD.DEF"
-			},
-
-			{
-				"id": 2,
-				"level": 2,
-				"name": [ "Archer", "LightCrossbowman" ],
-				"faction": "castle",
-				"upgrades": ["HeavyCrossbowman"],
-				"defname": "CLCBOW.DEF",
-				"projectile_defname": "PLCBOWX.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 3,
-				"level": 2,
-				"name": [ "HeavyCrossbowman" ],
-				"faction": "castle",
-				"defname": "CHCBOW.DEF",
-				"projectile_defname": "PLCBOWX.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 4,
-				"level": 3,
-				"name": [ "Griffin" ],
-				"faction": "castle",
-				"ability_add": [ [ "ADDITIONAL_RETALIATION", 1, 0, 0 ] ], 	//griffins retaliate twice
-				"upgrades": ["RoyalGriffin"],
-				"defname": "CGRIFF.DEF"
-			},
-
-			{
-				"id": 5,
-				"level": 3,
-				"name": [ "RoyalGriffin" ],
-				"faction": "castle",
-				"ability_add": [ [ "UNLIMITED_RETALIATIONS", 0, 0, 0 ] ],	//royal griffins retaliate always
-				"defname": "CRGRIF.DEF"
-			},
-
-			{
-				"id": 6,
-				"level": 4,
-				"name": [ "Swordsman" ],
-				"faction": "castle",
-				"upgrades": ["Crusader"],
-				"defname": "CSWORD.DEF"
-			},
-
-			{
-				"id": 7,
-				"level": 4,
-				"name": [ "Crusader" ],
-				"faction": "castle",
-				"defname": "CCRUSD.DEF"
-			},
-
-			{
-				"id": 8,
-				"level": 5,
-				"name": [ "Monk" ],
-				"faction": "castle",
-				"upgrades": ["Zealot"],
-				"defname": "CMONKK.DEF",
-				"projectile_defname": "CPRZEAX.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 9,
-				"level": 5,
-				"name": [ "Zealot" ],
-				"faction": "castle",
-				"defname": "CZEALT.DEF",
-				"projectile_defname": "CPRZEAX.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 10,
-				"level": 6,
-				"name": [ "Cavalier" ],
-				"faction": "castle",
-				"upgrades": ["Champion"],
-				"defname": "CCAVLR.DEF"
-			},
-
-			{
-				"id": 11,
-				"level": 6,
-				"name": [ "Champion" ],
-				"faction": "castle",
-				"defname": "CCHAMP.DEF"
-			},
-
-			{
-				"id": 12,
-				"level": 7,
-				"name": [ "Angel" ],
-				"faction": "castle",
-				"ability_add": [ [ "HATE", 50, 55, 0 ],					//angels hate archdevils
-							   	 [ "HATE", 50, 54, 0 ] ],			   	 	//angels hate devils
-				"upgrades": ["Archangel"],
-				"defname": "CANGEL.DEF"
-			},
-
-			{
-				"id": 13,
-				"level": 7,
-				"name": [ "Archangel" ],
-				"faction": "castle",
-				"ability_add": [ [ "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]],
-				"defname": "CRANGL.DEF"
-			},
-
-			{
-				"id": 14,
-				"level": 1,
-				"name": [ "Centaur" ],
-				"faction": "rampart",
-				"upgrades": ["EliteCentaur"],
-				"defname": "CCENTR.DEF"
-			},
-
-			{
-				"id": 15,
-				"level": 1,
-				"name": [ "EliteCentaur" ],
-				"faction": "rampart",
-				"defname": "CECENT.DEF"
-			},
-
-			{
-				"id": 16,
-				"level": 2,
-				"name": [ "Dwarf" ],
-				"faction": "rampart",
-				"ability_add": [ [ "MAGIC_RESISTANCE", 20, 0, 0 ] ], 		//dwarf's magic resistance 20%
-				"upgrades": ["BattleDwarf"],
-				"defname": "CDWARF.DEF"
-			},
-
-			{
-				"id": 17,
-				"level": 2,
-				"name": [ "BattleDwarf" ],
-				"faction": "rampart",
-				"ability_add": [ [ "MAGIC_RESISTANCE", 40, 0, 0 ] ], 	 	//battle dwarf's magic resistance 40%
-				"defname": "CBDWAR.DEF"
-			},
-
-			{
-				"id": 18,
-				"level": 3,
-				"name": [ "WoodElf" ],
-				"faction": "rampart",
-				"upgrades": ["GrandElf"],
-				"defname": "CELF.DEF",
-				"projectile_defname": "PELFX.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 19,
-				"level": 3,
-				"name": [ "GrandElf" ],
-				"faction": "rampart",
-				"defname": "CGRELF.DEF",
-				"projectile_defname": "PELFX.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 20,
-				"level": 4,
-				"name": [ "Pegasus" ],
-				"faction": "rampart",
-				"ability_add": [ [ "CHANGES_SPELL_COST_FOR_ENEMY", 2, 0, 0 ] ],	//pegasus makes spell cost higher for enemy mage
-				"upgrades": ["SilverPegasus"],
-				"defname": "CPEGAS.DEF"
-			},
-
-			{
-				"id": 21,
-				"level": 4,
-				"name": [ "SilverPegasus" ],
-				"faction": "rampart",
-				"ability_add": [ [ "CHANGES_SPELL_COST_FOR_ENEMY", 2, 0, 0 ] ], 	//silver pegasus makes spell cost higher for enemy mage
-				"defname": "CAPEGS.DEF"
-			},
-
-			{
-				"id": 22,
-				"level": 5,
-				"name": [ "Treefolk" ],
-				"faction": "rampart",
-				"ability_add": [ [ "SPELL_AFTER_ATTACK", 100, 72, 0 ] ],   //dendroids cast bind
-				"upgrades": ["BriarTreefolk"],
-				"defname": "CTREE.DEF"
-			},
-
-			{
-				"id": 23,
-				"level": 5,
-				"name": [ "BriarTreefolk" ],
-				"faction": "rampart",
-				"ability_add": [ [ "SPELL_AFTER_ATTACK", 100, 72, 0 ] ],	//dendroid guards cast bind
-				"defname": "CBTREE.DEF"
-			},
-
-			{
-				"id": 24,
-				"level": 6,
-				"name": [ "Unicorn" ],
-				"faction": "rampart",
-				"ability_add": [ [ "SPELL_RESISTANCE_AURA", 0, 55, 0 ],	//unicorn
-							   	 [ "SPELL_AFTER_ATTACK", 20, 62, 0 ] ],	//unicorns cast blind with 20% probability
-				"upgrades": ["WarUnicorn"],
-				"defname": "CUNICO.DEF"
-			},
-
-			{
-				"id": 25,
-				"level": 6,
-				"name": [ "WarUnicorn" ],
-				"faction": "rampart",
-				"ability_add": [ [ "SPELL_RESISTANCE_AURA", 20, 55, 0 ], 	//war unicorn
-				 			   	 [ "SPELL_AFTER_ATTACK", 20, 62, 0 ] ],	//war unicorns cast blind with 20% probability
-				"defname": "CWUNIC.DEF"
-			},
-
-			{
-				"id": 26,
-				"level": 7,
-				"name": [ "GreenDragon" ],
-				"faction": "rampart",
-				"ability_add": [ [ "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"],
-				"defname": "CGDRAG.DEF"
-			},
-
-			{
-				"id": 27,
-				"level": 7,
-				"name": [ "GoldDragon" ],
-				"faction": "rampart",
-				"ability_add": [ [ "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
-				"defname": "CDDRAG.DEF"
-			},
-
-			{
-				"id": 28,
-				"level": 1,
-				"name": [ "ApprenticeGremlin" ],
-				"faction": "tower",
-				"upgrades": ["MasterGremlin"],
-				"defname": "CGREMA.DEF"
-			},
-
-			{
-				"id": 29,
-				"level": 1,
-				"name": [ "MasterGremlin" ],
-				"faction": "tower",
-				"defname": "CGREMM.DEF",
-				"projectile_defname": "CPRGRE.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 30,
-				"level": 2,
-				"name": [ "StoneGargoyle" ],
-				"faction": "tower",
-				"ability_add": [ [ "NON_LIVING", 0, 0, 0 ] ],  	  		//stone gargoyles are non-living
-				"upgrades": ["ObsidianGargoyle"],
-				"defname": "CGARGO.DEF"
-			},
-
-			{
-				"id": 31,
-				"level": 2,
-				"name": [ "ObsidianGargoyle" ],
-				"faction": "tower",
-				"ability_add": [ [ "NON_LIVING", 0, 0, 0 ] ],  			//obsidian gargoyles are non-living
-				"defname": "COGARG.DEF"
-			},
-
-			{
-				"id": 32,
-				"level": 3,
-				"name": [ "IronGolem" ],
-				"faction": "tower",
-				"ability_add": [ [ "SPELL_DAMAGE_REDUCTION", 50, -1, 0 ],		//stone golems reduce dmg from spells
-							   [ "NON_LIVING", 0, 0, 0 ] ],  			//stone golems are non-living
-				"upgrades": ["StoneGolem"], //?
-				"defname": "CSGOLE.DEF"
-			},
-
-			{
-				"id": 33,
-				"level": 3,
-				"name": [ "StoneGolem" ],
-				"faction": "tower",
-				"ability_add": [ [ "SPELL_DAMAGE_REDUCTION", 75, -1, 0 ],	   	//iron golems reduce dmg from spells
-							   [ "NON_LIVING", 0, 0, 0 ] ],  			//iron golems are non-living
-				"defname": "CIGOLE.DEF"
-			},
-
-			{
-				"id": 34,
-				"level": 4,
-				"name": [ "Mage" ],
-				"faction": "tower",
-				"ability_add": [ [ "CHANGES_SPELL_COST_FOR_ALLY", 2, 0, 0 ] ],   	//mages reduce spell cost
-				"upgrades": ["ArchMage"],
-				"defname": "CMAGE.DEF",
-				"projectile_defname": "PMAGEX.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 35,
-				"level": 4,
-				"name": [ "ArchMage" ],
-				"faction": "tower",
-				"ability_add": [ [ "CHANGES_SPELL_COST_FOR_ALLY", 2, 0, 0 ]],		//archmages reduce spell cost
-				"defname": "CAMAGE.DEF",
-				"projectile_defname": "PMAGEX.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 36,
-				"level": 5,
-				"name": [ "Genie" ],
-				"faction": "tower",
-				"ability_add": [ [ "HATE", 50, 53, 0 ],				  	//master genies hate efreets
-							   [ "HATE", 50, 52, 0 ] ],				  	//genies hate efreet sultans
-				"upgrades": ["Caliph"],
-				"defname": "CGENIE.DEF"
-			},
-
-			{
-				"id": 37,
-				"level": 5,
-				"name": [ "Caliph" ],
-				"faction": "tower",
-				"ability_add": [ [ "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
-				"defname": "CSULTA.DEF"
-			},
-
-			{
-				"id": 38,
-				"level": 6,
-				"name": [ "NagaSentinel" ],
-				"faction": "tower",
-				"ability_add": [ [ "BLOCKS_RETALIATION", 0, 0, 0 ] ],		//nagas block retaliation
-				"upgrades": ["NagaGuardian"],
-				"defname": "CNAGA.DEF"
-			},
-
-			{
-				"id": 39,
-				"level": 6,
-				"name": [ "NagaGuardian" ],
-				"faction": "tower",
-				"ability_add": [ [ "BLOCKS_RETALIATION", 0, 0, 0 ] ],  	//naga queens block retaliation
-				"defname": "CNAGAG.DEF"
-			},
-
-			{
-				"id": 40,
-				"level": 7,
-				"name": [ "LesserTitan" ],
-				"faction": "tower",
-				"ability_add": [ ["MIND_IMMUNITY", 0, 0, 0] ],			//giants are immune to mind spells
-				"upgrades": ["GreaterTitan"],
-				"defname": "CLTITA.DEF"
-			},
-
-			{
-				"id": 41,
-				"level": 7,
-				"name": [ "GreaterTitan" ],
-				"faction": "tower",
-				"ability_add": [ ["MIND_IMMUNITY", 0, 0, 0],			//Titans are immune to mind spells
-								 [ "HATE", 50, 83, 0 ] ],					//titans hate black dragons
-				"defname": "CGTITA.DEF",
-				"projectile_defname": "CPRGTIX.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 42,
-				"level": 1,
-				"name": [ "Imp" ],
-				"faction": "inferno",
-				"upgrades": ["Familiar"],
-				"defname": "CIMP.DEF"
-			},
-
-			{
-				"id": 43,
-				"level": 1,
-				"name": [ "Familiar" ],
-				"faction": "inferno",
-				"ability_add": [ [ "MANA_CHANNELING", 20, 0, 0 ] ], 		//familiars
-				"defname": "CFAMIL.DEF"
-			},
-
-			{
-				"id": 44,
-				"level": 2,
-				"name": [ "Gog" ],
-				"faction": "inferno",
-				"upgrades": ["Magog"],
-				"defname": "CGOG.DEF",
-				"projectile_defname": "CPRGOGX.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 45,
-				"level": 2,
-				"name": [ "Magog" ],
-				"faction": "inferno",
-				"ability_add": [ [ "SPELL_LIKE_ATTACK", 0, 21, 0 ] ], 		//magogs fire with fireballs
-				"defname": "CMAGOG.DEF",
-				"projectile_defname": "CPRGOGX.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 46,
-				"level": 3,
-				"name": [ "HellHound" ],
-				"faction": "inferno",
-				"upgrades": ["Cerberus"],
-				"ability_remove": [ "FLYING" ], //hell hound doesn't fly
-				"defname": "CHHOUN.DEF"
-			},
-
-			{
-				"id": 47,
-				"level": 3,
-				"name": [ "Cerberus" ],
-				"faction": "inferno",
-				"ability_add": [ [ "THREE_HEADED_ATTACK", 0, 0, 0 ],
-							   	 [ "BLOCKS_RETALIATION", 0, 0, 0 ] ],
-				"ability_remove": [ "FLYING" ],  //cerberus doesn't fly
-				"defname": "CCERBU.DEF"
-			},
-
-			{
-				"id": 48,
-				"level": 4,
-				"name": [ "Single-HornedDemon" ],
-				"faction": "inferno",
-				"upgrades": ["Dual-HornedDemon"],
-				"defname": "COHDEM.DEF"
-			},
-
-			{
-				"id": 49,
-				"level": 4,
-				"name": [ "Dual-HornedDemon" ],
-				"faction": "inferno",
-				"defname": "CTHDEM.DEF"
-			},
-
-			{
-				"id": 50,
-				"level": 5,
-				"name": [ "PitFiend" ],
-				"faction": "inferno",
-				"upgrades": ["PitFoe"],
-				"defname": "CPFIEN.DEF"
-			},
-
-			{
-				"id": 51,
-				"level": 5,
-				"name": [ "PitFoe" ],
-				"faction": "inferno",
-				"ability_add": [ [ "DAEMON_SUMMONING", 50, 48, 0 ],
-								[ "CASTS", 1, 0, 0] ],		//pit lord
-				"defname": "CPFOE.DEF"
-			},
-
-			{
-				"id": 52,
-				"level": 6,
-				"name": [ "Efreet" ],
-				"faction": "inferno",
-				"ability_add": [ [ "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"],
-				"defname": "CEFREE.DEF"
-			},
-
-			{
-				"id": 53,
-				"level": 6,
-				"name": [ "EfreetSultan" ],
-				"faction": "inferno",
-				"ability_add": [ [ "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
-				"defname": "CEFRES.DEF"
-			},
-
-			{
-				"id": 54,
-				"level": 7,
-				"name": [ "Devil" ],
-				"faction": "inferno",
-				"ability_remove": [ "FLYING" ],  //use teleport instead
-				"ability_add": [ [ "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"],
-				"defname": "CDEVIL.DEF"
-			},
-
-			{
-				"id": 55,
-				"level": 7,
-				"name": [ "ArchDevil" ],
-				"faction": "inferno",
-				"ability_remove": [ "FLYING" ],  //use teleport instead
-				"ability_add": [ [ "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
-				"defname": "CADEVL.DEF"
-			},
-
-			{
-				"id": 56,
-				"level": 1,
-				"name": [ "Skeleton" ],
-				"faction": "necropolis",
-				"upgrades": ["SkeletonWarrior"],
-				"defname": "CSKELE.DEF"
-			},
-
-			{
-				"id": 57,
-				"level": 1,
-				"name": [ "SkeletonWarrior" ],
-				"faction": "necropolis",
-				"defname": "CWSKEL.DEF"
-			},
-
-			{
-				"id": 58,
-				"level": 2,
-				"name": [ "Zombie" ],
-				"faction": "necropolis",
-				"upgrades": ["ZombieLord"],
-				"defname": "CZOMBI.DEF"
-			},
-
-			{
-				"id": 59,
-				"level": 2,
-				"name": [ "ZombieLord" ],
-				"faction": "necropolis",
-				"defname": "CZOMLO.DEF"
-			},
-
-			{
-				"id": 60,
-				"level": 3,
-				"name": [ "Wight" ],
-				"faction": "necropolis",
-				"ability_add": [ [ "FULL_HP_REGENERATION", 0, 1, 0 ] ],			//wight
-				"upgrades": ["Wraith"],
-				"defname": "CWIGHT.DEF"
-			},
-
-			{
-				"id": 61,
-				"level": 3,
-				"name": [ "Wraith" ],
-				"faction": "necropolis",
-				"ability_add": [ [ "FULL_HP_REGENERATION", 0, 1, 0 ], 			//wraith
-							   	 [ "MANA_DRAIN", 2, 0, 0 ] ],
-				"defname": "CWRAIT.DEF"
-			},
-
-			{
-				"id": 62,
-				"level": 4,
-				"name": [ "Vampire" ],
-				"faction": "necropolis",
-				"ability_add": [ [ "BLOCKS_RETALIATION", 0, 0, 0 ] ],		//vampires		//vampire lords
-				"upgrades": ["Nosferatu"],
-				"defname": "CVAMP.DEF"
-			},
-
-			{
-				"id": 63,
-				"level": 4,
-				"name": [ "Nosferatu" ],
-				"faction": "necropolis",
-				"ability_add": [ [ "LIFE_DRAIN", 0, 0, 0 ],
-							   	 [ "BLOCKS_RETALIATION", 0, 0, 0 ] ],		//vampire lords
-				"defname": "CNOSFE.DEF"
-			},
-
-			{
-				"id": 64,
-				"level": 5,
-				"name": [ "Lich" ],
-				"faction": "necropolis",
-				"ability_add": [ [ "SPELL_LIKE_ATTACK", 0, 76, 0 ] ],		//liches
-				"upgrades": ["PowerLich"],
-				"defname": "CLICH.DEF",
-				"projectile_defname": "PLICH.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 65,
-				"level": 5,
-				"name": [ "PowerLich" ],
-				"faction": "necropolis",
-				"ability_add": [ [ "SPELL_LIKE_ATTACK", 0, 76, 0 ] ], 		//power liches
-				"defname": "CPLICH.DEF",
-				"projectile_defname": "PLICH.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 66,
-				"level": 6,
-				"name": [ "BlackKnight" ],
-				"faction": "necropolis",
-				"ability_add": [ [ "SPELL_AFTER_ATTACK", 20, 42, 0 ] ], 	//black knights
-				"upgrades": ["BlackLord"],
-				"defname": "CBKNIG.DEF"
-			},
-
-			{
-				"id": 67,
-				"level": 6,
-				"name": [ "BlackLord" ],
-				"faction": "necropolis",
-				"ability_add": [ [ "SPELL_AFTER_ATTACK", 20, 42, 0 ], 	//dread knights
-							   	 [ "DOUBLE_DAMAGE_CHANCE", 20, 0, 0 ] ],	//vampire lords
-				"defname": "CBLORD.DEF"
-			},
-
-			{
-				"id": 68,
-				"level": 7,
-				"name": [ "BoneDragon" ],
-				"faction": "necropolis",
-				"ability_add": [ [ "DRAGON_NATURE", 0, 0, 0 ] ],			//bone dragon is a dragon
-				"upgrades": ["GhostDragon"],
-				"defname": "CNDRGN.DEF"
-			},
-
-			{
-				"id": 69,
-				"level": 7,
-				"name": [ "GhostDragon" ],
-				"faction": "necropolis",
-				"ability_add": [ [ "DRAGON_NATURE", 0, 0, 0 ],			//ghost dragon is a dragon
-							   	 [ "SPELL_AFTER_ATTACK", 20, 75, 0 ] ],  	//ghost dragon
-				"defname": "CHDRGN.DEF"
-			},
-
-			{
-				"id": 70,
-				"level": 1,
-				"name": [ "Troglodyte" ],
-				"faction": "dungeon",
-				"ability_add": [ [ "SPELL_IMMUNITY", 0, 62, 0 ] ],	  	   	//troglodytes are immune to blind
-				"upgrades": ["InfernalTroglodyte"],
-				"defname": "CTROGL.DEF"
-			},
-
-			{
-				"id": 71,
-				"level": 1,
-				"name": [ "InfernalTroglodyte" ],
-				"faction": "dungeon",
-				"ability_add": [ [ "SPELL_IMMUNITY", 0, 62, 0 ] ],		   	//infernal troglodytes are immune to blind
-				"defname": "CITROG.DEF"
-			},
-
-			{
-				"id": 72,
-				"level": 2,
-				"name": [ "Harpy" ],
-				"faction": "dungeon",
-				"ability_add": [ [ "RETURN_AFTER_STRIKE", 0, 0, 0 ] ],	   	//Harpies return after attack
-				"upgrades": ["HarpyHag"],
-				"defname": "CHARPY.DEF"
-			},
-
-			{
-				"id": 73,
-				"level": 2,
-				"name": [ "HarpyHag", "M73" ],
-				"faction": "dungeon",
-				"ability_add": [ [ "RETURN_AFTER_STRIKE", 0, 0, 0 ],	   	//Harpy Hags return after attack
-							   	 [ "BLOCKS_RETALIATION", 0, 0, 0 ] ],	   	//Harpy Hags
-				"defname": "CHARPH.DEF"
-			},
-
-			{
-				"id": 74,
-				"level": 3,
-				"name": [ "Beholder" ],
-				"faction": "dungeon",
-				"upgrades": ["EvilEye"],
-				"defname": "CBEHOL.DEF",
-				"projectile_defname": "SMBALX.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 75,
-				"level": 3,
-				"name": [ "EvilEye", "M75" ],
-				"faction": "dungeon",
-				"defname": "CEVEYE.DEF",
-				"projectile_defname": "SMBALX.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 76,
-				"level": 4,
-				"name": [ "Medusa", "Medusae" ],
-				"faction": "dungeon",
-				"ability_add": [ [ "SPELL_AFTER_ATTACK", 20, 70, 2000 ] ],  	//medusas			//minotaurs
-				"upgrades": ["MedusaQueen"],
-				"defname": "CMEDUS.DEF",
-				"projectile_defname": "PMEDUSX.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 77,
-				"level": 4,
-				"name": [ "MedusaQueen" ],
-				"faction": "dungeon",
-				"ability_add": [ [ "SPELL_AFTER_ATTACK", 20, 70, 2000 ] ],  	//medusa queens			//minotaur kings
-				"defname": "CMEDUQ.DEF",
-				"projectile_defname": "PMEDUSX.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 78,
-				"level": 5,
-				"name": [ "Minotaur" ],
-				"faction": "dungeon",
-				"ability_add": [ [ "SELF_MORALE", 0, 0, 0 ] ],
-				"upgrades": ["MinotaurKing"],
-				"defname": "CMINOT.DEF"
-			},
-
-			{
-				"id": 79,
-				"level": 5,
-				"name": [ "MinotaurKing" ],
-				"faction": "dungeon",
-				"ability_add": [ [ "SELF_MORALE", 0, 0, 0 ] ],
-				"defname": "CMINOK.DEF"
-			},
-
-			{
-				"id": 80,
-				"level": 6,
-				"name": [ "Manticore" ],
-				"faction": "dungeon",
-				"upgrades": ["Scorpicore"],
-				"defname": "CMCORE.DEF"
-			},
-
-			{
-				"id": 81,
-				"level": 6,
-				"name": [ "Scorpicore" ],
-				"faction": "dungeon",
-				"ability_add": [ [ "SPELL_AFTER_ATTACK", 20, 74, 0 ] ],   	//scorpicore
-				"defname": "CCMCOR.DEF"
-			},
-
-			{
-				"id": 82,
-				"level": 7,
-				"name": [ "RedDragon" ],
-				"faction": "dungeon",
-				"ability_add": [ [ "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"],
-				"defname": "CRDRGN.DEF"
-			},
-
-			{
-				"id": 83,
-				"level": 7,
-				"name": [ "BlackDragon" ],
-				"faction": "dungeon",
-				"ability_add": [ [ "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
-				"defname": "CBDRGN.DEF"
-			},
-
-			{
-				"id": 84,
-				"level": 1,
-				"name": [ "Goblin", "Goblins" ],
-				"faction": "stronghold",
-				"upgrades": ["Hobgoblin"],
-				"defname": "CGOBLI.DEF"
-			},
-
-			{
-				"id": 85,
-				"level": 1,
-				"name": [ "Hobgoblin" ],
-				"faction": "stronghold",
-				"defname": "CHGOBL.DEF"
-			},
-
-			{
-				"id": 86,
-				"level": 2,
-				"name": [ "GoblinWolfRider" ],
-				"faction": "stronghold",
-				"upgrades": ["HobgoblinWolfRider"],
-				"defname": "CBWLFR.DEF"
-			},
-
-			{
-				"id": 87,
-				"level": 2,
-				"name": [ "HobgoblinWolfRider" ],
-				"faction": "stronghold",
-				"ability_add": [ [ "ADDITIONAL_ATTACK", 1, 0, 0 ] ],		//wolf raider
-				"defname": "CUWLFR.DEF"
-			},
-
-			{
-				"id": 88,
-				"level": 3,
-				"name": [ "Orc" ],
-				"faction": "stronghold",
-				"upgrades": ["OrcChieftain"],
-				"defname": "CORC.DEF",
-				"projectile_defname": "PORCHX.DEF",
-				"projectile_spin": true
-			},
-
-			{
-				"id": 89,
-				"level": 3,
-				"name": [ "OrcChieftain" ],
-				"faction": "stronghold",
-				"defname": "CORCCH.DEF",
-				"projectile_defname": "PORCHX.DEF",
-				"projectile_spin": true
-			},
-
-			{
-				"id": 90,
-				"level": 4,
-				"name": [ "Ogre" ],
-				"faction": "stronghold",
-				"upgrades": ["OgreMage"],
-				"defname": "COGRE.DEF"
-			},
-
-			{
-				"id": 91,
-				"level": 4,
-				"name": [ "OgreMage" ],
-				"faction": "stronghold",
-				"ability_add": [ [ "SPELLCASTER", 2, 43, 0 ],
-								 [ "CASTS", 3, 0, 0],
-								 [ "CREATURE_ENCHANT_POWER", 3, 0, 0]],   	   	   	//ogre magi cast bloodlust
-				"defname": "COGMAG.DEF"
-			},
-
-			{
-				"id": 92,
-				"level": 5,
-				"name": [ "Roc" ],
-				"faction": "stronghold",
-				"upgrades": ["Thunderbird"],
-				"defname": "CROC.DEF"
-			},
-
-			{
-				"id": 93,
-				"level": 5,
-				"name": [ "Thunderbird" ],
-				"faction": "stronghold",
-				"ability_add": [ [ "SPECIFIC_SPELL_POWER", 10, 77, 0 ],	//10 damage per unit
-							   	 [ "SPELL_AFTER_ATTACK", 20, 77, 0 ] ],   	//thunderbirds
-				"defname": "CTBIRD.DEF"
-			},
-
-			{
-				"id": 94,
-				"level": 6,
-				"name": [ "Cyclops" ],
-				"faction": "stronghold",
-				"upgrades": ["CyclopsLord"],
-				"defname": "CCYCLR.DEF",
-				"projectile_defname": "PCYCLBX.DEF",
-				"projectile_spin": true
-			},
-
-			{
-				"id": 95,
-				"level": 6,
-				"name": [ "CyclopsLord" ],
-				"faction": "stronghold",
-				"defname": "CCYCLLOR.DEF",
-				"projectile_defname": "PCYCLBX.DEF",
-				"projectile_spin": true
-			},
-
-			{
-				"id": 96,
-				"level": 7,
-				"name": [ "YoungBehemoth" ],
-				"faction": "stronghold",
-				"ability_add": [ [ "ENEMY_DEFENCE_REDUCTION", 40, 0, 0 ] ],		//behemots
-				"upgrades": ["AncientBehemoth"],
-				"defname": "CYBEHE.DEF"
-			},
-
-			{
-				"id": 97,
-				"level": 7,
-				"name": [ "AncientBehemoth" ],
-				"faction": "stronghold",
-				"ability_add": [ [ "ENEMY_DEFENCE_REDUCTION", 80, 0, 0 ] ],		//ancient behemots
-				"defname": "CABEHE.DEF"
-			},
-
-			{
-				"id": 98,
-				"level": 1,
-				"name": [ "Gnoll" ],
-				"faction": "fortress",
-				"upgrades": ["GnollMarauder"],
-				"defname": "CGNOLL.DEF"
-			},
-
-			{
-				"id": 99,
-				"level": 1,
-				"name": [ "GnollMarauder" ],
-				"faction": "fortress",
-				"defname": "CGNOLM.DEF"
-			},
-
-			{
-				"id": 100,
-				"level": 2,
-				"name": [ "PrimitiveLizardman", "Lizardman" ],
-				"faction": "fortress",
-				"upgrades": ["AdvancedLizardman"],
-				"defname": "CPLIZA.DEF",
-				"projectile_defname": "PPLIZAX.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 101,
-				"level": 2,
-				"name": [ "AdvancedLizardman" ],
-				"faction": "fortress",
-				"defname": "CALIZA.DEF",
-				"projectile_defname": "PPLIZAX.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 102,
-				"level": 5,
-				"name": [ "CopperGorgon" ],
-				"faction": "fortress",
-				"upgrades": ["BronzeGorgon"],
-				"defname": "CCGORG.DEF"
-			},
-
-			{
-				"id": 103,
-				"level": 5,
-				"name": [ "BronzeGorgon" ],
-				"faction": "fortress",
-				"ability_add": [ [ "DEATH_STARE", 10, 0, 0 ] ],   	//mighty gorgons
-				"defname": "CBGOG.DEF"
-			},
-
-			{
-				"id": 104,
-				"level": 3,
-				"name": [ "Dragonflies", "DragonFly", "SerpentFly" ],
-				"faction": "fortress",
-				"ability_add": [ [ "SPELL_AFTER_ATTACK", 100, 78, 0 ] ],  	//serpent fly
-				"upgrades": ["FireDragonFly"],
-				"defname": "CDRFLY.DEF"
-			},
-
-			{
-				"id": 105,
-				"level": 3,
-				"name": [ "FireDragonFly" ],
-				"faction": "fortress",
-				"ability_add": [ [ "SPELL_AFTER_ATTACK", 100, 78, 0 ],	//dragon fly
-							   [ "SPELL_AFTER_ATTACK", 100, 45, 0 ] ],  	//mighty gorgons
-				"defname": "CDRFIR.DEF"
-			},
-
-			{
-				"id": 106,
-				"level": 4,
-				"name": [ "Basilisk" ],
-				"faction": "fortress",
-				"ability_add": [ [ "SPELL_AFTER_ATTACK", 20, 70, 0 ] ],   	//basilisks
-				"upgrades": ["GreaterBasilisk"],
-				"defname": "CBASIL.DEF"
-			},
-
-			{
-				"id": 107,
-				"level": 4,
-				"name": [ "GreaterBasilisk" ],
-				"faction": "fortress",
-				"ability_add": [ [ "SPELL_AFTER_ATTACK", 20, 70, 0 ] ],   	//greater basilisks
-				"defname": "CGBASI.DEF"
-			},
-
-			{
-				"id": 108,
-				"level": 6,
-				"name": [ "Wyvern" ],
-				"faction": "fortress",
-				"upgrades": ["WyvernMonarch"],
-				"defname": "CWYVER.DEF"
-			},
-
-			{
-				"id": 109,
-				"level": 6,
-				"name": [ "WyvernMonarch" ],
-				"faction": "fortress",
-				"ability_add": [ [ "SPELL_AFTER_ATTACK", 20, 71, 0 ] ],   	//Wyvern Monarch
-				"defname": "CWYVMN.DEF"
-			},
-
-			{
-				"id": 110,
-				"level": 7,
-				"name": [ "Hydra" ],
-				"faction": "fortress",
-				"ability_add": [ [ "BLOCKS_RETALIATION", 0, 0, 0 ], 	   	//hydras
-							   [ "ATTACKS_ALL_ADJACENT", 0, 0, 0 ] ],   	//hydras
-				"upgrades": ["ChaosHydra"],
-				"defname": "CHYDRA.DEF"
-			},
-
-			{
-				"id": 111,
-				"level": 7,
-				"name": [ "ChaosHydra" ],
-				"faction": "fortress",
-				"ability_add": [ [ "BLOCKS_RETALIATION", 0, 0, 0 ], 	   	//chaos hydras
-							   [ "ATTACKS_ALL_ADJACENT", 0, 0, 0 ] ],   	//chaos hydras
-				"defname": "CCHYDR.DEF"
-			},
-
-			{
-				"id": 112,
-				"level": 2,
-				"name": [ "AirElemental", "AirElementals" ],
-				"faction": "conflux",
-				"ability_add": [ [ "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"],
-				"defname": "CAELEM.DEF"
-			},
-
-			{
-				"id": 113,
-				"level": 5,
-				"name": [ "EarthElemental", "EarthElementals" ],
-				"faction": "conflux",
-				"ability_add": [ [ "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": ["StoneElemental"],
-				"defname": "CEELEM.DEF"
-			},
-
-			{
-				"id": 114,
-				"level": 4,
-				"name": [ "FireElemental", "FireElementals" ],
-				"faction": "conflux",
-				"ability_add": [ [ "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": ["ElectricityElemental"],
-				"defname": "CFELEM.DEF"
-			},
-
-			{
-				"id": 115,
-				"level": 3,
-				"name": [ "WaterElemental", "WaterElementals" ],
-				"faction": "conflux",
-				"ability_add": [ [ "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)	//gold golems are non-living
-								 [ "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"],
-				"defname": "CWELEM.DEF"
-			},
-
-			{
-				"id": 116,
-				"level": 4,
-				"name": [ "GoldGolem" ],
-				"faction": "neutral",
-				"ability_add": [ [ "SPELL_DAMAGE_REDUCTION", 85, -1, 0 ],		//gold golems reduce dmg from spells
-							   	 [ "NON_LIVING", 0, 0, 0 ] ],		 	   	//diamond golems are non-living
-				"defname": "CGGOLE.DEF"
-			},
-
-			{
-				"id": 117,
-				"level": 5,
-				"name": [ "DiamondGolem" ],
-				"faction": "neutral",
-				"ability_add": [ [ "SPELL_DAMAGE_REDUCTION", 95, -1, 0 ],		//diamond golems reduce dmg from spells
-							   	 [ "NON_LIVING", 0, 0, 0 ] ],				//psychic elementals shouldn't get morale
-				"defname": "CDGOLE.DEF"
-			},
-
-			{
-				"id": 118,
-				"level": 1,
-				"name": [ "Pixie", "Pixies" ],
-				"faction": "conflux",
-				"upgrades": ["Sprite"],
-				"defname": "CPIXIE.DEF"
-			},
-
-			{
-				"id": 119,
-				"level": 1,
-				"name": [ "Sprite" ],
-				"faction": "conflux",
-				"defname": "CSPRITE.DEF"
-			},
-
-			{
-				"id": 120,
-				"level": 6,
-				"name": [ "PsiElemental" ],
-				"faction": "conflux",
-				"ability_add": [ [ "NON_LIVING", 0, 0, 0 ] ],				//magic elementals shouldn't get morale
-				"ability_remove": [ "DOUBLE_WIDE" ],
-				"upgrades": ["MagicElemental"],
-				"defname": "CPSYEL.DEF"
-			},
-
-			{
-				"id": 121,
-				"level": 6,
-				"name": [ "MagicElemental" ],
-				"faction": "conflux",
-				"ability_add": [ [ "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" ],
-				"defname": "CMAGEL.DEF"
-			},
-
-			{
-				"id": 123,
-				"level": 3,
-				"name": [ "IceElemental" ],
-				"faction": "conflux",
-				"ability_add": [ [ "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 ]],
-				"defname": "CICEE.DEF",
-				"projectile_defname": "PICEE.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 125,
-				"level": 5,
-				"name": [ "StoneElemental" ],
-				"faction": "conflux",
-				"ability_add": [ [ "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 ]],
-				"defname": "CSTONE.DEF"
-			},
-
-			{
-				"id": 127,
-				"level": 2,
-				"name": [ "StormElemental" ],
-				"faction": "conflux",
-				"ability_add": [ [ "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 ]],
-				"defname": "CSTORM.DEF",
-				"projectile_defname": "CPRGTIX.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 129,
-				"level": 4,
-				"name": [ "ElectricityElemental" ],
-				"faction": "conflux",
-				"ability_add": [ [ "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 ]],
-				"defname": "CNRG.DEF"
-			},
-
-			{
-				"id": 130,
-				"level": 7,
-				"name": [ "Firebird" ],
-				"faction": "conflux",
-				"upgrades": ["Pheonix"],
-				"defname": "CFBIRD.DEF"
-			},
-
-			{
-				"id": 131,
-				"level": 7,
-				"name": [ "Pheonix" ],
-				"faction": "conflux",
-				"ability_add": [ [ "CASTS", 1, 0, 0 ],	//Phoenix rebirths once
-							   	 [ "REBIRTH", 20, 0, 0 ] ],	//20% of stack is resurrected
-				"defname": "CPHX.DEF"
-			},
-
-			{
-				"id": 132,
-				"level": 10,
-				"name": [ "AzureDragon" ],
-				"faction": "neutral",
-				"ability_add": [ [ "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
-				"defname": "CADRGN.DEF"
-			},
-
-			{
-				"id": 133,
-				"level": 10,
-				"name": [ "CrystalDragon" ],
-				"faction": "neutral",
-				"ability_add": [ [ "DRAGON_NATURE", 0, 0, 0 ] ],			//crystal dragon is a dragon
-				"ability_remove": [ "FLYING" ],
-				"defname": "CCDRGN.DEF"
-			},
-
-			{
-				"id": 134,
-				"level": 8,
-				"name": [ "FairieDragon" ],
-				"faction": "neutral",
-				"ability_add": [ [ "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
-				"defname": "CFDRGN.DEF"
-			},
-
-			{
-				"id": 135,
-				"level": 10,
-				"name": [ "RustDragon" ],
-				"faction": "neutral",
-				"ability_add": [ [ "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
-				"defname": "CRSDGN.DEF"
-			},
-
-			{
-				"id": 136,
-				"level": 6,
-				"name": [ "Enchanter", "Enchanters" ],
-				"faction": "neutral",
-				"ability_add": [ [ "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
-				"defname": "CENCH.DEF",
-				"projectile_defname": "SMBALX.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 137,
-				"level": 4,
-				"name": [ "Sharpshooter", "Sharpshooters" ],
-				"faction": "neutral",
-				"ability_add": [ [ "NO_WALL_PENALTY", 0, 0, 0 ],
-							   	 [ "NO_DISTANCE_PENALTY", 0, 0, 0 ] ],			//Sharpshooter
-				"defname": "CSHARP.DEF",
-				"projectile_defname": "PELFX.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 138,
-				"level": 1,
-				"name": [ "Halfling" ],
-				"faction": "neutral",
-				"defname": "CHALF.DEF",
-				"projectile_defname": "PHALF.DEF",
-				"projectile_spin": true
-			},
-
-			{
-				"id": 139,
-				"level": 1,
-				"name": [ "Peasant" ],
-				"faction": "neutral",
-				"defname": "CPEAS.DEF"
-			},
-
-			{
-				"id": 140,
-				"level": 2,
-				"name": [ "Boar" ],
-				"faction": "neutral",
-				"ability_add": [ [ "DOUBLE_WIDE", 0, 0, 0 ] ], 			//boar should be treated as double-wide
-				"defname": "CBOAR.DEF"
-			},
-
-			{
-				"id": 141,
-				"level": 3,
-				"name": [ "Mummy" ],
-				"faction": "neutral",
-				"ability_add": [ [ "UNDEAD", 0, 0, 0 ] ],
-				"defname": "CMUMMY.DEF"
-			},
-
-			{
-				"id": 142,
-				"level": 3,
-				"name": [ "warrior" ],
-				"faction": "neutral",
-				"ability_add": [ [ "DOUBLE_WIDE", 0, 0, 0 ] ], 			//nomads should be treated as double-wide
-				"defname": "CNOMAD.DEF"
-			},
-
-			{
-				"id": 143,
-				"level": 2,
-				"name": [ "Rogue" ],
-				"faction": "neutral",
-				"defname": "CROGUE.DEF"
-			},
-
-			{
-				"id": 144,
-				"level": 5,
-				"name": [ "OgreShaman" ],
-				"faction": "neutral",
-				"ability_add": [ [ "FULL_HP_REGENERATION", 0, 0, 0 ] ], 			//troll
-				"defname": "CTROLL.DEF"
-			},
-
-			{
-				"id": 145,
-				"level": 0,
-				"name": [ "Catapult" ],
-				"faction": "neutral",
-				"defname": "SMCATA.DEF",
-				"projectile_defname": "SMCATX.DEF",
-				"projectile_spin": true
-			},
-
-			{
-				"id": 146,
-				"level": 0,
-				"name": [ "Ballista" ],
-				"faction": "neutral",
-				"defname": "SMBAL.DEF",
-				"projectile_defname": "SMBALX.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 147,
-				"level": 0,
-				"name": [ "FirstAidTent" ],
-				"faction": "neutral",
-				"ability_add": [ [ "HEALER", 0, 0, 0 ] ],
-				"defname": "SMTENT.DEF"
-			},
-
-			{
-				"id": 148,
-				"level": 0,
-				"name": [ "AmmoCart" ],
-				"faction": "neutral",
-				"ability_add": [ [ "NOT_ACTIVE", 0, 0, 0 ] ],
-				"defname": "SMCART.DEF"
-			},
-
-			{
-				"id": 149,
-				"level": 0,
-				"name": [ "ArrowTower" ],
-				"faction": "neutral",
-				"ability_add": [ [ "SHOOTER", 0, 0, 0 ] ],
-				"projectile_defname": "SMBALX.DEF", //workaround for crash
-				"defname": "x"
-			},
-
-			{
-				"id": 150,
-				"level": 0,
-				"name": [ "SupremeArchangel" ],
-				"faction": "castle",
-				"defname": "ZM150Z.DEF"
-			},
-
-			{
-				"id": 151,
-				"level": 8,
-				"name": [ "DiamondDragon" ],
-				"faction": "rampart",
-				"ability_add": [ [ "DRAGON_NATURE", 0, 0, 0 ] ],			//diamond dragon is a dragon		//psychic elemental
-				"defname": "ZM151Z.DEF"
-			},
-
-			{
-				"id": 152,
-				"level": 8,
-				"name": [ "LordofThunder" ],
-				"faction": "tower",
-				"defname": "ZM152Z.DEF",
-				"projectile_defname": "CPRGTIX.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 153,
-				"level": 8,
-				"name": [ "HellBaron" ],
-				"faction": "inferno",
-				"defname": "ZM153Z.DEF"
-			},
-
-			{
-				"id": 154,
-				"level": 8,
-				"name": [ "BloodDragon" ],
-				"faction": "necropolis",
-				"ability_add": [ [ "DRAGON_NATURE", 0, 0, 0 ] ],			//blood dragon is a dragon		//magic elemental
-				"defname": "ZM154Z.DEF"
-			},
-
-			{
-				"id": 155,
-				"level": 8,
-				"name": [ "DarknessDragon" ],
-				"faction": "dungeon",
-				"ability_add": [ [ "DRAGON_NATURE", 0, 0, 0 ] ],			//darkness dragon is a dragon
-				"defname": "ZM155Z.DEF"
-			},
-
-			{
-				"id": 156,
-				"level": 8,
-				"name": [ "GhostBehemoth" ],
-				"faction": "stronghold",
-				"defname": "ZM156Z.DEF"
-			},
-
-			{
-				"id": 157,
-				"level": 8,
-				"name": [ "HellHydra" ],
-				"faction": "fortress",
-				"ability_remove": [ "SHOOTER" ],	//Hell Hydra certainly does not shoot
-				"defname": "ZM157Z.DEF"
-			},
-
-			{
-				"id": 158,
-				"level": 8,
-				"name": [ "SacredPhoenix" ],
-				"faction": "conflux",
-				"defname": "ZM158Z.DEF"
-			},
-
-			{
-				"id": 159,
-				"level": 0,
-				"name": [ "Ghost" ],
-				"faction": "neutral",
-				"defname": "ZM159G.DEF"
-			},
-
-			{
-				"id": 160,
-				"level": 0,
-				"name": [ "God1War" ],
-				"faction": "neutral",
-				"defname": "ZM160G.DEF"
-			},
-
-			{
-				"id": 161,
-				"level": 0,
-				"name": [ "God2Peace" ],
-				"faction": "neutral",
-				"defname": "ZM161G.DEF"
-			},
-
-			{
-				"id": 162,
-				"level": 0,
-				"name": [ "God3Mana" ],
-				"faction": "neutral",
-				"defname": "ZM162G.DEF"
-			},
-
-			{
-				"id": 163,
-				"level": 0,
-				"name": [ "God4Lore" ],
-				"faction": "neutral",
-				"defname": "ZM163G.DEF"
-			},
-
-			{
-				"id": 164,
-				"level": 0,
-				"name": [ "MinotaurKing2" ], /// WTF is this? Same ID as Minotaur King from Dungeon
-				"faction": "neutral",
-				"defname": "ZM164GD.DEF"
-			},
-
-			{
-				"id": 165,
-				"level": 0,
-				"name": [ "MineralElemental" ],
-				"faction": "neutral",
-				"defname": "ZM165GD.DEF"
-			},
-
-			{
-				"id": 166,
-				"level": 0,
-				"name": [ "ElectricityElemental2" ], /// WTF is this? Same ID as elemental from Conflux
-				"faction": "neutral",
-				"defname": "ZM166GD.DEF"
-			},
-
-			{
-				"id": 167,
-				"level": 0,
-				"name": [ "AncientBasilisk" ],
-				"faction": "neutral",
-				"defname": "ZM167GD.DEF"
-			},
-
-			{
-				"id": 168,
-				"level": 0,
-				"name": [ "Gorynych" ],
-				"faction": "neutral",
-				"ability_add": [ [ "FLYING", 0, 0, 0 ] ],      //Gorynyches fly
-				"defname": "ZM168DG.DEF"
-			},
-
-			{
-				"id": 169,
-				"level": 0,
-				"name": [ "WarZealot" ],
-				"faction": "neutral",
-				"defname": "ZM169ZL.DEF",
-				"projectile_defname": "CPRZEAX.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 170,
-				"level": 0,
-				"name": [ "Myriad" ],
-				"faction": "neutral",
-				"defname": "ZM170SW.DEF",
-				"projectile_defname": "PLCBOWX.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 171,
-				"level": 0,
-				"name": [ "MedusaMatriarch" ],
-				"faction": "neutral",
-				"defname": "ZM171SR.DEF",
-				"projectile_defname": "PLCBOWX.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 172,
-				"level": 0,
-				"name": [ "Nightmare" ],
-				"faction": "neutral",
-				"defname": "ZM172N.DEF"
-			},
-
-			{
-				"id": 173,
-				"level": 0,
-				"name": [ "SantaGremlin" ],
-				"faction": "neutral",
-				"defname": "ZM173M.DEF",
-				"projectile_defname": "CPRGRE.DEF",
-				"projectile_spin": true
-			},
-
-			{
-				"id": 174,
-				"level": 0,
-				"name": [ "Paladin1" ],
-				"faction": "neutral",
-				"ability_add": [ [ "MAGIC_RESISTANCE", 5, 0, 0 ],
-								[ "CASTS", 1, 0, 0 ] ,
-								[ "CREATURE_ENCHANT_POWER", 1, 0, 0 ] ,
-								[ "SPELLCASTER", 3, 37, 0 ] ], //expert cure
-				"defname": "ZM174NPC.DEF",
-				"projectile_defname": "PLCBOWX.DEF"
-			},
-
-			{
-				"id": 175,
-				"level": 0,
-				"name": [ "Hierophant1" ],
-				"faction": "neutral",
-				"ability_add": [ [ "MAGIC_RESISTANCE", 5, 0, 0 ],
-								[ "CASTS", 1, 0, 0 ] ,
-								[ "CREATURE_ENCHANT_POWER", 1, 0, 0 ] ,
-								[ "SPELLCASTER", 3, 27, 0 ] ], //expert shield
-				"defname": "ZM175NPC.DEF",
-				"projectile_defname": "CPRZEAX.DEF"
-			},
-
-			{
-				"id": 176,
-				"level": 0,
-				"name": [ "TempleGuardian1" ],
-				"faction": "neutral",
-				"ability_add": [ [ "MAGIC_RESISTANCE", 5, 0, 0 ],
-								[ "CASTS", 1, 0, 0 ] ,
-								[ "CREATURE_ENCHANT_POWER", 1, 0, 0 ] ,
-								[ "SPELLCASTER", 3, 44, 0 ] ], //expert precision
-				"defname": "ZM176NPC.DEF",
-				"projectile_defname": "PLCBOWX.DEF"
-			},
-
-			{
-				"id": 177,
-				"level": 0,
-				"name": [ "Succubus1" ],
-				"faction": "neutral",
-				"ability_add": [ [ "MAGIC_RESISTANCE", 5, 0, 0 ],
-								[ "CASTS", 1, 0, 0 ] ,
-								[ "CREATURE_ENCHANT_POWER", 1, 0, 0 ] ,
-								[ "SPELLCASTER", 3, 29, 0 ] ], //expert fire shield
-				"defname": "ZM177NPC.DEF",
-				"projectile_defname": "PLCBOWX.DEF"
-			},
-
-			{
-				"id": 178,
-				"level": 0,
-				"name": [ "SoulEater1" ],
-				"faction": "neutral",
-				"ability_add": [ [ "MAGIC_RESISTANCE", 5, 0, 0 ],
-								[ "CASTS", 1, 0, 0 ] ,
-								[ "CREATURE_ENCHANT_POWER", 1, 0, 0 ] ,
-								[ "SPELLCASTER", 3, 39, 0 ] ], //expert animate dead
-				"defname": "ZM178NPC.DEF",
-				"projectile_defname": "PLCBOWX.DEF"
-			},
-
-			{
-				"id": 179,
-				"level": 0,
-				"name": [ "Brute1" ],
-				"faction": "neutral",
-				"ability_add": [ [ "MAGIC_RESISTANCE", 5, 0, 0 ],
-								[ "CASTS", 1, 0, 0 ] ,
-								[ "CREATURE_ENCHANT_POWER", 1, 0, 0 ] ,
-								[ "SPELLCASTER", 3, 46, 0 ] ], //expert stone skin
-				"defname": "ZM179NPC.DEF",
-				"projectile_defname": "PLCBOWX.DEF"
-			},
-
-			{
-				"id": 180,
-				"level": 0,
-				"name": [ "OgreLeader1" ],
-				"faction": "neutral",
-				"ability_add": [ [ "MAGIC_RESISTANCE", 5, 0, 0 ],
-								[ "CASTS", 1, 0, 0 ] ,
-								[ "CREATURE_ENCHANT_POWER", 1, 0, 0 ] ,
-								[ "SPELLCASTER", 3, 37, 0 ] ], //expert cure
-				"defname": "ZM180NPC.DEF",
-				"projectile_defname": "PLCBOWX.DEF"
-			},
-
-			{
-				"id": 181,
-				"level": 0,
-				"name": [ "Shaman1" ],
-				"faction": "neutral",
-				"ability_add": [ [ "MAGIC_RESISTANCE", 5, 0, 0 ],
-								[ "CASTS", 1, 0, 0 ] ,
-								[ "CREATURE_ENCHANT_POWER", 1, 0, 0 ] ,
-								[ "SPELLCASTER", 3, 53, 0 ] ], //expert haste
-				"defname": "ZM181NPC.DEF",
-				"projectile_defname": "PLCBOWX.DEF"
-			},
-
-			{
-				"id": 182,
-				"level": 0,
-				"name": [ "AstralSpirit1" ],
-				"faction": "neutral",
-				"ability_add": [ [ "MAGIC_RESISTANCE", 5, 0, 0 ],
-								[ "CASTS", 1, 0, 0 ] ,
-								[ "CREATURE_ENCHANT_POWER", 1, 0, 0 ] ,
-								[ "SPELLCASTER", 3, 58, 0 ] ], //expert counterstrike
-				"defname": "ZM182NPC.DEF",
-				"projectile_defname": "PLCBOWX.DEF"
-			},
-
-			{
-				"id": 183,
-				"level": 0,
-				"name": [ "Paladin2" ],
-				"faction": "neutral",
-				"defname": "ZM174NPC.DEF"
-			},
-
-			{
-				"id": 184,
-				"level": 0,
-				"name": [ "Hierophant2" ],
-				"faction": "neutral",
-				"defname": "ZM175NPC.DEF"
-			},
-
-			{
-				"id": 185,
-				"level": 0,
-				"name": [ "TempleGuardian2" ],
-				"faction": "neutral",
-				"defname": "ZM176NPC.DEF"
-			},
-
-			{
-				"id": 186,
-				"level": 0,
-				"name": [ "Succubus2" ],
-				"faction": "neutral",
-				"defname": "ZM177NPC.DEF"
-			},
-
-			{
-				"id": 187,
-				"level": 0,
-				"name": [ "SoulEater2" ],
-				"faction": "neutral",
-				"defname": "ZM178NPC.DEF"
-			},
-
-			{
-				"id": 188,
-				"level": 0,
-				"name": [ "Brute2" ],
-				"faction": "neutral",
-				"defname": "ZM179NPC.DEF"
-			},
-
-			{
-				"id": 189,
-				"level": 0,
-				"name": [ "OgreLeader2" ],
-				"faction": "neutral",
-				"defname": "ZM180NPC.DEF"
-			},
-
-			{
-				"id": 190,
-				"level": 0,
-				"name": [ "Shaman2" ],
-				"faction": "neutral",
-				"defname": "ZM181NPC.DEF"
-			},
-
-			{
-				"id": 191,
-				"level": 0,
-				"name": [ "AstralSpirit2" ],
-				"faction": "neutral",
-				"defname": "ZM182NPC.DEF"
-			},
-
-			{
-				"id": 192,
-				"level": 0,
-				"name": [ "SylvanCentaur" ],
-				"faction": "neutral",
-				"defname": "ZM192Z.DEF",
-				"projectile_defname": "PELFX.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 193,
-				"level": 0,
-				"name": [ "Sorceress" ],
-				"faction": "neutral",
-				"defname": "ZM193Z.DEF",
-				"projectile_defname": "CPRZEAX.DEF",
-				"projectile_spin": false
-			},
-
-			{
-				"id": 194,
-				"level": 0,
-				"name": [ "Werewolf" ],
-				"faction": "neutral",
-				"defname": "ZM194Z.DEF"
-			},
-
-			{
-				"id": 195,
-				"level": 0,
-				"name": [ "HellSteed" ],
-				"faction": "neutral",
-				"defname": "ZM195Z.DEF"
-			},
-
-			{
-				"id": 196,
-				"level": 0,
-				"name": [ "Dracolich" ],
-				"faction": "neutral",
-				"defname": "ZM196Z.DEF",
-				"projectile_defname": "SMBALX.DEF",
-				"projectile_spin": false
-			}
-		],
-
-	// something hacking
-	"unused_creatures": [ 122, 124, 126, 128, 145, 146, 147, 148, 149, 160,
-						  161, 162, 163, 174, 175, 176, 177, 178, 179, 180,
-						  181, 182, 183, 184, 185, 186, 187, 188, 189, 190,
-						   191 ]
-}

+ 297 - 0
config/creatures/castle.json

@@ -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"
+		}
+	}
+}

+ 336 - 0
config/creatures/conflux.json

@@ -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"
+		}
+	}
+}

+ 310 - 0
config/creatures/dungeon.json

@@ -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"
+		}
+	}
+}

+ 287 - 0
config/creatures/fortress.json

@@ -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"
+		}
+	}
+}

+ 309 - 0
config/creatures/inferno.json

@@ -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"
+		}
+	}
+}

+ 294 - 0
config/creatures/necropolis.json

@@ -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"
+		}
+	}
+}

+ 333 - 0
config/creatures/neutral.json

@@ -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"
+		}
+	}
+}

+ 291 - 0
config/creatures/rampart.json

@@ -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"
+		}
+	}
+}

+ 122 - 0
config/creatures/special.json

@@ -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
+			}
+		}
+	}
+}

+ 295 - 0
config/creatures/stronghold.json

@@ -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 - 0
config/creatures/tower.json

@@ -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 - 0
config/creatures/wog.json

@@ -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

+ 10 - 10
config/factions/castle.json

@@ -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" :
 				{

+ 10 - 10
config/factions/conflux.json

@@ -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" :
 				{

+ 10 - 10
config/factions/dungeon.json

@@ -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" :
 				{

+ 10 - 10
config/factions/fortress.json

@@ -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" :
 				{

+ 10 - 10
config/factions/inferno.json

@@ -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" :
 				{

+ 10 - 10
config/factions/necropolis.json

@@ -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" :
 				{

+ 1 - 1
config/factions/neutral.json

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

+ 10 - 10
config/factions/rampart.json

@@ -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" :
 				{

+ 10 - 10
config/factions/stronghold.json

@@ -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" :
 				{

+ 10 - 10
config/factions/tower.json

@@ -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" :
 				{

+ 19 - 0
config/gameConfig.json

@@ -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"
 	]
 }

+ 32 - 50
lib/CCreatureHandler.cpp

@@ -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);
+
+		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);
 
-		/* A creature can have several names. */
-		BOOST_FOREACH(const JsonNode &name, creature["name"].Vector())
+		// 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())

+ 2 - 4
lib/CCreatureHandler.h

@@ -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

+ 1 - 0
lib/CHeroHandler.cpp

@@ -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;

+ 23 - 10
lib/CModHandler.cpp

@@ -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());
 

+ 2 - 0
lib/CModHandler.h

@@ -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

+ 1 - 1
lib/CTownHandler.cpp

@@ -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();

+ 0 - 1
lib/CTownHandler.h

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