Bazaar developer reference

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

Defined in
CvPromotionClasses.cpp, line 249
Class
CvPromotionEntry
Hook name
CivHooks::CvPromotionEntry_CacheResults
Overrides
CvHotKeyInfo::CacheResults(Database::Results &, CvDatabaseUtility &)

Hooks

static bool BeforeCvPromotionEntry_CacheResults(CvPromotionEntry* self, Database::Results& kResults, CvDatabaseUtility& kUtility, bool& result);static void AfterCvPromotionEntry_CacheResults(CvPromotionEntry* self, Database::Results& kResults, CvDatabaseUtility& kUtility, bool& result);static bool ReplaceCvPromotionEntry_CacheResults(bool (*original)(CvPromotionEntry*, Database::Results&, CvDatabaseUtility&), CvPromotionEntry* self, Database::Results& kResults, CvDatabaseUtility& kUtility);CivRegisterBefore<CivHooks::CvPromotionEntry_CacheResults>(host, &BeforeCvPromotionEntry_CacheResults);CivRegisterAfter<CivHooks::CvPromotionEntry_CacheResults>(host, &AfterCvPromotionEntry_CacheResults);CivRegisterReplace<CivHooks::CvPromotionEntry_CacheResults>(host, &ReplaceCvPromotionEntry_CacheResults);

Code

