1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-03-25 21:38:59 +02:00

Merge pull request #141 from vcmi/fix/oneWeekTurnsRemain

Bonus system: add turnsRemain support for ONE_WEEK duration
This commit is contained in:
ArseniyShestakov 2015-11-24 13:08:03 +03:00
commit ac57eaf61d
3 changed files with 15 additions and 10 deletions

View File

@ -780,6 +780,12 @@ void CBonusSystemNode::updateBonuses(const CSelector &s)
void CBonusSystemNode::addNewBonus(Bonus *b)
{
//turnsRemain shouldn't be zero for following durations
if(Bonus::NTurns(b) || Bonus::NDays(b) || Bonus::OneWeek(b))
{
assert(b->turnsRemain);
}
assert(!vstd::contains(exportedBonuses,b));
exportedBonuses.push_back(b);
exportBonus(b);

View File

@ -294,7 +294,7 @@ struct DLL_LINKAGE Bonus
};
ui16 duration; //uses BonusDuration values
si16 turnsRemain; //used if duration is N_TURNS or N_DAYS
si16 turnsRemain; //used if duration is N_TURNS, N_DAYS or ONE_WEEK
BonusType type; //uses BonusType values - says to what is this bonus - 1 byte
TBonusSubtype subtype; //-1 if not applicable - 4 bytes
@ -811,7 +811,7 @@ public:
bool operator()(const Bonus *bonus) const
{
return turnsRequested <= 0 //every present effect will last zero (or "less") turns
|| !(bonus->duration & Bonus::N_TURNS) //so do every not expriing after N-turns effect
|| !Bonus::NTurns(bonus) //so do every not expriing after N-turns effect
|| bonus->turnsRemain > turnsRequested;
}
CWillLastTurns& operator()(const int &setVal)
@ -828,13 +828,11 @@ public:
bool operator()(const Bonus *bonus) const
{
if(daysRequested <= 0)
if(daysRequested <= 0 || Bonus::Permanent(bonus) || Bonus::OneBattle(bonus))
return true;
else if(bonus->duration & Bonus::ONE_DAY)
else if(Bonus::OneDay(bonus))
return false;
else if(bonus->duration & Bonus::PERMANENT || bonus->duration & Bonus::ONE_BATTLE)
return true;
else if(bonus->duration & Bonus::N_DAYS)
else if(Bonus::NDays(bonus) || Bonus::OneWeek(bonus))
{
return bonus->turnsRemain > daysRequested;
}

View File

@ -263,6 +263,9 @@ DLL_LINKAGE void GiveBonus::applyGs( CGameState *gs )
assert(cbsn);
if(Bonus::OneWeek(&bonus))
bonus.turnsRemain = 8 - gs->getDate(Date::DAY_OF_WEEK); // set correct number of days before adding bonus
auto b = new Bonus(bonus);
cbsn->addNewBonus(b);
@ -1023,10 +1026,8 @@ DLL_LINKAGE void NewTurn::applyGs( CGameState *gs )
creatureSet.second.applyGs(gs);
gs->globalEffects.popBonuses(Bonus::OneDay); //works for children -> all game objs
if(gs->getDate(Date::DAY_OF_WEEK) == 1) //new week
gs->globalEffects.popBonuses(Bonus::OneWeek); //works for children -> all game objs
gs->globalEffects.updateBonuses(Bonus::NDays);
gs->globalEffects.updateBonuses(Bonus::OneWeek);
//TODO not really a single root hierarchy, what about bonuses placed elsewhere? [not an issue with H3 mechanics but in the future...]
for(CGTownInstance* t : gs->map->towns)