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}