Bazaar developer reference

CvPlot::changeBuildProgress(BuildTypes, int, PlayerTypes)

Defined in
CvPlot.cpp, line 9788
Class
CvPlot
Hook name
CivHooks::CvPlot_changeBuildProgress
Lua events
GameEvents.BuildFinished

Hooks

static bool BeforeCvPlot_changeBuildProgress(CvPlot* self, BuildTypes eBuild, int iChange, PlayerTypes ePlayer, bool& result);static void AfterCvPlot_changeBuildProgress(CvPlot* self, BuildTypes eBuild, int iChange, PlayerTypes ePlayer, bool& result);static bool ReplaceCvPlot_changeBuildProgress(bool (*original)(CvPlot*, BuildTypes, int, PlayerTypes), CvPlot* self, BuildTypes eBuild, int iChange, PlayerTypes ePlayer);CivRegisterBefore<CivHooks::CvPlot_changeBuildProgress>(host, &BeforeCvPlot_changeBuildProgress);CivRegisterAfter<CivHooks::CvPlot_changeBuildProgress>(host, &AfterCvPlot_changeBuildProgress);CivRegisterReplace<CivHooks::CvPlot_changeBuildProgress>(host, &ReplaceCvPlot_changeBuildProgress);

Code

9787// Returns true if build finished...9788bool CvPlot::changeBuildProgress(BuildTypes eBuild, int iChange, PlayerTypes ePlayer)9789{9790	CvCity* pCity;9791	CvString strBuffer;9792	int iProduction;9793	bool bFinished = false;9794	CvPlayer &kPlayer = GET_PLAYER(ePlayer);97959796	CvBuildInfo* pkBuildInfo = GC.getBuildInfo(eBuild);9797	CvAssert(pkBuildInfo);97989799	//This shouldn't happen.9800	if(pkBuildInfo == NULL)9801		return false;98029803	if(iChange != 0)9804	{9805		if(NULL == m_paiBuildProgress)9806		{9807			m_paiBuildProgress = FNEW(short[GC.getNumBuildInfos()], c_eCiv5GameplayDLL, 0);9808			for(int iI = 0; iI < GC.getNumBuildInfos(); ++iI)9809			{9810				m_paiBuildProgress[iI] = 0;9811			}9812		}98139814		ImprovementTypes eImprovement = (ImprovementTypes)pkBuildInfo->getImprovement();9815		if (eImprovement != NO_IMPROVEMENT)9816		{9817			if (eImprovement != m_eImprovementTypeUnderConstruction)9818			{9819				SilentlyResetAllBuildProgress();9820				m_eImprovementTypeUnderConstruction = eImprovement;9821			}9822		}98239824		m_paiBuildProgress[eBuild] += iChange;9825		CvAssert(getBuildProgress(eBuild) >= 0);98269827		if(getBuildProgress(eBuild) >= getBuildTime(eBuild, ePlayer))9828		{9829			m_paiBuildProgress[eBuild] = 0;98309831			// Constructed Improvement9832			if (eImprovement != NO_IMPROVEMENT)9833			{9834				setImprovementType(eImprovement, ePlayer);9835				9836#if defined(MOD_BUGFIX_MINOR)9837				// Building a GP improvement on a resource needs to clear any previous pillaged state9838				if (GC.getImprovementInfo(eImprovement)->IsCreatedByGreatPerson()) {9839#if defined(MOD_EVENTS_TILE_IMPROVEMENTS)9840					SetImprovementPillaged(false, false);9841#else9842					SetImprovementPillaged(false);9843#endif9844				}9845#endif98469847				// Unowned plot, someone has to foot the bill9848				if(getOwner() == NO_PLAYER)9849				{9850					if(MustPayMaintenanceHere(ePlayer))9851					{9852						kPlayer.GetTreasury()->ChangeBaseImprovementGoldMaintenance(GC.getImprovementInfo(eImprovement)->GetGoldMaintenance());9853					}9854					SetPlayerResponsibleForImprovement(ePlayer);9855				}98569857				CvImprovementEntry& newImprovementEntry = *GC.getImprovementInfo(eImprovement);98589859				// If this improvement removes the underlying resource, do that9860				if (newImprovementEntry.IsRemovesResource())9861				{9862					if (getResourceType() != NO_RESOURCE)9863					{9864						setResourceType(NO_RESOURCE, 0);9865					}9866				}98679868				// If we want to prompt the user about archaeology, let's record that9869				if (newImprovementEntry.IsPromptWhenComplete())9870				{9871					CvAssertMsg (GetArchaeologicalRecord().m_eArtifactType != NO_GREAT_WORK_ARTIFACT_CLASS, "Archaeological dig complete but no archeology data found!");98729873					kPlayer.SetNumArchaeologyChoices(kPlayer.GetNumArchaeologyChoices() + 1);9874					kPlayer.GetCulture()->AddDigCompletePlot(this);98759876					if(kPlayer.isHuman())9877					{9878						CvNotifications* pNotifications;9879						Localization::String locString;9880						Localization::String locSummary;9881						pNotifications = kPlayer.GetNotifications();9882						if(pNotifications)9883						{9884							strBuffer = GetLocalizedText("TXT_KEY_NOTIFICATION_CHOOSE_ARCHAEOLOGY");9885							CvString strSummary = GetLocalizedText("TXT_KEY_NOTIFICATION_SUMMARY_CHOOSE_ARCHAEOLOGY");9886							pNotifications->Add(NOTIFICATION_CHOOSE_ARCHAEOLOGY, strBuffer, strSummary, getX(), getY(), kPlayer.GetID());9887							CancelActivePlayerEndTurn();9888						}98899890#if !defined(NO_ACHIEVEMENTS)9891						// Raiders of the Lost Ark achievement9892						const char* szCivKey = kPlayer.getCivilizationTypeKey();9893						if(getOwner() != NO_PLAYER && !GC.getGame().isNetworkMultiPlayer() && strcmp(szCivKey, "CIVILIZATION_AMERICA") == 0)9894						{9895							CvPlayer &kPlotOwner = GET_PLAYER(getOwner());9896							szCivKey = kPlotOwner.getCivilizationTypeKey();9897							if(strcmp(szCivKey, "CIVILIZATION_EGYPT") == 0)9898							{9899								for (int i = 0; i < MAX_MAJOR_CIVS; i++)9900								{9901									CvPlayer &kLoopPlayer = GET_PLAYER((PlayerTypes)i);9902									if (kLoopPlayer.GetID() != NO_PLAYER && kLoopPlayer.isAlive())9903									{9904										szCivKey = kLoopPlayer.getCivilizationTypeKey();9905										if (strcmp(szCivKey, "CIVILIZATION_GERMANY"))9906										{9907											CvUnit *pLoopUnit;9908											int iUnitLoop;9909											for(pLoopUnit = kLoopPlayer.firstUnit(&iUnitLoop); pLoopUnit != NULL; pLoopUnit = kLoopPlayer.nextUnit(&iUnitLoop))9910											{9911												if(strcmp(pLoopUnit->getUnitInfo().GetType(), "UNIT_ARCHAEOLOGIST") == 0)9912												{9913													if (plotDistance(pLoopUnit->getX(), pLoopUnit->getY(), getX(), getY()) <= 2)9914													{9915														gDLL->UnlockAchievement(ACHIEVEMENT_XP2_33);9916													}9917												}9918											}9919										}9920									}9921								}9922							}9923						}9924#endif9925					}9926					else9927					{	9928						ArchaeologyChoiceType eChoice = kPlayer.GetCulture()->GetArchaeologyChoice(this);9929						kPlayer.GetCulture()->DoArchaeologyChoice (eChoice);9930					}9931				}9932			}99339934			// Constructed Route9935			if(pkBuildInfo->getRoute() != NO_ROUTE)9936			{9937				const RouteTypes eRoute = (RouteTypes)pkBuildInfo->getRoute();9938				CvRouteInfo* pkRouteInfo = GC.getRouteInfo(eRoute);9939				if(pkRouteInfo)9940				{9941					setRouteType(eRoute);99429943					// Unowned plot, someone has to foot the bill9944					if(getOwner() == NO_PLAYER)9945					{9946						if(MustPayMaintenanceHere(ePlayer))9947						{9948							kPlayer.GetTreasury()->ChangeBaseImprovementGoldMaintenance(pkRouteInfo->GetGoldMaintenance());9949						}9950						SetPlayerResponsibleForRoute(ePlayer);9951					}9952				}9953			}99549955			// Remove Feature9956			if(getFeatureType() != NO_FEATURE)9957			{9958				if(pkBuildInfo->isFeatureRemove(getFeatureType()))9959				{9960					CvAssertMsg(ePlayer != NO_PLAYER, "ePlayer should be valid");99619962					iProduction = getFeatureProduction(eBuild, ePlayer, &pCity);99639964					if(iProduction > 0)9965					{9966						pCity->changeFeatureProduction(iProduction);9967						if(pCity->getOwner() == GC.getGame().getActivePlayer())9968						{9969							strBuffer = GetLocalizedText("TXT_KEY_MISC_CLEARING_FEATURE_RESOURCE", GC.getFeatureInfo(getFeatureType())->GetTextKey(), iProduction, pCity->getNameKey());9970							GC.GetEngineUserInterface()->AddCityMessage(0, pCity->GetIDInfo(), pCity->getOwner(), false, GC.getEVENT_MESSAGE_TIME(), strBuffer);9971						}9972					}99739974					setFeatureType(NO_FEATURE);9975				}9976			}99779978			// Repairing a Pillaged Tile9979			if(pkBuildInfo->isRepair())9980			{9981				if(IsImprovementPillaged())9982				{9983					SetImprovementPillaged(false);9984				}9985				else if(IsRoutePillaged())9986				{9987					SetRoutePillaged(false);9988				}9989			}99909991			if(pkBuildInfo->IsRemoveRoute())9992			{9993				setRouteType(NO_ROUTE);9994			}99959996			bFinished = true;99979998			ICvEngineScriptSystem1* pkScriptSystem = gDLL->GetScriptSystem();9999			if(pkScriptSystem)10000			{10001				CvLuaArgsHandle args;10002				args->Push(ePlayer);10003				args->Push(getX());10004				args->Push(getY());10005				args->Push(eImprovement);1000610007				bool bResult;10008				LuaSupport::CallHook(pkScriptSystem, "BuildFinished", args.get(), bResult);10009			}10010		}10011	}1001210013	return bFinished;10014}

Calls

Called by