Bazaar developer reference

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

Defined in
CvImprovementClasses.cpp, line 216
Class
CvImprovementEntry
Hook name
CivHooks::CvImprovementEntry_CacheResults
Overrides
CvBaseInfo::CacheResults(Database::Results &, CvDatabaseUtility &)

Hooks

static bool BeforeCvImprovementEntry_CacheResults(CvImprovementEntry* self, Database::Results& kResults, CvDatabaseUtility& kUtility, bool& result);static void AfterCvImprovementEntry_CacheResults(CvImprovementEntry* self, Database::Results& kResults, CvDatabaseUtility& kUtility, bool& result);static bool ReplaceCvImprovementEntry_CacheResults(bool (*original)(CvImprovementEntry*, Database::Results&, CvDatabaseUtility&), CvImprovementEntry* self, Database::Results& kResults, CvDatabaseUtility& kUtility);CivRegisterBefore<CivHooks::CvImprovementEntry_CacheResults>(host, &BeforeCvImprovementEntry_CacheResults);CivRegisterAfter<CivHooks::CvImprovementEntry_CacheResults>(host, &AfterCvImprovementEntry_CacheResults);CivRegisterReplace<CivHooks::CvImprovementEntry_CacheResults>(host, &ReplaceCvImprovementEntry_CacheResults);

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}

Calls