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

Partial parsing for CREXPBON.txt table - only basic bonuses are supported

Bonuses will be stored in Creature node and used when Bonus System is ready.
This commit is contained in:
DjWarmonger 2011-02-03 12:58:46 +00:00
parent e684ec0c06
commit a84a95f0ee
4 changed files with 82 additions and 4 deletions

View File

@ -105,11 +105,12 @@ const int NAMES_PER_TOWN=16;
const int CREATURES_PER_TOWN = 7; //without upgrades
const int MAX_BUILDING_PER_TURN = 1;
const int SPELL_LEVELS = 5;
//const int CREEP_SIZE = 4000; // neutral stacks won't grow beyon this number
//const int CREEP_SIZE = 4000; // neutral stacks won't grow beyond this number
const int CREEP_SIZE = 2000000000;
const int WEEKLY_GROWTH = 10; //percent
const int AVAILABLE_HEROES_PER_PLAYER = 2;
const bool DWELLINGS_ACCUMULATE_CREATURES = true;
const bool STACK_EXP = true;
const int BFIELD_WIDTH = 17;
const int BFIELD_HEIGHT = 11;

View File

@ -600,6 +600,47 @@ void CCreatureHandler::loadCreatures()
}
}
ifs.close();
if (STACK_EXP) //reading default stack experience bonuses
{
buf = bitmaph->getTextFile("CREXPBON.TXT");
int it = 0, creid;
commonBonuses.resize(8); //8 tiers
stackExperience b;
b.expBonuses.resize(10);
b.source = Bonus::STACK_EXPERIENCE;
loadToIt (dump2, buf, it, 3); //ignore first line
loadToIt (dump2, buf, it, 4); //ignore index
loadStackExp(b, buf, it);
loadToIt (dump2, buf, it, 4); //crop comment
for (i = 0; i < 8; ++i)
{
commonBonuses[i].push_back(b);//health bonus common for all
for (int j = 0; j < 4; ++j) //four modifiers common for tiers
{
loadToIt (dump2, buf, it, 4); //ignore index
loadStackExp(b, buf, it);
commonBonuses[i].push_back(b);
loadToIt (dump2, buf, it, 3); //crop comment
}
}
do //parse everything that's left
{
loadToIt(creid, buf, it, 4); //get index
loadStackExp(b, buf, it);
creatures[creid]->bonuses.push_back(b); //experience list is common for creatures of that type
loadToIt (dump2, buf, it, 3); //crop comment
}
while (it < buf.size());
for (std::vector<CCreature*>::iterator i = creatures.begin(); i != creatures.end(); i++)
{
if (it = (*i)->level < 7)
std::copy(commonBonuses[it-1].begin(), commonBonuses[it-1].end(), (*i)->bonuses.begin());
else
std::copy(commonBonuses[7].begin(), commonBonuses[7].end(), (*i)->bonuses.begin()); //common for tiers 8+
}
} //end of stack experience
}
void CCreatureHandler::loadAnimationInfo()
@ -672,6 +713,40 @@ void CCreatureHandler::loadUnitAnimInfo(CCreature & unit, std::string & src, int
i+=2;
}
void CCreatureHandler::loadStackExp(stackExperience & b, std::string & src, int & it) //help function for parsing CREXPBON.txt, assuming all its details are already defined
{
std::string buf, mod;
loadToIt(buf, src, it, 4);
loadToIt(mod, src, it, 4);
switch (buf[0])
{
case 'H':
b.type = Bonus::STACK_HEALTH;
break;
case 'A':
b.type = Bonus::PRIMARY_SKILL;
b.subtype = PrimarySkill::ATTACK;
break;
case 'D':
b.type = Bonus::PRIMARY_SKILL;
b.subtype = PrimarySkill::DEFENSE;
break;
case 'M': //Max damage
b.type = Bonus::CREATURE_DAMAGE;
b.subtype = 2;
break;
case 'm': //Min damage
b.type = Bonus::CREATURE_DAMAGE;
b.subtype = 1;
break;
}
loadToIt (b.val, src, it, 4); //basic value, not particularly useful but existent
for (int i = 0; i < 10; ++i)
{
loadToIt (b.expBonuses[i], src, it, 4); //vector must have length 10
}
}
CCreatureHandler::~CCreatureHandler()
{
}

View File

@ -110,12 +110,13 @@ public:
std::vector<si8> factionAlignments; //1 for good, 0 for neutral and -1 for evil with faction ID as index
int factionToTurretCreature[F_NUMBER]; //which creature's animation should be used to dispaly creature in turret while siege
//bonus names and descriptions
std::map<TBonusType, std::pair<std::string, std::string>> stackBonuses; // bonus => name, description
std::vector<BonusList> commonBonuses; // levels 1-8 from CREXPBON.txt
void loadCreatures();
void loadAnimationInfo();
void loadUnitAnimInfo(CCreature & unit, std::string & src, int & i);
void loadStackExp(stackExperience & b, std::string & src, int & it);
bool isGood (si8 faction) const;
bool isEvil (si8 faction) const;

View File

@ -189,7 +189,8 @@ struct DLL_EXPORT Bonus
HERO_SPECIAL,
ARMY,
CAMPAIGN_BONUS,
SPECIAL_WEEK
SPECIAL_WEEK,
STACK_EXPERIENCE
};
enum LimitEffect
@ -292,7 +293,7 @@ struct DLL_EXPORT Bonus
struct DLL_EXPORT stackExperience : public Bonus
{
std::vector<ui32> expBonuses; // variations for levels 1-10, copied to val field;
std::vector<si32> expBonuses; // variations for levels 1-10, copied to val field;
bool enable; //if true - turns ability on / off for zero value
template <typename Handler> void serialize(Handler &h, const int version)