Bazaar developer reference

CvTraitEntry::CacheResults(Database::Results &, CvDatabaseUtility &)

Defined in
CvTraitClasses.cpp, line 1204
Class
CvTraitEntry
Hook name
CivHooks::CvTraitEntry_CacheResults
Overrides
CvBaseInfo::CacheResults(Database::Results &, CvDatabaseUtility &)

Hooks

static bool BeforeCvTraitEntry_CacheResults(CvTraitEntry* self, Database::Results& kResults, CvDatabaseUtility& kUtility, bool& result);static void AfterCvTraitEntry_CacheResults(CvTraitEntry* self, Database::Results& kResults, CvDatabaseUtility& kUtility, bool& result);static bool ReplaceCvTraitEntry_CacheResults(bool (*original)(CvTraitEntry*, Database::Results&, CvDatabaseUtility&), CvTraitEntry* self, Database::Results& kResults, CvDatabaseUtility& kUtility);CivRegisterBefore<CivHooks::CvTraitEntry_CacheResults>(host, &BeforeCvTraitEntry_CacheResults);CivRegisterAfter<CivHooks::CvTraitEntry_CacheResults>(host, &AfterCvTraitEntry_CacheResults);CivRegisterReplace<CivHooks::CvTraitEntry_CacheResults>(host, &ReplaceCvTraitEntry_CacheResults);

Code

