Bazaar developer reference

CvPlot::setRevealed(TeamTypes, bool, CvUnit *, bool, TeamTypes)

Defined in
CvPlot.cpp, line 9133
Class
CvPlot
Hook name
CivHooks::CvPlot_setRevealed
Lua events
GameEvents.NaturalWonderDiscovered, GameEvents.TileRevealed

Hand-placed hooks inside

A replacement for this function that does not call original stops these hooks from running.

Hooks

static bool BeforeCvPlot_setRevealed(CvPlot* self, TeamTypes eTeam, bool bNewValue, CvUnit* pUnit, bool bTerrainOnly, TeamTypes eFromTeam, bool& result);static void AfterCvPlot_setRevealed(CvPlot* self, TeamTypes eTeam, bool bNewValue, CvUnit* pUnit, bool bTerrainOnly, TeamTypes eFromTeam, bool& result);static bool ReplaceCvPlot_setRevealed(bool (*original)(CvPlot*, TeamTypes, bool, CvUnit*, bool, TeamTypes), CvPlot* self, TeamTypes eTeam, bool bNewValue, CvUnit* pUnit, bool bTerrainOnly, TeamTypes eFromTeam);CivRegisterBefore<CivHooks::CvPlot_setRevealed>(host, &BeforeCvPlot_setRevealed);CivRegisterAfter<CivHooks::CvPlot_setRevealed>(host, &AfterCvPlot_setRevealed);CivRegisterReplace<CivHooks::CvPlot_setRevealed>(host, &ReplaceCvPlot_setRevealed);

Code

