1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-07-17 01:32:21 +02:00

Minor fixes:

- fog of war will be initialized after bonuses are set (needed if heroes
have scouting or arts with sight bonus)
- victory condition "control all dwellings" also requires golem factory/
- it is possible to dismiss troops during exchange between heroes
This commit is contained in:
Ivan Savenko
2014-02-09 19:47:23 +00:00
parent 7f07a30d7d
commit 8d178fbcf5
5 changed files with 20 additions and 7 deletions

View File

@ -799,12 +799,12 @@ void CGameState::init(StartInfo * si)
placeStartingHeroes(); placeStartingHeroes();
initStartingResources(); initStartingResources();
initHeroes(); initHeroes();
initFogOfWar();
initStartingBonus(); initStartingBonus();
initTowns(); initTowns();
initMapObjects(); initMapObjects();
buildBonusSystemTree(); buildBonusSystemTree();
initVisitingAndGarrisonedHeroes(); initVisitingAndGarrisonedHeroes();
initFogOfWar();
logGlobal->debugStream() << "\tChecking objectives"; logGlobal->debugStream() << "\tChecking objectives";
map->checkForObjectives(); //needs to be run when all objects are properly placed map->checkForObjectives(); //needs to be run when all objects are properly placed

View File

@ -70,6 +70,14 @@ EventCondition::EventCondition(EWinLoseType condition):
{ {
} }
EventCondition::EventCondition(EWinLoseType condition, si32 value, si32 objectType, int3 position):
object(nullptr),
value(value),
objectType(objectType),
position(position),
condition(condition)
{}
DisposedHero::DisposedHero() : heroId(0), portrait(255), players(0) DisposedHero::DisposedHero() : heroId(0), portrait(255), players(0)
{ {

View File

@ -122,6 +122,7 @@ struct DLL_LINKAGE EventCondition
}; };
EventCondition(EWinLoseType condition = STANDARD_WIN); EventCondition(EWinLoseType condition = STANDARD_WIN);
EventCondition(EWinLoseType condition, si32 value, si32 objectType, int3 position = int3(-1, -1, -1));
const CGObjectInstance * object; // object that was at specified position on start const CGObjectInstance * object; // object that was at specified position on start
si32 value; si32 value;

View File

@ -449,12 +449,13 @@ void CMapLoaderH3M::readVictoryLossConditions()
} }
case EVictoryConditionType::TAKEDWELLINGS: case EVictoryConditionType::TAKEDWELLINGS:
{ {
EventCondition cond(EventCondition::CONTROL); EventExpression::OperatorAll oper;
cond.objectType = Obj::CREATURE_GENERATOR1; // FIXME: generators 2-4? oper.expressions.push_back(EventCondition(EventCondition::CONTROL, 0, Obj::CREATURE_GENERATOR1));
oper.expressions.push_back(EventCondition(EventCondition::CONTROL, 0, Obj::CREATURE_GENERATOR4));
specialVictory.effect.toOtherMessage = VLC->generaltexth->allTexts[289]; specialVictory.effect.toOtherMessage = VLC->generaltexth->allTexts[289];
specialVictory.onFulfill = VLC->generaltexth->allTexts[288]; specialVictory.onFulfill = VLC->generaltexth->allTexts[288];
specialVictory.trigger = EventExpression(cond); specialVictory.trigger = EventExpression(oper);
break; break;
} }
case EVictoryConditionType::TAKEMINES: case EVictoryConditionType::TAKEMINES:

View File

@ -273,11 +273,11 @@ bool CGarrisonDialogQuery::blocksPack(const CPack *pack) const
ourIds.insert(this->exchangingArmies[1]->id); ourIds.insert(this->exchangingArmies[1]->id);
if(auto stacks = dynamic_cast<const ArrangeStacks*>(pack)) if (auto stacks = dynamic_cast<const ArrangeStacks*>(pack))
{ {
return !vstd::contains(ourIds, stacks->id1) || !vstd::contains(ourIds, stacks->id2); return !vstd::contains(ourIds, stacks->id1) || !vstd::contains(ourIds, stacks->id2);
} }
else if(auto arts = dynamic_cast<const ExchangeArtifacts*>(pack)) if (auto arts = dynamic_cast<const ExchangeArtifacts*>(pack))
{ {
if(auto id1 = boost::apply_visitor(GetEngagedHeroIds(), arts->src.artHolder)) if(auto id1 = boost::apply_visitor(GetEngagedHeroIds(), arts->src.artHolder))
if(!vstd::contains(ourIds, *id1)) if(!vstd::contains(ourIds, *id1))
@ -286,9 +286,12 @@ bool CGarrisonDialogQuery::blocksPack(const CPack *pack) const
if(auto id2 = boost::apply_visitor(GetEngagedHeroIds(), arts->dst.artHolder)) if(auto id2 = boost::apply_visitor(GetEngagedHeroIds(), arts->dst.artHolder))
if(!vstd::contains(ourIds, *id2)) if(!vstd::contains(ourIds, *id2))
return true; return true;
return false; return false;
} }
if (auto dismiss = dynamic_cast<const DisbandCreature*>(pack))
{
return !vstd::contains(ourIds, dismiss->id);
}
return CDialogQuery::blocksPack(pack); return CDialogQuery::blocksPack(pack);
} }