瀏覽代碼

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

Ivan Savenko 11 年之前
父節點
當前提交
8d178fbcf5
共有 5 個文件被更改,包括 20 次插入7 次删除
  1. 1 1
      lib/CGameState.cpp
  2. 8 0
      lib/mapping/CMap.cpp
  3. 1 0
      lib/mapping/CMap.h
  4. 4 3
      lib/mapping/MapFormatH3M.cpp
  5. 6 3
      server/CQuery.cpp

+ 1 - 1
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

+ 8 - 0
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)
 {
 

+ 1 - 0
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;

+ 4 - 3
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:

+ 6 - 3
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<const ArrangeStacks*>(pack))
+	if (auto stacks = dynamic_cast<const ArrangeStacks*>(pack))
 	{
 		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(!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<const DisbandCreature*>(pack))
+	{
+		return !vstd::contains(ourIds, dismiss->id);
+	}
 
 	return CDialogQuery::blocksPack(pack);
 }