Code
1935/// Store off data on bonuses from traits1936void CvPlayerTraits::InitPlayerTraits()1937{1938 for(int iI = 0; iI < GC.getNumTraitInfos(); iI++)1939 {1940 if(HasTrait((TraitTypes)iI))1941 {1942 CvTraitEntry* trait = GC.getTraitInfo((TraitTypes)iI);1943 m_iGreatPeopleRateModifier += trait->GetGreatPeopleRateModifier();1944 m_iGreatScientistRateModifier += trait->GetGreatScientistRateModifier();1945 m_iGreatGeneralRateModifier += trait->GetGreatGeneralRateModifier();1946 m_iGreatGeneralExtraBonus += trait->GetGreatGeneralExtraBonus();1947 m_iGreatPersonGiftInfluence += trait->GetGreatPersonGiftInfluence();1948 m_iLevelExperienceModifier += trait->GetLevelExperienceModifier();1949 m_iMaxGlobalBuildingProductionModifier += trait->GetMaxGlobalBuildingProductionModifier();1950 m_iMaxTeamBuildingProductionModifier += trait->GetMaxTeamBuildingProductionModifier();1951 m_iMaxPlayerBuildingProductionModifier += trait->GetMaxPlayerBuildingProductionModifier();1952 m_iCityUnhappinessModifier += trait->GetCityUnhappinessModifier();1953 m_iPopulationUnhappinessModifier += trait->GetPopulationUnhappinessModifier();1954 m_iCityStateBonusModifier += trait->GetCityStateBonusModifier();1955 m_iCityStateFriendshipModifier += trait->GetCityStateFriendshipModifier();1956 m_iCityStateCombatModifier += trait->GetCityStateCombatModifier();1957 m_iLandBarbarianConversionPercent += trait->GetLandBarbarianConversionPercent();1958 m_iLandBarbarianConversionExtraUnits += trait->GetLandBarbarianConversionExtraUnits();1959 m_iSeaBarbarianConversionPercent += trait->GetSeaBarbarianConversionPercent();1960 m_iCapitalBuildingModifier += trait->GetCapitalBuildingModifier();1961 m_iPlotBuyCostModifier += trait->GetPlotBuyCostModifier();1962#if defined(MOD_TRAITS_CITY_WORKING)1963 m_iCityWorkingChange += trait->GetCityWorkingChange();1964#endif1965#if defined(MOD_TRAITS_CITY_AUTOMATON_WORKERS)1966 m_iCityAutomatonWorkersChange += trait->GetCityAutomatonWorkersChange();1967#endif1968 m_iPlotCultureCostModifier += trait->GetPlotCultureCostModifier();1969 m_iCultureFromKills += trait->GetCultureFromKills();1970 m_iFaithFromKills += trait->GetFaithFromKills();1971 m_iCityCultureBonus += trait->GetCityCultureBonus();1972 m_iCapitalThemingBonusModifier += trait->GetCapitalThemingBonusModifier();1973 m_iPolicyCostModifier += trait->GetPolicyCostModifier();1974 m_iCityConnectionTradeRouteChange += trait->GetCityConnectionTradeRouteChange();1975 m_iWonderProductionModifier += trait->GetWonderProductionModifier();1976 m_iPlunderModifier += trait->GetPlunderModifier();1977 m_iImprovementMaintenanceModifier += trait->GetImprovementMaintenanceModifier();1978 m_iGoldenAgeDurationModifier += trait->GetGoldenAgeDurationModifier();1979 m_iGoldenAgeMoveChange += trait->GetGoldenAgeMoveChange();1980 m_iGoldenAgeCombatModifier += trait->GetGoldenAgeCombatModifier();1981 m_iGoldenAgeTourismModifier += trait->GetGoldenAgeTourismModifier();1982 m_iGoldenAgeGreatArtistRateModifier += trait->GetGoldenAgeGreatArtistRateModifier();1983 m_iGoldenAgeGreatMusicianRateModifier += trait->GetGoldenAgeGreatMusicianRateModifier();1984 m_iGoldenAgeGreatWriterRateModifier += trait->GetGoldenAgeGreatWriterRateModifier();1985 m_iExtraEmbarkMoves += trait->GetExtraEmbarkMoves();1986 m_iNaturalWonderFirstFinderGold += trait->GetNaturalWonderFirstFinderGold();1987 m_iNaturalWonderSubsequentFinderGold += trait->GetNaturalWonderSubsequentFinderGold();1988 m_iNaturalWonderYieldModifier += trait->GetNaturalWonderYieldModifier();1989 m_iNaturalWonderHappinessModifier += trait->GetNaturalWonderHappinessModifier();1990 m_iNearbyImprovementCombatBonus += trait->GetNearbyImprovementCombatBonus();1991 m_iNearbyImprovementBonusRange += trait->GetNearbyImprovementBonusRange();1992 m_iCultureBuildingYieldChange += trait->GetCultureBuildingYieldChange();1993 m_iCombatBonusVsHigherTech += trait->GetCombatBonusVsHigherTech();1994 m_iCombatBonusVsLargerCiv += trait->GetCombatBonusVsLargerCiv();1995 m_iLandUnitMaintenanceModifier += trait->GetLandUnitMaintenanceModifier();1996 m_iNavalUnitMaintenanceModifier += trait->GetNavalUnitMaintenanceModifier();1997 m_iRazeSpeedModifier += trait->GetRazeSpeedModifier();1998 m_iDOFGreatPersonModifier += trait->GetDOFGreatPersonModifier();1999 m_iLuxuryHappinessRetention += trait->GetLuxuryHappinessRetention();2000#if defined(MOD_TRAITS_EXTRA_SUPPLY)2001 m_iExtraSupply += trait->GetExtraSupply();2002 m_iExtraSupplyPerCity += trait->GetExtraSupplyPerCity();2003 m_iExtraSupplyPerPopulation += trait->GetExtraSupplyPerPopulation();2004#endif2005 m_iExtraSpies += trait->GetExtraSpies();2006 m_iUnresearchedTechBonusFromKills += trait->GetUnresearchedTechBonusFromKills();2007 m_iExtraFoundedCityTerritoryClaimRange += trait->GetExtraFoundedCityTerritoryClaimRange();2008 m_iFreeSocialPoliciesPerEra += trait->GetFreeSocialPoliciesPerEra();2009 m_iNumTradeRoutesModifier += trait->GetNumTradeRoutesModifier();2010 m_iTradeRouteResourceModifier += trait->GetTradeRouteResourceModifier();2011 m_iUniqueLuxuryCities += trait->GetUniqueLuxuryCities();2012 m_iUniqueLuxuryQuantity += trait->GetUniqueLuxuryQuantity();2013 m_iWorkerSpeedModifier += trait->GetWorkerSpeedModifier();2014 m_iAfraidMinorPerTurnInfluence += trait->GetAfraidMinorPerTurnInfluence();2015 m_iLandTradeRouteRangeBonus += trait->GetLandTradeRouteRangeBonus();2016#if defined(MOD_TRAITS_TRADE_ROUTE_BONUSES)2017 m_iSeaTradeRouteRangeBonus += trait->GetSeaTradeRouteRangeBonus();2018#endif2019 m_iTradeReligionModifier += trait->GetTradeReligionModifier();2020 m_iTradeBuildingModifier += trait->GetTradeBuildingModifier();20212022 if(trait->IsFightWellDamaged())2023 {2024 m_bFightWellDamaged = true;2025 // JON: Changing the way this works. Above line can/should probably be removed at some point2026 int iWoundedUnitDamageMod = /*-50*/ GC.getTRAIT_WOUNDED_DAMAGE_MOD();2027 m_pPlayer->ChangeWoundedUnitDamageMod(iWoundedUnitDamageMod);2028 }2029 if(trait->IsMoveFriendlyWoodsAsRoad())2030 {2031 m_bMoveFriendlyWoodsAsRoad = true;2032 }2033 if(trait->IsFasterAlongRiver())2034 {2035 m_bFasterAlongRiver = true;2036 }2037 if(trait->IsFasterInHills())2038 {2039 m_bFasterInHills = true;2040 }2041 if(trait->IsEmbarkedAllWater())2042 {2043 m_bEmbarkedAllWater = true;2044 }2045 if(trait->IsEmbarkedToLandFlatCost())2046 {2047 m_bEmbarkedToLandFlatCost = true;2048 }2049 if(trait->IsNoHillsImprovementMaintenance())2050 {2051 m_bNoHillsImprovementMaintenance = true;2052 }2053 if(trait->IsTechBoostFromCapitalScienceBuildings())2054 {2055 m_bTechBoostFromCapitalScienceBuildings = true;2056 }2057 if(trait->IsStaysAliveZeroCities())2058 {2059 m_bStaysAliveZeroCities = true;2060 }2061 if(trait->IsFaithFromUnimprovedForest())2062 {2063 m_bFaithFromUnimprovedForest = true;2064 }2065#if defined(MOD_TRAITS_ANY_BELIEF)2066 if(trait->IsAnyBelief())2067 {2068 m_bAnyBelief = true;2069 }2070#endif2071 if(trait->IsBonusReligiousBelief())2072 {2073 m_bBonusReligiousBelief = true;2074 }2075 if(trait->IsAbleToAnnexCityStates())2076 {2077 m_bAbleToAnnexCityStates = true;2078 }2079 if(trait->IsCrossesMountainsAfterGreatGeneral())2080 {2081 m_bCrossesMountainsAfterGreatGeneral = true;2082 }2083#if defined(MOD_TRAITS_CROSSES_ICE)2084 if(trait->IsCrossesIce())2085 {2086 m_bCrossesIce = true;2087 }2088#endif2089#if defined(MOD_TRAITS_GG_FROM_BARBARIANS)2090 if(trait->IsGGFromBarbarians())2091 {2092 m_bGGFromBarbarians = true;2093 }2094#endif2095 if(trait->IsMayaCalendarBonuses())2096 {2097 m_bMayaCalendarBonuses = true;2098 }2099 if (trait->IsNoAnnexing())2100 {2101 m_bNoAnnexing = true;2102 }2103 if (trait->IsTechFromCityConquer())2104 {2105 m_bTechFromCityConquer = true;2106 }2107 if (trait->IsUniqueLuxuryRequiresNewArea())2108 {2109 m_bUniqueLuxuryRequiresNewArea = true;2110 }2111 if (trait->IsRiverTradeRoad())2112 {2113 m_bRiverTradeRoad = true;2114 }2115 if (trait->IsAngerFreeIntrusionOfCityStates())2116 {2117 m_bAngerFreeIntrusionOfCityStates = true;2118 }21192120 for(int iYield = 0; iYield < NUM_YIELD_TYPES; iYield++)2121 {2122 if(trait->GetExtraYieldThreshold(iYield) > m_iExtraYieldThreshold[iYield])2123 {2124 m_iExtraYieldThreshold[iYield] = trait->GetExtraYieldThreshold(iYield);2125 }2126 m_iFreeCityYield[iYield] = trait->GetYieldChange(iYield);2127 m_iYieldChangeStrategicResources[iYield] = trait->GetYieldChangeStrategicResources(iYield);2128 m_iYieldChangeNaturalWonder[iYield] = trait->GetYieldChangeNaturalWonder(iYield);2129 m_iYieldChangePerTradePartner[iYield] = trait->GetYieldChangePerTradePartner(iYield);2130 m_iYieldChangeIncomingTradeRoute[iYield] = trait->GetYieldChangeIncomingTradeRoute(iYield);2131 m_iYieldRateModifier[iYield] = trait->GetYieldModifier(iYield);21322133 for(int iFeatureLoop = 0; iFeatureLoop < GC.getNumFeatureInfos(); iFeatureLoop++)2134 {2135 int iChange = trait->GetUnimprovedFeatureYieldChanges((FeatureTypes)iFeatureLoop, (YieldTypes)iYield);2136 if(iChange > 0)2137 {2138 Firaxis::Array<int, NUM_YIELD_TYPES> yields = m_ppaaiUnimprovedFeatureYieldChange[iFeatureLoop];2139 yields[iYield] = (m_ppaaiUnimprovedFeatureYieldChange[iFeatureLoop][iYield] + iChange);2140 m_ppaaiUnimprovedFeatureYieldChange[iFeatureLoop] = yields;2141 }21422143#if defined(MOD_API_UNIFIED_YIELDS)2144 iChange = trait->GetCityYieldFromUnimprovedFeature((FeatureTypes)iFeatureLoop, (YieldTypes)iYield);2145 if(iChange > 0)2146 {2147 Firaxis::Array<int, NUM_YIELD_TYPES> yields = m_ppiCityYieldFromUnimprovedFeature[iFeatureLoop];2148 yields[iYield] = (m_ppiCityYieldFromUnimprovedFeature[iFeatureLoop][iYield] + iChange);2149 m_ppiCityYieldFromUnimprovedFeature[iFeatureLoop] = yields;2150 }2151#endif2152 }21532154 for(int iImprovementLoop = 0; iImprovementLoop < GC.getNumImprovementInfos(); iImprovementLoop++)2155 {2156 int iChange = trait->GetImprovementYieldChanges((ImprovementTypes)iImprovementLoop, (YieldTypes)iYield);2157 if(iChange > 0)2158 {2159 Firaxis::Array<int, NUM_YIELD_TYPES> yields = m_ppaaiImprovementYieldChange[iImprovementLoop];2160 yields[iYield] = (m_ppaaiImprovementYieldChange[iImprovementLoop][iYield] + iChange);2161 m_ppaaiImprovementYieldChange[iImprovementLoop] = yields;2162 }2163 }21642165#if defined(MOD_API_UNIFIED_YIELDS) && defined(MOD_API_PLOT_YIELDS)2166 for(int iPlotLoop = 0; iPlotLoop < GC.getNumPlotInfos(); iPlotLoop++)2167 {2168 int iChange = trait->GetPlotYieldChanges((PlotTypes)iPlotLoop, (YieldTypes)iYield);2169 if(iChange > 0)2170 {2171 Firaxis::Array<int, NUM_YIELD_TYPES> yields = m_ppiPlotYieldChange[iPlotLoop];2172 yields[iYield] = (m_ppiPlotYieldChange[iPlotLoop][iYield] + iChange);2173 m_ppiPlotYieldChange[iPlotLoop] = yields;2174 }2175 }2176#endif21772178#if defined(MOD_API_UNIFIED_YIELDS)2179 for(int iBuildingClassLoop = 0; iBuildingClassLoop < GC.getNumBuildingClassInfos(); iBuildingClassLoop++)2180 {2181 int iChange = trait->GetBuildingClassYieldChanges((BuildingClassTypes)iBuildingClassLoop, (YieldTypes)iYield);2182 if(iChange > 0)2183 {2184 Firaxis::Array<int, NUM_YIELD_TYPES> yields = m_ppiBuildingClassYieldChange[iBuildingClassLoop];2185 yields[iYield] = (m_ppiBuildingClassYieldChange[iBuildingClassLoop][iYield] + iChange);2186 m_ppiBuildingClassYieldChange[iBuildingClassLoop] = yields;2187 }2188 }21892190 m_iCapitalYieldChanges[iYield] = trait->GetCapitalYieldChanges(iYield);2191 m_iCityYieldChanges[iYield] = trait->GetCityYieldChanges(iYield);2192 m_iCoastalCityYieldChanges[iYield] = trait->GetCoastalCityYieldChanges(iYield);2193 m_iGreatWorkYieldChanges[iYield] = trait->GetGreatWorkYieldChanges(iYield);21942195 for(int iFeatureLoop = 0; iFeatureLoop < GC.getNumFeatureInfos(); iFeatureLoop++)2196 {2197 int iChange = trait->GetFeatureYieldChanges((FeatureTypes)iFeatureLoop, (YieldTypes)iYield);2198 if(iChange > 0)2199 {2200 Firaxis::Array<int, NUM_YIELD_TYPES> yields = m_ppiFeatureYieldChange[iFeatureLoop];2201 yields[iYield] = (m_ppiFeatureYieldChange[iFeatureLoop][iYield] + iChange);2202 m_ppiFeatureYieldChange[iFeatureLoop] = yields;2203 }2204 }22052206 for(int iResourceLoop = 0; iResourceLoop < GC.getNumResourceInfos(); iResourceLoop++)2207 {2208 int iChange = trait->GetResourceYieldChanges((ResourceTypes)iResourceLoop, (YieldTypes)iYield);2209 if(iChange > 0)2210 {2211 Firaxis::Array<int, NUM_YIELD_TYPES> yields = m_ppiResourceYieldChange[iResourceLoop];2212 yields[iYield] = (m_ppiResourceYieldChange[iResourceLoop][iYield] + iChange);2213 m_ppiResourceYieldChange[iResourceLoop] = yields;2214 }2215 }22162217 for(int iTerrainLoop = 0; iTerrainLoop < GC.getNumTerrainInfos(); iTerrainLoop++)2218 {2219 int iChange = trait->GetTerrainYieldChanges((TerrainTypes)iTerrainLoop, (YieldTypes)iYield);2220 if(iChange > 0)2221 {2222 Firaxis::Array<int, NUM_YIELD_TYPES> yields = m_ppiTerrainYieldChange[iTerrainLoop];2223 yields[iYield] = (m_ppiTerrainYieldChange[iTerrainLoop][iYield] + iChange);2224 m_ppiTerrainYieldChange[iTerrainLoop] = yields;2225 }2226 }22272228 m_iYieldFromKills[iYield] = trait->GetYieldFromKills((YieldTypes) iYield);2229 m_iYieldFromBarbarianKills[iYield] = trait->GetYieldFromBarbarianKills((YieldTypes) iYield);2230 m_iYieldChangeTradeRoute[iYield] = trait->GetYieldChangeTradeRoute(iYield);2231 m_iYieldChangeWorldWonder[iYield] = trait->GetYieldChangeWorldWonder(iYield);22322233 for(int iDomainLoop = 0; iDomainLoop < NUM_DOMAIN_TYPES; iDomainLoop++)2234 {2235 int iChange = trait->GetTradeRouteYieldChange((DomainTypes)iDomainLoop, (YieldTypes)iYield);2236 if(iChange > 0)2237 {2238 Firaxis::Array<int, NUM_YIELD_TYPES> yields = m_ppiTradeRouteYieldChange[iDomainLoop];2239 yields[iYield] = (m_ppiTradeRouteYieldChange[iDomainLoop][iYield] + iChange);2240 m_ppiTradeRouteYieldChange[iDomainLoop] = yields;2241 }2242 }22432244 for(int iGreatPersonLoop = 0; iGreatPersonLoop < GC.getNumGreatPersonInfos(); iGreatPersonLoop++)2245 {2246 int iChange = trait->GetGreatPersonExpendedYield((GreatPersonTypes)iGreatPersonLoop, (YieldTypes)iYield);2247 if(iChange > 0)2248 {2249 Firaxis::Array<int, NUM_YIELD_TYPES> yields = m_ppiGreatPersonExpendedYield[iGreatPersonLoop];2250 yields[iYield] = (m_ppiGreatPersonExpendedYield[iGreatPersonLoop][iYield] + iChange);2251 m_ppiGreatPersonExpendedYield[iGreatPersonLoop] = yields;2252 }22532254 m_piGoldenAgeGreatPersonRateModifier[iGreatPersonLoop] = trait->GetGoldenAgeGreatPersonRateModifier((GreatPersonTypes) iGreatPersonLoop);2255 }2256#endif22572258 for(int iSpecialistLoop = 0; iSpecialistLoop < GC.getNumSpecialistInfos(); iSpecialistLoop++)2259 {2260 int iChange = trait->GetSpecialistYieldChanges((SpecialistTypes)iSpecialistLoop, (YieldTypes)iYield);2261 if(iChange > 0)2262 {2263 Firaxis::Array<int, NUM_YIELD_TYPES> yields = m_ppaaiSpecialistYieldChange[iSpecialistLoop];2264 yields[iYield] = (m_ppaaiSpecialistYieldChange[iSpecialistLoop][iYield] + iChange);2265 m_ppaaiSpecialistYieldChange[iSpecialistLoop] = yields;2266 }2267 }2268 }22692270#if defined(MOD_API_UNIFIED_YIELDS)2271 for(int iGreatPersonLoop = 0; iGreatPersonLoop < GC.getNumGreatPersonInfos(); iGreatPersonLoop++)2272 {2273 m_piGoldenAgeGreatPersonRateModifier[iGreatPersonLoop] = trait->GetGoldenAgeGreatPersonRateModifier((GreatPersonTypes) iGreatPersonLoop);2274 }2275#endif22762277 CvAssert(GC.getNumTerrainInfos() <= NUM_TERRAIN_TYPES);2278 for(int iTerrain = 0; iTerrain < GC.getNumTerrainInfos(); iTerrain++)2279 {2280 m_iStrategicResourceQuantityModifier[iTerrain] = trait->GetStrategicResourceQuantityModifier(iTerrain);2281 }22822283 for(int iResource = 0; iResource < GC.getNumResourceInfos(); iResource++)2284 {2285 m_aiResourceQuantityModifier[iResource] = trait->GetResourceQuantityModifier(iResource);2286 }22872288 for (int iUnitClass = 0; iUnitClass < GC.getNumUnitClassInfos(); iUnitClass++)2289 {2290 m_abNoTrain[iUnitClass] = trait->NoTrain((UnitClassTypes)iUnitClass);2291 }22922293 FreeTraitUnit traitUnit;2294 traitUnit.m_iFreeUnit = (UnitTypes)trait->GetFreeUnitClassType();2295 if(traitUnit.m_iFreeUnit != NO_UNITCLASS)2296 {2297 traitUnit.m_ePrereqTech = trait->GetFreeUnitPrereqTech();2298 m_aFreeTraitUnits.push_back(traitUnit);2299 }23002301 m_eCombatBonusImprovement = trait->GetCombatBonusImprovement();23022303 int iNumUnitCombatClassInfos = GC.getNumUnitCombatClassInfos();2304 for(int jJ= 0; jJ < iNumUnitCombatClassInfos; jJ++)2305 {2306 m_paiMovesChangeUnitCombat[jJ] += trait->GetMovesChangeUnitCombat(jJ);2307 m_paiMaintenanceModifierUnitCombat[jJ] += trait->GetMaintenanceModifierUnitCombat(jJ);2308 }23092310 for(int iResourceLoop = 0; iResourceLoop < GC.getNumResourceInfos(); iResourceLoop++)2311 {2312 FreeResourceXCities temp = trait->GetFreeResourceXCities((ResourceTypes)iResourceLoop);2313 if(temp.m_iResourceQuantity > 0)2314 {2315 m_aFreeResourceXCities[iResourceLoop] = temp;2316 }2317 }2318 }2319 }2320}