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}