diff --git a/lib/CGameState.cpp b/lib/CGameState.cpp index 76bf6b265..b7dae6e5f 100644 --- a/lib/CGameState.cpp +++ b/lib/CGameState.cpp @@ -799,12 +799,12 @@ void CGameState::init(StartInfo * si) placeStartingHeroes(); initStartingResources(); initHeroes(); - initFogOfWar(); initStartingBonus(); initTowns(); initMapObjects(); buildBonusSystemTree(); initVisitingAndGarrisonedHeroes(); + initFogOfWar(); logGlobal->debugStream() << "\tChecking objectives"; map->checkForObjectives(); //needs to be run when all objects are properly placed diff --git a/lib/mapping/CMap.cpp b/lib/mapping/CMap.cpp index de58a6ae3..77703290e 100644 --- a/lib/mapping/CMap.cpp +++ b/lib/mapping/CMap.cpp @@ -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) { diff --git a/lib/mapping/CMap.h b/lib/mapping/CMap.h index d37579158..55ccfb016 100644 --- a/lib/mapping/CMap.h +++ b/lib/mapping/CMap.h @@ -122,6 +122,7 @@ struct DLL_LINKAGE EventCondition }; 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 si32 value; diff --git a/lib/mapping/MapFormatH3M.cpp b/lib/mapping/MapFormatH3M.cpp index 6cd6497b5..88b4a99fb 100644 --- a/lib/mapping/MapFormatH3M.cpp +++ b/lib/mapping/MapFormatH3M.cpp @@ -449,12 +449,13 @@ void CMapLoaderH3M::readVictoryLossConditions() } case EVictoryConditionType::TAKEDWELLINGS: { - EventCondition cond(EventCondition::CONTROL); - cond.objectType = Obj::CREATURE_GENERATOR1; // FIXME: generators 2-4? + EventExpression::OperatorAll oper; + 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.onFulfill = VLC->generaltexth->allTexts[288]; - specialVictory.trigger = EventExpression(cond); + specialVictory.trigger = EventExpression(oper); break; } case EVictoryConditionType::TAKEMINES: diff --git a/server/CQuery.cpp b/server/CQuery.cpp index 71606d5e9..9ac6e18af 100644 --- a/server/CQuery.cpp +++ b/server/CQuery.cpp @@ -273,11 +273,11 @@ bool CGarrisonDialogQuery::blocksPack(const CPack *pack) const ourIds.insert(this->exchangingArmies[1]->id); - if(auto stacks = dynamic_cast(pack)) + if (auto stacks = dynamic_cast(pack)) { return !vstd::contains(ourIds, stacks->id1) || !vstd::contains(ourIds, stacks->id2); } - else if(auto arts = dynamic_cast(pack)) + if (auto arts = dynamic_cast(pack)) { if(auto id1 = boost::apply_visitor(GetEngagedHeroIds(), arts->src.artHolder)) 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(!vstd::contains(ourIds, *id2)) return true; - return false; } + if (auto dismiss = dynamic_cast(pack)) + { + return !vstd::contains(ourIds, dismiss->id); + } return CDialogQuery::blocksPack(pack); }