mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-24 22:14:36 +02:00
- Extended cap or removed sign for some values that may potentially overflow
- Fixed #851
This commit is contained in:
parent
b72a19cdb1
commit
1cbd7e94e4
@ -2466,6 +2466,14 @@ void CBattleInterface::battleTriggerEffect(const BattleTriggerEffect & bte)
|
|||||||
displayEffect(15, stack->position);
|
displayEffect(15, stack->position);
|
||||||
CCS->soundh->playSound(soundBase::FEAR);
|
CCS->soundh->playSound(soundBase::FEAR);
|
||||||
break;
|
break;
|
||||||
|
case Bonus::MORALE:
|
||||||
|
{
|
||||||
|
std::string hlp = CGI->generaltexth->allTexts[33];
|
||||||
|
boost::algorithm::replace_first(hlp,"%s",(stack->getName()));
|
||||||
|
displayEffect(20,stack->position);
|
||||||
|
console->addText(hlp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -719,15 +719,6 @@ BattleAction CPlayerInterface::activeStack(const CStack * stack) //called when i
|
|||||||
CBattleInterface *b = battleInt;
|
CBattleInterface *b = battleInt;
|
||||||
{
|
{
|
||||||
boost::unique_lock<boost::recursive_mutex> un(*pim);
|
boost::unique_lock<boost::recursive_mutex> un(*pim);
|
||||||
|
|
||||||
if(vstd::contains(stack->state,EBattleStackState::MOVED)) //this stack has moved and makes second action -> high morale
|
|
||||||
{
|
|
||||||
std::string hlp = CGI->generaltexth->allTexts[33];
|
|
||||||
boost::algorithm::replace_first(hlp,"%s",(stack->count != 1) ? stack->getCreature()->namePl : stack->getCreature()->nameSing);
|
|
||||||
battleInt->displayEffect(20,stack->position);
|
|
||||||
battleInt->console->addText(hlp);
|
|
||||||
}
|
|
||||||
|
|
||||||
b->stackActivated(stack);
|
b->stackActivated(stack);
|
||||||
//Regeneration & mana drain go there
|
//Regeneration & mana drain go there
|
||||||
}
|
}
|
||||||
|
@ -1189,7 +1189,7 @@ void CHeroList::updateMove(const CGHeroInstance* which) //draws move points bar
|
|||||||
ser = i;
|
ser = i;
|
||||||
ser -= from;
|
ser -= from;
|
||||||
if(ser<0 || ser >= SIZE) return;
|
if(ser<0 || ser >= SIZE) return;
|
||||||
int pom = std::min((which->movement)/100,(si32)mobile->ourImages.size()-1);
|
int pom = std::min((which->movement)/100,(ui32)mobile->ourImages.size()-1);
|
||||||
blitAt(mobile->ourImages[pom].bitmap,posmobx,posmoby+ser*32); //move point
|
blitAt(mobile->ourImages[pom].bitmap,posmobx,posmoby+ser*32); //move point
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -271,13 +271,13 @@ public:
|
|||||||
|
|
||||||
ConstTransitivePtr<CHero> type;
|
ConstTransitivePtr<CHero> type;
|
||||||
ui64 exp; //experience points
|
ui64 exp; //experience points
|
||||||
si32 level; //current level of hero
|
ui32 level; //current level of hero
|
||||||
std::string name; //may be custom
|
std::string name; //may be custom
|
||||||
std::string biography; //if custom
|
std::string biography; //if custom
|
||||||
si32 portrait; //may be custom
|
si32 portrait; //may be custom
|
||||||
si32 mana; // remaining spell points
|
ui32 mana; // remaining spell points
|
||||||
std::vector<std::pair<ui8,ui8> > secSkills; //first - ID of skill, second - level of skill (1 - basic, 2 - adv., 3 - expert); if hero has ability (-1, -1) it meansthat it should have default secondary abilities
|
std::vector<std::pair<ui8,ui8> > secSkills; //first - ID of skill, second - level of skill (1 - basic, 2 - adv., 3 - expert); if hero has ability (-1, -1) it meansthat it should have default secondary abilities
|
||||||
si32 movement; //remaining movement points
|
ui32 movement; //remaining movement points
|
||||||
ui8 sex;
|
ui8 sex;
|
||||||
ui8 inTownGarrison; // if hero is in town garrison
|
ui8 inTownGarrison; // if hero is in town garrison
|
||||||
ConstTransitivePtr<CGTownInstance> visitedTown; //set if hero is visiting town or in the town garrison
|
ConstTransitivePtr<CGTownInstance> visitedTown; //set if hero is visiting town or in the town garrison
|
||||||
@ -293,7 +293,7 @@ public:
|
|||||||
{
|
{
|
||||||
Patrol(){patrolling=false;patrolRadious=-1;};
|
Patrol(){patrolling=false;patrolRadious=-1;};
|
||||||
ui8 patrolling;
|
ui8 patrolling;
|
||||||
si32 patrolRadious;
|
ui32 patrolRadious;
|
||||||
template <typename Handler> void serialize(Handler &h, const int version)
|
template <typename Handler> void serialize(Handler &h, const int version)
|
||||||
{
|
{
|
||||||
h & patrolling & patrolRadious;
|
h & patrolling & patrolRadious;
|
||||||
|
@ -369,9 +369,9 @@ si32 IBonusBearer::Defense(bool withFrenzy /*= true*/) const
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ui16 IBonusBearer::MaxHealth() const
|
ui32 IBonusBearer::MaxHealth() const
|
||||||
{
|
{
|
||||||
return std::max(1, valOfBonuses(Bonus::STACK_HEALTH)); //never 0 or negative
|
return std::max(1, valOfBonuses(Bonus::STACK_HEALTH)); //never 0
|
||||||
}
|
}
|
||||||
|
|
||||||
ui32 IBonusBearer::getMinDamage() const
|
ui32 IBonusBearer::getMinDamage() const
|
||||||
@ -387,7 +387,7 @@ ui32 IBonusBearer::getMaxDamage() const
|
|||||||
return valOfBonuses(Selector::typeSubtype(Bonus::CREATURE_DAMAGE, 0) || Selector::typeSubtype(Bonus::CREATURE_DAMAGE, 2), cachingStr.str());
|
return valOfBonuses(Selector::typeSubtype(Bonus::CREATURE_DAMAGE, 0) || Selector::typeSubtype(Bonus::CREATURE_DAMAGE, 2), cachingStr.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
si32 IBonusBearer::manaLimit() const
|
ui32 IBonusBearer::manaLimit() const
|
||||||
{
|
{
|
||||||
return si32(getPrimSkillLevel(3) * (100.0 + valOfBonuses(Bonus::SECONDARY_SKILL_PREMY, 24)) / 10.0);
|
return si32(getPrimSkillLevel(3) * (100.0 + valOfBonuses(Bonus::SECONDARY_SKILL_PREMY, 24)) / 10.0);
|
||||||
}
|
}
|
||||||
|
@ -494,11 +494,11 @@ public:
|
|||||||
int LuckVal() const; //range [-3, +3]
|
int LuckVal() const; //range [-3, +3]
|
||||||
si32 Attack() const; //get attack of stack with all modificators
|
si32 Attack() const; //get attack of stack with all modificators
|
||||||
si32 Defense(bool withFrenzy = true) const; //get defense of stack with all modificators
|
si32 Defense(bool withFrenzy = true) const; //get defense of stack with all modificators
|
||||||
ui16 MaxHealth() const; //get max HP of stack with all modifiers
|
ui32 MaxHealth() const; //get max HP of stack with all modifiers
|
||||||
bool isLiving() const; //non-undead, non-non living or alive
|
bool isLiving() const; //non-undead, non-non living or alive
|
||||||
virtual si32 magicResistance() const;
|
virtual si32 magicResistance() const;
|
||||||
|
|
||||||
si32 manaLimit() const; //maximum mana value for this hero (basically 10*knowledge)
|
ui32 manaLimit() const; //maximum mana value for this hero (basically 10*knowledge)
|
||||||
int getPrimSkillLevel(int id) const; //0-attack, 1-defence, 2-spell power, 3-knowledge
|
int getPrimSkillLevel(int id) const; //0-attack, 1-defence, 2-spell power, 3-knowledge
|
||||||
const TBonusListPtr getSpellBonuses() const;
|
const TBonusListPtr getSpellBonuses() const;
|
||||||
};
|
};
|
||||||
|
@ -231,7 +231,7 @@ struct SetResource : public CPackForClient //102
|
|||||||
DLL_LINKAGE void applyGs(CGameState *gs);
|
DLL_LINKAGE void applyGs(CGameState *gs);
|
||||||
|
|
||||||
ui8 player, resid;
|
ui8 player, resid;
|
||||||
si32 val;
|
TResourceCap val;
|
||||||
|
|
||||||
template <typename Handler> void serialize(Handler &h, const int version)
|
template <typename Handler> void serialize(Handler &h, const int version)
|
||||||
{
|
{
|
||||||
|
@ -16,7 +16,7 @@ bool Res::ResourceSet::nonZero() const
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Res::ResourceSet::amax(const TResource &val)
|
void Res::ResourceSet::amax(const TResourceCap &val)
|
||||||
{
|
{
|
||||||
for(int i = 0; i < size(); i++)
|
for(int i = 0; i < size(); i++)
|
||||||
::vstd::amax(at(i), val);
|
::vstd::amax(at(i), val);
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include <climits>
|
#include <climits>
|
||||||
|
|
||||||
typedef si32 TResource;
|
typedef si32 TResource;
|
||||||
|
typedef ui64 TResourceCap; //to avoid overflow when adding integers
|
||||||
|
|
||||||
namespace Res
|
namespace Res
|
||||||
{
|
{
|
||||||
@ -102,7 +103,7 @@ namespace Res
|
|||||||
h & static_cast<std::vector<int>&>(*this);
|
h & static_cast<std::vector<int>&>(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
DLL_LINKAGE void amax(const TResource &val); //performs vstd::amax on each element
|
DLL_LINKAGE void amax(const TResourceCap &val); //performs vstd::amax on each element
|
||||||
DLL_LINKAGE bool nonZero() const; //returns true if at least one value is non-zero;
|
DLL_LINKAGE bool nonZero() const; //returns true if at least one value is non-zero;
|
||||||
DLL_LINKAGE bool canAfford(const ResourceSet &price) const;
|
DLL_LINKAGE bool canAfford(const ResourceSet &price) const;
|
||||||
DLL_LINKAGE bool canBeAfforded(const ResourceSet &res) const;
|
DLL_LINKAGE bool canBeAfforded(const ResourceSet &res) const;
|
||||||
@ -112,7 +113,7 @@ namespace Res
|
|||||||
{
|
{
|
||||||
struct ResEntry
|
struct ResEntry
|
||||||
{
|
{
|
||||||
TResource resType, resVal;
|
TResourceCap resType, resVal;
|
||||||
} cur;
|
} cur;
|
||||||
const ResourceSet &rs;
|
const ResourceSet &rs;
|
||||||
void advance();
|
void advance();
|
||||||
|
@ -981,7 +981,7 @@ void CGameHandler::newTurn()
|
|||||||
if(h->visitedTown && vstd::contains(h->visitedTown->builtBuildings,0)) //if hero starts turn in town with mage guild
|
if(h->visitedTown && vstd::contains(h->visitedTown->builtBuildings,0)) //if hero starts turn in town with mage guild
|
||||||
hth.mana = std::max(h->mana, h->manaLimit()); //restore all mana
|
hth.mana = std::max(h->mana, h->manaLimit()); //restore all mana
|
||||||
else
|
else
|
||||||
hth.mana = std::max(si32(0), std::max(h->mana, std::min(h->mana + h->manaRegain(), h->manaLimit())) );
|
hth.mana = std::max((ui32)(0), std::max(h->mana, std::min((ui32)(h->mana + h->manaRegain()), h->manaLimit())));
|
||||||
|
|
||||||
n.heroes.insert(hth);
|
n.heroes.insert(hth);
|
||||||
|
|
||||||
@ -1471,7 +1471,7 @@ bool CGameHandler::moveHero( si32 hid, int3 dst, ui8 instant, ui8 asker /*= 255*
|
|||||||
|
|
||||||
//check if there is blocking visitable object
|
//check if there is blocking visitable object
|
||||||
blockvis = false;
|
blockvis = false;
|
||||||
tmh.movePoints = std::max(si32(0),h->movement-cost); //take move points
|
tmh.movePoints = std::max((ui32)(0),h->movement-cost); //take move points
|
||||||
BOOST_FOREACH(CGObjectInstance *obj, t.visitableObjects)
|
BOOST_FOREACH(CGObjectInstance *obj, t.visitableObjects)
|
||||||
{
|
{
|
||||||
if(obj != h && obj->blockVisit && !(obj->getPassableness() & 1<<h->tempOwner))
|
if(obj != h && obj->blockVisit && !(obj->getPassableness() & 1<<h->tempOwner))
|
||||||
@ -1627,7 +1627,7 @@ ui32 CGameHandler::showBlockingDialog( BlockingDialog *iw )
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGameHandler::giveResource(int player, int which, int val)
|
void CGameHandler::giveResource(int player, int which, int val) //TODO: cap according to Bersy's suggestion
|
||||||
{
|
{
|
||||||
if(!val) return; //don't waste time on empty call
|
if(!val) return; //don't waste time on empty call
|
||||||
SetResource sr;
|
SetResource sr;
|
||||||
@ -5437,7 +5437,17 @@ void CGameHandler::runBattle()
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
if(rand()%24 < nextStackMorale) //this stack hasn't got morale this turn
|
if(rand()%24 < nextStackMorale) //this stack hasn't got morale this turn
|
||||||
++numberOfAsks; //move this stack once more
|
|
||||||
|
{
|
||||||
|
BattleTriggerEffect bte;
|
||||||
|
bte.stackID = next->ID;
|
||||||
|
bte.effect = Bonus::MORALE;
|
||||||
|
bte.val = 1;
|
||||||
|
bte.additionalInfo = 0;
|
||||||
|
sendAndApply(&bte); //play animation
|
||||||
|
|
||||||
|
++numberOfAsks; //move this stack once more
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
--numberOfAsks;
|
--numberOfAsks;
|
||||||
|
Loading…
Reference in New Issue
Block a user