Hooks
static bool BeforeCvFeatureInfo_CacheResults(CvFeatureInfo* self, Database::Results& kResults, CvDatabaseUtility& kUtility, bool& result);static void AfterCvFeatureInfo_CacheResults(CvFeatureInfo* self, Database::Results& kResults, CvDatabaseUtility& kUtility, bool& result);static bool ReplaceCvFeatureInfo_CacheResults(bool (*original)(CvFeatureInfo*, Database::Results&, CvDatabaseUtility&), CvFeatureInfo* self, Database::Results& kResults, CvDatabaseUtility& kUtility);CivRegisterBefore<CivHooks::CvFeatureInfo_CacheResults>(host, &BeforeCvFeatureInfo_CacheResults);CivRegisterAfter<CivHooks::CvFeatureInfo_CacheResults>(host, &AfterCvFeatureInfo_CacheResults);CivRegisterReplace<CivHooks::CvFeatureInfo_CacheResults>(host, &ReplaceCvFeatureInfo_CacheResults);
Code
5172bool CvFeatureInfo::CacheResults(Database::Results& kResults, CvDatabaseUtility& kUtility)5173{5174 if(!CvBaseInfo::CacheResults(kResults, kUtility))5175 return false;51765177 const char* szArtDefineTag = kResults.GetText("ArtDefineTag");5178 setArtDefineTag(szArtDefineTag);51795180 // Basic properties5181 m_iStartingLocationWeight = kResults.GetInt("StartingLocationWeight");5182 m_iMovementCost = kResults.GetInt("Movement");5183 m_iSeeThroughChange = kResults.GetInt("SeeThrough");5184 m_iDefenseModifier = kResults.GetInt("Defense");5185 m_iInfluenceCost = kResults.GetInt("InfluenceCost");5186 m_iAdvancedStartRemoveCost = kResults.GetInt("AdvancedStartRemoveCost");5187 m_iTurnDamage = kResults.GetInt("TurnDamage");5188#if defined(MOD_API_PLOT_BASED_DAMAGE)5189 m_iExtraTurnDamage = MOD_API_PLOT_BASED_DAMAGE ? kResults.GetInt("ExtraTurnDamage") : 0;5190#endif5191 m_iAppearanceProbability = kResults.GetInt("AppearanceProbability");5192 m_iDisappearanceProbability = kResults.GetInt("DisappearanceProbability");5193 m_iGrowthProbability = kResults.GetInt("Growth");5194 m_iFirstFinderGold = kResults.GetInt("FirstFinderGold");5195 m_iInBorderHappiness = kResults.GetInt("InBorderHappiness");5196 m_iOccurrenceFrequency = kResults.GetInt("OccurrenceFrequency");51975198 const char* szTextVal;5199 szTextVal = kResults.GetText("AdjacentUnitFreePromotion");5200 m_iAdjacentUnitFreePromotion = GC.getInfoTypeForString(szTextVal, true);52015202 const char* szTerrainType = kResults.GetText("GrowthTerrainType");5203 if(szTerrainType != NULL)5204 {5205 m_iGrowthTerrainType = GC.getInfoTypeForString(szTerrainType, true);5206 }52075208 m_iEffectProbability = kResults.GetInt("EffectProbability");5209 m_bYieldNotAdditive = kResults.GetBool("YieldNotAdditive");5210 m_bNoCoast = kResults.GetBool("NoCoast");5211 m_bNoRiver = kResults.GetBool("NoRiver");5212 m_bNoAdjacent = kResults.GetBool("NoAdjacent");5213 m_bRequiresFlatlands = kResults.GetBool("RequiresFlatlands");5214 m_bRequiresRiver = kResults.GetBool("RequiresRiver");5215 m_bAddsFreshWater = kResults.GetBool("AddsFreshWater");5216 m_bImpassable = kResults.GetBool("Impassable");5217 m_bNoCity = kResults.GetBool("NoCity");5218 m_bNoImprovement = kResults.GetBool("NoImprovement");5219 m_bVisibleAlways = kResults.GetBool("VisibleAlways");5220 m_bNukeImmune = kResults.GetBool("NukeImmune");5221 m_bRough = kResults.GetBool("Rough");5222 m_bNaturalWonder = kResults.GetBool("NaturalWonder");52235224 m_strEffectType = kResults.GetText("EffectType");5225 m_strEffectTypeTag = kResults.GetText("EffectTypeTag");52265227 const char* szWorldsoundscapeAudioScript = kResults.GetText("WorldSoundscapeAudioScript");5228 if(szWorldsoundscapeAudioScript != NULL)5229 {5230 m_iWorldSoundscapeScriptId = gDLL->GetAudioTagIndex(szWorldsoundscapeAudioScript, AUDIOTAG_SOUNDSCAPE);5231 }5232 else5233 {5234 m_iWorldSoundscapeScriptId = -1;5235 Remark(1, "Warning: Missing soundscape definition in XML for feature: '%s'", GetType());5236 }52375238 // Array properties5239 const char* szFeatureType = GetType();5240 kUtility.SetYields(m_piYieldChange, "Feature_YieldChanges", "FeatureType", szFeatureType);5241 kUtility.SetYields(m_piRiverYieldChange, "Feature_RiverYieldChanges", "FeatureType", szFeatureType);5242 kUtility.SetYields(m_piHillsYieldChange, "Feature_HillsYieldChanges", "FeatureType", szFeatureType);5243#if defined(MOD_API_UNIFIED_YIELDS)5244 kUtility.SetYields(m_piCoastalLandYieldChange, "Feature_CoastalLandYields", "FeatureType", szFeatureType);5245 kUtility.SetYields(m_piFreshWaterChange, "Feature_FreshWaterYields", "FeatureType", szFeatureType);52465247 const int iNumYields = kUtility.MaxRows("Yields");5248 const int iNumTechs = GC.getNumTechInfos();5249 CvAssertMsg(iNumTechs > 0, "Num Tech Infos <= 0");52505251 //TechYieldChanges5252 if (MOD_API_UNIFIED_YIELDS) {5253 kUtility.Initialize2DArray(m_ppiTechYieldChanges, iNumTechs, iNumYields);52545255 std::string strKey = "Features - TechYieldChanges";5256 Database::Results* pResults = kUtility.GetResults(strKey);5257 if(pResults == NULL)5258 {5259 pResults = kUtility.PrepareResults(strKey, "select Yields.ID as YieldID, Technologies.ID as TechID, Yield from Feature_TechYieldChanges inner join Yields on YieldType = Yields.Type inner join Technologies on TechType = Technologies.Type where FeatureType = ?");5260 }52615262 pResults->Bind(1, szFeatureType, strlen(szFeatureType), false);52635264 while(pResults->Step())5265 {5266 const int yield_idx = pResults->GetInt(0);5267 CvAssert(yield_idx > -1);52685269 const int tech_idx = pResults->GetInt(1);5270 CvAssert(tech_idx > -1);52715272 const int yield = pResults->GetInt(2);52735274 m_ppiTechYieldChanges[tech_idx][yield_idx] = yield;5275 }5276 }5277#endif52785279 kUtility.PopulateArrayByExistence(m_pbTerrain, "Terrains", "Feature_TerrainBooleans", "TerrainType", "FeatureType", szFeatureType);52805281 // Determine of this feature is clearable - set each time the game is started5282 m_bClearable = false;52835284 return true;5285}