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

- Commanders are now a part of faction config

- Support for external dwellings for new towns
This commit is contained in:
DjWarmonger 2012-12-19 16:35:58 +00:00
parent c0ce8712c1
commit 0e06ac15ad
17 changed files with 61 additions and 11 deletions

View File

@ -4,6 +4,7 @@
"index" : 0,
"nativeTerrain": "grass",
"alignment" : "good",
"commander" : "Paladin1",
"creatureBackground" :
{
"120px" : "TPCASCAS",

View File

@ -4,6 +4,7 @@
"index" : 8,
"nativeTerrain": "grass",
"alignment" : "neutral",
"commander" : "AstralSpirit1",
"creatureBackground" :
{
"120px" : "TPCASELE",

View File

@ -4,6 +4,7 @@
"index" : 5,
"nativeTerrain": "subterra",
"alignment" : "evil",
"commander" : "Brute1",
"creatureBackground" :
{
"120px" : "TPCASDUN",

View File

@ -4,6 +4,7 @@
"index" : 7,
"nativeTerrain": "swamp",
"alignment" : "neutral",
"commander" : "Shaman1",
"creatureBackground" :
{
"120px" : "TPCASFOR",

View File

@ -4,6 +4,7 @@
"index" : 3,
"nativeTerrain": "lava",
"alignment" : "evil",
"commander" : "Succubus1",
"creatureBackground" :
{
"120px" : "TPCASINF",

View File

@ -4,6 +4,7 @@
"index" : 4,
"nativeTerrain": "dirt",
"alignment" : "evil",
"commander" : "SoulEater1",
"creatureBackground" :
{
"120px" : "TPCASNEC",

View File

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

View File

@ -4,6 +4,7 @@
"index" : 1,
"nativeTerrain": "grass",
"alignment" : "good",
"commander" : "Hierophant1",
"creatureBackground" :
{
"120px" : "TPCASRAM",

View File

@ -4,6 +4,7 @@
"index" : 6,
"nativeTerrain": "rough",
"alignment" : "neutral",
"commander" : "OgreLeader1",
"creatureBackground" :
{
"120px" : "TPCASSTR",

View File

@ -4,6 +4,7 @@
"index" : 2,
"nativeTerrain" : "snow",
"alignment" : "good",
"commander" : "TempleGuardian1",
"creatureBackground" :
{
"120px" : "TPCASTOW",

View File

@ -502,10 +502,6 @@ void CCreatureHandler::loadCreatures()
tlog5 << "\t\tReading config/commanders.json" << std::endl;
const JsonNode config3(ResourceID("config/commanders.json"));
BOOST_FOREACH (auto creature, config3["factionCreatures"].Vector())
{
factionCommanders[creature["faction"].Float()] = creature["id"].Float();
}
BOOST_FOREACH (auto bonus, config3["bonusPerLevel"].Vector())
{
commanderLevelPremy.push_back(JsonUtils::parseBonus (bonus.Vector()));

View File

@ -139,7 +139,6 @@ public:
si8 expAfterUpgrade;//multiplier in %
//Commanders
std::map <TFaction, TCreature> factionCommanders;
BonusList commanderLevelPremy; //bonus values added with each level-up
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
@ -179,7 +178,7 @@ public:
//TODO: should be optimized, not all these informations needs to be serialized (same for ccreature)
h & notUsedMonsters & creatures;
h & stackBonuses & expRanks & maxExpPerBattle & expAfterUpgrade;
h & factionCommanders & skillLevels & skillRequirements & commanderLevelPremy;
h & skillLevels & skillRequirements & commanderLevelPremy;
h & allCreatures;
h & creaturesOfLevel;
BONUS_TREE_DESERIALIZATION_FIX

View File

@ -582,7 +582,7 @@ std::pair<int,int> CGameState::pickObject (CGObjectInstance *obj)
//if castle alignment available
if (auto info = dynamic_cast<CCreGenAsCastleInfo*>(dwl->info))
{
faction = ran()%GameConstants::F_NUMBER;
faction = ran() % VLC->townh->factions.size();
if (info->asCastle)
{
for(ui32 i=0;i<map->objects.size();i++)

View File

@ -9,6 +9,7 @@
#include "CArtHandler.h"
#include "CTownHandler.h"
#include "CHeroHandler.h"
#include "CObjectHandler.h"
/*
* CModHandler.h, part of VCMI engine
@ -224,6 +225,21 @@ void CModHandler::reload()
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
{
CGDefInfo * info = new CGDefInfo(*baseInfo);
info->subid = cre;
info->name = town.second.dwellings[i];
VLC->dobjinfo->gobjs[Obj::CREATURE_GENERATOR1][cre] = info;
VLC->objh->cregens[cre] = cre; //map of dwelling -> creature id
}
}
}
}
}

View File

@ -762,7 +762,7 @@ void CGHeroInstance::initHero()
if (VLC->modh->modules.COMMANDERS)
{
commander = new CCommanderInstance (VLC->creh->factionCommanders[type->heroClass->faction]);
commander = new CCommanderInstance (VLC->townh->factions[type->heroClass->faction].commander);
commander->setArmyObj (castToArmyObj()); //TODO: separate function for setting commanders
}
@ -1531,7 +1531,14 @@ void CGDwelling::initObj()
creatures.resize(1);
creatures[0].second.push_back(crid);
hoverName = VLC->generaltexth->creGens[subID];
if (subID >= VLC->generaltexth->creGens.size()) //very messy workaround
{
int 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];
}
else
hoverName = VLC->generaltexth->creGens[subID];
if(crs->level > 4)
putStack(0, new CStackInstance(crs, (crs->growth) * 3));
if (getOwner() != GameConstants::NEUTRAL_PLAYER)

View File

@ -392,6 +392,16 @@ void CTownHandler::loadClientData(CTown &town, const JsonNode & source)
town.clientInfo.advMapCastle = source["adventureMap"]["castle"].String();
town.clientInfo.advMapCapitol = source["adventureMap"]["capitol"].String();
const JsonNode *value = &source["adventureMap"]["dwellings"];
if (!value->isNull())
{
BOOST_FOREACH (const JsonNode &d, value->Vector())
{
town.dwellings.push_back (d["graphics"].String());
town.dwellingNames.push_back (d["name"].String());
}
}
loadTownHall(town, source["hallSlots"]);
loadStructures(town, source["structures"]);
loadSiegeScreen(town, source["siege"]);
@ -506,6 +516,12 @@ void CTownHandler::load(const JsonNode &source)
faction.factionID = id;
faction.name = node.second["name"].String();
VLC->modh->identifiers.requestIdentifier ("creature." + node.second["commander"].String(),
[=](si32 commanderID)
{
factions[id].commander = commanderID;
}); //TODO: resolve string id
faction.creatureBg120 = node.second["creatureBackground"]["120px"].String();
faction.creatureBg130 = node.second["creatureBackground"]["130px"].String();

View File

@ -94,6 +94,9 @@ public:
bmap<int, ConstTransitivePtr<CBuilding> > buildings;
std::vector<std::string> dwellings; //defs for adventure map dwellings for new towns, [0] means tier 1 creatures etc.
std::vector<std::string> dwellingNames;
// should be removed at least from configs in favour of auto-detection
std::map<int,int> hordeLvl; //[0] - first horde building creature level; [1] - second horde building (-1 if not present)
ui32 mageLevel; //max available mage guild level
@ -145,7 +148,7 @@ public:
template <typename Handler> void serialize(Handler &h, const int version)
{
h & names & typeID & creatures & buildings & hordeLvl & mageLevel
h & names & typeID & creatures & dwellings & dwellingNames & buildings & hordeLvl & mageLevel
& primaryRes & warMachine & clientInfo;
}
};
@ -173,6 +176,9 @@ public:
ui8 nativeTerrain;
ui8 alignment; // uses EAlignment enum
//std::string commanderClass;
TCreature commander;
std::string creatureBg120;
std::string creatureBg130;