1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-02-03 13:01:33 +02:00

few more refactorings

This commit is contained in:
alexvins 2013-02-04 21:58:42 +00:00
parent 25663ce7af
commit a9d458c8f4
12 changed files with 132 additions and 173 deletions

View File

@ -13,7 +13,7 @@ void CEmptyAI::yourTurn()
cb->endTurn();
}
void CEmptyAI::heroGotLevel(const CGHeroInstance *hero, int pskill, std::vector<ui16> &skills, int queryID)
void CEmptyAI::heroGotLevel(const CGHeroInstance *hero, PrimarySkill::PrimarySkill pskill, std::vector<SecondarySkill::SecondarySkill> &skills, int queryID)
{
cb->selectionMade(rand() % skills.size(), queryID);
}

View File

@ -12,9 +12,9 @@ class CEmptyAI : public CGlobalAI
public:
void init(CCallback * CB) override;
void yourTurn() override;
void heroGotLevel(const CGHeroInstance *hero, int pskill, std::vector<ui16> &skills, int queryID) override;
void heroGotLevel(const CGHeroInstance *hero, PrimarySkill::PrimarySkill pskill, std::vector<SecondarySkill::SecondarySkill> &skills, int queryID) override;
void commanderGotLevel (const CCommanderInstance * commander, std::vector<ui32> skills, int queryID) override;
void showBlockingDialog(const std::string &text, const std::vector<Component> &components, ui32 askID, const int soundID, bool selection, bool cancel) override;
void showBlockingDialog(const std::string &text, const std::vector<Component> &components, ui32 askID, const int soundID, bool selection, bool cancel) override;
void showGarrisonDialog(const CArmedInstance *up, const CGHeroInstance *down, bool removableUnits, int queryID) override;
};

View File

@ -25,7 +25,7 @@ using namespace boost::assign;
extern boost::rand48 ran;
const std::map<std::string, CArtifact::EartClass> artifactClassMap = boost::assign::map_list_of
const std::map<std::string, CArtifact::EartClass> artifactClassMap = boost::assign::map_list_of
("TREASURE", CArtifact::ART_TREASURE)
("MINOR", CArtifact::ART_MINOR)
("MAJOR", CArtifact::ART_MAJOR)
@ -38,7 +38,7 @@ const std::map<std::string, CArtifact::EartClass> artifactClassMap = boost::assi
#define ART_POS(x) ( #x, ArtifactPosition::x )
const std::map<std::string, int> artifactPositionMap = boost::assign::map_list_of
const std::map<std::string, int> artifactPositionMap = boost::assign::map_list_of
ART_POS(HEAD)
ART_POS(SHOULDERS)
ART_POS(NECK)
@ -424,7 +424,7 @@ CArtifact * CArtHandler::loadArtifact(const JsonNode & node)
art->aClass = CArtifact::ART_SPECIAL;
}
}
int bearerType = -1;
bool heroArt = false;
@ -707,7 +707,7 @@ void CArtHandler::addBonuses()
BOOST_FOREACH (auto & artifact, config["artifacts"].Struct()) //pair <string, JsonNode> (id, properties)
{
auto ga = artifacts[artifact.second["id"].Float()].get();
BOOST_FOREACH (auto b, artifact.second["bonuses"].Vector())
{
auto bonus = JsonUtils::parseBonus (b);
@ -783,7 +783,7 @@ bool CArtHandler::legalArtifact(int id)
(artifacts[id]->possibleSlots[ArtBearer::CREATURE].size() && VLC->modh->modules.STACK_ARTIFACT);
}
void CArtHandler::initAllowedArtifactsList(const std::vector<ui8> &allowed)
void CArtHandler::initAllowedArtifactsList(const std::vector<bool> &allowed)
{
allowedArtifacts.clear();
clearHlpLists();
@ -812,12 +812,12 @@ void CArtHandler::initAllowedArtifactsList(const std::vector<ui8> &allowed)
}
}
std::vector<ui8> CArtHandler::getDefaultAllowedArtifacts() const
std::vector<bool> CArtHandler::getDefaultAllowedArtifacts() const
{
std::vector<ui8> allowedArtifacts;
allowedArtifacts.resize(127, 1);
allowedArtifacts.resize(141, 0);
allowedArtifacts.resize(GameConstants::ARTIFACTS_QUANTITY, 1);
std::vector<bool> allowedArtifacts;
allowedArtifacts.resize(127, true);
allowedArtifacts.resize(141, false);
allowedArtifacts.resize(GameConstants::ARTIFACTS_QUANTITY, true);
return allowedArtifacts;
}