249bool CvPromotionEntry::CacheResults(Database::Results& kResults, CvDatabaseUtility& kUtility)250{251	if(!CvHotKeyInfo::CacheResults(kResults, kUtility))252		return false;253254	SetSound(kResults.GetText("Sound"));255256	//Basic Properties257	m_bCannotBeChosen = kResults.GetBool("CannotBeChosen");258	m_bLostWithUpgrade = kResults.GetBool("LostWithUpgrade");259	m_bNotWithUpgrade = kResults.GetBool("NotWithUpgrade");260	m_bInstaHeal = kResults.GetBool("InstaHeal");261	m_bLeader = kResults.GetBool("Leader");262	m_bBlitz = kResults.GetBool("Blitz");263	m_bAmphib = kResults.GetBool("Amphib");264	m_bRiver = kResults.GetBool("River");265	m_bEnemyRoute = kResults.GetBool("EnemyRoute");266	m_bRivalTerritory = kResults.GetBool("RivalTerritory");267	m_bMustSetUpToRangedAttack = kResults.GetBool("MustSetUpToRangedAttack");268	m_bRangedSupportFire= kResults.GetBool("RangedSupportFire");269	m_bAlwaysHeal = kResults.GetBool("AlwaysHeal");270	m_bHealOutsideFriendly = kResults.GetBool("HealOutsideFriendly");271	m_bHillsDoubleMove = kResults.GetBool("HillsDoubleMove");272	m_bIgnoreTerrainCost = kResults.GetBool("IgnoreTerrainCost");273#if defined(MOD_API_PLOT_BASED_DAMAGE)274	m_bIgnoreTerrainDamage = kResults.GetBool("IgnoreTerrainDamage");275	m_bIgnoreFeatureDamage = kResults.GetBool("IgnoreFeatureDamage");276	m_bExtraTerrainDamage = kResults.GetBool("ExtraTerrainDamage");277	m_bExtraFeatureDamage = kResults.GetBool("ExtraFeatureDamage");278#endif279#if defined(MOD_PROMOTIONS_IMPROVEMENT_BONUS)280	if (MOD_PROMOTIONS_IMPROVEMENT_BONUS) {281		m_iNearbyImprovementCombatBonus = kResults.GetInt("NearbyImprovementCombatBonus");282		m_iNearbyImprovementBonusRange = kResults.GetInt("NearbyImprovementBonusRange");283		const char* szTextVal = kResults.GetText("CombatBonusImprovement");284		if (szTextVal) {285			m_eCombatBonusImprovement = (ImprovementTypes)GC.getInfoTypeForString(szTextVal, true);286		}287	}288#endif289#if defined(MOD_PROMOTIONS_CROSS_MOUNTAINS)290	if (MOD_PROMOTIONS_CROSS_MOUNTAINS) {291		m_bCanCrossMountains = kResults.GetBool("CanCrossMountains");292	}293#endif294#if defined(MOD_PROMOTIONS_CROSS_OCEANS)295	if (MOD_PROMOTIONS_CROSS_OCEANS) {296		m_bCanCrossOceans = kResults.GetBool("CanCrossOceans");297	}298#endif299#if defined(MOD_PROMOTIONS_CROSS_ICE)300	if (MOD_PROMOTIONS_CROSS_ICE) {301		m_bCanCrossIce = kResults.GetBool("CanCrossIce");302	}303#endif304#if defined(MOD_PROMOTIONS_GG_FROM_BARBARIANS)305	if (MOD_PROMOTIONS_GG_FROM_BARBARIANS) {306		m_bGGFromBarbarians = kResults.GetBool("GGFromBarbarians");307	}308#endif309	m_bRoughTerrainEndsTurn = kResults.GetBool("RoughTerrainEndsTurn");310	m_bHoveringUnit = kResults.GetBool("HoveringUnit");311	m_bFlatMovementCost = kResults.GetBool("FlatMovementCost");312	m_bCanMoveImpassable = kResults.GetBool("CanMoveImpassable");313	m_bNoCapture = kResults.GetBool("NoCapture");314	m_bOnlyDefensive = kResults.GetBool("OnlyDefensive");315	m_bNoDefensiveBonus = kResults.GetBool("NoDefensiveBonus");316	m_bNukeImmune = kResults.GetBool("NukeImmune");317	m_bHiddenNationality = kResults.GetBool("HiddenNationality");318	m_bAlwaysHostile = kResults.GetBool("AlwaysHostile");319	m_bNoRevealMap = kResults.GetBool("NoRevealMap");320	m_bRecon = kResults.GetBool("Recon");321	m_bCanMoveAllTerrain = kResults.GetBool("CanMoveAllTerrain");322	m_bCanMoveAfterAttacking = kResults.GetBool("CanMoveAfterAttacking");323	m_bAirSweepCapable = kResults.GetBool("AirSweepCapable");324	m_bAllowsEmbarkation = kResults.GetBool("AllowsEmbarkation");325	m_bRangeAttackIgnoreLOS = kResults.GetBool("RangeAttackIgnoreLOS");326	m_bFreePillageMoves = kResults.GetBool("FreePillageMoves");327	m_bHealOnPillage = kResults.GetBool("HealOnPillage");328	m_bHealIfDefeatExcludesBarbarians = kResults.GetBool("HealIfDestroyExcludesBarbarians");329	m_bEmbarkedAllWater = kResults.GetBool("EmbarkedAllWater");330#if defined(MOD_PROMOTIONS_DEEP_WATER_EMBARKATION)331	m_bEmbarkedDeepWater = kResults.GetBool("EmbarkedDeepWater");332#endif333	m_bCityAttackOnly = kResults.GetBool("CityAttackOnly");334	m_bCaptureDefeatedEnemy = kResults.GetBool("CaptureDefeatedEnemy");335	m_bIgnoreGreatGeneralBenefit = kResults.GetBool("IgnoreGreatGeneralBenefit");336	m_bIgnoreZOC = kResults.GetBool("IgnoreZOC");337	m_bHasPostCombatPromotions = kResults.GetBool("HasPostCombatPromotions");338	m_bPostCombatPromotionsExclusive = kResults.GetBool("PostCombatPromotionsExclusive");339	m_bSapper = kResults.GetBool("Sapper");340	m_bCanHeavyCharge = kResults.GetBool("HeavyCharge");341342	m_iVisibilityChange = kResults.GetInt("VisibilityChange");343#if defined(MOD_PROMOTIONS_VARIABLE_RECON)344	m_iReconChange = kResults.GetInt("ReconChange");345#endif346	m_iMovesChange = kResults.GetInt("MovesChange");347	m_iMoveDiscountChange = kResults.GetInt("MoveDiscountChange");348	m_iRangeChange = kResults.GetInt("RangeChange");349	m_iRangedAttackModifier = kResults.GetInt("RangedAttackModifier");350	m_iInterceptionCombatModifier = kResults.GetInt("InterceptionCombatModifier");351	m_iInterceptionDefenseDamageModifier = kResults.GetInt("InterceptionDefenseDamageModifier");352	m_iAirSweepCombatModifier = kResults.GetInt("AirSweepCombatModifier");353	m_iInterceptChanceChange = kResults.GetInt("InterceptChanceChange");354	m_iNumInterceptionChange = kResults.GetInt("NumInterceptionChange");355	m_iEvasionChange = kResults.GetInt("EvasionChange");356	m_iCargoChange = kResults.GetInt("CargoChange");357	m_iEnemyHealChange = kResults.GetInt("EnemyHealChange");358	m_iNeutralHealChange = kResults.GetInt("NeutralHealChange");359	m_iFriendlyHealChange = kResults.GetInt("FriendlyHealChange");360	m_iSameTileHealChange = kResults.GetInt("SameTileHealChange");361	m_iAdjacentTileHealChange = kResults.GetInt("AdjacentTileHealChange");362	m_iEnemyDamageChance = kResults.GetInt("EnemyDamageChance");363	m_iNeutralDamageChance = kResults.GetInt("NeutralDamageChance");364	m_iEnemyDamage = kResults.GetInt("EnemyDamage");365	m_iNeutralDamage = kResults.GetInt("NeutralDamage");366	m_iCombatPercent = kResults.GetInt("CombatPercent");367	m_iCityAttackPercent = kResults.GetInt("CityAttack");368	m_iCityDefensePercent = kResults.GetInt("CityDefense");369	m_iRangedDefenseMod = kResults.GetInt("RangedDefenseMod");370	m_iHillsAttackPercent = kResults.GetInt("HillsAttack");371	m_iHillsDefensePercent = kResults.GetInt("HillsDefense");372	m_iOpenAttackPercent = kResults.GetInt("OpenAttack");373	m_iOpenRangedAttackMod = kResults.GetInt("OpenRangedAttackMod");374	m_iRoughAttackPercent = kResults.GetInt("RoughAttack");375	m_iRoughRangedAttackMod = kResults.GetInt("RoughRangedAttackMod");376	m_iAttackFortifiedMod = kResults.GetInt("AttackFortifiedMod");377	m_iAttackWoundedMod = kResults.GetInt("AttackWoundedMod");378	m_iFlankAttackModifier = kResults.GetInt("FlankAttackModifier");379	m_iNearbyEnemyCombatMod = kResults.GetInt("NearbyEnemyCombatMod");380	m_iNearbyEnemyCombatRange = kResults.GetInt("NearbyEnemyCombatRange");381	m_iOpenDefensePercent = kResults.GetInt("OpenDefense");382	m_iRoughDefensePercent = kResults.GetInt("RoughDefense");383	m_iExtraAttacks = kResults.GetInt("ExtraAttacks");384	m_bGreatGeneral = kResults.GetBool("GreatGeneral");385	m_bGreatAdmiral = kResults.GetBool("GreatAdmiral");386#if defined(MOD_PROMOTIONS_AURA_CHANGE)387	if (MOD_PROMOTIONS_AURA_CHANGE) {388		m_iAuraRangeChange = kResults.GetInt("AuraRangeChange");389		m_iAuraEffectChange = kResults.GetInt("AuraEffectChange");390	}391#endif392	m_iGreatGeneralModifier = kResults.GetInt("GreatGeneralModifier");393	m_bGreatGeneralReceivesMovement = kResults.GetBool("GreatGeneralReceivesMovement");394	m_iGreatGeneralCombatModifier = kResults.GetInt("GreatGeneralCombatModifier");395	m_iFriendlyLandsModifier = kResults.GetInt("FriendlyLandsModifier");396	m_iFriendlyLandsAttackModifier = kResults.GetInt("FriendlyLandsAttackModifier");397	m_iOutsideFriendlyLandsModifier = kResults.GetInt("OutsideFriendlyLandsModifier");398#if defined(MOD_UNITS_NO_SUPPLY)399	if (MOD_UNITS_NO_SUPPLY) {400		m_bNoSupply = (kResults.GetInt("NoSupply") != 0);401	}402#endif403#if defined(MOD_UNITS_MAX_HP)404	if (MOD_UNITS_MAX_HP) {405		m_iMaxHitPointsChange = kResults.GetInt("MaxHitPointsChange");406		m_iMaxHitPointsModifier = kResults.GetInt("MaxHitPointsModifier");407	}408#endif409	m_iUpgradeDiscount = kResults.GetInt("UpgradeDiscount");410	m_iExperiencePercent = kResults.GetInt("ExperiencePercent");411	m_iAdjacentMod = kResults.GetInt("AdjacentMod");412	m_iAttackMod = kResults.GetInt("AttackMod");413	m_iDefenseMod = kResults.GetInt("DefenseMod");414	m_iDropRange = kResults.GetInt("DropRange");415	m_iExtraNavalMoves = kResults.GetInt("ExtraNavalMovement");416	m_iHPHealedIfDefeatEnemy = kResults.GetInt("HPHealedIfDestroyEnemy");417	m_iGoldenAgeValueFromKills = kResults.GetInt("GoldenAgeValueFromKills");418	m_iExtraWithdrawal = kResults.GetInt("ExtraWithdrawal");419	m_iEmbarkExtraVisibility = kResults.GetInt("EmbarkExtraVisibility");420	m_iEmbarkDefenseModifier = kResults.GetInt("EmbarkDefenseModifier");421	m_iCapitalDefenseModifier = kResults.GetInt("CapitalDefenseModifier");422	m_iCapitalDefenseFalloff = kResults.GetInt("CapitalDefenseFalloff");423	m_iCityAttackPlunderModifier = kResults.GetInt("CityAttackPlunderModifier");424	m_iReligiousStrengthLossRivalTerritory = kResults.GetInt("ReligiousStrengthLossRivalTerritory");425	m_iTradeMissionInfluenceModifier = kResults.GetInt("TradeMissionInfluenceModifier");426	m_iTradeMissionGoldModifier = kResults.GetInt("TradeMissionGoldModifier");427428	//References429	const char* szLayerAnimationPath = kResults.GetText("LayerAnimationPath");430	m_iLayerAnimationPath = GC.getInfoTypeForString(szLayerAnimationPath, true);431432	const char* szTechPrereq = kResults.GetText("TechPrereq");433	m_iTechPrereq = GC.getInfoTypeForString(szTechPrereq, true);434435	const char* szInvisible = kResults.GetText("Invisible");436	m_iInvisibleType = GC.getInfoTypeForString(szInvisible, true);437438	const char* szSeeInvisible = kResults.GetText("SeeInvisible");439	m_iSeeInvisibleType = GC.getInfoTypeForString(szSeeInvisible, true);440441	const char* szPromotionPrereq = kResults.GetText("PromotionPrereq");442	m_iPrereqPromotion = GC.getInfoTypeForString(szPromotionPrereq, true);443444	const char* szPromotionPrereqOr1 = kResults.GetText("PromotionPrereqOr1");445	m_iPrereqOrPromotion1 = GC.getInfoTypeForString(szPromotionPrereqOr1, true);446447	const char* szPromotionPrereqOr2 = kResults.GetText("PromotionPrereqOr2");448	m_iPrereqOrPromotion2 = GC.getInfoTypeForString(szPromotionPrereqOr2, true);449450	const char* szPromotionPrereqOr3 = kResults.GetText("PromotionPrereqOr3");451	m_iPrereqOrPromotion3 = GC.getInfoTypeForString(szPromotionPrereqOr3, true);452453	const char* szPromotionPrereqOr4 = kResults.GetText("PromotionPrereqOr4");454	m_iPrereqOrPromotion4 = GC.getInfoTypeForString(szPromotionPrereqOr4, true);455456	const char* szPromotionPrereqOr5 = kResults.GetText("PromotionPrereqOr5");457	m_iPrereqOrPromotion5 = GC.getInfoTypeForString(szPromotionPrereqOr5, true);458459	const char* szPromotionPrereqOr6 = kResults.GetText("PromotionPrereqOr6");460	m_iPrereqOrPromotion6 = GC.getInfoTypeForString(szPromotionPrereqOr6, true);461462	const char* szPromotionPrereqOr7 = kResults.GetText("PromotionPrereqOr7");463	m_iPrereqOrPromotion7 = GC.getInfoTypeForString(szPromotionPrereqOr7, true);464465	const char* szPromotionPrereqOr8 = kResults.GetText("PromotionPrereqOr8");466	m_iPrereqOrPromotion8 = GC.getInfoTypeForString(szPromotionPrereqOr8, true);467468	const char* szPromotionPrereqOr9 = kResults.GetText("PromotionPrereqOr9");469	m_iPrereqOrPromotion9 = GC.getInfoTypeForString(szPromotionPrereqOr9, true);470471	//Arrays472	const int iNumUnitClasses = kUtility.MaxRows("UnitClasses");473	const int iNumTerrains = GC.getNumTerrainInfos();474	const int iNumFeatures = GC.getNumFeatureInfos();475	const int iNumDomains = kUtility.MaxRows("Domains");476	DEBUG_VARIABLE(iNumDomains);477	const int iNumUnitCombatClasses = kUtility.MaxRows("UnitCombatInfos");478	const int iNumUnitTypes = kUtility.MaxRows("Units");479480	const char* szPromotionType = GetType();481482	//UnitPromotions_Terrains483	{484		kUtility.InitializeArray(m_piTerrainAttackPercent, iNumTerrains, 0);485		kUtility.InitializeArray(m_piTerrainDefensePercent, iNumTerrains, 0);486		kUtility.InitializeArray(m_piTerrainPassableTech, iNumTerrains, NO_TECH);487		kUtility.InitializeArray(m_pbTerrainDoubleMove, iNumTerrains, false);488#if defined(MOD_PROMOTIONS_HALF_MOVE)489		kUtility.InitializeArray(m_pbTerrainHalfMove, iNumTerrains, false);490#endif491		kUtility.InitializeArray(m_pbTerrainImpassable, iNumTerrains, false);492493		std::string sqlKey = "UnitPromotions_Terrains";494		Database::Results* pResults = kUtility.GetResults(sqlKey);495		if(pResults == NULL)496		{497			const char* szSQL = "select Terrains.ID as TerrainID, coalesce(Technologies.ID, -1) as PassableTechID, UnitPromotions_Terrains.* from UnitPromotions_Terrains inner join Terrains on TerrainType = Terrains.Type left join Technologies on PassableTech = Technologies.Type where PromotionType = ?";498			pResults = kUtility.PrepareResults(sqlKey, szSQL);499		}500501		CvAssert(pResults);502		if(!pResults) return false;503504		pResults->Bind(1, szPromotionType);505506		while(pResults->Step())507		{508			const int iTerrainID = pResults->GetInt("TerrainID");509			CvAssert(iTerrainID > -1 && iTerrainID < iNumTerrains);510511			const int iTerrainAttack = pResults->GetInt("Attack");512			m_piTerrainAttackPercent[iTerrainID] = iTerrainAttack;513514			const int iTerrainDefense = pResults->GetInt("Defense");515			m_piTerrainDefensePercent[iTerrainID] = iTerrainDefense;516517			const bool bDoubleMove = pResults->GetBool("DoubleMove");518			m_pbTerrainDoubleMove[iTerrainID] = bDoubleMove;519520#if defined(MOD_PROMOTIONS_HALF_MOVE)521			const bool bHalfMove = pResults->GetBool("HalfMove");522			m_pbTerrainHalfMove[iTerrainID] = bHalfMove;523#endif524525			const bool bImpassable = pResults->GetBool("Impassable");526			m_pbTerrainImpassable[iTerrainID] = bImpassable;527528			const int iPassableTechID = pResults->GetInt("PassableTechID");529			m_piTerrainPassableTech[iTerrainID] = iPassableTechID;530		}531	}532533	//UnitPromotions_Features534	{535		kUtility.InitializeArray(m_piFeatureAttackPercent, iNumFeatures, 0);536		kUtility.InitializeArray(m_piFeatureDefensePercent, iNumFeatures, 0);537		kUtility.InitializeArray(m_piFeaturePassableTech, iNumFeatures, NO_TECH);538		kUtility.InitializeArray(m_pbFeatureDoubleMove, iNumFeatures, false);539#if defined(MOD_PROMOTIONS_HALF_MOVE)540		kUtility.InitializeArray(m_pbFeatureHalfMove, iNumFeatures, false);541#endif542		kUtility.InitializeArray(m_pbFeatureImpassable, iNumFeatures, false);543544		std::string sqlKey = "UnitPromotions_Features";545		Database::Results* pResults = kUtility.GetResults(sqlKey);546		if(pResults == NULL)547		{548			const char* szSQL = "select Features.ID as FeatureID, coalesce(Technologies.ID, -1) as PassableTechID, UnitPromotions_Features.* from UnitPromotions_Features inner join Features on FeatureType = Features.Type left join Technologies on PassableTech = Technologies.Type where PromotionType = ?";549			pResults = kUtility.PrepareResults(sqlKey, szSQL);550		}551552		CvAssert(pResults);553		if(!pResults) return false;554555		pResults->Bind(1, szPromotionType);556557		while(pResults->Step())558		{559			const int iFeatureID = pResults->GetInt("FeatureID");560			CvAssert(iFeatureID > -1 && iFeatureID < iNumFeatures);561562			const int iFeatureAttack = pResults->GetInt("Attack");563			m_piFeatureAttackPercent[iFeatureID] = iFeatureAttack;564565			const int iFeatureDefense = pResults->GetInt("Defense");566			m_piFeatureDefensePercent[iFeatureID] = iFeatureDefense;567568			const bool bDoubleMove = pResults->GetBool("DoubleMove");569			m_pbFeatureDoubleMove[iFeatureID] = bDoubleMove;570571#if defined(MOD_PROMOTIONS_HALF_MOVE)572			const bool bHalfMove = pResults->GetBool("HalfMove");573			m_pbFeatureHalfMove[iFeatureID] = bHalfMove;574#endif575576			const bool bImpassable = pResults->GetBool("Impassable");577			m_pbFeatureImpassable[iFeatureID] = bImpassable;578579			const int iPassableTech = pResults->GetInt("PassableTechID");580			m_piFeaturePassableTech[iFeatureID] = iPassableTech;581		}582	}583584#if defined(MOD_API_UNIFIED_YIELDS)585	//UnitPromotions_YieldFromKills586	{587		kUtility.InitializeArray(m_piYieldFromKills, NUM_YIELD_TYPES, 0);588589		std::string sqlKey = "UnitPromotions_YieldFromKills";590		Database::Results* pResults = kUtility.GetResults(sqlKey);591		if(pResults == NULL)592		{593			const char* szSQL = "select Yields.ID as YieldID, UnitPromotions_YieldFromKills.* from UnitPromotions_YieldFromKills inner join Yields on YieldType = Yields.Type where PromotionType = ?";594			pResults = kUtility.PrepareResults(sqlKey, szSQL);595		}596597		CvAssert(pResults);598		if(!pResults) return false;599600		pResults->Bind(1, szPromotionType);601602		while(pResults->Step())603		{604			const int iYieldID = pResults->GetInt("YieldID");605			CvAssert(iYieldID > -1 && iYieldID < iNumYields);606607			const int iYield = pResults->GetInt("Yield");608			m_piYieldFromKills[iYieldID] = iYield;609		}610	}611612	//UnitPromotions_YieldFromBarbarianKills613	{614		kUtility.InitializeArray(m_piYieldFromBarbarianKills, NUM_YIELD_TYPES, 0);615616		std::string sqlKey = "UnitPromotions_YieldFromBarbarianKills";617		Database::Results* pResults = kUtility.GetResults(sqlKey);618		if(pResults == NULL)619		{620			const char* szSQL = "select Yields.ID as YieldID, UnitPromotions_YieldFromBarbarianKills.* from UnitPromotions_YieldFromBarbarianKills inner join Yields on YieldType = Yields.Type where PromotionType = ?";621			pResults = kUtility.PrepareResults(sqlKey, szSQL);622		}623624		CvAssert(pResults);625		if(!pResults) return false;626627		pResults->Bind(1, szPromotionType);628629		while(pResults->Step())630		{631			const int iYieldID = pResults->GetInt("YieldID");632			CvAssert(iYieldID > -1 && iYieldID < iNumYields);633634			const int iYield = pResults->GetInt("Yield");635			m_piYieldFromBarbarianKills[iYieldID] = iYield;636		}637	}638#endif639640	//UnitPromotions_UnitClasses641	{642		kUtility.InitializeArray(m_piUnitClassModifierPercent, iNumUnitClasses, 0);643		kUtility.InitializeArray(m_piUnitClassAttackModifier, iNumUnitClasses, 0);644		kUtility.InitializeArray(m_piUnitClassDefenseModifier, iNumUnitClasses, 0);645646		std::string sqlKey = "UnitPromotions_UnitClasses";647		Database::Results* pResults = kUtility.GetResults(sqlKey);648		if(pResults == NULL)649		{650			const char* szSQL = "select UnitClasses.ID, Modifier, Attack, Defense from UnitPromotions_UnitClasses inner join UnitClasses on UnitClassType = UnitClasses.Type where PromotionType = ?";651			pResults = kUtility.PrepareResults(sqlKey, szSQL);652		}653654		CvAssert(pResults);655		if(!pResults) return false;656657		pResults->Bind(1, szPromotionType);658659		while(pResults->Step())660		{661			const int iUnitClassID = pResults->GetInt(0);662			CvAssert(iUnitClassID > -1 && iUnitClassID  < iNumUnitClasses);663664			const int iModifier = pResults->GetInt("Modifier");665			m_piUnitClassModifierPercent[iUnitClassID] = iModifier;666667			const int iAttack = pResults->GetInt("Attack");668			m_piUnitClassAttackModifier[iUnitClassID] = iAttack;669670			const int iDefense = pResults->GetInt("Defense");671			m_piUnitClassDefenseModifier[iUnitClassID] = iDefense;672		}673674		pResults->Reset();675	}676677	//UnitPromotions_Domains678	{679		kUtility.InitializeArray(m_piDomainModifierPercent, NUM_DOMAIN_TYPES, 0);680681		std::string sqlKey = "m_piDomainModifierPercent";682		Database::Results* pResults = kUtility.GetResults(sqlKey);683		if(pResults == NULL)684		{685			const char* szSQL = "select Domains.ID, Modifier from UnitPromotions_Domains inner join Domains on DomainType = Domains.Type where PromotionType = ?;";686			pResults = kUtility.PrepareResults(sqlKey, szSQL);687		}688689		CvAssert(pResults);690		if(!pResults) return false;691692		pResults->Bind(1, szPromotionType);693694		while(pResults->Step())695		{696			const int iDomainID = pResults->GetInt(0);697			CvAssert(iDomainID > -1 && iDomainID < iNumDomains);698699			const int iDomainMod = pResults->GetInt(1);700			if (iDomainID > -1 && iDomainID < NUM_DOMAIN_TYPES)701				m_piDomainModifierPercent[iDomainID] = iDomainMod;702		}703704		pResults->Reset();705	}706707	//UnitPromotions_UnitCombatMods708	{709		kUtility.InitializeArray(m_piUnitCombatModifierPercent, iNumUnitCombatClasses, 0);710711		std::string sqlKey = "m_piUnitCombatModifierPercent";712		Database::Results* pResults = kUtility.GetResults(sqlKey);713		if(pResults == NULL)714		{715			const char* szSQL = "select UnitCombatInfos.ID, Modifier from UnitPromotions_UnitCombatMods inner join UnitCombatInfos on UnitCombatInfos.Type = UnitCombatType where PromotionType = ?;";716			pResults = kUtility.PrepareResults(sqlKey, szSQL);717		}718719		CvAssert(pResults);720		if(!pResults) return false;721722		pResults->Bind(1, szPromotionType);723724		while(pResults->Step())725		{726			const int iUnitCombatID = pResults->GetInt(0);727			CvAssert(iUnitCombatID > -1 && iUnitCombatID < iNumUnitCombatClasses);728729			const int iUnitCombatMod = pResults->GetInt(1);730			m_piUnitCombatModifierPercent[iUnitCombatID] = iUnitCombatMod;731		}732733		pResults->Reset();734	}735736	//UnitPromotions_UnitCombats737	{738		kUtility.InitializeArray(m_pbUnitCombat, iNumUnitCombatClasses, false);739740		std::string sqlKey = "m_pbUnitCombat";741		Database::Results* pResults = kUtility.GetResults(sqlKey);742		if(pResults == NULL)743		{744			const char* szSQL = "select UnitCombatInfos.ID from UnitPromotions_UnitCombats inner join UnitCombatInfos On UnitCombatInfos.Type = UnitCombatType where PromotionType = ?";745			pResults = kUtility.PrepareResults(sqlKey, szSQL);746		}747748		CvAssert(pResults);749		if(!pResults) return false;750751		pResults->Bind(1, szPromotionType);752753		while(pResults->Step())754		{755			const int iUnitCombatInfoID = pResults->GetInt(0);756			CvAssert(iUnitCombatInfoID < iNumUnitCombatClasses);757758			m_pbUnitCombat[iUnitCombatInfoID] = true;759		}760761		pResults->Reset();762	}763764	//UnitPromotions_CivilianUnitType765	{766		kUtility.InitializeArray(m_pbCivilianUnitType, iNumUnitTypes, false);767768		std::string sqlKey = "m_pbCivilianUnitType";769		Database::Results* pResults = kUtility.GetResults(sqlKey);770		if(pResults == NULL)771		{772			const char* szSQL = "select Units.ID from UnitPromotions_CivilianUnitType inner join Units On Units.Type = UnitType where PromotionType = ?";773			pResults = kUtility.PrepareResults(sqlKey, szSQL);774		}775776		CvAssert(pResults);777		if(!pResults) return false;778779		pResults->Bind(1, szPromotionType);780781		while(pResults->Step())782		{783			const int iUnit = (UnitTypes)pResults->GetInt(0);784			CvAssert(iUnit < iNumUnitTypes);785786			m_pbCivilianUnitType[iUnit] = true;787		}788789		pResults->Reset();790	}791792#if defined(MOD_PROMOTIONS_UNIT_NAMING)793	if (MOD_PROMOTIONS_UNIT_NAMING)794	{795		// We don't store the unit names, only if the promotion gives a name, we will look-up the actual name as it's needed796		kUtility.PopulateArrayByExistence(m_pbUnitName,797			"Units",798			"UnitPromotions_UnitName",799			"UnitType",800			"PromotionType",801			szPromotionType);802	}803#endif804805	kUtility.PopulateArrayByExistence(m_pbPostCombatRandomPromotion,806		"UnitPromotions",807		"UnitPromotions_PostCombatRandomPromotion",808		"NewPromotion",809		"PromotionType",810		szPromotionType);811812	return true;813}

Calls