Code
215/// Read from XML file216bool CvImprovementEntry::CacheResults(Database::Results& kResults, CvDatabaseUtility& kUtility)217{218 if(!CvBaseInfo::CacheResults(kResults, kUtility))219 return false;220221 //Basic properties222 const char* szArtDefineTag = kResults.GetText("ArtDefineTag");223 SetArtDefineTag(szArtDefineTag);224225 m_iGoldMaintenance = kResults.GetInt("GoldMaintenance");226 m_iCultureBombRadius = kResults.GetInt("CultureBombRadius");227 m_iRequiresXAdjacentLand = kResults.GetInt("RequiresXAdjacentLand");228#if defined(MOD_API_EXTENSIONS)229 m_iRequiresXAdjacentWater = kResults.GetInt("RequiresXAdjacentWater");230#endif231#if defined(MOD_GLOBAL_STACKING_RULES)232 m_iAdditionalUnits = kResults.GetInt("AdditionalUnits");233#endif234 m_iCultureAdjacentSameType = kResults.GetInt("CultureAdjacentSameType");235#if defined(MOD_GLOBAL_RELOCATION)236 m_bAllowsRebaseTo = kResults.GetBool("AllowsRebaseTo");237 m_bAllowsAirliftFrom = kResults.GetBool("AllowsAirliftFrom");238 m_bAllowsAirliftTo = kResults.GetBool("AllowsAirliftTo");239#endif240 m_bHillsMakesValid = kResults.GetBool("HillsMakesValid");241#if defined(MOD_GLOBAL_ALPINE_PASSES)242 m_bMountainsMakesValid = kResults.GetBool("MountainsMakesValid");243#endif244#if defined(MOD_GLOBAL_PASSABLE_FORTS)245 if (MOD_GLOBAL_PASSABLE_FORTS) {246 m_bMakesPassable = kResults.GetBool("MakesPassable");247 }248#endif249#if defined(MOD_API_PLOT_BASED_DAMAGE)250 if (MOD_API_PLOT_BASED_DAMAGE) {251 m_bNegatesTerrainDamage = kResults.GetBool("NegatesTerrainDamage");252 m_bNegatesFeatureDamage = kResults.GetBool("NegatesFeatureDamage");253 }254#endif255#if defined(MOD_GLOBAL_NO_FOLLOWUP)256 if (MOD_GLOBAL_NO_FOLLOWUP) {257 m_bNoFollowup = kResults.GetBool("NoFollowup");258 }259#endif260 m_bFreshWaterMakesValid = kResults.GetBool("FreshWaterMakesValid");261 m_bRiverSideMakesValid = kResults.GetBool("RiverSideMakesValid");262 m_bNoFreshWater = kResults.GetBool("NoFreshWater");263#if defined(MOD_API_EXTENSIONS)264 if (MOD_API_EXTENSIONS) {265 m_bAddsFreshWater = kResults.GetBool("AddsFreshWater");266 }267#endif268 m_bRequiresFlatlands = kResults.GetBool("RequiresFlatlands");269 m_bRequiresFlatlandsOrFreshWater = kResults.GetBool("RequiresFlatlandsOrFreshWater");270 m_bRequiresFeature = kResults.GetBool("RequiresFeature");271 m_bRequiresImprovement = kResults.GetBool("RequiresImprovement");272 m_bRemovesResource = kResults.GetBool("RemovesResource");273 m_bPromptWhenComplete = kResults.GetBool("PromptWhenComplete");274 m_bWater = kResults.GetBool("Water");275 m_bCoastal = kResults.GetBool("Coastal");276 m_bDestroyedWhenPillaged = kResults.GetBool("DestroyedWhenPillaged");277 m_bDisplacePillager = kResults.GetBool("DisplacePillager");278 m_bBuildableOnResources = kResults.GetBool("BuildableOnResources");279 m_eImprovementUsageType = m_bBuildableOnResources ? IMPROVEMENTUSAGE_LANDMARK : IMPROVEMENTUSAGE_BASIC;280 m_bBarbarianCamp = kResults.GetBool("BarbarianCamp");281 m_bGoody = kResults.GetBool("Goody");282 m_bPermanent = kResults.GetBool("Permanent");283 m_iTilesPerGoody = kResults.GetInt("TilesPerGoody");284 m_iGoodyUniqueRange = kResults.GetInt("GoodyRange");285 m_iFeatureGrowthProbability = kResults.GetInt("FeatureGrowth");286 m_iUpgradeTime = kResults.GetInt("UpgradeTime");287 m_iRiverSideUpgradeMod = kResults.GetInt("RiverSideUpgradeMod");288 m_iCoastalLandUpgradeMod = kResults.GetInt("CoastalLandUpgradeMod");289 m_iHillsUpgradeMod = kResults.GetInt("HillsUpgradeMod");290 m_iFreshWaterUpgradeMod = kResults.GetInt("FreshWaterUpgradeMod");291 m_iDefenseModifier = kResults.GetInt("DefenseModifier");292 m_iNearbyEnemyDamage = kResults.GetInt("NearbyEnemyDamage");293 m_iPillageGold = kResults.GetInt("PillageGold");294 m_bOutsideBorders = kResults.GetBool("OutsideBorders");295 m_bInAdjacentFriendly = kResults.GetBool("InAdjacentFriendly");296 m_bIgnoreOwnership = kResults.GetBool("IgnoreOwnership");297 m_bOnlyCityStateTerritory = kResults.GetBool("OnlyCityStateTerritory");298 m_bNoTwoAdjacent = kResults.GetBool("NoTwoAdjacent");299 m_bAdjacentLuxury = kResults.GetBool("AdjacentLuxury");300 m_bAllowsWalkWater = kResults.GetBool("AllowsWalkWater");301 m_bCreatedByGreatPerson = kResults.GetBool("CreatedByGreatPerson");302 m_bSpecificCivRequired = kResults.GetBool("SpecificCivRequired");303 m_iResourceExtractionMod = kResults.GetInt("ResourceExtractionMod");304 m_iLuxuryCopiesSiphonedFromMinor = kResults.GetInt("LuxuryCopiesSiphonedFromMinor");305306 const char* szCivilizationType = kResults.GetText("CivilizationType");307 m_eRequiredCivilization = (CivilizationTypes)GC.getInfoTypeForString(szCivilizationType, true);308309 //References310 const char* szWorldsoundscapeAudioScript = kResults.GetText("WorldSoundscapeAudioScript");311 if(szWorldsoundscapeAudioScript != NULL)312 {313 m_iWorldSoundscapeScriptId = gDLL->GetAudioTagIndex(szWorldsoundscapeAudioScript, AUDIOTAG_SOUNDSCAPE);314 }315 else316 {317 m_iWorldSoundscapeScriptId = -1;318 Remark(1, "Warning: Missing soundscape definition in XML for feature: '%s'", GetType());319 }320321 const char* szImprovementPillage = kResults.GetText("ImprovementPillage");322 m_iImprovementPillage = GC.getInfoTypeForString(szImprovementPillage, true);323324 const char* szImprovementUpgrade = kResults.GetText("ImprovementUpgrade");325 m_iImprovementUpgrade = GC.getInfoTypeForString(szImprovementUpgrade, true);326327 //Arrays328 const char* szImprovementType = GetType();329 const size_t lenImprovementType = strlen(szImprovementType);330331 kUtility.PopulateArrayByExistence(m_pbTerrainMakesValid,332 "Terrains",333 "Improvement_ValidTerrains",334 "TerrainType",335 "ImprovementType",336 szImprovementType);337338 kUtility.PopulateArrayByExistence(m_pbFeatureMakesValid,339 "Features",340 "Improvement_ValidFeatures",341 "FeatureType",342 "ImprovementType",343 szImprovementType);344345 kUtility.PopulateArrayByExistence(m_pbImprovementMakesValid,346 "Improvements",347 "Improvement_ValidImprovements",348 "PrereqImprovement",349 "ImprovementType",350 szImprovementType);351352#if defined(MOD_API_UNIFIED_YIELDS)353 kUtility.PopulateArrayByValue(m_piAdjacentSameTypeYield, "Yields", "Improvement_YieldAdjacentSameType", "YieldType", "ImprovementType", szImprovementType, "Yield");354#endif355356 kUtility.SetYields(m_piYieldChange, "Improvement_Yields", "ImprovementType", szImprovementType);357 kUtility.SetYields(m_piYieldPerEra, "Improvement_YieldPerEra", "ImprovementType", szImprovementType);358 kUtility.SetYields(m_piAdjacentCityYieldChange, "Improvement_AdjacentCityYields", "ImprovementType", szImprovementType);359 kUtility.SetYields(m_piAdjacentMountainYieldChange, "Improvement_AdjacentMountainYieldChanges", "ImprovementType", szImprovementType);360 kUtility.SetYields(m_piCoastalLandYieldChange, "Improvement_CoastalLandYields", "ImprovementType", szImprovementType);361 kUtility.SetYields(m_piFreshWaterChange, "Improvement_FreshWaterYields", "ImprovementType", szImprovementType);362 kUtility.SetYields(m_piHillsYieldChange, "Improvement_HillsYields", "ImprovementType", szImprovementType);363 kUtility.SetYields(m_piRiverSideYieldChange, "Improvement_RiverSideYields", "ImprovementType", szImprovementType);364 kUtility.SetYields(m_piPrereqNatureYield, "Improvement_PrereqNatureYields", "ImprovementType", szImprovementType);365366 kUtility.SetFlavors(m_piFlavorValue, "Improvement_Flavors", "ImprovementType", szImprovementType);367368 {369 //Initialize Improvement Resource Types to number of Resources370 const int iNumResources = kUtility.MaxRows("Resources");371 m_paImprovementResource = FNEW(CvImprovementResourceInfo[iNumResources], c_eCiv5GameplayDLL, 0);372373 kUtility.InitializeArray(m_piResourceQuantityRequirements, iNumResources);374375376 std::string strResourceTypesKey = "Improvements - ResourceTypes";377 Database::Results* pResourceTypes = kUtility.GetResults(strResourceTypesKey);378 if(pResourceTypes == NULL)379 {380 pResourceTypes = kUtility.PrepareResults(strResourceTypesKey, "select Resources.ID, ResourceType, ResourceMakesValid, ResourceTrade, DiscoveryRand from Improvement_ResourceTypes inner join Resources on ResourceType = Resources.Type where ImprovementType = ?");381 }382383 std::string strYieldResultsKey = "Improvements - YieldResults";384 Database::Results* pYieldResults = kUtility.GetResults(strYieldResultsKey);385 if(pYieldResults == NULL)386 {387 pYieldResults = kUtility.PrepareResults(strYieldResultsKey, "select Yields.ID, Yield from Improvement_ResourceType_Yields inner join Yields on YieldType = Yields.Type where ImprovementType = ? and ResourceType = ?");388 }389390 pResourceTypes->Bind(1, szImprovementType, lenImprovementType, false);391392 while(pResourceTypes->Step())393 {394 const int idx = pResourceTypes->GetInt("ID");395 CvImprovementResourceInfo& pResourceInfo = m_paImprovementResource[idx];396397 const char* szResourceType = pResourceTypes->GetText("ResourceType");398 pResourceInfo.m_bResourceMakesValid = pResourceTypes->GetBool("ResourceMakesValid");399 pResourceInfo.m_bResourceTrade = pResourceTypes->GetBool("ResourceTrade");400 pResourceInfo.m_iDiscoverRand = pResourceTypes->GetInt("DiscoveryRand");401 m_piResourceQuantityRequirements[idx] = pResourceTypes->GetInt("QuantityRequirement");402403 //Populate Yields for structure404 kUtility.InitializeArray(pResourceInfo.m_piYieldChange, "Yields");405406 pYieldResults->Bind(1, szImprovementType, lenImprovementType, false);407 pYieldResults->Bind(2, szResourceType, -1, false);408 while(pYieldResults->Step())409 {410 const int yieldIdx = pYieldResults->GetInt("ID");411 const int yield = pYieldResults->GetInt("Yield");412 pResourceInfo.m_piYieldChange[yieldIdx] = yield;413 }414415 pYieldResults->Reset();416 }417418 pResourceTypes->Reset();419 }420421422 const int iNumYields = kUtility.MaxRows("Yields");423 const int iNumTechs = GC.getNumTechInfos();424 CvAssertMsg(iNumTechs > 0, "Num Tech Infos <= 0");425426427 //TechYieldChanges428 {429 kUtility.Initialize2DArray(m_ppiTechYieldChanges, iNumTechs, iNumYields);430431 std::string strKey = "Improvements - TechYieldChanges";432 Database::Results* pResults = kUtility.GetResults(strKey);433 if(pResults == NULL)434 {435 pResults = kUtility.PrepareResults(strKey, "select Yields.ID as YieldID, Technologies.ID as TechID, Yield from Improvement_TechYieldChanges inner join Yields on YieldType = Yields.Type inner join Technologies on TechType = Technologies.Type where ImprovementType = ?");436 }437438 pResults->Bind(1, szImprovementType, lenImprovementType, false);439440 while(pResults->Step())441 {442 const int yield_idx = pResults->GetInt(0);443 CvAssert(yield_idx > -1);444445 const int tech_idx = pResults->GetInt(1);446 CvAssert(tech_idx > -1);447448 const int yield = pResults->GetInt(2);449450 m_ppiTechYieldChanges[tech_idx][yield_idx] = yield;451 }452 }453454 //TechNoFreshWaterYieldChanges455 {456 kUtility.Initialize2DArray(m_ppiTechNoFreshWaterYieldChanges, iNumTechs, iNumYields);457458 std::string strKey = "Improvements - TechNoFreshWaterYieldChanges";459 Database::Results* pResults = kUtility.GetResults(strKey);460 if(pResults == NULL)461 {462 pResults = kUtility.PrepareResults(strKey, "select Yields.ID as YieldID, Technologies.ID as TechID, Yield from Improvement_TechNoFreshWaterYieldChanges inner join Yields on YieldType = Yields.Type inner join Technologies on TechType = Technologies.Type where ImprovementType = ?");463 }464465 pResults->Bind(1, szImprovementType, lenImprovementType, false);466467 while(pResults->Step())468 {469 const int yield_idx = pResults->GetInt(0);470 CvAssert(yield_idx > -1);471472 const int tech_idx = pResults->GetInt(1);473 CvAssert(tech_idx > -1);474475 const int yield = pResults->GetInt(2);476477 m_ppiTechNoFreshWaterYieldChanges[tech_idx][yield_idx] = yield;478 }479480 pResults->Reset();481482 }483484 //TechFreshWaterYieldChanges485 {486 kUtility.Initialize2DArray(m_ppiTechFreshWaterYieldChanges, iNumTechs, iNumYields);487488 std::string strKey = "Improvements - TechFreshWaterYieldChanges";489 Database::Results* pResults = kUtility.GetResults(strKey);490 if(pResults == NULL)491 {492 pResults = kUtility.PrepareResults(strKey, "select Yields.ID as YieldID, Technologies.ID as TechID, Yield from Improvement_TechFreshWaterYieldChanges inner join Yields on YieldType = Yields.Type inner join Technologies on TechType = Technologies.Type where ImprovementType = ?");493 }494495 pResults->Bind(1, szImprovementType, lenImprovementType, false);496497 while(pResults->Step())498 {499 const int yield_idx = pResults->GetInt(0);500 CvAssert(yield_idx > -1);501502 const int tech_idx = pResults->GetInt(1);503 CvAssert(tech_idx > -1);504505 const int yield = pResults->GetInt(2);506507 m_ppiTechFreshWaterYieldChanges[tech_idx][yield_idx] = yield;508 }509510 pResults->Reset();511512 }513514 //RouteYieldChanges515 {516 const int iNumRoutes = kUtility.MaxRows("Routes");517 kUtility.Initialize2DArray(m_ppiRouteYieldChanges, iNumRoutes, iNumYields);518519 std::string strKey = "Improvements - RouteYieldChanges";520 Database::Results* pResults = kUtility.GetResults(strKey);521 if(pResults == NULL)522 {523 pResults = kUtility.PrepareResults(strKey, "select Yields.ID as YieldID, Routes.ID as RouteID, Yield from Improvement_RouteYieldChanges inner join Yields on YieldType = Yields.Type inner join Routes on RouteType = Routes.Type where ImprovementType = ?;");524 }525526 pResults->Bind(1, szImprovementType, lenImprovementType, false);527528 while(pResults->Step())529 {530 const int yield_idx = pResults->GetInt(0);531 CvAssert(yield_idx > -1);532533 const int route_idx = pResults->GetInt(1);534 CvAssert(route_idx > -1);535536 const int yield = pResults->GetInt(2);537538 m_ppiRouteYieldChanges[route_idx][yield_idx] = yield;539 }540541 pResults->Reset();542543 }544545 return true;546}