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}