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

Large changeset, first part of editing H3 objects via mods feature. Changes:

- loading of all objects (including H3 objects) will be directed by mod handlers
- common base for all handlers accessible from mod system (IHanderBase)
- json format changes: use struct with string ID's instead of vector

- fixed some gcc/clang errors and warnings
- fixed several cases of memory leaks and invalid memory access (mostly related to usage of bonus system and/or identifiers resolution)

Note that right now loading is much slower than before due to excessive json validation (or not fast enough validator)
This commit is contained in:
Ivan Savenko 2013-04-21 12:49:26 +00:00
parent 8a4f81b981
commit c6cc6e6301
85 changed files with 4714 additions and 4441 deletions

View File

@ -1490,7 +1490,7 @@ void VCAI::wander(HeroPtr h)
}
}
const ObjectIdRef&dest = dests.front();
logAi->debugStream() << "Of all %d destinations, object oid=%d seems nice", dests.size() % dest.id.getNum();
logAi->debugStream() << boost::format("Of all %d destinations, object oid=%d seems nice") % dests.size() % dest.id.getNum();
if(!goVisitObj(dest, h))
{
if(!dest)
@ -1597,6 +1597,7 @@ void VCAI::validateVisitableObjs()
logAi->errorStream() << helperObjInfo[obj].name << " at " << helperObjInfo[obj].pos << " shouldn't be on list!";
return true;
}
return false;
});
}
@ -2414,7 +2415,7 @@ TResources VCAI::estimateIncome() const
//TODO duplikuje newturn
if(t->hasBuilt(BuildingID::RESOURCE_SILO)) //there is resource silo
{
if(t->town->primaryRes == 127) //we'll give wood and ore
if(t->town->primaryRes == Res::WOOD_AND_ORE) //we'll give wood and ore
{
ret[Res::WOOD] ++;
ret[Res::ORE] ++;

View File

@ -575,7 +575,7 @@ namespace vstd
if(c.size())
return c.back();
else
return NULL;
return nullptr;
}
template <typename Container>
@ -584,7 +584,7 @@ namespace vstd
if(c.size())
return c.front();
else
return NULL;
return nullptr;
}
}
using vstd::operator-=;

View File

@ -110,7 +110,7 @@ void CBuildingRect::clickRight(tribool down, bool previousState)
if (bid < BuildingID::DWELL_FIRST)
{
CRClickPopup::createAndPush(CInfoWindow::genText(bld->Name(), bld->Description()),
new CComponent(CComponent::building, bld->tid, bld->bid));
new CComponent(CComponent::building, bld->town->faction->index, bld->bid));
}
else
{
@ -1120,7 +1120,7 @@ void CTownInfo::clickRight(tribool down, bool previousState)
{
if(down && building)
CRClickPopup::createAndPush(CInfoWindow::genText(building->Name(), building->Description()),
new CComponent(CComponent::building, building->tid, building->bid));
new CComponent(CComponent::building, building->town->faction->index, building->bid));
}

View File

@ -797,9 +797,6 @@ static void listenForEvents()
delete CGI->dobjinfo.get();
const_cast<CGameInfo*>(CGI)->dobjinfo = new CDefObjInfoHandler;
VLC->dobjinfo = const_cast<CGameInfo*>(CGI)->dobjinfo; // update dobjinfo pointer in VLC (used by modHandler::reload())
const_cast<CGameInfo*>(CGI)->dobjinfo->load();
const_cast<CGameInfo*>(CGI)->modh->reload(); //add info about new creatures to dobjinfo
};

View File

@ -1856,7 +1856,6 @@ void RandomMapTab::updateMapInfo()
player.team = TeamID(i);
player.hasMainTown = true;
player.generateHeroAtMainTown = true;
player.isFactionRandom = true;
mapInfo.mapHeader->players.push_back(player);
}
@ -2644,7 +2643,7 @@ size_t OptionsTab::CPlayerSettingsHelper::getImageIndex()
{
case PlayerSettings::NONE: return TOWN_NONE;
case PlayerSettings::RANDOM: return TOWN_RANDOM;
default: return CGI->townh->towns[settings.castle].clientInfo.icons[true][false] + 2;
default: return CGI->townh->factions[settings.castle]->town->clientInfo.icons[true][false] + 2;
}
case HERO:
@ -2669,9 +2668,9 @@ size_t OptionsTab::CPlayerSettingsHelper::getImageIndex()
case PlayerSettings::GOLD: return GOLD;
case PlayerSettings::RESOURCE:
{
switch(CGI->townh->towns[settings.castle].primaryRes)
switch(CGI->townh->factions[settings.castle]->town->primaryRes)
{
case 127 : return WOOD_ORE;
case Res::WOOD_AND_ORE : return WOOD_ORE;
case Res::WOOD : return WOOD;
case Res::MERCURY : return MERCURY;
case Res::ORE : return ORE;
@ -2729,7 +2728,7 @@ std::string OptionsTab::CPlayerSettingsHelper::getName()
{
case PlayerSettings::NONE : return CGI->generaltexth->allTexts[523];
case PlayerSettings::RANDOM : return CGI->generaltexth->allTexts[522];
default : return CGI->townh->factions[settings.castle].name;
default : return CGI->townh->factions[settings.castle]->name;
}
}
case HERO:
@ -2777,13 +2776,13 @@ std::string OptionsTab::CPlayerSettingsHelper::getSubtitle()
case PlayerSettings::GOLD: return CGI->generaltexth->allTexts[87]; //500-1000
case PlayerSettings::RESOURCE:
{
switch(CGI->townh->towns[settings.castle].primaryRes)
switch(CGI->townh->factions[settings.castle]->town->primaryRes)
{
case Res::MERCURY: return CGI->generaltexth->allTexts[694];
case Res::SULFUR: return CGI->generaltexth->allTexts[695];
case Res::CRYSTAL: return CGI->generaltexth->allTexts[692];
case Res::GEMS: return CGI->generaltexth->allTexts[693];
case 127: return CGI->generaltexth->allTexts[89]; //At the start of the game, 5-10 wood and 5-10 ore are added to your Kingdom's resource pool
case Res::WOOD_AND_ORE: return CGI->generaltexth->allTexts[89]; //At the start of the game, 5-10 wood and 5-10 ore are added to your Kingdom's resource pool
}
}
}
@ -2807,13 +2806,13 @@ std::string OptionsTab::CPlayerSettingsHelper::getDescription()
case PlayerSettings::GOLD: return CGI->generaltexth->allTexts[92]; //At the start of the game, 500-1000 gold is added to your Kingdom's resource pool
case PlayerSettings::RESOURCE:
{
switch(CGI->townh->towns[settings.castle].primaryRes)
switch(CGI->townh->factions[settings.castle]->town->primaryRes)
{
case Res::MERCURY: return CGI->generaltexth->allTexts[690];
case Res::SULFUR: return CGI->generaltexth->allTexts[691];
case Res::CRYSTAL: return CGI->generaltexth->allTexts[688];
case Res::GEMS: return CGI->generaltexth->allTexts[689];
case 127: return CGI->generaltexth->allTexts[93]; //At the start of the game, 5-10 wood and 5-10 ore are added to your Kingdom's resource pool
case Res::WOOD_AND_ORE: return CGI->generaltexth->allTexts[93]; //At the start of the game, 5-10 wood and 5-10 ore are added to your Kingdom's resource pool
}
}
}
@ -2872,10 +2871,10 @@ void OptionsTab::CPregameTooltipBox::genTownWindow()
new CLabel(pos.w / 2 + 8, 122, FONT_MEDIUM, CENTER, Colors::YELLOW, CGI->generaltexth->allTexts[79]);
std::vector<CComponent *> components;
const CTown & town = CGI->townh->towns[settings.castle];
const CTown * town = CGI->townh->factions[settings.castle]->town;
for (size_t i=0; i< town.creatures.size(); i++)
components.push_back(new CComponent(CComponent::creature, town.creatures[i].front(), 0, CComponent::tiny));
for (size_t i=0; i< town->creatures.size(); i++)
components.push_back(new CComponent(CComponent::creature, town->creatures[i].front(), 0, CComponent::tiny));
new CComponentBox(components, Rect(10, 140, pos.w - 20, 140));
}
@ -3450,8 +3449,8 @@ void CBonusSelection::updateBonusSelection()
picName = graphics->ERMUtoPicture[faction][buildID];
picNumber = -1;
if (vstd::contains(CGI->townh->towns[faction].buildings, buildID))
desc = CGI->townh->towns[faction].buildings.find(buildID)->second->Name();
if (vstd::contains(CGI->townh->factions[faction]->town->buildings, buildID))
desc = CGI->townh->factions[faction]->town->buildings.find(buildID)->second->Name();
}
break;
case CScenarioTravel::STravelBonus::ARTIFACT:

View File

@ -177,7 +177,7 @@ void CTownTooltip::init(const InfoAboutTown &town)
if(town.details->customRes)//silo is built
{
if (town.tType->primaryRes == 127 )// wood & ore
if (town.tType->primaryRes == Res::WOOD_AND_ORE )// wood & ore
{
new CAnimImage("SMALRES", Res::WOOD, 0, 7, 75);
new CAnimImage("SMALRES", Res::ORE , 0, 7, 88);
@ -921,7 +921,7 @@ const std::vector<std::string> CComponent::getFileName()
case spell: return gen(spellsArr);
case morale: return gen(moraleArr);
case luck: return gen(luckArr);
case building: return std::vector<std::string>(4, CGI->townh->towns[subtype].clientInfo.buildingsIcons);
case building: return std::vector<std::string>(4, CGI->townh->factions[subtype]->town->clientInfo.buildingsIcons);
case hero: return gen(heroArr);
case flag: return gen(flagArr);
}
@ -964,7 +964,7 @@ std::string CComponent::getDescription()
case spell: return CGI->spellh->spells[subtype]->descriptions[val];
case morale: return CGI->generaltexth->heroscrn[ 4 - (val>0) + (val<0)];
case luck: return CGI->generaltexth->heroscrn[ 7 - (val>0) + (val<0)];
case building: return CGI->townh->towns[subtype].buildings[BuildingID(val)]->Description();
case building: return CGI->townh->factions[subtype]->town->buildings[BuildingID(val)]->Description();
case hero: return CGI->heroh->heroes[subtype]->name;
case flag: return "";
}
@ -996,7 +996,7 @@ std::string CComponent::getSubtitleInternal()
case spell: return CGI->spellh->spells[subtype]->name;
case morale: return "";
case luck: return "";
case building: return CGI->townh->towns[subtype].buildings[BuildingID(val)]->Name();
case building: return CGI->townh->factions[subtype]->town->buildings[BuildingID(val)]->Name();
case hero: return CGI->heroh->heroes[subtype]->name;
case flag: return CGI->generaltexth->capColors[subtype];
}
@ -1317,12 +1317,12 @@ CCreaturePic::CCreaturePic(int x, int y, const CCreature *cre, bool Big, bool An
TFaction faction = cre->faction;
assert(vstd::contains(CGI->townh->factions, cre->faction));
assert(CGI->townh->factions.size() > faction);
if(Big)
bg = new CPicture(CGI->townh->factions[faction].creatureBg130);
bg = new CPicture(CGI->townh->factions[faction]->creatureBg130);
else
bg = new CPicture(CGI->townh->factions[faction].creatureBg120);
bg = new CPicture(CGI->townh->factions[faction]->creatureBg120);
bg->needRefresh = true;
anim = new CCreatureAnim(0, 0, cre->animDefName, Rect());
anim->clipRect(cre->isDoubleWide()?170:150, 155, bg->pos.w, bg->pos.h);
@ -2568,14 +2568,14 @@ CMarketplaceWindow::CMarketplaceWindow(const IMarket *Market, const CGHeroInstan
switch (mode)
{
break; case EMarketMode::CREATURE_RESOURCE:
title = CGI->townh->towns[ETownType::STRONGHOLD].buildings[BuildingID::FREELANCERS_GUILD]->Name();
title = CGI->townh->factions[ETownType::STRONGHOLD]->town->buildings[BuildingID::FREELANCERS_GUILD]->Name();
break; case EMarketMode::RESOURCE_ARTIFACT:
title = CGI->townh->towns[market->o->subID].buildings[BuildingID::ARTIFACT_MERCHANT]->Name();
title = CGI->townh->factions[market->o->subID]->town->buildings[BuildingID::ARTIFACT_MERCHANT]->Name();
sliderNeeded = false;
break; case EMarketMode::ARTIFACT_RESOURCE:
title = CGI->townh->towns[market->o->subID].buildings[BuildingID::ARTIFACT_MERCHANT]->Name();
title = CGI->townh->factions[market->o->subID]->town->buildings[BuildingID::ARTIFACT_MERCHANT]->Name();
sliderNeeded = false;
break; default:
@ -5239,7 +5239,7 @@ CPuzzleWindow::CPuzzleWindow(const int3 &GrailPos, double discoveredRatio):
int faction = LOCPLINT->cb->getStartInfo()->playerInfos.find(LOCPLINT->playerID)->second.castle;
auto & puzzleMap = CGI->townh->factions[faction].puzzleMap;
auto & puzzleMap = CGI->townh->factions[faction]->puzzleMap;
for(int g=0; g<puzzleMap.size(); ++g)
{
@ -5468,7 +5468,7 @@ CUniversityWindow::CUniversityWindow(const CGHeroInstance * _hero, const IMarket
CIntObject * titlePic = nullptr;
if (market->o->ID == Obj::TOWN)
titlePic = new CAnimImage(CGI->townh->towns[ETownType::CONFLUX].clientInfo.buildingsIcons, BuildingID::MAGIC_UNIVERSITY);
titlePic = new CAnimImage(CGI->townh->factions[ETownType::CONFLUX]->town->clientInfo.buildingsIcons, BuildingID::MAGIC_UNIVERSITY);
else
titlePic = new CPicture("UNIVBLDG");

View File

@ -762,7 +762,7 @@ void SystemMessage::applyCl( CClient *cl )
std::ostringstream str;
str << "System message: " << text;
logNetwork->debugStream() << str.str();
logNetwork->errorStream() << str.str(); // usually used to receive error messages from server
if(LOCPLINT)
LOCPLINT->cingconsole->print(str.str());
}

View File

@ -3570,7 +3570,7 @@ std::string CBattleInterface::SiegeHelper::getSiegeName(ui16 what, ui16 additInf
return prefix + "BACK.BMP";
case 1: //background wall
{
switch(town->town->typeID)
switch(town->town->faction->index)
{
case 5: case 4: case 1: case 6:
return prefix + "TPW1.BMP";

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
{
"pikeman" :
{
"id": 0,
"index": 0,
"level": 1,
"faction": "castle",
"upgrades": ["halberdier"],
@ -27,7 +27,7 @@
},
"halberdier" :
{
"id": 1,
"index": 1,
"level": 1,
"faction": "castle",
"abilities":
@ -52,7 +52,7 @@
},
"archer" :
{
"id": 2,
"index": 2,
"level": 2,
"extraNames": [ "lightCrossbowman" ],
"faction": "castle",
@ -77,7 +77,7 @@
},
"marksman" :
{
"id": 3,
"index": 3,
"level": 2,
"faction": "castle",
"abilities": {
@ -108,7 +108,7 @@
},
"griffin" :
{
"id": 4,
"index": 4,
"level": 3,
"faction": "castle",
"abilities":
@ -136,7 +136,7 @@
},
"royalGriffin" :
{
"id": 5,
"index": 5,
"level": 3,
"faction": "castle",
"abilities":
@ -161,7 +161,7 @@
},
"swordsman" :
{
"id": 6,
"index": 6,
"level": 4,
"faction": "castle",
"upgrades": ["crusader"],
@ -180,7 +180,7 @@
},
"crusader" :
{
"id": 7,
"index": 7,
"level": 4,
"faction": "castle",
"abilities":
@ -206,7 +206,7 @@
},
"monk" :
{
"id": 8,
"index": 8,
"level": 5,
"faction": "castle",
"upgrades": ["zealot"],
@ -230,7 +230,7 @@
},
"zealot" :
{
"id": 9,
"index": 9,
"level": 5,
"faction": "castle",
"graphics" :
@ -253,7 +253,7 @@
},
"cavalier" :
{
"id": 10,
"index": 10,
"level": 6,
"faction": "castle",
"upgrades": ["champion"],
@ -272,7 +272,7 @@
},
"champion" :
{
"id": 11,
"index": 11,
"level": 6,
"faction": "castle",
"graphics" :
@ -290,7 +290,7 @@
},
"angel" :
{
"id": 12,
"index": 12,
"level": 7,
"faction": "castle",
"abilities":
@ -324,7 +324,7 @@
},
"archangel" :
{
"id": 13,
"index": 13,
"level": 7,
"faction": "castle",
"abilities":

View File

@ -1,7 +1,7 @@
{
"airElemental" :
{
"id": 112,
"index": 112,
"level": 2,
"extraNames": [ "airElementals" ],
"faction": "conflux",
@ -49,7 +49,7 @@
},
"earthElemental" :
{
"id": 113,
"index": 113,
"level": 5,
"faction": "conflux",
"abilities":
@ -95,7 +95,7 @@
},
"fireElemental" :
{
"id": 114,
"index": 114,
"level": 4,
"faction": "conflux",
"abilities":
@ -141,7 +141,7 @@
},
"waterElemental" :
{
"id": 115,
"index": 115,
"level": 3,
"extraNames": [ "waterElementals" ],
"faction": "conflux",
@ -207,7 +207,7 @@
},
"pixie" :
{
"id": 118,
"index": 118,
"level": 1,
"extraNames": [ "pixies" ],
"faction": "conflux",
@ -227,7 +227,7 @@
},
"sprite" :
{
"id": 119,
"index": 119,
"level": 1,
"faction": "conflux",
"graphics" :
@ -245,7 +245,7 @@
},
"psychicElemental" :
{
"id": 120,
"index": 120,
"level": 6,
"faction": "conflux",
"abilities":
@ -272,7 +272,7 @@
},
"magicElemental" :
{
"id": 121,
"index": 121,
"level": 6,
"faction": "conflux",
"abilities":
@ -303,7 +303,7 @@
},
"iceElemental" :
{
"id": 123,
"index": 123,
"level": 3,
"faction": "conflux",
"abilities":
@ -350,7 +350,7 @@
},
"magmaElemental" :
{
"id": 125,
"index": 125,
"level": 5,
"faction": "conflux",
"abilities":
@ -391,7 +391,7 @@
},
"stormElemental" :
{
"id": 127,
"index": 127,
"level": 2,
"faction": "conflux",
"abilities":
@ -437,7 +437,7 @@
},
"energyElemental" :
{
"id": 129,
"index": 129,
"level": 4,
"faction": "conflux",
"abilities":
@ -478,7 +478,7 @@
},
"firebird" :
{
"id": 130,
"index": 130,
"level": 7,
"faction": "conflux",
"upgrades": ["phoenix"],
@ -504,7 +504,7 @@
},
"phoenix" :
{
"id": 131,
"index": 131,
"level": 7,
"faction": "conflux",
"abilities":

View File

@ -1,7 +1,7 @@
{
"troglodyte" :
{
"id": 70,
"index": 70,
"level": 1,
"faction": "dungeon",
"abilities":
@ -29,7 +29,7 @@
},
"infernalTroglodyte" :
{
"id": 71,
"index": 71,
"level": 1,
"faction": "dungeon",
"abilities":
@ -55,7 +55,7 @@
},
"harpy" :
{
"id": 72,
"index": 72,
"level": 2,
"faction": "dungeon",
"abilities":
@ -83,7 +83,7 @@
},
"harpyHag" :
{
"id": 73,
"index": 73,
"level": 2,
"faction": "dungeon",
"abilities":
@ -113,7 +113,7 @@
},
"beholder" :
{
"id": 74,
"index": 74,
"level": 3,
"faction": "dungeon",
"upgrades": ["evilEye"],
@ -137,7 +137,7 @@
},
"evilEye" :
{
"id": 75,
"index": 75,
"level": 3,
"faction": "dungeon",
"graphics" :
@ -160,7 +160,7 @@
},
"medusa" :
{
"id": 76,
"index": 76,
"level": 4,
"faction": "dungeon",
"abilities":
@ -194,7 +194,7 @@
},
"medusaQueen" :
{
"id": 77,
"index": 77,
"level": 4,
"faction": "dungeon",
"abilities":
@ -227,7 +227,7 @@
},
"minotaur" :
{
"id": 78,
"index": 78,
"level": 5,
"faction": "dungeon",
"abilities":
@ -253,7 +253,7 @@
},
"minotaurKing" :
{
"id": 79,
"index": 79,
"level": 5,
"faction": "dungeon",
"abilities":
@ -279,7 +279,7 @@
},
"manticore" :
{
"id": 80,
"index": 80,
"level": 6,
"faction": "dungeon",
"upgrades": ["scorpicore"],
@ -299,7 +299,7 @@
},
"scorpicore" :
{
"id": 81,
"index": 81,
"level": 6,
"faction": "dungeon",
"abilities":
@ -327,7 +327,7 @@
},
"redDragon" :
{
"id": 82,
"index": 82,
"level": 7,
"faction": "dungeon",
"abilities":
@ -362,7 +362,7 @@
},
"blackDragon" :
{
"id": 83,
"index": 83,
"level": 7,
"faction": "dungeon",
"abilities":

View File

@ -1,7 +1,7 @@
{
"gnoll" :
{
"id": 98,
"index": 98,
"level": 1,
"faction": "fortress",
"upgrades": ["gnollMarauder"],
@ -20,7 +20,7 @@
},
"gnollMarauder" :
{
"id": 99,
"index": 99,
"level": 1,
"faction": "fortress",
"graphics" :
@ -38,7 +38,7 @@
},
"lizardman" :
{
"id": 100,
"index": 100,
"level": 2,
"extraNames": [ "primitiveLizardman", ],
"faction": "fortress",
@ -64,7 +64,7 @@
},
"lizardWarrior" :
{
"id": 101,
"index": 101,
"level": 2,
"faction": "fortress",
"graphics" :
@ -87,7 +87,7 @@
},
"gorgon" :
{
"id": 102,
"index": 102,
"level": 5,
"faction": "fortress",
"upgrades": ["mightyGorgon"],
@ -106,7 +106,7 @@
},
"mightyGorgon" :
{
"id": 103,
"index": 103,
"level": 5,
"faction": "fortress",
"abilities":
@ -132,7 +132,7 @@
},
"serpentFly" :
{
"id": 104,
"index": 104,
"level": 3,
"extraNames": [ "dragonFly" ],
"faction": "fortress",
@ -162,7 +162,7 @@
},
"fireDragonFly" : // dragonFly is correct in-game, incorrect in HOTRAITS
{
"id": 105,
"index": 105,
"level": 3,
"faction": "fortress",
"abilities":
@ -196,7 +196,7 @@
},
"basilisk" :
{
"id": 106,
"index": 106,
"level": 4,
"faction": "fortress",
"abilities":
@ -224,7 +224,7 @@
},
"greaterBasilisk" :
{
"id": 107,
"index": 107,
"level": 4,
"faction": "fortress",
"abilities":
@ -251,7 +251,7 @@
},
"wyvern" :
{
"id": 108,
"index": 108,
"level": 6,
"faction": "fortress",
"upgrades": ["wyvernMonarch"],
@ -270,7 +270,7 @@
},
"wyvernMonarch" :
{
"id": 109,
"index": 109,
"level": 6,
"faction": "fortress",
"abilities":
@ -297,7 +297,7 @@
},
"hydra" :
{
"id": 110,
"index": 110,
"level": 7,
"faction": "fortress",
"abilities":
@ -327,7 +327,7 @@
},
"chaosHydra" :
{
"id": 111,
"index": 111,
"level": 7,
"faction": "fortress",
"abilities":

View File

@ -1,7 +1,7 @@
{
"imp" :
{
"id": 42,
"index": 42,
"level": 1,
"faction": "inferno",
"upgrades": ["familiar"],
@ -20,7 +20,7 @@
},
"familiar" :
{
"id": 43,
"index": 43,
"level": 1,
"faction": "inferno",
"abilities":
@ -46,7 +46,7 @@
},
"gog" :
{
"id": 44,
"index": 44,
"level": 2,
"faction": "inferno",
"upgrades": ["magog"],
@ -71,7 +71,7 @@
},
"magog" :
{
"id": 45,
"index": 45,
"level": 2,
"faction": "inferno",
"abilities":
@ -102,7 +102,7 @@
},
"hellHound" :
{
"id": 46,
"index": 46,
"level": 3,
"faction": "inferno",
"upgrades": ["cerberus"],
@ -125,7 +125,7 @@
},
"cerberus" :
{
"id": 47,
"index": 47,
"level": 3,
"faction": "inferno",
"abilities":
@ -155,7 +155,7 @@
},
"demon" :
{
"id": 48,
"index": 48,
"level": 4,
"faction": "inferno",
"upgrades": ["hornedDemon"],
@ -174,7 +174,7 @@
},
"hornedDemon" :
{
"id": 49,
"index": 49,
"level": 4,
"faction": "inferno",
"graphics" :
@ -192,7 +192,7 @@
},
"pitFiend" :
{
"id": 50,
"index": 50,
"level": 5,
"faction": "inferno",
"upgrades": ["pitLord"],
@ -211,7 +211,7 @@
},
"pitLord" :
{
"id": 51,
"index": 51,
"level": 5,
"faction": "inferno",
"abilities":
@ -243,7 +243,7 @@
},
"efreet" :
{
"id": 52,
"index": 52,
"level": 6,
"faction": "inferno",
"abilities":
@ -285,7 +285,7 @@
},
"efreetSultan" :
{
"id": 53,
"index": 53,
"level": 6,
"faction": "inferno",
"abilities":
@ -332,7 +332,7 @@
},
"devil" :
{
"id": 54,
"index": 54,
"level": 7,
"faction": "inferno",
"abilities":
@ -383,7 +383,7 @@
},
"archDevil" :
{
"id": 55,
"index": 55,
"level": 7,
"faction": "inferno",
"abilities" :

View File

@ -1,7 +1,7 @@
{
"skeleton" :
{
"id": 56,
"index": 56,
"level": 1,
"faction": "necropolis",
"upgrades": ["skeletonWarrior"],
@ -20,7 +20,7 @@
},
"skeletonWarrior" :
{
"id": 57,
"index": 57,
"level": 1,
"faction": "necropolis",
"graphics" :
@ -38,7 +38,7 @@
},
"walkingDead" :
{
"id": 58,
"index": 58,
"level": 2,
"extraNames": [ "zombie" ], //FIXME: zombie is a name of upgrade but not in HOTRAITS
"faction" : "necropolis",
@ -58,7 +58,7 @@
},
"zombieLord" : //FIXME: zombie is a correct in-name but not in HOTRAITS.TXT
{
"id": 59,
"index": 59,
"level": 2,
"faction": "necropolis",
"graphics" :
@ -76,7 +76,7 @@
},
"wight" :
{
"id": 60,
"index": 60,
"level": 3,
"faction": "necropolis",
"abilities":
@ -104,7 +104,7 @@
},
"wraith" :
{
"id": 61,
"index": 61,
"level": 3,
"faction": "necropolis",
"abilities":
@ -135,7 +135,7 @@
},
"vampire" :
{
"id": 62,
"index": 62,
"level": 4,
"faction": "necropolis",
"abilities":
@ -164,7 +164,7 @@
},
"vampireLord" :
{
"id": 63,
"index": 63,
"level": 4,
"faction": "necropolis",
"abilities":
@ -198,7 +198,7 @@
},
"lich" :
{
"id": 64,
"index": 64,
"level": 5,
"faction": "necropolis",
"abilities":
@ -230,7 +230,7 @@
},
"powerLich" :
{
"id": 65,
"index": 65,
"level": 5,
"faction": "necropolis",
"abilities":
@ -261,7 +261,7 @@
},
"blackKnight" :
{
"id": 66,
"index": 66,
"level": 6,
"faction": "necropolis",
"abilities":
@ -289,7 +289,7 @@
},
"dreadKnight" :
{
"id": 67,
"index": 67,
"level": 6,
"faction": "necropolis",
"abilities":
@ -321,7 +321,7 @@
},
"boneDragon" :
{
"id": 68,
"index": 68,
"level": 7,
"faction": "necropolis",
"abilities" :
@ -347,7 +347,7 @@
},
"ghostDragon" :
{
"id": 69,
"index": 69,
"level": 7,
"faction": "necropolis",
"abilities":

View File

@ -2,7 +2,7 @@
{
"goldGolem" :
{
"id": 116,
"index": 116,
"level": 4,
"faction": "neutral",
"abilities":
@ -33,7 +33,7 @@
},
"diamondGolem" :
{
"id": 117,
"index": 117,
"level": 5,
"faction": "neutral",
"abilities":
@ -65,7 +65,7 @@
"azureDragon" :
{
"special" : true,
"id": 132,
"index": 132,
"level": 10,
"faction": "neutral",
"abilities":
@ -108,7 +108,7 @@
"crystalDragon" :
{
"special" : true,
"id": 133,
"index": 133,
"level": 10,
"faction": "neutral",
"abilities":
@ -135,7 +135,7 @@
"fairieDragon" :
{
"special" : true,
"id": 134,
"index": 134,
"level": 8,
"faction": "neutral",
"abilities":
@ -233,7 +233,7 @@
"rustDragon" :
{
"special" : true,
"id": 135,
"index": 135,
"level": 10,
"faction": "neutral",
"abilities":
@ -271,7 +271,7 @@
"enchanter" :
{
"special" : true,
"id": 136,
"index": 136,
"level": 6,
"extraNames": [ "enchanters" ],
"faction": "neutral",
@ -351,7 +351,7 @@
"sharpshooter" :
{
"special" : true,
"id": 137,
"index": 137,
"level": 4,
"extraNames": [ "sharpshooters" ],
"faction": "neutral",
@ -386,7 +386,7 @@
},
"halfling" :
{
"id": 138,
"index": 138,
"level": 1,
"faction": "neutral",
"graphics" :
@ -409,7 +409,7 @@
},
"peasant" :
{
"id": 139,
"index": 139,
"level": 1,
"faction": "neutral",
"graphics" :
@ -427,7 +427,7 @@
},
"boar" :
{
"id": 140,
"index": 140,
"level": 2,
"faction": "neutral",
"doubleWide" : true,
@ -446,7 +446,7 @@
},
"mummy" :
{
"id": 141,
"index": 141,
"level": 3,
"faction": "neutral",
"abilities":
@ -471,7 +471,7 @@
},
"nomad" :
{
"id": 142,
"index": 142,
"level": 3,
"faction": "neutral",
"doubleWide" : true,
@ -490,7 +490,7 @@
},
"rogue" :
{
"id": 143,
"index": 143,
"level": 2,
"faction": "neutral",
"graphics" :
@ -508,7 +508,7 @@
},
"troll" :
{
"id": 144,
"index": 144,
"level": 5,
"faction": "neutral",
"abilities":

View File

@ -1,7 +1,7 @@
{
"centaur" :
{
"id": 14,
"index": 14,
"level": 1,
"faction": "rampart",
"upgrades": ["centaurCaptain"],
@ -23,7 +23,7 @@
},
"centaurCaptain" :
{
"id": 15,
"index": 15,
"level": 1,
"faction": "rampart",
"graphics" :
@ -42,7 +42,7 @@
},
"dwarf" :
{
"id": 16,
"index": 16,
"level": 2,
"faction": "rampart",
"abilities":
@ -69,7 +69,7 @@
},
"battleDwarf" :
{
"id": 17,
"index": 17,
"level": 2,
"faction": "rampart",
"abilities":
@ -95,7 +95,7 @@
},
"woodElf" :
{
"id": 18,
"index": 18,
"level": 3,
"faction": "rampart",
"upgrades": ["grandElf"],
@ -119,7 +119,7 @@
},
"grandElf" :
{
"id": 19,
"index": 19,
"level": 3,
"faction": "rampart",
"abilities":
@ -151,7 +151,7 @@
},
"pegasus" :
{
"id": 20,
"index": 20,
"level": 4,
"faction": "rampart",
"abilities":
@ -179,7 +179,7 @@
},
"silverPegasus" :
{
"id": 21,
"index": 21,
"level": 4,
"faction": "rampart",
"abilities":
@ -205,7 +205,7 @@
},
"dendroidGuard" :
{
"id": 22,
"index": 22,
"level": 5,
"faction": "rampart",
"abilities":
@ -233,7 +233,7 @@
},
"dendroidSoldier" :
{
"id": 23,
"index": 23,
"level": 5,
"faction": "rampart",
"abilities":
@ -260,7 +260,7 @@
},
"unicorn" :
{
"id": 24,
"index": 24,
"level": 6,
"faction": "rampart",
"abilities":
@ -293,7 +293,7 @@
},
"warUnicorn" :
{
"id": 25,
"index": 25,
"level": 6,
"faction": "rampart",
"abilities":
@ -326,7 +326,7 @@
},
"greenDragon" :
{
"id": 26,
"index": 26,
"level": 7,
"faction": "rampart",
"abilities":
@ -361,7 +361,7 @@
},
"goldDragon" :
{
"id": 27,
"index": 27,
"level": 7,
"faction": "rampart",
"abilities":

View File

@ -6,34 +6,34 @@
"faction": "neutral",
"disabled" : true,
"graphics" : null,
"id" : 122
"index" : 122
},
"unused124" :
{
"faction": "neutral",
"disabled" : true,
"graphics" : null,
"id" : 124
"index" : 124
},
"unused126" :
{
"faction": "neutral",
"disabled" : true,
"graphics" : null,
"id" : 126
"index" : 126
},
"unused128" :
{
"faction": "neutral",
"disabled" : true,
"graphics" : null,
"id" : 128
"index" : 128
},
"catapult" :
{
"special" : true,
"id": 145,
"index": 145,
"level": 0,
"faction": "neutral",
"graphics" :
@ -54,7 +54,7 @@
"ballista" :
{
"special" : true,
"id": 146,
"index": 146,
"level": 0,
"faction": "neutral",
"graphics" :
@ -75,7 +75,7 @@
"firstAidTent" :
{
"special" : true,
"id": 147,
"index": 147,
"level": 0,
"faction": "neutral",
"abilities": { "heals" : { "type" : "HEALER" } },
@ -92,7 +92,7 @@
"ammoCart" :
{
"special" : true,
"id": 148,
"index": 148,
"level": 0,
"faction": "neutral",
"abilities": { "inactive" : { "type" : "NOT_ACTIVE" } },
@ -109,7 +109,7 @@
"arrowTower" :
{
"special" : true,
"id": 149,
"index": 149,
"level": 0,
"faction": "neutral",
"abilities": { "shooter" : { "type" : "SHOOTER" } },

View File

@ -1,7 +1,7 @@
{
"goblin" :
{
"id": 84,
"index": 84,
"level": 1,
"extraNames": [ "goblins" ],
"faction": "stronghold",
@ -21,7 +21,7 @@
},
"hobgoblin" :
{
"id": 85,
"index": 85,
"level": 1,
"faction": "stronghold",
"hasDoubleWeek": true,
@ -40,7 +40,7 @@
},
"goblinWolfRider" :
{
"id": 86,
"index": 86,
"level": 2,
"faction": "stronghold",
"upgrades": ["hobgoblinWolfRider"],
@ -60,7 +60,7 @@
},
"hobgoblinWolfRider" :
{
"id": 87,
"index": 87,
"level": 2,
"faction": "stronghold",
"abilities":
@ -86,7 +86,7 @@
},
"orc" :
{
"id": 88,
"index": 88,
"level": 3,
"faction": "stronghold",
"upgrades": ["orcChieftain"],
@ -110,7 +110,7 @@
},
"orcChieftain" :
{
"id": 89,
"index": 89,
"level": 3,
"faction": "stronghold",
"graphics" :
@ -133,7 +133,7 @@
},
"ogre" :
{
"id": 90,
"index": 90,
"level": 4,
"faction": "stronghold",
"upgrades": ["ogreMage"],
@ -152,7 +152,7 @@
},
"ogreMage" :
{
"id": 91,
"index": 91,
"level": 4,
"faction": "stronghold",
"abilities":
@ -190,7 +190,7 @@
},
"roc" :
{
"id": 92,
"index": 92,
"level": 5,
"faction": "stronghold",
"upgrades": ["thunderbird"],
@ -209,7 +209,7 @@
},
"thunderbird" :
{
"id": 93,
"index": 93,
"level": 5,
"faction": "stronghold",
"abilities":
@ -242,7 +242,7 @@
},
"cyclop" :
{
"id": 94,
"index": 94,
"level": 6,
"faction": "stronghold",
"upgrades": ["cyclopKing"],
@ -266,7 +266,7 @@
},
"cyclopKing" :
{
"id": 95,
"index": 95,
"level": 6,
"faction": "stronghold",
"graphics" :
@ -289,7 +289,7 @@
},
"behemoth" :
{
"id": 96,
"index": 96,
"level": 7,
"faction": "stronghold",
"abilities":
@ -316,7 +316,7 @@
},
"ancientBehemoth" :
{
"id": 97,
"index": 97,
"level": 7,
"faction": "stronghold",
"abilities":

View File

@ -1,7 +1,7 @@
{
"gremlin" :
{
"id": 28,
"index": 28,
"level": 1,
"extraNames": [ "apprenticeGremlin" ],
"faction": "tower",
@ -23,7 +23,7 @@
},
"masterGremlin" :
{
"id": 29,
"index": 29,
"level": 1,
"faction": "tower",
"graphics" :
@ -46,7 +46,7 @@
},
"stoneGargoyle" :
{
"id": 30,
"index": 30,
"level": 2,
"faction": "tower",
"abilities":
@ -72,7 +72,7 @@
},
"obsidianGargoyle" :
{
"id": 31,
"index": 31,
"level": 2,
"faction": "tower",
"abilities":
@ -97,7 +97,7 @@
},
"ironGolem" : //FIXME correct ID is stoneGolem, unchangeable due to HOTRAITS.TXT
{
"id": 32,
"index": 32,
"level": 3,
"faction": "tower",
"abilities":
@ -129,7 +129,7 @@
},
"stoneGolem" : //FIXME correct ID is ironGolem, unchangeable due to HOTRAITS.TXT
{
"id": 33,
"index": 33,
"level": 3,
"faction": "tower",
"abilities" :
@ -160,7 +160,7 @@
},
"mage" :
{
"id": 34,
"index": 34,
"level": 4,
"faction": "tower",
"abilities":
@ -192,7 +192,7 @@
},
"archMage" :
{
"id": 35,
"index": 35,
"level": 4,
"faction": "tower",
"abilities":
@ -223,7 +223,7 @@
},
"genie" :
{
"id": 36,
"index": 36,
"level": 5,
"faction": "tower",
"abilities":
@ -257,7 +257,7 @@
},
"masterGenie" :
{
"id": 37,
"index": 37,
"level": 5,
"faction": "tower",
"abilities":
@ -306,7 +306,7 @@
},
"naga" :
{
"id": 38,
"index": 38,
"level": 6,
"faction": "tower",
"abilities" :
@ -332,7 +332,7 @@
},
"nagaQueen" :
{
"id": 39,
"index": 39,
"level": 6,
"faction": "tower",
"abilities" :
@ -357,7 +357,7 @@
},
"giant" :
{
"id": 40,
"index": 40,
"level": 7,
"faction": "tower",
"abilities" :
@ -383,7 +383,7 @@
},
"titan" :
{
"id": 41,
"index": 41,
"level": 7,
"faction": "tower",
"abilities" :

View File

@ -1,7 +1,7 @@
{
"supremeArchangel" :
{
"id": 150,
"index": 150,
"level": 8,
"faction": "castle",
"graphics" :
@ -19,7 +19,7 @@
},
"diamondDragon" :
{
"id": 151,
"index": 151,
"level": 8,
"faction": "rampart",
"abilities":
@ -44,7 +44,7 @@
},
"lordofThunder" :
{
"id": 152,
"index": 152,
"level": 8,
"faction": "tower",
"graphics" :
@ -67,7 +67,7 @@
},
"hellBaron" :
{
"id": 153,
"index": 153,
"level": 8,
"faction": "inferno",
"abilities":
@ -96,7 +96,7 @@
},
"bloodDragon" :
{
"id": 154,
"index": 154,
"level": 8,
"faction": "necropolis",
"abilities":
@ -126,7 +126,7 @@
},
"darknessDragon" :
{
"id": 155,
"index": 155,
"level": 8,
"faction": "dungeon",
"abilities":
@ -151,7 +151,7 @@
},
"ghostBehemoth" :
{
"id": 156,
"index": 156,
"level": 8,
"faction": "stronghold",
"graphics" :
@ -169,7 +169,7 @@
},
"hellHydra" :
{
"id": 157,
"index": 157,
"level": 8,
"faction": "fortress",
"abilities" :
@ -191,7 +191,7 @@
},
"sacredPhoenix" :
{
"id": 158,
"index": 158,
"level": 8,
"faction": "conflux",
"graphics" :
@ -209,7 +209,7 @@
},
"ghost" :
{
"id": 159,
"index": 159,
"level": 0,
"faction": "neutral",
"graphics" :
@ -228,7 +228,7 @@
"godWar" :
{
"disabled" : true,
"id": 160,
"index": 160,
"level": 0,
"faction": "neutral",
"graphics" :
@ -239,7 +239,7 @@
"godPeace" :
{
"disabled" : true,
"id": 161,
"index": 161,
"level": 0,
"faction": "neutral",
"graphics" :
@ -250,7 +250,7 @@
"godMana" :
{
"disabled" : true,
"id": 162,
"index": 162,
"level": 0,
"faction": "neutral",
"graphics" :
@ -261,7 +261,7 @@
"godLore" :
{
"disabled" : true,
"id": 163,
"index": 163,
"level": 0,
"faction": "neutral",
"graphics" :
@ -271,7 +271,7 @@
},
"minotaurKing2" :// WTF is this? Same ID as Minotaur King from Dungeon
{
"id": 164,
"index": 164,
"level": 0,
"faction": "neutral",
"graphics" :
@ -289,7 +289,7 @@
},
"mineralElemental" :
{
"id": 165,
"index": 165,
"level": 0,
"faction": "neutral",
"graphics" :
@ -307,7 +307,7 @@
},
"electricityElemental" :
{
"id": 166,
"index": 166,
"level": 0,
"faction": "neutral",
"graphics" :
@ -325,7 +325,7 @@
},
"ancientBasilisk" :
{
"id": 167,
"index": 167,
"level": 0,
"faction": "neutral",
"graphics" :
@ -343,7 +343,7 @@
},
"gorynych" :
{
"id": 168,
"index": 168,
"level": 0,
"faction": "neutral",
"abilities":
@ -368,7 +368,7 @@
},
"warZealot" :
{
"id": 169,
"index": 169,
"level": 0,
"faction": "neutral",
"graphics" :
@ -391,7 +391,7 @@
},
"myriad" :
{
"id": 170,
"index": 170,
"level": 0,
"faction": "neutral",
"graphics" :
@ -414,7 +414,7 @@
},
"medusaMatriarch" :
{
"id": 171,
"index": 171,
"level": 0,
"faction": "neutral",
"graphics" :
@ -437,7 +437,7 @@
},
"nightmare" :
{
"id": 172,
"index": 172,
"level": 0,
"faction": "neutral",
"graphics" :
@ -455,7 +455,7 @@
},
"santaGremlin" :
{
"id": 173,
"index": 173,
"level": 0,
"faction": "neutral",
"graphics" :
@ -478,14 +478,38 @@
"paladin1" :
{
"special" : true,
"id": 174,
"index": 174,
"level": 0,
"faction": "neutral",
"abilities": [ [ "MAGIC_RESISTANCE", 5, 0, 0 ],
[ "CASTS", 1, 0, 0 ] ,
[ "CREATURE_ENCHANT_POWER", 1, 0, 0 ] ,
[ "CREATURE_SPELL_POWER", 100, 0, 0 ] ,
[ "SPELLCASTER", 3, "spell.cure", 0 ] ], //expert cure
"abilities":
{
"magicResistance" :
{
"type" : "MAGIC_RESISTANCE",
"val" : 5
},
"castsAmount" :
{
"type" : "CASTS",
"val" : 1
},
"enchant" :
{
"type" : "CREATURE_ENCHANT_POWER",
"val" : 1
},
"spellpower" :
{
"type" : "CREATURE_SPELL_POWER",
"val" : 100
},
"canCast" :
{
"type" : "SPELLCASTER",
"subtype" : "spell.cure",
"val" : 3
}
},
"graphics" :
{
"animation": "ZM174NPC.DEF",
@ -506,7 +530,7 @@
"hierophant1" :
{
"special" : true,
"id": 175,
"index": 175,
"level": 0,
"faction": "neutral",
"abilities":
@ -559,7 +583,7 @@
"templeGuardian1" :
{
"special" : true,
"id": 176,
"index": 176,
"level": 0,
"faction": "neutral",
"abilities":
@ -612,7 +636,7 @@
"succubus1" :
{
"special" : true,
"id": 177,
"index": 177,
"level": 0,
"faction": "neutral",
"abilities":
@ -664,7 +688,7 @@
"soulEater1" :
{
"special" : true,
"id": 178,
"index": 178,
"level": 0,
"faction": "neutral",
"abilities":
@ -716,7 +740,7 @@
"brute1" :
{
"special" : true,
"id": 179,
"index": 179,
"level": 0,
"faction": "neutral",
"abilities":
@ -768,7 +792,7 @@
"ogreLeader1" :
{
"special" : true,
"id": 180,
"index": 180,
"level": 0,
"faction": "neutral",
"abilities":
@ -820,7 +844,7 @@
"shaman1" :
{
"special" : true,
"id": 181,
"index": 181,
"level": 0,
"faction": "neutral",
"abilities":
@ -873,7 +897,7 @@
"astralSpirit1" :
{
"special" : true,
"id": 182,
"index": 182,
"level": 0,
"faction": "neutral",
"abilities":
@ -925,7 +949,7 @@
"paladin2" :
{
"special" : true,
"id": 183,
"index": 183,
"level": 0,
"faction": "neutral",
"graphics" :
@ -941,7 +965,7 @@
{
"special" : true,
"disabled" : true,
"id": 184,
"index": 184,
"level": 0,
"faction": "neutral",
"graphics" :
@ -957,7 +981,7 @@
{
"special" : true,
"disabled" : true,
"id": 185,
"index": 185,
"level": 0,
"faction": "neutral",
"graphics" :
@ -973,7 +997,7 @@
{
"special" : true,
"disabled" : true,
"id": 186,
"index": 186,
"level": 0,
"faction": "neutral",
"graphics" :
@ -989,7 +1013,7 @@
{
"special" : true,
"disabled" : true,
"id": 187,
"index": 187,
"level": 0,
"faction": "neutral",
"graphics" :
@ -1005,7 +1029,7 @@
{
"special" : true,
"disabled" : true,
"id": 188,
"index": 188,
"level": 0,
"faction": "neutral",
"graphics" :
@ -1021,7 +1045,7 @@
{
"special" : true,
"disabled" : true,
"id": 189,
"index": 189,
"level": 0,
"faction": "neutral",
"graphics" :
@ -1037,7 +1061,7 @@
{
"special" : true,
"disabled" : true,
"id": 190,
"index": 190,
"level": 0,
"faction": "neutral",
"graphics" :
@ -1053,7 +1077,7 @@
{
"special" : true,
"disabled" : true,
"id": 191,
"index": 191,
"level": 0,
"faction": "neutral",
"graphics" :
@ -1067,7 +1091,7 @@
},
"sylvanCentaur" :
{
"id": 192,
"index": 192,
"level": 0,
"faction": "neutral",
"graphics" :
@ -1090,7 +1114,7 @@
},
"sorceresses" :
{
"id": 193,
"index": 193,
"level": 0,
"faction": "neutral",
"graphics" :
@ -1113,7 +1137,7 @@
},
"werewolf" :
{
"id": 194,
"index": 194,
"level": 0,
"faction": "neutral",
"graphics" :
@ -1123,7 +1147,7 @@
},
"hellSteed" :
{
"id": 195,
"index": 195,
"level": 0,
"faction": "neutral",
"graphics" :
@ -1142,7 +1166,7 @@
},
"dracolich" :
{
"id": 196,
"index": 196,
"level": 10,
"faction": "neutral",
"abilities":

View File

@ -74,46 +74,46 @@
"capitol" : "AVCCASZ0.DEF"
},
"structures" :
[
{ "animation" : "TBCSEXT2.def", "x" : 46, "y" : 119 },
{ "id" : 0, "animation" : "TBCSMAGE.def", "x" : 707, "y" : 166, "z" : 1, "border" : "TOCSMAG1.bmp", "area" : "TZCSMAG1.bmp" },
{ "id" : 1, "animation" : "TBCSMAG2.def", "x" : 706, "y" : 135, "z" : 1, "border" : "TOCSMAG2.bmp", "area" : "TZCSMAG2.bmp" },
{ "id" : 2, "animation" : "TBCSMAG3.def", "x" : 704, "y" : 107, "z" : 1, "border" : "TOCSM301.bmp", "area" : "TZCSM301.bmp" },
{ "id" : 3, "animation" : "TBCSMAG4.def", "x" : 704, "y" : 76, "z" : 1, "border" : "TOCSM401.bmp", "area" : "TZCSM401.bmp" },
{ "id" : 5, "animation" : "TBCSTVRN.def", "x" : 0, "y" : 230, "z" : 1, "border" : "TOCSTAV1.bmp", "area" : "TZCSTAV1.bmp" },
{ "id" : 6, "animation" : "TBCSDOCK.def", "x" : 478, "y" : 134, "border" : "TOCSDKMS.bmp", "area" : "TZCSDKMS.bmp" },
{ "id" : 7, "animation" : "TBCSCSTL.def", "x" : 595, "y" : 66, "border" : "TOCSCAS1.bmp", "area" : "TZCSCAS1.bmp" },
{ "id" : 8, "animation" : "TBCSCAS2.def", "x" : 478, "y" : 66, "border" : "TOCSCAS2.bmp", "area" : "TZCSCAS2.bmp" },
{ "id" : 9, "animation" : "TBCSCAS3.def", "x" : 478, "y" : 37, "border" : "TOCSCAS3.bmp", "area" : "TZCSCAS3.bmp" },
{ "id" : 10, "animation" : "TBCSHALL.def", "x" : 0, "y" : 209, "border" : "TOCSH101.bmp", "area" : "TZCSH101.bmp" },
{ "id" : 11, "animation" : "TBCSHAL2.def", "x" : 0, "y" : 176, "border" : "TOCSH201.bmp", "area" : "TZCSH201.bmp" },
{ "id" : 12, "animation" : "TBCSHAL3.def", "x" : 0, "y" : 164, "border" : "TOCSH301.bmp", "area" : "TZCSH301.bmp" },
{ "id" : 13, "animation" : "TBCSHAL4.def", "x" : 0, "y" : 154, "border" : "TOCSH401.bmp", "area" : "TZCSH401.bmp" },
{ "id" : 14, "animation" : "TBCSMARK.def", "x" : 413, "y" : 264, "border" : "TOCSMRK1.bmp", "area" : "TZCSMRK1.bmp" },
{ "id" : 15, "animation" : "TBCSSILO.def", "x" : 488, "y" : 228, "border" : "TOCSMRK2.bmp", "area" : "TZCSMRK2.bmp" },
{ "id" : 16, "animation" : "TBCSBLAK.def", "x" : 213, "y" : 251, "border" : "TOCSBLAK.bmp", "area" : "TZCSBLAK.bmp" },
{ "id" : 17, "animation" : "TBCSSPEC.def", "x" : 533, "y" : 71, "border" : "TOCSLT01.bmp", "area" : "TZCSLT01.bmp" },
{ "id" : 18, "animation" : "TBCSHRD1.def", "x" : 76, "y" : 53, "border" : "TOCSGR1H.bmp", "area" : "TZCSGR1H.bmp", "hidden" : true },
{ "id" : 19, "animation" : "TBCSHRD2.def", "x" : 76, "y" : 35, "border" : "TOCSGR2H.bmp", "area" : "TZCSGR2H.bmp", "hidden" : true, "builds" : 18 },
{ "id" : 20, "animation" : "TBCSBOAT.def", "x" : 478, "y" : 134, "border" : "TOCSDKMN.bmp", "area" : "TZCSDKMN.bmp", "hidden" : true },
{ "id" : 21, "animation" : "TBCSEXT0.def", "x" : 384, "y" : 193, "z" : -2, "border" : "TOCSCAVM.bmp", "area" : "TZCSCAVM.bmp" },
{ "id" : 22, "animation" : "TBCSEXT1.def", "x" : 0, "y" : 198, "z" : 1, "border" : "TOCSTAV2.bmp", "area" : "TZCSTAV2.bmp" },
{ "id" : 26, "animation" : "TBCSHOLY.def", "x" : 456, "y" : 109, "z" : -1, "border" : "TOCSHOLY.bmp", "area" : "TZCSHOLY.bmp" },
{ "id" : 30, "animation" : "TBCSDW_0.def", "x" : 304, "y" : 92, "border" : "TOCSPIK1.bmp", "area" : "TZCSPIK1.bmp" },
{ "id" : 31, "animation" : "TBCSDW_1.def", "x" : 360, "y" : 130, "border" : "TOCSCRS1.bmp", "area" : "TZCSCRS1.bmp" },
{ "id" : 32, "animation" : "TBCSDW_2.def", "x" : 76, "y" : 57, "border" : "TOCSGR1N.bmp", "area" : "TZCSGR1N.bmp" },
{ "id" : 33, "animation" : "TBCSDW_3.def", "x" : 176, "y" : 101, "border" : "TOCSSWD1.bmp", "area" : "TZCSSWD1.bmp" },
{ "id" : 34, "animation" : "TBCSDW_4.def", "x" : 563, "y" : 211, "z" : 1, "border" : "TOCSMON1.bmp", "area" : "TZCSMON1.bmp" },
{ "id" : 35, "animation" : "TBCSDW_5.def", "x" : 174, "y" : 190, "z" : -1, "border" : "TOCSC101.bmp", "area" : "TZCSCAV1.bmp" },
{ "id" : 36, "animation" : "TBCSDW_6.def", "x" : 303, "y" : 0, "z" : -1, "border" : "TOCSANG1.bmp", "area" : "TZCSANG1.bmp" },
{ "id" : 37, "animation" : "TBCSUP_0.def", "x" : 304, "y" : 65, "border" : "TOCSPIK2.bmp", "area" : "TZCSPIK2.bmp" },
{ "id" : 38, "animation" : "TBCSUP_1.def", "x" : 360, "y" : 115, "border" : "TOCSCRS2.bmp", "area" : "TZCSCRS2.bmp" },
{ "id" : 39, "animation" : "TBCSUP_2.def", "x" : 76, "y" : 35, "border" : "TOCSGR2N.bmp", "area" : "TZCSGR2N.bmp" },
{ "id" : 40, "animation" : "TBCSUP_3.def", "x" : 176, "y" : 85, "border" : "TOCSSWD2.bmp", "area" : "TZCSSWD2.bmp" },
{ "id" : 41, "animation" : "TBCSUP_4.def", "x" : 563, "y" : 173, "z" : 1, "border" : "TOCSMON2.bmp", "area" : "TZCSMON2.bmp" },
{ "id" : 42, "animation" : "TBCSUP_5.def", "x" : 160, "y" : 190, "z" : -1, "border" : "TOCSCAV2.bmp", "area" : "TZCSCAV2.bmp" },
{ "id" : 43, "animation" : "TBCSUP_6.def", "x" : 303, "y" : 0, "z" : -1, "border" : "TOCSANG2.bmp", "area" : "TZCSANG2.bmp" }
],
{
"extraAnimation": { "animation" : "TBCSEXT2.def", "x" : 46, "y" : 119 },
"mageGuild1": { "id" : 0, "animation" : "TBCSMAGE.def", "x" : 707, "y" : 166, "z" : 1, "border" : "TOCSMAG1.bmp", "area" : "TZCSMAG1.bmp" },
"mageGuild2": { "id" : 1, "animation" : "TBCSMAG2.def", "x" : 706, "y" : 135, "z" : 1, "border" : "TOCSMAG2.bmp", "area" : "TZCSMAG2.bmp" },
"mageGuild3": { "id" : 2, "animation" : "TBCSMAG3.def", "x" : 704, "y" : 107, "z" : 1, "border" : "TOCSM301.bmp", "area" : "TZCSM301.bmp" },
"mageGuild4": { "id" : 3, "animation" : "TBCSMAG4.def", "x" : 704, "y" : 76, "z" : 1, "border" : "TOCSM401.bmp", "area" : "TZCSM401.bmp" },
"tavern": { "id" : 5, "animation" : "TBCSTVRN.def", "x" : 0, "y" : 230, "z" : 1, "border" : "TOCSTAV1.bmp", "area" : "TZCSTAV1.bmp" },
"shipyard": { "id" : 6, "animation" : "TBCSDOCK.def", "x" : 478, "y" : 134, "border" : "TOCSDKMS.bmp", "area" : "TZCSDKMS.bmp" },
"fort": { "id" : 7, "animation" : "TBCSCSTL.def", "x" : 595, "y" : 66, "border" : "TOCSCAS1.bmp", "area" : "TZCSCAS1.bmp" },
"citadel": { "id" : 8, "animation" : "TBCSCAS2.def", "x" : 478, "y" : 66, "border" : "TOCSCAS2.bmp", "area" : "TZCSCAS2.bmp" },
"castle": { "id" : 9, "animation" : "TBCSCAS3.def", "x" : 478, "y" : 37, "border" : "TOCSCAS3.bmp", "area" : "TZCSCAS3.bmp" },
"villageHall": { "id" : 10, "animation" : "TBCSHALL.def", "x" : 0, "y" : 209, "border" : "TOCSH101.bmp", "area" : "TZCSH101.bmp" },
"townHall": { "id" : 11, "animation" : "TBCSHAL2.def", "x" : 0, "y" : 176, "border" : "TOCSH201.bmp", "area" : "TZCSH201.bmp" },
"cityHall": { "id" : 12, "animation" : "TBCSHAL3.def", "x" : 0, "y" : 164, "border" : "TOCSH301.bmp", "area" : "TZCSH301.bmp" },
"capitol": { "id" : 13, "animation" : "TBCSHAL4.def", "x" : 0, "y" : 154, "border" : "TOCSH401.bmp", "area" : "TZCSH401.bmp" },
"marketplace": { "id" : 14, "animation" : "TBCSMARK.def", "x" : 413, "y" : 264, "border" : "TOCSMRK1.bmp", "area" : "TZCSMRK1.bmp" },
"resourceSilo": { "id" : 15, "animation" : "TBCSSILO.def", "x" : 488, "y" : 228, "border" : "TOCSMRK2.bmp", "area" : "TZCSMRK2.bmp" },
"blacksmith": { "id" : 16, "animation" : "TBCSBLAK.def", "x" : 213, "y" : 251, "border" : "TOCSBLAK.bmp", "area" : "TZCSBLAK.bmp" },
"special1": { "id" : 17, "animation" : "TBCSSPEC.def", "x" : 533, "y" : 71, "border" : "TOCSLT01.bmp", "area" : "TZCSLT01.bmp" },
"horde1": { "id" : 18, "animation" : "TBCSHRD1.def", "x" : 76, "y" : 53, "border" : "TOCSGR1H.bmp", "area" : "TZCSGR1H.bmp", "hidden" : true },
"horde1Upgr": { "id" : 19, "animation" : "TBCSHRD2.def", "x" : 76, "y" : 35, "border" : "TOCSGR2H.bmp", "area" : "TZCSGR2H.bmp", "hidden" : true, "builds" : 18 },
"ship": { "id" : 20, "animation" : "TBCSBOAT.def", "x" : 478, "y" : 134, "border" : "TOCSDKMN.bmp", "area" : "TZCSDKMN.bmp", "hidden" : true },
"special2": { "id" : 21, "animation" : "TBCSEXT0.def", "x" : 384, "y" : 193, "z" : -2, "border" : "TOCSCAVM.bmp", "area" : "TZCSCAVM.bmp" },
"special3": { "id" : 22, "animation" : "TBCSEXT1.def", "x" : 0, "y" : 198, "z" : 1, "border" : "TOCSTAV2.bmp", "area" : "TZCSTAV2.bmp" },
"grail": { "id" : 26, "animation" : "TBCSHOLY.def", "x" : 456, "y" : 109, "z" : -1, "border" : "TOCSHOLY.bmp", "area" : "TZCSHOLY.bmp" },
"dwellingLvl1": { "id" : 30, "animation" : "TBCSDW_0.def", "x" : 304, "y" : 92, "border" : "TOCSPIK1.bmp", "area" : "TZCSPIK1.bmp" },
"dwellingLvl2": { "id" : 31, "animation" : "TBCSDW_1.def", "x" : 360, "y" : 130, "border" : "TOCSCRS1.bmp", "area" : "TZCSCRS1.bmp" },
"dwellingLvl3": { "id" : 32, "animation" : "TBCSDW_2.def", "x" : 76, "y" : 57, "border" : "TOCSGR1N.bmp", "area" : "TZCSGR1N.bmp" },
"dwellingLvl4": { "id" : 33, "animation" : "TBCSDW_3.def", "x" : 176, "y" : 101, "border" : "TOCSSWD1.bmp", "area" : "TZCSSWD1.bmp" },
"dwellingLvl5": { "id" : 34, "animation" : "TBCSDW_4.def", "x" : 563, "y" : 211, "z" : 1, "border" : "TOCSMON1.bmp", "area" : "TZCSMON1.bmp" },
"dwellingLvl6": { "id" : 35, "animation" : "TBCSDW_5.def", "x" : 174, "y" : 190, "z" : -1, "border" : "TOCSC101.bmp", "area" : "TZCSCAV1.bmp" },
"dwellingLvl7": { "id" : 36, "animation" : "TBCSDW_6.def", "x" : 303, "y" : 0, "z" : -1, "border" : "TOCSANG1.bmp", "area" : "TZCSANG1.bmp" },
"dwellingUpLvl1": { "id" : 37, "animation" : "TBCSUP_0.def", "x" : 304, "y" : 65, "border" : "TOCSPIK2.bmp", "area" : "TZCSPIK2.bmp" },
"dwellingUpLvl2": { "id" : 38, "animation" : "TBCSUP_1.def", "x" : 360, "y" : 115, "border" : "TOCSCRS2.bmp", "area" : "TZCSCRS2.bmp" },
"dwellingUpLvl3": { "id" : 39, "animation" : "TBCSUP_2.def", "x" : 76, "y" : 35, "border" : "TOCSGR2N.bmp", "area" : "TZCSGR2N.bmp" },
"dwellingUpLvl4": { "id" : 40, "animation" : "TBCSUP_3.def", "x" : 176, "y" : 85, "border" : "TOCSSWD2.bmp", "area" : "TZCSSWD2.bmp" },
"dwellingUpLvl5": { "id" : 41, "animation" : "TBCSUP_4.def", "x" : 563, "y" : 173, "z" : 1, "border" : "TOCSMON2.bmp", "area" : "TZCSMON2.bmp" },
"dwellingUpLvl6": { "id" : 42, "animation" : "TBCSUP_5.def", "x" : 160, "y" : 190, "z" : -1, "border" : "TOCSCAV2.bmp", "area" : "TZCSCAV2.bmp" },
"dwellingUpLvl7": { "id" : 43, "animation" : "TBCSUP_6.def", "x" : 303, "y" : 0, "z" : -1, "border" : "TOCSANG2.bmp", "area" : "TZCSANG2.bmp" }
},
"icons" :
{
"village" : {"normal" : 18, "built" : 19 },
@ -150,49 +150,50 @@
"moatDamage" : 70,
"buildings" :
[
{ "id" : 0 },
{ "id" : 1, "upgrades" : 0 },
{ "id" : 2, "upgrades" : 1 },
{ "id" : 3, "upgrades" : 2 },
{ "id" : 4, "upgrades" : 3 },
{ "id" : 5 },
{ "id" : 6 },
{ "id" : 7 },
{ "id" : 8, "upgrades" : 7 },
{ "id" : 9, "upgrades" : 8 },
{ "id" : 10, "mode" : "auto" },
{ "id" : 11, "upgrades" : 10, "requires" : [ 5 ] },
{ "id" : 12, "upgrades" : 11, "requires" : [ 0, 14, 16 ] },
{ "id" : 13, "upgrades" : 12, "requires" : [ 9 ] },
{ "id" : 14 },
{ "id" : 15, "requires" : [ 14 ] },
{ "id" : 16 },
{ "id" : 17, "requires" : [ 6 ] },
{ "id" : 18, "upgrades" : 32 },
{ "id" : 19, "upgrades" : 39, "requires" : [ 18 ], "mode" : "auto" },
{ "id" : 20, "upgrades" : 6 },
{ "id" : 21, "requires" : [ 33 ] },
{ "id" : 22, "upgrades" : 5 },
{ "id" : 26, "mode" : "grail"},
{ "id" : 27, "requires" : [ 11 ], "mode" : "auto" },
{ "id" : 28, "requires" : [ 12 ], "mode" : "auto" },
{ "id" : 29, "requires" : [ 13 ], "mode" : "auto" },
{ "id" : 30, "requires" : [ 7 ] },
{ "id" : 31, "requires" : [ 30 ] },
{ "id" : 32, "requires" : [ 33 ] },
{ "id" : 33, "requires" : [ 16, 30 ] },
{ "id" : 34, "requires" : [ 0, 33 ] },
{ "id" : 35, "requires" : [ 21 ] },
{ "id" : 36, "requires" : [ 34 ] },
{ "id" : 37, "upgrades" : 30 },
{ "id" : 38, "upgrades" : 31 },
{ "id" : 39, "upgrades" : 32 },
{ "id" : 40, "upgrades" : 33 },
{ "id" : 41, "upgrades" : 34 },
{ "id" : 42, "upgrades" : 35 },
{ "id" : 43, "upgrades" : 36 }
],
{
"mageGuild1": { "id" : 0 },
"mageGuild2": { "id" : 1, "upgrades" : 0 },
"mageGuild3": { "id" : 2, "upgrades" : 1 },
"mageGuild4": { "id" : 3, "upgrades" : 2 },
"tavern": { "id" : 5 },
"shipyard": { "id" : 6 },
"fort": { "id" : 7 },
"citadel": { "id" : 8, "upgrades" : 7 },
"castle": { "id" : 9, "upgrades" : 8 },
"villageHall": { "id" : 10, "mode" : "auto" },
"townHall": { "id" : 11, "upgrades" : 10, "requires" : [ 5 ] },
"cityHall": { "id" : 12, "upgrades" : 11, "requires" : [ 0, 14, 16 ] },
"capitol": { "id" : 13, "upgrades" : 12, "requires" : [ 9 ] },
"marketplace": { "id" : 14 },
"resourceSilo": { "id" : 15, "requires" : [ 14 ] },
"blacksmith": { "id" : 16 },
"special1": { "id" : 17, "requires" : [ 6 ] },
"horde1": { "id" : 18, "upgrades" : 32 },
"horde1Upgr": { "id" : 19, "upgrades" : 39, "requires" : [ 18 ], "mode" : "auto" },
"ship": { "id" : 20, "upgrades" : 6 },
"special2": { "id" : 21, "requires" : [ 33 ] },
"special3": { "id" : 22, "upgrades" : 5 },
"grail": { "id" : 26, "mode" : "grail"},
"dwellingLvl1": { "id" : 30, "requires" : [ 7 ] },
"dwellingLvl2": { "id" : 31, "requires" : [ 30 ] },
"dwellingLvl3": { "id" : 32, "requires" : [ 33 ] },
"dwellingLvl4": { "id" : 33, "requires" : [ 16, 30 ] },
"dwellingLvl5": { "id" : 34, "requires" : [ 0, 33 ] },
"dwellingLvl6": { "id" : 35, "requires" : [ 21 ] },
"dwellingLvl7": { "id" : 36, "requires" : [ 34 ] },
"dwellingUpLvl1": { "id" : 37, "upgrades" : 30 },
"dwellingUpLvl2": { "id" : 38, "upgrades" : 31 },
"dwellingUpLvl3": { "id" : 39, "upgrades" : 32 },
"dwellingUpLvl4": { "id" : 40, "upgrades" : 33 },
"dwellingUpLvl5": { "id" : 41, "upgrades" : 34 },
"dwellingUpLvl6": { "id" : 42, "upgrades" : 35 },
"dwellingUpLvl7": { "id" : 43, "upgrades" : 36 },
"horde2" : null,
"horde2Upgr" : null,
"mageGuild5" : null,
"special4" : null
},
"siege" :
{

View File

@ -74,50 +74,50 @@
"capitol" : "AVCHFORZ.DEF"
},
"structures" :
[
{ "animation" : "TBELEXT5.def", "x" : 682, "y" : 183, "z" : -1, },
{ "animation" : "TBELEXT1.def", "x" : 23, "y" : 218 },
{ "id" : 0, "animation" : "TBELMAGE.def", "x" : 206, "y" : 58, "z" : 4, "border" : "TOELMAGE.bmp", "area" : "TZELMAGE.bmp" },
{ "id" : 1, "animation" : "TBELMAG2.def", "x" : 206, "y" : 58, "z" : 4, "border" : "TOELMAG2.bmp", "area" : "TZELMAG2.bmp" },
{ "id" : 2, "animation" : "TBELMAG3.def", "x" : 206, "y" : 58, "z" : 4, "border" : "TOELMAG3.bmp", "area" : "TZELMAG3.bmp" },
{ "id" : 3, "animation" : "TBELMAG4.def", "x" : 206, "y" : 58, "z" : 4, "border" : "TOELMAG4.bmp", "area" : "TZELMAG4.bmp" },
{ "id" : 4, "animation" : "TBELMAG5.def", "x" : 206, "y" : 58, "z" : 4, "border" : "TOELMAG5.bmp", "area" : "TZELMAG5.bmp" },
{ "id" : 5, "animation" : "TBELTVRN.def", "x" : 553, "y" : 203, "z" : 1, "border" : "TOELTVRN.bmp", "area" : "TZELTVRN.bmp" },
{ "id" : 6, "animation" : "TBELDOCK.def", "x" : 239, "y" : 215, "z" : 2, "border" : "TOELDOCK.bmp", "area" : "TZELDOCK.bmp" },
{ "id" : 7, "animation" : "TBELCSTL.def", "x" : 349, "y" : 101, "z" : -1, "border" : "TOELCSTL.bmp", "area" : "TZELCSTL.bmp" },
{ "id" : 8, "animation" : "TBELCAS2.def", "x" : 349, "y" : 101, "z" : -1, "border" : "TOELCAS2.bmp", "area" : "TZELCAS2.bmp" },
{ "id" : 9, "animation" : "TBELCAS3.def", "x" : 349, "y" : 101, "z" : -1, "border" : "TOELCAS3.bmp", "area" : "TZELCAS3.bmp" },
{ "id" : 10, "animation" : "TBELHALL.def", "x" : -1, "y" : 164, "z" : 5, "border" : "TOELHALL.bmp", "area" : "TZELHALL.bmp" },
{ "id" : 11, "animation" : "TBELHAL2.def", "x" : 0, "y" : 165, "z" : 5, "border" : "TOELHAL2.bmp", "area" : "TZELHAL2.bmp" },
{ "id" : 12, "animation" : "TBELHAL3.def", "x" : 0, "y" : 165, "z" : 5, "border" : "TOELHAL3.bmp", "area" : "TZELHAL3.bmp" },
{ "id" : 13, "animation" : "TBELHAL4.def", "x" : 0, "y" : 164, "z" : 5, "border" : "TOELHAL4.bmp", "area" : "TZELHAL4.bmp" },
{ "id" : 14, "animation" : "TBELMARK.def", "x" : 347, "y" : 216, "z" : 4, "border" : "TOELMARK.bmp", "area" : "TZELMARK.bmp" },
{ "id" : 15, "animation" : "TBELSILO.def", "x" : 372, "y" : 171, "z" : 2, "border" : "TOELSILO.bmp", "area" : "TZELSILO.bmp" },
{ "id" : 16, "animation" : "TBELBLAK.def", "x" : 449, "y" : 151, "z" : 1, "border" : "TOELBLAK.bmp", "area" : "TZELBLAK.bmp" },
{ "id" : 17, "animation" : "TBELSPEC.def", "x" : 284, "y" : 246, "z" : 4, "border" : "TOELSPEC.bmp", "area" : "TZELSPEC.bmp" },
{ "id" : 18, "animation" : "TBELHRD1.def", "x" : 689, "y" : 250, "border" : "TOELHRD1.bmp", "area" : "TZELHRD1.bmp", "hidden" : true },
{ "id" : 19, "animation" : "TBELHRD2.def", "x" : 689, "y" : 250, "border" : "TOELHRD2.bmp", "area" : "TZELHRD2.bmp", "hidden" : true, "builds" : 18 },
{ "id" : 20, "animation" : "TBELBOAT.def", "x" : 239, "y" : 215, "z" : 2, "border" : "TOELBOAT.bmp", "area" : "TZELBOAT.bmp", "hidden" : true },
{ "id" : 21, "animation" : "TBELEXT6.def", "x" : 104, "y" : 170, "z" : 3, "border" : "TOELEXT6.bmp", "area" : "TZELEXT6.bmp" },
{ "id" : 26, "animation" : "TBELHOLY.def", "x" : 307, "y" : 2, "border" : "TOELHOLY.bmp", "area" : "TZELHOLY.bmp" },
{ "id" : 27, "animation" : "TBELEXT2.def", "x" : 232, "y" : 205 },
{ "id" : 28, "animation" : "TBELEXT3.def", "x" : 516, "y" : 223, "z" : 1 },
{ "id" : 29, "animation" : "TBELEXT4.def", "x" : 0, "y" : 252, "z" : 6 },
{ "id" : 30, "animation" : "TBELDW_0.def", "x" : 689, "y" : 250, "border" : "TOELDW_0.bmp", "area" : "TZELDW_0.bmp" },
{ "id" : 31, "animation" : "TBELDW_1.def", "x" : 630, "y" : 50, "border" : "TOELDW_1.bmp", "area" : "TZELDW_1.bmp" },
{ "id" : 32, "animation" : "TBELDW_2.def", "x" : 709, "y" : 210, "z" : -1, "border" : "TOELDW_2.bmp", "area" : "TZELDW_2.bmp" },
{ "id" : 33, "animation" : "TBELDW_3.def", "x" : 108, "y" : 131, "z" : -1, "border" : "TOELDW_3.bmp", "area" : "TZELDW_3.bmp" },
{ "id" : 34, "animation" : "TBELDW_4.def", "x" : 264, "y" : 168, "z" : -1, "border" : "TOELDW_4.bmp", "area" : "TZELDW_4.bmp" },
{ "id" : 35, "animation" : "TBELDW_5.def", "x" : 394, "y" : 283, "z" : 2, "border" : "TOELDW_5.bmp", "area" : "TZELDW_5.bmp" },
{ "id" : 36, "animation" : "TBELDW_6.def", "x" : 43, "y" : 16, "z" : -2, "border" : "TOELDW_6.bmp", "area" : "TZELDW_6.bmp" },
{ "id" : 37, "animation" : "TBELUP_0.def", "x" : 689, "y" : 250, "border" : "TOELUP_0.bmp", "area" : "TZELUP_0.bmp" },
{ "id" : 38, "animation" : "TBELUP_1.def", "x" : 630, "y" : 50, "border" : "TOELUP_1.bmp", "area" : "TZELUP_1.bmp" },
{ "id" : 39, "animation" : "TBELUP_2.def", "x" : 709, "y" : 210, "z" : -1, "border" : "TOELUP_2.bmp", "area" : "TZELUP_2.bmp" },
{ "id" : 40, "animation" : "TBELUP_3.def", "x" : 108, "y" : 131, "z" : -1, "border" : "TOELUP_3.bmp", "area" : "TZELUP_3.bmp" },
{ "id" : 41, "animation" : "TBELUP_4.def", "x" : 264, "y" : 168, "z" : -1, "border" : "TOELUP_4.bmp", "area" : "TZELUP_4.bmp" },
{ "id" : 42, "animation" : "TBELUP_5.def", "x" : 394, "y" : 283, "z" : 2, "border" : "TOELUP_5.bmp", "area" : "TZELUP_5.bmp" },
{ "id" : 43, "animation" : "TBELUP_6.def", "x" : 43, "y" : 0, "z" : -2, "border" : "TOELUP_6.bmp", "area" : "TZELUP_6.bmp" },
],
{
"extraAnimation2":{ "animation" : "TBELEXT5.def", "x" : 682, "y" : 183, "z" : -1, },
"extraAnimation": { "animation" : "TBELEXT1.def", "x" : 23, "y" : 218 },
"mageGuild1": { "id" : 0, "animation" : "TBELMAGE.def", "x" : 206, "y" : 58, "z" : 4, "border" : "TOELMAGE.bmp", "area" : "TZELMAGE.bmp" },
"mageGuild2": { "id" : 1, "animation" : "TBELMAG2.def", "x" : 206, "y" : 58, "z" : 4, "border" : "TOELMAG2.bmp", "area" : "TZELMAG2.bmp" },
"mageGuild3": { "id" : 2, "animation" : "TBELMAG3.def", "x" : 206, "y" : 58, "z" : 4, "border" : "TOELMAG3.bmp", "area" : "TZELMAG3.bmp" },
"mageGuild4": { "id" : 3, "animation" : "TBELMAG4.def", "x" : 206, "y" : 58, "z" : 4, "border" : "TOELMAG4.bmp", "area" : "TZELMAG4.bmp" },
"mageGuild5": { "id" : 4, "animation" : "TBELMAG5.def", "x" : 206, "y" : 58, "z" : 4, "border" : "TOELMAG5.bmp", "area" : "TZELMAG5.bmp" },
"tavern": { "id" : 5, "animation" : "TBELTVRN.def", "x" : 553, "y" : 203, "z" : 1, "border" : "TOELTVRN.bmp", "area" : "TZELTVRN.bmp" },
"shipyard": { "id" : 6, "animation" : "TBELDOCK.def", "x" : 239, "y" : 215, "z" : 2, "border" : "TOELDOCK.bmp", "area" : "TZELDOCK.bmp" },
"fort": { "id" : 7, "animation" : "TBELCSTL.def", "x" : 349, "y" : 101, "z" : -1, "border" : "TOELCSTL.bmp", "area" : "TZELCSTL.bmp" },
"citadel": { "id" : 8, "animation" : "TBELCAS2.def", "x" : 349, "y" : 101, "z" : -1, "border" : "TOELCAS2.bmp", "area" : "TZELCAS2.bmp" },
"castle": { "id" : 9, "animation" : "TBELCAS3.def", "x" : 349, "y" : 101, "z" : -1, "border" : "TOELCAS3.bmp", "area" : "TZELCAS3.bmp" },
"villageHall": { "id" : 10, "animation" : "TBELHALL.def", "x" : -1, "y" : 164, "z" : 5, "border" : "TOELHALL.bmp", "area" : "TZELHALL.bmp" },
"townHall": { "id" : 11, "animation" : "TBELHAL2.def", "x" : 0, "y" : 165, "z" : 5, "border" : "TOELHAL2.bmp", "area" : "TZELHAL2.bmp" },
"cityHall": { "id" : 12, "animation" : "TBELHAL3.def", "x" : 0, "y" : 165, "z" : 5, "border" : "TOELHAL3.bmp", "area" : "TZELHAL3.bmp" },
"capitol": { "id" : 13, "animation" : "TBELHAL4.def", "x" : 0, "y" : 164, "z" : 5, "border" : "TOELHAL4.bmp", "area" : "TZELHAL4.bmp" },
"marketplace": { "id" : 14, "animation" : "TBELMARK.def", "x" : 347, "y" : 216, "z" : 4, "border" : "TOELMARK.bmp", "area" : "TZELMARK.bmp" },
"resourceSilo": { "id" : 15, "animation" : "TBELSILO.def", "x" : 372, "y" : 171, "z" : 2, "border" : "TOELSILO.bmp", "area" : "TZELSILO.bmp" },
"blacksmith": { "id" : 16, "animation" : "TBELBLAK.def", "x" : 449, "y" : 151, "z" : 1, "border" : "TOELBLAK.bmp", "area" : "TZELBLAK.bmp" },
"special1": { "id" : 17, "animation" : "TBELSPEC.def", "x" : 284, "y" : 246, "z" : 4, "border" : "TOELSPEC.bmp", "area" : "TZELSPEC.bmp" },
"horde1": { "id" : 18, "animation" : "TBELHRD1.def", "x" : 689, "y" : 250, "border" : "TOELHRD1.bmp", "area" : "TZELHRD1.bmp", "hidden" : true },
"horde1Upgr": { "id" : 19, "animation" : "TBELHRD2.def", "x" : 689, "y" : 250, "border" : "TOELHRD2.bmp", "area" : "TZELHRD2.bmp", "hidden" : true, "builds" : 18 },
"ship": { "id" : 20, "animation" : "TBELBOAT.def", "x" : 239, "y" : 215, "z" : 2, "border" : "TOELBOAT.bmp", "area" : "TZELBOAT.bmp", "hidden" : true },
"special2": { "id" : 21, "animation" : "TBELEXT6.def", "x" : 104, "y" : 170, "z" : 3, "border" : "TOELEXT6.bmp", "area" : "TZELEXT6.bmp" },
"grail": { "id" : 26, "animation" : "TBELHOLY.def", "x" : 307, "y" : 2, "border" : "TOELHOLY.bmp", "area" : "TZELHOLY.bmp" },
"extraTownHall": { "id" : 27, "animation" : "TBELEXT2.def", "x" : 232, "y" : 205 },
"extraCityHall": { "id" : 28, "animation" : "TBELEXT3.def", "x" : 516, "y" : 223, "z" : 1 },
"extraCapitol": { "id" : 29, "animation" : "TBELEXT4.def", "x" : 0, "y" : 252, "z" : 6 },
"dwellingLvl1": { "id" : 30, "animation" : "TBELDW_0.def", "x" : 689, "y" : 250, "border" : "TOELDW_0.bmp", "area" : "TZELDW_0.bmp" },
"dwellingLvl2": { "id" : 31, "animation" : "TBELDW_1.def", "x" : 630, "y" : 50, "border" : "TOELDW_1.bmp", "area" : "TZELDW_1.bmp" },
"dwellingLvl3": { "id" : 32, "animation" : "TBELDW_2.def", "x" : 709, "y" : 210, "z" : -1, "border" : "TOELDW_2.bmp", "area" : "TZELDW_2.bmp" },
"dwellingLvl4": { "id" : 33, "animation" : "TBELDW_3.def", "x" : 108, "y" : 131, "z" : -1, "border" : "TOELDW_3.bmp", "area" : "TZELDW_3.bmp" },
"dwellingLvl5": { "id" : 34, "animation" : "TBELDW_4.def", "x" : 264, "y" : 168, "z" : -1, "border" : "TOELDW_4.bmp", "area" : "TZELDW_4.bmp" },
"dwellingLvl6": { "id" : 35, "animation" : "TBELDW_5.def", "x" : 394, "y" : 283, "z" : 2, "border" : "TOELDW_5.bmp", "area" : "TZELDW_5.bmp" },
"dwellingLvl7": { "id" : 36, "animation" : "TBELDW_6.def", "x" : 43, "y" : 16, "z" : -2, "border" : "TOELDW_6.bmp", "area" : "TZELDW_6.bmp" },
"dwellingUpLvl1": { "id" : 37, "animation" : "TBELUP_0.def", "x" : 689, "y" : 250, "border" : "TOELUP_0.bmp", "area" : "TZELUP_0.bmp" },
"dwellingUpLvl2": { "id" : 38, "animation" : "TBELUP_1.def", "x" : 630, "y" : 50, "border" : "TOELUP_1.bmp", "area" : "TZELUP_1.bmp" },
"dwellingUpLvl3": { "id" : 39, "animation" : "TBELUP_2.def", "x" : 709, "y" : 210, "z" : -1, "border" : "TOELUP_2.bmp", "area" : "TZELUP_2.bmp" },
"dwellingUpLvl4": { "id" : 40, "animation" : "TBELUP_3.def", "x" : 108, "y" : 131, "z" : -1, "border" : "TOELUP_3.bmp", "area" : "TZELUP_3.bmp" },
"dwellingUpLvl5": { "id" : 41, "animation" : "TBELUP_4.def", "x" : 264, "y" : 168, "z" : -1, "border" : "TOELUP_4.bmp", "area" : "TZELUP_4.bmp" },
"dwellingUpLvl6": { "id" : 42, "animation" : "TBELUP_5.def", "x" : 394, "y" : 283, "z" : 2, "border" : "TOELUP_5.bmp", "area" : "TZELUP_5.bmp" },
"dwellingUpLvl7": { "id" : 43, "animation" : "TBELUP_6.def", "x" : 43, "y" : 0, "z" : -2, "border" : "TOELUP_6.bmp", "area" : "TZELUP_6.bmp" }
},
"icons" :
{
"village" : {"normal" : 34, "built" : 35 },
@ -154,48 +154,53 @@
"moatDamage" : 70,
"buildings" :
[
{ "id" : 0 },
{ "id" : 1, "upgrades" : 0 },
{ "id" : 2, "upgrades" : 1 },
{ "id" : 3, "upgrades" : 2 },
{ "id" : 4, "upgrades" : 3 },
{ "id" : 5 },
{ "id" : 6 },
{ "id" : 7 },
{ "id" : 8, "upgrades" : 7 },
{ "id" : 9, "upgrades" : 8 },
{ "id" : 10, "mode" : "auto" },
{ "id" : 11, "upgrades" : 10, "requires" : [ 5 ] },
{ "id" : 12, "upgrades" : 11, "requires" : [ 0, 14, 16 ] },
{ "id" : 13, "upgrades" : 12, "requires" : [ 9 ] },
{ "id" : 14 },
{ "id" : 15, "requires" : [ 14 ] },
{ "id" : 16 },
{ "id" : 17, "requires" : [ 14 ] },
{ "id" : 18, "upgrades" : 30 },
{ "id" : 19, "upgrades" : 37, "requires" : [ 18 ], "mode" : "auto" },
{ "id" : 20, "upgrades" : 6 },
{ "id" : 21, "requires" : [ 0 ] },
{ "id" : 26, "mode" : "grail"},
{ "id" : 27, "requires" : [ 11 ], "mode" : "auto" },
{ "id" : 28, "requires" : [ 12 ], "mode" : "auto" },
{ "id" : 29, "requires" : [ 13 ], "mode" : "auto" },
{ "id" : 30, "requires" : [ 7 ] },
{ "id" : 31, "requires" : [ 30, 0 ] },
{ "id" : 32, "requires" : [ 30, 0 ] },
{ "id" : 33, "requires" : [ 31 ] },
{ "id" : 34, "requires" : [ 32 ] },
{ "id" : 35, "requires" : [ 33, 34 ] },
{ "id" : 36, "requires" : [ 35 ] },
{ "id" : 37, "upgrades" : 30 },
{ "id" : 38, "upgrades" : 31 },
{ "id" : 39, "upgrades" : 32 },
{ "id" : 40, "upgrades" : 33, "requires" : [ 31 ] },
{ "id" : 41, "upgrades" : 34 },
{ "id" : 42, "upgrades" : 35, "requires" : [ 1 ] },
{ "id" : 43, "upgrades" : 36 }
],
{
"mageGuild1": { "id" : 0 },
"mageGuild2": { "id" : 1, "upgrades" : 0 },
"mageGuild3": { "id" : 2, "upgrades" : 1 },
"mageGuild4": { "id" : 3, "upgrades" : 2 },
"mageGuild5": { "id" : 4, "upgrades" : 3 },
"tavern": { "id" : 5 },
"shipyard": { "id" : 6 },
"fort": { "id" : 7 },
"citadel": { "id" : 8, "upgrades" : 7 },
"castle": { "id" : 9, "upgrades" : 8 },
"villageHall": { "id" : 10, "mode" : "auto" },
"townHall": { "id" : 11, "upgrades" : 10, "requires" : [ 5 ] },
"cityHall": { "id" : 12, "upgrades" : 11, "requires" : [ 0, 14, 16 ] },
"capitol": { "id" : 13, "upgrades" : 12, "requires" : [ 9 ] },
"marketplace": { "id" : 14 },
"resourceSilo": { "id" : 15, "requires" : [ 14 ] },
"blacksmith": { "id" : 16 },
"special1": { "id" : 17, "requires" : [ 14 ] },
"horde1": { "id" : 18, "upgrades" : 30 },
"horde1Upgr": { "id" : 19, "upgrades" : 37, "requires" : [ 18 ], "mode" : "auto" },
"ship": { "id" : 20, "upgrades" : 6 },
"special2": { "id" : 21, "requires" : [ 0 ] },
"grail": { "id" : 26, "mode" : "grail"},
"extraTownHall": { "id" : 27, "requires" : [ 11 ], "mode" : "auto" },
"extraCityHall": { "id" : 28, "requires" : [ 12 ], "mode" : "auto" },
"extraCapitol": { "id" : 29, "requires" : [ 13 ], "mode" : "auto" },
"dwellingLvl1": { "id" : 30, "requires" : [ 7 ] },
"dwellingLvl2": { "id" : 31, "requires" : [ 30, 0 ] },
"dwellingLvl3": { "id" : 32, "requires" : [ 30, 0 ] },
"dwellingLvl4": { "id" : 33, "requires" : [ 31 ] },
"dwellingLvl5": { "id" : 34, "requires" : [ 32 ] },
"dwellingLvl6": { "id" : 35, "requires" : [ 33, 34 ] },
"dwellingLvl7": { "id" : 36, "requires" : [ 35 ] },
"dwellingUpLvl1": { "id" : 37, "upgrades" : 30 },
"dwellingUpLvl2": { "id" : 38, "upgrades" : 31 },
"dwellingUpLvl3": { "id" : 39, "upgrades" : 32 },
"dwellingUpLvl4": { "id" : 40, "upgrades" : 33, "requires" : [ 31 ] },
"dwellingUpLvl5": { "id" : 41, "upgrades" : 34 },
"dwellingUpLvl6": { "id" : 42, "upgrades" : 35, "requires" : [ 1 ] },
"dwellingUpLvl7": { "id" : 43, "upgrades" : 36 },
"horde2" : null,
"horde2Upgr" : null,
"special3" : null,
"special4" : null
},
"siege" :
{

View File

@ -74,45 +74,45 @@
"capitol" : "AVCDUNZ0.DEF"
},
"structures" :
[
{ "id" : 0, "animation" : "TBDNMAGE.def", "x" : 164, "y" : 119, "z" : -1, "border" : "TODMAG1.bmp", "area" : "TZDMAG1.bmp" },
{ "id" : 1, "animation" : "TBDNMAG2.def", "x" : 164, "y" : 97, "z" : -1, "border" : "TODMAG2.bmp", "area" : "TZDMAG2.bmp" },
{ "id" : 2, "animation" : "TBDNMAG3.def", "x" : 164, "y" : 77, "z" : -1, "border" : "TODMAG3.bmp", "area" : "TZDMAG3.bmp" },
{ "id" : 3, "animation" : "TBDNMAG4.def", "x" : 164, "y" : 61, "z" : -1, "border" : "TODMAG4.bmp", "area" : "TZDMAG4.bmp" },
{ "id" : 4, "animation" : "TBDNMAG5.def", "x" : 164, "y" : 15, "z" : -1, "border" : "TODMAG5.bmp", "area" : "TZDMAG5.bmp" },
{ "id" : 5, "animation" : "TBDNTVRN.def", "x" : 211, "y" : 297, "border" : "TODTAV.bmp", "area" : "TZDTAV.bmp" },
{ "id" : 7, "animation" : "TBDNCSTL.def", "x" : 363, "y" : 87, "z" : 2, "border" : "TODCAS1.bmp", "area" : "TZDCAS1.bmp" },
{ "id" : 8, "animation" : "TBDNCAS2.def", "x" : 363, "y" : 87, "z" : 2, "border" : "TODCAS2.bmp", "area" : "TZDCAS2.bmp" },
{ "id" : 9, "animation" : "TBDNCAS3.def", "x" : 363, "y" : 87, "z" : 2, "border" : "TODCAS3.bmp", "area" : "TZDCAS3.bmp" },
{ "id" : 10, "animation" : "TBDNHALL.def", "x" : 0, "y" : 234, "border" : "TODHALL1.bmp", "area" : "TZDHALL1.bmp" },
{ "id" : 11, "animation" : "TBDNHAL2.def", "x" : 0, "y" : 223, "border" : "TODHALL2.bmp", "area" : "TZDHALL2.bmp" },
{ "id" : 12, "animation" : "TBDNHAL3.def", "x" : 0, "y" : 223, "border" : "TODHALL3.bmp", "area" : "TZDHALL3.bmp" },
{ "id" : 13, "animation" : "TBDNHAL4.def", "x" : 0, "y" : 203, "z" : -1, "border" : "TODHALL4.bmp", "area" : "TZDHALL4.bmp" },
{ "id" : 14, "animation" : "TBDNMARK.def", "x" : 590, "y" : 318, "z" : -2, "border" : "TODMARK.bmp", "area" : "TZDMARK.bmp" },
{ "id" : 15, "animation" : "TBDNSILO.def", "x" : 624, "y" : 335, "z" : 1, "border" : "TODSILO.bmp", "area" : "TZDSILO.bmp" },
{ "id" : 16, "animation" : "TBDNBLAK.def", "x" : 544, "y" : 248, "z" : -3, "border" : "TODSMITH.bmp", "area" : "TZDSMITH.bmp" },
{ "id" : 17, "animation" : "TBDNSPEC.def", "x" : 746, "y" : 294, "z" : 1, "border" : "TODART.bmp", "area" : "TZDART.bmp" },
{ "id" : 18, "animation" : "TBDNHRD1.def", "x" : 0, "y" : 326, "z" : 2, "border" : "TODTR1HA.bmp", "area" : "TZDTR1HA.bmp", "hidden" : true },
{ "id" : 19, "animation" : "TBDNHRD2.def", "x" : 0, "y" : 300, "z" : 2, "border" : "TODTR2HA.bmp", "area" : "TZDTR2HA.bmp", "hidden" : true, "builds" : 18 },
{ "id" : 21, "animation" : "TBDNEXT0.def", "x" : 131, "y" : 26 , "border" : "TODVOR1A.bmp", "area" : "TZDVOR1A.bmp" },
{ "id" : 22, "animation" : "TBDNEXT1.def", "x" : 687, "y" : 177, "border" : "TODPORTA.bmp", "area" : "TZDPORTA.bmp" },
{ "id" : 23, "animation" : "TBDNEXT2.def", "x" : 313, "y" : 298, "border" : "TODACAD.bmp", "area" : "TZDACAD.bmp" },
{ "id" : 26, "animation" : "TBDNHOLY.def", "x" : 562, "y" : 24, "z" : 1, "border" : "TODHOLY.bmp", "area" : "TZDHOLY.bmp" },
{ "id" : 30, "animation" : "TBDNDW_0.def", "x" : 0, "y" : 326, "z" : 2, "border" : "TODTRG1A.bmp", "area" : "TZDTRG1A.bmp" },
{ "id" : 31, "animation" : "TBDNDW_1.def", "x" : 0, "y" : 26, "border" : "TODHAR1.bmp", "area" : "TZDHAR1.bmp" },
{ "id" : 32, "animation" : "TBDNDW_2.def", "x" : 118, "y" : 308, "z" : 1, "border" : "TODBEH1A.bmp", "area" : "TZDBEH1A.bmp" },
{ "id" : 33, "animation" : "TBDNDW_3.def", "x" : 300, "y" : 29, "z" : -1, "border" : "TODMED1.bmp", "area" : "TZDMED1.bmp" },
{ "id" : 34, "animation" : "TBDNDW_4.def", "x" : 551, "y" : 186, "z" : 1, "border" : "TODMIN1.bmp", "area" : "TZDMIN1.bmp" },
{ "id" : 35, "animation" : "TBDNDW_5.def", "x" : 270, "y" : 253, "z" : -1, "border" : "TODMAN1.bmp", "area" : "TZDMAN1.bmp" },
{ "id" : 36, "animation" : "TBDNDW_6.def", "x" : 550, "y" : 0, "z" : -1, "border" : "TODDRA1A.bmp", "area" : "TZDDRA1A.bmp" },
{ "id" : 37, "animation" : "TBDNUP_0.def", "x" : 0, "y" : 300, "z" : 2, "border" : "TODTRG2A.bmp", "area" : "TZDTRG2A.bmp" },
{ "id" : 38, "animation" : "TBDNUP_1.def", "x" : 0, "y" : 26, "border" : "TODHAR2.bmp", "area" : "TZDHAR2.bmp" },
{ "id" : 39, "animation" : "TBDNUP_2.def", "x" : 118, "y" : 256, "z" : 1, "border" : "TODBEH2A.bmp", "area" : "TZDBEH2A.bmp" },
{ "id" : 40, "animation" : "TBDNUP_3.def", "x" : 300, "y" : 29, "z" : -1, "border" : "TODMED2.bmp", "area" : "TZDMED2.bmp" },
{ "id" : 41, "animation" : "TBDNUP_4.def", "x" : 519, "y" : 172, "z" : 1, "border" : "TODMIN2.bmp", "area" : "TZDMIN2.bmp" },
{ "id" : 42, "animation" : "TBDNUP_5.def", "x" : 270, "y" : 253, "z" : -1, "border" : "TODMAN2.bmp", "area" : "TZDMAN2.bmp" },
{ "id" : 43, "animation" : "TBDNUP_6.def", "x" : 550, "y" : 0, "z" : -1, "border" : "TODDRA2A.bmp", "area" : "TZDDRA2A.bmp" },
],
{
"mageGuild1": { "id" : 0, "animation" : "TBDNMAGE.def", "x" : 164, "y" : 119, "z" : -1, "border" : "TODMAG1.bmp", "area" : "TZDMAG1.bmp" },
"mageGuild2": { "id" : 1, "animation" : "TBDNMAG2.def", "x" : 164, "y" : 97, "z" : -1, "border" : "TODMAG2.bmp", "area" : "TZDMAG2.bmp" },
"mageGuild3": { "id" : 2, "animation" : "TBDNMAG3.def", "x" : 164, "y" : 77, "z" : -1, "border" : "TODMAG3.bmp", "area" : "TZDMAG3.bmp" },
"mageGuild4": { "id" : 3, "animation" : "TBDNMAG4.def", "x" : 164, "y" : 61, "z" : -1, "border" : "TODMAG4.bmp", "area" : "TZDMAG4.bmp" },
"mageGuild5": { "id" : 4, "animation" : "TBDNMAG5.def", "x" : 164, "y" : 15, "z" : -1, "border" : "TODMAG5.bmp", "area" : "TZDMAG5.bmp" },
"tavern": { "id" : 5, "animation" : "TBDNTVRN.def", "x" : 211, "y" : 297, "border" : "TODTAV.bmp", "area" : "TZDTAV.bmp" },
"fort": { "id" : 7, "animation" : "TBDNCSTL.def", "x" : 363, "y" : 87, "z" : 2, "border" : "TODCAS1.bmp", "area" : "TZDCAS1.bmp" },
"citadel": { "id" : 8, "animation" : "TBDNCAS2.def", "x" : 363, "y" : 87, "z" : 2, "border" : "TODCAS2.bmp", "area" : "TZDCAS2.bmp" },
"castle": { "id" : 9, "animation" : "TBDNCAS3.def", "x" : 363, "y" : 87, "z" : 2, "border" : "TODCAS3.bmp", "area" : "TZDCAS3.bmp" },
"villageHall": { "id" : 10, "animation" : "TBDNHALL.def", "x" : 0, "y" : 234, "border" : "TODHALL1.bmp", "area" : "TZDHALL1.bmp" },
"townHall": { "id" : 11, "animation" : "TBDNHAL2.def", "x" : 0, "y" : 223, "border" : "TODHALL2.bmp", "area" : "TZDHALL2.bmp" },
"cityHall": { "id" : 12, "animation" : "TBDNHAL3.def", "x" : 0, "y" : 223, "border" : "TODHALL3.bmp", "area" : "TZDHALL3.bmp" },
"capitol": { "id" : 13, "animation" : "TBDNHAL4.def", "x" : 0, "y" : 203, "z" : -1, "border" : "TODHALL4.bmp", "area" : "TZDHALL4.bmp" },
"marketplace": { "id" : 14, "animation" : "TBDNMARK.def", "x" : 590, "y" : 318, "z" : -2, "border" : "TODMARK.bmp", "area" : "TZDMARK.bmp" },
"resourceSilo": { "id" : 15, "animation" : "TBDNSILO.def", "x" : 624, "y" : 335, "z" : 1, "border" : "TODSILO.bmp", "area" : "TZDSILO.bmp" },
"blacksmith": { "id" : 16, "animation" : "TBDNBLAK.def", "x" : 544, "y" : 248, "z" : -3, "border" : "TODSMITH.bmp", "area" : "TZDSMITH.bmp" },
"special1": { "id" : 17, "animation" : "TBDNSPEC.def", "x" : 746, "y" : 294, "z" : 1, "border" : "TODART.bmp", "area" : "TZDART.bmp" },
"horde1": { "id" : 18, "animation" : "TBDNHRD1.def", "x" : 0, "y" : 326, "z" : 2, "border" : "TODTR1HA.bmp", "area" : "TZDTR1HA.bmp", "hidden" : true },
"horde1Upgr": { "id" : 19, "animation" : "TBDNHRD2.def", "x" : 0, "y" : 300, "z" : 2, "border" : "TODTR2HA.bmp", "area" : "TZDTR2HA.bmp", "hidden" : true, "builds" : 18 },
"special2": { "id" : 21, "animation" : "TBDNEXT0.def", "x" : 131, "y" : 26 , "border" : "TODVOR1A.bmp", "area" : "TZDVOR1A.bmp" },
"special3": { "id" : 22, "animation" : "TBDNEXT1.def", "x" : 687, "y" : 177, "border" : "TODPORTA.bmp", "area" : "TZDPORTA.bmp" },
"special4": { "id" : 23, "animation" : "TBDNEXT2.def", "x" : 313, "y" : 298, "border" : "TODACAD.bmp", "area" : "TZDACAD.bmp" },
"grail": { "id" : 26, "animation" : "TBDNHOLY.def", "x" : 562, "y" : 24, "z" : 1, "border" : "TODHOLY.bmp", "area" : "TZDHOLY.bmp" },
"dwellingLvl1": { "id" : 30, "animation" : "TBDNDW_0.def", "x" : 0, "y" : 326, "z" : 2, "border" : "TODTRG1A.bmp", "area" : "TZDTRG1A.bmp" },
"dwellingLvl2": { "id" : 31, "animation" : "TBDNDW_1.def", "x" : 0, "y" : 26, "border" : "TODHAR1.bmp", "area" : "TZDHAR1.bmp" },
"dwellingLvl3": { "id" : 32, "animation" : "TBDNDW_2.def", "x" : 118, "y" : 308, "z" : 1, "border" : "TODBEH1A.bmp", "area" : "TZDBEH1A.bmp" },
"dwellingLvl4": { "id" : 33, "animation" : "TBDNDW_3.def", "x" : 300, "y" : 29, "z" : -1, "border" : "TODMED1.bmp", "area" : "TZDMED1.bmp" },
"dwellingLvl5": { "id" : 34, "animation" : "TBDNDW_4.def", "x" : 551, "y" : 186, "z" : 1, "border" : "TODMIN1.bmp", "area" : "TZDMIN1.bmp" },
"dwellingLvl6": { "id" : 35, "animation" : "TBDNDW_5.def", "x" : 270, "y" : 253, "z" : -1, "border" : "TODMAN1.bmp", "area" : "TZDMAN1.bmp" },
"dwellingLvl7": { "id" : 36, "animation" : "TBDNDW_6.def", "x" : 550, "y" : 0, "z" : -1, "border" : "TODDRA1A.bmp", "area" : "TZDDRA1A.bmp" },
"dwellingUpLvl1": { "id" : 37, "animation" : "TBDNUP_0.def", "x" : 0, "y" : 300, "z" : 2, "border" : "TODTRG2A.bmp", "area" : "TZDTRG2A.bmp" },
"dwellingUpLvl2": { "id" : 38, "animation" : "TBDNUP_1.def", "x" : 0, "y" : 26, "border" : "TODHAR2.bmp", "area" : "TZDHAR2.bmp" },
"dwellingUpLvl3": { "id" : 39, "animation" : "TBDNUP_2.def", "x" : 118, "y" : 256, "z" : 1, "border" : "TODBEH2A.bmp", "area" : "TZDBEH2A.bmp" },
"dwellingUpLvl4": { "id" : 40, "animation" : "TBDNUP_3.def", "x" : 300, "y" : 29, "z" : -1, "border" : "TODMED2.bmp", "area" : "TZDMED2.bmp" },
"dwellingUpLvl5": { "id" : 41, "animation" : "TBDNUP_4.def", "x" : 519, "y" : 172, "z" : 1, "border" : "TODMIN2.bmp", "area" : "TZDMIN2.bmp" },
"dwellingUpLvl6": { "id" : 42, "animation" : "TBDNUP_5.def", "x" : 270, "y" : 253, "z" : -1, "border" : "TODMAN2.bmp", "area" : "TZDMAN2.bmp" },
"dwellingUpLvl7": { "id" : 43, "animation" : "TBDNUP_6.def", "x" : 550, "y" : 0, "z" : -1, "border" : "TODDRA2A.bmp", "area" : "TZDDRA2A.bmp" }
},
"icons" :
{
"village" : {"normal" : 28, "built" : 29 },
@ -149,48 +149,50 @@
"moatDamage" : 90,
"buildings" :
[
{ "id" : 0 },
{ "id" : 1, "upgrades" : 0 },
{ "id" : 2, "upgrades" : 1 },
{ "id" : 3, "upgrades" : 2 },
{ "id" : 4, "upgrades" : 3 },
{ "id" : 5 },
{ "id" : 7 },
{ "id" : 8, "upgrades" : 7 },
{ "id" : 9, "upgrades" : 8 },
{ "id" : 10, "mode" : "auto" },
{ "id" : 11, "upgrades" : 10, "requires" : [ 5 ] },
{ "id" : 12, "upgrades" : 11, "requires" : [ 0, 14, 16 ] },
{ "id" : 13, "upgrades" : 12, "requires" : [ 9 ] },
{ "id" : 14 },
{ "id" : 15, "requires" : [ 14 ] },
{ "id" : 16 },
{ "id" : 17, "requires" : [ 14 ] },
{ "id" : 18, "upgrades" : 30 },
{ "id" : 19, "upgrades" : 37, "requires" : [ 18 ], "mode" : "auto" },
{ "id" : 21, "requires" : [ 0 ] },
{ "id" : 22 },
{ "id" : 23 },
{ "id" : 26, "mode" : "grail"},
{ "id" : 27, "requires" : [ 11 ], "mode" : "auto" },
{ "id" : 28, "requires" : [ 12 ], "mode" : "auto" },
{ "id" : 29, "requires" : [ 13 ], "mode" : "auto" },
{ "id" : 30, "requires" : [ 7 ] },
{ "id" : 31, "requires" : [ 30 ] },
{ "id" : 32, "requires" : [ 30 ] },
{ "id" : 33, "requires" : [ 31, 32 ] },
{ "id" : 34, "requires" : [ 33 ] },
{ "id" : 35, "requires" : [ 33 ] },
{ "id" : 36, "requires" : [ 1, 34, 35 ] },
{ "id" : 37, "upgrades" : 30 },
{ "id" : 38, "upgrades" : 31 },
{ "id" : 39, "upgrades" : 32 },
{ "id" : 40, "upgrades" : 33 },
{ "id" : 41, "upgrades" : 34 },
{ "id" : 42, "upgrades" : 35 },
{ "id" : 43, "upgrades" : 36, "requires" : [ 2 ] }
],
{
"mageGuild1": { "id" : 0 },
"mageGuild2": { "id" : 1, "upgrades" : 0 },
"mageGuild3": { "id" : 2, "upgrades" : 1 },
"mageGuild4": { "id" : 3, "upgrades" : 2 },
"mageGuild5": { "id" : 4, "upgrades" : 3 },
"tavern": { "id" : 5 },
"fort": { "id" : 7 },
"citadel": { "id" : 8, "upgrades" : 7 },
"castle": { "id" : 9, "upgrades" : 8 },
"villageHall": { "id" : 10, "mode" : "auto" },
"townHall": { "id" : 11, "upgrades" : 10, "requires" : [ 5 ] },
"cityHall": { "id" : 12, "upgrades" : 11, "requires" : [ 0, 14, 16 ] },
"capitol": { "id" : 13, "upgrades" : 12, "requires" : [ 9 ] },
"marketplace": { "id" : 14 },
"resourceSilo": { "id" : 15, "requires" : [ 14 ] },
"blacksmith": { "id" : 16 },
"special1": { "id" : 17, "requires" : [ 14 ] },
"horde1": { "id" : 18, "upgrades" : 30 },
"horde1Upgr": { "id" : 19, "upgrades" : 37, "requires" : [ 18 ], "mode" : "auto" },
"special2": { "id" : 21, "requires" : [ 0 ] },
"special3": { "id" : 22 },
"special4": { "id" : 23 },
"grail": { "id" : 26, "mode" : "grail"},
"dwellingLvl1": { "id" : 30, "requires" : [ 7 ] },
"dwellingLvl2": { "id" : 31, "requires" : [ 30 ] },
"dwellingLvl3": { "id" : 32, "requires" : [ 30 ] },
"dwellingLvl4": { "id" : 33, "requires" : [ 31, 32 ] },
"dwellingLvl5": { "id" : 34, "requires" : [ 33 ] },
"dwellingLvl6": { "id" : 35, "requires" : [ 33 ] },
"dwellingLvl7": { "id" : 36, "requires" : [ 1, 34, 35 ] },
"dwellingUpLvl1": { "id" : 37, "upgrades" : 30 },
"dwellingUpLvl2": { "id" : 38, "upgrades" : 31 },
"dwellingUpLvl3": { "id" : 39, "upgrades" : 32 },
"dwellingUpLvl4": { "id" : 40, "upgrades" : 33 },
"dwellingUpLvl5": { "id" : 41, "upgrades" : 34 },
"dwellingUpLvl6": { "id" : 42, "upgrades" : 35 },
"dwellingUpLvl7": { "id" : 43, "upgrades" : 36, "requires" : [ 2 ] },
"horde2" : null,
"horde2Upgr" : null,
"ship" : null,
"shipyard" : null
},
"siege" :
{

View File

@ -74,46 +74,46 @@
"capitol" : "AVCFORZ0.DEF"
},
"structures" :
[
{ "animation" : "TBFREXT2.def", "x" : 372, "y" : 227 },
{ "id" : 0, "animation" : "TBFRMAGE.def", "x" : 0, "y" : 200, "z" : -1, "border" : "TOFMAG1A.bmp", "area" : "TZFMAG1A.bmp" },
{ "id" : 1, "animation" : "TBFRMAG2.def", "x" : 0, "y" : 177, "z" : -1, "border" : "TOFMAG2A.bmp", "area" : "TZFMAG2A.bmp" },
{ "id" : 2, "animation" : "TBFRMAG3.def", "x" : 0, "y" : 135, "z" : -1, "border" : "TOFMAG3A.bmp", "area" : "TZFMAG3A.bmp" },
{ "id" : 5, "animation" : "TBFRTVRN.def", "x" : 634, "y" : 219, "z" : 3, "border" : "TOFTAVA.bmp", "area" : "TZFTAVA.bmp" },
{ "id" : 6, "animation" : "TBFRDOCK.def", "x" : 197, "y" : 294, "border" : "TOFDCK2.bmp", "area" : "TZFDCK2.bmp" },
{ "id" : 7, "animation" : "TBFRCSTL.def", "x" : 368, "y" : 118, "z" : -1, "border" : "TOFCAS1.bmp", "area" : "TZFCAS1.bmp" },
{ "id" : 8, "animation" : "TBFRCAS2.def", "x" : 368, "y" : 98, "z" : -1, "border" : "TOFCAS2.bmp", "area" : "TZFCAS2.bmp" },
{ "id" : 9, "animation" : "TBFRCAS3.def", "x" : 368, "y" : 55, "z" : -1, "border" : "TOFCAS3.bmp", "area" : "TZFCAS3.bmp" },
{ "id" : 10, "animation" : "TBFRHALL.def", "x" : 166, "y" : 128, "z" : 1, "border" : "TOFHAL1.bmp", "area" : "TZFHAL1.bmp" },
{ "id" : 11, "animation" : "TBFRHAL2.def", "x" : 166, "y" : 97, "z" : 1, "border" : "TOFHAL2.bmp", "area" : "TZFHAL2.bmp" },
{ "id" : 12, "animation" : "TBFRHAL3.def", "x" : 166, "y" : 51, "z" : 1, "border" : "TOFHAL3.bmp", "area" : "TZFHAL3.bmp" },
{ "id" : 13, "animation" : "TBFRHAL4.def", "x" : 166, "y" : 2, "z" : 1, "border" : "TOFHAL4.bmp", "area" : "TZFHAL4.bmp" },
{ "id" : 14, "animation" : "TBFRMARK.def", "x" : 382, "y" : 219, "z" : 4, "border" : "TOFMRKAA.bmp", "area" : "TZFMRKAA.bmp" },
{ "id" : 15, "animation" : "TBFRSILO.def", "x" : 448, "y" : 210, "z" : 2, "border" : "TOFMRK2A.bmp", "area" : "TZFMRK2A.bmp" },
{ "id" : 16, "animation" : "TBFRBLAK.def", "x" : 360, "y" : 160, "border" : "TOFAIDA.bmp", "area" : "TZFAIDA.bmp" },
{ "id" : 17, "animation" : "TBFRSPEC.def", "x" : 703, "y" : 36, "border" : "TOFCAGE.bmp", "area" : "TZFCAGE.bmp" },
{ "id" : 18, "animation" : "TBFRHRD1.def", "x" : 641, "y" : 121, "z" : 1, "border" : "TOFGNL1H.bmp", "area" : "TZFGNL1H.bmp", "hidden" : true },
{ "id" : 19, "animation" : "TBFRHRD2.def", "x" : 641, "y" : 68, "z" : 1, "border" : "TOFGNL2H.bmp", "area" : "TZFGNL2H.bmp", "hidden" : true, "builds" : 18 },
{ "id" : 20, "animation" : "TBFRBOAT.def", "x" : 197, "y" : 294, "z" : 1, "border" : "TOFDCK1.bmp", "area" : "TZFDCK1.bmp", "hidden" : true },
{ "id" : 21, "animation" : "TBFREXT0.def", "x" : 341, "y" : 174, "border" : "TOFCASD.bmp", "area" : "TZFCASD.bmp" },
{ "id" : 22, "animation" : "TBFREXT1.def", "x" : 349, "y" : 79, "z" : -2, "border" : "TOFCASA.bmp", "area" : "TZFCASA.bmp" },
{ "id" : 26, "animation" : "TBFRHOLY.def", "x" : 468, "y" : 260, "z" : 5, "border" : "TOFHLYAA.bmp", "area" : "TZFHLYAA.bmp" },
{ "id" : 29, "animation" : "TBFRWTRW.def", "x" : 320, "y" : 141 },
{ "id" : 30, "animation" : "TBFRDW_0.def", "x" : 641, "y" : 168, "z" : 1, "border" : "TOFGNL1.bmp", "area" : "TZFGNL1.bmp" },
{ "id" : 31, "animation" : "TBFRDW_1.def", "x" : 141, "y" : 178, "border" : "TOFLIZ1.bmp", "area" : "TZFLIZ1.bmp" },
{ "id" : 32, "animation" : "TBFRDW_3.def", "x" : 192, "y" : 85, "border" : "TOFFLY1A.bmp", "area" : "TZFFLY1A.bmp" },
{ "id" : 33, "animation" : "TBFRDW_4.def", "x" : 0, "y" : 292, "border" : "TOFBAS1.bmp", "area" : "TZFBAS1.bmp" },
{ "id" : 34, "animation" : "TBFRDW_2.def", "x" : 15, "y" : 127, "z" : -2, "border" : "TOFGOR1.bmp", "area" : "TZFGOR1.bmp" },
{ "id" : 35, "animation" : "TBFRDW_5.def", "x" : 0, "y" : 4, "border" : "TOFWYV1.bmp", "area" : "TZFWYV1.bmp" },
{ "id" : 36, "animation" : "TBFRDW_6.def", "x" : 612, "y" : 291, "z" : 5, "border" : "TOFHYD1A.bmp", "area" : "TZFHYD1A.bmp" },
{ "id" : 37, "animation" : "TBFRUP_0.def", "x" : 641, "y" : 107, "z" : 1, "border" : "TOFGNL2.bmp", "area" : "TZFGNL2.bmp" },
{ "id" : 38, "animation" : "TBFRUP_1.def", "x" : 125, "y" : 163, "border" : "TOFLIZ2.bmp", "area" : "TZFLIZ2.bmp" },
{ "id" : 39, "animation" : "TBFRUP_3.def", "x" : 159, "y" : 19, "border" : "TOFFLY2A.bmp", "area" : "TZFFLY2A.bmp" },
{ "id" : 40, "animation" : "TBFRUP_4.def", "x" : 0, "y" : 257, "border" : "TOFBAS2.bmp", "area" : "TZFBAS2.bmp" },
{ "id" : 41, "animation" : "TBFRUP_2.def", "x" : 15, "y" : 69, "z" : -2, "border" : "TOFGOR2.bmp", "area" : "TZFGOR2.bmp" },
{ "id" : 42, "animation" : "TBFRUP_5.def", "x" : 0, "y" : 4, "border" : "TOFWYV2.bmp", "area" : "TZFWYV2.bmp" },
{ "id" : 43, "animation" : "TBFRUP_6.def", "x" : 587, "y" : 263, "z" : 5, "border" : "TOFHYD2A.bmp", "area" : "TZFHYD2A.bmp" }
],
{
"extraAnimation": { "animation" : "TBFREXT2.def", "x" : 372, "y" : 227 },
"mageGuild1": { "id" : 0, "animation" : "TBFRMAGE.def", "x" : 0, "y" : 200, "z" : -1, "border" : "TOFMAG1A.bmp", "area" : "TZFMAG1A.bmp" },
"mageGuild2": { "id" : 1, "animation" : "TBFRMAG2.def", "x" : 0, "y" : 177, "z" : -1, "border" : "TOFMAG2A.bmp", "area" : "TZFMAG2A.bmp" },
"mageGuild3": { "id" : 2, "animation" : "TBFRMAG3.def", "x" : 0, "y" : 135, "z" : -1, "border" : "TOFMAG3A.bmp", "area" : "TZFMAG3A.bmp" },
"tavern": { "id" : 5, "animation" : "TBFRTVRN.def", "x" : 634, "y" : 219, "z" : 3, "border" : "TOFTAVA.bmp", "area" : "TZFTAVA.bmp" },
"shipyard": { "id" : 6, "animation" : "TBFRDOCK.def", "x" : 197, "y" : 294, "border" : "TOFDCK2.bmp", "area" : "TZFDCK2.bmp" },
"fort": { "id" : 7, "animation" : "TBFRCSTL.def", "x" : 368, "y" : 118, "z" : -1, "border" : "TOFCAS1.bmp", "area" : "TZFCAS1.bmp" },
"citadel": { "id" : 8, "animation" : "TBFRCAS2.def", "x" : 368, "y" : 98, "z" : -1, "border" : "TOFCAS2.bmp", "area" : "TZFCAS2.bmp" },
"castle": { "id" : 9, "animation" : "TBFRCAS3.def", "x" : 368, "y" : 55, "z" : -1, "border" : "TOFCAS3.bmp", "area" : "TZFCAS3.bmp" },
"villageHall": { "id" : 10, "animation" : "TBFRHALL.def", "x" : 166, "y" : 128, "z" : 1, "border" : "TOFHAL1.bmp", "area" : "TZFHAL1.bmp" },
"townHall": { "id" : 11, "animation" : "TBFRHAL2.def", "x" : 166, "y" : 97, "z" : 1, "border" : "TOFHAL2.bmp", "area" : "TZFHAL2.bmp" },
"cityHall": { "id" : 12, "animation" : "TBFRHAL3.def", "x" : 166, "y" : 51, "z" : 1, "border" : "TOFHAL3.bmp", "area" : "TZFHAL3.bmp" },
"capitol": { "id" : 13, "animation" : "TBFRHAL4.def", "x" : 166, "y" : 2, "z" : 1, "border" : "TOFHAL4.bmp", "area" : "TZFHAL4.bmp" },
"marketplace": { "id" : 14, "animation" : "TBFRMARK.def", "x" : 382, "y" : 219, "z" : 4, "border" : "TOFMRKAA.bmp", "area" : "TZFMRKAA.bmp" },
"resourceSilo": { "id" : 15, "animation" : "TBFRSILO.def", "x" : 448, "y" : 210, "z" : 2, "border" : "TOFMRK2A.bmp", "area" : "TZFMRK2A.bmp" },
"blacksmith": { "id" : 16, "animation" : "TBFRBLAK.def", "x" : 360, "y" : 160, "border" : "TOFAIDA.bmp", "area" : "TZFAIDA.bmp" },
"special1": { "id" : 17, "animation" : "TBFRSPEC.def", "x" : 703, "y" : 36, "border" : "TOFCAGE.bmp", "area" : "TZFCAGE.bmp" },
"horde1": { "id" : 18, "animation" : "TBFRHRD1.def", "x" : 641, "y" : 121, "z" : 1, "border" : "TOFGNL1H.bmp", "area" : "TZFGNL1H.bmp", "hidden" : true },
"horde1Upgr": { "id" : 19, "animation" : "TBFRHRD2.def", "x" : 641, "y" : 68, "z" : 1, "border" : "TOFGNL2H.bmp", "area" : "TZFGNL2H.bmp", "hidden" : true, "builds" : 18 },
"ship": { "id" : 20, "animation" : "TBFRBOAT.def", "x" : 197, "y" : 294, "z" : 1, "border" : "TOFDCK1.bmp", "area" : "TZFDCK1.bmp", "hidden" : true },
"special2": { "id" : 21, "animation" : "TBFREXT0.def", "x" : 341, "y" : 174, "border" : "TOFCASD.bmp", "area" : "TZFCASD.bmp" },
"special3": { "id" : 22, "animation" : "TBFREXT1.def", "x" : 349, "y" : 79, "z" : -2, "border" : "TOFCASA.bmp", "area" : "TZFCASA.bmp" },
"grail": { "id" : 26, "animation" : "TBFRHOLY.def", "x" : 468, "y" : 260, "z" : 5, "border" : "TOFHLYAA.bmp", "area" : "TZFHLYAA.bmp" },
"extraCapitol": { "id" : 29, "animation" : "TBFRWTRW.def", "x" : 320, "y" : 141 },
"dwellingLvl1": { "id" : 30, "animation" : "TBFRDW_0.def", "x" : 641, "y" : 168, "z" : 1, "border" : "TOFGNL1.bmp", "area" : "TZFGNL1.bmp" },
"dwellingLvl2": { "id" : 31, "animation" : "TBFRDW_1.def", "x" : 141, "y" : 178, "border" : "TOFLIZ1.bmp", "area" : "TZFLIZ1.bmp" },
"dwellingLvl3": { "id" : 32, "animation" : "TBFRDW_3.def", "x" : 192, "y" : 85, "border" : "TOFFLY1A.bmp", "area" : "TZFFLY1A.bmp" },
"dwellingLvl4": { "id" : 33, "animation" : "TBFRDW_4.def", "x" : 0, "y" : 292, "border" : "TOFBAS1.bmp", "area" : "TZFBAS1.bmp" },
"dwellingLvl5": { "id" : 34, "animation" : "TBFRDW_2.def", "x" : 15, "y" : 127, "z" : -2, "border" : "TOFGOR1.bmp", "area" : "TZFGOR1.bmp" },
"dwellingLvl6": { "id" : 35, "animation" : "TBFRDW_5.def", "x" : 0, "y" : 4, "border" : "TOFWYV1.bmp", "area" : "TZFWYV1.bmp" },
"dwellingLvl7": { "id" : 36, "animation" : "TBFRDW_6.def", "x" : 612, "y" : 291, "z" : 5, "border" : "TOFHYD1A.bmp", "area" : "TZFHYD1A.bmp" },
"dwellingUpLvl1": { "id" : 37, "animation" : "TBFRUP_0.def", "x" : 641, "y" : 107, "z" : 1, "border" : "TOFGNL2.bmp", "area" : "TZFGNL2.bmp" },
"dwellingUpLvl2": { "id" : 38, "animation" : "TBFRUP_1.def", "x" : 125, "y" : 163, "border" : "TOFLIZ2.bmp", "area" : "TZFLIZ2.bmp" },
"dwellingUpLvl3": { "id" : 39, "animation" : "TBFRUP_3.def", "x" : 159, "y" : 19, "border" : "TOFFLY2A.bmp", "area" : "TZFFLY2A.bmp" },
"dwellingUpLvl4": { "id" : 40, "animation" : "TBFRUP_4.def", "x" : 0, "y" : 257, "border" : "TOFBAS2.bmp", "area" : "TZFBAS2.bmp" },
"dwellingUpLvl5": { "id" : 41, "animation" : "TBFRUP_2.def", "x" : 15, "y" : 69, "z" : -2, "border" : "TOFGOR2.bmp", "area" : "TZFGOR2.bmp" },
"dwellingUpLvl6": { "id" : 42, "animation" : "TBFRUP_5.def", "x" : 0, "y" : 4, "border" : "TOFWYV2.bmp", "area" : "TZFWYV2.bmp" },
"dwellingUpLvl7": { "id" : 43, "animation" : "TBFRUP_6.def", "x" : 587, "y" : 263, "z" : 5, "border" : "TOFHYD2A.bmp", "area" : "TZFHYD2A.bmp" }
},
"icons" :
{
"village" : {"normal" : 32, "built" : 33 },
@ -149,49 +149,51 @@
"moatDamage" : 90,
"buildings" :
[
{ "id" : 0 },
{ "id" : 1, "upgrades" : 0 },
{ "id" : 2, "upgrades" : 1 },
{ "id" : 3, "upgrades" : 2 },
{ "id" : 4, "upgrades" : 3 },
{ "id" : 5 },
{ "id" : 6 },
{ "id" : 7 },
{ "id" : 8, "upgrades" : 7 },
{ "id" : 9, "upgrades" : 8 },
{ "id" : 10, "mode" : "auto" },
{ "id" : 11, "upgrades" : 10, "requires" : [ 5 ] },
{ "id" : 12, "upgrades" : 11, "requires" : [ 0, 14, 16 ] },
{ "id" : 13, "upgrades" : 12, "requires" : [ 9 ] },
{ "id" : 14 },
{ "id" : 15, "requires" : [ 14 ] },
{ "id" : 16 },
{ "id" : 17, "requires" : [ 11, 21 ] },
{ "id" : 18, "upgrades" : 30 },
{ "id" : 19, "upgrades" : 37, "requires" : [ 18 ], "mode" : "auto" },
{ "id" : 20, "upgrades" : 6 },
{ "id" : 21, "requires" : [ 7 ] },
{ "id" : 22, "requires" : [ 21 ] },
{ "id" : 26, "mode" : "grail"},
{ "id" : 27, "requires" : [ 11 ], "mode" : "auto" },
{ "id" : 28, "requires" : [ 12 ], "mode" : "auto" },
{ "id" : 29, "requires" : [ 13 ], "mode" : "auto" },
{ "id" : 30, "requires" : [ 7 ] },
{ "id" : 31, "requires" : [ 30 ] },
{ "id" : 32, "requires" : [ 30 ] },
{ "id" : 33, "requires" : [ 32 ] },
{ "id" : 34, "requires" : [ 31, 32 ] },
{ "id" : 35, "requires" : [ 31 ] },
{ "id" : 36, "requires" : [ 33, 35 ] },
{ "id" : 37, "upgrades" : 30, "requires" : [ 5 ] },
{ "id" : 38, "upgrades" : 31 },
{ "id" : 39, "upgrades" : 32 },
{ "id" : 40, "upgrades" : 33 },
{ "id" : 41, "upgrades" : 34, "requires" : [ 15 ] },
{ "id" : 42, "upgrades" : 35 },
{ "id" : 43, "upgrades" : 36 }
],
{
"mageGuild1": { "id" : 0 },
"mageGuild2": { "id" : 1, "upgrades" : 0 },
"mageGuild3": { "id" : 2, "upgrades" : 1 },
"tavern": { "id" : 5 },
"shipyard": { "id" : 6 },
"fort": { "id" : 7 },
"citadel": { "id" : 8, "upgrades" : 7 },
"castle": { "id" : 9, "upgrades" : 8 },
"villageHall": { "id" : 10, "mode" : "auto" },
"townHall": { "id" : 11, "upgrades" : 10, "requires" : [ 5 ] },
"cityHall": { "id" : 12, "upgrades" : 11, "requires" : [ 0, 14, 16 ] },
"capitol": { "id" : 13, "upgrades" : 12, "requires" : [ 9 ] },
"marketplace": { "id" : 14 },
"resourceSilo": { "id" : 15, "requires" : [ 14 ] },
"blacksmith": { "id" : 16 },
"special1": { "id" : 17, "requires" : [ 11, 21 ] },
"horde1": { "id" : 18, "upgrades" : 30 },
"horde1Upgr": { "id" : 19, "upgrades" : 37, "requires" : [ 18 ], "mode" : "auto" },
"ship": { "id" : 20, "upgrades" : 6 },
"special2": { "id" : 21, "requires" : [ 7 ] },
"special3": { "id" : 22, "requires" : [ 21 ] },
"grail": { "id" : 26, "mode" : "grail"},
"extraCapitol": { "id" : 29, "requires" : [ 13 ], "mode" : "auto" },
"dwellingLvl1": { "id" : 30, "requires" : [ 7 ] },
"dwellingLvl2": { "id" : 31, "requires" : [ 30 ] },
"dwellingLvl3": { "id" : 32, "requires" : [ 30 ] },
"dwellingLvl4": { "id" : 33, "requires" : [ 32 ] },
"dwellingLvl5": { "id" : 34, "requires" : [ 31, 32 ] },
"dwellingLvl6": { "id" : 35, "requires" : [ 31 ] },
"dwellingLvl7": { "id" : 36, "requires" : [ 33, 35 ] },
"dwellingUpLvl1": { "id" : 37, "upgrades" : 30, "requires" : [ 5 ] },
"dwellingUpLvl2": { "id" : 38, "upgrades" : 31 },
"dwellingUpLvl3": { "id" : 39, "upgrades" : 32 },
"dwellingUpLvl4": { "id" : 40, "upgrades" : 33 },
"dwellingUpLvl5": { "id" : 41, "upgrades" : 34, "requires" : [ 15 ] },
"dwellingUpLvl6": { "id" : 42, "upgrades" : 35 },
"dwellingUpLvl7": { "id" : 43, "upgrades" : 36 },
"horde2" : null,
"horde2Upgr" : null,
"mageGuild4" : null,
"mageGuild5" : null,
"special4" : null
},
"siege" :
{

View File

@ -74,46 +74,46 @@
"capitol" : "AVCINFZ0.DEF"
},
"structures" :
[
{ "id" : 0, "animation" : "TBINMAGE.def", "x" : 667, "y" : 127, "border" : "TOIMAG1A.bmp", "area" : "TZIMAG1A.bmp" },
{ "id" : 1, "animation" : "TBINMAG2.def", "x" : 667, "y" : 101, "border" : "TOIMAG2A.bmp", "area" : "TZIMAG2A.bmp" },
{ "id" : 2, "animation" : "TBINMAG3.def", "x" : 667, "y" : 83, "border" : "TOIMAG3A.bmp", "area" : "TZIMAG3A.bmp" },
{ "id" : 3, "animation" : "TBINMAG4.def", "x" : 667, "y" : 56, "border" : "TOIMAG4A.bmp", "area" : "TZIMAG4A.bmp" },
{ "id" : 4, "animation" : "TBINMAG5.def", "x" : 667, "y" : 35, "border" : "TOIMAG5A.bmp", "area" : "TZIMAG5A.bmp" },
{ "id" : 5, "animation" : "TBINTVRN.def", "x" : 105, "y" : 219, "z" : 1, "border" : "TOITAV.bmp", "area" : "TZITAV.bmp" },
{ "id" : 7, "animation" : "TBINCSTL.def", "x" : 222, "y" : 44, "border" : "TOICAS2A.bmp", "area" : "TZICAS2A.bmp" },
{ "id" : 8, "animation" : "TBINCAS2.def", "x" : 222, "y" : 44, "border" : "TOICAS1A.bmp", "area" : "TZICAS1A.bmp" },
{ "id" : 9, "animation" : "TBINCAS3.def", "x" : 222, "y" : 18, "border" : "TOICAS3A.bmp", "area" : "TZICAS3A.bmp" },
{ "id" : 10, "animation" : "TBINHALL.def", "x" : 0, "y" : 174, "border" : "TOIHAL1.bmp", "area" : "TZIHAL1.bmp" },
{ "id" : 11, "animation" : "TBINHAL2.def", "x" : 0, "y" : 174, "border" : "TOIHAL2.bmp", "area" : "TZIHAL2.bmp" },
{ "id" : 12, "animation" : "TBINHAL3.def", "x" : 0, "y" : 174, "border" : "TOIHAL3.bmp", "area" : "TZIHAL3.bmp" },
{ "id" : 13, "animation" : "TBINHAL4.def", "x" : 0, "y" : 131, "border" : "TOIHAL4.bmp", "area" : "TZIHAL4.bmp" },
{ "id" : 14, "animation" : "TBINMARK.def", "x" : 511, "y" : 301, "z" : 4, "border" : "TOIMAR1.bmp", "area" : "TZIMAR1.bmp" },
{ "id" : 15, "animation" : "TBINSILO.def", "x" : 497, "y" : 337, "z" : 5, "border" : "TOIMAR2.bmp", "area" : "TZIMAR2.bmp" },
{ "id" : 16, "animation" : "TBINBLAK.def", "x" : 684, "y" : 253, "z" : 1, "border" : "TOIBLKA.bmp", "area" : "TZIBLKA.bmp" },
{ "id" : 18, "animation" : "TBINHRD1.def", "x" : 614, "y" : 256, "border" : "TOIMP1HA.bmp", "area" : "TZIMP1HA.bmp", "hidden" : true },
{ "id" : 19, "animation" : "TBINHRD2.def", "x" : 614, "y" : 221, "border" : "TOIMP2HA.bmp", "area" : "TZIMP2HA.bmp", "hidden" : true, "builds" : 18 },
{ "id" : 21, "animation" : "TBINEXT0.def", "x" : 297, "y" : 0, "z" : -1, "border" : "TOICAB1A.bmp", "area" : "TZICAB1A.bmp" },
{ "id" : 22, "animation" : "TBINEXT1.def", "x" : 227, "y" : 174, "z" : 2, "border" : "TOICASGA.bmp", "area" : "TZICASGA.bmp" },
{ "id" : 23, "animation" : "TBINEXT2.def", "x" : 593, "y" : 104, "border" : "TOIPAIN.bmp", "area" : "TZIPAIN.bmp" },
{ "id" : 24, "animation" : "TBINHRD3.def", "x" : 10, "y" : 301, "border" : "TOIHND1H.bmp", "area" : "TZIHND1H.bmp", "hidden" : true },
{ "id" : 25, "animation" : "TBINHRD4.def", "x" : 9, "y" : 273, "border" : "TOIHND2H.bmp", "area" : "TZIHND2H.bmp", "hidden" : true, "builds" : 24 },
{ "id" : 26, "animation" : "TBINHOLY.def", "x" : 24, "y" : 10, "z" : -1, "border" : "TOIHOLY.bmp", "area" : "TZIHOLY.bmp" },
{ "id" : 30, "animation" : "TBINDW_0.def", "x" : 614, "y" : 256, "border" : "TOIMP1A.bmp", "area" : "TZIMP1A.bmp" },
{ "id" : 31, "animation" : "TBINDW_1.def", "x" : 187, "y" : 248, "z" : 4, "border" : "TOIGOG1A.bmp", "area" : "TZIGOG1A.bmp" },
{ "id" : 32, "animation" : "TBINDW_2.def", "x" : 9, "y" : 325, "border" : "TOIHND1.bmp", "area" : "TZIHND1.bmp" },
{ "id" : 33, "animation" : "TBINDW_3.def", "x" : 414, "y" : 204, "z" : 2, "border" : "TOIDMN1.bmp", "area" : "TZIDMN1.bmp" },
{ "id" : 34, "animation" : "TBINDW_4.def", "x" : 359, "y" : 296, "z" : 3, "border" : "TOIPIT1.bmp", "area" : "TZIPIT1.bmp" },
{ "id" : 35, "animation" : "TBINDW_5.def", "x" : 220, "y" : 350, "z" : 5, "border" : "TOIEFR1.bmp", "area" : "TZIEFR1.bmp" },
{ "id" : 36, "animation" : "TBINDW_6.def", "x" : 420, "y" : 153, "z" : -1, "border" : "TOIDVL1.bmp", "area" : "TZIDVL1.bmp" },
{ "id" : 37, "animation" : "TBINUP_0.def", "x" : 614, "y" : 221, "border" : "TOIMP2A.bmp", "area" : "TZIMP2A.bmp" },
{ "id" : 38, "animation" : "TBINUP_1.def", "x" : 187, "y" : 212, "z" : 4, "border" : "TOIGOG2A.bmp", "area" : "TZIGOG2A.bmp" },
{ "id" : 39, "animation" : "TBINUP_2.def", "x" : 9, "y" : 273, "border" : "TOIHND2.bmp", "area" : "TZIHND2.bmp" },
{ "id" : 40, "animation" : "TBINUP_3.def", "x" : 412, "y" : 197, "z" : 2, "border" : "TOIDMN2.bmp", "area" : "TZIDMN2.bmp" },
{ "id" : 41, "animation" : "TBINUP_4.def", "x" : 359, "y" : 244, "z" : 3, "border" : "TOIPIT2.bmp", "area" : "TZIPIT2.bmp" },
{ "id" : 42, "animation" : "TBINUP_5.def", "x" : 220, "y" : 282, "z" : 5, "border" : "TOIEFR2.bmp", "area" : "TZIEFR2.bmp" },
{ "id" : 43, "animation" : "TBINUP_6.def", "x" : 420, "y" : 105, "z" : -1, "border" : "TOIDVL2.bmp", "area" : "TZIDVL2.bmp" }
],
{
"mageGuild1": { "id" : 0, "animation" : "TBINMAGE.def", "x" : 667, "y" : 127, "border" : "TOIMAG1A.bmp", "area" : "TZIMAG1A.bmp" },
"mageGuild2": { "id" : 1, "animation" : "TBINMAG2.def", "x" : 667, "y" : 101, "border" : "TOIMAG2A.bmp", "area" : "TZIMAG2A.bmp" },
"mageGuild3": { "id" : 2, "animation" : "TBINMAG3.def", "x" : 667, "y" : 83, "border" : "TOIMAG3A.bmp", "area" : "TZIMAG3A.bmp" },
"mageGuild4": { "id" : 3, "animation" : "TBINMAG4.def", "x" : 667, "y" : 56, "border" : "TOIMAG4A.bmp", "area" : "TZIMAG4A.bmp" },
"mageGuild5": { "id" : 4, "animation" : "TBINMAG5.def", "x" : 667, "y" : 35, "border" : "TOIMAG5A.bmp", "area" : "TZIMAG5A.bmp" },
"tavern": { "id" : 5, "animation" : "TBINTVRN.def", "x" : 105, "y" : 219, "z" : 1, "border" : "TOITAV.bmp", "area" : "TZITAV.bmp" },
"fort": { "id" : 7, "animation" : "TBINCSTL.def", "x" : 222, "y" : 44, "border" : "TOICAS2A.bmp", "area" : "TZICAS2A.bmp" },
"citadel": { "id" : 8, "animation" : "TBINCAS2.def", "x" : 222, "y" : 44, "border" : "TOICAS1A.bmp", "area" : "TZICAS1A.bmp" },
"castle": { "id" : 9, "animation" : "TBINCAS3.def", "x" : 222, "y" : 18, "border" : "TOICAS3A.bmp", "area" : "TZICAS3A.bmp" },
"villageHall": { "id" : 10, "animation" : "TBINHALL.def", "x" : 0, "y" : 174, "border" : "TOIHAL1.bmp", "area" : "TZIHAL1.bmp" },
"townHall": { "id" : 11, "animation" : "TBINHAL2.def", "x" : 0, "y" : 174, "border" : "TOIHAL2.bmp", "area" : "TZIHAL2.bmp" },
"cityHall": { "id" : 12, "animation" : "TBINHAL3.def", "x" : 0, "y" : 174, "border" : "TOIHAL3.bmp", "area" : "TZIHAL3.bmp" },
"capitol": { "id" : 13, "animation" : "TBINHAL4.def", "x" : 0, "y" : 131, "border" : "TOIHAL4.bmp", "area" : "TZIHAL4.bmp" },
"marketplace": { "id" : 14, "animation" : "TBINMARK.def", "x" : 511, "y" : 301, "z" : 4, "border" : "TOIMAR1.bmp", "area" : "TZIMAR1.bmp" },
"resourceSilo": { "id" : 15, "animation" : "TBINSILO.def", "x" : 497, "y" : 337, "z" : 5, "border" : "TOIMAR2.bmp", "area" : "TZIMAR2.bmp" },
"blacksmith": { "id" : 16, "animation" : "TBINBLAK.def", "x" : 684, "y" : 253, "z" : 1, "border" : "TOIBLKA.bmp", "area" : "TZIBLKA.bmp" },
"horde1": { "id" : 18, "animation" : "TBINHRD1.def", "x" : 614, "y" : 256, "border" : "TOIMP1HA.bmp", "area" : "TZIMP1HA.bmp", "hidden" : true },
"horde1Upgr": { "id" : 19, "animation" : "TBINHRD2.def", "x" : 614, "y" : 221, "border" : "TOIMP2HA.bmp", "area" : "TZIMP2HA.bmp", "hidden" : true, "builds" : 18 },
"special2": { "id" : 21, "animation" : "TBINEXT0.def", "x" : 297, "y" : 0, "z" : -1, "border" : "TOICAB1A.bmp", "area" : "TZICAB1A.bmp" },
"special3": { "id" : 22, "animation" : "TBINEXT1.def", "x" : 227, "y" : 174, "z" : 2, "border" : "TOICASGA.bmp", "area" : "TZICASGA.bmp" },
"special4": { "id" : 23, "animation" : "TBINEXT2.def", "x" : 593, "y" : 104, "border" : "TOIPAIN.bmp", "area" : "TZIPAIN.bmp" },
"horde2": { "id" : 24, "animation" : "TBINHRD3.def", "x" : 10, "y" : 301, "border" : "TOIHND1H.bmp", "area" : "TZIHND1H.bmp", "hidden" : true },
"horde2Upgr": { "id" : 25, "animation" : "TBINHRD4.def", "x" : 9, "y" : 273, "border" : "TOIHND2H.bmp", "area" : "TZIHND2H.bmp", "hidden" : true, "builds" : 24 },
"grail": { "id" : 26, "animation" : "TBINHOLY.def", "x" : 24, "y" : 10, "z" : -1, "border" : "TOIHOLY.bmp", "area" : "TZIHOLY.bmp" },
"dwellingLvl1": { "id" : 30, "animation" : "TBINDW_0.def", "x" : 614, "y" : 256, "border" : "TOIMP1A.bmp", "area" : "TZIMP1A.bmp" },
"dwellingLvl2": { "id" : 31, "animation" : "TBINDW_1.def", "x" : 187, "y" : 248, "z" : 4, "border" : "TOIGOG1A.bmp", "area" : "TZIGOG1A.bmp" },
"dwellingLvl3": { "id" : 32, "animation" : "TBINDW_2.def", "x" : 9, "y" : 325, "border" : "TOIHND1.bmp", "area" : "TZIHND1.bmp" },
"dwellingLvl4": { "id" : 33, "animation" : "TBINDW_3.def", "x" : 414, "y" : 204, "z" : 2, "border" : "TOIDMN1.bmp", "area" : "TZIDMN1.bmp" },
"dwellingLvl5": { "id" : 34, "animation" : "TBINDW_4.def", "x" : 359, "y" : 296, "z" : 3, "border" : "TOIPIT1.bmp", "area" : "TZIPIT1.bmp" },
"dwellingLvl6": { "id" : 35, "animation" : "TBINDW_5.def", "x" : 220, "y" : 350, "z" : 5, "border" : "TOIEFR1.bmp", "area" : "TZIEFR1.bmp" },
"dwellingLvl7": { "id" : 36, "animation" : "TBINDW_6.def", "x" : 420, "y" : 153, "z" : -1, "border" : "TOIDVL1.bmp", "area" : "TZIDVL1.bmp" },
"dwellingUpLvl1": { "id" : 37, "animation" : "TBINUP_0.def", "x" : 614, "y" : 221, "border" : "TOIMP2A.bmp", "area" : "TZIMP2A.bmp" },
"dwellingUpLvl2": { "id" : 38, "animation" : "TBINUP_1.def", "x" : 187, "y" : 212, "z" : 4, "border" : "TOIGOG2A.bmp", "area" : "TZIGOG2A.bmp" },
"dwellingUpLvl3": { "id" : 39, "animation" : "TBINUP_2.def", "x" : 9, "y" : 273, "border" : "TOIHND2.bmp", "area" : "TZIHND2.bmp" },
"dwellingUpLvl4": { "id" : 40, "animation" : "TBINUP_3.def", "x" : 412, "y" : 197, "z" : 2, "border" : "TOIDMN2.bmp", "area" : "TZIDMN2.bmp" },
"dwellingUpLvl5": { "id" : 41, "animation" : "TBINUP_4.def", "x" : 359, "y" : 244, "z" : 3, "border" : "TOIPIT2.bmp", "area" : "TZIPIT2.bmp" },
"dwellingUpLvl6": { "id" : 42, "animation" : "TBINUP_5.def", "x" : 220, "y" : 282, "z" : 5, "border" : "TOIEFR2.bmp", "area" : "TZIEFR2.bmp" },
"dwellingUpLvl7": { "id" : 43, "animation" : "TBINUP_6.def", "x" : 420, "y" : 105, "z" : -1, "border" : "TOIDVL2.bmp", "area" : "TZIDVL2.bmp" }
},
"icons" :
{
"village" : {"normal" : 24, "built" : 25 },
@ -150,50 +150,50 @@
"moatDamage" : 90,
"buildings" :
[
{ "id" : 0 },
{ "id" : 1, "upgrades" : 0 },
{ "id" : 2, "upgrades" : 1 },
{ "id" : 3, "upgrades" : 2 },
{ "id" : 4, "upgrades" : 3 },
{ "id" : 5 },
{ "id" : 7 },
{ "id" : 8, "upgrades" : 7 },
{ "id" : 9, "upgrades" : 8 },
{ "id" : 10, "mode" : "auto" },
{ "id" : 11, "upgrades" : 10, "requires" : [ 5 ] },
{ "id" : 12, "upgrades" : 11, "requires" : [ 0, 14, 16 ] },
{ "id" : 13, "upgrades" : 12, "requires" : [ 9 ] },
{ "id" : 14 },
{ "id" : 15, "requires" : [ 14 ] },
{ "id" : 16 },
{ "id" : 18, "upgrades" : 30 },
{ "id" : 19, "upgrades" : 37, "requires" : [ 18 ], "mode" : "auto" },
{ "id" : 21, "requires" : [ 7 ] },
{ "id" : 22, "requires" : [ 8 ] },
{ "id" : 23, "requires" : [ 0 ] },
{ "id" : 24, "upgrades" : 32 },
{ "id" : 25, "upgrades" : 39, "requires" : [ 24 ], "mode" : "auto" },
{ "id" : 26, "mode" : "grail"},
{ "id" : 27, "requires" : [ 11 ], "mode" : "auto" },
{ "id" : 28, "requires" : [ 12 ], "mode" : "auto" },
{ "id" : 29, "requires" : [ 13 ], "mode" : "auto" },
{ "id" : 26 },
{ "id" : 30, "requires" : [ 7 ] },
{ "id" : 31, "requires" : [ 30 ] },
{ "id" : 32, "requires" : [ 30 ] },
{ "id" : 33, "requires" : [ 31 ] },
{ "id" : 34, "requires" : [ 33 ] },
{ "id" : 35, "requires" : [ 0, 33 ] },
{ "id" : 36, "requires" : [ 34, 35 ] },
{ "id" : 37, "upgrades" : 30 },
{ "id" : 38, "upgrades" : 31 },
{ "id" : 39, "upgrades" : 32 },
{ "id" : 40, "upgrades" : 33 },
{ "id" : 41, "upgrades" : 34, "requires" : [ 1 ] },
{ "id" : 42, "upgrades" : 35 },
{ "id" : 43, "upgrades" : 36 }
],
{
"mageGuild1": { "id" : 0 },
"mageGuild2": { "id" : 1, "upgrades" : 0 },
"mageGuild3": { "id" : 2, "upgrades" : 1 },
"mageGuild4": { "id" : 3, "upgrades" : 2 },
"mageGuild5": { "id" : 4, "upgrades" : 3 },
"tavern": { "id" : 5 },
"fort": { "id" : 7 },
"citadel": { "id" : 8, "upgrades" : 7 },
"castle": { "id" : 9, "upgrades" : 8 },
"villageHall": { "id" : 10, "mode" : "auto" },
"townHall": { "id" : 11, "upgrades" : 10, "requires" : [ 5 ] },
"cityHall": { "id" : 12, "upgrades" : 11, "requires" : [ 0, 14, 16 ] },
"capitol": { "id" : 13, "upgrades" : 12, "requires" : [ 9 ] },
"marketplace": { "id" : 14 },
"resourceSilo": { "id" : 15, "requires" : [ 14 ] },
"blacksmith": { "id" : 16 },
"horde1": { "id" : 18, "upgrades" : 30 },
"horde1Upgr": { "id" : 19, "upgrades" : 37, "requires" : [ 18 ], "mode" : "auto" },
"special2": { "id" : 21, "requires" : [ 7 ] },
"special3": { "id" : 22, "requires" : [ 8 ] },
"special4": { "id" : 23, "requires" : [ 0 ] },
"horde2": { "id" : 24, "upgrades" : 32 },
"horde2Upgr": { "id" : 25, "upgrades" : 39, "requires" : [ 24 ], "mode" : "auto" },
"grail": { "id" : 26, "mode" : "grail"},
"dwellingLvl1": { "id" : 30, "requires" : [ 7 ] },
"dwellingLvl2": { "id" : 31, "requires" : [ 30 ] },
"dwellingLvl3": { "id" : 32, "requires" : [ 30 ] },
"dwellingLvl4": { "id" : 33, "requires" : [ 31 ] },
"dwellingLvl5": { "id" : 34, "requires" : [ 33 ] },
"dwellingLvl6": { "id" : 35, "requires" : [ 0, 33 ] },
"dwellingLvl7": { "id" : 36, "requires" : [ 34, 35 ] },
"dwellingUpLvl1": { "id" : 37, "upgrades" : 30 },
"dwellingUpLvl2": { "id" : 38, "upgrades" : 31 },
"dwellingUpLvl3": { "id" : 39, "upgrades" : 32 },
"dwellingUpLvl4": { "id" : 40, "upgrades" : 33 },
"dwellingUpLvl5": { "id" : 41, "upgrades" : 34, "requires" : [ 1 ] },
"dwellingUpLvl6": { "id" : 42, "upgrades" : 35 },
"dwellingUpLvl7": { "id" : 43, "upgrades" : 36 },
"ship" : null,
"shipyard" : null,
"special1" : null
},
"siege" :
{

View File

@ -74,50 +74,50 @@
"capitol" : "AVCNECZ0.DEF"
},
"structures" :
[
{ "animation" : "TBNCEXT2.def", "x" : 25, "y" : 279 },
{ "id" : 0, "animation" : "TBNCMAGE.def", "x" : 341, "y" : 116, "z" : -1, "border" : "TONMAG1.bmp", "area" : "TZNMAG1.bmp" },
{ "id" : 1, "animation" : "TBNCMAG2.def", "x" : 341, "y" : 97, "z" : -1, "border" : "TONMAG2.bmp", "area" : "TZNMAG2.bmp" },
{ "id" : 2, "animation" : "TBNCMAG3.def", "x" : 341, "y" : 78, "z" : -1, "border" : "TONMAG3.bmp", "area" : "TZNMAG3.bmp" },
{ "id" : 3, "animation" : "TBNCMAG4.def", "x" : 340, "y" : 62, "z" : -1, "border" : "TONMAG4.bmp", "area" : "TZNMAG4.bmp" },
{ "id" : 4, "animation" : "TBNCMAG5.def", "x" : 343, "y" : 35, "z" : -1, "border" : "TONMAG5.bmp", "area" : "TZNMAG5.bmp" },
{ "id" : 5, "animation" : "TBNCTVRN.def", "x" : 508, "y" : 189, "border" : "TONTAV.bmp", "area" : "TZNTAV.bmp" },
{ "id" : 6, "animation" : "TBNCDOCK.def", "x" : 617, "y" : 265, "z" : -2, "border" : "TONSHPBA.bmp", "area" : "TZNSHPBA.bmp" },
{ "id" : 7, "animation" : "TBNCCSTL.def", "x" : 138, "y" : 66, "border" : "TONCAS1.bmp", "area" : "TZNCAS1.bmp" },
{ "id" : 8, "animation" : "TBNCCAS2.def", "x" : 139, "y" : 66, "border" : "TONCAS2.bmp", "area" : "TZNCAS2.bmp" },
{ "id" : 9, "animation" : "TBNCCAS3.def", "x" : 34, "y" : 18, "border" : "TONCAS3.bmp", "area" : "TZNCAS3.bmp" },
{ "id" : 10, "animation" : "TBNCHALL.def", "x" : 468, "y" : 76, "z" : -1, "border" : "TONHAL1.bmp", "area" : "TZNHAL1.bmp" },
{ "id" : 11, "animation" : "TBNCHAL2.def", "x" : 482, "y" : 56, "z" : -1, "border" : "TONHAL2.bmp", "area" : "TZNHAL2.bmp" },
{ "id" : 12, "animation" : "TBNCHAL3.def", "x" : 478, "y" : 26, "z" : -1, "border" : "TONHAL3.bmp", "area" : "TZNHAL3.bmp" },
{ "id" : 13, "animation" : "TBNCHAL4.def", "x" : 481, "y" : 26, "z" : -1, "border" : "TONHAL4.bmp", "area" : "TZNHAL4.bmp" },
{ "id" : 14, "animation" : "TBNCMARK.def", "x" : 347, "y" : 215, "z" : 2, "border" : "TONMRK1.bmp", "area" : "TZNMRK1.bmp" },
{ "id" : 15, "animation" : "TBNCSILO.def", "x" : 276, "y" : 185, "z" : 1, "border" : "TONMRK2.bmp", "area" : "TZNMRK2.bmp" },
{ "id" : 16, "animation" : "TBNCBLAK.def", "x" : 382, "y" : 252, "z" : 4, "border" : "TONSMITA.bmp", "area" : "TZNSMITA.bmp" },
{ "id" : 17, "animation" : "TBNCSPEC.def", "x" : 18, "y" : 0, "z" : -1, "border" : "TONSHRDA.bmp", "area" : "TZNSHRDA.bmp" },
{ "id" : 18, "animation" : "TBNCHRD1.def", "x" : 80, "y" : 222, "z" : 4, "border" : "TONSKE1H.bmp", "area" : "TZNSKE1H.bmp", "hidden" : true },
{ "id" : 19, "animation" : "TBNCHRD2.def", "x" : 64, "y" : 222, "z" : 4, "border" : "TONSKE2H.bmp", "area" : "TZNSKE2H.bmp", "hidden" : true, "builds" : 18 },
{ "id" : 20, "animation" : "TBNCBOAT.def", "x" : 617, "y" : 265, "z" : -2, "border" : "TONSHPNA.bmp", "area" : "TZNSHPNA.bmp", "hidden" : true },
{ "id" : 21, "animation" : "TBNCEXT0.def", "x" : 307, "y" : 61, "z" : -2, "border" : "TONNECRA.bmp", "area" : "TZNNECRA.bmp" },
{ "id" : 22, "animation" : "TBNCEXT1.def", "x" : 247, "y" : 275, "z" : 4, "border" : "TONSKELT.bmp", "area" : "TZNSKELT.bmp" },
{ "id" : 26, "animation" : "TBNCHOLY.def", "x" : 410, "y" : 88, "border" : "TONHOLYA.bmp", "area" : "TZNHOLYA.bmp" },
{ "id" : 27, "animation" : "TBNCEXT3.def", "x" : 0, "y" : 241 },
{ "id" : 28, "animation" : "TBNCEXT4.def", "x" : 321, "y" : 255 },
{ "id" : 29, "animation" : "TBNCEXT5.def", "x" : 475, "y" : 257 },
{ "id" : 30, "animation" : "TBNCDW_0.def", "x" : 80, "y" : 222, "z" : 4, "border" : "TONSKEL1.bmp", "area" : "TZNSKEL1.bmp" },
{ "id" : 31, "animation" : "TBNCDW_1.def", "x" : 502, "y" : 223, "border" : "TONZOMB1.bmp", "area" : "TZNZOMB1.bmp" },
{ "id" : 32, "animation" : "TBNCDW_2.def", "x" : 0, "y" : 187, "z" : 2, "border" : "TONWIGH1.bmp", "area" : "TZNWIGH1.bmp" },
{ "id" : 33, "animation" : "TBNCDW_3.def", "x" : 607, "y" : 212, "z" : 2, "border" : "TONVAM1.bmp", "area" : "TZNVAM1.bmp" },
{ "id" : 34, "animation" : "TBNCDW_4.def", "x" : 206, "y" : 207, "z" : 3, "border" : "TONLICH1.bmp", "area" : "TZNLICH1.bmp" },
{ "id" : 35, "animation" : "TBNCDW_5.def", "x" : 0, "y" : 31, "border" : "TONBKN1.bmp", "area" : "TZNBKN1.bmp" },
{ "id" : 36, "animation" : "TBNCDW_6.def", "x" : 663, "y" : 25, "border" : "TONBON1.bmp", "area" : "TZNBON1.bmp" },
{ "id" : 37, "animation" : "TBNCUP_0.def", "x" : 64, "y" : 222, "z" : 4, "border" : "TONSKEL2.bmp", "area" : "TZNSKEL2.bmp" },
{ "id" : 38, "animation" : "TBNCUP_1.def", "x" : 498, "y" : 224, "border" : "TONZOMB2.bmp", "area" : "TZNZOMB2.bmp" },
{ "id" : 39, "animation" : "TBNCUP_2.def", "x" : 0, "y" : 179, "z" : 2, "border" : "TONWIGH2.bmp", "area" : "TZNWIGH2.bmp" },
{ "id" : 40, "animation" : "TBNCUP_3.def", "x" : 615, "y" : 193, "z" : 2, "border" : "TONVAM2.bmp", "area" : "TZNVAM2.bmp" },
{ "id" : 41, "animation" : "TBNCUP_4.def", "x" : 222, "y" : 171, "z" : 3, "border" : "TONLICH2.bmp", "area" : "TZNLICH2.bmp" },
{ "id" : 42, "animation" : "TBNCUP_5.def", "x" : 0, "y" : 30, "border" : "TONBKN2.bmp", "area" : "TZNBKN2.bmp" },
{ "id" : 43, "animation" : "TBNCUP_6.def", "x" : 662, "y" : 23, "border" : "TONBON2.bmp", "area" : "TZNBON2.bmp" }
],
{
"extraAnimation": { "animation" : "TBNCEXT2.def", "x" : 25, "y" : 279 },
"mageGuild1": { "id" : 0, "animation" : "TBNCMAGE.def", "x" : 341, "y" : 116, "z" : -1, "border" : "TONMAG1.bmp", "area" : "TZNMAG1.bmp" },
"mageGuild2": { "id" : 1, "animation" : "TBNCMAG2.def", "x" : 341, "y" : 97, "z" : -1, "border" : "TONMAG2.bmp", "area" : "TZNMAG2.bmp" },
"mageGuild3": { "id" : 2, "animation" : "TBNCMAG3.def", "x" : 341, "y" : 78, "z" : -1, "border" : "TONMAG3.bmp", "area" : "TZNMAG3.bmp" },
"mageGuild4": { "id" : 3, "animation" : "TBNCMAG4.def", "x" : 340, "y" : 62, "z" : -1, "border" : "TONMAG4.bmp", "area" : "TZNMAG4.bmp" },
"mageGuild5": { "id" : 4, "animation" : "TBNCMAG5.def", "x" : 343, "y" : 35, "z" : -1, "border" : "TONMAG5.bmp", "area" : "TZNMAG5.bmp" },
"tavern": { "id" : 5, "animation" : "TBNCTVRN.def", "x" : 508, "y" : 189, "border" : "TONTAV.bmp", "area" : "TZNTAV.bmp" },
"shipyard": { "id" : 6, "animation" : "TBNCDOCK.def", "x" : 617, "y" : 265, "z" : -2, "border" : "TONSHPBA.bmp", "area" : "TZNSHPBA.bmp" },
"fort": { "id" : 7, "animation" : "TBNCCSTL.def", "x" : 138, "y" : 66, "border" : "TONCAS1.bmp", "area" : "TZNCAS1.bmp" },
"citadel": { "id" : 8, "animation" : "TBNCCAS2.def", "x" : 139, "y" : 66, "border" : "TONCAS2.bmp", "area" : "TZNCAS2.bmp" },
"castle": { "id" : 9, "animation" : "TBNCCAS3.def", "x" : 34, "y" : 18, "border" : "TONCAS3.bmp", "area" : "TZNCAS3.bmp" },
"villageHall": { "id" : 10, "animation" : "TBNCHALL.def", "x" : 468, "y" : 76, "z" : -1, "border" : "TONHAL1.bmp", "area" : "TZNHAL1.bmp" },
"townHall": { "id" : 11, "animation" : "TBNCHAL2.def", "x" : 482, "y" : 56, "z" : -1, "border" : "TONHAL2.bmp", "area" : "TZNHAL2.bmp" },
"cityHall": { "id" : 12, "animation" : "TBNCHAL3.def", "x" : 478, "y" : 26, "z" : -1, "border" : "TONHAL3.bmp", "area" : "TZNHAL3.bmp" },
"capitol": { "id" : 13, "animation" : "TBNCHAL4.def", "x" : 481, "y" : 26, "z" : -1, "border" : "TONHAL4.bmp", "area" : "TZNHAL4.bmp" },
"marketplace": { "id" : 14, "animation" : "TBNCMARK.def", "x" : 347, "y" : 215, "z" : 2, "border" : "TONMRK1.bmp", "area" : "TZNMRK1.bmp" },
"resourceSilo": { "id" : 15, "animation" : "TBNCSILO.def", "x" : 276, "y" : 185, "z" : 1, "border" : "TONMRK2.bmp", "area" : "TZNMRK2.bmp" },
"blacksmith": { "id" : 16, "animation" : "TBNCBLAK.def", "x" : 382, "y" : 252, "z" : 4, "border" : "TONSMITA.bmp", "area" : "TZNSMITA.bmp" },
"special1": { "id" : 17, "animation" : "TBNCSPEC.def", "x" : 18, "y" : 0, "z" : -1, "border" : "TONSHRDA.bmp", "area" : "TZNSHRDA.bmp" },
"horde1": { "id" : 18, "animation" : "TBNCHRD1.def", "x" : 80, "y" : 222, "z" : 4, "border" : "TONSKE1H.bmp", "area" : "TZNSKE1H.bmp", "hidden" : true },
"horde1Upgr": { "id" : 19, "animation" : "TBNCHRD2.def", "x" : 64, "y" : 222, "z" : 4, "border" : "TONSKE2H.bmp", "area" : "TZNSKE2H.bmp", "hidden" : true, "builds" : 18 },
"ship": { "id" : 20, "animation" : "TBNCBOAT.def", "x" : 617, "y" : 265, "z" : -2, "border" : "TONSHPNA.bmp", "area" : "TZNSHPNA.bmp", "hidden" : true },
"special2": { "id" : 21, "animation" : "TBNCEXT0.def", "x" : 307, "y" : 61, "z" : -2, "border" : "TONNECRA.bmp", "area" : "TZNNECRA.bmp" },
"special3": { "id" : 22, "animation" : "TBNCEXT1.def", "x" : 247, "y" : 275, "z" : 4, "border" : "TONSKELT.bmp", "area" : "TZNSKELT.bmp" },
"grail": { "id" : 26, "animation" : "TBNCHOLY.def", "x" : 410, "y" : 88, "border" : "TONHOLYA.bmp", "area" : "TZNHOLYA.bmp" },
"extraTownHall": { "id" : 27, "animation" : "TBNCEXT3.def", "x" : 0, "y" : 241 },
"extraCityHall": { "id" : 28, "animation" : "TBNCEXT4.def", "x" : 321, "y" : 255 },
"extraCapitol": { "id" : 29, "animation" : "TBNCEXT5.def", "x" : 475, "y" : 257 },
"dwellingLvl1": { "id" : 30, "animation" : "TBNCDW_0.def", "x" : 80, "y" : 222, "z" : 4, "border" : "TONSKEL1.bmp", "area" : "TZNSKEL1.bmp" },
"dwellingLvl2": { "id" : 31, "animation" : "TBNCDW_1.def", "x" : 502, "y" : 223, "border" : "TONZOMB1.bmp", "area" : "TZNZOMB1.bmp" },
"dwellingLvl3": { "id" : 32, "animation" : "TBNCDW_2.def", "x" : 0, "y" : 187, "z" : 2, "border" : "TONWIGH1.bmp", "area" : "TZNWIGH1.bmp" },
"dwellingLvl4": { "id" : 33, "animation" : "TBNCDW_3.def", "x" : 607, "y" : 212, "z" : 2, "border" : "TONVAM1.bmp", "area" : "TZNVAM1.bmp" },
"dwellingLvl5": { "id" : 34, "animation" : "TBNCDW_4.def", "x" : 206, "y" : 207, "z" : 3, "border" : "TONLICH1.bmp", "area" : "TZNLICH1.bmp" },
"dwellingLvl6": { "id" : 35, "animation" : "TBNCDW_5.def", "x" : 0, "y" : 31, "border" : "TONBKN1.bmp", "area" : "TZNBKN1.bmp" },
"dwellingLvl7": { "id" : 36, "animation" : "TBNCDW_6.def", "x" : 663, "y" : 25, "border" : "TONBON1.bmp", "area" : "TZNBON1.bmp" },
"dwellingUpLvl1": { "id" : 37, "animation" : "TBNCUP_0.def", "x" : 64, "y" : 222, "z" : 4, "border" : "TONSKEL2.bmp", "area" : "TZNSKEL2.bmp" },
"dwellingUpLvl2": { "id" : 38, "animation" : "TBNCUP_1.def", "x" : 498, "y" : 224, "border" : "TONZOMB2.bmp", "area" : "TZNZOMB2.bmp" },
"dwellingUpLvl3": { "id" : 39, "animation" : "TBNCUP_2.def", "x" : 0, "y" : 179, "z" : 2, "border" : "TONWIGH2.bmp", "area" : "TZNWIGH2.bmp" },
"dwellingUpLvl4": { "id" : 40, "animation" : "TBNCUP_3.def", "x" : 615, "y" : 193, "z" : 2, "border" : "TONVAM2.bmp", "area" : "TZNVAM2.bmp" },
"dwellingUpLvl5": { "id" : 41, "animation" : "TBNCUP_4.def", "x" : 222, "y" : 171, "z" : 3, "border" : "TONLICH2.bmp", "area" : "TZNLICH2.bmp" },
"dwellingUpLvl6": { "id" : 42, "animation" : "TBNCUP_5.def", "x" : 0, "y" : 30, "border" : "TONBKN2.bmp", "area" : "TZNBKN2.bmp" },
"dwellingUpLvl7": { "id" : 43, "animation" : "TBNCUP_6.def", "x" : 662, "y" : 23, "border" : "TONBON2.bmp", "area" : "TZNBON2.bmp" }
},
"icons" :
{
"village" : {"normal" : 26, "built" : 27 },
@ -153,49 +153,53 @@
"moatDamage" : 70,
"buildings" :
[
{ "id" : 0 },
{ "id" : 1, "upgrades" : 0 },
{ "id" : 2, "upgrades" : 1 },
{ "id" : 3, "upgrades" : 2 },
{ "id" : 4, "upgrades" : 3 },
{ "id" : 5 },
{ "id" : 6 },
{ "id" : 7 },
{ "id" : 8, "upgrades" : 7 },
{ "id" : 9, "upgrades" : 8 },
{ "id" : 10, "mode" : "auto" },
{ "id" : 11, "upgrades" : 10, "requires" : [ 5 ] },
{ "id" : 12, "upgrades" : 11, "requires" : [ 0, 14, 16 ] },
{ "id" : 13, "upgrades" : 12, "requires" : [ 9 ] },
{ "id" : 14 },
{ "id" : 15, "requires" : [ 14 ] },
{ "id" : 16 },
{ "id" : 17, "requires" : [ 7 ] },
{ "id" : 18, "upgrades" : 30, "requires" : [ 22 ] },
{ "id" : 19, "upgrades" : 37, "requires" : [ 18 ], "mode" : "auto" },
{ "id" : 20, "upgrades" : 6 },
{ "id" : 21, "requires" : [ 0 ] },
{ "id" : 22, "requires" : [ 30 ] },
{ "id" : 26, "mode" : "grail"},
{ "id" : 27, "requires" : [ 11 ], "mode" : "auto" },
{ "id" : 28, "requires" : [ 12 ], "mode" : "auto" },
{ "id" : 29, "requires" : [ 13 ], "mode" : "auto" },
{ "id" : 30, "requires" : [ 7 ] },
{ "id" : 31, "requires" : [ 30 ] },
{ "id" : 32, "requires" : [ 30 ] },
{ "id" : 33, "requires" : [ 31 ] },
{ "id" : 34, "requires" : [ 0, 31 ] },
{ "id" : 35, "requires" : [ 33, 34 ] },
{ "id" : 36, "requires" : [ 35 ] },
{ "id" : 37, "upgrades" : 30 },
{ "id" : 38, "upgrades" : 31 },
{ "id" : 39, "upgrades" : 32 },
{ "id" : 40, "upgrades" : 33, "requires" : [ 21 ] },
{ "id" : 41, "upgrades" : 34 },
{ "id" : 42, "upgrades" : 35 },
{ "id" : 43, "upgrades" : 36 }
],
{
"mageGuild1": { "id" : 0 },
"mageGuild2": { "id" : 1, "upgrades" : 0 },
"mageGuild3": { "id" : 2, "upgrades" : 1 },
"mageGuild4": { "id" : 3, "upgrades" : 2 },
"mageGuild5": { "id" : 4, "upgrades" : 3 },
"tavern": { "id" : 5 },
"shipyard": { "id" : 6 },
"fort": { "id" : 7 },
"citadel": { "id" : 8, "upgrades" : 7 },
"castle": { "id" : 9, "upgrades" : 8 },
"villageHall": { "id" : 10, "mode" : "auto" },
"townHall": { "id" : 11, "upgrades" : 10, "requires" : [ 5 ] },
"cityHall": { "id" : 12, "upgrades" : 11, "requires" : [ 0, 14, 16 ] },
"capitol": { "id" : 13, "upgrades" : 12, "requires" : [ 9 ] },
"marketplace": { "id" : 14 },
"resourceSilo": { "id" : 15, "requires" : [ 14 ] },
"blacksmith": { "id" : 16 },
"special1": { "id" : 17, "requires" : [ 7 ] },
"horde1": { "id" : 18, "upgrades" : 30, "requires" : [ 22 ] },
"horde1Upgr": { "id" : 19, "upgrades" : 37, "requires" : [ 18 ], "mode" : "auto" },
"ship": { "id" : 20, "upgrades" : 6 },
"special2": { "id" : 21, "requires" : [ 0 ] },
"special3": { "id" : 22, "requires" : [ 30 ] },
"grail": { "id" : 26, "mode" : "grail"},
"extraTownHall": { "id" : 27, "requires" : [ 11 ], "mode" : "auto" },
"extraCityHall": { "id" : 28, "requires" : [ 12 ], "mode" : "auto" },
"extraCapitol": { "id" : 29, "requires" : [ 13 ], "mode" : "auto" },
"dwellingLvl1": { "id" : 30, "requires" : [ 7 ] },
"dwellingLvl2": { "id" : 31, "requires" : [ 30 ] },
"dwellingLvl3": { "id" : 32, "requires" : [ 30 ] },
"dwellingLvl4": { "id" : 33, "requires" : [ 31 ] },
"dwellingLvl5": { "id" : 34, "requires" : [ 0, 31 ] },
"dwellingLvl6": { "id" : 35, "requires" : [ 33, 34 ] },
"dwellingLvl7": { "id" : 36, "requires" : [ 35 ] },
"dwellingUpLvl1": { "id" : 37, "upgrades" : 30 },
"dwellingUpLvl2": { "id" : 38, "upgrades" : 31 },
"dwellingUpLvl3": { "id" : 39, "upgrades" : 32 },
"dwellingUpLvl4": { "id" : 40, "upgrades" : 33, "requires" : [ 21 ] },
"dwellingUpLvl5": { "id" : 41, "upgrades" : 34 },
"dwellingUpLvl6": { "id" : 42, "upgrades" : 35 },
"dwellingUpLvl7": { "id" : 43, "upgrades" : 36 },
"horde2" : null,
"horde2Upgr" : null,
"special4" : null
},
"siege" :
{

View File

@ -74,50 +74,50 @@
"capitol" : "AVCRAMZ0.DEF"
},
"structures" :
[
{ "animation" : "TBRMEXT2.def", "x" : 327, "y" : 236 },
{ "id" : 0, "animation" : "TBRMMAGE.def", "x" : 454, "y" : 200, "z" : -1, "border" : "TORMAG1.bmp", "area" : "TZRMAG1.bmp" },
{ "id" : 1, "animation" : "TBRMMAG2.def", "x" : 438, "y" : 178, "z" : -1, "border" : "TORMAG2.bmp", "area" : "TZRMAG2.bmp" },
{ "id" : 2, "animation" : "TBRMMAG3.def", "x" : 418, "y" : 153, "z" : -1, "border" : "TORMAG3.bmp", "area" : "TZRMAG3.bmp" },
{ "id" : 3, "animation" : "TBRMMAG4.def", "x" : 406, "y" : 129, "z" : -1, "border" : "TORMAG4.bmp", "area" : "TZRMAG4.bmp" },
{ "id" : 4, "animation" : "TBRMMAG5.def", "x" : 384, "y" : 104, "z" : -1, "border" : "TORMAG5.bmp", "area" : "TZRMAG5.bmp" },
{ "id" : 5, "animation" : "TBRMTVRN.def", "x" : 181, "y" : 229, "z" : 1, "border" : "TORTAV.bmp", "area" : "TZRTAV.bmp" },
{ "id" : 7, "animation" : "TBRMCSTL.def", "x" : 63, "y" : 25, "z" : -2, "border" : "TORCAS1.bmp", "area" : "TZRCAS1.bmp" },
{ "id" : 8, "animation" : "TBRMCAS2.def", "x" : 79, "y" : 18, "z" : -2, "border" : "TORCAS3.bmp", "area" : "TZRCAS3.bmp" },
{ "id" : 9, "animation" : "TBRMCAS3.def", "x" : 79, "y" : 18, "z" : -2, "border" : "TORCAS2.bmp", "area" : "TZRCAS2.bmp" },
{ "id" : 10, "animation" : "TBRMHALL.def", "x" : 565, "y" : 216, "border" : "TORHAL1.bmp", "area" : "TZRHAL1.bmp" },
{ "id" : 11, "animation" : "TBRMHAL2.def", "x" : 538, "y" : 187, "border" : "TORHAL2.bmp", "area" : "TZRHAL2.bmp" },
{ "id" : 12, "animation" : "TBRMHAL3.def", "x" : 538, "y" : 187, "border" : "TORHAL3.bmp", "area" : "TZRHAL3.bmp" },
{ "id" : 13, "animation" : "TBRMHAL4.def", "x" : 534, "y" : 187, "border" : "TORHAL4.bmp", "area" : "TZRHAL4.bmp" },
{ "id" : 14, "animation" : "TBRMMARK.def", "x" : 129, "y" : 301, "z" : 3, "border" : "TORMRK1.bmp", "area" : "TZRMRK1.bmp" },
{ "id" : 15, "animation" : "TBRMSILO.def", "x" : 245, "y" : 324, "z" : 4, "border" : "TORMRK2.bmp", "area" : "TZRMRK2.bmp" },
{ "id" : 16, "animation" : "TBRMBLAK.def", "x" : 558, "y" : 105, "z" : -3, "border" : "TORAID.bmp", "area" : "TZRAID.bmp" },
{ "id" : 17, "animation" : "TBRMSPEC.def", "x" : 555, "y" : 297, "border" : "TORGAR1A.bmp", "area" : "TZRGAR1A.bmp" },
{ "id" : 18, "animation" : "TBRMHRD1.def", "x" : 0, "y" : 154, "border" : "TORDWF1H.bmp", "area" : "TZRDWF1H.bmp", "hidden" : true },
{ "id" : 19, "animation" : "TBRMHRD2.def", "x" : 0, "y" : 143, "border" : "TORDWF2H.bmp", "area" : "TZRDWF2H.bmp", "hidden" : true, "builds" : 18 },
{ "id" : 21, "animation" : "TBRMEXT0.def", "x" : 555, "y" : 297, "z" : 2, "border" : "TORGAR2A.bmp", "area" : "TZRGAR2A.bmp" },
{ "id" : 22, "animation" : "TBRMEXT1.def", "x" : 0, "y" : 181, "z" : 1, "border" : "TORDWFT.bmp", "area" : "TZRDWFT.bmp" },
{ "id" : 24, "animation" : "TBRMHRD3.def", "x" : 47, "y" : 142, "z" : -1, "border" : "TORTRE1H.bmp", "area" : "TZRTRE1H.bmp", "hidden" : true },
{ "id" : 25, "animation" : "TBRMHRD4.def", "x" : 47, "y" : 142, "z" : -1, "border" : "TORTRE2H.bmp", "area" : "TZRTRE2H.bmp", "hidden" : true, "builds" : 24 },
{ "id" : 26, "animation" : "TBRMHOLY.def", "x" : 0, "y" : 54, "z" : -1, "border" : "TORHOLY.bmp", "area" : "TZRHOLY.bmp" },
{ "id" : 27, "animation" : "TBRMEXT3.def", "x" : 293, "y" : 235 },
{ "id" : 28, "animation" : "TBRMEXT4.def", "x" : 295, "y" : 191 },
{ "id" : 29, "animation" : "TBRMEXT5.def", "x" : 260, "y" : 171 },
{ "id" : 30, "animation" : "TBRMDW_0.def", "x" : 0, "y" : 236, "z" : 2, "border" : "TORCEN1A.bmp", "area" : "TZRCEN1A.bmp" },
{ "id" : 31, "animation" : "TBRMDW_1.def", "x" : 0, "y" : 154, "border" : "TORDWF1.bmp", "area" : "TZRDWF1.bmp" },
{ "id" : 32, "animation" : "TBRMDW_2.def", "x" : 668, "y" : 101, "border" : "TORELF1.bmp", "area" : "TZRELF1.bmp" },
{ "id" : 33, "animation" : "TBRMDW_3.def", "x" : 287, "y" : 73, "z" : -1, "border" : "TORPEG1A.bmp", "area" : "TZRPEG1A.bmp" },
{ "id" : 34, "animation" : "TBRMDW_4.def", "x" : 68, "y" : 146, "z" : -1, "border" : "TORTRE1.bmp", "area" : "TZRTRE1.bmp" },
{ "id" : 35, "animation" : "TBRMDW_5.def", "x" : 362, "y" : 90, "z" : -2, "border" : "TORUNI1.bmp", "area" : "TZRUNI1.bmp" },
{ "id" : 36, "animation" : "TBRMDW_6.def", "x" : 502, "y" : 27, "z" : -5, "border" : "TORDR1AA.bmp", "area" : "TZRDR1AA.bmp" },
{ "id" : 37, "animation" : "TBRMUP_0.def", "x" : 0, "y" : 236, "z" : 2, "border" : "TORCEN2A.bmp", "area" : "TZRCEN2A.bmp" },
{ "id" : 38, "animation" : "TBRMUP_1.def", "x" : 0, "y" : 143, "border" : "TORDWF2.bmp", "area" : "TZRDWF2.bmp" },
{ "id" : 39, "animation" : "TBRMUP_2.def", "x" : 665, "y" : 101, "border" : "TORELF2.bmp", "area" : "TZRELF2.bmp" },
{ "id" : 40, "animation" : "TBRMUP_3.def", "x" : 287, "y" : 28, "z" : -1, "border" : "TORPEG2A.bmp", "area" : "TZRPEG2A.bmp" },
{ "id" : 41, "animation" : "TBRMUP_4.def", "x" : 63, "y" : 146, "z" : -1, "border" : "TORTRE2.bmp", "area" : "TZRTRE2.bmp" },
{ "id" : 42, "animation" : "TBRMUP_5.def", "x" : 362, "y" : 90, "z" : -2, "border" : "TORUNI2.bmp", "area" : "TZRUNI2.bmp" },
{ "id" : 43, "animation" : "TBRMUP_6.def", "x" : 502, "y" : 5, "z" : -5, "border" : "TORDR2AA.bmp", "area" : "TZRDR2AA.bmp" }
],
{
"extraAnimation": { "animation" : "TBRMEXT2.def", "x" : 327, "y" : 236 },
"mageGuild1": { "id" : 0, "animation" : "TBRMMAGE.def", "x" : 454, "y" : 200, "z" : -1, "border" : "TORMAG1.bmp", "area" : "TZRMAG1.bmp" },
"mageGuild2": { "id" : 1, "animation" : "TBRMMAG2.def", "x" : 438, "y" : 178, "z" : -1, "border" : "TORMAG2.bmp", "area" : "TZRMAG2.bmp" },
"mageGuild3": { "id" : 2, "animation" : "TBRMMAG3.def", "x" : 418, "y" : 153, "z" : -1, "border" : "TORMAG3.bmp", "area" : "TZRMAG3.bmp" },
"mageGuild4": { "id" : 3, "animation" : "TBRMMAG4.def", "x" : 406, "y" : 129, "z" : -1, "border" : "TORMAG4.bmp", "area" : "TZRMAG4.bmp" },
"mageGuild5": { "id" : 4, "animation" : "TBRMMAG5.def", "x" : 384, "y" : 104, "z" : -1, "border" : "TORMAG5.bmp", "area" : "TZRMAG5.bmp" },
"tavern": { "id" : 5, "animation" : "TBRMTVRN.def", "x" : 181, "y" : 229, "z" : 1, "border" : "TORTAV.bmp", "area" : "TZRTAV.bmp" },
"fort": { "id" : 7, "animation" : "TBRMCSTL.def", "x" : 63, "y" : 25, "z" : -2, "border" : "TORCAS1.bmp", "area" : "TZRCAS1.bmp" },
"citadel": { "id" : 8, "animation" : "TBRMCAS2.def", "x" : 79, "y" : 18, "z" : -2, "border" : "TORCAS3.bmp", "area" : "TZRCAS3.bmp" },
"castle": { "id" : 9, "animation" : "TBRMCAS3.def", "x" : 79, "y" : 18, "z" : -2, "border" : "TORCAS2.bmp", "area" : "TZRCAS2.bmp" },
"villageHall": { "id" : 10, "animation" : "TBRMHALL.def", "x" : 565, "y" : 216, "border" : "TORHAL1.bmp", "area" : "TZRHAL1.bmp" },
"townHall": { "id" : 11, "animation" : "TBRMHAL2.def", "x" : 538, "y" : 187, "border" : "TORHAL2.bmp", "area" : "TZRHAL2.bmp" },
"cityHall": { "id" : 12, "animation" : "TBRMHAL3.def", "x" : 538, "y" : 187, "border" : "TORHAL3.bmp", "area" : "TZRHAL3.bmp" },
"capitol": { "id" : 13, "animation" : "TBRMHAL4.def", "x" : 534, "y" : 187, "border" : "TORHAL4.bmp", "area" : "TZRHAL4.bmp" },
"marketplace": { "id" : 14, "animation" : "TBRMMARK.def", "x" : 129, "y" : 301, "z" : 3, "border" : "TORMRK1.bmp", "area" : "TZRMRK1.bmp" },
"resourceSilo": { "id" : 15, "animation" : "TBRMSILO.def", "x" : 245, "y" : 324, "z" : 4, "border" : "TORMRK2.bmp", "area" : "TZRMRK2.bmp" },
"blacksmith": { "id" : 16, "animation" : "TBRMBLAK.def", "x" : 558, "y" : 105, "z" : -3, "border" : "TORAID.bmp", "area" : "TZRAID.bmp" },
"special1": { "id" : 17, "animation" : "TBRMSPEC.def", "x" : 555, "y" : 297, "border" : "TORGAR1A.bmp", "area" : "TZRGAR1A.bmp" },
"horde1": { "id" : 18, "animation" : "TBRMHRD1.def", "x" : 0, "y" : 154, "border" : "TORDWF1H.bmp", "area" : "TZRDWF1H.bmp", "hidden" : true },
"horde1Upgr": { "id" : 19, "animation" : "TBRMHRD2.def", "x" : 0, "y" : 143, "border" : "TORDWF2H.bmp", "area" : "TZRDWF2H.bmp", "hidden" : true, "builds" : 18 },
"special2": { "id" : 21, "animation" : "TBRMEXT0.def", "x" : 555, "y" : 297, "z" : 2, "border" : "TORGAR2A.bmp", "area" : "TZRGAR2A.bmp" },
"special3": { "id" : 22, "animation" : "TBRMEXT1.def", "x" : 0, "y" : 181, "z" : 1, "border" : "TORDWFT.bmp", "area" : "TZRDWFT.bmp" },
"horde2": { "id" : 24, "animation" : "TBRMHRD3.def", "x" : 47, "y" : 142, "z" : -1, "border" : "TORTRE1H.bmp", "area" : "TZRTRE1H.bmp", "hidden" : true },
"horde2Upgr": { "id" : 25, "animation" : "TBRMHRD4.def", "x" : 47, "y" : 142, "z" : -1, "border" : "TORTRE2H.bmp", "area" : "TZRTRE2H.bmp", "hidden" : true, "builds" : 24 },
"grail": { "id" : 26, "animation" : "TBRMHOLY.def", "x" : 0, "y" : 54, "z" : -1, "border" : "TORHOLY.bmp", "area" : "TZRHOLY.bmp" },
"extraTownHall": { "id" : 27, "animation" : "TBRMEXT3.def", "x" : 293, "y" : 235 },
"extraCityHall": { "id" : 28, "animation" : "TBRMEXT4.def", "x" : 295, "y" : 191 },
"extraCapitol": { "id" : 29, "animation" : "TBRMEXT5.def", "x" : 260, "y" : 171 },
"dwellingLvl1": { "id" : 30, "animation" : "TBRMDW_0.def", "x" : 0, "y" : 236, "z" : 2, "border" : "TORCEN1A.bmp", "area" : "TZRCEN1A.bmp" },
"dwellingLvl2": { "id" : 31, "animation" : "TBRMDW_1.def", "x" : 0, "y" : 154, "border" : "TORDWF1.bmp", "area" : "TZRDWF1.bmp" },
"dwellingLvl3": { "id" : 32, "animation" : "TBRMDW_2.def", "x" : 668, "y" : 101, "border" : "TORELF1.bmp", "area" : "TZRELF1.bmp" },
"dwellingLvl4": { "id" : 33, "animation" : "TBRMDW_3.def", "x" : 287, "y" : 73, "z" : -1, "border" : "TORPEG1A.bmp", "area" : "TZRPEG1A.bmp" },
"dwellingLvl5": { "id" : 34, "animation" : "TBRMDW_4.def", "x" : 68, "y" : 146, "z" : -1, "border" : "TORTRE1.bmp", "area" : "TZRTRE1.bmp" },
"dwellingLvl6": { "id" : 35, "animation" : "TBRMDW_5.def", "x" : 362, "y" : 90, "z" : -2, "border" : "TORUNI1.bmp", "area" : "TZRUNI1.bmp" },
"dwellingLvl7": { "id" : 36, "animation" : "TBRMDW_6.def", "x" : 502, "y" : 27, "z" : -5, "border" : "TORDR1AA.bmp", "area" : "TZRDR1AA.bmp" },
"dwellingUpLvl1": { "id" : 37, "animation" : "TBRMUP_0.def", "x" : 0, "y" : 236, "z" : 2, "border" : "TORCEN2A.bmp", "area" : "TZRCEN2A.bmp" },
"dwellingUpLvl2": { "id" : 38, "animation" : "TBRMUP_1.def", "x" : 0, "y" : 143, "border" : "TORDWF2.bmp", "area" : "TZRDWF2.bmp" },
"dwellingUpLvl3": { "id" : 39, "animation" : "TBRMUP_2.def", "x" : 665, "y" : 101, "border" : "TORELF2.bmp", "area" : "TZRELF2.bmp" },
"dwellingUpLvl4": { "id" : 40, "animation" : "TBRMUP_3.def", "x" : 287, "y" : 28, "z" : -1, "border" : "TORPEG2A.bmp", "area" : "TZRPEG2A.bmp" },
"dwellingUpLvl5": { "id" : 41, "animation" : "TBRMUP_4.def", "x" : 63, "y" : 146, "z" : -1, "border" : "TORTRE2.bmp", "area" : "TZRTRE2.bmp" },
"dwellingUpLvl6": { "id" : 42, "animation" : "TBRMUP_5.def", "x" : 362, "y" : 90, "z" : -2, "border" : "TORUNI2.bmp", "area" : "TZRUNI2.bmp" },
"dwellingUpLvl7": { "id" : 43, "animation" : "TBRMUP_6.def", "x" : 502, "y" : 5, "z" : -5, "border" : "TORDR2AA.bmp", "area" : "TZRDR2AA.bmp" }
},
"icons" :
{
"village" : {"normal" : 20, "built" : 21 },
@ -155,50 +155,53 @@
"moatDamage" : 70,
"buildings" :
[
{ "id" : 0 },
{ "id" : 1, "upgrades" : 0 },
{ "id" : 2, "upgrades" : 1 },
{ "id" : 3, "upgrades" : 2 },
{ "id" : 4, "upgrades" : 3 },
{ "id" : 5 },
{ "id" : 7 },
{ "id" : 8, "upgrades" : 7 },
{ "id" : 9, "upgrades" : 8 },
{ "id" : 10, "mode" : "auto" },
{ "id" : 11, "upgrades" : 10, "requires" : [ 5 ] },
{ "id" : 12, "upgrades" : 11, "requires" : [ 0, 14, 16 ] },
{ "id" : 13, "upgrades" : 12, "requires" : [ 9 ] },
{ "id" : 14 },
{ "id" : 15, "requires" : [ 14 ] },
{ "id" : 16 },
{ "id" : 17 },
{ "id" : 18, "upgrades" : 31 },
{ "id" : 19, "upgrades" : 38, "requires" : [ 18 ], "mode" : "auto" },
{ "id" : 21, "requires" : [ 17 ] },
{ "id" : 22, "requires" : [ 18, 19 ] },
{ "id" : 24, "upgrades" : 34 },
{ "id" : 25, "upgrades" : 41, "requires" : [ 24 ], "mode" : "auto" },
{ "id" : 26, "mode" : "grail"},
{ "id" : 27, "requires" : [ 11 ], "mode" : "auto" },
{ "id" : 28, "requires" : [ 12 ], "mode" : "auto" },
{ "id" : 29, "requires" : [ 13 ], "mode" : "auto" },
{ "id" : 26 },
{ "id" : 30, "requires" : [ 7 ] },
{ "id" : 31, "requires" : [ 30 ] },
{ "id" : 32, "requires" : [ 30 ] },
{ "id" : 33, "requires" : [ 32 ] },
{ "id" : 34, "requires" : [ 32 ] },
{ "id" : 35, "requires" : [ 33, 34 ] },
{ "id" : 36, "requires" : [ 35, 1 ] },
{ "id" : 37, "upgrades" : 30 },
{ "id" : 38, "upgrades" : 31 },
{ "id" : 39, "upgrades" : 32 },
{ "id" : 40, "upgrades" : 33 },
{ "id" : 41, "upgrades" : 34 },
{ "id" : 42, "upgrades" : 35 },
{ "id" : 43, "upgrades" : 36, "requires" : [ 2 ] }
],
{
"mageGuild1": { "id" : 0 },
"mageGuild2": { "id" : 1, "upgrades" : 0 },
"mageGuild3": { "id" : 2, "upgrades" : 1 },
"mageGuild4": { "id" : 3, "upgrades" : 2 },
"mageGuild5": { "id" : 4, "upgrades" : 3 },
"tavern": { "id" : 5 },
"fort": { "id" : 7 },
"citadel": { "id" : 8, "upgrades" : 7 },
"castle": { "id" : 9, "upgrades" : 8 },
"villageHall": { "id" : 10, "mode" : "auto" },
"townHall": { "id" : 11, "upgrades" : 10, "requires" : [ 5 ] },
"cityHall": { "id" : 12, "upgrades" : 11, "requires" : [ 0, 14, 16 ] },
"capitol": { "id" : 13, "upgrades" : 12, "requires" : [ 9 ] },
"marketplace": { "id" : 14 },
"resourceSilo": { "id" : 15, "requires" : [ 14 ] },
"blacksmith": { "id" : 16 },
"special1": { "id" : 17 },
"horde1": { "id" : 18, "upgrades" : 31 },
"horde1Upgr": { "id" : 19, "upgrades" : 38, "requires" : [ 18 ], "mode" : "auto" },
"special2": { "id" : 21, "requires" : [ 17 ] },
"special3": { "id" : 22, "requires" : [ 18, 19 ] },
"horde2": { "id" : 24, "upgrades" : 34 },
"horde2Upgr": { "id" : 25, "upgrades" : 41, "requires" : [ 24 ], "mode" : "auto" },
"grail": { "id" : 26, "mode" : "grail"},
"extraTownHall": { "id" : 27, "requires" : [ 11 ], "mode" : "auto" },
"extraCityHall": { "id" : 28, "requires" : [ 12 ], "mode" : "auto" },
"extraCapitol": { "id" : 29, "requires" : [ 13 ], "mode" : "auto" },
"dwellingLvl1": { "id" : 30, "requires" : [ 7 ] },
"dwellingLvl2": { "id" : 31, "requires" : [ 30 ] },
"dwellingLvl3": { "id" : 32, "requires" : [ 30 ] },
"dwellingLvl4": { "id" : 33, "requires" : [ 32 ] },
"dwellingLvl5": { "id" : 34, "requires" : [ 32 ] },
"dwellingLvl6": { "id" : 35, "requires" : [ 33, 34 ] },
"dwellingLvl7": { "id" : 36, "requires" : [ 35, 1 ] },
"dwellingUpLvl1": { "id" : 37, "upgrades" : 30 },
"dwellingUpLvl2": { "id" : 38, "upgrades" : 31 },
"dwellingUpLvl3": { "id" : 39, "upgrades" : 32 },
"dwellingUpLvl4": { "id" : 40, "upgrades" : 33 },
"dwellingUpLvl5": { "id" : 41, "upgrades" : 34 },
"dwellingUpLvl6": { "id" : 42, "upgrades" : 35 },
"dwellingUpLvl7": { "id" : 43, "upgrades" : 36, "requires" : [ 2 ] },
"ship" : null,
"shipyard" : null,
"special4" : null
},
"siege" :
{

View File

@ -74,44 +74,44 @@
"capitol" : "AVCSTRZ0.DEF"
},
"structures" :
[
{ "animation" : "TBSTEXT3.def", "x" : 23, "y" : 20 },
{ "id" : 0, "animation" : "TBSTMAGE.def", "x" : 473, "y" : 67, "z" : -1, "border" : "TOSMAG1.bmp", "area" : "TZSMAG1.bmp" },
{ "id" : 1, "animation" : "TBSTMAG2.def", "x" : 473, "y" : 37, "z" : -1, "border" : "TOSMAG2.bmp", "area" : "TZSMAG2.bmp" },
{ "id" : 2, "animation" : "TBSTMAG3.def", "x" : 473, "y" : 1, "z" : -1, "border" : "TOSMAG3.bmp", "area" : "TZSMAG3.bmp" },
{ "id" : 5, "animation" : "TBSTTVRN.def", "x" : 170, "y" : 280, "z" : 2, "border" : "TOSTAV.bmp", "area" : "TZSTAV.bmp" },
{ "id" : 7, "animation" : "TBSTCSTL.def", "x" : 402, "y" : 148, "z" : -1, "border" : "TOSCA1.bmp", "area" : "TZSCA1.bmp" },
{ "id" : 8, "animation" : "TBSTCAS2.def", "x" : 402, "y" : 114, "z" : -1, "border" : "TOSCA2.bmp", "area" : "TZSCA2.bmp" },
{ "id" : 9, "animation" : "TBSTCAS3.def", "x" : 402, "y" : 114, "z" : -1, "border" : "TOSCA3.bmp", "area" : "TZSCA3.bmp" },
{ "id" : 10, "animation" : "TBSTHALL.def", "x" : 0, "y" : 259, "border" : "TOSHAL1A.bmp", "area" : "TZSHAL1A.bmp" },
{ "id" : 11, "animation" : "TBSTHAL2.def", "x" : 0, "y" : 225, "border" : "TOSHAL2A.bmp", "area" : "TZSHAL2A.bmp" },
{ "id" : 12, "animation" : "TBSTHAL3.def", "x" : 0, "y" : 201, "border" : "TOSHAL3A.bmp", "area" : "TZSHAL3A.bmp" },
{ "id" : 13, "animation" : "TBSTHAL4.def", "x" : 0, "y" : 148, "border" : "TOSHAL4A.bmp", "area" : "TZSHAL4A.bmp" },
{ "id" : 14, "animation" : "TBSTMARK.def", "x" : 397, "y" : 308, "z" : 1, "border" : "TOSMRK1.bmp", "area" : "TZSMRK1.bmp" },
{ "id" : 15, "animation" : "TBSTSILO.def", "x" : 458, "y" : 248, "z" : 1, "border" : "TOSMRK2.bmp", "area" : "TZSMRK2.bmp" },
{ "id" : 16, "animation" : "TBSTBLAK.def", "x" : 660, "y" : 286, "border" : "TOSBLK1.bmp", "area" : "TZSBLK1.bmp" },
{ "id" : 17, "animation" : "TBSTSPEC.def", "x" : 550, "y" : 229, "border" : "TOSCA1EA.bmp", "area" : "TZSCA1EA.bmp" },
{ "id" : 18, "animation" : "TBSTHRD1.def", "x" : 373, "y" : 239, "border" : "TOSGOB1H.bmp", "area" : "TZSGOB1H.bmp", "hidden" : true },
{ "id" : 19, "animation" : "TBSTHRD2.def", "x" : 373, "y" : 220, "border" : "TOSGOB2H.bmp", "area" : "TZSGOB2H.bmp", "hidden" : true, "builds" : 18 },
{ "id" : 21, "animation" : "TBSTEXT0.def", "x" : 473, "y" : 282, "z" : 3, "border" : "TOSMRK1C.bmp", "area" : "TZSMRK1C.bmp" },
{ "id" : 22, "animation" : "TBSTEXT1.def", "x" : 617, "y" : 286, "z" : 1, "border" : "TOSBLK2.bmp", "area" : "TZSBLK2.bmp" },
{ "id" : 23, "animation" : "TBSTEXT2.def", "x" : 313, "y" : 13, "z" : -1, "border" : "TOSVAH.bmp", "area" : "TZSVAH.bmp" },
{ "id" : 26, "animation" : "TBSTHOLY.def", "x" : 321, "y" : 105, "z" : 2, "border" : "TOSHOLYA.bmp", "area" : "TZSHOLYA.bmp" },
{ "id" : 30, "animation" : "TBSTDW_0.def", "x" : 373, "y" : 239, "border" : "TOSGOB1.bmp", "area" : "TZSGOB1.bmp" },
{ "id" : 31, "animation" : "TBSTDW_1.def", "x" : 266, "y" : 246, "z" : 1, "border" : "TOSWOL1.bmp", "area" : "TZSWOL1.bmp" },
{ "id" : 32, "animation" : "TBSTDW_2.def", "x" : 566, "y" : 232, "z" : 2, "border" : "TOSORC1.bmp", "area" : "TZSORC1.bmp" },
{ "id" : 33, "animation" : "TBSTDW_3.def", "x" : 197, "y" : 204, "border" : "TOSOGR1.bmp", "area" : "TZSOGR1.bmp" },
{ "id" : 34, "animation" : "TBSTDW_4.def", "x" : 137, "y" : 30, "z" : -1, "border" : "TOSROC1.bmp", "area" : "TZSROC1.bmp" },
{ "id" : 35, "animation" : "TBSTDW_5.def", "x" : 622, "y" : 160, "z" : -2, "border" : "TOSCYC1.bmp", "area" : "TZSCYC1.bmp" },
{ "id" : 36, "animation" : "TBSTDW_6.def", "x" : 604, "y" : 0, "border" : "TOSBEH1A.bmp", "area" : "TZSBEH1A.bmp" },
{ "id" : 37, "animation" : "TBSTUP_0.def", "x" : 373, "y" : 220, "border" : "TOSGOB2.bmp", "area" : "TZSGOB2.bmp" },
{ "id" : 38, "animation" : "TBSTUP_1.def", "x" : 266, "y" : 225, "z" : 1, "border" : "TOSWOL2.bmp", "area" : "TZSWOL2.bmp" },
{ "id" : 39, "animation" : "TBSTUP_2.def", "x" : 566, "y" : 158, "z" : 2, "border" : "TOSORC2.bmp", "area" : "TZSORC2.bmp" },
{ "id" : 40, "animation" : "TBSTUP_3.def", "x" : 197, "y" : 137, "border" : "TOSOGR2.bmp", "area" : "TZSOGR2.bmp" },
{ "id" : 41, "animation" : "TBSTUP_4.def", "x" : 129, "y" : 15, "z" : -1, "border" : "TOSROC2.bmp", "area" : "TZSROC2.bmp" },
{ "id" : 42, "animation" : "TBSTUP_5.def", "x" : 616, "y" : 93, "z" : -2, "border" : "TOSCYC2A.bmp", "area" : "TZSCYC2A.bmp" },
{ "id" : 43, "animation" : "TBSTUP_6.def", "x" : 604, "y" : 0, "border" : "TOSBEH2A.bmp", "area" : "TZSBEH2A.bmp" }
],
{
"extraAnimation": { "animation" : "TBSTEXT3.def", "x" : 23, "y" : 20 },
"mageGuild1": { "id" : 0, "animation" : "TBSTMAGE.def", "x" : 473, "y" : 67, "z" : -1, "border" : "TOSMAG1.bmp", "area" : "TZSMAG1.bmp" },
"mageGuild2": { "id" : 1, "animation" : "TBSTMAG2.def", "x" : 473, "y" : 37, "z" : -1, "border" : "TOSMAG2.bmp", "area" : "TZSMAG2.bmp" },
"mageGuild3": { "id" : 2, "animation" : "TBSTMAG3.def", "x" : 473, "y" : 1, "z" : -1, "border" : "TOSMAG3.bmp", "area" : "TZSMAG3.bmp" },
"tavern": { "id" : 5, "animation" : "TBSTTVRN.def", "x" : 170, "y" : 280, "z" : 2, "border" : "TOSTAV.bmp", "area" : "TZSTAV.bmp" },
"fort": { "id" : 7, "animation" : "TBSTCSTL.def", "x" : 402, "y" : 148, "z" : -1, "border" : "TOSCA1.bmp", "area" : "TZSCA1.bmp" },
"citadel": { "id" : 8, "animation" : "TBSTCAS2.def", "x" : 402, "y" : 114, "z" : -1, "border" : "TOSCA2.bmp", "area" : "TZSCA2.bmp" },
"castle": { "id" : 9, "animation" : "TBSTCAS3.def", "x" : 402, "y" : 114, "z" : -1, "border" : "TOSCA3.bmp", "area" : "TZSCA3.bmp" },
"villageHall": { "id" : 10, "animation" : "TBSTHALL.def", "x" : 0, "y" : 259, "border" : "TOSHAL1A.bmp", "area" : "TZSHAL1A.bmp" },
"townHall": { "id" : 11, "animation" : "TBSTHAL2.def", "x" : 0, "y" : 225, "border" : "TOSHAL2A.bmp", "area" : "TZSHAL2A.bmp" },
"cityHall": { "id" : 12, "animation" : "TBSTHAL3.def", "x" : 0, "y" : 201, "border" : "TOSHAL3A.bmp", "area" : "TZSHAL3A.bmp" },
"capitol": { "id" : 13, "animation" : "TBSTHAL4.def", "x" : 0, "y" : 148, "border" : "TOSHAL4A.bmp", "area" : "TZSHAL4A.bmp" },
"marketplace": { "id" : 14, "animation" : "TBSTMARK.def", "x" : 397, "y" : 308, "z" : 1, "border" : "TOSMRK1.bmp", "area" : "TZSMRK1.bmp" },
"resourceSilo": { "id" : 15, "animation" : "TBSTSILO.def", "x" : 458, "y" : 248, "z" : 1, "border" : "TOSMRK2.bmp", "area" : "TZSMRK2.bmp" },
"blacksmith": { "id" : 16, "animation" : "TBSTBLAK.def", "x" : 660, "y" : 286, "border" : "TOSBLK1.bmp", "area" : "TZSBLK1.bmp" },
"special1": { "id" : 17, "animation" : "TBSTSPEC.def", "x" : 550, "y" : 229, "border" : "TOSCA1EA.bmp", "area" : "TZSCA1EA.bmp" },
"horde1": { "id" : 18, "animation" : "TBSTHRD1.def", "x" : 373, "y" : 239, "border" : "TOSGOB1H.bmp", "area" : "TZSGOB1H.bmp", "hidden" : true },
"horde1Upgr": { "id" : 19, "animation" : "TBSTHRD2.def", "x" : 373, "y" : 220, "border" : "TOSGOB2H.bmp", "area" : "TZSGOB2H.bmp", "hidden" : true, "builds" : 18 },
"special2": { "id" : 21, "animation" : "TBSTEXT0.def", "x" : 473, "y" : 282, "z" : 3, "border" : "TOSMRK1C.bmp", "area" : "TZSMRK1C.bmp" },
"special3": { "id" : 22, "animation" : "TBSTEXT1.def", "x" : 617, "y" : 286, "z" : 1, "border" : "TOSBLK2.bmp", "area" : "TZSBLK2.bmp" },
"special4": { "id" : 23, "animation" : "TBSTEXT2.def", "x" : 313, "y" : 13, "z" : -1, "border" : "TOSVAH.bmp", "area" : "TZSVAH.bmp" },
"grail": { "id" : 26, "animation" : "TBSTHOLY.def", "x" : 321, "y" : 105, "z" : 2, "border" : "TOSHOLYA.bmp", "area" : "TZSHOLYA.bmp" },
"dwellingLvl1": { "id" : 30, "animation" : "TBSTDW_0.def", "x" : 373, "y" : 239, "border" : "TOSGOB1.bmp", "area" : "TZSGOB1.bmp" },
"dwellingLvl2": { "id" : 31, "animation" : "TBSTDW_1.def", "x" : 266, "y" : 246, "z" : 1, "border" : "TOSWOL1.bmp", "area" : "TZSWOL1.bmp" },
"dwellingLvl3": { "id" : 32, "animation" : "TBSTDW_2.def", "x" : 566, "y" : 232, "z" : 2, "border" : "TOSORC1.bmp", "area" : "TZSORC1.bmp" },
"dwellingLvl4": { "id" : 33, "animation" : "TBSTDW_3.def", "x" : 197, "y" : 204, "border" : "TOSOGR1.bmp", "area" : "TZSOGR1.bmp" },
"dwellingLvl5": { "id" : 34, "animation" : "TBSTDW_4.def", "x" : 137, "y" : 30, "z" : -1, "border" : "TOSROC1.bmp", "area" : "TZSROC1.bmp" },
"dwellingLvl6": { "id" : 35, "animation" : "TBSTDW_5.def", "x" : 622, "y" : 160, "z" : -2, "border" : "TOSCYC1.bmp", "area" : "TZSCYC1.bmp" },
"dwellingLvl7": { "id" : 36, "animation" : "TBSTDW_6.def", "x" : 604, "y" : 0, "border" : "TOSBEH1A.bmp", "area" : "TZSBEH1A.bmp" },
"dwellingUpLvl1": { "id" : 37, "animation" : "TBSTUP_0.def", "x" : 373, "y" : 220, "border" : "TOSGOB2.bmp", "area" : "TZSGOB2.bmp" },
"dwellingUpLvl2": { "id" : 38, "animation" : "TBSTUP_1.def", "x" : 266, "y" : 225, "z" : 1, "border" : "TOSWOL2.bmp", "area" : "TZSWOL2.bmp" },
"dwellingUpLvl3": { "id" : 39, "animation" : "TBSTUP_2.def", "x" : 566, "y" : 158, "z" : 2, "border" : "TOSORC2.bmp", "area" : "TZSORC2.bmp" },
"dwellingUpLvl4": { "id" : 40, "animation" : "TBSTUP_3.def", "x" : 197, "y" : 137, "border" : "TOSOGR2.bmp", "area" : "TZSOGR2.bmp" },
"dwellingUpLvl5": { "id" : 41, "animation" : "TBSTUP_4.def", "x" : 129, "y" : 15, "z" : -1, "border" : "TOSROC2.bmp", "area" : "TZSROC2.bmp" },
"dwellingUpLvl6": { "id" : 42, "animation" : "TBSTUP_5.def", "x" : 616, "y" : 93, "z" : -2, "border" : "TOSCYC2A.bmp", "area" : "TZSCYC2A.bmp" },
"dwellingUpLvl7": { "id" : 43, "animation" : "TBSTUP_6.def", "x" : 604, "y" : 0, "border" : "TOSBEH2A.bmp", "area" : "TZSBEH2A.bmp" }
},
"icons" :
{
"village" : {"normal" : 30, "built" : 31 },
@ -147,48 +147,50 @@
"moatDamage" : 70,
"buildings" :
[
{ "id" : 0 },
{ "id" : 1, "upgrades" : 0 },
{ "id" : 2, "upgrades" : 1 },
{ "id" : 3, "upgrades" : 2 },
{ "id" : 4, "upgrades" : 3 },
{ "id" : 5 },
{ "id" : 7 },
{ "id" : 8, "upgrades" : 7 },
{ "id" : 9, "upgrades" : 8 },
{ "id" : 10, "mode" : "auto" },
{ "id" : 11, "upgrades" : 10, "requires" : [ 5 ] },
{ "id" : 12, "upgrades" : 11, "requires" : [ 0, 14, 16 ] },
{ "id" : 13, "upgrades" : 12, "requires" : [ 9 ] },
{ "id" : 14 },
{ "id" : 15, "requires" : [ 14 ] },
{ "id" : 16 },
{ "id" : 17, "requires" : [ 7 ] },
{ "id" : 18, "upgrades" : 30 },
{ "id" : 19, "upgrades" : 37, "requires" : [ 18 ], "mode" : "auto" },
{ "id" : 21, "requires" : [ 14 ] },
{ "id" : 22, "requires" : [ 16 ] },
{ "id" : 23, "requires" : [ 7 ] },
{ "id" : 26, "mode" : "grail"},
{ "id" : 27, "requires" : [ 11 ], "mode" : "auto" },
{ "id" : 28, "requires" : [ 12 ], "mode" : "auto" },
{ "id" : 29, "requires" : [ 13 ], "mode" : "auto" },
{ "id" : 30, "requires" : [ 7 ] },
{ "id" : 31, "requires" : [ 30 ] },
{ "id" : 32, "requires" : [ 30 ] },
{ "id" : 33, "requires" : [ 32 ] },
{ "id" : 34, "requires" : [ 31 ] },
{ "id" : 35, "requires" : [ 33 ] },
{ "id" : 36, "requires" : [ 34 ] },
{ "id" : 37, "upgrades" : 30 },
{ "id" : 38, "upgrades" : 31, "requires" : [ 37 ] },
{ "id" : 39, "upgrades" : 32, "requires" : [ 16 ] },
{ "id" : 40, "upgrades" : 33, "requires" : [ 0 ] },
{ "id" : 41, "upgrades" : 34 },
{ "id" : 42, "upgrades" : 35 },
{ "id" : 43, "upgrades" : 36 }
],
{
"mageGuild1": { "id" : 0 },
"mageGuild2": { "id" : 1, "upgrades" : 0 },
"mageGuild3": { "id" : 2, "upgrades" : 1 },
"tavern": { "id" : 5 },
"fort": { "id" : 7 },
"citadel": { "id" : 8, "upgrades" : 7 },
"castle": { "id" : 9, "upgrades" : 8 },
"villageHall": { "id" : 10, "mode" : "auto" },
"townHall": { "id" : 11, "upgrades" : 10, "requires" : [ 5 ] },
"cityHall": { "id" : 12, "upgrades" : 11, "requires" : [ 0, 14, 16 ] },
"capitol": { "id" : 13, "upgrades" : 12, "requires" : [ 9 ] },
"marketplace": { "id" : 14 },
"resourceSilo": { "id" : 15, "requires" : [ 14 ] },
"blacksmith": { "id" : 16 },
"special1": { "id" : 17, "requires" : [ 7 ] },
"horde1": { "id" : 18, "upgrades" : 30 },
"horde1Upgr": { "id" : 19, "upgrades" : 37, "requires" : [ 18 ], "mode" : "auto" },
"special2": { "id" : 21, "requires" : [ 14 ] },
"special3": { "id" : 22, "requires" : [ 16 ] },
"special4": { "id" : 23, "requires" : [ 7 ] },
"grail": { "id" : 26, "mode" : "grail"},
"dwellingLvl1": { "id" : 30, "requires" : [ 7 ] },
"dwellingLvl2": { "id" : 31, "requires" : [ 30 ] },
"dwellingLvl3": { "id" : 32, "requires" : [ 30 ] },
"dwellingLvl4": { "id" : 33, "requires" : [ 32 ] },
"dwellingLvl5": { "id" : 34, "requires" : [ 31 ] },
"dwellingLvl6": { "id" : 35, "requires" : [ 33 ] },
"dwellingLvl7": { "id" : 36, "requires" : [ 34 ] },
"dwellingUpLvl1": { "id" : 37, "upgrades" : 30 },
"dwellingUpLvl2": { "id" : 38, "upgrades" : 31, "requires" : [ 37 ] },
"dwellingUpLvl3": { "id" : 39, "upgrades" : 32, "requires" : [ 16 ] },
"dwellingUpLvl4": { "id" : 40, "upgrades" : 33, "requires" : [ 0 ] },
"dwellingUpLvl5": { "id" : 41, "upgrades" : 34 },
"dwellingUpLvl6": { "id" : 42, "upgrades" : 35 },
"dwellingUpLvl7": { "id" : 43, "upgrades" : 36 },
"horde2" : null,
"horde2Upgr" : null,
"mageGuild4" : null,
"mageGuild5" : null,
"ship" : null,
"shipyard" : null
},
"siege" :
{

View File

@ -74,45 +74,45 @@
"capitol" : "AVCTOWZ0.DEF"
},
"structures" :
[
{ "id" : 0, "animation" : "TBTWMAGE.def", "x" : 597, "y" : 82, "border" : "TOTGLD1.bmp", "area" : "TZTGLD1.bmp" },
{ "id" : 1, "animation" : "TBTWMAG2.def", "x" : 593, "y" : 65, "border" : "TOTGLD2.bmp", "area" : "TZTGLD2.bmp" },
{ "id" : 2, "animation" : "TBTWMAG3.def", "x" : 593, "y" : 48, "border" : "TOTGLD3.bmp", "area" : "TZTGLD3.bmp" },
{ "id" : 3, "animation" : "TBTWMAG4.def", "x" : 593, "y" : 31, "border" : "TOTGLD4.bmp", "area" : "TZTGLD4.bmp" },
{ "id" : 4, "animation" : "TBTWMAG5.def", "x" : 593, "y" : 14, "border" : "TOTGLD5.bmp", "area" : "TZTGLD5.bmp" },
{ "id" : 5, "animation" : "TBTWTVRN.def", "x" : 375, "y" : 278, "z" : 1, "border" : "TOTTAV.bmp", "area" : "TZTTAV.bmp" },
{ "id" : 7, "animation" : "TBTWCSTL.def", "x" : 304, "y" : 0, "border" : "TOTCAS1.bmp", "area" : "TZTCAS1.bmp" },
{ "id" : 8, "animation" : "TBTWCAS2.def", "x" : 301, "y" : 0, "border" : "TOTCAS2.bmp", "area" : "TZTCAS2.bmp" },
{ "id" : 9, "animation" : "TBTWCAS3.def", "x" : 301, "y" : 0, "border" : "TOTCAS3.bmp", "area" : "TZTCAS3.bmp" },
{ "id" : 10, "animation" : "TBTWHALL.def", "x" : 0, "y" : 259, "z" : 1, "border" : "TOTHAL1.bmp", "area" : "TZTHAL1.bmp" },
{ "id" : 11, "animation" : "TBTWHAL2.def", "x" : 0, "y" : 220, "z" : 1, "border" : "TOTHAL2.bmp", "area" : "TZTHAL2.bmp" },
{ "id" : 12, "animation" : "TBTWHAL3.def", "x" : 0, "y" : 82, "z" : 1, "border" : "TOTHAL3.bmp", "area" : "TZTHAL3.bmp" },
{ "id" : 13, "animation" : "TBTWHAL4.def", "x" : 0, "y" : 82, "z" : 1, "border" : "TOTHAL4.bmp", "area" : "TZTHAL4.bmp" },
{ "id" : 14, "animation" : "TBTWMARK.def", "x" : 614, "y" : 292, "border" : "TOTMRK.bmp", "area" : "TZTMRK.bmp" },
{ "id" : 15, "animation" : "TBTWSILO.def", "x" : 763, "y" : 214, "z" : 3, "border" : "TOTMRKS.bmp", "area" : "TZTMRKS.bmp" },
{ "id" : 16, "animation" : "TBTWBLAK.def", "x" : 478, "y" : 211, "border" : "TOTBLKA.bmp", "area" : "TZTBLKA.bmp" },
{ "id" : 17, "animation" : "TBTWSPEC.def", "x" : 674, "y" : 276, "z" : 2, "border" : "TOTMRKA.bmp", "area" : "TZTMRKA.bmp" },
{ "id" : 18, "animation" : "TBTWHRD1.def", "x" : 0, "y" : 47, "border" : "TOTGAR1H.bmp", "area" : "TZTGAR1H.bmp", "hidden" : true },
{ "id" : 19, "animation" : "TBTWHRD2.def", "x" : 0, "y" : 28, "border" : "TOTGAR2H.bmp", "area" : "TZTGAR2H.bmp", "hidden" : true, "builds" : 18 },
{ "id" : 21, "animation" : "TBTWEXT0.def", "x" : 409, "y" : 82, "border" : "TOTCASW.bmp", "area" : "TZTCASW.bmp" },
{ "id" : 22, "animation" : "TBTWEXT1.def", "x" : 702, "y" : 115, "border" : "TOTGLDL.bmp", "area" : "TZTGLDL.bmp" },
{ "id" : 23, "animation" : "TBTWEXT2.def", "x" : 592, "y" : 189, "z" : 1, "border" : "TOTGLDW.bmp", "area" : "TZTGLDW.bmp" },
{ "id" : 26, "animation" : "TBTWHOLY.def", "x" : 237, "y" : 14, "z" : -1, "border" : "TOTHOLYA.bmp", "area" : "TZTHOLYA.bmp" },
{ "id" : 30, "animation" : "TBTWDW_0.def", "x" : 453, "y" : 221, "z" : 1, "border" : "TOTGRM1A.bmp", "area" : "TZTGRM1A.bmp" },
{ "id" : 31, "animation" : "TBTWDW_1.def", "x" : 4, "y" : 46, "border" : "TOTGAR1.bmp", "area" : "TZTGAR1.bmp" },
{ "id" : 32, "animation" : "TBTWDW_2.def", "x" : 209, "y" : 177, "z" : 1, "border" : "TOTGOL1A.bmp", "area" : "TZTGOL1A.bmp" },
{ "id" : 33, "animation" : "TBTWDW_3.def", "x" : 613, "y" : 95, "border" : "TOTMAG1.bmp", "area" : "TZTMAG1.bmp" },
{ "id" : 34, "animation" : "TBTWDW_4.def", "x" : 511, "y" : 75, "border" : "TOTGEN1.bmp", "area" : "TZTGEN1.bmp" },
{ "id" : 35, "animation" : "TBTWDW_5.def", "x" : 681, "y" : 208, "z" : 2, "border" : "TOTNAG1.bmp", "area" : "TZTNAG1.bmp" },
{ "id" : 36, "animation" : "TBTWDW_6.def", "x" : 75, "y" : 144, "z" : -1, "border" : "TOTTIT1.bmp", "area" : "TZTTIT1.bmp" },
{ "id" : 37, "animation" : "TBTWUP_0.def", "x" : 446, "y" : 221, "z" : 1, "border" : "TOTGRM2A.bmp", "area" : "TZTGRM2A.bmp" },
{ "id" : 38, "animation" : "TBTWUP_1.def", "x" : 4, "y" : 28, "border" : "TOTGAR2.bmp", "area" : "TZTGAR2.bmp" },
{ "id" : 39, "animation" : "TBTWUP_2.def", "x" : 209, "y" : 177, "z" : 1, "border" : "TOTGOL2A.bmp", "area" : "TZTGOL2A.bmp" },
{ "id" : 40, "animation" : "TBTWUP_3.def", "x" : 613, "y" : 74, "border" : "TOTMAG2.bmp", "area" : "TZTMAG2.bmp" },
{ "id" : 41, "animation" : "TBTWUP_4.def", "x" : 511, "y" : 8, "border" : "TOTGEN2.bmp", "area" : "TZTGEN2.bmp" },
{ "id" : 42, "animation" : "TBTWUP_5.def", "x" : 681, "y" : 157, "z" : 2, "border" : "TOTNAG2.bmp", "area" : "TZTNAG2.bmp" },
{ "id" : 43, "animation" : "TBTWUP_6.def", "x" : 75, "y" : 91, "z" : -1, "border" : "TOTTIT2.bmp", "area" : "TZTTIT2.bmp" }
],
{
"mageGuild1": { "id" : 0, "animation" : "TBTWMAGE.def", "x" : 597, "y" : 82, "border" : "TOTGLD1.bmp", "area" : "TZTGLD1.bmp" },
"mageGuild2": { "id" : 1, "animation" : "TBTWMAG2.def", "x" : 593, "y" : 65, "border" : "TOTGLD2.bmp", "area" : "TZTGLD2.bmp" },
"mageGuild3": { "id" : 2, "animation" : "TBTWMAG3.def", "x" : 593, "y" : 48, "border" : "TOTGLD3.bmp", "area" : "TZTGLD3.bmp" },
"mageGuild4": { "id" : 3, "animation" : "TBTWMAG4.def", "x" : 593, "y" : 31, "border" : "TOTGLD4.bmp", "area" : "TZTGLD4.bmp" },
"mageGuild5": { "id" : 4, "animation" : "TBTWMAG5.def", "x" : 593, "y" : 14, "border" : "TOTGLD5.bmp", "area" : "TZTGLD5.bmp" },
"tavern": { "id" : 5, "animation" : "TBTWTVRN.def", "x" : 375, "y" : 278, "z" : 1, "border" : "TOTTAV.bmp", "area" : "TZTTAV.bmp" },
"fort": { "id" : 7, "animation" : "TBTWCSTL.def", "x" : 304, "y" : 0, "border" : "TOTCAS1.bmp", "area" : "TZTCAS1.bmp" },
"citadel": { "id" : 8, "animation" : "TBTWCAS2.def", "x" : 301, "y" : 0, "border" : "TOTCAS2.bmp", "area" : "TZTCAS2.bmp" },
"castle": { "id" : 9, "animation" : "TBTWCAS3.def", "x" : 301, "y" : 0, "border" : "TOTCAS3.bmp", "area" : "TZTCAS3.bmp" },
"villageHall": { "id" : 10, "animation" : "TBTWHALL.def", "x" : 0, "y" : 259, "z" : 1, "border" : "TOTHAL1.bmp", "area" : "TZTHAL1.bmp" },
"townHall": { "id" : 11, "animation" : "TBTWHAL2.def", "x" : 0, "y" : 220, "z" : 1, "border" : "TOTHAL2.bmp", "area" : "TZTHAL2.bmp" },
"cityHall": { "id" : 12, "animation" : "TBTWHAL3.def", "x" : 0, "y" : 82, "z" : 1, "border" : "TOTHAL3.bmp", "area" : "TZTHAL3.bmp" },
"capitol": { "id" : 13, "animation" : "TBTWHAL4.def", "x" : 0, "y" : 82, "z" : 1, "border" : "TOTHAL4.bmp", "area" : "TZTHAL4.bmp" },
"marketplace": { "id" : 14, "animation" : "TBTWMARK.def", "x" : 614, "y" : 292, "border" : "TOTMRK.bmp", "area" : "TZTMRK.bmp" },
"resourceSilo": { "id" : 15, "animation" : "TBTWSILO.def", "x" : 763, "y" : 214, "z" : 3, "border" : "TOTMRKS.bmp", "area" : "TZTMRKS.bmp" },
"blacksmith": { "id" : 16, "animation" : "TBTWBLAK.def", "x" : 478, "y" : 211, "border" : "TOTBLKA.bmp", "area" : "TZTBLKA.bmp" },
"special1": { "id" : 17, "animation" : "TBTWSPEC.def", "x" : 674, "y" : 276, "z" : 2, "border" : "TOTMRKA.bmp", "area" : "TZTMRKA.bmp" },
"horde1": { "id" : 18, "animation" : "TBTWHRD1.def", "x" : 0, "y" : 47, "border" : "TOTGAR1H.bmp", "area" : "TZTGAR1H.bmp", "hidden" : true },
"horde1Upgr": { "id" : 19, "animation" : "TBTWHRD2.def", "x" : 0, "y" : 28, "border" : "TOTGAR2H.bmp", "area" : "TZTGAR2H.bmp", "hidden" : true, "builds" : 18 },
"special2": { "id" : 21, "animation" : "TBTWEXT0.def", "x" : 409, "y" : 82, "border" : "TOTCASW.bmp", "area" : "TZTCASW.bmp" },
"special3": { "id" : 22, "animation" : "TBTWEXT1.def", "x" : 702, "y" : 115, "border" : "TOTGLDL.bmp", "area" : "TZTGLDL.bmp" },
"special4": { "id" : 23, "animation" : "TBTWEXT2.def", "x" : 592, "y" : 189, "z" : 1, "border" : "TOTGLDW.bmp", "area" : "TZTGLDW.bmp" },
"grail": { "id" : 26, "animation" : "TBTWHOLY.def", "x" : 237, "y" : 14, "z" : -1, "border" : "TOTHOLYA.bmp", "area" : "TZTHOLYA.bmp" },
"dwellingLvl1": { "id" : 30, "animation" : "TBTWDW_0.def", "x" : 453, "y" : 221, "z" : 1, "border" : "TOTGRM1A.bmp", "area" : "TZTGRM1A.bmp" },
"dwellingLvl2": { "id" : 31, "animation" : "TBTWDW_1.def", "x" : 4, "y" : 46, "border" : "TOTGAR1.bmp", "area" : "TZTGAR1.bmp" },
"dwellingLvl3": { "id" : 32, "animation" : "TBTWDW_2.def", "x" : 209, "y" : 177, "z" : 1, "border" : "TOTGOL1A.bmp", "area" : "TZTGOL1A.bmp" },
"dwellingLvl4": { "id" : 33, "animation" : "TBTWDW_3.def", "x" : 613, "y" : 95, "border" : "TOTMAG1.bmp", "area" : "TZTMAG1.bmp" },
"dwellingLvl5": { "id" : 34, "animation" : "TBTWDW_4.def", "x" : 511, "y" : 75, "border" : "TOTGEN1.bmp", "area" : "TZTGEN1.bmp" },
"dwellingLvl6": { "id" : 35, "animation" : "TBTWDW_5.def", "x" : 681, "y" : 208, "z" : 2, "border" : "TOTNAG1.bmp", "area" : "TZTNAG1.bmp" },
"dwellingLvl7": { "id" : 36, "animation" : "TBTWDW_6.def", "x" : 75, "y" : 144, "z" : -1, "border" : "TOTTIT1.bmp", "area" : "TZTTIT1.bmp" },
"dwellingUpLvl1": { "id" : 37, "animation" : "TBTWUP_0.def", "x" : 446, "y" : 221, "z" : 1, "border" : "TOTGRM2A.bmp", "area" : "TZTGRM2A.bmp" },
"dwellingUpLvl2": { "id" : 38, "animation" : "TBTWUP_1.def", "x" : 4, "y" : 28, "border" : "TOTGAR2.bmp", "area" : "TZTGAR2.bmp" },
"dwellingUpLvl3": { "id" : 39, "animation" : "TBTWUP_2.def", "x" : 209, "y" : 177, "z" : 1, "border" : "TOTGOL2A.bmp", "area" : "TZTGOL2A.bmp" },
"dwellingUpLvl4": { "id" : 40, "animation" : "TBTWUP_3.def", "x" : 613, "y" : 74, "border" : "TOTMAG2.bmp", "area" : "TZTMAG2.bmp" },
"dwellingUpLvl5": { "id" : 41, "animation" : "TBTWUP_4.def", "x" : 511, "y" : 8, "border" : "TOTGEN2.bmp", "area" : "TZTGEN2.bmp" },
"dwellingUpLvl6": { "id" : 42, "animation" : "TBTWUP_5.def", "x" : 681, "y" : 157, "z" : 2, "border" : "TOTNAG2.bmp", "area" : "TZTNAG2.bmp" },
"dwellingUpLvl7": { "id" : 43, "animation" : "TBTWUP_6.def", "x" : 75, "y" : 91, "z" : -1, "border" : "TOTTIT2.bmp", "area" : "TZTTIT2.bmp" }
},
"icons" :
{
"village" : {"normal" : 22, "built" : 23 },
@ -150,48 +150,50 @@
"moatDamage" : -1,
"buildings" :
[
{ "id" : 0 },
{ "id" : 1, "upgrades" : 0 },
{ "id" : 2, "upgrades" : 1 },
{ "id" : 3, "upgrades" : 2 },
{ "id" : 4, "upgrades" : 3 },
{ "id" : 5 },
{ "id" : 7 },
{ "id" : 8, "upgrades" : 7 },
{ "id" : 9, "upgrades" : 8 },
{ "id" : 10, "mode" : "auto" },
{ "id" : 11, "upgrades" : 10, "requires" : [ 5 ] },
{ "id" : 12, "upgrades" : 11, "requires" : [ 0, 14, 16 ] },
{ "id" : 13, "upgrades" : 12, "requires" : [ 9 ] },
{ "id" : 14 },
{ "id" : 15, "requires" : [ 14 ] },
{ "id" : 16 },
{ "id" : 17, "requires" : [ 14 ] },
{ "id" : 18, "upgrades" : 31 },
{ "id" : 19, "upgrades" : 38, "requires" : [ 18 ], "mode" : "auto" },
{ "id" : 21, "requires" : [ 7 ] },
{ "id" : 22, "requires" : [ 0 ] },
{ "id" : 23, "requires" : [ 0 ] },
{ "id" : 26, "mode" : "grail"},
{ "id" : 27, "requires" : [ 11 ], "mode" : "auto" },
{ "id" : 28, "requires" : [ 12 ], "mode" : "auto" },
{ "id" : 29, "requires" : [ 13 ], "mode" : "auto" },
{ "id" : 30, "requires" : [ 7 ] },
{ "id" : 31, "requires" : [ 30 ] },
{ "id" : 32, "requires" : [ 30 ] },
{ "id" : 33, "requires" : [ 0, 31, 32 ] },
{ "id" : 34, "requires" : [ 33 ] },
{ "id" : 35, "requires" : [ 33 ] },
{ "id" : 36, "requires" : [ 34, 35 ] },
{ "id" : 37, "upgrades" : 30 },
{ "id" : 38, "upgrades" : 31 },
{ "id" : 39, "upgrades" : 32 },
{ "id" : 40, "upgrades" : 33, "requires" : [ 22 ] },
{ "id" : 41, "upgrades" : 34 },
{ "id" : 42, "upgrades" : 35 },
{ "id" : 43, "upgrades" : 36 }
],
{
"mageGuild1": { "id" : 0 },
"mageGuild2": { "id" : 1, "upgrades" : 0 },
"mageGuild3": { "id" : 2, "upgrades" : 1 },
"mageGuild4": { "id" : 3, "upgrades" : 2 },
"mageGuild5": { "id" : 4, "upgrades" : 3 },
"tavern": { "id" : 5 },
"fort": { "id" : 7 },
"citadel": { "id" : 8, "upgrades" : 7 },
"castle": { "id" : 9, "upgrades" : 8 },
"villageHall": { "id" : 10, "mode" : "auto" },
"townHall": { "id" : 11, "upgrades" : 10, "requires" : [ 5 ] },
"cityHall": { "id" : 12, "upgrades" : 11, "requires" : [ 0, 14, 16 ] },
"capitol": { "id" : 13, "upgrades" : 12, "requires" : [ 9 ] },
"marketplace": { "id" : 14 },
"resourceSilo": { "id" : 15, "requires" : [ 14 ] },
"blacksmith": { "id" : 16 },
"special1": { "id" : 17, "requires" : [ 14 ] },
"horde1": { "id" : 18, "upgrades" : 31 },
"horde1Upgr": { "id" : 19, "upgrades" : 38, "requires" : [ 18 ], "mode" : "auto" },
"special2": { "id" : 21, "requires" : [ 7 ] },
"special3": { "id" : 22, "requires" : [ 0 ] },
"special4": { "id" : 23, "requires" : [ 0 ] },
"grail": { "id" : 26, "mode" : "grail"},
"dwellingLvl1": { "id" : 30, "requires" : [ 7 ] },
"dwellingLvl2": { "id" : 31, "requires" : [ 30 ] },
"dwellingLvl3": { "id" : 32, "requires" : [ 30 ] },
"dwellingLvl4": { "id" : 33, "requires" : [ 0, 31, 32 ] },
"dwellingLvl5": { "id" : 34, "requires" : [ 33 ] },
"dwellingLvl6": { "id" : 35, "requires" : [ 33 ] },
"dwellingLvl7": { "id" : 36, "requires" : [ 34, 35 ] },
"dwellingUpLvl1": { "id" : 37, "upgrades" : 30 },
"dwellingUpLvl2": { "id" : 38, "upgrades" : 31 },
"dwellingUpLvl3": { "id" : 39, "upgrades" : 32 },
"dwellingUpLvl4": { "id" : 40, "upgrades" : 33, "requires" : [ 22 ] },
"dwellingUpLvl5": { "id" : 41, "upgrades" : 34 },
"dwellingUpLvl6": { "id" : 42, "upgrades" : 35 },
"dwellingUpLvl7": { "id" : 43, "upgrades" : 36 },
"horde2" : null,
"horde2Upgr" : null,
"ship" : null,
"shipyard" : null
},
"siege" :
{

View File

@ -45,7 +45,17 @@
"config/heroes/conflux.json",
"config/heroes/special.json"
],
"artifacts" :
[
"config/artifacts.json"
],
"heroClasses" :
[
"config/heroClasses.json"
],
"bonuses" :
[
"config/bonuses.json",

View File

@ -1,7 +1,7 @@
{
"knight":
{
"id": 0,
"index": 0,
"faction" : "castle",
"animation":
{
@ -11,7 +11,7 @@
},
"cleric" :
{
"id": 1,
"index": 1,
"faction" : "castle",
"animation":
{
@ -21,7 +21,7 @@
},
"ranger" :
{
"id": 2,
"index": 2,
"faction" : "rampart",
"animation":
{
@ -31,7 +31,7 @@
},
"druid" :
{
"id": 3,
"index": 3,
"faction" : "rampart",
"animation":
{
@ -41,7 +41,7 @@
},
"alchemist" :
{
"id": 4,
"index": 4,
"faction" : "tower",
"animation":
{
@ -51,7 +51,7 @@
},
"wizard" :
{
"id": 5,
"index": 5,
"faction" : "tower",
"animation":
{
@ -61,7 +61,7 @@
},
"demoniac" :
{
"id": 6,
"index": 6,
"faction" : "inferno",
"animation":
{
@ -71,7 +71,7 @@
},
"heretic" :
{
"id": 7,
"index": 7,
"faction" : "inferno",
"animation":
{
@ -81,7 +81,7 @@
},
"deathknight" :
{
"id": 8,
"index": 8,
"faction" : "necropolis",
"animation":
{
@ -91,7 +91,7 @@
},
"necromancer" :
{
"id": 9,
"index": 9,
"faction" : "necropolis",
"animation":
{
@ -101,7 +101,7 @@
},
"warlock" :
{
"id": 10,
"index": 10,
"faction" : "dungeon",
"animation":
{
@ -111,7 +111,7 @@
},
"overlord" :
{
"id": 11,
"index": 11,
"faction" : "dungeon",
"animation":
{
@ -121,7 +121,7 @@
},
"barbarian" :
{
"id": 12,
"index": 12,
"faction" : "stronghold",
"animation":
{
@ -131,7 +131,7 @@
},
"battlemage" :
{
"id": 13,
"index": 13,
"faction" : "stronghold",
"animation":
{
@ -141,7 +141,7 @@
},
"beastmaster" :
{
"id": 14,
"index": 14,
"faction" : "fortress",
"animation":
{
@ -151,7 +151,7 @@
},
"witch" :
{
"id": 15,
"index": 15,
"faction" : "fortress",
"animation":
{
@ -161,7 +161,7 @@
},
"planeswalker" :
{
"id": 16,
"index": 16,
"faction" : "conflux",
"animation":
{
@ -171,7 +171,7 @@
},
"elementalist" :
{
"id": 17,
"index": 17,
"faction" : "conflux",
"animation":
{

View File

@ -1,7 +1,7 @@
{
"orrin":
{
"id": 0,
"index": 0,
"class" : "knight",
"female": false,
"skills":
@ -16,7 +16,7 @@
},
"valeska":
{
"id": 1,
"index": 1,
"class" : "knight",
"female": true,
"skills":
@ -31,7 +31,7 @@
},
"edric":
{
"id": 2,
"index": 2,
"class" : "knight",
"female": false,
"skills":
@ -46,7 +46,7 @@
},
"sylvia":
{
"id": 3,
"index": 3,
"class" : "knight",
"female": true,
"skills":
@ -61,7 +61,7 @@
},
"lordHaart":
{
"id": 4,
"index": 4,
"class" : "knight",
"female": false,
"special" : true, // Lord Haart in his living form. Disabled in H3 expansions
@ -77,7 +77,7 @@
},
"sorsha":
{
"id": 5,
"index": 5,
"class" : "knight",
"female": true,
"skills":
@ -92,7 +92,7 @@
},
"christian":
{
"id": 6,
"index": 6,
"class" : "knight",
"female": false,
"skills":
@ -107,7 +107,7 @@
},
"tyris":
{
"id": 7,
"index": 7,
"class" : "knight",
"female": true,
"skills":
@ -122,7 +122,7 @@
},
"rion":
{
"id": 8,
"index": 8,
"class" : "cleric",
"female": false,
"spellbook": [ "stoneSkin" ],
@ -138,7 +138,7 @@
},
"adela":
{
"id": 9,
"index": 9,
"class" : "cleric",
"female": true,
"spellbook": [ "bless" ],
@ -154,7 +154,7 @@
},
"cuthbert":
{
"id": 10,
"index": 10,
"class" : "cleric",
"female": false,
"spellbook": [ "weakness" ],
@ -170,7 +170,7 @@
},
"adelaide":
{
"id": 11,
"index": 11,
"class" : "cleric",
"female": true,
"spellbook": [ "frostRing" ],
@ -185,7 +185,7 @@
},
"ingham":
{
"id": 12,
"index": 12,
"class" : "cleric",
"female": false,
"spellbook": [ "curse" ],
@ -201,7 +201,7 @@
},
"sanya":
{
"id": 13,
"index": 13,
"class" : "cleric",
"female": true,
"spellbook": [ "dispel" ],
@ -217,7 +217,7 @@
},
"loynis":
{
"id": 14,
"index": 14,
"class" : "cleric",
"spellbook": [ "prayer" ],
"female": false,
@ -233,7 +233,7 @@
},
"caitlin":
{
"id": 15,
"index": 15,
"class" : "cleric",
"female": true,
"spellbook": [ "cure" ],

View File

@ -1,7 +1,7 @@
{
"pasis":
{
"id": 128,
"index": 128,
"class" : "planeswalker",
"female": true,
"skills":
@ -17,7 +17,7 @@
},
"thunar":
{
"id": 129,
"index": 129,
"class" : "planeswalker",
"female": true,
"skills":
@ -34,7 +34,7 @@
},
"ignissa":
{
"id": 130,
"index": 130,
"class" : "planeswalker",
"female": true,
"skills":
@ -51,7 +51,7 @@
},
"lacus":
{
"id": 131,
"index": 131,
"class" : "planeswalker",
"female": true,
"skills":
@ -65,7 +65,7 @@
},
"monere":
{
"id": 132,
"index": 132,
"class" : "planeswalker",
"female": false,
"skills":
@ -81,7 +81,7 @@
},
"erdamon":
{
"id": 133,
"index": 133,
"class" : "planeswalker",
"female": false,
"skills":
@ -98,7 +98,7 @@
},
"fiur":
{
"id": 134,
"index": 134,
"class" : "planeswalker",
"female": false,
"skills":
@ -114,7 +114,7 @@
},
"kalt":
{
"id": 135,
"index": 135,
"class" : "planeswalker",
"female": false,
"skills":
@ -129,7 +129,7 @@
},
"luna":
{
"id": 136,
"index": 136,
"class" : "elementalist",
"spellbook": [ "fireWall" ],
"female": true,
@ -145,7 +145,7 @@
},
"brissa":
{
"id": 137,
"index": 137,
"class" : "elementalist",
"female": true,
"spellbook": [ "haste" ],
@ -161,7 +161,7 @@
},
"ciele":
{
"id": 138,
"index": 138,
"class" : "elementalist",
"female": true,
"spellbook": [ "magicArrow" ],
@ -177,7 +177,7 @@
},
"labetha":
{
"id": 139,
"index": 139,
"class" : "elementalist",
"female": true,
"spellbook": [ "stoneSkin" ],
@ -193,7 +193,7 @@
},
"inteus":
{
"id": 140,
"index": 140,
"class" : "elementalist",
"female": false,
"spellbook": [ "bloodlust" ],
@ -209,7 +209,7 @@
},
"aenain":
{
"id": 141,
"index": 141,
"class" : "elementalist",
"female": false,
"spellbook": [ "disruptingRay" ],
@ -225,7 +225,7 @@
},
"gelare":
{
"id": 142,
"index": 142,
"class" : "elementalist",
"female": false,
"spellbook": [ "dispel" ],
@ -241,7 +241,7 @@
},
"grindan":
{
"id": 143,
"index": 143,
"class" : "elementalist",
"female": false,
"spellbook": [ "slow" ],

View File

@ -1,7 +1,7 @@
{
"lorelei":
{
"id": 80,
"index": 80,
"class" : "warlock",
"female": true,
"skills":
@ -16,7 +16,7 @@
},
"arlach":
{
"id": 81,
"index": 81,
"class" : "warlock",
"female": false,
"skills":
@ -31,7 +31,7 @@
},
"dace":
{
"id": 82,
"index": 82,
"class" : "warlock",
"female": false,
"skills":
@ -46,7 +46,7 @@
},
"ajit":
{
"id": 83,
"index": 83,
"class" : "warlock",
"female": false,
"skills":
@ -61,7 +61,7 @@
},
"damacon":
{
"id": 84,
"index": 84,
"class" : "warlock",
"female": false,
"skills":
@ -75,7 +75,7 @@
},
"gunnar":
{
"id": 85,
"index": 85,
"class" : "warlock",
"female": false,
"skills":
@ -90,7 +90,7 @@
},
"synca":
{
"id": 86,
"index": 86,
"class" : "warlock",
"female": true,
"skills":
@ -105,7 +105,7 @@
},
"shakti":
{
"id": 87,
"index": 87,
"class" : "warlock",
"female": false,
"skills":
@ -120,7 +120,7 @@
},
"alamar":
{
"id": 88,
"index": 88,
"class" : "overlord",
"spellbook": [ "resurrection" ],
"female": false,
@ -136,7 +136,7 @@
},
"jaegar":
{
"id": 89,
"index": 89,
"class" : "overlord",
"female": false,
"spellbook": [ "shield" ],
@ -152,7 +152,7 @@
},
"malekith":
{
"id": 90,
"index": 90,
"class" : "overlord",
"female": false,
"spellbook": [ "bloodlust" ],
@ -168,7 +168,7 @@
},
"jeddite":
{
"id": 91,
"index": 91,
"class" : "overlord",
"female": true,
"spellbook": [ "resurrection" ],
@ -183,7 +183,7 @@
},
"geon":
{
"id": 92,
"index": 92,
"class" : "overlord",
"female": false,
"spellbook": [ "slow" ],
@ -199,7 +199,7 @@
},
"deemer":
{
"id": 93,
"index": 93,
"class" : "overlord",
"female": false,
"spellbook": [ "meteorShower" ],
@ -215,7 +215,7 @@
},
"sephinroth":
{
"id": 94,
"index": 94,
"class" : "overlord",
"female": true,
"spellbook": [ "protectAir" ],
@ -231,7 +231,7 @@
},
"darkstorn":
{
"id": 95,
"index": 95,
"class" : "overlord",
"female": false,
"spellbook": [ "stoneSkin" ],

View File

@ -1,7 +1,7 @@
{
"bron":
{
"id": 112,
"index": 112,
"class" : "beastmaster",
"female": false,
"skills":
@ -16,7 +16,7 @@
},
"drakon":
{
"id": 113,
"index": 113,
"class" : "beastmaster",
"female": false,
"skills":
@ -31,7 +31,7 @@
},
"wystan":
{
"id": 114,
"index": 114,
"class" : "beastmaster",
"female": false,
"skills":
@ -46,7 +46,7 @@
},
"tazar":
{
"id": 115,
"index": 115,
"class" : "beastmaster",
"female": false,
"skills":
@ -60,7 +60,7 @@
},
"alkin":
{
"id": 116,
"index": 116,
"class" : "beastmaster",
"female": false,
"skills":
@ -75,7 +75,7 @@
},
"korbac":
{
"id": 117,
"index": 117,
"class" : "beastmaster",
"female": false,
"skills":
@ -90,7 +90,7 @@
},
"gerwulf":
{
"id": 118,
"index": 118,
"class" : "beastmaster",
"female": false,
"skills":
@ -105,7 +105,7 @@
},
"broghild":
{
"id": 119,
"index": 119,
"class" : "beastmaster",
"female": false,
"skills":
@ -120,7 +120,7 @@
},
"mirlanda":
{
"id": 120,
"index": 120,
"class" : "witch",
"spellbook": [ "weakness" ],
"female": true,
@ -135,7 +135,7 @@
},
"rosic":
{
"id": 121,
"index": 121,
"class" : "witch",
"female": true,
"spellbook": [ "magicArrow" ],
@ -151,7 +151,7 @@
},
"voy":
{
"id": 122,
"index": 122,
"class" : "witch",
"female": true,
"spellbook": [ "slow" ],
@ -167,7 +167,7 @@
},
"verdish":
{
"id": 123,
"index": 123,
"class" : "witch",
"female": true,
"spellbook": [ "protectFire" ],
@ -183,7 +183,7 @@
},
"merist":
{
"id": 124,
"index": 124,
"class" : "witch",
"female": true,
"spellbook": [ "stoneSkin" ],
@ -199,7 +199,7 @@
},
"styg":
{
"id": 125,
"index": 125,
"class" : "witch",
"female": true,
"spellbook": [ "shield" ],
@ -215,7 +215,7 @@
},
"andra":
{
"id": 126,
"index": 126,
"class" : "witch",
"female": true,
"spellbook": [ "dispel" ],
@ -231,7 +231,7 @@
},
"tiva":
{
"id": 127,
"index": 127,
"class" : "witch",
"female": true,
"spellbook": [ "stoneSkin" ],

View File

@ -1,7 +1,7 @@
{
"fiona":
{
"id": 48,
"index": 48,
"class" : "demoniac",
"female": true,
"skills":
@ -15,7 +15,7 @@
},
"rashka":
{
"id": 49,
"index": 49,
"class" : "demoniac",
"female": false,
"skills":
@ -30,7 +30,7 @@
},
"marius":
{
"id": 50,
"index": 50,
"class" : "demoniac",
"female": true,
"skills":
@ -44,7 +44,7 @@
},
"ignatius":
{
"id": 51,
"index": 51,
"class" : "demoniac",
"female": false,
"skills":
@ -59,7 +59,7 @@
},
"octavia":
{
"id": 52,
"index": 52,
"class" : "demoniac",
"female": true,
"skills":
@ -74,7 +74,7 @@
},
"calh":
{
"id": 53,
"index": 53,
"class" : "demoniac",
"female": false,
"skills":
@ -89,7 +89,7 @@
},
"pyre":
{
"id": 54,
"index": 54,
"class" : "demoniac",
"female": true,
"skills":
@ -104,7 +104,7 @@
},
"nymus":
{
"id": 55,
"index": 55,
"class" : "demoniac",
"female": true,
"skills":
@ -118,7 +118,7 @@
},
"ayden":
{
"id": 56,
"index": 56,
"class" : "heretic",
"spellbook": [ "viewEarth" ],
"female": false,
@ -134,7 +134,7 @@
},
"xyron":
{
"id": 57,
"index": 57,
"class" : "heretic",
"female": false,
"spellbook": [ "inferno" ],
@ -150,7 +150,7 @@
},
"axsis":
{
"id": 58,
"index": 58,
"class" : "heretic",
"female": false,
"spellbook": [ "protectAir" ],
@ -166,7 +166,7 @@
},
"olema":
{
"id": 59,
"index": 59,
"class" : "heretic",
"female": true,
"spellbook": [ "weakness" ],
@ -182,7 +182,7 @@
},
"calid":
{
"id": 60,
"index": 60,
"class" : "heretic",
"female": false,
"spellbook": [ "haste" ],
@ -198,7 +198,7 @@
},
"ash":
{
"id": 61,
"index": 61,
"class" : "heretic",
"female": true,
"spellbook": [ "bloodlust" ],
@ -214,7 +214,7 @@
},
"zydar":
{
"id": 62,
"index": 62,
"class" : "heretic",
"female": false,
"spellbook": [ "stoneSkin" ],
@ -230,7 +230,7 @@
},
"xarfax":
{
"id": 63,
"index": 63,
"class" : "heretic",
"female": false,
"spellbook": [ "fireball" ],

View File

@ -1,7 +1,7 @@
{
"straker":
{
"id": 64,
"index": 64,
"class" : "deathknight",
"female": false,
"spellbook": [ "haste" ],
@ -17,7 +17,7 @@
},
"vokial":
{
"id": 65,
"index": 65,
"class" : "deathknight",
"female": false,
"spellbook": [ "stoneSkin" ],
@ -33,7 +33,7 @@
},
"moandor":
{
"id": 66,
"index": 66,
"class" : "deathknight",
"female": false,
"spellbook": [ "slow" ],
@ -49,7 +49,7 @@
},
"charna":
{
"id": 67,
"index": 67,
"class" : "deathknight",
"female": true,
"spellbook": [ "magicArrow" ],
@ -65,7 +65,7 @@
},
"tamika":
{
"id": 68,
"index": 68,
"class" : "deathknight",
"female": true,
"spellbook": [ "magicArrow" ],
@ -81,7 +81,7 @@
},
"isra":
{
"id": 69,
"index": 69,
"class" : "deathknight",
"female": true,
"spellbook": [ "magicArrow" ],
@ -96,7 +96,7 @@
},
"clavius":
{
"id": 70,
"index": 70,
"class" : "deathknight",
"female": false,
"spellbook": [ "magicArrow" ],
@ -112,7 +112,7 @@
},
"galthran":
{
"id": 71,
"index": 71,
"class" : "deathknight",
"female": false,
"spellbook": [ "shield" ],
@ -128,7 +128,7 @@
},
"septienna":
{
"id": 72,
"index": 72,
"class" : "necromancer",
"female": true,
"spellbook": [ "deathRipple" ],
@ -144,7 +144,7 @@
},
"aislinn":
{
"id": 73,
"index": 73,
"class" : "necromancer",
"female": true,
"spellbook": [ "meteorShower" ],
@ -160,7 +160,7 @@
},
"sandro":
{
"id": 74,
"index": 74,
"class" : "necromancer",
"female": false,
"spellbook": [ "slow" ],
@ -176,7 +176,7 @@
},
"nimbus":
{
"id": 75,
"index": 75,
"class" : "necromancer",
"female": false,
"spellbook": [ "shield" ],
@ -192,7 +192,7 @@
},
"thant":
{
"id": 76,
"index": 76,
"class" : "necromancer",
"female": false,
"spellbook": [ "animateDead" ],
@ -208,7 +208,7 @@
},
"xsi":
{
"id": 77,
"index": 77,
"class" : "necromancer",
"female": true,
"spellbook": [ "stoneSkin" ],
@ -224,7 +224,7 @@
},
"vidomina":
{
"id": 78,
"index": 78,
"class" : "necromancer",
"female": true,
"spellbook": [ "curse" ],
@ -239,7 +239,7 @@
},
"nagash":
{
"id": 79,
"index": 79,
"class" : "necromancer",
"female": false,
"spellbook": [ "protectAir" ],

View File

@ -1,7 +1,7 @@
{
"mephala":
{
"id": 16,
"index": 16,
"class" : "ranger",
"female": true,
"skills":
@ -16,7 +16,7 @@
},
"ufretin":
{
"id": 17,
"index": 17,
"class" : "ranger",
"female": false,
"skills":
@ -31,7 +31,7 @@
},
"jenova":
{
"id": 18,
"index": 18,
"class" : "ranger",
"female": true,
"skills":
@ -45,7 +45,7 @@
},
"ryland":
{
"id": 19,
"index": 19,
"class" : "ranger",
"female": false,
"skills":
@ -60,7 +60,7 @@
},
"thorgrim":
{
"id": 20,
"index": 20,
"class" : "ranger",
"female": false,
"skills":
@ -74,7 +74,7 @@
},
"ivor":
{
"id": 21,
"index": 21,
"class" : "ranger",
"female": false,
"skills":
@ -89,7 +89,7 @@
},
"clancy":
{
"id": 22,
"index": 22,
"class" : "ranger",
"female": false,
"skills":
@ -104,7 +104,7 @@
},
"kyrre":
{
"id": 23,
"index": 23,
"class" : "ranger",
"female": true,
"skills":
@ -119,7 +119,7 @@
},
"coronius":
{
"id": 24,
"index": 24,
"class" : "druid",
"spellbook": [ "slayer" ],
"female": false,
@ -135,7 +135,7 @@
},
"uland":
{
"id": 25,
"index": 25,
"class" : "druid",
"female": false,
"spellbook": [ "cure" ],
@ -151,7 +151,7 @@
},
"elleshar":
{
"id": 26,
"index": 26,
"class" : "druid",
"female": false,
"spellbook": [ "curse" ],
@ -167,7 +167,7 @@
},
"gem":
{
"id": 27,
"index": 27,
"class" : "druid",
"female": true,
"spellbook": [ "summonBoat" ],
@ -183,7 +183,7 @@
},
"malcom":
{
"id": 28,
"index": 28,
"class" : "druid",
"female": false,
"spellbook": [ "magicArrow" ],
@ -199,7 +199,7 @@
},
"melodia":
{
"id": 29,
"index": 29,
"class" : "druid",
"spellbook": [ "fortune" ],
"female": true,
@ -215,7 +215,7 @@
},
"alagar":
{
"id": 30,
"index": 30,
"class" : "druid",
"female": false,
"spellbook": [ "iceBolt" ],
@ -231,7 +231,7 @@
},
"aeris":
{
"id": 31,
"index": 31,
"class" : "druid",
"female": false,
"spellbook": [ "protectAir" ],

View File

@ -2,7 +2,7 @@
// "special" heroes for campaigns
"sirMullich":
{
"id": 144,
"index": 144,
"class" : "knight",
"female": false,
"special" : true,
@ -17,7 +17,7 @@
},
"adrienne":
{
"id": 145,
"index": 145,
"class" : "witch",
"female": true,
"special" : true,
@ -33,7 +33,7 @@
},
"catherine":
{
"id": 146,
"index": 146,
"class" : "knight",
"female": true,
"special" : true,
@ -49,7 +49,7 @@
},
"dracon":
{
"id": 147,
"index": 147,
"class" : "wizard",
"female": false,
"special" : true,
@ -66,7 +66,7 @@
},
"gelu":
{
"id": 148,
"index": 148,
"class" : "ranger",
"female": false,
"special" : true,
@ -83,7 +83,7 @@
},
"kilgor":
{
"id": 149,
"index": 149,
"class" : "barbarian",
"female": false,
"special" : true,
@ -100,7 +100,7 @@
},
"undeadHaart": // undead version of Lord Haart
{
"id": 150,
"index": 150,
"class" : "deathknight",
"female": false,
"special" : true,
@ -118,7 +118,7 @@
},
"mutare":
{
"id": 151,
"index": 151,
"class" : "warlock",
"female": true,
"special" : true,
@ -136,7 +136,7 @@
},
"roland":
{
"id": 152,
"index": 152,
"class" : "knight",
"female": false,
"special" : true,
@ -152,7 +152,7 @@
},
"mutareDrake":
{
"id": 153,
"index": 153,
"class" : "warlock",
"female": true,
"special" : true,
@ -182,7 +182,7 @@
},
"boragus":
{
"id": 154,
"index": 154,
"class" : "barbarian",
"female": false,
"special" : true,
@ -210,7 +210,7 @@
},
"xeron":
{
"id": 155,
"index": 155,
"class" : "demoniac",
"female": false,
"special" : true,

View File

@ -1,7 +1,7 @@
{
"yog":
{
"id": 96,
"index": 96,
"class" : "barbarian",
"female": false,
"skills":
@ -16,7 +16,7 @@
},
"gurnisson":
{
"id": 97,
"index": 97,
"class" : "barbarian",
"female": false,
"skills":
@ -31,7 +31,7 @@
},
"jabarkas":
{
"id": 98,
"index": 98,
"class" : "barbarian",
"female": false,
"skills":
@ -46,7 +46,7 @@
},
"shiva":
{
"id": 99,
"index": 99,
"class" : "barbarian",
"female": true,
"skills":
@ -61,7 +61,7 @@
},
"gretchin":
{
"id": 100,
"index": 100,
"class" : "barbarian",
"female": true,
"skills":
@ -72,7 +72,7 @@
},
"krellion":
{
"id": 101,
"index": 101,
"class" : "barbarian",
"female": false,
"skills":
@ -87,7 +87,7 @@
},
"cragHack":
{
"id": 102,
"index": 102,
"class" : "barbarian",
"female": false,
"skills":
@ -101,7 +101,7 @@
},
"tyraxor":
{
"id": 103,
"index": 103,
"class" : "barbarian",
"female": false,
"skills":
@ -116,7 +116,7 @@
},
"gird":
{
"id": 104,
"index": 104,
"class" : "battlemage",
"spellbook": [ "bloodlust" ],
"female": true,
@ -132,7 +132,7 @@
},
"vey":
{
"id": 105,
"index": 105,
"class" : "battlemage",
"female": false,
"spellbook": [ "magicArrow" ],
@ -148,7 +148,7 @@
},
"dessa":
{
"id": 106,
"index": 106,
"class" : "battlemage",
"female": true,
"spellbook": [ "stoneSkin" ],
@ -164,7 +164,7 @@
},
"terek":
{
"id": 107,
"index": 107,
"class" : "battlemage",
"female": false,
"spellbook": [ "haste" ],
@ -180,7 +180,7 @@
},
"zubin":
{
"id": 108,
"index": 108,
"class" : "battlemage",
"female": false,
"spellbook": [ "precision" ],
@ -196,7 +196,7 @@
},
"gundula":
{
"id": 109,
"index": 109,
"class" : "battlemage",
"spellbook": [ "slow" ],
"female": true,
@ -212,7 +212,7 @@
},
"oris":
{
"id": 110,
"index": 110,
"class" : "battlemage",
"female": true,
"spellbook": [ "protectAir" ],
@ -228,7 +228,7 @@
},
"saurug":
{
"id": 111,
"index": 111,
"class" : "battlemage",
"female": false,
"spellbook": [ "bloodlust" ],

View File

@ -1,7 +1,7 @@
{
"piquedram":
{
"id": 32,
"index": 32,
"class" : "alchemist",
"female": false,
"spellbook": [ "shield" ],
@ -17,7 +17,7 @@
},
"thane":
{
"id": 33,
"index": 33,
"class" : "alchemist",
"female": false,
"spellbook": [ "magicArrow" ],
@ -32,7 +32,7 @@
},
"josephine":
{
"id": 34,
"index": 34,
"class" : "alchemist",
"spellbook": [ "haste" ],
"female": true,
@ -48,7 +48,7 @@
},
"neela":
{
"id": 35,
"index": 35,
"class" : "alchemist",
"female": true,
"spellbook": [ "shield" ],
@ -64,7 +64,7 @@
},
"torosar ":
{
"id": 36,
"index": 36,
"class" : "alchemist",
"female": false,
"spellbook": [ "magicArrow" ],
@ -80,7 +80,7 @@
},
"fafner":
{
"id": 37,
"index": 37,
"class" : "alchemist",
"female": false,
"spellbook": [ "haste" ],
@ -96,7 +96,7 @@
},
"rissa":
{
"id": 38,
"index": 38,
"class" : "alchemist",
"female": true,
"spellbook": [ "magicArrow" ],
@ -112,7 +112,7 @@
},
"iona":
{
"id": 39,
"index": 39,
"class" : "alchemist",
"spellbook": [ "magicArrow" ],
"female": true,
@ -128,7 +128,7 @@
},
"astral":
{
"id": 40,
"index": 40,
"class" : "wizard",
"female": false,
"spellbook": [ "hypnotize" ],
@ -143,7 +143,7 @@
},
"halon":
{
"id": 41,
"index": 41,
"class" : "wizard",
"female": false,
"spellbook": [ "stoneSkin" ],
@ -159,7 +159,7 @@
},
"serena":
{
"id": 42,
"index": 42,
"class" : "wizard",
"female": true,
"spellbook": [ "dispel" ],
@ -175,7 +175,7 @@
},
"daremyth":
{
"id": 43,
"index": 43,
"class" : "wizard",
"female": true,
"spellbook": [ "fortune" ],
@ -191,7 +191,7 @@
},
"theodorus":
{
"id": 44,
"index": 44,
"class" : "wizard",
"spellbook": [ "shield" ],
"female": false,
@ -207,7 +207,7 @@
},
"solmyr":
{
"id": 45,
"index": 45,
"class" : "wizard",
"female": false,
"spellbook": [ "chainLightning" ],
@ -223,7 +223,7 @@
},
"cyra":
{
"id": 46,
"index": 46,
"class" : "wizard",
"female": true,
"spellbook": [ "haste" ],
@ -239,7 +239,7 @@
},
"aine":
{
"id": 47,
"index": 47,
"class" : "wizard",
"female": true,
"spellbook": [ "curse" ],

View File

@ -33,7 +33,7 @@
"enum" : [ "SPECIAL", "TREASURE", "MINOR", "MAJOR", "RELIC" ],
"description": "Artifact class, treasure, minor, major or relic"
},
"id" : {
"index" : {
"type" : "number",
"description" : "Private field to break things, do not use."
},

View File

@ -39,7 +39,7 @@
"type" : "string",
"description" : "Text version of creature abilities. Used only with original creature window"
},
"id" : {
"index" : {
"type" : "number",
"description" : "Private field to break things, do not use."
},

View File

@ -141,8 +141,8 @@
"description": "Path to .def file with building icons"
},
"buildings": {
"type" : "array",
"items" : {
"type" : "object",
"additionalProperties" : {
"$ref" : "vcmi:townBuilding"
}
},
@ -242,8 +242,8 @@
"$ref" : "vcmi:townSiege"
},
"structures": {
"type" : "array",
"items" : {
"type" : "object",
"additionalProperties" : {
"$ref" : "vcmi:townStructure"
}
},

View File

@ -32,7 +32,7 @@
}
}
},
"id" : {
"index" : {
"type" : "number",
"description" : "Private field to break things, do not use."
},

View File

@ -50,7 +50,7 @@
}
}
},
"id" : {
"index" : {
"type" : "number",
"description" : "Private field to break things, do not use."
},

View File

@ -372,7 +372,7 @@ BattleInfo * BattleInfo::setupBattle( int3 tile, ETerrainType terrain, BFieldTyp
{
curB->town = town;
curB->siege = town->fortLevel();
curB->terrainType = VLC->townh->factions[town->town->typeID].nativeTerrain;
curB->terrainType = VLC->townh->factions[town->subID]->nativeTerrain;
}
else
{

View File

@ -148,10 +148,11 @@ CArtHandler::~CArtHandler()
{
}
void CArtHandler::load(bool onlyTxt)
std::vector<JsonNode> CArtHandler::loadLegacyData(size_t dataSize)
{
if (onlyTxt)
return; // looks to be broken anyway...
artifacts.resize(dataSize);
std::vector<JsonNode> h3Data;
h3Data.reserve(dataSize);
#define ART_POS(x) ( #x)
const std::vector<std::string> artSlots = boost::assign::list_of ART_POS_LIST;
@ -166,11 +167,7 @@ void CArtHandler::load(bool onlyTxt)
parser.endLine(); // header
parser.endLine();
std::map<ui32,ui8>::iterator itr;
std::vector<JsonNode> h3Data;
for (size_t i = 0; i < GameConstants::ARTIFACTS_QUANTITY; i++)
for (size_t i = 0; i < dataSize; i++)
{
JsonNode artData;
@ -194,42 +191,31 @@ void CArtHandler::load(bool onlyTxt)
events.endLine();
h3Data.push_back(artData);
}
artifacts.resize(GameConstants::ARTIFACTS_QUANTITY);
JsonNode config(ResourceID("config/artifacts.json"));
BOOST_FOREACH(auto & node, config["artifacts"].Struct())
{
int numeric = node.second["id"].Float();
JsonNode & artData = h3Data[numeric];
JsonUtils::merge(artData, node.second);
//JsonUtils::validate(artData, "vcmi:artifact", node.first);
artifacts[numeric] = loadArtifact(artData);
artifacts[numeric]->id = ArtifactID(numeric);
VLC->modh->identifiers.registerObject ("artifact." + node.first, numeric);
}
for (size_t i=0; i < artifacts.size(); i++)
{
if (artifacts[i] == nullptr)
logGlobal->warnStream() << "Warning: artifact with id " << i << " is missing!";
}
return h3Data;
}
void CArtHandler::load(std::string objectID, const JsonNode & node)
void CArtHandler::loadObject(std::string scope, std::string name, const JsonNode & data)
{
CArtifact * art = loadArtifact(node);
art->id = ArtifactID(artifacts.size());
auto object = loadFromJson(data);
object->id = ArtifactID(artifacts.size());
artifacts.push_back(art);
logGlobal->traceStream() << "Added artifact: " << objectID;
VLC->modh->identifiers.registerObject ("artifact." + objectID, art->id);
artifacts.push_back(object);
VLC->modh->identifiers.registerObject(scope, "artifact", name, object->id);
}
CArtifact * CArtHandler::loadArtifact(const JsonNode & node)
void CArtHandler::loadObject(std::string scope, std::string name, const JsonNode & data, size_t index)
{
auto object = loadFromJson(data);
object->id = ArtifactID(index);
assert(artifacts[index] == nullptr); // ensure that this id was not loaded before
artifacts[index] = object;
VLC->modh->identifiers.registerObject(scope, "artifact", name, object->id);
}
CArtifact * CArtHandler::loadFromJson(const JsonNode & node)
{
CArtifact * art;
@ -586,7 +572,7 @@ void CArtHandler::initAllowedArtifactsList(const std::vector<bool> &allowed)
}
}
std::vector<bool> CArtHandler::getDefaultAllowedArtifacts() const
std::vector<bool> CArtHandler::getDefaultAllowed() const
{
std::vector<bool> allowedArtifacts;
allowedArtifacts.resize(127, true);

View File

@ -5,6 +5,7 @@
#include "../lib/ConstTransitivePtr.h"
#include "JsonNode.h"
#include "GameConstants.h"
#include "IHandlerBase.h"
/*
* CArtHandler.h, part of VCMI engine
@ -185,8 +186,10 @@ public:
}
};
class DLL_LINKAGE CArtHandler //handles artifacts
class DLL_LINKAGE CArtHandler : public IHandlerBase //handles artifacts
{
CArtifact * loadFromJson(const JsonNode & node);
void addSlot(CArtifact * art, const std::string & slotID);
void loadSlots(CArtifact * art, const JsonNode & node);
void loadClass(CArtifact * art, const JsonNode & node);
@ -205,12 +208,6 @@ public:
std::set<ArtifactID> bigArtifacts; // Artifacts that cannot be moved to backpack, e.g. war machines.
std::set<ArtifactID> growingArtifacts;
void load(bool onlyTxt = false);
/// load artifact from json structure
void load(std::string objectID, const JsonNode & node);
/// load one artifact from json config
CArtifact * loadArtifact(const JsonNode & node);
void addBonuses(CArtifact *art, const JsonNode &bonusList);
void fillList(std::vector<CArtifact*> &listToBeFilled, CArtifact::EartClass artifactClass); //fills given empty list with allowed artifacts of gibven class. No side effects
@ -230,15 +227,16 @@ public:
void makeItCreatureArt (ArtifactID aid, bool onlyCreature = true);
void makeItCommanderArt (CArtifact * a, bool onlyCommander = true);
void makeItCommanderArt (ArtifactID aid, bool onlyCommander = true);
CArtHandler();
~CArtHandler();
/**
* Gets a list of default allowed artifacts.
*
* @return a list of allowed artifacts, the index is the artifact id
*/
std::vector<bool> getDefaultAllowedArtifacts() const;
std::vector<JsonNode> loadLegacyData(size_t dataSize) override;
void loadObject(std::string scope, std::string name, const JsonNode & data) override;
void loadObject(std::string scope, std::string name, const JsonNode & data, size_t index) override;
std::vector<bool> getDefaultAllowed() const override;
template <typename Handler> void serialize(Handler &h, const int version)
{

View File

@ -119,6 +119,8 @@ CBonusTypeHandler::CBonusTypeHandler()
BONUS_LIST;
#undef BONUS_NAME
load();
}
CBonusTypeHandler::~CBonusTypeHandler()
@ -262,7 +264,6 @@ void CBonusTypeHandler::load()
{
const JsonNode gameConf(ResourceID("config/gameConfig.json"));
const JsonNode config(JsonUtils::assembleFromFiles(gameConf["bonuses"].convertTo<std::vector<std::string> >()));
load(config);
}

View File

@ -11,6 +11,7 @@
#pragma once
#include "IBonusTypeHandler.h"
#include "IHandlerBase.h"
#include "HeroBonus.h"

View File

@ -78,7 +78,7 @@ bool CCreature::isUndead() const
*/
bool CCreature::isGood () const
{
return VLC->townh->factions[faction].alignment == EAlignment::GOOD;
return VLC->townh->factions[faction]->alignment == EAlignment::GOOD;
}
/**
@ -87,7 +87,7 @@ bool CCreature::isGood () const
*/
bool CCreature::isEvil () const
{
return VLC->townh->factions[faction].alignment == EAlignment::EVIL;
return VLC->townh->factions[faction]->alignment == EAlignment::EVIL;
}
si32 CCreature::maxAmount(const std::vector<si32> &res) const //how many creatures can be bought
@ -129,7 +129,7 @@ std::string CCreature::nodeName() const
bool CCreature::isItNativeTerrain(int terrain) const
{
return VLC->townh->factions[faction].nativeTerrain == terrain;
return VLC->townh->factions[faction]->nativeTerrain == terrain;
}
static void AddAbility(CCreature *cre, const JsonVector &ability_vec)
@ -263,16 +263,18 @@ void CCreatureHandler::loadBonuses(JsonNode & creature, std::string bonuses)
}
}
void CCreatureHandler::load()
std::vector<JsonNode> CCreatureHandler::loadLegacyData(size_t dataSize)
{
creatures.resize(dataSize);
std::vector<JsonNode> h3Data;
h3Data.reserve(dataSize);
CLegacyConfigParser parser("DATA/ZCRTRAIT.TXT");
parser.endLine(); // header
parser.endLine();
do
for (size_t i=0; i<dataSize; i++)
{
//loop till non-empty line
while (parser.isNextEntryEmpty())
@ -314,40 +316,51 @@ void CCreatureHandler::load()
h3Data.push_back(data);
}
while (parser.endLine());
loadAnimationInfo(h3Data);
const JsonNode gameConf(ResourceID("config/gameConfig.json"));
JsonNode config(JsonUtils::assembleFromFiles(gameConf["creatures"].convertTo<std::vector<std::string> >()));
return h3Data;
}
creatures.resize(GameConstants::CREATURES_COUNT);
void CCreatureHandler::loadObject(std::string scope, std::string name, const JsonNode & data)
{
auto object = loadFromJson(data);
object->idNumber = CreatureID(creatures.size());
BOOST_FOREACH(auto & node, config.Struct())
creatures.push_back(object);
VLC->modh->identifiers.registerObject(scope, "creature", name, object->idNumber);
BOOST_FOREACH(auto node, data["extraNames"].Vector())
{
int numeric = node.second["id"].Float();
JsonUtils::merge(h3Data[numeric], node.second);
//JsonUtils::validate(h3Data[numeric], "vcmi:creature", node.first);
creatures[numeric] = loadCreature(h3Data[numeric]);
creatures[numeric]->idNumber = CreatureID(numeric);
VLC->modh->identifiers.registerObject ("creature." + node.first, numeric);
// Alternative names, if any
BOOST_FOREACH(const JsonNode &name, h3Data[numeric]["extraNames"].Vector())
VLC->modh->identifiers.registerObject ("creature." + name.String(), numeric);
VLC->modh->identifiers.registerObject(scope, "creature", node.String(), object->idNumber);
}
}
for (size_t i=0; i < creatures.size(); i++)
void CCreatureHandler::loadObject(std::string scope, std::string name, const JsonNode & data, size_t index)
{
auto object = loadFromJson(data);
object->idNumber = CreatureID(index);
assert(creatures[index] == nullptr); // ensure that this id was not loaded before
creatures[index] = object;
VLC->modh->identifiers.registerObject(scope, "creature", name, object->idNumber);
BOOST_FOREACH(auto node, data["extraNames"].Vector())
{
if (creatures[i] == nullptr)
logGlobal->warnStream() << "Warning: creature with id " << i << " is missing!";
VLC->modh->identifiers.registerObject(scope, "creature", node.String(), object->idNumber);
}
}
loadCrExpBon();
std::vector<bool> CCreatureHandler::getDefaultAllowed() const
{
std::vector<bool> ret;
BOOST_FOREACH(const CCreature * crea, creatures)
{
ret.push_back(crea ? !crea->special : false);
}
return ret;
}
void CCreatureHandler::loadCrExpBon()
@ -508,19 +521,7 @@ void CCreatureHandler::loadUnitAnimInfo(JsonNode & graphics, CLegacyConfigParser
graphics.Struct().erase("missile");
}
void CCreatureHandler::load(std::string creatureID, const JsonNode & node)
{
CCreature * creature = loadCreature(node);
creature->nameRef = creatureID;
creature->idNumber = CreatureID(creatures.size());
creatures.push_back(creature);
logGlobal->traceStream() << "Added creature: " << creatureID;
VLC->modh->identifiers.registerObject ("creature." + creature->nameRef, creature->idNumber);
}
CCreature * CCreatureHandler::loadCreature(const JsonNode & node)
CCreature * CCreatureHandler::loadFromJson(const JsonNode & node)
{
CCreature * cre = new CCreature();

View File

@ -6,6 +6,7 @@
#include "ResourceSet.h"
#include "GameConstants.h"
#include "JsonNode.h"
#include "IHandlerBase.h"
/*
* CCreatureHandler.h, part of VCMI engine
@ -132,15 +133,37 @@ public:
CCreature();
};
class DLL_LINKAGE CCreatureHandler
class DLL_LINKAGE CCreatureHandler : public IHandlerBase
{
private:
CBonusSystemNode allCreatures;
CBonusSystemNode creaturesOfLevel[GameConstants::CREATURES_PER_TOWN + 1];//index 0 is used for creatures of unknown tier or outside <1-7> range
/// load one creature from json config
CCreature * loadFromJson(const JsonNode & node);
void loadJsonAnimation(CCreature * creature, const JsonNode & graphics);
void loadStackExperience(CCreature * creature, const JsonNode &input);
void loadCreatureJson(CCreature * creature, const JsonNode & config);
/// loading functions
/// adding abilities from ZCRTRAIT.TXT
void loadBonuses(JsonNode & creature, std::string bonuses);
/// load all creatures from H3 files
void load();
void loadCommanders();
/// load creature from json structure
void load(std::string creatureID, const JsonNode & node);
/// read cranim.txt file from H3
void loadAnimationInfo(std::vector<JsonNode> & h3Data);
/// read one line from cranim.txt
void loadUnitAnimInfo(JsonNode & unit, CLegacyConfigParser &parser);
/// parse crexpbon.txt file from H3
void loadStackExp(Bonus & b, BonusList & bl, CLegacyConfigParser &parser);
/// help function for parsing CREXPBON.txt
int stringToNumber(std::string & s);
public:
std::set<CreatureID> doubledCreatures; //they get double week
std::vector<ConstTransitivePtr<CCreature> > creatures; //creature ID -> creature info.
@ -155,38 +178,26 @@ public:
std::vector< std::vector <ui8> > skillLevels; //how much of a bonus will be given to commander with every level. SPELL_POWER also gives CASTS and RESISTANCE
std::vector <std::pair <Bonus, std::pair <ui8, ui8> > > skillRequirements; // first - Bonus, second - which two skills are needed to use it
/// loading functions
/// adding abilities from ZCRTRAIT.TXT
void loadBonuses(JsonNode & creature, std::string bonuses);
/// load all creatures from H3 files
void load();
void loadCommanders();
/// load creature from json structure
void load(std::string creatureID, const JsonNode & node);
/// load one creature from json config
CCreature * loadCreature(const JsonNode & node);
/// generates tier-specific bonus tree entries
void buildBonusTreeForTiers();
/// read cranim.txt file from H3
void loadAnimationInfo(std::vector<JsonNode> & h3Data);
/// read one line from cranim.txt
void loadUnitAnimInfo(JsonNode & unit, CLegacyConfigParser &parser);
/// load all creatures from H3 files
void loadCrExpBon();
/// parse crexpbon.txt file from H3
void loadStackExp(Bonus & b, BonusList & bl, CLegacyConfigParser &parser);
/// help function for parsing CREXPBON.txt
int stringToNumber(std::string & s);
CCreatureHandler();
~CCreatureHandler();
void deserializationFix();
CreatureID pickRandomMonster(const boost::function<int()> &randGen = 0, int tier = -1) const; //tier <1 - CREATURES_PER_TOWN> or -1 for any
void addBonusForTier(int tier, Bonus *b); //tier must be <1-7>
void addBonusForAllCreatures(Bonus *b);
CCreatureHandler();
~CCreatureHandler();
/// load all creatures from H3 files
void loadCrExpBon();
/// generates tier-specific bonus tree entries
void buildBonusTreeForTiers();
std::vector<JsonNode> loadLegacyData(size_t dataSize) override;
void loadObject(std::string scope, std::string name, const JsonNode & data) override;
void loadObject(std::string scope, std::string name, const JsonNode & data, size_t index) override;
std::vector<bool> getDefaultAllowed() const override;
template <typename Handler> void serialize(Handler &h, const int version)
{
//TODO: should be optimized, not all these informations needs to be serialized (same for ccreature)

View File

@ -46,8 +46,10 @@ void CGDefInfo::fetchInfoFromMSK()
}
}
void CDefObjInfoHandler::load()
CDefObjInfoHandler::CDefObjInfoHandler()
{
VLC->dobjinfo = this;
auto textFile = CResourceHandler::get()->loadData(ResourceID("DATA/ZOBJCTS.TXT"));
std::istringstream inp(std::string((char*)textFile.first.get(), textFile.second));
@ -132,8 +134,17 @@ void CDefObjInfoHandler::load()
//coverageMap calculating
nobj->fetchInfoFromMSK();
auto dest = nobj->id.toDefObjInfo();
if (dest.find(nobj->subid) != dest.end() && dest[nobj->subid] != nullptr)
{
// there is just too many of these. Note that this data is almost unused
// exceptions are: town(village-capitol) and creation of new objects (holes, creatures, heroes, etc)
//logGlobal->warnStream() << "Warning: overwriting def info for " << dest[nobj->subid]->name << " with " << nobj->name;
dest[nobj->subid].dellNull(); // do not leak
}
nobj->id.toDefObjInfo()[nobj->subid] = nobj;
}
for (int i = 0; i < 8 ; i++)

View File

@ -54,7 +54,7 @@ public:
bmap<TFaction, ConstTransitivePtr<CGDefInfo> > capitols;
bmap<TFaction, ConstTransitivePtr<CGDefInfo> > villages;
void load();
CDefObjInfoHandler();
~CDefObjInfoHandler();
template <typename Handler> void serialize(Handler &h, const int version)

View File

@ -381,7 +381,7 @@ CGHeroInstance * CGameState::HeroesPool::pickHeroFor(bool native, PlayerColor pl
if(player>=PlayerColor::PLAYER_LIMIT)
{
logGlobal->errorStream() << "Cannot pick hero for " << town->typeID << ". Wrong owner!";
logGlobal->errorStream() << "Cannot pick hero for " << town->faction->index << ". Wrong owner!";
return NULL;
}
@ -392,7 +392,7 @@ CGHeroInstance * CGameState::HeroesPool::pickHeroFor(bool native, PlayerColor pl
for(auto i=available.begin(); i!=available.end(); i++)
{
if(pavailable.find(i->first)->second & 1<<player.getNum()
&& i->second->type->heroClass->faction == town->typeID)
&& i->second->type->heroClass->faction == town->faction->index)
{
pool.push_back(i->second); //get all available heroes
}
@ -413,11 +413,11 @@ CGHeroInstance * CGameState::HeroesPool::pickHeroFor(bool native, PlayerColor pl
for(auto i=available.begin(); i!=available.end(); i++)
{
if ((!bannedClass && (pavailable.find(i->first)->second & (1<<player.getNum()))) ||
i->second->type->heroClass != bannedClass)
if (pavailable.find(i->first)->second & (1<<player.getNum()) && // hero is available
( !bannedClass || i->second->type->heroClass != bannedClass) ) // and his class is not same as other hero
{
pool.push_back(i->second);
sum += i->second->type->heroClass->selectionProbability[town->typeID]; //total weight
sum += i->second->type->heroClass->selectionProbability[town->faction->index]; //total weight
}
}
if(!pool.size() || sum == 0)
@ -429,7 +429,7 @@ CGHeroInstance * CGameState::HeroesPool::pickHeroFor(bool native, PlayerColor pl
r = rand()%sum;
for (ui32 i=0; i<pool.size(); i++)
{
r -= pool[i]->type->heroClass->selectionProbability[town->typeID];
r -= pool[i]->type->heroClass->selectionProbability[town->faction->index];
if(r < 0)
{
ret = pool[i];
@ -549,9 +549,11 @@ std::pair<Obj,int> CGameState::pickObject (CGObjectInstance *obj)
}
if(f<0)
{
auto iter = VLC->townh->towns.begin();
std::advance(iter, ran()%VLC->townh->towns.size());
f = iter->first;
do
{
f = ran()%VLC->townh->factions.size();
}
while (VLC->townh->factions[f]->town == nullptr); // find playable faction
}
return std::make_pair(Obj::TOWN,f);
}
@ -619,7 +621,7 @@ std::pair<Obj,int> CGameState::pickObject (CGObjectInstance *obj)
dwl->info = nullptr;
std::pair<Obj, int> result(Obj::NO_OBJ, -1);
CreatureID cid = VLC->townh->towns[faction].creatures[level][0];
CreatureID cid = VLC->townh->factions[faction]->town->creatures[level][0];
//golem factory is not in list of cregens but can be placed as random object
static const CreatureID factoryCreatures[] = {CreatureID::STONE_GOLEM, CreatureID::IRON_GOLEM,
@ -656,7 +658,7 @@ void CGameState::randomizeObject(CGObjectInstance *cur)
if(cur->ID==Obj::TOWN) //town - set def
{
CGTownInstance *t = dynamic_cast<CGTownInstance*>(cur);
t->town = &VLC->townh->towns[t->subID];
t->town = VLC->townh->factions[t->subID]->town;
if(t->hasCapitol())
t->defInfo = VLC->dobjinfo->capitols[t->subID];
else if(t->hasFort())
@ -685,7 +687,7 @@ void CGameState::randomizeObject(CGObjectInstance *cur)
cur->ID = ran.first;
cur->subID = ran.second;
//FIXME: copy-pasted from above
t->town = &VLC->townh->towns[t->subID];
t->town = VLC->townh->factions[t->subID]->town;
if(t->hasCapitol())
t->defInfo = VLC->dobjinfo->capitols[t->subID];
else if(t->hasFort())
@ -1394,8 +1396,8 @@ void CGameState::init(StartInfo * si)
break;
case PlayerSettings::RESOURCE:
{
int res = VLC->townh->towns[scenarioOps->playerInfos[k->first].castle].primaryRes;
if(res == 127)
int res = VLC->townh->factions[scenarioOps->playerInfos[k->first].castle]->town->primaryRes;
if(res == Res::WOOD_AND_ORE)
{
k->second.resources[Res::WOOD] += 5 + ran()%6;
k->second.resources[Res::ORE] += 5 + ran()%6;
@ -1443,7 +1445,7 @@ void CGameState::init(StartInfo * si)
map->towns[g]->pos == pi.posOfMainTown + int3(2, 0, 0))
{
map->towns[g]->builtBuildings.insert(
CBuildingHandler::campToERMU(chosenBonus->info1, map->towns[g]->town->typeID, map->towns[g]->builtBuildings));
CBuildingHandler::campToERMU(chosenBonus->info1, map->towns[g]->subID, map->towns[g]->builtBuildings));
break;
}
}
@ -1459,7 +1461,7 @@ void CGameState::init(StartInfo * si)
{
CGTownInstance * vti =(map->towns[i]);
if(!vti->town)
vti->town = &VLC->townh->towns[vti->subID];
vti->town = VLC->townh->factions[vti->subID]->town;
if (vti->name.length()==0) // if town hasn't name we draw it
vti->name = vti->town->names[ran()%vti->town->names.size()];

View File

@ -149,7 +149,7 @@ void CGeneralTextHandler::readToVector(std::string sourceName, std::vector<std::
while (parser.endLine());
}
void CGeneralTextHandler::load()
CGeneralTextHandler::CGeneralTextHandler()
{
readToVector("DATA/VCDESC.TXT", victoryConditions);
readToVector("DATA/LCDESC.TXT", lossCondtions);
@ -327,8 +327,3 @@ void CGeneralTextHandler::load()
threat.push_back(buffer);
}
}
CGeneralTextHandler::CGeneralTextHandler()
{
}

View File

@ -105,6 +105,5 @@ public:
std::vector < std::vector <std::string> > campaignRegionNames;
void readToVector(std::string sourceName, std::vector<std::string> & dest);
void load();
CGeneralTextHandler();
};

View File

@ -42,7 +42,7 @@ SecondarySkill CHeroClass::chooseSecSkill(const std::set<SecondarySkill> & possi
EAlignment::EAlignment CHeroClass::getAlignment() const
{
return EAlignment::EAlignment(VLC->townh->factions[faction].alignment);
return EAlignment::EAlignment(VLC->townh->factions[faction]->alignment);
}
std::vector<BattleHex> CObstacleInfo::getBlocked(BattleHex hex) const
@ -78,79 +78,9 @@ bool CObstacleInfo::isAppropriate(ETerrainType terrainType, int specialBattlefie
return vstd::contains(allowedTerrains, terrainType);
}
void CHeroClassHandler::load()
CHeroClass *CHeroClassHandler::loadFromJson(const JsonNode & node)
{
CLegacyConfigParser parser("DATA/HCTRAITS.TXT");
parser.endLine(); // header
parser.endLine();
std::vector<JsonNode> h3Data;
do
{
JsonNode entry;
entry["name"].String() = parser.readString();
parser.readNumber(); // unused aggression
for (size_t i=0; i < GameConstants::PRIMARY_SKILLS; i++)
entry["primarySkills"][PrimarySkill::names[i]].Float() = parser.readNumber();
for (size_t i=0; i < GameConstants::PRIMARY_SKILLS; i++)
entry["lowLevelChance"][PrimarySkill::names[i]].Float() = parser.readNumber();
for (size_t i=0; i < GameConstants::PRIMARY_SKILLS; i++)
entry["highLevelChance"][PrimarySkill::names[i]].Float() = parser.readNumber();
for (size_t i=0; i < GameConstants::SKILL_QUANTITY; i++)
entry["secondarySkills"][NSecondarySkill::names[i]].Float() = parser.readNumber();
for(size_t i = 0; i < GameConstants::F_NUMBER; i++)
entry["tavern"][ETownType::names[i]].Float() = parser.readNumber();
h3Data.push_back(entry);
}
while (parser.endLine() && !parser.isNextEntryEmpty());
JsonNode classConf = JsonNode(ResourceID("config/heroClasses.json"));
heroClasses.resize(GameConstants::F_NUMBER * 2);
BOOST_FOREACH(auto & node, classConf.Struct())
{
int numeric = node.second["id"].Float();
JsonNode & classData = h3Data[numeric];
JsonUtils::merge(classData, node.second);
//JsonUtils::validate(classData, "vcmi:heroClass", node.first);
heroClasses[numeric] = loadClass(classData);
heroClasses[numeric]->id = numeric;
VLC->modh->identifiers.registerObject ("heroClass." + node.first, numeric);
}
for (size_t i=0; i < heroClasses.size(); i++)
{
if (heroClasses[i] == nullptr)
logGlobal->warnStream() << "Warning: class with id " << i << " is missing!";
}
}
void CHeroClassHandler::load(std::string objectID, const JsonNode & input)
{
CHeroClass * heroClass = loadClass(input);
heroClass->identifier = objectID;
heroClass->id = heroClasses.size();
heroClasses.push_back(heroClass);
logGlobal->traceStream() << "Added hero class: " << objectID;
VLC->modh->identifiers.registerObject("heroClass." + heroClass->identifier, heroClass->id);
}
CHeroClass *CHeroClassHandler::loadClass(const JsonNode & node)
{
CHeroClass * heroClass = new CHeroClass;
CHeroClass * heroClass = new CHeroClass();
heroClass->imageBattleFemale = node["animation"]["battle"]["female"].String();
heroClass->imageBattleMale = node["animation"]["battle"]["male"].String();
@ -191,6 +121,72 @@ CHeroClass *CHeroClassHandler::loadClass(const JsonNode & node)
return heroClass;
}
std::vector<JsonNode> CHeroClassHandler::loadLegacyData(size_t dataSize)
{
heroClasses.resize(GameConstants::F_NUMBER * 2);
std::vector<JsonNode> h3Data;
h3Data.reserve(dataSize);
CLegacyConfigParser parser("DATA/HCTRAITS.TXT");
parser.endLine(); // header
parser.endLine();
for (size_t i=0; i<dataSize; i++)
{
JsonNode entry;
entry["name"].String() = parser.readString();
parser.readNumber(); // unused aggression
for (size_t i=0; i < GameConstants::PRIMARY_SKILLS; i++)
entry["primarySkills"][PrimarySkill::names[i]].Float() = parser.readNumber();
for (size_t i=0; i < GameConstants::PRIMARY_SKILLS; i++)
entry["lowLevelChance"][PrimarySkill::names[i]].Float() = parser.readNumber();
for (size_t i=0; i < GameConstants::PRIMARY_SKILLS; i++)
entry["highLevelChance"][PrimarySkill::names[i]].Float() = parser.readNumber();
for (size_t i=0; i < GameConstants::SKILL_QUANTITY; i++)
entry["secondarySkills"][NSecondarySkill::names[i]].Float() = parser.readNumber();
for(size_t i = 0; i < GameConstants::F_NUMBER; i++)
entry["tavern"][ETownType::names[i]].Float() = parser.readNumber();
parser.endLine();
h3Data.push_back(entry);
}
return h3Data;
}
void CHeroClassHandler::loadObject(std::string scope, std::string name, const JsonNode & data)
{
auto object = loadFromJson(data);
object->id = heroClasses.size();
heroClasses.push_back(object);
VLC->modh->identifiers.registerObject(scope, "heroClass", name, object->id);
}
void CHeroClassHandler::loadObject(std::string scope, std::string name, const JsonNode & data, size_t index)
{
auto object = loadFromJson(data);
object->id = index;
assert(heroClasses[index] == nullptr); // ensure that this id was not loaded before
heroClasses[index] = object;
VLC->modh->identifiers.registerObject(scope, "heroClass", name, object->id);
}
std::vector<bool> CHeroClassHandler::getDefaultAllowed() const
{
return std::vector<bool>(heroClasses.size(), true);
}
CHeroClassHandler::~CHeroClassHandler()
{
BOOST_FOREACH(auto heroClass, heroClasses)
@ -207,19 +203,19 @@ CHeroHandler::~CHeroHandler()
CHeroHandler::CHeroHandler()
{
VLC->heroh = this;
for (int i = 0; i < GameConstants::SKILL_QUANTITY; ++i)
{
VLC->modh->identifiers.registerObject("core", "skill", NSecondarySkill::names[i], i);
}
loadObstacles();
loadTerrains();
loadBallistics();
loadExperience();
}
void CHeroHandler::load(std::string objectID, const JsonNode & input)
{
CHero * hero = loadHero(input);
hero->ID = heroes.size();
heroes.push_back(hero);
logGlobal->traceStream() << "Added hero: " << objectID;
VLC->modh->identifiers.registerObject("hero." + objectID, hero->ID);
}
CHero * CHeroHandler::loadHero(const JsonNode & node)
CHero * CHeroHandler::loadFromJson(const JsonNode & node)
{
CHero * hero = new CHero;
@ -332,22 +328,6 @@ void CHeroHandler::loadHeroSpecialty(CHero * hero, const JsonNode & node)
}
}
void CHeroHandler::load()
{
VLC->heroh = this;
for (int i = 0; i < GameConstants::SKILL_QUANTITY; ++i)
{
VLC->modh->identifiers.registerObject("skill." + NSecondarySkill::names[i], i);
}
classes.load();
loadHeroes();
loadObstacles();
loadTerrains();
loadBallistics();
loadExperience();
}
void CHeroHandler::loadExperience()
{
expPerLevel.push_back(0);
@ -406,8 +386,39 @@ static std::string genRefName(std::string input)
return input;
}
void CHeroHandler::loadHeroes()
void CHeroHandler::loadBallistics()
{
CLegacyConfigParser ballParser("DATA/BALLIST.TXT");
ballParser.endLine(); //header
ballParser.endLine();
do
{
ballParser.readString();
ballParser.readString();
CHeroHandler::SBallisticsLevelInfo bli;
bli.keep = ballParser.readNumber();
bli.tower = ballParser.readNumber();
bli.gate = ballParser.readNumber();
bli.wall = ballParser.readNumber();
bli.shots = ballParser.readNumber();
bli.noDmg = ballParser.readNumber();
bli.oneDmg = ballParser.readNumber();
bli.twoDmg = ballParser.readNumber();
bli.sum = ballParser.readNumber();
ballistics.push_back(bli);
}
while (ballParser.endLine());
}
std::vector<JsonNode> CHeroHandler::loadLegacyData(size_t dataSize)
{
heroes.resize(dataSize);
std::vector<JsonNode> h3Data;
h3Data.reserve(dataSize);
CLegacyConfigParser specParser("DATA/HEROSPEC.TXT");
CLegacyConfigParser bioParser("DATA/HEROBIOS.TXT");
CLegacyConfigParser parser("DATA/HOTRAITS.TXT");
@ -418,8 +429,6 @@ void CHeroHandler::loadHeroes()
specParser.endLine(); //ignore header
specParser.endLine();
std::vector<JsonNode> h3Data;
for (int i=0; i<GameConstants::HEROES_QUANTITY; i++)
{
JsonNode heroData;
@ -447,58 +456,28 @@ void CHeroHandler::loadHeroes()
h3Data.push_back(heroData);
}
// Load heroes information
heroes.resize(GameConstants::HEROES_QUANTITY);
const JsonNode gameConf(ResourceID("config/gameConfig.json"));
JsonNode config(JsonUtils::assembleFromFiles(gameConf["heroes"].convertTo<std::vector<std::string> >()));
BOOST_FOREACH(auto &entry, config.Struct())
{
ui32 identifier = entry.second["id"].Float();
JsonUtils::merge(h3Data[identifier], entry.second);
//JsonUtils::validate(h3Data[identifier], "vcmi:hero", entry.first);
CHero * hero = loadHero(h3Data[identifier]);
hero->ID = identifier;
heroes[identifier] = hero;
VLC->modh->identifiers.registerObject("hero." + entry.first, identifier);
}
for (size_t i=0; i < heroes.size(); i++)
{
if (heroes[i] == nullptr)
logGlobal->warnStream() << "Warning: hero with id " << i << " is missing!";
}
return h3Data;
}
void CHeroHandler::loadBallistics()
void CHeroHandler::loadObject(std::string scope, std::string name, const JsonNode & data)
{
CLegacyConfigParser ballParser("DATA/BALLIST.TXT");
auto object = loadFromJson(data);
object->ID = heroes.size();
ballParser.endLine(); //header
ballParser.endLine();
heroes.push_back(object);
do
{
ballParser.readString();
ballParser.readString();
VLC->modh->identifiers.registerObject(scope, "hero", name, object->ID);
}
CHeroHandler::SBallisticsLevelInfo bli;
bli.keep = ballParser.readNumber();
bli.tower = ballParser.readNumber();
bli.gate = ballParser.readNumber();
bli.wall = ballParser.readNumber();
bli.shots = ballParser.readNumber();
bli.noDmg = ballParser.readNumber();
bli.oneDmg = ballParser.readNumber();
bli.twoDmg = ballParser.readNumber();
bli.sum = ballParser.readNumber();
ballistics.push_back(bli);
}
while (ballParser.endLine());
void CHeroHandler::loadObject(std::string scope, std::string name, const JsonNode & data, size_t index)
{
auto object = loadFromJson(data);
object->ID = index;
assert(heroes[index] == nullptr); // ensure that this id was not loaded before
heroes[index] = object;
VLC->modh->identifiers.registerObject(scope, "hero", name, object->ID);
}
ui32 CHeroHandler::level (ui64 experience) const
@ -531,7 +510,7 @@ void CHeroHandler::loadTerrains()
terrCosts.push_back(config[name]["moveCost"].Float());
}
std::vector<bool> CHeroHandler::getDefaultAllowedHeroes() const
std::vector<bool> CHeroHandler::getDefaultAllowed() const
{
// Look Data/HOTRAITS.txt for reference
std::vector<bool> allowedHeroes;

View File

@ -3,6 +3,7 @@
#include "../lib/ConstTransitivePtr.h"
#include "GameConstants.h"
#include "HeroBonus.h"
#include "IHandlerBase.h"
/*
* CHeroHandler.h, part of VCMI engine
@ -149,19 +150,18 @@ struct DLL_LINKAGE CObstacleInfo
}
};
class DLL_LINKAGE CHeroClassHandler
class DLL_LINKAGE CHeroClassHandler : public IHandlerBase
{
CHeroClass *loadFromJson(const JsonNode & node);
public:
std::vector< ConstTransitivePtr<CHeroClass> > heroClasses;
/// load from H3 config
void load();
std::vector<JsonNode> loadLegacyData(size_t dataSize) override;
/// load any number of classes from json
void load(std::string objectID, const JsonNode & classes);
void loadObject(std::string scope, std::string name, const JsonNode & data) override;
void loadObject(std::string scope, std::string name, const JsonNode & data, size_t index) override;
/// load one class from json
CHeroClass * loadClass(const JsonNode & node);
std::vector<bool> getDefaultAllowed() const;
~CHeroClassHandler();
@ -171,7 +171,7 @@ public:
}
};
class DLL_LINKAGE CHeroHandler
class DLL_LINKAGE CHeroHandler : public IHandlerBase
{
/// expPerLEvel[i] is amount of exp needed to reach level i;
/// consists of 201 values. Any higher levels require experience larger that ui64 can hold
@ -181,6 +181,15 @@ class DLL_LINKAGE CHeroHandler
void loadHeroArmy(CHero * hero, const JsonNode & node);
void loadHeroSkills(CHero * hero, const JsonNode & node);
void loadHeroSpecialty(CHero * hero, const JsonNode & node);
void loadExperience();
void loadBallistics();
void loadTerrains();
void loadObstacles();
/// Load single hero from json
CHero * loadFromJson(const JsonNode & node);
public:
CHeroClassHandler classes;
@ -208,34 +217,15 @@ public:
ui32 level(ui64 experience) const; //calculates level corresponding to given experience amount
ui64 reqExp(ui32 level) const; //calculates experience required for given level
/// Load multiple heroes from json
void load(std::string objectID, const JsonNode & heroes);
std::vector<JsonNode> loadLegacyData(size_t dataSize) override;
/// Load single hero from json
CHero * loadHero(const JsonNode & node);
/// Load everything (calls functions below + classes.load())
void load();
void loadHeroes();
void loadExperience();
void loadBallistics();
void loadTerrains();
void loadObstacles();
void loadObject(std::string scope, std::string name, const JsonNode & data) override;
void loadObject(std::string scope, std::string name, const JsonNode & data, size_t index) override;
CHeroHandler(); //c-tor
~CHeroHandler(); //d-tor
/**
* Gets a list of default allowed heroes.
*
* TODO Proposal for hero modding: Replace hero id with a unique machine readable hero name and
* create a JSON config file or merge it with a existing config file which describes which heroes can be used for
* random map generation / map editor(default map settings). (Gelu, ... should be excluded)
*
* @return a list of allowed heroes, the index is the hero id and the value either 0 for not allowed or 1 for allowed
*/
std::vector<bool> getDefaultAllowedHeroes() const;
std::vector<bool> getDefaultAllowed() const;
/**
* Gets a list of default allowed abilities. OH3 abilities/skills are all allowed by default.

View File

@ -70,6 +70,7 @@ set(lib_HEADERS
GameConstants.h
StringConstants.h
IGameEventsReceiver.h
IHandlerBase.h
int3.h
Interprocess.h
NetPacks.h

View File

@ -11,6 +11,8 @@
#include "CHeroHandler.h"
#include "CObjectHandler.h"
#include "StringConstants.h"
#include "CStopWatch.h"
#include "IHandlerBase.h"
/*
* CModHandler.cpp, part of VCMI engine
@ -46,7 +48,8 @@ void CIdentifierStorage::requestIdentifier(std::string name, const boost::functi
{
checkIdentifier(name);
auto iter = registeredObjects.find(name);
// old version with immediate callback posibility. Can't be used for some cases
/* auto iter = registeredObjects.find(name);
if (iter != registeredObjects.end())
callback(iter->second); //already registered - trigger callback immediately
@ -56,19 +59,24 @@ void CIdentifierStorage::requestIdentifier(std::string name, const boost::functi
logGlobal->warnStream() << "incorrect primSkill name requested";
missingObjects[name].push_back(callback); // queue callback
}
}*/
missingObjects[name].push_back(callback); // queue callback
}
void CIdentifierStorage::registerObject(std::string name, si32 identifier)
void CIdentifierStorage::registerObject(std::string scope, std::string type, std::string name, si32 identifier)
{
checkIdentifier(name);
//TODO: use scope
std::string fullID = type + '.' + name;
checkIdentifier(fullID);
// do not allow to register same object twice
assert(registeredObjects.find(name) == registeredObjects.end());
assert(registeredObjects.find(fullID) == registeredObjects.end());
registeredObjects[name] = identifier;
registeredObjects[fullID] = identifier;
auto iter = missingObjects.find(name);
// old version with immediate callback posibility. Can't be used for some cases
/*auto iter = missingObjects.find(fullID);
if (iter != missingObjects.end())
{
//call all awaiting callbacks
@ -77,11 +85,26 @@ void CIdentifierStorage::registerObject(std::string name, si32 identifier)
function(identifier);
}
missingObjects.erase(iter);
}
}*/
}
void CIdentifierStorage::finalize() const
void CIdentifierStorage::finalize()
{
for (auto it = missingObjects.begin(); it!= missingObjects.end();)
{
auto object = registeredObjects.find(it->first);
if (object != registeredObjects.end())
{
BOOST_FOREACH(auto function, it->second)
{
function(object->second);
}
it = missingObjects.erase(it);
}
else
it++;
}
// print list of missing objects and crash
// in future should try to do some cleanup (like returning all id's as 0)
if (!missingObjects.empty())
@ -99,15 +122,115 @@ void CIdentifierStorage::finalize() const
assert(missingObjects.empty());
}
CContentHandler::ContentTypeHandler::ContentTypeHandler(IHandlerBase * handler, size_t size, std::string objectName):
handler(handler),
objectName(objectName),
originalData(handler->loadLegacyData(size))
{
}
void CContentHandler::ContentTypeHandler::preloadModData(std::string modName, std::vector<std::string> fileList)
{
JsonNode data = JsonUtils::assembleFromFiles(fileList);
ModInfo & modInfo = modData[modName];
BOOST_FOREACH(auto entry, data.Struct())
{
size_t colon = entry.first.find(':');
if (colon == std::string::npos)
{
// normal object, local to this mod
modInfo.modData[entry.first].swap(entry.second);
}
else
{
std::string remoteName = entry.first.substr(0, colon);
std::string objectName = entry.first.substr(colon + 1);
// patching this mod? Send warning and continue - this situation can be handled normally
if (remoteName == modName)
logGlobal->warnStream() << "Redundant namespace definition for " << objectName;
JsonNode & remoteConf = modData[remoteName].patches[objectName];
JsonUtils::merge(remoteConf, entry.second);
}
}
}
void CContentHandler::ContentTypeHandler::loadMod(std::string modName)
{
ModInfo & modInfo = modData[modName];
// apply patches
if (!modInfo.patches.isNull())
JsonUtils::merge(modInfo.modData, modInfo.patches);
BOOST_FOREACH(auto entry, modInfo.modData.Struct())
{
const std::string & name = entry.first;
JsonNode & data = entry.second;
if (vstd::contains(data.Struct(), "index") && !data["index"].isNull())
{
// try to add H3 object data
size_t index = data["index"].Float();
if (originalData.size() > index)
{
JsonUtils::merge(originalData[index], data);
JsonUtils::validate(originalData[index], "vcmi:" + objectName, name);
handler->loadObject(modName, name, originalData[index], index);
originalData[index].clear(); // do not use same data twice (same ID)
continue;
}
}
// normal new object
JsonUtils::validate(data, "vcmi:" + objectName, name);
handler->loadObject(modName, name, data);
}
}
CContentHandler::CContentHandler()
{
handlers.insert(std::make_pair("heroClasses", ContentTypeHandler(&VLC->heroh->classes, GameConstants::F_NUMBER * 2, "heroClass")));
handlers.insert(std::make_pair("artifacts", ContentTypeHandler(VLC->arth, GameConstants::ARTIFACTS_QUANTITY, "artifact")));
handlers.insert(std::make_pair("creatures", ContentTypeHandler(VLC->creh, GameConstants::CREATURES_COUNT, "creature")));
handlers.insert(std::make_pair("factions", ContentTypeHandler(VLC->townh, GameConstants::F_NUMBER, "faction")));
handlers.insert(std::make_pair("heroes", ContentTypeHandler(VLC->heroh, GameConstants::HEROES_QUANTITY, "hero")));
//TODO: spells, bonuses, something else?
}
void CContentHandler::preloadModData(std::string modName, JsonNode modConfig)
{
BOOST_FOREACH(auto & handler, handlers)
{
handler.second.preloadModData(modName, modConfig[handler.first].convertTo<std::vector<std::string> >());
}
}
void CContentHandler::loadMod(std::string modName)
{
BOOST_FOREACH(auto & handler, handlers)
{
handler.second.loadMod(modName);
}
}
CModHandler::CModHandler()
{
for (int i = 0; i < GameConstants::RESOURCE_QUANTITY; ++i)
{
identifiers.registerObject("resource." + GameConstants::RESOURCE_NAMES[i], i);
identifiers.registerObject("core", "resource", GameConstants::RESOURCE_NAMES[i], i);
}
for(int i=0; i<GameConstants::PRIMARY_SKILLS; ++i)
identifiers.registerObject("primSkill." + PrimarySkill::names[i], i);
identifiers.registerObject("core", "primSkill", PrimarySkill::names[i], i);
loadConfigFromFile ("defaultMods");
}
@ -190,8 +313,12 @@ bool CModHandler::checkDependencies(const std::vector <TModID> & input) const
std::vector <TModID> CModHandler::resolveDependencies(std::vector <TModID> input) const
{
// Algorithm may not be the fastest one but VCMI does not needs any speed here
// Unless user have dozens of mods with complex dependencies this cide should be fine
// Topological sort algorithm
// May not be the fastest one but VCMI does not needs any speed here
// Unless user have dozens of mods with complex dependencies this code should be fine
// first - sort input to have input strictly based on name (and not on hashmap or anything else)
boost::range::sort(input);
std::vector <TModID> output;
output.reserve(input.size());
@ -211,17 +338,20 @@ std::vector <TModID> CModHandler::resolveDependencies(std::vector <TModID> input
while (!input.empty())
{
std::set <TModID> toResolve; // list of mods resolved on this iteration
for (auto it = input.begin(); it != input.end();)
{
if (isResolved(allMods.at(*it)))
{
resolvedMods.insert(*it);
toResolve.insert(*it);
output.push_back(*it);
it = input.erase(it);
continue;
}
it++;
}
resolvedMods.insert(toResolve.begin(), toResolve.end());
}
return output;
@ -238,8 +368,6 @@ void CModHandler::initialize(std::vector<std::string> availableMods)
else
modConfig = JsonNode(ResourceID(confName));
CResourceHandler::get()->createResource("config/modSettings.json");
const JsonNode & modList = modConfig["activeMods"];
JsonNode resultingList;
@ -312,28 +440,48 @@ void CModHandler::handleData(Handler handler, const JsonNode & source, std::stri
}
}
void CModHandler::loadActiveMods()
void CModHandler::loadGameContent()
{
CStopWatch timer, totalTime;
CContentHandler content;
logGlobal->infoStream() << "\tInitializing content hander: " << timer.getDiff() << " ms";
// first - load virtual "core" mod tht contains all data
// TODO? move all data into real mods? RoE, AB, SoD, WoG
content.preloadModData("core", JsonNode(ResourceID("config/gameConfig.json")));
logGlobal->infoStream() << "\tParsing original game data: " << timer.getDiff() << " ms";
BOOST_FOREACH(const TModID & modName, activeMods)
{
logGlobal->infoStream() << "\t\tLoading mod " << allMods[modName].name;
logGlobal->infoStream() << "\t\t" << allMods[modName].name;
std::string modFileName = "mods/" + modName + "/mod.json";
const JsonNode config = JsonNode(ResourceID(modFileName));
JsonUtils::validate(config, "vcmi:mod", modName);
handleData(VLC->townh, config, "factions", "vcmi:faction");
handleData(VLC->creh, config, "creatures", "vcmi:creature");
handleData(VLC->arth, config, "artifacts", "vcmi:artifact");
//todo: spells
handleData(&VLC->heroh->classes, config,"heroClasses", "vcmi:heroClass");
handleData(VLC->heroh, config, "heroes", "vcmi:hero");
content.preloadModData(modName, config);
}
logGlobal->infoStream() << "\tParsing mod data: " << timer.getDiff() << " ms";
content.loadMod("core");
logGlobal->infoStream() << "\tLoading original game data: " << timer.getDiff() << " ms";
BOOST_FOREACH(const TModID & modName, activeMods)
{
content.loadMod(modName);
logGlobal->infoStream() << "\t\t" << allMods[modName].name;
}
logGlobal->infoStream() << "\tLoading mod data: " << timer.getDiff() << "ms";
logGlobal->infoStream() << "\tDone loading data";
VLC->creh->loadCrExpBon();
VLC->creh->buildBonusTreeForTiers(); //do that after all new creatures are loaded
identifiers.finalize();
logGlobal->infoStream() << "\tAll game content loaded in " << totalTime.getDiff() << " ms";
}
void CModHandler::reload()
@ -380,37 +528,42 @@ void CModHandler::reload()
const CGDefInfo * baseInfo = VLC->dobjinfo->gobjs[Obj::TOWN].begin()->second;
auto & townInfos = VLC->dobjinfo->gobjs[Obj::TOWN];
BOOST_FOREACH(auto & town, VLC->townh->towns)
BOOST_FOREACH(auto & faction, VLC->townh->factions)
{
auto & cientInfo = town.second.clientInfo;
if (!vstd::contains(VLC->dobjinfo->gobjs[Obj::TOWN], town.first)) // no obj info for this type
TFaction index = faction->index;
CTown * town = faction->town;
if (town)
{
CGDefInfo * info = new CGDefInfo(*baseInfo);
info->subid = town.first;
auto & cientInfo = town->clientInfo;
townInfos[town.first] = info;
}
townInfos[town.first]->name = cientInfo.advMapCastle;
VLC->dobjinfo->villages[town.first] = new CGDefInfo(*townInfos[town.first]);
VLC->dobjinfo->villages[town.first]->name = cientInfo.advMapVillage;
VLC->dobjinfo->capitols[town.first] = new CGDefInfo(*townInfos[town.first]);
VLC->dobjinfo->capitols[town.first]->name = cientInfo.advMapCapitol;
for (int i = 0; i < town.second.dwellings.size(); ++i)
{
const CGDefInfo * baseInfo = VLC->dobjinfo->gobjs[Obj::CREATURE_GENERATOR1][i]; //get same blockmap as first dwelling of tier i
BOOST_FOREACH (auto cre, town.second.creatures[i]) //both unupgraded and upgraded get same dwelling
if (!vstd::contains(VLC->dobjinfo->gobjs[Obj::TOWN], index)) // no obj info for this type
{
CGDefInfo * info = new CGDefInfo(*baseInfo);
info->subid = cre;
info->name = town.second.dwellings[i];
VLC->dobjinfo->gobjs[Obj::CREATURE_GENERATOR1][cre] = info;
info->subid = index;
VLC->objh->cregens[cre] = cre; //map of dwelling -> creature id
townInfos[index] = info;
}
townInfos[index]->name = cientInfo.advMapCastle;
VLC->dobjinfo->villages[index] = new CGDefInfo(*townInfos[index]);
VLC->dobjinfo->villages[index]->name = cientInfo.advMapVillage;
VLC->dobjinfo->capitols[index] = new CGDefInfo(*townInfos[index]);
VLC->dobjinfo->capitols[index]->name = cientInfo.advMapCapitol;
for (int i = 0; i < town->dwellings.size(); ++i)
{
const CGDefInfo * baseInfo = VLC->dobjinfo->gobjs[Obj::CREATURE_GENERATOR1][i]; //get same blockmap as first dwelling of tier i
BOOST_FOREACH (auto cre, town->creatures[i]) //both unupgraded and upgraded get same dwelling
{
CGDefInfo * info = new CGDefInfo(*baseInfo);
info->subid = cre;
info->name = town->dwellings[i];
VLC->dobjinfo->gobjs[Obj::CREATURE_GENERATOR1][cre] = info;
VLC->objh->cregens[cre] = cre; //map of dwelling -> creature id
}
}
}
}

View File

@ -3,6 +3,7 @@
#include "filesystem/CResourceLoader.h"
#include "VCMI_Lib.h"
#include "JsonNode.h"
/*
* CModHandler.h, part of VCMI engine
@ -18,6 +19,7 @@ class CModHandler;
class CModIndentifier;
class CModInfo;
class JsonNode;
class IHandlerBase;
/// class that stores all object identifiers strings and maps them to numeric ID's
/// if possible, objects ID's should be in format <type>.<name>, camelCase e.g. "creature.grandElf"
@ -26,17 +28,60 @@ 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)
/// 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
void requestIdentifier(std::string name, const boost::function<void(si32)> & callback);
/// registers new object, calls all associated callbacks
void registerObject(std::string name, si32 identifier);
void registerObject(std::string scope, std::string type, std::string name, si32 identifier);
/// called at the very end of loading to check for any missing ID's
void finalize() const;
void finalize();
};
/// class used to load all game data into handlers. Used only during loading
class CContentHandler
{
/// internal type to handle loading of one data type (e.g. artifacts, creatures)
class ContentTypeHandler
{
struct ModInfo
{
/// mod data from this mod and for this mod
JsonNode modData;
/// mod data for this mod from other mods (patches)
JsonNode patches;
};
/// handler to which all data will be loaded
IHandlerBase * handler;
std::string objectName;
/// contains all loaded H3 data
std::vector<JsonNode> originalData;
std::map<std::string, ModInfo> modData;
public:
ContentTypeHandler(IHandlerBase * handler, size_t size, std::string objectName);
/// local version of methods in ContentHandler
void preloadModData(std::string modName, std::vector<std::string> fileList);
void loadMod(std::string modName);
};
std::map<std::string, ContentTypeHandler> handlers;
public:
/// fully initialize object. Will cause reading of H3 config files
CContentHandler();
/// preloads all data from fileList as data from modName
void preloadModData(std::string modName, JsonNode modConfig);
/// actually loads data in mod
void loadMod(std::string modName);
};
typedef std::string TModID;
@ -99,7 +144,7 @@ public:
std::vector<std::string> getActiveMods();
/// load content from all available mods
void loadActiveMods();
void loadGameContent();
/// actions that should be triggered on map restart
/// TODO: merge into appropriate handlers?

View File

@ -213,7 +213,7 @@ static void readBankLevel(const JsonNode &level, BankConfig &bc)
bc.easiest = level["easiest"].Float();
}
void CObjectHandler::load()
CObjectHandler::CObjectHandler()
{
logGlobal->traceStream() << "\t\tReading cregens ";
@ -614,7 +614,7 @@ ui32 CGHeroInstance::getTileCost(const TerrainTile &dest, const TerrainTile &fro
bool nativeArmy = true;
BOOST_FOREACH(auto stack, stacks)
{
int nativeTerrain = VLC->townh->factions[stack.second->type->faction].nativeTerrain;
int nativeTerrain = VLC->townh->factions[stack.second->type->faction]->nativeTerrain;
if (nativeTerrain != -1 && nativeTerrain != from.terType)
{
@ -813,7 +813,7 @@ void CGHeroInstance::initHero()
if (VLC->modh->modules.COMMANDERS && !commander)
{
commander = new CCommanderInstance (VLC->townh->factions[type->heroClass->faction].commander);
commander = new CCommanderInstance (VLC->townh->factions[type->heroClass->faction]->commander);
commander->setArmyObj (castToArmyObj()); //TODO: separate function for setting commanders
commander->giveStackExp (exp); //after our exp is set
}
@ -1672,9 +1672,9 @@ void CGDwelling::initObj()
creatures[0].second.push_back(crid);
if (subID >= VLC->generaltexth->creGens.size()) //very messy workaround
{
TFaction faction = VLC->creh->creatures[subID]->faction;
assert (VLC->townh->towns[faction].dwellingNames.size());
hoverName = VLC->townh->towns[faction].dwellingNames[VLC->creh->creatures[subID]->level - 1];
auto & dwellingNames = VLC->townh->factions[crs->faction]->town->dwellingNames;
assert (!dwellingNames.empty());
hoverName = dwellingNames[VLC->creh->creatures[subID]->level - 1];
}
else
hoverName = VLC->generaltexth->creGens[subID];
@ -2201,7 +2201,7 @@ void CGTownInstance::initObj()
///initialize town structures
{
blockVisit = true;
hoverName = name + ", " + VLC->townh->factions[town->typeID].name;
hoverName = name + ", " + town->faction->name;
if (subID == ETownType::DUNGEON)
creatures.resize(GameConstants::CREATURES_PER_TOWN+1);//extra dwelling for Dungeon
@ -2355,7 +2355,7 @@ void CGTownInstance::removeCapitols (PlayerColor owner) const
int CGTownInstance::getBoatType() const
{
switch (VLC->townh->factions[town->typeID].alignment)
switch (town->faction->alignment)
{
case EAlignment::EVIL : return 0;
case EAlignment::GOOD : return 1;
@ -2431,7 +2431,7 @@ std::vector<int> CGTownInstance::availableItemsIds(EMarketMode::EMarketMode mode
std::string CGTownInstance::nodeName() const
{
return "Town (" + (town ? VLC->townh->factions[town->typeID].name : "unknown") + ") of " + name;
return "Town (" + (town ? town->faction->name : "unknown") + ") of " + name;
}
void CGTownInstance::deserializationFix()
@ -2448,6 +2448,8 @@ void CGTownInstance::deserializationFix()
void CGTownInstance::recreateBuildingsBonuses()
{
static TPropagatorPtr playerProp(new CPropagatorNodeType(PLAYER));
BonusList bl;
getExportedBonusList().getBonuses(bl, Selector::sourceType(Bonus::TOWN_STRUCTURE));
BOOST_FOREACH(Bonus *b, bl)
@ -2459,13 +2461,13 @@ void CGTownInstance::recreateBuildingsBonuses()
if(subID == ETownType::CASTLE) //castle
{
addBonusIfBuilt(BuildingID::LIGHTHOUSE, Bonus::SEA_MOVEMENT, +500, make_shared<CPropagatorNodeType>(PLAYER));
addBonusIfBuilt(BuildingID::GRAIL, Bonus::MORALE, +2, make_shared<CPropagatorNodeType>(PLAYER)); //colossus
addBonusIfBuilt(BuildingID::LIGHTHOUSE, Bonus::SEA_MOVEMENT, +500, playerProp);
addBonusIfBuilt(BuildingID::GRAIL, Bonus::MORALE, +2, playerProp); //colossus
}
else if(subID == ETownType::RAMPART) //rampart
{
addBonusIfBuilt(BuildingID::FOUNTAIN_OF_FORTUNE, Bonus::LUCK, +2); //fountain of fortune
addBonusIfBuilt(BuildingID::GRAIL, Bonus::LUCK, +2, make_shared<CPropagatorNodeType>(PLAYER)); //guardian spirit
addBonusIfBuilt(BuildingID::GRAIL, Bonus::LUCK, +2, playerProp); //guardian spirit
}
else if(subID == ETownType::TOWER) //tower
{
@ -2478,8 +2480,8 @@ void CGTownInstance::recreateBuildingsBonuses()
else if(subID == ETownType::NECROPOLIS) //necropolis
{
addBonusIfBuilt(BuildingID::COVER_OF_DARKNESS, Bonus::DARKNESS, +20);
addBonusIfBuilt(BuildingID::NECROMANCY_AMPLIFIER, Bonus::SECONDARY_SKILL_PREMY, +10, make_shared<CPropagatorNodeType>(PLAYER), SecondarySkill::NECROMANCY); //necromancy amplifier
addBonusIfBuilt(BuildingID::GRAIL, Bonus::SECONDARY_SKILL_PREMY, +20, make_shared<CPropagatorNodeType>(PLAYER), SecondarySkill::NECROMANCY); //Soul prison
addBonusIfBuilt(BuildingID::NECROMANCY_AMPLIFIER, Bonus::SECONDARY_SKILL_PREMY, +10, playerProp, SecondarySkill::NECROMANCY); //necromancy amplifier
addBonusIfBuilt(BuildingID::GRAIL, Bonus::SECONDARY_SKILL_PREMY, +20, playerProp, SecondarySkill::NECROMANCY); //Soul prison
}
else if(subID == ETownType::DUNGEON) //Dungeon
{
@ -2504,10 +2506,11 @@ void CGTownInstance::recreateBuildingsBonuses()
bool CGTownInstance::addBonusIfBuilt(BuildingID building, Bonus::BonusType type, int val, int subtype /*= -1*/)
{
return addBonusIfBuilt(building, type, val, TPropagatorPtr(), subtype);
static auto emptyPropagator = TPropagatorPtr();
return addBonusIfBuilt(building, type, val, emptyPropagator, subtype);
}
bool CGTownInstance::addBonusIfBuilt(BuildingID building, Bonus::BonusType type, int val, TPropagatorPtr prop, int subtype /*= -1*/)
bool CGTownInstance::addBonusIfBuilt(BuildingID building, Bonus::BonusType type, int val, TPropagatorPtr & prop, int subtype /*= -1*/)
{
if(hasBuilt(building))
{
@ -2595,7 +2598,7 @@ const CArmedInstance * CGTownInstance::getUpperArmy() const
bool CGTownInstance::hasBuilt(BuildingID buildingID, int townID) const
{
if (townID == town->typeID || townID == ETownType::ANY)
if (townID == town->faction->index || townID == ETownType::ANY)
return hasBuilt(buildingID);
return false;
}
@ -2675,7 +2678,7 @@ void CGVisitableOPH::initObj()
case 2:
treePrice[Res::GEMS] = 10;
break;
default:
default:
break;
}
}
@ -2968,8 +2971,8 @@ void CGVisitableOPH::blockingDialogAnswered(const CGHeroInstance *hero, ui32 ans
case Obj::SCHOOL_OF_WAR:
schoolSelected(id, answer);
default:
assert(0);
default:
assert(0);
break;
}
}
@ -3100,9 +3103,11 @@ const std::string & CGCreature::getHoverText() const
{
if(stacks.empty())
{
static const std::string errorValue("!!!INVALID_STACK!!!");
//should not happen...
logGlobal->errorStream() << "Invalid stack at tile " << pos << ": subID=" << subID << "; id=" << id;
return "!!!INVALID_STACK!!!";
return errorValue; // references to temporary are illegal - use pre-constructed string
}
MetaString ms;
@ -6980,7 +6985,7 @@ void CArmedInstance::randomizeArmy(int type)
{
int level = (randID-VLC->creh->creatures.size()) / 2 -1;
bool upgrade = !(randID % 2);
j->second->setType(VLC->townh->towns[type].creatures[level][upgrade]);
j->second->setType(VLC->townh->factions[type]->town->creatures[level][upgrade]);
randID = -1;
}
@ -7035,7 +7040,7 @@ void CArmedInstance::updateMoraleBonusFromArmy()
BOOST_FOREACH(TFaction f, factions)
{
if (VLC->townh->factions[f].alignment != EAlignment::EVIL)
if (VLC->townh->factions[f]->alignment != EAlignment::EVIL)
mixableFactions++;
}
if (mixableFactions > 0)
@ -7397,7 +7402,7 @@ GrowthInfo::Entry::Entry(const std::string &format, int _count)
GrowthInfo::Entry::Entry(int subID, BuildingID building, int _count)
: count(_count)
{
description = boost::str(boost::format("%s %+d") % VLC->townh->towns[subID].buildings[building]->Name() % count);
description = boost::str(boost::format("%s %+d") % VLC->townh->factions[subID]->town->buildings[building]->Name() % count);
}
CTownAndVisitingHero::CTownAndVisitingHero()

View File

@ -622,7 +622,7 @@ public:
std::string nodeName() const override;
void deserializationFix();
void recreateBuildingsBonuses();
bool addBonusIfBuilt(BuildingID building, Bonus::BonusType type, int val, TPropagatorPtr prop, int subtype = -1); //returns true if building is built and bonus has been added
bool addBonusIfBuilt(BuildingID building, Bonus::BonusType type, int val, TPropagatorPtr &prop, int subtype = -1); //returns true if building is built and bonus has been added
bool addBonusIfBuilt(BuildingID building, Bonus::BonusType type, int val, int subtype = -1); //convienence version of above
void setVisitingHero(CGHeroInstance *h);
void setGarrisonedHero(CGHeroInstance *h);
@ -1403,7 +1403,8 @@ public:
std::map <ui32, std::string> creBanksNames; //[crebank index] -> name of this creature bank
std::vector<ui32> resVals; //default values of resources in gold
void load();
CObjectHandler();
int bankObjToIndex (const CGObjectInstance * obj);
template <typename Handler> void serialize(Handler &h, const int version)

View File

@ -246,10 +246,10 @@ void CSpell::getEffects(std::vector<Bonus>& lst, const int level) const
}
lst.reserve(lst.size() + effects[level].size());
BOOST_FOREACH (Bonus b, effects[level])
BOOST_FOREACH (Bonus *b, effects[level])
{
//TODO: value, add value
lst.push_back(b);
lst.push_back(Bonus(*b));
}
}
@ -344,10 +344,6 @@ bool DLL_LINKAGE isInScreenRange(const int3 &center, const int3 &pos)
return false;
}
CSpellHandler::CSpellHandler()
{
}
CSpell * CSpellHandler::loadSpell(CLegacyConfigParser & parser, const SpellID id)
{
CSpell * spell = new CSpell; //new currently being read spell
@ -397,7 +393,7 @@ CSpell * CSpellHandler::loadSpell(CLegacyConfigParser & parser, const SpellID id
return spell;
}
void CSpellHandler::load()
CSpellHandler::CSpellHandler()
{
CLegacyConfigParser parser("DATA/SPTRAITS.TXT");
@ -449,7 +445,7 @@ void CSpellHandler::load()
s->counteredSpells = spell.second["counters"].convertTo<std::vector<SpellID> >();
s->identifier = spell.first;
VLC->modh->identifiers.registerObject("spell." + spell.first, spellID);
VLC->modh->identifiers.registerObject("core", "spell", spell.first, spellID);
const JsonNode & flags_node = spell.second["flags"];
if (!flags_node.isNull())
@ -495,7 +491,7 @@ void CSpellHandler::load()
if (!a.empty())
b->additionalInfo = a[i];
s->effects[i].push_back(*b);
s->effects[i].push_back(b);
}
}
@ -537,7 +533,7 @@ void CSpellHandler::load()
}
}
std::vector<bool> CSpellHandler::getDefaultAllowedSpells() const
std::vector<bool> CSpellHandler::getDefaultAllowed() const
{
std::vector<bool> allowedSpells;
allowedSpells.resize(GameConstants::SPELLS_QUANTITY, true);

View File

@ -96,7 +96,7 @@ private:
ETargetType targetType;
std::vector<Bonus> effects [4];
std::vector<Bonus *> effects [4];
std::vector<Bonus::BonusType> immunities; //any of these grants immunity
std::vector<Bonus::BonusType> limiters; //all of them are required to be affected
@ -168,14 +168,12 @@ public:
CSpellHandler();
std::vector< ConstTransitivePtr<CSpell> > spells;
void load();
/**
* Gets a list of default allowed spells. OH3 spells are all allowed by default.
*
* @return a list of allowed spells, the index is the spell id and the value either 0 for not allowed or 1 for allowed
*/
std::vector<bool> getDefaultAllowedSpells() const;
std::vector<bool> getDefaultAllowed() const;
template <typename Handler> void serialize(Handler &h, const int version)
{

View File

@ -37,18 +37,18 @@ BuildingID CBuilding::getBase() const
{
const CBuilding * build = this;
while (build->upgrade >= 0)
build = VLC->townh->towns[build->tid].buildings[build->upgrade];
build = build->town->buildings[build->upgrade];
return build->bid;
}
si32 CBuilding::getDistance(BuildingID buildID) const
{
const CBuilding * build = VLC->townh->towns[tid].buildings[buildID];
const CBuilding * build = town->buildings[buildID];
int distance = 0;
while (build->upgrade >= 0 && build != this)
{
build = VLC->townh->towns[build->tid].buildings[build->upgrade];
build = build->town->buildings[build->upgrade];
distance++;
}
if (build == this)
@ -76,28 +76,31 @@ JsonNode readBuilding(CLegacyConfigParser & parser)
return ret;
}
void CTownHandler::loadLegacyData(JsonNode & dest)
std::vector<JsonNode> CTownHandler::loadLegacyData(size_t dataSize)
{
std::vector<JsonNode> dest(dataSize);
factions.resize(dataSize);
auto getBuild = [&](size_t town, size_t building) -> JsonNode &
{
return dest[town]["town"]["buildings"][EBuildingType::names[building]];
};
CLegacyConfigParser parser("DATA/BUILDING.TXT");
dest.Vector().resize(GameConstants::F_NUMBER);
parser.endLine(); // header
parser.endLine();
//Unique buildings
for (size_t town=0; town<GameConstants::F_NUMBER; town++)
for (size_t town=0; town<dataSize; town++)
{
JsonVector & buildList = dest.Vector()[town]["buildings"].Vector();
buildList.resize( 30 ); //prepare vector for first set of buildings
parser.endLine(); //header
parser.endLine();
int buildID = 17;
do
{
buildList[buildID] = readBuilding(parser);
getBuild(town, buildID) = readBuilding(parser);
buildID++;
}
while (!parser.isNextEntryEmpty());
@ -113,8 +116,8 @@ void CTownHandler::loadLegacyData(JsonNode & dest)
{
JsonNode building = readBuilding(parser);
for (size_t town=0; town<GameConstants::F_NUMBER; town++)
dest.Vector()[town]["buildings"].Vector()[buildID] = building;
for (size_t town=0; town<dataSize; town++)
getBuild(town, buildID) = building;
buildID++;
}
@ -124,16 +127,15 @@ void CTownHandler::loadLegacyData(JsonNode & dest)
parser.endLine();
//Dwellings
for (size_t town=0; town<GameConstants::F_NUMBER; town++)
for (size_t town=0; town<dataSize; town++)
{
parser.endLine(); //header
parser.endLine();
do
for (size_t i=0; i<14; i++)
{
dest.Vector()[town]["buildings"].Vector().push_back(readBuilding(parser));
getBuild(town, 30+i) = readBuilding(parser);
}
while (!parser.isNextEntryEmpty());
}
{
CLegacyConfigParser parser("DATA/BLDGNEUT.TXT");
@ -144,11 +146,10 @@ void CTownHandler::loadLegacyData(JsonNode & dest)
std::string descr = parser.readString();
parser.endLine();
for(int j=0; j<GameConstants::F_NUMBER; j++)
for(int j=0; j<dataSize; j++)
{
JsonVector & buildings = dest.Vector()[j]["buildings"].Vector();
buildings[building]["name"].String() = name;
buildings[building]["description"].String() = descr;
getBuild(j, building)["name"].String() = name;
getBuild(j, building)["description"].String() = descr;
}
}
parser.endLine(); // silo
@ -160,53 +161,49 @@ void CTownHandler::loadLegacyData(JsonNode & dest)
std::string descr = parser.readString();
parser.endLine();
for(int town=0; town<GameConstants::F_NUMBER; town++)
for(int town=0; town<dataSize; town++)
{
JsonVector & buildings = dest.Vector()[town]["buildings"].Vector();
buildings[20]["name"].String() = name;
buildings[20]["description"].String() = descr;
getBuild(town, 20)["name"].String() = name;
getBuild(town, 20)["description"].String() = descr;
}
//blacksmith
for(int town=0; town<GameConstants::F_NUMBER; town++)
for(int town=0; town<dataSize; town++)
{
JsonVector & buildings = dest.Vector()[town]["buildings"].Vector();
buildings[16]["name"].String() = parser.readString();
buildings[16]["description"].String() = parser.readString();
getBuild(town, 16)["name"].String() = parser.readString();
getBuild(town, 16)["description"].String() = parser.readString();
parser.endLine();
}
}
{
CLegacyConfigParser parser("DATA/BLDGSPEC.TXT");
for(int town=0; town<GameConstants::F_NUMBER; town++)
for(int town=0; town<dataSize; town++)
{
JsonVector & buildings = dest.Vector()[town]["buildings"].Vector();
for(int build=0; build<9; build++)
{
buildings[17+build]["name"].String() = parser.readString();
buildings[17+build]["description"].String() = parser.readString();
getBuild(town, 17 + build)["name"].String() = parser.readString();
getBuild(town, 17 + build)["description"].String() = parser.readString();
parser.endLine();
}
buildings[26]["name"].String() = parser.readString(); // Grail
buildings[26]["description"].String() = parser.readString();
getBuild(town, 26)["name"].String() = parser.readString(); // Grail
getBuild(town, 26)["description"].String() = parser.readString();
parser.endLine();
buildings[15]["name"].String() = parser.readString(); // Resource silo
buildings[15]["description"].String() = parser.readString();
getBuild(town, 15)["name"].String() = parser.readString(); // Resource silo
getBuild(town, 15)["description"].String() = parser.readString();
parser.endLine();
}
}
{
CLegacyConfigParser parser("DATA/DWELLING.TXT");
for(int town=0; town<GameConstants::F_NUMBER; town++)
for(int town=0; town<dataSize; town++)
{
JsonVector & buildings = dest.Vector()[town]["buildings"].Vector();
for(int build=0; build<14; build++)
{
buildings[30+build]["name"].String() = parser.readString();
buildings[30+build]["description"].String() = parser.readString();
getBuild(town, 30 + build)["name"].String() = parser.readString();
getBuild(town, 30 + build)["description"].String() = parser.readString();
parser.endLine();
}
}
@ -217,22 +214,20 @@ void CTownHandler::loadLegacyData(JsonNode & dest)
size_t townID=0;
do
{
JsonNode & town = dest.Vector()[townID];
town["name"].String() = typeParser.readString();
dest[townID]["name"].String() = typeParser.readString();
for (int i=0; i<NAMES_PER_TOWN; i++)
{
JsonNode name;
name.String() = nameParser.readString();
town["names"].Vector().push_back(name);
dest[townID]["town"]["names"].Vector().push_back(name);
nameParser.endLine();
}
townID++;
}
while (typeParser.endLine());
}
return dest;
}
void CTownHandler::loadBuilding(CTown &town, const JsonNode & source)
@ -243,7 +238,7 @@ void CTownHandler::loadBuilding(CTown &town, const JsonNode & source)
ret->mode = static_cast<CBuilding::EBuildMode>(boost::find(modes, source["mode"].String()) - modes);
ret->tid = town.typeID;
ret->town = &town;
ret->bid = BuildingID(source["id"].Float());
ret->name = source["name"].String();
ret->description = source["description"].String();
@ -265,9 +260,21 @@ void CTownHandler::loadBuilding(CTown &town, const JsonNode & source)
void CTownHandler::loadBuildings(CTown &town, const JsonNode & source)
{
BOOST_FOREACH(const JsonNode &node, source.Vector())
if (source.getType() == JsonNode::DATA_VECTOR)
{
loadBuilding(town, node);
BOOST_FOREACH(auto &node, source.Vector())
{
if (!node.isNull())
loadBuilding(town, node);
}
}
else
{
BOOST_FOREACH(auto &node, source.Struct())
{
if (!node.second.isNull())
loadBuilding(town, node.second);
}
}
}
@ -304,9 +311,21 @@ void CTownHandler::loadStructure(CTown &town, const JsonNode & source)
void CTownHandler::loadStructures(CTown &town, const JsonNode & source)
{
BOOST_FOREACH(const JsonNode &node, source.Vector())
if (source.getType() == JsonNode::DATA_VECTOR)
{
loadStructure(town, node);
BOOST_FOREACH(auto &node, source.Vector())
{
if (!node.isNull())
loadStructure(town, node);
}
}
else
{
BOOST_FOREACH(auto &node, source.Struct())
{
if (!node.second.isNull())
loadStructure(town, node.second);
}
}
}
@ -415,7 +434,7 @@ void CTownHandler::loadTown(CTown &town, const JsonNode & source)
{
auto resIter = boost::find(GameConstants::RESOURCE_NAMES, source["primaryResource"].String());
if (resIter == boost::end(GameConstants::RESOURCE_NAMES))
town.primaryRes = 127; //Wood + Ore
town.primaryRes = Res::WOOD_AND_ORE; //Wood + Ore
else
town.primaryRes = resIter - boost::begin(GameConstants::RESOURCE_NAMES);
@ -462,7 +481,7 @@ void CTownHandler::loadTown(CTown &town, const JsonNode & source)
VLC->modh->identifiers.requestIdentifier("heroClass." + node.first, [=, &town](si32 classID)
{
VLC->heroh->classes.heroClasses[classID]->selectionProbability[town.typeID] = chance;
VLC->heroh->classes.heroClasses[classID]->selectionProbability[town.faction->index] = chance;
});
}
@ -472,7 +491,7 @@ void CTownHandler::loadTown(CTown &town, const JsonNode & source)
VLC->modh->identifiers.requestIdentifier("spell." + node.first, [=, &town](si32 spellID)
{
SpellID(spellID).toSpell()->probabilities[town.typeID] = chance;
SpellID(spellID).toSpell()->probabilities[town.faction->index] = chance;
});
}
@ -506,101 +525,68 @@ void CTownHandler::loadPuzzle(CFaction &faction, const JsonNode &source)
assert(faction.puzzleMap.size() == GameConstants::PUZZLE_MAP_PIECES);
}
void CTownHandler::load(std::string townID, const JsonNode &source)
CFaction * CTownHandler::loadFromJson(const JsonNode &source)
{
int id;
CFaction * faction = new CFaction();
if (source["index"].isNull())
id = factions.rbegin()->first + 1;
else
id = source["index"].Float();
CFaction & faction = factions[id];
faction.factionID = id;
faction.name = source["name"].String();
faction->name = source["name"].String();
VLC->modh->identifiers.requestIdentifier ("creature." + source["commander"].String(),
[=](si32 commanderID)
{
factions[id].commander = CreatureID(commanderID);
faction->commander = CreatureID(commanderID);
});
faction.creatureBg120 = source["creatureBackground"]["120px"].String();
faction.creatureBg130 = source["creatureBackground"]["130px"].String();
faction->creatureBg120 = source["creatureBackground"]["120px"].String();
faction->creatureBg130 = source["creatureBackground"]["130px"].String();
faction.nativeTerrain = ETerrainType(vstd::find_pos(GameConstants::TERRAIN_NAMES,
faction->nativeTerrain = ETerrainType(vstd::find_pos(GameConstants::TERRAIN_NAMES,
source["nativeTerrain"].String()));
int alignment = vstd::find_pos(EAlignment::names, source["alignment"].String());
if (alignment == -1)
faction.alignment = EAlignment::NEUTRAL;
faction->alignment = EAlignment::NEUTRAL;
else
faction.alignment = static_cast<EAlignment::EAlignment>(alignment);
faction->alignment = static_cast<EAlignment::EAlignment>(alignment);
if (!source["town"].isNull())
{
towns[id].typeID = id;
loadTown(towns[id], source["town"]);
faction->town = new CTown;
faction->town->faction = faction;
loadTown(*faction->town, source["town"]);
}
if (!source["puzzleMap"].isNull())
loadPuzzle(faction, source["puzzleMap"]);
loadPuzzle(*faction, source["puzzleMap"]);
logGlobal->traceStream() << "Added faction: " << townID;
VLC->modh->identifiers.registerObject(std::string("faction.") + townID, faction.factionID);
return faction;
}
void CTownHandler::load()
void CTownHandler::loadObject(std::string scope, std::string name, const JsonNode & data)
{
JsonNode gameConf(ResourceID("config/gameConfig.json"));
JsonNode buildingsConf = JsonUtils::assembleFromFiles(gameConf["factions"].convertTo<std::vector<std::string> >());
auto object = loadFromJson(data);
object->index = factions.size();
JsonNode legacyConfig;
loadLegacyData(legacyConfig);
factions.push_back(object);
// semi-manually merge legacy config with towns json
for (size_t i=0; i< legacyConfig.Vector().size(); i++)
{
JsonNode & legacyFaction = legacyConfig.Vector()[i];
JsonNode & outputFaction = buildingsConf[ETownType::names[i]];
if (outputFaction["name"].isNull())
outputFaction["name"] = legacyFaction["name"];
if (!outputFaction["town"].isNull())
{
if (outputFaction["town"]["names"].isNull())
outputFaction["town"]["names"] = legacyFaction["names"];
JsonNode & outputBuildings = outputFaction["town"]["buildings"];
JsonVector & legacyBuildings = legacyFaction["buildings"].Vector();
BOOST_FOREACH(JsonNode & building, outputBuildings.Vector())
{
if (vstd::contains(building.Struct(), "id") &&
legacyBuildings.size() > building["id"].Float() )
{
//find same buildings in legacy and json configs
JsonNode & legacyBuilding = legacyBuildings[building["id"].Float()];
if (!legacyBuilding.isNull()) //merge if h3 config was found for this building
JsonUtils::merge(building, legacyBuilding);
}
}
}
}
BOOST_FOREACH(auto & entry, buildingsConf.Struct())
{
//JsonUtils::validate(entry.second, "vcmi:faction", entry.first);
load(entry.first, entry.second);
}
VLC->modh->identifiers.registerObject(scope, "faction", name, object->index);
}
std::set<TFaction> CTownHandler::getDefaultAllowedFactions() const
void CTownHandler::loadObject(std::string scope, std::string name, const JsonNode & data, size_t index)
{
std::set<TFaction> allowedFactions;
BOOST_FOREACH(auto town, towns)
auto object = loadFromJson(data);
object->index = index;
assert(factions[index] == nullptr); // ensure that this id was not loaded before
factions[index] = object;
VLC->modh->identifiers.registerObject(scope, "faction", name, object->index);
}
std::vector<bool> CTownHandler::getDefaultAllowed() const
{
std::vector<bool> allowedFactions;
BOOST_FOREACH(auto town, factions)
{
allowedFactions.insert(town.first);
allowedFactions.push_back(town->town != nullptr);
}
return allowedFactions;
}

View File

@ -4,6 +4,7 @@
#include "ResourceSet.h"
#include "int3.h"
#include "GameConstants.h"
#include "IHandlerBase.h"
/*
* CTownHandler.h, part of VCMI engine
@ -17,6 +18,7 @@
class CLegacyConfigParser;
class JsonNode;
class CTown;
/// a typical building encountered in every castle ;]
/// this is structure available to both client and server
@ -28,7 +30,7 @@ class DLL_LINKAGE CBuilding
std::string description;
public:
TFaction tid; //town ID
CTown * town; // town this building belongs to
BuildingID bid; //structure ID
TResources resources;
@ -54,7 +56,7 @@ public:
template <typename Handler> void serialize(Handler &h, const int version)
{
h & tid & bid & resources & name & description & requirements & upgrade & mode;
h & town & bid & resources & name & description & requirements & upgrade & mode;
}
friend class CTownHandler;
@ -79,10 +81,48 @@ struct DLL_LINKAGE CStructure
}
};
struct DLL_LINKAGE SPuzzleInfo
{
ui16 number; //type of puzzle
si16 x, y; //position
ui16 whenUncovered; //determines the sequnce of discovering (the lesser it is the sooner puzzle will be discovered)
std::string filename; //file with graphic of this puzzle
template <typename Handler> void serialize(Handler &h, const int version)
{
h & number & x & y & whenUncovered & filename;
}
};
class CFaction
{
public:
std::string name; //town name, by default - from TownName.txt
TFaction index;
ETerrainType nativeTerrain;
EAlignment::EAlignment alignment;
CreatureID commander;
CTown * town; //NOTE: can be null
std::string creatureBg120;
std::string creatureBg130;
std::vector<SPuzzleInfo> puzzleMap;
template <typename Handler> void serialize(Handler &h, const int version)
{
h & name & index & nativeTerrain & creatureBg120 & creatureBg130 & puzzleMap;
}
};
class DLL_LINKAGE CTown
{
public:
TFaction typeID;//same as CFaction::factionID
CFaction * faction;
std::vector<std::string> names; //names of the town instances
@ -148,48 +188,12 @@ public:
template <typename Handler> void serialize(Handler &h, const int version)
{
h & names & typeID & creatures & dwellings & dwellingNames & buildings & hordeLvl & mageLevel
h & names & faction & creatures & dwellings & dwellingNames & buildings & hordeLvl & mageLevel
& primaryRes & warMachine & clientInfo & moatDamage;
}
};
struct DLL_LINKAGE SPuzzleInfo
{
ui16 number; //type of puzzle
si16 x, y; //position
ui16 whenUncovered; //determines the sequnce of discovering (the lesser it is the sooner puzzle will be discovered)
std::string filename; //file with graphic of this puzzle
template <typename Handler> void serialize(Handler &h, const int version)
{
h & number & x & y & whenUncovered & filename;
}
};
class CFaction
{
public:
std::string name; //town name, by default - from TownName.txt
TFaction factionID;
ETerrainType nativeTerrain;
EAlignment::EAlignment alignment;
CreatureID commander;
std::string creatureBg120;
std::string creatureBg130;
std::vector<SPuzzleInfo> puzzleMap;
template <typename Handler> void serialize(Handler &h, const int version)
{
h & name & factionID & nativeTerrain & creatureBg120 & creatureBg130 & puzzleMap;
}
};
class DLL_LINKAGE CTownHandler
class DLL_LINKAGE CTownHandler : public IHandlerBase
{
/// loads CBuilding's into town
void loadBuilding(CTown &town, const JsonNode & source);
@ -209,38 +213,22 @@ class DLL_LINKAGE CTownHandler
void loadPuzzle(CFaction & faction, const JsonNode & source);
/// load all available data from h3 txt(s) into json structure using format similar to vcmi configs
/// returns 2d array [townID] [buildID] of buildings
void loadLegacyData(JsonNode & dest);
CFaction * loadFromJson(const JsonNode & data);
public:
std::map<TFaction, CTown> towns;
std::map<TFaction, CFaction> factions;
std::vector<ConstTransitivePtr<CFaction> > factions;
CTownHandler(); //c-tor, set pointer in VLC to this
/// main loading function for mods, accepts merged JSON source and add all entries from it into game
/// all entries in JSON should be checked for validness before using this function
void load(std::string townID, const JsonNode & source);
std::vector<JsonNode> loadLegacyData(size_t dataSize) override;
/// "entry point" for loading of OH3 town.
/// reads legacy txt's from H3 + vcmi json, merges them
/// and loads resulting structure to game using loadTowns method
void load();
void loadObject(std::string scope, std::string name, const JsonNode & data) override;
void loadObject(std::string scope, std::string name, const JsonNode & data, size_t index) override;
/**
* Gets a list of default allowed factions. OH3 factions are in the range of 0 to 8.
*
* TODO Proposal for town modding: Replace faction id with a unique machine readable town name
* and create a JSON config file or merge it with other configs which describes which
* towns can be used for random map generation / map editor(default map settings).
*
* @return a list of allowed factions, the index which is unique is the faction id
*/
std::set<TFaction> getDefaultAllowedFactions() const;
std::vector<bool> getDefaultAllowed() const override;
template <typename Handler> void serialize(Handler &h, const int version)
{
h & towns & factions;
h & factions;
}
};

View File

@ -209,10 +209,14 @@ class PlayerColor : public BaseForID<PlayerColor, ui8>
{
INSTID_LIKE_CLASS_COMMON(PlayerColor, ui8)
enum EPlayerColor
{
PLAYER_LIMIT_I = 8
};
DLL_LINKAGE static const PlayerColor CANNOT_DETERMINE; //253
DLL_LINKAGE static const PlayerColor UNFLAGGABLE; //254 - neutral objects (pandora, banks)
DLL_LINKAGE static const PlayerColor NEUTRAL; //255
DLL_LINKAGE static const int PLAYER_LIMIT_I = 8; //player limit per map
DLL_LINKAGE static const PlayerColor PLAYER_LIMIT; //player limit per map
DLL_LINKAGE bool isValidPlayer() const; //valid means < PLAYER_LIMIT (especially non-neutral)

View File

@ -1158,7 +1158,7 @@ Bonus::Bonus()
valType = ADDITIVE_VALUE;
effectRange = NO_LIMIT;
val = 0;
source = OTHER;
source = OTHER;
}
Bonus::~Bonus()

View File

@ -256,7 +256,7 @@ template DLL_LINKAGE void CPrivilagedInfoCallback::loadCommonState<CLoadIntegrit
template DLL_LINKAGE void CPrivilagedInfoCallback::loadCommonState<CLoadFile>(CLoadFile&);
template DLL_LINKAGE void CPrivilagedInfoCallback::saveCommonState<CSaveFile>(CSaveFile&) const;
inline TerrainTile * CNonConstInfoCallback::getTile( int3 pos )
TerrainTile * CNonConstInfoCallback::getTile( int3 pos )
{
if(!gs->map->isInTheMap(pos))
return NULL;
@ -274,7 +274,7 @@ const CTown * CGameInfoCallback::getNativeTown(PlayerColor color) const
{
const PlayerSettings *ps = getPlayerSettings(color);
ERROR_RET_VAL_IF(!ps, "There is no such player!", NULL);
return &VLC->townh->towns[ps->castle];
return VLC->townh->factions[ps->castle]->town;
}
const CGObjectInstance * CGameInfoCallback::getObjByQuestIdentifier(int identifier) const
@ -900,7 +900,6 @@ CGHeroInstance *CNonConstInfoCallback::getHero(ObjectInstanceID objid)
CGTownInstance *CNonConstInfoCallback::getTown(ObjectInstanceID objid)
{
return const_cast<CGTownInstance*>(CGameInfoCallback::getTown(objid));
}

40
lib/IHandlerBase.h Normal file
View File

@ -0,0 +1,40 @@
#pragma once
/*
* IHandlerBase.h, part of VCMI engine
*
* Authors: listed in file AUTHORS in main folder
*
* License: GNU General Public License v2.0 or later
* Full text of license available in license.txt file, in main folder
*
*/
class JsonNode;
/// base class for all handlers that can be accessed from mod system
class DLL_LINKAGE IHandlerBase
{
// there also should be private member with such signature:
// Object * loadFromJson(const JsonNode & json);
// where Object is type of data loaded by handler
// primary used in loadObject methods
public:
/// loads all original game data in vector of json nodes
/// dataSize - is number of items that must be loaded (normally - constant from GameConstants)
virtual std::vector<JsonNode> loadLegacyData(size_t dataSize) = 0;
/// loads single object into game. Scope is namespace of this object, same as name of source mod
virtual void loadObject(std::string scope, std::string name, const JsonNode & data) = 0;
virtual void loadObject(std::string scope, std::string name, const JsonNode & data, size_t index) = 0;
/**
* Gets a list of objects that are allowed by default on maps
*
* @return a list of allowed objects, the index is the object id
*/
virtual std::vector<bool> getDefaultAllowed() const = 0;
virtual ~IHandlerBase(){}
};

View File

@ -1125,8 +1125,8 @@ bool JsonValidator::validate(const JsonNode &root, std::string schemaName, std::
if (!errors.empty())
{
logGlobal->warnStream() << "Data in " << name << " is invalid!";
logGlobal->warnStream() << errors;
logGlobal->warnStream() << "Data in " << name << " is invalid!";
logGlobal->warnStream() << errors;
}
return errors.empty();
@ -1162,7 +1162,7 @@ Bonus * JsonUtils::parseBonus (const JsonVector &ability_vec) //TODO: merge with
template <typename T>
const T & parseByMap(const std::map<std::string, T> & map, const JsonNode * val, std::string err)
{
static T defaultValue;
static T defaultValue = T();
if (!val->isNull())
{
std::string type = val->String();
@ -1179,7 +1179,7 @@ const T & parseByMap(const std::map<std::string, T> & map, const JsonNode * val,
}
else
return defaultValue;
};
}
void JsonUtils::resolveIdentifier (si32 &var, const JsonNode &node, std::string name)
{

View File

@ -22,7 +22,9 @@ namespace Res
enum ERes
{
WOOD = 0, MERCURY, ORE, SULFUR, CRYSTAL, GEMS, GOLD, MITHRIL
WOOD = 0, MERCURY, ORE, SULFUR, CRYSTAL, GEMS, GOLD, MITHRIL,
WOOD_AND_ORE = 127 // special case for town bonus resource
};
//class to be representing a vector of resource

View File

@ -59,6 +59,22 @@ namespace NSecondarySkill
};
}
namespace EBuildingType
{
const std::string names [44] =
{
"mageGuild1", "mageGuild2", "mageGuild3", "mageGuild4", "mageGuild5",
"tavern", "shipyard", "fort", "citadel", "castle",
"villageHall", "townHall", "cityHall", "capitol", "marketplace",
"resourceSilo", "blacksmith", "special1", "horde1", "horde1Upgr",
"ship", "special2", "special3", "special4", "horde2",
"horde2Upgr", "grail", "extraTownHall", "extraCityHall", "extraCapitol",
"dwellingLvl1", "dwellingLvl2", "dwellingLvl3", "dwellingLvl4", "dwellingLvl5",
"dwellingLvl6", "dwellingLvl7", "dwellingUpLvl1", "dwellingUpLvl2", "dwellingUpLvl3",
"dwellingUpLvl4", "dwellingUpLvl5", "dwellingUpLvl6", "dwellingUpLvl7"
};
}
namespace ETownType
{
const std::string names [GameConstants::F_NUMBER] =

View File

@ -78,19 +78,18 @@ void LibClasses::loadFilesystem()
static void logHandlerLoaded(const std::string& name, CStopWatch &timer)
{
logGlobal->infoStream()<<"\t" << name << " handler: "<<timer.getDiff();
logGlobal->infoStream()<<"\t\t" << name << " handler: "<<timer.getDiff();
};
template <class Handler> void createHandler(Handler *&handler, const std::string &name, CStopWatch &timer)
{
handler = new Handler();
handler->load();
logHandlerLoaded(name, timer);
}
void LibClasses::init()
{
CStopWatch pomtime;
CStopWatch pomtime, totalTime;
createHandler(bth, "Bonus type", pomtime);
@ -110,7 +109,9 @@ void LibClasses::init()
createHandler(spellh, "Spell", pomtime);
modh->loadActiveMods();
logGlobal->infoStream()<<"\tInitializing handers: "<< totalTime.getDiff();
modh->loadGameContent();
modh->reload();
//FIXME: make sure that everything is ok after game restart
//TODO: This should be done every time mod config changes
@ -155,9 +156,10 @@ LibClasses::LibClasses()
void LibClasses::callWhenDeserializing()
{
generaltexth = new CGeneralTextHandler;
generaltexth->load();
arth->load(true);
// FIXME: check if any of these are needed
//generaltexth = new CGeneralTextHandler;
//generaltexth->load();
//arth->load(true);
//modh->recreateHandlers();
//modh->loadConfigFromFile ("defaultMods"); //TODO: remember last saved config
}

View File

@ -27,14 +27,14 @@ class CBonusTypeHandler;
class DLL_LINKAGE LibClasses
{
CBonusTypeHandler * bth;
void callWhenDeserializing(); //should be called only by serialize !!!
void makeNull(); //sets all handler pointers to null
public:
bool IS_AI_ENABLED; //VLC is the only object visible from both CMT and GeniusAI
const IBonusTypeHandler * getBth() const;
CArtHandler * arth;
CHeroHandler * heroh;
CCreatureHandler * creh;

View File

@ -18,7 +18,10 @@ PlayerInfo::PlayerInfo(): canHumanPlay(false), canComputerPlay(false),
aiTactic(EAiTactic::RANDOM), isFactionRandom(false), mainHeroPortrait(-1), hasMainTown(false),
generateHeroAtMainTown(false), team(255), generateHero(false), p7(0), hasHero(false), customHeroID(-1), powerPlaceholders(-1)
{
allowedFactions = VLC->townh->getDefaultAllowedFactions();
auto allowed = VLC->townh->getDefaultAllowed();
for (size_t i=0; i<allowed.size(); i++)
if (allowed[i])
allowedFactions.insert(i);
}
si8 PlayerInfo::defaultCastle() const
@ -136,7 +139,7 @@ bool TerrainTile::isWater() const
CMapHeader::CMapHeader() : version(EMapFormat::SOD), height(72), width(72),
twoLevel(true), difficulty(1), levelLimit(0), howManyTeams(0), areAnyPlayers(false)
{
allowedHeroes = VLC->heroh->getDefaultAllowedHeroes();
allowedHeroes = VLC->heroh->getDefaultAllowed();
players.resize(PlayerColor::PLAYER_LIMIT_I);
}
@ -148,8 +151,8 @@ CMapHeader::~CMapHeader()
CMap::CMap() : checksum(0), grailRadious(0), terrain(nullptr)
{
allowedAbilities = VLC->heroh->getDefaultAllowedAbilities();
allowedArtifact = VLC->arth->getDefaultAllowedArtifacts();
allowedSpell = VLC->spellh->getDefaultAllowedSpells();
allowedArtifact = VLC->arth->getDefaultAllowed();
allowedSpell = VLC->spellh->getDefaultAllowed();
}
CMap::~CMap()

View File

@ -16,7 +16,7 @@
class CGObjectInstance;
class CTerrainViewPatternConfig;
class TerrainViewPattern;
struct TerrainViewPattern;
namespace ETerrainGroup
{

View File

@ -160,7 +160,7 @@ void CMapGenOptions::setMonsterStrength(EMonsterStrength::EMonsterStrength value
void CMapGenOptions::resetPlayersMap()
{
players.clear();
int realPlayersCnt = playersCnt == RANDOM_SIZE ? PlayerColor::PLAYER_LIMIT_I : playersCnt;
int realPlayersCnt = playersCnt == RANDOM_SIZE ? static_cast<int>(PlayerColor::PLAYER_LIMIT_I) : playersCnt;
int realCompOnlyPlayersCnt = compOnlyPlayersCnt == RANDOM_SIZE ? (PlayerColor::PLAYER_LIMIT_I - realPlayersCnt) : compOnlyPlayersCnt;
for(int color = 0; color < (realPlayersCnt + realCompOnlyPlayersCnt); ++color)
{
@ -337,7 +337,7 @@ si32 CMapGenOptions::CPlayerSettings::getStartingTown() const
void CMapGenOptions::CPlayerSettings::setStartingTown(si32 value)
{
if(value >= -1 && value < static_cast<int>(VLC->townh->towns.size()))
if(value >= -1 && value < static_cast<int>(VLC->townh->factions.size()))
{
startingTown = value;
}

View File

@ -1271,7 +1271,7 @@ void CGameHandler::newTurn()
{
if(t->hasBuilt(BuildingID::RESOURCE_SILO)) //there is resource silo
{
if(t->town->primaryRes == 127) //we'll give wood and ore
if(t->town->primaryRes == Res::WOOD_AND_ORE) //we'll give wood and ore
{
n.res[player][Res::WOOD] ++;
n.res[player][Res::ORE] ++;
@ -4739,11 +4739,12 @@ bool CGameHandler::complain( const std::string &problem )
void CGameHandler::showGarrisonDialog( ObjectInstanceID upobj, ObjectInstanceID hid, bool removableUnits, const boost::function<void()> &cb )
{
PlayerColor player = getOwner(hid);
//PlayerColor player = getOwner(hid);
auto upperArmy = dynamic_cast<const CArmedInstance*>(getObj(upobj));
auto lowerArmy = dynamic_cast<const CArmedInstance*>(getObj(hid));
assert(upperArmy, lowerArmy);
assert(lowerArmy);
assert(upperArmy);
auto garrisonQuery = make_shared<CGarrisonDialogQuery>(upperArmy, lowerArmy);
queries.addQuery(garrisonQuery);
@ -4789,6 +4790,16 @@ bool CGameHandler::isAllowedExchange( ObjectInstanceID id1, ObjectInstanceID id2
return true;
}
if (o1->ID == Obj::HERO && o2->ID == Obj::HERO)
{
const CGHeroInstance *h1 = static_cast<const CGHeroInstance*>(o1);
const CGHeroInstance *h2 = static_cast<const CGHeroInstance*>(o2);
// two heroes in same town (garrisoned and visiting)
if (h1->visitedTown != nullptr && h2->visitedTown != nullptr && h1->visitedTown == h2->visitedTown)
return true;
}
//Ongoing garrison exchange
if(auto dialog = std::dynamic_pointer_cast<CGarrisonDialogQuery>(queries.topQuery(o1->tempOwner)))
{

View File

@ -1,7 +1,7 @@
#include "StdInc.h"
#include "CQuery.h"
#include "CGameHandler.h"
#include "..\lib\BattleState.h"
#include "../lib/BattleState.h"
boost::mutex Queries::mx;

View File

@ -1,7 +1,7 @@
#pragma once
#include "..\lib\GameConstants.h"
#include "..\lib\int3.h"
#include "..\lib\NetPacks.h"
#include "../lib/GameConstants.h"
#include "../lib/int3.h"
#include "../lib/NetPacks.h"
class CGObjectInstance;
class CGHeroInstance;
@ -174,4 +174,4 @@ public:
std::vector<shared_ptr<CQuery>> allQueries();
//void removeQuery
};
};