Bazaar developer reference

CvCity::doCheckProduction()

Defined in
CvCity.cpp, line 14615
Class
CvCity
Hook name
CivHooks::CvCity_doCheckProduction

Hooks

static bool BeforeCvCity_doCheckProduction(CvCity* self, bool& result);static void AfterCvCity_doCheckProduction(CvCity* self, bool& result);static bool ReplaceCvCity_doCheckProduction(bool (*original)(CvCity*), CvCity* self);CivRegisterBefore<CivHooks::CvCity_doCheckProduction>(host, &BeforeCvCity_doCheckProduction);CivRegisterAfter<CivHooks::CvCity_doCheckProduction>(host, &AfterCvCity_doCheckProduction);CivRegisterReplace<CivHooks::CvCity_doCheckProduction>(host, &ReplaceCvCity_doCheckProduction);

Code

14615bool CvCity::doCheckProduction()14616{14617	AI_PERF_FORMAT("City-AI-perf.csv", ("CvCity::doCheckProduction, Turn %03d, %s, %s", GC.getGame().getElapsedGameTurns(), GetPlayer()->getCivilizationShortDescription(), getName().c_str()) );14618	VALIDATE_OBJECT14619	OrderData* pOrderNode;14620	UnitTypes eUpgradeUnit;14621	int iUpgradeProduction;14622	int iProductionGold;14623	int iI;14624	bool bOK = true;1462514626	int iMaxedUnitGoldPercent = GC.getMAXED_UNIT_GOLD_PERCENT();14627	int iMaxedBuildingGoldPercent = GC.getMAXED_BUILDING_GOLD_PERCENT();14628	int iMaxedProjectGoldPercent = GC.getMAXED_PROJECT_GOLD_PERCENT();1462914630	CvPlayerAI& thisPlayer = GET_PLAYER(getOwner());1463114632	int iNumUnitInfos = GC.getNumUnitInfos();14633	{14634		AI_PERF_FORMAT_NESTED("City-AI-perf.csv", ("CvCity::doCheckProduction_Unit, Turn %03d, %s, %s", GC.getGame().getElapsedGameTurns(), GetPlayer()->getCivilizationShortDescription(), getName().c_str()) );14635		for(iI = 0; iI < iNumUnitInfos; iI++)14636		{14637			const UnitTypes eUnit = static_cast<UnitTypes>(iI);14638			CvUnitEntry* pkUnitInfo = GC.getUnitInfo(eUnit);14639			if(pkUnitInfo)14640			{14641				int iUnitProduction = getUnitProduction(eUnit);14642				if(iUnitProduction > 0)14643				{14644					if(thisPlayer.isProductionMaxedUnitClass((UnitClassTypes)(pkUnitInfo)->GetUnitClassType()))14645					{14646						iProductionGold = ((iUnitProduction * iMaxedUnitGoldPercent) / 100);1464714648						if(iProductionGold > 0)14649						{14650							thisPlayer.GetTreasury()->ChangeGold(iProductionGold);1465114652							if(getOwner() == GC.getGame().getActivePlayer())14653							{14654								Localization::String localizedText = Localization::Lookup("TXT_KEY_MISC_LOST_WONDER_PROD_CONVERTED");14655								localizedText << getNameKey() << GC.getUnitInfo((UnitTypes)iI)->GetTextKey() << iProductionGold;14656								DLLUI->AddCityMessage(0, GetIDInfo(), getOwner(), false, GC.getEVENT_MESSAGE_TIME(), localizedText.toUTF8());14657							}14658						}1465914660						setUnitProduction(((UnitTypes)iI), 0);14661					}14662				}14663			}14664		}14665	}1466614667	int iNumBuildingInfos = GC.getNumBuildingInfos();14668	{14669		AI_PERF_FORMAT_NESTED("City-AI-perf.csv", ("CvCity::doCheckProduction_Building, Turn %03d, %s, %s", GC.getGame().getElapsedGameTurns(), GetPlayer()->getCivilizationShortDescription(), getName().c_str()) );1467014671		int iPlayerLoop;14672		PlayerTypes eLoopPlayer;1467314674		for(iI = 0; iI < iNumBuildingInfos; iI++)14675		{14676			const BuildingTypes eExpiredBuilding = static_cast<BuildingTypes>(iI);14677			CvBuildingEntry* pkExpiredBuildingInfo = GC.getBuildingInfo(eExpiredBuilding);1467814679			//skip if null14680			if(pkExpiredBuildingInfo == NULL)14681				continue;1468214683			int iBuildingProduction = m_pCityBuildings->GetBuildingProduction(eExpiredBuilding);14684			if(iBuildingProduction > 0)14685			{14686				const BuildingClassTypes eExpiredBuildingClass = (BuildingClassTypes)(pkExpiredBuildingInfo->GetBuildingClassType());1468714688				if(thisPlayer.isProductionMaxedBuildingClass(eExpiredBuildingClass))14689				{14690					// Beaten to a world wonder by someone?14691					if(isWorldWonderClass(pkExpiredBuildingInfo->GetBuildingClassInfo()))14692					{14693						for(iPlayerLoop = 0; iPlayerLoop < MAX_MAJOR_CIVS; iPlayerLoop++)14694						{14695							eLoopPlayer = (PlayerTypes) iPlayerLoop;1469614697							// Found the culprit14698							if(GET_PLAYER(eLoopPlayer).getBuildingClassCount(eExpiredBuildingClass) > 0)14699							{14700								GET_PLAYER(getOwner()).GetDiplomacyAI()->ChangeNumWondersBeatenTo(eLoopPlayer, 1);14701								break;14702							}14703						}1470414705						auto_ptr<ICvCity1> pDllCity(new CvDllCity(this));14706						DLLUI->AddDeferredWonderCommand(WONDER_REMOVED, pDllCity.get(), (BuildingTypes) eExpiredBuilding, 0);14707#if !defined(NO_ACHIEVEMENTS)14708						//Add "achievement" for sucking it up14709						gDLL->IncrementSteamStatAndUnlock(ESTEAMSTAT_BEATWONDERS, 10, ACHIEVEMENT_SUCK_AT_WONDERS);14710#endif14711					}1471214713					iProductionGold = ((iBuildingProduction * iMaxedBuildingGoldPercent) / 100);1471414715					if(iProductionGold > 0)14716					{14717						thisPlayer.GetTreasury()->ChangeGold(iProductionGold);1471814719						if(getOwner() == GC.getGame().getActivePlayer())14720						{14721							Localization::String localizedText = Localization::Lookup("TXT_KEY_MISC_LOST_WONDER_PROD_CONVERTED");14722							localizedText << getNameKey() << pkExpiredBuildingInfo->GetTextKey() << iProductionGold;14723							DLLUI->AddCityMessage(0, GetIDInfo(), getOwner(), false, GC.getEVENT_MESSAGE_TIME(), localizedText.toUTF8());14724						}14725					}1472614727					m_pCityBuildings->SetBuildingProduction(eExpiredBuilding, 0);14728				}14729			}14730		}14731	}1473214733	{14734		AI_PERF_FORMAT_NESTED("City-AI-perf.csv", ("CvCity::doCheckProduction_Project, Turn %03d, %s, %s", GC.getGame().getElapsedGameTurns(), GetPlayer()->getCivilizationShortDescription(), getName().c_str()) );14735		int iNumProjectInfos = GC.getNumProjectInfos();14736		for(iI = 0; iI < iNumProjectInfos; iI++)14737		{14738			int iProjectProduction = getProjectProduction((ProjectTypes)iI);14739			if(iProjectProduction > 0)14740			{14741				if(thisPlayer.isProductionMaxedProject((ProjectTypes)iI))14742				{14743					iProductionGold = ((iProjectProduction * iMaxedProjectGoldPercent) / 100);1474414745					if(iProductionGold > 0)14746					{14747						thisPlayer.GetTreasury()->ChangeGold(iProductionGold);1474814749						if(getOwner() == GC.getGame().getActivePlayer())14750						{14751							Localization::String localizedText = Localization::Lookup("TXT_KEY_MISC_LOST_WONDER_PROD_CONVERTED");14752							localizedText << getNameKey() << GC.getProjectInfo((ProjectTypes)iI)->GetTextKey() << iProductionGold;14753							DLLUI->AddCityMessage(0, GetIDInfo(), getOwner(), false, GC.getEVENT_MESSAGE_TIME(), localizedText.toUTF8());14754						}14755					}1475614757					setProjectProduction(((ProjectTypes)iI), 0);14758				}14759			}14760		}14761	}1476214763	if(!isProduction() && isHuman() && !isProductionAutomated() && !IsIgnoreCityForHappiness())14764	{14765		chooseProduction();14766		return bOK;14767	}1476814769	{14770		AI_PERF_FORMAT_NESTED("City-AI-perf.csv", ("CvCity::doCheckProduction_UpgradeUnit, Turn %03d, %s, %s", GC.getGame().getElapsedGameTurns(), GetPlayer()->getCivilizationShortDescription(), getName().c_str()) );14771		// Can now construct an Upgraded version of this Unit14772		for(iI = 0; iI < iNumUnitInfos; iI++)14773		{14774			if(getFirstUnitOrder((UnitTypes)iI) != -1)14775			{14776				// If we can still actually train this Unit type then don't auto-upgrade it yet14777				if(canTrain((UnitTypes)iI, true))14778				{14779					continue;14780				}1478114782				eUpgradeUnit = allUpgradesAvailable((UnitTypes)iI);1478314784				if(eUpgradeUnit != NO_UNIT)14785				{14786					CvAssertMsg(eUpgradeUnit != iI, "Trying to upgrade a Unit to itself");14787					iUpgradeProduction = getUnitProduction((UnitTypes)iI);14788					setUnitProduction(((UnitTypes)iI), 0);14789					setUnitProduction(eUpgradeUnit, iUpgradeProduction);1479014791					pOrderNode = headOrderQueueNode();1479214793					while(pOrderNode != NULL)14794					{14795						if(pOrderNode->eOrderType == ORDER_TRAIN)14796						{14797							if(pOrderNode->iData1 == iI)14798							{14799								thisPlayer.changeUnitClassMaking(((UnitClassTypes)(GC.getUnitInfo((UnitTypes)(pOrderNode->iData1))->GetUnitClassType())), -1);14800								pOrderNode->iData1 = eUpgradeUnit;14801								thisPlayer.changeUnitClassMaking(((UnitClassTypes)(GC.getUnitInfo((UnitTypes)(pOrderNode->iData1))->GetUnitClassType())), 1);14802							}14803						}1480414805						pOrderNode = nextOrderQueueNode(pOrderNode);14806					}14807				}14808			}14809		}14810	}1481114812	{14813		AI_PERF_FORMAT_NESTED("City-AI-perf.csv", ("CvCity::doCheckProduction_UpgradeBuilding, Turn %03d, %s, %s", GC.getGame().getElapsedGameTurns(), GetPlayer()->getCivilizationShortDescription(), getName().c_str()) );14814		// Can now construct an Upgraded version of this Building14815		for(iI = 0; iI < iNumBuildingInfos; iI++)14816		{14817			const BuildingTypes eBuilding = static_cast<BuildingTypes>(iI);14818			CvBuildingEntry* pkBuildingInfo = GC.getBuildingInfo(eBuilding);14819			if(pkBuildingInfo)14820			{14821				if(getFirstBuildingOrder(eBuilding) != -1)14822				{14823					BuildingClassTypes eBuildingClass = (BuildingClassTypes) pkBuildingInfo->GetReplacementBuildingClass();1482414825					if(eBuildingClass != NO_BUILDINGCLASS)14826					{14827						BuildingTypes eUpgradeBuilding = ((BuildingTypes)(thisPlayer.getCivilizationInfo().getCivilizationBuildings(eBuildingClass)));1482814829						if(canConstruct(eUpgradeBuilding))14830						{14831							CvAssertMsg(eUpgradeBuilding != iI, "Trying to upgrade a Building to itself");14832							iUpgradeProduction = m_pCityBuildings->GetBuildingProduction(eBuilding);14833							m_pCityBuildings->SetBuildingProduction((eBuilding), 0);14834							m_pCityBuildings->SetBuildingProduction(eUpgradeBuilding, iUpgradeProduction);1483514836							pOrderNode = headOrderQueueNode();1483714838							while(pOrderNode != NULL)14839							{14840								if(pOrderNode->eOrderType == ORDER_CONSTRUCT)14841								{14842									if(pOrderNode->iData1 == iI)14843									{14844										CvBuildingEntry* pkOrderBuildingInfo = GC.getBuildingInfo((BuildingTypes)pOrderNode->iData1);14845										CvBuildingEntry* pkUpgradeBuildingInfo = GC.getBuildingInfo(eUpgradeBuilding);1484614847										if(NULL != pkOrderBuildingInfo && NULL != pkUpgradeBuildingInfo)14848										{14849											const BuildingClassTypes eOrderBuildingClass = (BuildingClassTypes)pkOrderBuildingInfo->GetBuildingClassType();14850											const BuildingClassTypes eUpgradeBuildingClass = (BuildingClassTypes)pkUpgradeBuildingInfo->GetBuildingClassType();1485114852											thisPlayer.changeBuildingClassMaking(eOrderBuildingClass, -1);14853											pOrderNode->iData1 = eUpgradeBuilding;14854											thisPlayer.changeBuildingClassMaking(eUpgradeBuildingClass, 1);1485514856										}14857									}14858								}1485914860								pOrderNode = nextOrderQueueNode(pOrderNode);14861							}14862						}14863					}14864				}14865			}14866		}14867	}1486814869	{14870		AI_PERF_FORMAT_NESTED("City-AI-perf.csv", ("CvCity::doCheckProduction_CleanupQueue, Turn %03d, %s, %s", GC.getGame().getElapsedGameTurns(), GetPlayer()->getCivilizationShortDescription(), getName().c_str()) );14871		bOK = CleanUpQueue();14872	}1487314874	return bOK;14875}

Calls

Called by