View File

@ -248,7 +248,7 @@ public:
void getAllowed(std::vector<ConstTransitivePtr<CArtifact> > &out, int flags);
void erasePickedArt (TArtifactInstanceID id);
bool isBigArtifact (TArtifactID artID) const {return bigArtifacts.find(artID) != bigArtifacts.end();}
void initAllowedArtifactsList(const std::vector<ui8> &allowed); //allowed[art_id] -> 0 if not allowed, 1 if allowed
void initAllowedArtifactsList(const std::vector<bool> &allowed); //allowed[art_id] -> 0 if not allowed, 1 if allowed
static int convertMachineID(int id, bool creToArt);
void makeItCreatureArt (CArtifact * a, bool onlyCreature = true);
void makeItCreatureArt (TArtifactInstanceID aid, bool onlyCreature = true);
@ -260,9 +260,9 @@ public:
/**
* Gets a list of default allowed artifacts.
*
* @return a list of allowed artifacts, the index is the artifact id and the value either 0 for not allowed or 1 for allowed
* @return a list of allowed artifacts, the index is the artifact id
*/
std::vector<ui8> getDefaultAllowedArtifacts() const;
std::vector<bool> getDefaultAllowedArtifacts() const;
template <typename Handler> void serialize(Handler &h, const int version)
{

View File

@ -359,7 +359,7 @@ void CHeroHandler::loadObstacles()
{
auto loadObstacles = [](const JsonNode &node, bool absolute, std::map<int, CObstacleInfo> &out)
{
BOOST_FOREACH(const JsonNode &obs, node.Vector())
BOOST_FOREACH(const JsonNode &obs, node.Vector())
{
int ID = obs["id"].Float();
CObstacleInfo & obi = out[ID];
@ -500,10 +500,10 @@ void CHeroHandler::loadTerrains()
terrCosts.push_back(config[name]["moveCost"].Float());
}
std::vector<ui8> CHeroHandler::getDefaultAllowedHeroes() const
std::vector<bool> CHeroHandler::getDefaultAllowedHeroes() const
{
// Look Data/HOTRAITS.txt for reference
std::vector<ui8> allowedHeroes;
std::vector<bool> allowedHeroes;
allowedHeroes.reserve(heroes.size());
BOOST_FOREACH(const CHero * hero, heroes)
@ -514,9 +514,9 @@ std::vector<ui8> CHeroHandler::getDefaultAllowedHeroes() const
return allowedHeroes;
}
std::vector<ui8> CHeroHandler::getDefaultAllowedAbilities() const
std::vector<bool> CHeroHandler::getDefaultAllowedAbilities() const
{
std::vector<ui8> allowedAbilities;
allowedAbilities.resize(GameConstants::SKILL_QUANTITY, 1);
std::vector<bool> allowedAbilities;
allowedAbilities.resize(GameConstants::SKILL_QUANTITY, true);
return allowedAbilities;
}

View File

@ -185,7 +185,7 @@ public:
//default costs of going through terrains. -1 means terrain is impassable
std::vector<int> terrCosts;
struct SBallisticsLevelInfo
{
ui8 keep, tower, gate, wall; //chance to hit in percent (eg. 87 is 87%)
@ -233,14 +233,14 @@ public:
*
* @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<ui8> getDefaultAllowedHeroes() const;
std::vector<bool> getDefaultAllowedHeroes() const;
/**
* Gets a list of default allowed abilities. OH3 abilities/skills are all allowed by default.
*
* @return a list of allowed abilities, the index is the ability id and the value either 0 for not allowed or 1 for allowed
* @return a list of allowed abilities, the index is the ability id
*/
std::vector<ui8> getDefaultAllowedAbilities() const;
std::vector<bool> getDefaultAllowedAbilities() const;
template <typename Handler> void serialize(Handler &h, const int version)
{

View File

@ -679,7 +679,7 @@ public:
si32 manaDiff; //amount of gained / lost mana
si32 moraleDiff; //morale modifier
si32 luckDiff; //luck modifier
std::vector<si32> resources;//gained / lost resources
TResources resources;//gained / lost resources
std::vector<si32> primskills;//gained / lost prim skills
std::vector<SecondarySkill::SecondarySkill> abilities; //gained abilities
std::vector<si32> abilityLevels; //levels of gained abilities
@ -730,7 +730,7 @@ public:
ui32 identifier; //unique code for this monster (used in missions)
si8 character; //character of this set of creatures (0 - the most friendly, 4 - the most hostile) => on init changed to -4 (compliant) ... 10 value (savage)
std::string message; //message printed for attacking hero
std::vector<ui32> resources; //[res_id], resources given to hero that has won with monsters
TResources resources; // resources given to hero that has won with monsters
TArtifactID gainedArtifact; //ID of artifact gained to hero, -1 if none
bool neverFlees; //if true, the troops will never flee
bool notGrowingTeam; //if true, number of units won't grow

View File

@ -527,9 +527,9 @@ void CSpellHandler::loadSpells()
boost::replace_first(spells[Spells::FORGETFULNESS]->attributes, "CREATURE_TARGET", "CREATURE_TARGET_2"); //TODO: use flags instead?
}
std::vector<ui8> CSpellHandler::getDefaultAllowedSpells() const
std::vector<bool> CSpellHandler::getDefaultAllowedSpells() const
{
std::vector<ui8> allowedSpells;
allowedSpells.resize(GameConstants::SPELLS_QUANTITY, 1);
std::vector<bool> allowedSpells;
allowedSpells.resize(GameConstants::SPELLS_QUANTITY, true);
return allowedSpells;
}

View File

@ -187,7 +187,7 @@ public:
*
* @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<ui8> getDefaultAllowedSpells() const;
std::vector<bool> getDefaultAllowedSpells() const;
template <typename Handler> void serialize(Handler &h, const int version)
{

View File

@ -580,10 +580,10 @@ public:
ui8 howManyTeams;
/**
* A list of allowed heroes. The index is the hero id and the value is either 0 for not allowed or 1 for allowed.
* A list of allowed heroes. The index is the hero id and the value = hero allowed.
* The default value is a list of default allowed heroes. See CHeroHandler::getDefaultAllowedHeroes for more info.
*/
std::vector<ui8> allowedHeroes;
std::vector<bool> allowedHeroes;
/** A list of placeholded heroes. The index is the id of a hero type. */
std::vector<ui16> placeholdedHeroes;
@ -734,13 +734,13 @@ public:
std::vector<ConstTransitivePtr<CGDefInfo> > customDefs;
/** list of allowed spells, index is the spell id */
std::vector<ui8> allowedSpell;
std::vector<bool> allowedSpell;
/** list of allowed artifacts, index is the artifact id */
std::vector<ui8> allowedArtifact;
std::vector<bool> allowedArtifact;
/** list of allowed abilities, index is the ability id */
std::vector<ui8> allowedAbilities;
std::vector<bool> allowedAbilities;
/** list of map events */
std::list<ConstTransitivePtr<CMapEvent> > events;

View File

@ -405,24 +405,11 @@ void CMapLoaderH3M::readTeamInfo()
void CMapLoaderH3M::readAllowedHeroes()
{
int lim = mapHeader->version == EMapFormat::ROE ? 16 : 20;
mapHeader->allowedHeroes.resize(VLC->heroh->heroes.size(), true);
for(int i = 0; i<lim; ++i)
{
ui8 c = readUI8();
for(int yy = 0; yy < 8; ++yy)
{
if(i * 8 + yy < GameConstants::HEROES_QUANTITY)
{
if(c != (c | static_cast<ui8>(std::pow(2., yy))))
{
mapHeader->allowedHeroes[i * 8 + yy] = false;
}
}
}
}
const int bytes = mapHeader->version == EMapFormat::ROE ? 16 : 20;
readBitmask(mapHeader->allowedHeroes,bytes,GameConstants::HEROES_QUANTITY, false);
// Probably reserved for further heroes
if(mapHeader->version > EMapFormat::ROE)
@ -457,31 +444,15 @@ void CMapLoaderH3M::readDisposedHeroes()
void CMapLoaderH3M::readAllowedArtifacts()
{
map->allowedArtifact.resize (VLC->arth->artifacts.size()); //handle new artifacts, make them allowed by default
for (ui32 x = 0; x < map->allowedArtifact.size(); ++x)
{
map->allowedArtifact[x] = true;
}
map->allowedArtifact.resize (VLC->arth->artifacts.size(),true); //handle new artifacts, make them allowed by default
// Reading allowed artifacts: 17 or 18 bytes
if(map->version != EMapFormat::ROE)
{
int lim = map->version == EMapFormat::AB ? 17 : 18;
const int bytes = map->version == EMapFormat::AB ? 17 : 18;
readBitmask(map->allowedArtifact,bytes,GameConstants::ARTIFACTS_QUANTITY);
for(int i = 0; i < lim; ++i)
{
ui8 c = readUI8();
for(int yy = 0; yy < 8; ++yy)
{
if(i * 8 + yy < GameConstants::ARTIFACTS_QUANTITY)
{
if(c == (c | static_cast<ui8>(std::pow(2., yy))))
{
map->allowedArtifact[i * 8 + yy] = false;
}
}
}
}
}
// ban combo artifacts
@ -513,53 +484,20 @@ void CMapLoaderH3M::readAllowedArtifacts()
void CMapLoaderH3M::readAllowedSpellsAbilities()
{
// Read allowed spells
map->allowedSpell.resize(GameConstants::SPELLS_QUANTITY);
for(ui32 x = 0; x < map->allowedSpell.size(); x++)
{
map->allowedSpell[x] = true;
}
map->allowedSpell.resize(GameConstants::SPELLS_QUANTITY, true);
// Read allowed abilities
map->allowedAbilities.resize(GameConstants::SKILL_QUANTITY);
for(ui32 x = 0; x < map->allowedAbilities.size(); x++)
{
map->allowedAbilities[x] = true;
}
map->allowedAbilities.resize(GameConstants::SKILL_QUANTITY, true);
if(map->version >= EMapFormat::SOD)
{
// Reading allowed spells (9 bytes)
for(int i = 0; i < 9; ++i)
{
ui8 c = readUI8();
for(int yy = 0; yy < 8; ++yy)
{
if(i * 8 + yy < GameConstants::SPELLS_QUANTITY)
{
if(c == (c | static_cast<ui8>(std::pow(2., yy))))
{
map->allowedSpell[i* 8 + yy] = false;
}
}
}
}
const int spell_bytes = 9;
readBitmask(map->allowedSpell, spell_bytes, GameConstants::SPELLS_QUANTITY);
// Allowed hero's abilities (4 bytes)
for(int i = 0; i < 4; ++i)
{
ui8 c = readUI8();
for(int yy = 0; yy < 8; ++yy)
{
if(i * 8 + yy < GameConstants::SKILL_QUANTITY)
{
if(c == (c | static_cast<ui8>(std::pow(2., yy))))
{
map->allowedAbilities[i * 8 + yy] = false;
}
}
}
}
const int abil_bytes = 4;
readBitmask(map->allowedAbilities, abil_bytes, GameConstants::SKILL_QUANTITY);
}
}
@ -629,20 +567,7 @@ void CMapLoaderH3M::readPredefinedHeroes()
// are spells
if(readBool())
{
for(int i = 0; i < 9; ++i)
{
ui8 c = readUI8();
for(int yy = 0; yy < 8; ++yy)
{
if(i * 8 + yy < GameConstants::SPELLS_QUANTITY)
{
if(c == (c | static_cast<ui8>(std::pow(2., yy))))
{
hero->spells.insert(i * 8 + yy);
}
}
}
}
readSpells(hero->spells);
}
// customPrimSkills
@ -914,7 +839,7 @@ void CMapLoaderH3M::readObjects()
if(readBool())
{
readCreatureSet(evnt, 7, map->version > EMapFormat::ROE);
readCreatureSet(evnt, 7);
}
skip(4);
}
@ -923,11 +848,7 @@ void CMapLoaderH3M::readObjects()
evnt->moraleDiff = readSI8();
evnt->luckDiff = readSI8();
evnt->resources.resize(GameConstants::RESOURCE_QUANTITY);
for(int x = 0; x < 7; ++x)
{
evnt->resources[x] = readUI32();
}
readResourses(evnt->resources);
evnt->primskills.resize(GameConstants::PRIMARY_SKILLS);
for(int x = 0; x < 4; ++x)
@ -962,7 +883,7 @@ void CMapLoaderH3M::readObjects()
}
int gcre = readUI8(); //number of gained creatures
readCreatureSet(&evnt->creatures, gcre, map->version > EMapFormat::ROE);
readCreatureSet(&evnt->creatures, gcre);
skip(8);
evnt->availableFor = readUI8();
@ -1059,11 +980,7 @@ void CMapLoaderH3M::readObjects()
if(readBool()) //true if there is message or treasury
{
cre->message = readString();
cre->resources.resize(GameConstants::RESOURCE_QUANTITY);
for(int j = 0; j < 7; ++j)
{
cre->resources[j] = readUI32();
}
readResourses(cre->resources);
int artID;
if (map->version == EMapFormat::ROE)
@ -1167,7 +1084,7 @@ void CMapLoaderH3M::readObjects()
nobj = gar;
nobj->setOwner(readUI8());
skip(3);
readCreatureSet(gar, 7, map->version > EMapFormat::ROE);
readCreatureSet(gar, 7);
if(map->version > EMapFormat::ROE)
{
gar->removableUnits = readBool();
@ -1197,7 +1114,7 @@ void CMapLoaderH3M::readObjects()
art->message = readString();
if(readBool())
{
readCreatureSet(art, 7, map->version > EMapFormat::ROE);
readCreatureSet(art, 7);
}
skip(4);
}
@ -1227,7 +1144,7 @@ void CMapLoaderH3M::readObjects()
res->message = readString();
if(readBool())
{
readCreatureSet(res, 7, map->version > EMapFormat::ROE);
readCreatureSet(res, 7);
}
skip(4);
}
@ -1289,7 +1206,7 @@ void CMapLoaderH3M::readObjects()
box->message = readString();
if(readBool())
{
readCreatureSet(box, 7, map->version > EMapFormat::ROE);
readCreatureSet(box, 7);
}
skip(4);
}
@ -1299,11 +1216,7 @@ void CMapLoaderH3M::readObjects()
box->moraleDiff = readSI8();
box->luckDiff = readSI8();
box->resources.resize(GameConstants::RESOURCE_QUANTITY);
for(int x = 0; x < 7; ++x)
{
box->resources[x] = readUI32();
}
readResourses(box->resources);
box->primskills.resize(GameConstants::PRIMARY_SKILLS);
for(int x = 0; x < 4; ++x)
@ -1335,7 +1248,7 @@ void CMapLoaderH3M::readObjects()
box->spells.push_back(readUI8());
}
int gcre = readUI8(); //number of gained creatures
readCreatureSet(&box->creatures, gcre, map->version > EMapFormat::ROE);
readCreatureSet(&box->creatures, gcre);
skip(8);
break;
}
@ -1591,8 +1504,9 @@ void CMapLoaderH3M::readObjects()
});
}
void CMapLoaderH3M::readCreatureSet(CCreatureSet * out, int number, bool version)
void CMapLoaderH3M::readCreatureSet(CCreatureSet * out, int number)
{
const bool version = (map->version > EMapFormat::ROE);
const int maxID = version ? 0xffff : 0xff;
for(int ir = 0; ir < number; ++ir)
@ -1720,7 +1634,7 @@ CGObjectInstance * CMapLoaderH3M::readHero(int idToBeGiven)
// True if hero has nonstandard garrison
if(readBool())
{
readCreatureSet(nhi, 7, map->version > EMapFormat::ROE);
readCreatureSet(nhi, 7);
}
nhi->formation = readUI8();
@ -1761,20 +1675,8 @@ CGObjectInstance * CMapLoaderH3M::readHero(int idToBeGiven)
if(readBool())
{
nhi->spells.insert(0xffffffff); //placeholder "preset spells"
for(int i = 0; i < 9; ++i)
{
ui8 c = readUI8();
for(int yy = 0; yy < 8; ++yy)
{
if(i * 8 + yy < GameConstants::SPELLS_QUANTITY)
{
if(c == (c | static_cast<ui8>(std::pow(2., yy))))
{
nhi->spells.insert(i * 8 + yy);
}
}
}
}
readSpells(nhi->spells);
}
}
else if(map->version == EMapFormat::AB)
@ -2017,7 +1919,7 @@ CGTownInstance * CMapLoaderH3M::readTown(int castleID)
// True if garrison isn't empty
if(readBool())
{
readCreatureSet(nt, 7, map->version > EMapFormat::ROE);
readCreatureSet(nt, 7);
}
nt->formation = readUI8();
@ -2107,6 +2009,9 @@ CGTownInstance * CMapLoaderH3M::readTown(int castleID)
nce->town = nt;
nce->name = readString();
nce->message = readString();
readResourses(nce->resources);
for(int x = 0; x < 7; ++x)
{
nce->resources[x] = readUI32();
@ -2230,10 +2135,7 @@ void CMapLoaderH3M::readEvents()
ne->name = readString();
ne->message = readString();
for(int k = 0; k < 7; ++k)
{
ne->resources[k] = readUI32();
}
readResourses(ne->resources);
ne->players = readUI8();
if(map->version > EMapFormat::AB)
{
@ -2253,6 +2155,52 @@ void CMapLoaderH3M::readEvents()
}
}
void CMapLoaderH3M::readSpells(std::set<TSpell>& dest)
{
for(int byte = 0; byte < 9; ++byte)
{
ui8 c = readUI8();
for(int bit = 0; bit < 8; ++bit)
{
if(byte * 8 + bit < GameConstants::SPELLS_QUANTITY)
{
if(c & (1 << bit))
{
dest.insert(byte * 8 + bit);
}
}
}
}
}
void CMapLoaderH3M::readResourses(TResources& resources)
{
resources.resize(GameConstants::RESOURCE_QUANTITY); //needed?
for(int x = 0; x < 7; ++x)
{
resources[x] = readUI32();
}
}
void CMapLoaderH3M::readBitmask(std::vector<bool>& dest, const int byteCount, const int limit, bool negate)
{
for(int byte = 0; byte < byteCount; ++byte)
{
const ui8 mask = readUI8();
for(int bit = 0; bit < 8; ++bit)
{
if(byte * 8 + bit < limit)
{
const bool flag = mask & (1 << bit);
if((negate && flag) || (!negate && !flag))
dest[byte * 8 + bit] = false;
}
}
}
}
ui8 CMapLoaderH3M::reverse(ui8 arg)
{
ui8 ret = 0;

View File

@ -12,6 +12,8 @@
#pragma once
#include "CMapService.h"
#include "../GameConstants.h"
#include "../ResourceSet.h"
#include "../vcmi_endian.h"
#include "../int3.h"
@ -159,9 +161,8 @@ private:
*
* @param out the loaded creature set
* @param number the count of creatures to read
* @param version true for > ROE maps
*/
void readCreatureSet(CCreatureSet * out, int number, bool version);
void readCreatureSet(CCreatureSet * out, int number);
/**
* Reads a hero.
@ -208,6 +209,18 @@ private:
*/
void readEvents();
void readSpells(std::set<TSpell> & dest);
void readResourses(TResources& resources);
/** Reads bitmask to boolean vector
* @param dest destination vector, shall be filed with "true" values
* @param byteCount size in bytes of bimask
* @param limit max count of vector elements to alter
* @param negate if true then set bit in mask means clear flag in vertor
*/
void readBitmask(std::vector<bool> & dest, const int byteCount, const int limit, bool negate = true);
/**
* Reverses the input argument.
*
@ -216,8 +229,6 @@ private:
*/
ui8 reverse(ui8 arg);
/**
* Helper to read ui8 from buffer
*/