Selaa lähdekoodia

Remove pointer to CGObjectInstance from map header

Ivan Savenko 2 vuotta sitten
vanhempi
sitoutus
9f906ff1d2

+ 7 - 7
AI/VCAI/Goals/Win.cpp

@@ -54,15 +54,15 @@ TSubgoal Win::whatToDoToAchieve()
 			return sptr(GetArtOfType(goal.objectType.as<ArtifactID>()));
 		case EventCondition::DESTROY:
 		{
-			if(goal.object)
+			if(goal.objectID != ObjectInstanceID::NONE)
 			{
-				auto obj = cb->getObj(goal.object->id);
+				auto obj = cb->getObj(goal.objectID);
 				if(obj)
 					if(obj->getOwner() == ai->playerID) //we can't capture our own object
 						return sptr(Conquer());
 
 
-				return sptr(VisitObj(goal.object->id.getNum()));
+				return sptr(VisitObj(goal.objectID.getNum()));
 			}
 			else
 			{
@@ -124,13 +124,13 @@ TSubgoal Win::whatToDoToAchieve()
 		}
 		case EventCondition::CONTROL:
 		{
-			if(goal.object)
+			if(goal.objectID != ObjectInstanceID::NONE)
 			{
-				auto objRelations = cb->getPlayerRelations(ai->playerID, goal.object->tempOwner);
+				auto obj = cb->getObj(goal.objectID);
 				
-				if(objRelations == PlayerRelations::ENEMIES)
+				if(obj && cb->getPlayerRelations(ai->playerID, obj->tempOwner) == PlayerRelations::ENEMIES)
 				{
-					return sptr(VisitObj(goal.object->id.getNum()));
+					return sptr(VisitObj(goal.objectID.getNum()));
 				}
 				else
 				{

+ 8 - 8
lib/gameState/CGameState.cpp

@@ -1411,9 +1411,9 @@ bool CGameState::checkForVictory(const PlayerColor & player, const EventConditio
 		}
 		case EventCondition::HAVE_BUILDING:
 		{
-			if (condition.object) // specific town
+			if (condition.objectID != ObjectInstanceID::NONE) // specific town
 			{
-				const auto * t = dynamic_cast<const CGTownInstance *>(condition.object);
+				const auto * t = getTown(condition.objectID);
 				return (t->tempOwner == player && t->hasBuilt(condition.objectType.as<BuildingID>()));
 			}
 			else // any town
@@ -1428,12 +1428,12 @@ bool CGameState::checkForVictory(const PlayerColor & player, const EventConditio
 		}
 		case EventCondition::DESTROY:
 		{
-			if (condition.object) // mode A - destroy specific object of this type
+			if (condition.objectID != ObjectInstanceID::NONE) // mode A - destroy specific object of this type
 			{
-				if(const auto * hero = dynamic_cast<const CGHeroInstance *>(condition.object))
+				if(const auto * hero = getHero(condition.objectID))
 					return boost::range::find(gs->map->heroesOnMap, hero) == gs->map->heroesOnMap.end();
 				else
-					return getObj(condition.object->id) == nullptr;
+					return getObj(condition.objectID) == nullptr;
 			}
 			else
 			{
@@ -1451,9 +1451,9 @@ bool CGameState::checkForVictory(const PlayerColor & player, const EventConditio
 			// NOTE: cgameinfocallback specified explicitly in order to get const version
 			const auto & team = CGameInfoCallback::getPlayerTeam(player)->players;
 
-			if (condition.object) // mode A - flag one specific object, like town
+			if (condition.objectID != ObjectInstanceID::NONE) // mode A - flag one specific object, like town
 			{
-				return team.count(condition.object->tempOwner) != 0;
+				return team.count(getObjInstance(condition.objectID)->tempOwner) != 0;
 			}
 			else
 			{
@@ -1468,7 +1468,7 @@ bool CGameState::checkForVictory(const PlayerColor & player, const EventConditio
 		}
 		case EventCondition::TRANSPORT:
 		{
-			const auto * t = dynamic_cast<const CGTownInstance *>(condition.object);
+			const auto * t = getTown(condition.objectID);
 			return (t->visitingHero && t->visitingHero->hasArt(condition.objectType.as<ArtifactID>())) ||
 				   (t->garrisonHero && t->garrisonHero->hasArt(condition.objectType.as<ArtifactID>()));
 		}

+ 2 - 5
lib/mapObjects/CGHeroInstance.cpp

@@ -1793,11 +1793,8 @@ bool CGHeroInstance::isMissionCritical() const
 
 		auto const & testFunctor = [&](const EventCondition & condition)
 		{
-			if ((condition.condition == EventCondition::CONTROL) && condition.object)
-			{
-				const auto * hero = dynamic_cast<const CGHeroInstance *>(condition.object);
-				return (hero != this);
-			}
+			if ((condition.condition == EventCondition::CONTROL) && condition.objectID != ObjectInstanceID::NONE)
+				return (id != condition.objectID);
 
 			if(condition.condition == EventCondition::IS_HUMAN)
 				return true;

+ 9 - 9
lib/mapping/CMap.cpp

@@ -448,19 +448,19 @@ void CMap::checkForObjectives()
 
 				case EventCondition::HAVE_BUILDING:
 					if (isInTheMap(cond.position))
-						cond.object = getObjectiveObjectFrom(cond.position, Obj::TOWN);
+						cond.objectID = getObjectiveObjectFrom(cond.position, Obj::TOWN)->id;
 					break;
 
 				case EventCondition::CONTROL:
 					if (isInTheMap(cond.position))
-						cond.object = getObjectiveObjectFrom(cond.position, cond.objectType.as<MapObjectID>());
+						cond.objectID = getObjectiveObjectFrom(cond.position, cond.objectType.as<MapObjectID>())->id;
 
-					if (cond.object)
+					if (cond.objectID != ObjectInstanceID::NONE)
 					{
-						const auto * town = dynamic_cast<const CGTownInstance *>(cond.object);
+						const auto * town = dynamic_cast<const CGTownInstance *>(objects[cond.objectID].get());
 						if (town)
 							event.onFulfill.replaceRawString(town->getNameTranslated());
-						const auto * hero = dynamic_cast<const CGHeroInstance *>(cond.object);
+						const auto * hero = dynamic_cast<const CGHeroInstance *>(objects[cond.objectID].get());
 						if (hero)
 							event.onFulfill.replaceRawString(hero->getNameTranslated());
 					}
@@ -468,17 +468,17 @@ void CMap::checkForObjectives()
 
 				case EventCondition::DESTROY:
 					if (isInTheMap(cond.position))
-						cond.object = getObjectiveObjectFrom(cond.position, cond.objectType.as<MapObjectID>());
+						cond.objectID = getObjectiveObjectFrom(cond.position, cond.objectType.as<MapObjectID>())->id;
 
-					if (cond.object)
+					if (cond.objectID != ObjectInstanceID::NONE)
 					{
-						const auto * hero = dynamic_cast<const CGHeroInstance *>(cond.object);
+						const auto * hero = dynamic_cast<const CGHeroInstance *>(objects[cond.objectID].get());
 						if (hero)
 							event.onFulfill.replaceRawString(hero->getNameTranslated());
 					}
 					break;
 				case EventCondition::TRANSPORT:
-					cond.object = getObjectiveObjectFrom(cond.position, Obj::TOWN);
+					cond.objectID = getObjectiveObjectFrom(cond.position, Obj::TOWN)->id;
 					break;
 				//break; case EventCondition::DAYS_PASSED:
 				//break; case EventCondition::IS_HUMAN:

+ 0 - 2
lib/mapping/CMapHeader.cpp

@@ -68,7 +68,6 @@ bool PlayerInfo::hasCustomMainHero() const
 }
 
 EventCondition::EventCondition(EWinLoseType condition):
-	object(nullptr),
 	value(-1),
 	position(-1, -1, -1),
 	condition(condition)
@@ -76,7 +75,6 @@ EventCondition::EventCondition(EWinLoseType condition):
 }
 
 EventCondition::EventCondition(EWinLoseType condition, si32 value, TargetTypeID objectType, const int3 & position):
-	object(nullptr),
 	value(value),
 	objectType(objectType),
 	position(position),

+ 2 - 2
lib/mapping/CMapHeader.h

@@ -120,7 +120,7 @@ struct DLL_LINKAGE EventCondition
 	EventCondition(EWinLoseType condition = STANDARD_WIN);
 	EventCondition(EWinLoseType condition, si32 value, TargetTypeID objectType, const int3 & position = int3(-1, -1, -1));
 
-	const CGObjectInstance * object; // object that was at specified position or with instance name on start
+	ObjectInstanceID objectID; // object that was at specified position or with instance name on start
 	si32 value;
 	TargetTypeID objectType;
 	std::string objectInstanceName;
@@ -130,7 +130,7 @@ struct DLL_LINKAGE EventCondition
 	template <typename Handler>
 	void serialize(Handler & h, const int version)
 	{
-		h & object;
+		h & objectID;
 		h & value;
 		h & objectType;
 		h & position;

+ 1 - 1
lib/networkPacks/NetPacksLib.cpp

@@ -1215,7 +1215,7 @@ void RemoveObject::applyGs(CGameState *gs)
 	{
 		auto patcher = [&](EventCondition cond) -> EventExpression::Variant
 		{
-			if (cond.object == obj)
+			if (cond.objectID == obj->id)
 			{
 				if (cond.condition == EventCondition::DESTROY)
 				{