1203/// Load XML data1204bool CvTraitEntry::CacheResults(Database::Results& kResults, CvDatabaseUtility& kUtility)1205{1206	if(!CvBaseInfo::CacheResults(kResults, kUtility))1207		return false;12081209	//Basic Properties1210	setShortDescription(kResults.GetText("ShortDescription"));12111212	m_iLevelExperienceModifier				= kResults.GetInt("LevelExperienceModifier");1213	m_iGreatPeopleRateModifier				= kResults.GetInt("GreatPeopleRateModifier");1214	m_iGreatScientistRateModifier			= kResults.GetInt("GreatScientistRateModifier");1215	m_iGreatGeneralRateModifier				= kResults.GetInt("GreatGeneralRateModifier");1216	m_iGreatGeneralExtraBonus				= kResults.GetInt("GreatGeneralExtraBonus");1217	m_iGreatPersonGiftInfluence				= kResults.GetInt("GreatPersonGiftInfluence");1218	m_iMaxGlobalBuildingProductionModifier	= kResults.GetInt("MaxGlobalBuildingProductionModifier");1219	m_iMaxTeamBuildingProductionModifier	= kResults.GetInt("MaxTeamBuildingProductionModifier");1220	m_iMaxPlayerBuildingProductionModifier	= kResults.GetInt("MaxPlayerBuildingProductionModifier");1221	m_iCityUnhappinessModifier           	= kResults.GetInt("CityUnhappinessModifier");1222	m_iPopulationUnhappinessModifier    	= kResults.GetInt("PopulationUnhappinessModifier");1223	m_iCityStateBonusModifier               = kResults.GetInt("CityStateBonusModifier");1224	m_iCityStateFriendshipModifier          = kResults.GetInt("CityStateFriendshipModifier");1225	m_iCityStateCombatModifier				= kResults.GetInt("CityStateCombatModifier");1226	m_iLandBarbarianConversionPercent       = kResults.GetInt("LandBarbarianConversionPercent");1227	m_iLandBarbarianConversionExtraUnits    = kResults.GetInt("LandBarbarianConversionExtraUnits");1228	m_iSeaBarbarianConversionPercent        = kResults.GetInt("SeaBarbarianConversionPercent");1229	m_iCapitalBuildingModifier				= kResults.GetInt("CapitalBuildingModifier");1230	m_iPlotBuyCostModifier					= kResults.GetInt("PlotBuyCostModifier");1231#if defined(MOD_TRAITS_CITY_WORKING)1232	m_iCityWorkingChange					= kResults.GetInt("CityWorkingChange");1233#endif1234#if defined(MOD_TRAITS_CITY_AUTOMATON_WORKERS)1235	m_iCityAutomatonWorkersChange			= kResults.GetInt("CityAutomatonWorkersChange");1236#endif1237	m_iPlotCultureCostModifier              = kResults.GetInt("PlotCultureCostModifier");1238	m_iCultureFromKills						= kResults.GetInt("CultureFromKills");1239	m_iFaithFromKills						= kResults.GetInt("FaithFromKills");1240	m_iCityCultureBonus						= kResults.GetInt("CityCultureBonus");1241	m_iCapitalThemingBonusModifier          = kResults.GetInt("CapitalThemingBonusModifier");1242	m_iPolicyCostModifier					= kResults.GetInt("PolicyCostModifier");1243	m_iCityConnectionTradeRouteChange		= kResults.GetInt("CityConnectionTradeRouteChange");1244	m_iWonderProductionModifier				= kResults.GetInt("WonderProductionModifier");1245	m_iPlunderModifier						= kResults.GetInt("PlunderModifier");1246	m_iImprovementMaintenanceModifier       = kResults.GetInt("ImprovementMaintenanceModifier");1247	m_iGoldenAgeDurationModifier			= kResults.GetInt("GoldenAgeDurationModifier");1248	m_iGoldenAgeMoveChange				    = kResults.GetInt("GoldenAgeMoveChange");1249	m_iGoldenAgeCombatModifier				= kResults.GetInt("GoldenAgeCombatModifier");1250	m_iGoldenAgeTourismModifier				= kResults.GetInt("GoldenAgeTourismModifier");1251	m_iGoldenAgeGreatArtistRateModifier		= kResults.GetInt("GoldenAgeGreatArtistRateModifier");1252	m_iGoldenAgeGreatMusicianRateModifier	= kResults.GetInt("GoldenAgeGreatMusicianRateModifier");1253	m_iGoldenAgeGreatWriterRateModifier		= kResults.GetInt("GoldenAgeGreatWriterRateModifier");1254	m_iExtraEmbarkMoves						= kResults.GetInt("ExtraEmbarkMoves");1255	m_iNaturalWonderFirstFinderGold         = kResults.GetInt("NaturalWonderFirstFinderGold");1256	m_iNaturalWonderSubsequentFinderGold    = kResults.GetInt("NaturalWonderSubsequentFinderGold");1257	m_iNaturalWonderYieldModifier           = kResults.GetInt("NaturalWonderYieldModifier");1258	m_iNaturalWonderHappinessModifier       = kResults.GetInt("NaturalWonderHappinessModifier");1259	m_iNearbyImprovementCombatBonus			= kResults.GetInt("NearbyImprovementCombatBonus");1260	m_iNearbyImprovementBonusRange			= kResults.GetInt("NearbyImprovementBonusRange");1261	m_iCultureBuildingYieldChange			= kResults.GetInt("CultureBuildingYieldChange");1262	m_iCombatBonusVsHigherTech				= kResults.GetInt("CombatBonusVsHigherTech");1263	m_iCombatBonusVsLargerCiv				= kResults.GetInt("CombatBonusVsLargerCiv");1264	m_iLandUnitMaintenanceModifier          = kResults.GetInt("LandUnitMaintenanceModifier");1265	m_iNavalUnitMaintenanceModifier         = kResults.GetInt("NavalUnitMaintenanceModifier");1266	m_iRazeSpeedModifier					= kResults.GetInt("RazeSpeedModifier");1267	m_iDOFGreatPersonModifier				= kResults.GetInt("DOFGreatPersonModifier");1268	m_iLuxuryHappinessRetention				= kResults.GetInt("LuxuryHappinessRetention");1269#if defined(MOD_TRAITS_EXTRA_SUPPLY)1270	if (MOD_TRAITS_EXTRA_SUPPLY) {1271		m_iExtraSupply						= kResults.GetInt("ExtraSupply");1272		m_iExtraSupplyPerCity				= kResults.GetInt("ExtraSupplyPerCity");1273		m_iExtraSupplyPerPopulation			= kResults.GetInt("ExtraSupplyPerPopulation");1274	}1275#endif1276	m_iExtraSpies							= kResults.GetInt("ExtraSpies");1277	m_iUnresearchedTechBonusFromKills		= kResults.GetInt("UnresearchedTechBonusFromKills");1278	m_iExtraFoundedCityTerritoryClaimRange  = kResults.GetInt("ExtraFoundedCityTerritoryClaimRange");1279	m_iFreeSocialPoliciesPerEra				= kResults.GetInt("FreeSocialPoliciesPerEra");1280	m_iNumTradeRoutesModifier				= kResults.GetInt("NumTradeRoutesModifier");1281	m_iTradeRouteResourceModifier			= kResults.GetInt("TradeRouteResourceModifier");1282	m_iUniqueLuxuryCities					= kResults.GetInt("UniqueLuxuryCities");1283	m_iUniqueLuxuryQuantity					= kResults.GetInt("UniqueLuxuryQuantity");1284	m_iWorkerSpeedModifier					= kResults.GetInt("WorkerSpeedModifier");1285	m_iAfraidMinorPerTurnInfluence			= kResults.GetInt("AfraidMinorPerTurnInfluence");1286	m_iLandTradeRouteRangeBonus				= kResults.GetInt("LandTradeRouteRangeBonus");1287#if defined(MOD_TRAITS_TRADE_ROUTE_BONUSES)1288	if (MOD_TRAITS_TRADE_ROUTE_BONUSES) {1289		m_iSeaTradeRouteRangeBonus			= kResults.GetInt("SeaTradeRouteRangeBonus");1290	}1291#endif1292	m_iTradeReligionModifier				= kResults.GetInt("TradeReligionModifier");1293	m_iTradeBuildingModifier				= kResults.GetInt("TradeBuildingModifier");12941295	const char* szTextVal = NULL;1296	szTextVal = kResults.GetText("FreeUnit");1297	if(szTextVal)1298	{1299		m_iFreeUnitClassType = GC.getInfoTypeForString(szTextVal, true);1300	}13011302	szTextVal = kResults.GetText("FreeUnitPrereqTech");1303	if(szTextVal)1304	{1305		m_eFreeUnitPrereqTech = (TechTypes)GC.getInfoTypeForString(szTextVal, true);1306	}13071308	szTextVal = kResults.GetText("CombatBonusImprovement");1309	if(szTextVal)1310	{1311		m_eCombatBonusImprovement = (ImprovementTypes)GC.getInfoTypeForString(szTextVal, true);1312	}13131314	szTextVal = kResults.GetText("ObsoleteTech");1315	if(szTextVal)1316	{1317		m_iObsoleteTech = GC.getInfoTypeForString(szTextVal, true);1318	}13191320	szTextVal = kResults.GetText("PrereqTech");1321	if(szTextVal)1322	{1323		m_iPrereqTech = GC.getInfoTypeForString(szTextVal, true);1324	}13251326#if defined(MOD_TRAITS_OTHER_PREREQS)1327	if (MOD_TRAITS_OTHER_PREREQS) {1328		szTextVal = kResults.GetText("ObsoleteBelief");1329		if(szTextVal)1330		{1331			m_iObsoleteBelief = GC.getInfoTypeForString(szTextVal, true);1332		}13331334		szTextVal = kResults.GetText("PrereqBelief");1335		if(szTextVal)1336		{1337			m_iPrereqBelief = GC.getInfoTypeForString(szTextVal, true);1338		}13391340		szTextVal = kResults.GetText("ObsoletePolicy");1341		if(szTextVal)1342		{1343			m_iObsoletePolicy = GC.getInfoTypeForString(szTextVal, true);1344		}13451346		szTextVal = kResults.GetText("PrereqPolicy");1347		if(szTextVal)1348		{1349			m_iPrereqPolicy = GC.getInfoTypeForString(szTextVal, true);1350		}1351	}1352#endif13531354	szTextVal = kResults.GetText("FreeBuilding");1355	if(szTextVal)1356	{1357		m_eFreeBuilding = (BuildingTypes)GC.getInfoTypeForString(szTextVal, true);1358	}13591360	szTextVal = kResults.GetText("FreeBuildingOnConquest");1361	if(szTextVal)1362	{1363		m_eFreeBuildingOnConquest = (BuildingTypes)GC.getInfoTypeForString(szTextVal, true);1364	}13651366	m_bFightWellDamaged = kResults.GetBool("FightWellDamaged");1367	m_bMoveFriendlyWoodsAsRoad = kResults.GetBool("MoveFriendlyWoodsAsRoad");1368	m_bFasterAlongRiver = kResults.GetBool("FasterAlongRiver");1369	m_bFasterInHills = kResults.GetBool("FasterInHills");1370	m_bEmbarkedAllWater = kResults.GetBool("EmbarkedAllWater");1371	m_bEmbarkedToLandFlatCost = kResults.GetBool("EmbarkedToLandFlatCost");1372	m_bNoHillsImprovementMaintenance = kResults.GetBool("NoHillsImprovementMaintenance");1373	m_bTechBoostFromCapitalScienceBuildings = kResults.GetBool("TechBoostFromCapitalScienceBuildings");1374	m_bStaysAliveZeroCities = kResults.GetBool("StaysAliveZeroCities");1375	m_bFaithFromUnimprovedForest = kResults.GetBool("FaithFromUnimprovedForest");1376#if defined(MOD_TRAITS_ANY_BELIEF)1377	if (MOD_TRAITS_ANY_BELIEF) {1378		m_bAnyBelief = kResults.GetBool("AnyBelief");1379	}1380#endif1381	m_bBonusReligiousBelief = kResults.GetBool("BonusReligiousBelief");1382	m_bAbleToAnnexCityStates = kResults.GetBool("AbleToAnnexCityStates");1383	m_bCrossesMountainsAfterGreatGeneral = kResults.GetBool("CrossesMountainsAfterGreatGeneral");1384#if defined(MOD_TRAITS_CROSSES_ICE)1385	if (MOD_TRAITS_CROSSES_ICE) {1386		m_bCrossesIce = kResults.GetBool("CrossesIce");1387	}1388#endif1389#if defined(MOD_TRAITS_GG_FROM_BARBARIANS)1390	if (MOD_TRAITS_GG_FROM_BARBARIANS) {1391		m_bGGFromBarbarians = kResults.GetBool("GGFromBarbarians");1392	}1393#endif1394	m_bMayaCalendarBonuses = kResults.GetBool("MayaCalendarBonuses");1395	m_bNoAnnexing = kResults.GetBool("NoAnnexing");1396	m_bTechFromCityConquer = kResults.GetBool("TechFromCityConquer");1397	m_bUniqueLuxuryRequiresNewArea = kResults.GetBool("UniqueLuxuryRequiresNewArea");1398	m_bRiverTradeRoad = kResults.GetBool("RiverTradeRoad");1399	m_bAngerFreeIntrusionOfCityStates = kResults.GetBool("AngerFreeIntrusionOfCityStates");14001401	//Arrays1402	const char* szTraitType = GetType();1403	kUtility.SetYields(m_paiExtraYieldThreshold, "Trait_ExtraYieldThresholds", "TraitType", szTraitType);14041405	kUtility.SetYields(m_paiYieldChange, "Trait_YieldChanges", "TraitType", szTraitType);1406	kUtility.SetYields(m_paiYieldChangeStrategicResources, "Trait_YieldChangesStrategicResources", "TraitType", szTraitType);1407	kUtility.SetYields(m_paiYieldChangeNaturalWonder, "Trait_YieldChangesNaturalWonder", "TraitType", szTraitType);1408	kUtility.SetYields(m_paiYieldChangePerTradePartner, "Trait_YieldChangesPerTradePartner", "TraitType", szTraitType);1409	kUtility.SetYields(m_paiYieldChangeIncomingTradeRoute, "Trait_YieldChangesIncomingTradeRoute", "TraitType", szTraitType);1410	kUtility.SetYields(m_paiYieldModifier, "Trait_YieldModifiers", "TraitType", szTraitType);14111412	const int iNumTerrains = GC.getNumTerrainInfos();14131414	//Trait_Terrains1415	{1416		kUtility.InitializeArray(m_piStrategicResourceQuantityModifier, iNumTerrains, 0);14171418		std::string sqlKey = "Trait_Terrains";1419		Database::Results* pResults = kUtility.GetResults(sqlKey);1420		if(pResults == NULL)1421		{1422			const char* szSQL = "select TraitType, Terrains.ID as TerrainID, StrategicResourceQuantityModifier from Trait_Terrains join Terrains on Terrains.Type = TerrainType where TraitType = ?";1423			pResults = kUtility.PrepareResults(sqlKey, szSQL);1424		}14251426		pResults->Bind(1, szTraitType);14271428		while(pResults->Step())1429		{1430			const int iTerrainID = pResults->GetInt("TerrainID");1431			CvAssert(iTerrainID > -1 && iTerrainID < iNumTerrains);14321433			const int iStrategicResourceQuantityModifier = pResults->GetInt("StrategicResourceQuantityModifier");1434			m_piStrategicResourceQuantityModifier[iTerrainID] = iStrategicResourceQuantityModifier;1435		}1436	}14371438	//Populate m_FreePromotionUnitCombats1439	{1440		std::string sqlKey = "FreePromotionUnitCombats";1441		Database::Results* pResults = kUtility.GetResults(sqlKey);1442		if(pResults == NULL)1443		{1444			const char* szSQL = "select UnitPromotions.ID, UnitCombatInfos.ID from Trait_FreePromotionUnitCombats, UnitPromotions, UnitCombatInfos where TraitType = ? and PromotionType = UnitPromotions.Type and UnitCombatType = UnitCombatInfos.Type";1445			pResults = kUtility.PrepareResults(sqlKey, szSQL);1446		}14471448		pResults->Bind(1, szTraitType);14491450		while(pResults->Step())1451		{1452			const int unitPromotionID = pResults->GetInt(0);1453			const int unitCombatInfoID = pResults->GetInt(1);14541455			m_FreePromotionUnitCombats.insert(std::pair<int, int>(unitPromotionID, unitCombatInfoID));1456		}14571458		pResults->Reset();14591460		//Trim extra memory off container since this is mostly read-only.1461		std::multimap<int,int>(m_FreePromotionUnitCombats).swap(m_FreePromotionUnitCombats);14621463		kUtility.PopulateArrayByValue(m_piResourceQuantityModifiers, "Resources", "Trait_ResourceQuantityModifiers", "ResourceType", "TraitType", szTraitType, "ResourceQuantityModifier");1464	}14651466	//Populate m_MovesChangeUnitCombats1467	{1468		const int iNumUnitCombatClasses = kUtility.MaxRows("UnitCombatInfos");1469		kUtility.InitializeArray(m_piMovesChangeUnitCombats, iNumUnitCombatClasses, 0);14701471		std::string sqlKey = "Trait_MovesChangeUnitCombats";1472		Database::Results* pResults = kUtility.GetResults(sqlKey);1473		if(pResults == NULL)1474		{1475			const char* szSQL = "select UnitCombatInfos.ID, MovesChange from Trait_MovesChangeUnitCombats inner join UnitCombatInfos on UnitCombatInfos.Type = UnitCombatType where TraitType = ?;";1476			pResults = kUtility.PrepareResults(sqlKey, szSQL);1477		}14781479		pResults->Bind(1, szTraitType);14801481		while(pResults->Step())1482		{1483			const int iUnitCombatID = pResults->GetInt(0);1484			CvAssert(iUnitCombatID > -1 && iUnitCombatID < iNumUnitCombatClasses);14851486			const int iMovesChange = pResults->GetInt(1);1487			m_piMovesChangeUnitCombats[iUnitCombatID] = iMovesChange;1488		}14891490		pResults->Reset();1491	}14921493	//Populate m_MaintenanceModifierUnitCombats1494	{1495		const int iNumUnitCombatClasses = kUtility.MaxRows("UnitCombatInfos");1496		kUtility.InitializeArray(m_piMaintenanceModifierUnitCombats, iNumUnitCombatClasses, 0);14971498		std::string sqlKey = "Trait_MaintenanceModifierUnitCombats";1499		Database::Results* pResults = kUtility.GetResults(sqlKey);1500		if(pResults == NULL)1501		{1502			const char* szSQL = "select UnitCombatInfos.ID, MaintenanceModifier from Trait_MaintenanceModifierUnitCombats inner join UnitCombatInfos on UnitCombatInfos.Type = UnitCombatType where TraitType = ?;";1503			pResults = kUtility.PrepareResults(sqlKey, szSQL);1504		}15051506		pResults->Bind(1, szTraitType);15071508		while(pResults->Step())1509		{1510			const int iUnitCombatID = pResults->GetInt(0);1511			CvAssert(iUnitCombatID > -1 && iUnitCombatID < iNumUnitCombatClasses);15121513			const int iMaintenanceModifier = pResults->GetInt(1);1514			m_piMaintenanceModifierUnitCombats[iUnitCombatID] = iMaintenanceModifier;1515		}15161517		pResults->Reset();1518	}15191520	//ImprovementYieldChanges1521	{1522		kUtility.Initialize2DArray(m_ppiImprovementYieldChanges, "Improvements", "Yields");15231524		std::string strKey("Trait_ImprovementYieldChanges");1525		Database::Results* pResults = kUtility.GetResults(strKey);1526		if(pResults == NULL)1527		{1528			pResults = kUtility.PrepareResults(strKey, "select Improvements.ID as ImprovementID, Yields.ID as YieldID, Yield from Trait_ImprovementYieldChanges inner join Improvements on Improvements.Type = ImprovementType inner join Yields on Yields.Type = YieldType where TraitType = ?");1529		}15301531		pResults->Bind(1, szTraitType);15321533		while(pResults->Step())1534		{1535			const int ImprovementID = pResults->GetInt(0);1536			const int YieldID = pResults->GetInt(1);1537			const int yield = pResults->GetInt(2);15381539			m_ppiImprovementYieldChanges[ImprovementID][YieldID] = yield;1540		}1541	}15421543#if defined(MOD_API_UNIFIED_YIELDS) && defined(MOD_API_PLOT_YIELDS)1544	//PlotYieldChanges1545	if (MOD_API_UNIFIED_YIELDS && MOD_API_PLOT_YIELDS)1546	{1547		kUtility.Initialize2DArray(m_ppiPlotYieldChanges, "Plots", "Yields");15481549		std::string strKey("Trait_PlotYieldChanges");1550		Database::Results* pResults = kUtility.GetResults(strKey);1551		if(pResults == NULL)1552		{1553			pResults = kUtility.PrepareResults(strKey, "select Plots.ID as PlotID, Yields.ID as YieldID, Yield from Trait_PlotYieldChanges inner join Plots on Plots.Type = PlotType inner join Yields on Yields.Type = YieldType where TraitType = ?");1554		}15551556		pResults->Bind(1, szTraitType);15571558		while(pResults->Step())1559		{1560			const int PlotID = pResults->GetInt(0);1561			const int YieldID = pResults->GetInt(1);1562			const int yield = pResults->GetInt(2);15631564			m_ppiPlotYieldChanges[PlotID][YieldID] = yield;1565		}1566	}1567#endif15681569#if defined(MOD_API_UNIFIED_YIELDS)1570	//BuildingClassYieldChanges1571	if (MOD_API_UNIFIED_YIELDS)1572	{1573		kUtility.Initialize2DArray(m_ppiBuildingClassYieldChanges, "BuildingClasses", "Yields");15741575		std::string strKey("Trait_BuildingClassYieldChanges");1576		Database::Results* pResults = kUtility.GetResults(strKey);1577		if(pResults == NULL)1578		{1579			pResults = kUtility.PrepareResults(strKey, "select BuildingClasses.ID as BuildingClassID, Yields.ID as YieldID, YieldChange from Trait_BuildingClassYieldChanges inner join BuildingClasses on BuildingClasses.Type = BuildingClassType inner join Yields on Yields.Type = YieldType where TraitType = ?");1580		}15811582		pResults->Bind(1, szTraitType);15831584		while(pResults->Step())1585		{1586			const int BuildingClassID = pResults->GetInt(0);1587			const int YieldID = pResults->GetInt(1);1588			const int yield = pResults->GetInt(2);15891590			m_ppiBuildingClassYieldChanges[BuildingClassID][YieldID] = yield;1591		}1592	}15931594	kUtility.SetYields(m_piCapitalYieldChanges, "Trait_CapitalYieldChanges", "TraitType", szTraitType);1595	kUtility.SetYields(m_piCityYieldChanges, "Trait_CityYieldChanges", "TraitType", szTraitType);1596	kUtility.SetYields(m_piCoastalCityYieldChanges, "Trait_CoastalCityYieldChanges", "TraitType", szTraitType);1597	kUtility.SetYields(m_piGreatWorkYieldChanges, "Trait_GreatWorkYieldChanges", "TraitType", szTraitType);15981599	//FeatureYieldChanges1600	if (MOD_API_UNIFIED_YIELDS)1601	{1602		kUtility.Initialize2DArray(m_ppiFeatureYieldChanges, "Features", "Yields");16031604		std::string strKey("Trait_FeatureYieldChanges");1605		Database::Results* pResults = kUtility.GetResults(strKey);1606		if(pResults == NULL)1607		{1608			pResults = kUtility.PrepareResults(strKey, "select Features.ID as FeatureID, Yields.ID as YieldID, Yield from Trait_FeatureYieldChanges inner join Features on Features.Type = FeatureType inner join Yields on Yields.Type = YieldType where TraitType = ?");1609		}16101611		pResults->Bind(1, szTraitType);16121613		while(pResults->Step())1614		{1615			const int FeatureID = pResults->GetInt(0);1616			const int YieldID = pResults->GetInt(1);1617			const int yield = pResults->GetInt(2);16181619			m_ppiFeatureYieldChanges[FeatureID][YieldID] = yield;1620		}1621	}1622	1623	//ResourceYieldChanges1624	if (MOD_API_UNIFIED_YIELDS)1625	{1626		kUtility.Initialize2DArray(m_ppiResourceYieldChanges, "Resources", "Yields");16271628		std::string strKey("Trait_ResourceYieldChanges");1629		Database::Results* pResults = kUtility.GetResults(strKey);1630		if(pResults == NULL)1631		{1632			pResults = kUtility.PrepareResults(strKey, "select Resources.ID as ResourceID, Yields.ID as YieldID, Yield from Trait_ResourceYieldChanges inner join Resources on Resources.Type = ResourceType inner join Yields on Yields.Type = YieldType where TraitType = ?");1633		}16341635		pResults->Bind(1, szTraitType);16361637		while(pResults->Step())1638		{1639			const int ResourceID = pResults->GetInt(0);1640			const int YieldID = pResults->GetInt(1);1641			const int yield = pResults->GetInt(2);16421643			m_ppiResourceYieldChanges[ResourceID][YieldID] = yield;1644		}1645	}1646	1647	//TerrainYieldChanges1648	if (MOD_API_UNIFIED_YIELDS)1649	{1650		kUtility.Initialize2DArray(m_ppiTerrainYieldChanges, "Terrains", "Yields");16511652		std::string strKey("Trait_TerrainYieldChanges");1653		Database::Results* pResults = kUtility.GetResults(strKey);1654		if(pResults == NULL)1655		{1656			pResults = kUtility.PrepareResults(strKey, "select Terrains.ID as TerrainID, Yields.ID as YieldID, Yield from Trait_TerrainYieldChanges inner join Terrains on Terrains.Type = TerrainType inner join Yields on Yields.Type = YieldType where TraitType = ?");1657		}16581659		pResults->Bind(1, szTraitType);16601661		while(pResults->Step())1662		{1663			const int TerrainID = pResults->GetInt(0);1664			const int YieldID = pResults->GetInt(1);1665			const int yield = pResults->GetInt(2);16661667			m_ppiTerrainYieldChanges[TerrainID][YieldID] = yield;1668		}1669	}1670	1671	kUtility.SetYields(m_piYieldFromKills, "Trait_YieldFromKills", "TraitType", szTraitType);1672	kUtility.SetYields(m_piYieldFromBarbarianKills, "Trait_YieldFromBarbarianKills", "TraitType", szTraitType);1673	kUtility.SetYields(m_piYieldChangeTradeRoute, "Trait_YieldChangeTradeRoute", "TraitType", szTraitType);1674	kUtility.SetYields(m_piYieldChangeWorldWonder, "Trait_YieldChangeWorldWonder", "TraitType", szTraitType);16751676	//TradeRouteYieldChange1677	{1678		kUtility.Initialize2DArray(m_ppiTradeRouteYieldChange, "Domains", "Yields");16791680		std::string strKey("Building_TradeRouteYieldChange");1681		Database::Results* pResults = kUtility.GetResults(strKey);1682		if(pResults == NULL)1683		{1684			pResults = kUtility.PrepareResults(strKey, "select Domains.ID as DomainID, Yields.ID as YieldID, Yield from Trait_TradeRouteYieldChange inner join Domains on Domains.Type = DomainType inner join Yields on Yields.Type = YieldType where TraitType = ?");1685		}16861687		pResults->Bind(1, szTraitType);16881689		while(pResults->Step())1690		{1691			const int DomainID = pResults->GetInt(0);1692			const int YieldID = pResults->GetInt(1);1693			const int yield = pResults->GetInt(2);16941695			m_ppiTradeRouteYieldChange[DomainID][YieldID] = yield;1696		}1697	}1698#endif16991700	//SpecialistYieldChanges1701	{1702		kUtility.Initialize2DArray(m_ppiSpecialistYieldChanges, "Specialists", "Yields");17031704		std::string strKey("Trait_SpecialistYieldChanges");1705		Database::Results* pResults = kUtility.GetResults(strKey);1706		if(pResults == NULL)1707		{1708			pResults = kUtility.PrepareResults(strKey, "select Specialists.ID as SpecialistID, Yields.ID as YieldID, Yield from Trait_SpecialistYieldChanges inner join Specialists on Specialists.Type = SpecialistType inner join Yields on Yields.Type = YieldType where TraitType = ?");1709		}17101711		pResults->Bind(1, szTraitType);17121713		while(pResults->Step())1714		{1715			const int SpecialistID = pResults->GetInt(0);1716			const int YieldID = pResults->GetInt(1);1717			const int yield = pResults->GetInt(2);17181719			m_ppiSpecialistYieldChanges[SpecialistID][YieldID] = yield;1720		}1721	}17221723#if defined(MOD_API_UNIFIED_YIELDS)1724	//GreatPersonExpendedYield1725	{1726		kUtility.Initialize2DArray(m_ppiGreatPersonExpendedYield, "GreatPersons", "Yields");17271728		std::string strKey("Trait_GreatPersonExpendedYield");1729		Database::Results* pResults = kUtility.GetResults(strKey);1730		if(pResults == NULL)1731		{1732			pResults = kUtility.PrepareResults(strKey, "select GreatPersons.ID as GreatPersonID, Yields.ID as YieldID, Yield from Trait_GreatPersonExpendedYield inner join GreatPersons on GreatPersons.Type = GreatPersonType inner join Yields on Yields.Type = YieldType where TraitType = ?");1733		}17341735		pResults->Bind(1, szTraitType);17361737		while(pResults->Step())1738		{1739			const int GreatPersonID = pResults->GetInt(0);1740			const int YieldID = pResults->GetInt(1);1741			const int yield = pResults->GetInt(2);17421743			m_ppiGreatPersonExpendedYield[GreatPersonID][YieldID] = yield;1744		}1745	}17461747	kUtility.PopulateArrayByValue(m_piGoldenAgeGreatPersonRateModifier, "GreatPersons", "Trait_GoldenAgeGreatPersonRateModifier", "GreatPersonType", "TraitType", szTraitType, "Modifier");17481749	//CityYieldFromUnimprovedFeature1750	{1751		kUtility.Initialize2DArray(m_ppiCityYieldFromUnimprovedFeature, "Features", "Yields");17521753		std::string strKey("Trait_CityYieldFromUnimprovedFeature");1754		Database::Results* pResults = kUtility.GetResults(strKey);1755		if(pResults == NULL)1756		{1757			pResults = kUtility.PrepareResults(strKey, "select Features.ID as FeatureID, Yields.ID as YieldID, Yield from Trait_CityYieldFromUnimprovedFeature inner join Features on Features.Type = FeatureType inner join Yields on Yields.Type = YieldType where TraitType = ?");1758		}17591760		pResults->Bind(1, szTraitType);17611762		while(pResults->Step())1763		{1764			const int FeatureID = pResults->GetInt(0);1765			const int YieldID = pResults->GetInt(1);1766			const int yield = pResults->GetInt(2);17671768			m_ppiCityYieldFromUnimprovedFeature[FeatureID][YieldID] = yield;1769		}1770	}1771#endif17721773	//UnimprovedFeatureYieldChanges1774	{1775		kUtility.Initialize2DArray(m_ppiUnimprovedFeatureYieldChanges, "Features", "Yields");17761777		std::string strKey("Trait_UnimprovedFeatureYieldChanges");1778		Database::Results* pResults = kUtility.GetResults(strKey);1779		if(pResults == NULL)1780		{1781			pResults = kUtility.PrepareResults(strKey, "select Features.ID as FeatureID, Yields.ID as YieldID, Yield from Trait_UnimprovedFeatureYieldChanges inner join Features on Features.Type = FeatureType inner join Yields on Yields.Type = YieldType where TraitType = ?");1782		}17831784		pResults->Bind(1, szTraitType);17851786		while(pResults->Step())1787		{1788			const int FeatureID = pResults->GetInt(0);1789			const int YieldID = pResults->GetInt(1);1790			const int yield = pResults->GetInt(2);17911792			m_ppiUnimprovedFeatureYieldChanges[FeatureID][YieldID] = yield;1793		}1794	}17951796	// NoTrain1797	{1798		int iUnitClassLoop;1799		for (iUnitClassLoop = 0; iUnitClassLoop < GC.getNumUnitClassInfos(); iUnitClassLoop++)1800		{1801			m_abNoTrainUnitClass.push_back(false);1802		}18031804		std::string strKey("Trait_NoTrain");1805		Database::Results* pResults = kUtility.GetResults(strKey);1806		if (pResults == NULL)1807		{1808			pResults = kUtility.PrepareResults(strKey, "SELECT Traits.ID, UnitClasses.ID FROM Trait_NoTrain inner join Traits on Trait_NoTrain.TraitType = Traits.Type inner join UnitClasses on Trait_NoTrain.UnitClassType = UnitClasses.Type where TraitType = ?");1809		}18101811		pResults->Bind(1, szTraitType);18121813		while (pResults->Step())1814		{1815			const int iUnitClass = pResults->GetInt(1);1816			m_abNoTrainUnitClass[iUnitClass] = true;1817		}1818	}18191820	// FreeResourceXCities1821	{1822		// Init vector1823		int iResourceLoop;1824		for(iResourceLoop = 0; iResourceLoop < GC.getNumResourceInfos(); iResourceLoop++)1825		{1826			FreeResourceXCities temp;1827			m_aFreeResourceXCities.push_back(temp);1828		}18291830		std::string strKey("Trait_FreeResourceFirstXCities");1831		Database::Results* pResults = kUtility.GetResults(strKey);1832		if(pResults == NULL)1833		{1834			pResults = kUtility.PrepareResults(strKey, "select Resources.ID as ResourceID, ResourceQuantity, NumCities from Trait_FreeResourceFirstXCities inner join Resources on Resources.Type = ResourceType where TraitType = ?");1835		}18361837		pResults->Bind(1, szTraitType);18381839		while(pResults->Step())1840		{1841			FreeResourceXCities temp;18421843			const int iResource = pResults->GetInt(0);1844			temp.m_iResourceQuantity = pResults->GetInt(1);1845			temp.m_iNumCities = pResults->GetInt(2);18461847			m_aFreeResourceXCities[iResource] = temp;1848		}1849	}18501851	return true;1852}

Calls