9132#if defined(MOD_API_EXTENSIONS)9133bool CvPlot::setRevealed(TeamTypes eTeam, bool bNewValue, CvUnit* pUnit, bool bTerrainOnly, TeamTypes eFromTeam)9134#else9135bool CvPlot::setRevealed(TeamTypes eTeam, bool bNewValue, bool bTerrainOnly, TeamTypes eFromTeam)9136#endif9137{9138	int iI;9139	9140#if defined(MOD_EVENTS_TILE_REVEALED)9141	// We need to capture this value here, as a Natural Wonder may update it before we need it9142	int iRevealedMajors = getNumMajorCivsRevealed();9143#endif91449145	CvAssertMsg(eTeam >= 0, "eTeam is expected to be non-negative (invalid Index)");9146	CvAssertMsg(eTeam < MAX_TEAMS, "eTeam is expected to be within maximum bounds (invalid Index)");91479148	CvCity* pCity = getPlotCity();9149	TeamTypes eActiveTeam = GC.getGame().getActiveTeam();9150	ICvUserInterface2* pInterface =  GC.GetEngineUserInterface();91519152	bool bVisbilityUpdated = false;9153	if(isRevealed(eTeam) != bNewValue)9154	{91559156		m_bfRevealed.ToggleBit(eTeam);91579158#if !defined(NO_ACHIEVEMENTS)9159		bool bEligibleForAchievement = GET_PLAYER(GC.getGame().getActivePlayer()).isHuman() && !GC.getGame().isGameMultiPlayer();9160#endif91619162		if(area())9163		{9164			area()->changeNumRevealedTiles(eTeam, (bNewValue ? 1 : -1));9165		}91669167		// Natural Wonder9168		if(eTeam != BARBARIAN_TEAM)9169		{9170			if(getFeatureType() != NO_FEATURE)9171			{9172				if(GC.getFeatureInfo(getFeatureType())->IsNaturalWonder())9173				{9174					GET_TEAM(eTeam).ChangeNumNaturalWondersDiscovered(1);91759176					int iNumNaturalWondersLeft = GC.getMap().GetNumNaturalWonders() - GET_TEAM(eTeam).GetNumNaturalWondersDiscovered();91779178#if defined(MOD_EVENTS_NW_DISCOVERY)9179					if (MOD_EVENTS_NW_DISCOVERY) {9180						GAMEEVENTINVOKE_HOOK(GAMEEVENT_NaturalWonderDiscovered, eTeam, getFeatureType(), getX(), getY(), (getNumMajorCivsRevealed() == 0), (pUnit?pUnit->getOwner():NO_PLAYER), (pUnit?pUnit->GetID():-1));9181					} else {9182#endif9183					ICvEngineScriptSystem1* pkScriptSystem = gDLL->GetScriptSystem();9184					if (pkScriptSystem) 9185					{9186						CvLuaArgsHandle args;9187						args->Push(eTeam);9188						args->Push(getFeatureType());9189						args->Push(getX());9190						args->Push(getY());9191						args->Push((getNumMajorCivsRevealed() == 0)); // bFirst91929193						bool bResult = false;9194						LuaSupport::CallHook(pkScriptSystem, "NaturalWonderDiscovered", args.get(), bResult);9195					}9196#if defined(MOD_EVENTS_NW_DISCOVERY)9197					}9198#endif9199					9200					Localization::String strText = Localization::Lookup("TXT_KEY_NOTIFICATION_FOUND_NATURAL_WONDER");9201					strText << iNumNaturalWondersLeft;9202					strText << GC.getFeatureInfo(getFeatureType())->GetTextKey();9203					Localization::String strSummary = Localization::Lookup("TXT_KEY_NOTIFICATION_SUMMARY_FOUND_NATURAL_WONDER");92049205					// Loop through all players to give them a Notification9206					for(iI = 0; iI < MAX_MAJOR_CIVS; ++iI)9207					{9208						CvPlayerAI& playerI = GET_PLAYER((PlayerTypes)iI);9209						if(playerI.isAlive())9210						{9211							if(playerI.getTeam() == eTeam)9212							{9213								// Num Natural Wonders found in a player's area9214								if(playerI.getStartingPlot() != NULL)9215								{9216									if(getArea() == playerI.getStartingPlot()->getArea())9217									{9218										playerI.ChangeNumNaturalWondersDiscoveredInArea(1);9219									}9220								}92219222								playerI.DoUpdateHappiness();92239224								// Add World Anchor9225								if(eTeam == eActiveTeam)9226									SetWorldAnchor(WORLD_ANCHOR_NATURAL_WONDER, getFeatureType());92279228								// Notification9229								CvNotifications* pNotifications = GET_PLAYER((PlayerTypes)iI).GetNotifications();9230								if(pNotifications)9231								{9232									pNotifications->Add(NOTIFICATION_EXPLORATION_RACE, strText.toUTF8(), strSummary.toUTF8(), getX(), getY(), getFeatureType());9233								}9234							}9235						}9236					}92379238					// FIRST (MAJOR CIV) FINDER?9239					int iFinderGold = 0;9240					bool bFirstFinder = false;9241					CvTeam& kTeam = GET_TEAM(eTeam);9242					if(!kTeam.isMinorCiv() && !kTeam.isBarbarian() && !kTeam.isObserver())9243					{9244						if(getNumMajorCivsRevealed() == 0)9245						{9246							changeNumMajorCivsRevealed(1);9247							bFirstFinder = true;92489249							// Does it yields gold to the first major civ finder?9250							iFinderGold = GC.getFeatureInfo(getFeatureType())->getFirstFinderGold();92519252							// Does a player on this team have a trait that gives first finder gold?9253							for(iI = 0; iI < MAX_MAJOR_CIVS; ++iI)9254							{9255								CvPlayerAI& playerI = GET_PLAYER((PlayerTypes)iI);9256								if(playerI.isAlive())9257								{9258									if(playerI.getTeam() == eTeam)9259									{9260										iFinderGold += playerI.GetPlayerTraits()->GetNaturalWonderFirstFinderGold();9261									}9262								}9263							}9264						}9265						else9266						{9267							// Does a player on this team have a trait that gives subsequent finder gold?9268							for(iI = 0; iI < MAX_MAJOR_CIVS; ++iI)9269							{9270								CvPlayerAI& playerI = GET_PLAYER((PlayerTypes)iI);9271								if(playerI.isAlive())9272								{9273									if(playerI.getTeam() == eTeam)9274									{9275										iFinderGold += playerI.GetPlayerTraits()->GetNaturalWonderSubsequentFinderGold();9276									}9277								}9278							}9279						}92809281						// Scale up or down based on difficulty9282						if(iFinderGold > 0)9283						{9284							const int iStandardHandicap = GC.getInfoTypeForString("HANDICAP_PRINCE");9285							if(iStandardHandicap >= 0)9286							{9287								const CvHandicapInfo* pkHandicapInfo = GC.getHandicapInfo((HandicapTypes)iStandardHandicap);9288								if(pkHandicapInfo)9289								{9290									iFinderGold *= pkHandicapInfo->getBarbCampGold();9291									iFinderGold /= GC.getGame().getHandicapInfo().getBarbCampGold();9292								}9293							}92949295							// TODO - WH - scale this by game speed as well as difficulty9296							// Game Speed Mod9297							// iFinderGold *= GC.getGameSpeedInfo(GC.getGame().getGameSpeedType())->getGoldPercent();9298							// iFinderGold /= 100;9299						}93009301						if(iFinderGold > 0)9302						{9303							// Compute gold per team member9304							int iGoldPerTeamMember = iFinderGold;93059306							if(kTeam.getNumMembers() > 0)9307							{9308								iGoldPerTeamMember = iFinderGold / kTeam.getNumMembers();9309							}93109311							for(iI = 0; iI < MAX_MAJOR_CIVS; ++iI)9312							{9313								CvPlayerAI& playerI = GET_PLAYER((PlayerTypes)iI);9314								if(playerI.isAlive())9315								{9316									if(playerI.getTeam() == eTeam)9317									{9318										playerI.GetTreasury()->ChangeGold(iGoldPerTeamMember);9319									}9320								}9321#if defined(MOD_BUGFIX_MINOR)9322							}9323#endif93249325								if(eTeam == eActiveTeam)9326								{9327									char text[256] = {0};9328#if !defined(SHOW_PLOT_POPUP)9329									float fDelay = GC.getPOST_COMBAT_TEXT_DELAY() * 3;9330#endif9331									text[0] = NULL;9332									sprintf_s(text, "[COLOR_YELLOW]+%d[ENDCOLOR][ICON_GOLD]", iFinderGold);9333#if defined(SHOW_PLOT_POPUP)9334									SHOW_PLOT_POPUP(this, NO_PLAYER, text, 0.0f);9335#else9336									GC.GetEngineUserInterface()->AddPopupText(getX(), getY(), text, fDelay);9337#endif9338								}9339#if !defined(MOD_BUGFIX_MINOR)9340							}9341#endif9342						}9343					}93449345#if defined(CIV_HOST_API)9346					CivHandPopupRaised(CivHostTeamPlayers(eTeam), BUTTONPOPUP_NATURAL_WONDER_REWARD, getX(), getY(), iFinderGold, bFirstFinder, false, "");hand-placed hook: PopupRaised9347#endif93489349					// If it's the active team then tell them they found something9350					if(eTeam == eActiveTeam)9351					{9352						bool bDontShowRewardPopup = GC.GetEngineUserInterface()->IsOptionNoRewardPopups();93539354						// Popup (no MP)9355#if defined(MOD_API_EXTENSIONS)9356						if(!GC.getGame().isReallyNetworkMultiPlayer() && !bDontShowRewardPopup)9357#else9358						if(!GC.getGame().isNetworkMultiPlayer() && !bDontShowRewardPopup)	// KWG: candidate for !GC.getGame().isOption(GAMEOPTION_SIMULTANEOUS_TURNS)9359#endif9360						{9361							CvPopupInfo kPopupInfo(BUTTONPOPUP_NATURAL_WONDER_REWARD, getX(), getY(), iFinderGold, 0 /*iFlags */, bFirstFinder);9362							pInterface->AddPopup(kPopupInfo);9363							CvPlayer& kActivePlayer = GET_PLAYER(GC.getGame().getActivePlayer());9364							if (kActivePlayer.getTeam() == eActiveTeam)9365							{9366								// We are adding a popup that the player must make a choice in, make sure they are not in the end-turn phase.9367								CancelActivePlayerEndTurn();9368							}93699370#if !defined(NO_ACHIEVEMENTS)9371							//Add Stat and check for Achievement9372							if(bEligibleForAchievement && !GC.getGame().isGameMultiPlayer())9373							{9374								gDLL->IncrementSteamStatAndUnlock(ESTEAMSTAT_NATURALWONDERS, 100, ACHIEVEMENT_ALL_NATURALWONDER);9375							}9376#endif93779378						}93799380#if !defined(NO_ACHIEVEMENTS)9381						//DLC2 Natural Wonder Achievements9382						{9383							CvFeatureInfo* pkFeatureInfo = GC.getFeatureInfo(getFeatureType());9384							if(pkFeatureInfo)9385							{9386								CvString strFeatureType = pkFeatureInfo->GetType();9387								if(strFeatureType == "FEATURE_FOUNTAIN_YOUTH")9388									gDLL->UnlockAchievement(ACHIEVEMENT_SCENARIO_02_DISCOVER_FOUNTAIN);9389								else if(strFeatureType == "FEATURE_EL_DORADO")9390									gDLL->UnlockAchievement(ACHIEVEMENT_SCENARIO_02_DISCOVER_EL_DORADO);9391							}9392						}9393#endif93949395						auto_ptr<ICvPlot1> pDllPlot(new CvDllPlot(this));9396						gDLL->GameplayNaturalWonderRevealed(pDllPlot.get());9397					}9398				}9399			}9400		}94019402		if(eTeam == eActiveTeam)9403		{9404			bVisbilityUpdated = true;9405			updateSymbols();9406			updateFog(true);9407			updateVisibility();94089409			// Active player is seeing this Plot for the first time9410			if(isRevealed(eTeam))9411			{9412				// update the resources9413				if(getResourceType(eTeam) != NO_RESOURCE)9414				{9415					// If we've force revealed the resource for this team, then don't send another event9416					if(!IsResourceForceReveal(eTeam))9417					{9418						setLayoutDirty(true);9419					}9420				}94219422				// Found a Goody Hut9423				if(getImprovementType() != NO_IMPROVEMENT)9424				{9425					if(GC.getImprovementInfo(getImprovementType())->IsGoody())9426					{9427						CvString strBuffer = GetLocalizedText("TXT_KEY_NOTIFICATION_FOUND_GOODY_HUT");9428						CvString strSummary = GetLocalizedText("TXT_KEY_NOTIFICATION_SUMMARY_FOUND_GOODY_HUT");9429#if !defined(NO_ACHIEVEMENTS)9430						if(bEligibleForAchievement)9431						{9432							gDLL->UnlockAchievement(ACHIEVEMENT_ANCIENT_RUIN);9433							OutputDebugString("RUINS!");9434						}9435#endif9436						for(iI = 0; iI < MAX_MAJOR_CIVS; ++iI)9437						{9438							CvPlayerAI& playerI = GET_PLAYER((PlayerTypes)iI);9439							if(playerI.isAlive())9440							{9441								if(playerI.getTeam() == eTeam)9442								{9443									CvNotifications* pNotifications = playerI.GetNotifications();9444									if(pNotifications)9445									{9446										pNotifications->Add(NOTIFICATION_GOODY, strBuffer, strSummary, getX(), getY(), -1);9447									}9448								}9449							}9450						}9451					}9452				}9453#if !defined(NO_ACHIEVEMENTS)9454				if(bEligibleForAchievement)9455				{9456					gDLL->IncrementSteamStatAndUnlock(ESTEAMSTAT_TILESDISCOVERED, 1000, ACHIEVEMENT_1000TILES);9457				}9458#endif945994609461			}9462		}94639464		if(bNewValue)9465		{9466			if(pInterface->GetHeadSelectedUnit() != NULL)9467			{9468				// This is what determines if the camera jumps quickly or slowly - if we're revealing new plots go slower.  The following function sets this flag9469				pInterface->SetSelectedUnitRevealingNewPlots(true);9470			}9471		}9472	}94739474	if(!bTerrainOnly)9475	{9476		bool bVisibilityChanged = false;9477		bool bImprovementVisibilityChanged = false;9478		if(isRevealed(eTeam))9479		{9480			// If this plot is owned by someone, let the team know9481			if(getOwner() != NO_PLAYER)9482			{9483				bVisibilityChanged |= GET_TEAM(eTeam).SetHasFoundPlayersTerritory(getOwner(), true);9484			}94859486			if(eFromTeam == NO_TEAM)9487			{9488				bVisibilityChanged |= setRevealedOwner(eTeam, getOwner());9489				bImprovementVisibilityChanged |= setRevealedImprovementType(eTeam, getImprovementType());9490				bVisibilityChanged |= setRevealedRouteType(eTeam, getRouteType());94919492				if(pCity != NULL)9493				{9494					bVisibilityChanged |= pCity->setRevealed(eTeam, true);9495				}9496			}9497			else9498			{9499				if(getRevealedOwner(eFromTeam) == getOwner())9500				{9501					bVisibilityChanged |= setRevealedOwner(eTeam, getRevealedOwner(eFromTeam));9502				}95039504				if(getRevealedImprovementType(eFromTeam) == getImprovementType())9505				{9506					bImprovementVisibilityChanged |= setRevealedImprovementType(eTeam, getRevealedImprovementType(eFromTeam));9507				}95089509				if(getRevealedRouteType(eFromTeam) == getRouteType())9510				{9511					bVisibilityChanged |= setRevealedRouteType(eTeam, getRevealedRouteType(eFromTeam));9512				}95139514				if(pCity != NULL)9515				{9516					if(pCity->isRevealed(eFromTeam, false))9517					{9518						bVisibilityChanged |= pCity->setRevealed(eTeam, true);9519					}9520				}9521			}9522		}9523		else9524		{9525			bVisibilityChanged |= setRevealedOwner(eTeam, NO_PLAYER);9526			bImprovementVisibilityChanged |= setRevealedImprovementType(eTeam, NO_IMPROVEMENT);9527			bVisibilityChanged |= setRevealedRouteType(eTeam, NO_ROUTE);95289529			if(pCity != NULL)9530			{9531				bVisibilityChanged |= pCity->setRevealed(eTeam, false);9532			}9533		}95349535		if (!bVisbilityUpdated && (bVisibilityChanged || bImprovementVisibilityChanged))9536		{9537			if(eTeam == eActiveTeam)9538			{9539				if (!bImprovementVisibilityChanged)	// Don't bother sending again if the improvement change already sent the message9540					updateSymbols();95419542				updateFog(true);9543				updateVisibility();9544			}95459546			bVisbilityUpdated = true;9547		}9548	}9549	9550#if defined(MOD_EVENTS_TILE_REVEALED)9551	CvTeam& kTeam = GET_TEAM(eTeam);9552	9553	if (MOD_EVENTS_TILE_REVEALED && bNewValue) {9554		GAMEEVENTINVOKE_HOOK(GAMEEVENT_TileRevealed, getX(), getY(), eTeam, eFromTeam, (kTeam.isMajorCiv() && iRevealedMajors == 0), (pUnit ? pUnit->getOwner() : NO_PLAYER), (pUnit ? pUnit->GetID() : -1));9555	}95569557	// This is badly named, as it's actually an on/off "revealed to any major" flag, not a counter9558	if (getNumMajorCivsRevealed() == 0) {9559		if (kTeam.isMajorCiv()) {9560			changeNumMajorCivsRevealed(1);9561		}9562	}9563#endif95649565	return bVisbilityUpdated;9566}

Calls

Called by