Code
173bool CvUnitEntry::CacheResults(Database::Results& kResults, CvDatabaseUtility& kUtility)174{175 if(!CvBaseInfo::CacheResults(kResults, kUtility))176 return false;177178 //Basic Properties179 m_iProductionCost = kResults.GetInt("Cost");180 m_iFaithCost = kResults.GetInt("FaithCost");181 m_bRequiresFaithPurchaseEnabled = kResults.GetBool("RequiresFaithPurchaseEnabled");182#if defined(MOD_GLOBAL_EXCLUDE_FROM_GIFTS)183 if (MOD_GLOBAL_EXCLUDE_FROM_GIFTS) {184 m_bNoMinorGifts = kResults.GetBool("NoMinorGifts");185 }186#endif187 m_bPurchaseOnly = kResults.GetBool("PurchaseOnly");188 m_bMoveAfterPurchase = kResults.GetBool("MoveAfterPurchase");189#if defined(MOD_GLOBAL_MOVE_AFTER_UPGRADE)190 if (MOD_GLOBAL_MOVE_AFTER_UPGRADE) {191 m_bMoveAfterUpgrade = kResults.GetBool("MoveAfterUpgrade");192 }193#endif194#if defined(MOD_GLOBAL_CANNOT_EMBARK)195 if (MOD_GLOBAL_CANNOT_EMBARK) {196 m_bCannotEmbark = kResults.GetBool("CannotEmbark");197 }198#endif199 m_iHurryCostModifier = kResults.GetInt("HurryCostModifier");200 m_iAdvancedStartCost = kResults.GetInt("AdvancedStartCost");201 m_iMinAreaSize = kResults.GetInt("MinAreaSize");202 m_iMoves = kResults.GetInt("Moves");203 m_bMoves = kResults.GetInt("Immobile");204 m_iBaseSightRange = kResults.GetInt("BaseSightRange");205 m_iRange = kResults.GetInt("Range");206 m_iAirInterceptRange = kResults.GetInt("AirInterceptRange");207 m_iAirUnitCap = kResults.GetInt("AirUnitCap");208 m_iNukeDamageLevel = kResults.GetInt("NukeDamageLevel");209 m_iWorkRate = kResults.GetInt("WorkRate");210 m_iNumFreeTechs = kResults.GetInt("NumFreeTechs");211 m_iBaseBeakersTurnsToCount = kResults.GetInt("BaseBeakersTurnsToCount");212 m_iBaseCultureTurnsToCount = kResults.GetInt("BaseCultureTurnsToCount");213 m_iBaseHurry = kResults.GetInt("BaseHurry");214 m_iHurryMultiplier = kResults.GetInt("HurryMultiplier");215 m_bRushBuilding= kResults.GetInt("RushBuilding");216 m_iBaseGold = kResults.GetInt("BaseGold");217 m_iNumGoldPerEra = kResults.GetInt("NumGoldPerEra");218 m_bSpreadReligion = kResults.GetBool("SpreadReligion");219 m_bRemoveHeresy = kResults.GetBool("RemoveHeresy");220 m_iReligionSpreads = kResults.GetInt("ReligionSpreads");221 m_iReligiousStrength = kResults.GetInt("ReligiousStrength");222 m_bFoundReligion = kResults.GetBool("FoundReligion");223 m_bRequiresEnhancedReligion = kResults.GetBool("RequiresEnhancedReligion");224 m_bProhibitsSpread = kResults.GetBool("ProhibitsSpread");225 m_bCanBuyCityState = kResults.GetBool("CanBuyCityState");226#if defined(MOD_GLOBAL_SEPARATE_GREAT_ADMIRAL)227 if (MOD_GLOBAL_SEPARATE_GREAT_ADMIRAL) {228 m_bCanRepairFleet = kResults.GetBool("CanRepairFleet");229 m_bCanChangePort = kResults.GetBool("CanChangePort");230 }231#endif232 m_iCombat = kResults.GetInt("Combat");233 m_iCombatLimit = kResults.GetInt("CombatLimit");234 m_iRangedCombat = kResults.GetInt("RangedCombat");235 m_iRangedCombatLimit = kResults.GetInt("RangedCombatLimit");236#if defined(MOD_UNITS_NO_SUPPLY)237 if (MOD_UNITS_NO_SUPPLY) {238 m_bNoSupply = (kResults.GetInt("NoSupply") != 0);239 }240#endif241#if defined(MOD_UNITS_MAX_HP)242 if (MOD_UNITS_MAX_HP) {243 m_iMaxHitPoints = kResults.GetInt("MaxHitPoints");244 } else {245 m_iMaxHitPoints = GC.getMAX_HIT_POINTS();246 }247#endif248 m_iXPValueAttack = kResults.GetInt("XPValueAttack");249 m_iXPValueDefense = kResults.GetInt("XPValueDefense");250 m_iConscriptionValue = kResults.GetInt("Conscription");251 m_iExtraMaintenanceCost = kResults.GetInt("ExtraMaintenanceCost");252 m_bNoMaintenance = kResults.GetBool("NoMaintenance");253 m_iUnhappiness = kResults.GetInt("Unhappiness");254 m_iUnitFlagIconOffset = kResults.GetInt("UnitFlagIconOffset");255 m_iUnitPortraitOffset = kResults.GetInt("PortraitIndex");256 m_iLeaderExperience = kResults.GetInt("LeaderExperience");257 m_bFoodProduction = kResults.GetBool("Food");258 m_bNoBadGoodies = kResults.GetBool("NoBadGoodies");259 m_bRivalTerritory = kResults.GetBool("RivalTerritory");260 m_bMilitarySupport = kResults.GetBool("MilitarySupport");261 m_bMilitaryProduction = kResults.GetBool("MilitaryProduction");262 m_bPillage = kResults.GetBool("Pillage");263 m_bFound = kResults.GetBool("Found");264 m_bFoundAbroad = kResults.GetBool("FoundAbroad");265 m_iCultureBombRadius = kResults.GetInt("CultureBombRadius");266 m_iGoldenAgeTurns = kResults.GetInt("GoldenAgeTurns");267 m_iFreePolicies = kResults.GetInt("FreePolicies");268 m_iOneShotTourism = kResults.GetInt("OneShotTourism");269 m_iOneShotTourismPercentOthers = kResults.GetInt("OneShotTourismPercentOthers");270 m_bIgnoreBuildingDefense = kResults.GetBool("IgnoreBuildingDefense");271 m_bPrereqResources = kResults.GetBool("PrereqResources");272 m_bMechanized = kResults.GetBool("Mechanized");273 m_bSuicide = kResults.GetBool("Suicide");274 m_bCaptureWhileEmbarked = kResults.GetBool("CaptureWhileEmbarked");275 m_bRangeAttackOnlyInDomain = kResults.GetBool("RangeAttackOnlyInDomain");276 m_bTrade = kResults.GetBool("Trade");277 m_iNumExoticGoods = kResults.GetInt("NumExoticGoods");278279 m_strUnitArtInfoTag = kResults.GetText("UnitArtInfo");280 m_bUnitArtInfoCulturalVariation = kResults.GetBool("UnitArtInfoCulturalVariation");281 m_bUnitArtInfoEraVariation = kResults.GetBool("UnitArtInfoEraVariation");282283 //References284 const char* szTextVal = NULL;285 szTextVal = kResults.GetText("Class");286 m_iUnitClassType = GC.getInfoTypeForString(szTextVal, true);287288 szTextVal = kResults.GetText("Special");289 m_iSpecialUnitType = GC.getInfoTypeForString(szTextVal, true);290291 szTextVal = kResults.GetText("Capture");292 m_iUnitCaptureClassType = GC.getInfoTypeForString(szTextVal, true);293294 szTextVal = kResults.GetText("CombatClass");295 m_iUnitCombatType = GC.getInfoTypeForString(szTextVal, true);296297#if defined(MOD_GLOBAL_PROMOTION_CLASSES)298 szTextVal = kResults.GetText("PromotionClass");299 m_iUnitPromotionType = GC.getInfoTypeForString(szTextVal, true);300301 if (m_iUnitPromotionType == NO_UNITCOMBAT || !MOD_GLOBAL_PROMOTION_CLASSES) {302 m_iUnitPromotionType = m_iUnitCombatType;303 }304#endif305306#if defined(MOD_EVENTS_CAN_MOVE_INTO)307 m_bSendCanMoveIntoEvent = kResults.GetBool("SendCanMoveIntoEvent");308#endif309310 szTextVal = kResults.GetText("Domain");311 m_iDomainType = GC.getInfoTypeForString(szTextVal, true);312313 szTextVal = kResults.GetText("CivilianAttackPriority");314 m_iCivilianAttackPriority = GC.getInfoTypeForString(szTextVal, true);315316 szTextVal = kResults.GetText("DefaultUnitAI");317 m_iDefaultUnitAIType = GC.getInfoTypeForString(szTextVal, true);318319 szTextVal = kResults.GetText("PillagePrereqTech");320 m_iPrereqPillageTech = GC.getInfoTypeForString(szTextVal, true);321 322 szTextVal = kResults.GetText("PrereqTech");323 m_iPrereqAndTech = GC.getInfoTypeForString(szTextVal, true);324325 szTextVal = kResults.GetText("ObsoleteTech");326 m_iObsoleteTech = GC.getInfoTypeForString(szTextVal, true);327328 szTextVal = kResults.GetText("PolicyType");329 m_iPolicyType = GC.getInfoTypeForString(szTextVal, true);330331 szTextVal = kResults.GetText("GoodyHutUpgradeUnitClass");332 m_iGoodyHutUpgradeUnitClass = GC.getInfoTypeForString(szTextVal, true);333334 szTextVal = kResults.GetText("SpecialCargo");335 m_iSpecialCargo = GC.getInfoTypeForString(szTextVal, true);336337 szTextVal = kResults.GetText("DomainCargo");338 m_iDomainCargo = GC.getInfoTypeForString(szTextVal, true);339340 szTextVal = kResults.GetText("ProjectPrereq");341 m_iProjectPrereq = GC.getInfoTypeForString(szTextVal, true);342343 szTextVal = kResults.GetText("SpaceshipProject");344 m_iSpaceshipProject = GC.getInfoTypeForString(szTextVal, true);345346 szTextVal = kResults.GetText("LeaderPromotion");347 m_iLeaderPromotion = GC.getInfoTypeForString(szTextVal, true);348349 //Arrays350 const char* szUnitType = GetType();351352 kUtility.SetFlavors(m_piFlavorValue, "Unit_Flavors", "UnitType", szUnitType);353354 kUtility.PopulateArrayByValue(m_piProductionTraits, "Traits", "Unit_ProductionTraits", "TraitType", "UnitType", szUnitType, "Trait");355356 kUtility.PopulateArrayByValue(m_piResourceQuantityRequirements, "Resources", "Unit_ResourceQuantityRequirements", "ResourceType", "UnitType", szUnitType, "Cost");357 kUtility.PopulateArrayByValue(m_piProductionModifierBuildings, "Buildings", "Unit_ProductionModifierBuildings", "BuildingType", "UnitType", szUnitType, "ProductionModifier");358 kUtility.PopulateArrayByValue(m_piYieldFromKills, "Yields", "Unit_YieldFromKills", "YieldType", "UnitType", szUnitType, "Yield");359#if defined(MOD_API_UNIFIED_YIELDS)360 kUtility.PopulateArrayByValue(m_piYieldFromBarbarianKills, "Yields", "Unit_YieldFromBarbarianKills", "YieldType", "UnitType", szUnitType, "Yield");361#endif362 kUtility.PopulateArrayByExistence(m_pbFreePromotions, "UnitPromotions", "Unit_FreePromotions", "PromotionType", "UnitType", szUnitType);363364 kUtility.PopulateArrayByExistence(m_pbUpgradeUnitClass, "UnitClasses", "Unit_ClassUpgrades", "UnitClassType", "UnitType", szUnitType);365366 kUtility.PopulateArrayByExistence(m_pbUnitAIType, "UnitAIInfos", "Unit_AITypes", "UnitAIType", "UnitType", szUnitType);367 kUtility.PopulateArrayByExistence(m_pbNotUnitAIType, "UnitAIInfos", "Unit_NotAITypes", "UnitAIType", "UnitType", szUnitType);368369 kUtility.PopulateArrayByExistence(m_pbBuilds, "Builds", "Unit_Builds", "BuildType", "UnitType", szUnitType);370 kUtility.PopulateArrayByExistence(m_pbGreatPeoples, "Specialists", "Unit_GreatPersons", "GreatPersonType", "UnitType", szUnitType);371 kUtility.PopulateArrayByExistence(m_pbBuildings, "Buildings", "Unit_Buildings", "BuildingType", "UnitType", szUnitType);372 kUtility.PopulateArrayByExistence(m_pbBuildingClassRequireds, "BuildingClasses", "Unit_BuildingClassRequireds", "BuildingClassType", "UnitType", szUnitType);373374 //TechTypes375 {376 //Initialize array to NO_TECH377 kUtility.InitializeArray(m_piPrereqAndTechs, "Technologies", (int)NO_TECH);378379 std::string strKey = "Units - TechTypes";380 Database::Results* pResults = kUtility.GetResults(strKey);381 if(pResults == NULL)382 {383 pResults = kUtility.PrepareResults(strKey, "select Technologies.ID from Unit_TechTypes inner join Technologies on TechType = Technologies.Type where UnitType = ?");384 }385386 pResults->Bind(1, szUnitType, -1, false);387388 int i = 0;389 while(pResults->Step())390 {391 m_piPrereqAndTechs[i++] = pResults->GetInt(0);392 }393394 pResults->Reset();395 }396397 //Unit Unique Names Count398 {399 std::string strKey = "Units - UniqueNameCount";400 Database::Results* pUnitNameCount = kUtility.GetResults(strKey);401 if(pUnitNameCount == NULL)402 {403 pUnitNameCount = kUtility.PrepareResults(strKey, "select count(*) from Unit_UniqueNames where UnitType = ?");404 }405406 pUnitNameCount->Bind(1, szUnitType, -1, false);407408 pUnitNameCount->Step();409 m_iNumUnitNames = pUnitNameCount->GetInt(0);410411 pUnitNameCount->Reset();412 }413414 //Unit Unique Names415 {416 if(m_iNumUnitNames > 0)417 {418 m_paszUnitNames = FNEW(CvString[m_iNumUnitNames], c_eCiv5GameplayDLL, 0);419 m_paeGreatWorks = FNEW(GreatWorkType[m_iNumUnitNames], c_eCiv5GameplayDLL, 0);420421 std::string strKey = "Units - UniqueNames";422 Database::Results* pResults = kUtility.GetResults(strKey);423 if(pResults == NULL)424 {425 pResults = kUtility.PrepareResults(strKey, "select UniqueName, GreatWorkType from Unit_UniqueNames where UnitType = ? ORDER BY rowid");426 }427428 pResults->Bind(1, szUnitType, -1, false);429430 int i = 0;431 while(pResults->Step())432 {433 m_paszUnitNames[i] = pResults->GetText(0);434 435 const char* szGreatWorkType = pResults->GetText(1);436 if(szGreatWorkType == NULL)437 {438 m_paeGreatWorks[i] = NO_GREAT_WORK;439 }440 else441 {442 m_paeGreatWorks[i] = static_cast<GreatWorkType>(GC.getInfoTypeForString(szGreatWorkType, true));443 }444445 i++;446 }447448 pResults->Reset();449 }450 }451452 //MovementRates453 {454 std::string strKey = "Units - MovementRates";455 Database::Results* pMovementRates = kUtility.GetResults(strKey);456 if(pMovementRates == NULL)457 {458 pMovementRates = kUtility.PrepareResults(strKey, "SELECT * FROM MovementRates where Type = ? ORDER BY NumHexes");459 }460461 const char* szMovementRate = kResults.GetText("MoveRate");462 pMovementRates->Bind(1, szMovementRate, -1, false);463 while(pMovementRates->Step())464 {465 int f0 = pMovementRates->GetInt("NumHexes") - 1;466 float f1 = pMovementRates->GetFloat("TotalTime");467 float f2 = pMovementRates->GetFloat("EaseIn");468 float f3 = pMovementRates->GetFloat("EaseOut");469 float f4 = pMovementRates->GetFloat("IndividualOffset");470 float f5 = pMovementRates->GetFloat("RowOffset");471 float f6 = pMovementRates->GetFloat("CurveRoll");472 int iPathSubdivision = pMovementRates->GetInt("PathSubdivision");473 if(f0 >= 0 && f0 <= 11)474 {475 m_unitMoveRate[f0].m_fTotalMoveRate = f1;476 m_unitMoveRate[f0].m_fEaseIn = f2;477 m_unitMoveRate[f0].m_fEaseOut = f3;478 m_unitMoveRate[f0].m_fIndividualOffset = f4;479 m_unitMoveRate[f0].m_fRowOffset = f5;480 m_unitMoveRate[f0].m_fCurveRoll = f6;481 m_unitMoveRate[f0].m_iPathSubdivision = iPathSubdivision;482 }483 }484 pMovementRates->Reset();485486 }487488 // Calculate military Power and cache it489 DoUpdatePower();490491 return true;492}