1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-07-01 00:45:26 +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

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