Hooks
static bool BeforeCvCity_reset(CvCity* self, int iID, PlayerTypes eOwner, int iX, int iY, bool bConstructorCall);static void AfterCvCity_reset(CvCity* self, int iID, PlayerTypes eOwner, int iX, int iY, bool bConstructorCall);static void ReplaceCvCity_reset(void (*original)(CvCity*, int, PlayerTypes, int, int, bool), CvCity* self, int iID, PlayerTypes eOwner, int iX, int iY, bool bConstructorCall);CivRegisterBefore<CivHooks::CvCity_reset>(host, &BeforeCvCity_reset);CivRegisterAfter<CivHooks::CvCity_reset>(host, &AfterCvCity_reset);CivRegisterReplace<CivHooks::CvCity_reset>(host, &ReplaceCvCity_reset);
Code
836// FUNCTION: reset()837// Initializes data members that are serialized.838void CvCity::reset(int iID, PlayerTypes eOwner, int iX, int iY, bool bConstructorCall)839{840 VALIDATE_OBJECT841 m_syncArchive.reset();842843 int iI;844845 //--------------------------------846 // Uninit class847 uninit();848849 m_iID = iID;850 m_iX = iX;851 m_iY = iY;852 m_iRallyX = INVALID_PLOT_COORD;853 m_iRallyY = INVALID_PLOT_COORD;854 m_iGameTurnFounded = 0;855 m_iGameTurnAcquired = 0;856 m_iPopulation = 0;857#if defined(MOD_GLOBAL_CITY_AUTOMATON_WORKERS)858 m_iAutomatons = 0;859#endif860 m_iHighestPopulation = 0;861 m_iExtraHitPoints = 0;862 m_iNumGreatPeople = 0;863 m_iBaseGreatPeopleRate = 0;864 m_iGreatPeopleRateModifier = 0;865 m_iJONSCultureStored = 0;866 m_iJONSCultureLevel = 0;867 m_iJONSCulturePerTurnFromBuildings = 0;868 m_iJONSCulturePerTurnFromPolicies = 0;869 m_iJONSCulturePerTurnFromSpecialists = 0;870 m_iJONSCulturePerTurnFromReligion = 0;871 m_iFaithPerTurnFromBuildings = 0;872 m_iFaithPerTurnFromPolicies = 0;873 m_iFaithPerTurnFromReligion = 0;874 m_iCultureRateModifier = 0;875 m_iNumWorldWonders = 0;876 m_iNumTeamWonders = 0;877 m_iNumNationalWonders = 0;878 m_iWonderProductionModifier = 0;879 m_iCapturePlunderModifier = 0;880 m_iPlotCultureCostModifier = 0;881 m_iPlotBuyCostModifier = 0;882#if defined(MOD_BUILDINGS_CITY_WORKING)883 m_iCityWorkingChange = 0;884#endif885#if defined(MOD_BUILDINGS_CITY_AUTOMATON_WORKERS)886 m_iCityAutomatonWorkersChange = 0;887#endif888 m_iMaintenance = 0;889 m_iHealRate = 0;890 m_iEspionageModifier = 0;891#if defined(MOD_RELIGION_CONVERSION_MODIFIERS)892 m_iConversionModifier = 0;893#endif894 m_iNoOccupiedUnhappinessCount = 0;895 m_iFood = 0;896 m_iFoodKept = 0;897 m_iMaxFoodKeptPercent = 0;898 m_iOverflowProduction = 0;899 m_iFeatureProduction = 0;900 m_iMilitaryProductionModifier = 0;901 m_iSpaceProductionModifier = 0;902 m_iFreeExperience = 0;903 m_iCurrAirlift = 0; // unused904 m_iMaxAirUnits = GC.getBASE_CITY_AIR_STACKING();905 m_iAirModifier = 0; // unused906 m_iNukeModifier = 0;907 m_iTradeRouteRecipientBonus = 0;908 m_iTradeRouteTargetBonus = 0;909 m_iCultureUpdateTimer = 0;910 m_iCitySizeBoost = 0;911 m_iSpecialistFreeExperience = 0;912 m_iStrengthValue = 0;913 m_iDamage = 0;914 m_iThreatValue = 0;915 m_iGarrisonedUnit = -1; // unused916 m_iResourceDemanded = -1;917 m_iWeLoveTheKingDayCounter = 0;918 m_iLastTurnGarrisonAssigned = -1;919 m_iThingsProduced = 0;920 m_iDemandResourceCounter = 0;921 m_iResistanceTurns = 0;922 m_iRazingTurns = 0;923 m_iCountExtraLuxuries = 0;924 m_iCheapestPlotInfluence = 0;925 m_unitBeingBuiltForOperation.Invalidate();926927 m_bNeverLost = true;928 m_bDrafted = false;929 m_bAirliftTargeted = false; // unused930 m_bProductionAutomated = false;931 m_bLayoutDirty = false;932 m_bMadeAttack = false;933 m_bOccupied = false;934 m_bPuppet = false;935 m_bIgnoreCityForHappiness = false;936 m_bEverCapital = false;937 m_bIndustrialRouteToCapital = false;938 m_bFeatureSurrounded = false;939 m_bOwedCultureBuilding = false;940#if defined(MOD_BUGFIX_FREE_FOOD_BUILDING)941 m_bOwedFoodBuilding = false;942#endif943944 m_eOwner = eOwner;945 m_ePreviousOwner = NO_PLAYER;946 m_eOriginalOwner = eOwner;947 m_ePlayersReligion = NO_PLAYER;948949950 m_aiSeaPlotYield.resize(NUM_YIELD_TYPES);951 m_aiRiverPlotYield.resize(NUM_YIELD_TYPES);952 m_aiSeaResourceYield.resize(NUM_YIELD_TYPES);953 m_aiLakePlotYield.resize(NUM_YIELD_TYPES);954 m_aiBaseYieldRateFromTerrain.resize(NUM_YIELD_TYPES);955 m_aiBaseYieldRateFromBuildings.resize(NUM_YIELD_TYPES);956 m_aiBaseYieldRateFromSpecialists.resize(NUM_YIELD_TYPES);957 m_aiBaseYieldRateFromMisc.resize(NUM_YIELD_TYPES);958 m_aiBaseYieldRateFromReligion.resize(NUM_YIELD_TYPES);959 m_aiYieldPerPop.resize(NUM_YIELD_TYPES);960 m_aiYieldPerReligion.resize(NUM_YIELD_TYPES);961 m_aiYieldRateModifier.resize(NUM_YIELD_TYPES);962 m_aiPowerYieldRateModifier.resize(NUM_YIELD_TYPES);963 m_aiResourceYieldRateModifier.resize(NUM_YIELD_TYPES);964 m_aiExtraSpecialistYield.resize(NUM_YIELD_TYPES);965 m_aiProductionToYieldModifier.resize(NUM_YIELD_TYPES);966 for(iI = 0; iI < NUM_YIELD_TYPES; iI++)967 {968 m_aiSeaPlotYield.setAt(iI, 0);969 m_aiRiverPlotYield.setAt(iI, 0);970 m_aiLakePlotYield.setAt(iI, 0);971 m_aiSeaResourceYield.setAt(iI, 0);972 m_aiBaseYieldRateFromTerrain.setAt(iI, 0);973 m_aiBaseYieldRateFromBuildings.setAt(iI, 0);974 m_aiBaseYieldRateFromSpecialists.setAt(iI, 0);975 m_aiBaseYieldRateFromMisc.setAt(iI, 0);976 m_aiBaseYieldRateFromReligion[iI] = 0;977 m_aiYieldPerPop.setAt(iI, 0);978 m_aiYieldPerReligion[iI] = 0;979 m_aiYieldRateModifier.setAt(iI, 0);980 m_aiPowerYieldRateModifier.setAt(iI, 0);981 m_aiResourceYieldRateModifier.setAt(iI, 0);982 m_aiExtraSpecialistYield.setAt(iI, 0);983 m_aiProductionToYieldModifier.setAt(iI, 0);984 }985986 m_aiDomainFreeExperience.resize(NUM_DOMAIN_TYPES);987 m_aiDomainProductionModifier.resize(NUM_DOMAIN_TYPES);988 for(iI = 0; iI < NUM_DOMAIN_TYPES; iI++)989 {990 m_aiDomainFreeExperience.setAt(iI, 0);991 m_aiDomainProductionModifier.setAt(iI, 0);992 }993994 m_abEverOwned.resize(REALLY_MAX_PLAYERS);995 for(iI = 0; iI < REALLY_MAX_PLAYERS; iI++)996 {997 m_abEverOwned.setAt(iI, false);998 }9991000 m_abRevealed.resize(REALLY_MAX_TEAMS);1001 for(iI = 0; iI < REALLY_MAX_TEAMS; iI++)1002 {1003 m_abRevealed.setAt(iI, false);1004 }10051006 m_strName = "";1007 m_strNameIAmNotSupposedToBeUsedAnyMoreBecauseThisShouldNotBeCheckedAndWeNeedToPreserveSaveGameCompatibility = "";1008 m_strScriptData = "";10091010 m_bPopulationRankValid = false;1011 m_iPopulationRank = -1;10121013 m_abBaseYieldRankValid.resize(NUM_YIELD_TYPES);1014 m_abYieldRankValid.resize(NUM_YIELD_TYPES);1015 m_aiBaseYieldRank.resize(NUM_YIELD_TYPES);1016 m_aiYieldRank.resize(NUM_YIELD_TYPES);1017 for(iI = 0; iI < NUM_YIELD_TYPES; iI++)1018 {1019 m_abBaseYieldRankValid.setAt(iI, false);1020 m_abYieldRankValid.setAt(iI, false);1021 m_aiBaseYieldRank.setAt(iI, -1);1022 m_aiYieldRank.setAt(iI, -1);1023 }10241025 if(!bConstructorCall)1026 {1027 int iNumResources = GC.getNumResourceInfos();1028 CvAssertMsg((0 < iNumResources), "GC.getNumResourceInfos() is not greater than zero but an array is being allocated in CvCity::reset");1029 m_paiNoResource.clear();1030 m_paiNoResource.resize(iNumResources);1031 m_paiFreeResource.clear();1032 m_paiFreeResource.resize(iNumResources);1033 m_paiNumResourcesLocal.clear();1034 m_paiNumResourcesLocal.resize(iNumResources);1035 for(iI = 0; iI < iNumResources; iI++)1036 {1037 m_paiNoResource.setAt(iI, 0);1038 m_paiFreeResource.setAt(iI, 0);1039 m_paiNumResourcesLocal.setAt(iI, 0);1040 }10411042 int iNumProjectInfos = GC.getNumProjectInfos();1043 m_paiProjectProduction.clear();1044 m_paiProjectProduction.resize(iNumProjectInfos);1045 for(iI = 0; iI < iNumProjectInfos; iI++)1046 {1047 m_paiProjectProduction.setAt(iI, 0);1048 }10491050 int iNumSpecialistInfos = GC.getNumSpecialistInfos();1051 m_paiSpecialistProduction.clear();1052 m_paiSpecialistProduction.resize(iNumSpecialistInfos);1053 for(iI = 0; iI < GC.getNumSpecialistInfos(); iI++)1054 {1055 m_paiSpecialistProduction.setAt(iI, 0);1056 }10571058 m_pCityBuildings->Init(GC.GetGameBuildings(), this);10591060 int iNumUnitInfos = GC.getNumUnitInfos();1061 CvAssertMsg((0 < iNumUnitInfos), "GC.getNumUnitInfos() is not greater than zero but an array is being allocated in CvCity::reset");1062 m_paiUnitProduction.clear();1063 m_paiUnitProduction.resize(iNumUnitInfos);1064 m_paiUnitProductionTime.clear();1065 m_paiUnitProductionTime.resize(iNumUnitInfos);1066 for(iI = 0; iI < iNumUnitInfos; iI++)1067 {1068 m_paiUnitProduction.setAt(iI, 0);1069 m_paiUnitProductionTime.setAt(iI, 0);1070 }10711072 CvAssertMsg((0 < iNumSpecialistInfos), "GC.getNumSpecialistInfos() is not greater than zero but an array is being allocated in CvCity::reset");1073 m_paiSpecialistCount.clear();1074 m_paiSpecialistCount.resize(iNumSpecialistInfos);1075 m_paiMaxSpecialistCount.clear();1076 m_paiMaxSpecialistCount.resize(iNumSpecialistInfos);1077 m_paiForceSpecialistCount.clear();1078 m_paiForceSpecialistCount.resize(iNumSpecialistInfos);1079 m_paiFreeSpecialistCount.clear();1080 m_paiFreeSpecialistCount.resize(iNumSpecialistInfos);10811082 for(iI = 0; iI < iNumSpecialistInfos; iI++)1083 {1084 m_paiSpecialistCount.setAt(iI, 0);1085 m_paiMaxSpecialistCount.setAt(iI, 0);1086 m_paiForceSpecialistCount.setAt(iI, 0);1087 m_paiFreeSpecialistCount.setAt(iI, 0);1088 }10891090 int iNumImprovementInfos = GC.getNumImprovementInfos();1091 CvAssertMsg((0 < iNumImprovementInfos), "GC.getNumImprovementInfos() is not greater than zero but an array is being allocated in CvCity::reset");1092 m_paiImprovementFreeSpecialists.clear();1093 m_paiImprovementFreeSpecialists.resize(iNumImprovementInfos);1094 for(iI = 0; iI < iNumImprovementInfos; iI++)1095 {1096 m_paiImprovementFreeSpecialists.setAt(iI, 0);1097 }10981099 int iNumUnitCombatClassInfos = GC.getNumUnitCombatClassInfos();1100 CvAssertMsg((0 < iNumUnitCombatClassInfos), "GC.getNumUnitCombatClassInfos() is not greater than zero but an array is being allocated in CvCity::reset");1101 m_paiUnitCombatFreeExperience.clear();1102 m_paiUnitCombatFreeExperience.resize(iNumUnitCombatClassInfos);1103 m_paiUnitCombatProductionModifier.clear();1104 m_paiUnitCombatProductionModifier.resize(iNumUnitCombatClassInfos);1105 for(iI = 0; iI < iNumUnitCombatClassInfos; iI++)1106 {1107 m_paiUnitCombatFreeExperience.setAt(iI, 0);1108 m_paiUnitCombatProductionModifier.setAt(iI, 0);1109 }11101111 int iNumPromotionInfos = GC.getNumPromotionInfos();1112 CvAssertMsg((0 < iNumPromotionInfos), "GC.getNumPromotionInfos() is not greater than zero but an array is being allocated in CvCity::reset");1113 m_paiFreePromotionCount.clear();1114 m_paiFreePromotionCount.resize(iNumPromotionInfos);1115 for(iI = 0; iI < iNumPromotionInfos; iI++)1116 {1117 m_paiFreePromotionCount.setAt(iI, 0);1118 }11191120 int iJ;11211122 int iNumBuildingInfos = GC.getNumBuildingInfos();1123 int iMAX_SPECIALISTS_FROM_BUILDING = GC.getMAX_SPECIALISTS_FROM_BUILDING();1124 CvAssertMsg(m_aaiBuildingSpecialistUpgradeProgresses==NULL, "about to leak memory, CvCity::m_aaiBuildingSpecialistUpgradeProgresses");1125 m_aaiBuildingSpecialistUpgradeProgresses = FNEW(int*[iNumBuildingInfos], c_eCiv5GameplayDLL, 0);1126 for(iI = 0; iI < iNumBuildingInfos; iI++)1127 {1128 m_aaiBuildingSpecialistUpgradeProgresses[iI] = FNEW(int[iMAX_SPECIALISTS_FROM_BUILDING], c_eCiv5GameplayDLL, 0);1129 for(iJ = 0; iJ < iMAX_SPECIALISTS_FROM_BUILDING; iJ++)1130 {1131 m_aaiBuildingSpecialistUpgradeProgresses[iI][iJ] = -1;1132 }1133 }11341135 int iNumResourceInfos = GC.getNumResourceInfos();1136 CvAssertMsg(m_ppaiResourceYieldChange==NULL, "about to leak memory, CvCity::m_ppaiResourceYieldChange");1137 m_ppaiResourceYieldChange = FNEW(int*[iNumResourceInfos], c_eCiv5GameplayDLL, 0);1138 for(iI = 0; iI < iNumResourceInfos; iI++)1139 {1140 m_ppaiResourceYieldChange[iI] = FNEW(int[NUM_YIELD_TYPES], c_eCiv5GameplayDLL, 0);1141 for(iJ = 0; iJ < NUM_YIELD_TYPES; iJ++)1142 {1143 m_ppaiResourceYieldChange[iI][iJ] = 0;1144 }1145 }11461147 int iNumFeatureInfos = GC.getNumFeatureInfos();1148 CvAssertMsg(m_ppaiFeatureYieldChange==NULL, "about to leak memory, CvCity::m_ppaiFeatureYieldChange");1149 m_ppaiFeatureYieldChange = FNEW(int*[iNumFeatureInfos], c_eCiv5GameplayDLL, 0);1150 for(iI = 0; iI < iNumFeatureInfos; iI++)1151 {1152 m_ppaiFeatureYieldChange[iI] = FNEW(int[NUM_YIELD_TYPES], c_eCiv5GameplayDLL, 0);1153 for(iJ = 0; iJ < NUM_YIELD_TYPES; iJ++)1154 {1155 m_ppaiFeatureYieldChange[iI][iJ] = 0;1156 }1157 }11581159 int iNumTerrainInfos = GC.getNumTerrainInfos();1160 CvAssertMsg(m_ppaiTerrainYieldChange==NULL, "about to leak memory, CvCity::m_ppaiTerrainYieldChange");1161 m_ppaiTerrainYieldChange = FNEW(int*[iNumTerrainInfos], c_eCiv5GameplayDLL, 0);1162 for(iI = 0; iI < iNumTerrainInfos; iI++)1163 {1164 m_ppaiTerrainYieldChange[iI] = FNEW(int[NUM_YIELD_TYPES], c_eCiv5GameplayDLL, 0);1165 for(iJ = 0; iJ < NUM_YIELD_TYPES; iJ++)1166 {1167 m_ppaiTerrainYieldChange[iI][iJ] = 0;1168 }1169 }11701171#if defined(MOD_API_UNIFIED_YIELDS) && defined(MOD_API_PLOT_YIELDS)1172 int iNumPlotInfos = GC.getNumPlotInfos();1173 CvAssertMsg(m_ppaiPlotYieldChange==NULL, "about to leak memory, CvCity::m_ppaiPlotYieldChange");1174 m_ppaiPlotYieldChange = FNEW(int*[iNumPlotInfos], c_eCiv5GameplayDLL, 0);1175 for(iI = 0; iI < iNumPlotInfos; iI++)1176 {1177 m_ppaiPlotYieldChange[iI] = FNEW(int[NUM_YIELD_TYPES], c_eCiv5GameplayDLL, 0);1178 for(iJ = 0; iJ < NUM_YIELD_TYPES; iJ++)1179 {1180 m_ppaiPlotYieldChange[iI][iJ] = 0;1181 }1182 }1183#endif1184 }11851186 if(!bConstructorCall)1187 {1188 // Set up AI and hook it up to the flavor manager1189 m_pCityStrategyAI->Init(GC.GetGameAICityStrategies(), this, true);1190 if(m_eOwner != NO_PLAYER)1191 {1192 GET_PLAYER(getOwner()).GetFlavorManager()->AddFlavorRecipient(m_pCityStrategyAI);1193 m_pCityStrategyAI->SetDefaultSpecialization(GET_PLAYER(getOwner()).GetCitySpecializationAI()->GetNextSpecializationDesired());1194 }11951196 m_pCityCitizens->Init(this);1197 m_pCityReligions->Init(this);1198 m_pEmphases->Init(GC.GetGameEmphases(), this);1199 m_pCityEspionage->Init(this);1200 m_pCityCulture->Init(this);12011202 AI_reset();12031204#if defined(MOD_GLOBAL_CITY_AUTOMATON_WORKERS)1205 if (m_eOwner != NO_PLAYER) {1206 setAutomatons(GET_TEAM(GET_PLAYER(getOwner()).getTeam()).GetCityAutomatonWorkersChange());1207 setAutomatons(GET_PLAYER(getOwner()).GetCityAutomatonWorkersChange());1208 }1209#endif1210 }1211}