Hooks
static bool BeforeCvCity_write(const CvCity* self, FDataStream& kStream);static void AfterCvCity_write(const CvCity* self, FDataStream& kStream);static void ReplaceCvCity_write(void (*original)(const CvCity*, FDataStream&), const CvCity* self, FDataStream& kStream);CivRegisterBefore<CivHooks::CvCity_write>(host, &BeforeCvCity_write);CivRegisterAfter<CivHooks::CvCity_write>(host, &AfterCvCity_write);CivRegisterReplace<CivHooks::CvCity_write>(host, &ReplaceCvCity_write);
Code
15513void CvCity::write(FDataStream& kStream) const15514{15515 VALIDATE_OBJECT1551615517 // Current version number15518 uint uiVersion = 6;15519 kStream << uiVersion;15520 MOD_SERIALIZE_INIT_WRITE(kStream);1552115522 kStream << m_iID;15523 kStream << m_iX;15524 kStream << m_iY;15525 kStream << m_iRallyX;15526 kStream << m_iRallyY;15527 kStream << m_iGameTurnFounded;15528 kStream << m_iGameTurnAcquired;15529 kStream << m_iPopulation;15530 kStream << m_iHighestPopulation;15531#if defined(MOD_GLOBAL_CITY_AUTOMATON_WORKERS)15532 MOD_SERIALIZE_WRITE(kStream, m_iAutomatons);15533#endif15534#if defined(MOD_BUILDINGS_CITY_AUTOMATON_WORKERS)15535 MOD_SERIALIZE_WRITE(kStream, m_iCityAutomatonWorkersChange);15536#endif15537 kStream << m_iNumGreatPeople;15538 kStream << m_iBaseGreatPeopleRate;15539 kStream << m_iGreatPeopleRateModifier;15540 kStream << m_iJONSCultureStored;15541 kStream << m_iJONSCultureLevel;15542 kStream << m_iJONSCulturePerTurnFromBuildings;15543 kStream << m_iJONSCulturePerTurnFromPolicies;15544 kStream << m_iJONSCulturePerTurnFromSpecialists;15545 kStream << m_iJONSCulturePerTurnFromReligion;15546 kStream << m_iFaithPerTurnFromBuildings;15547 kStream << m_iFaithPerTurnFromPolicies;15548 kStream << m_iFaithPerTurnFromReligion;15549 kStream << m_iCultureRateModifier;15550 kStream << m_iNumWorldWonders;15551 kStream << m_iNumTeamWonders;15552 kStream << m_iNumNationalWonders;15553 kStream << m_iWonderProductionModifier;15554 kStream << m_iCapturePlunderModifier; // Added for Version 315555 kStream << m_iPlotCultureCostModifier; // Added for Version 315556 kStream << m_iPlotBuyCostModifier; // Added for Version 1215557#if defined(MOD_BUILDINGS_CITY_WORKING)15558 MOD_SERIALIZE_WRITE(kStream, m_iCityWorkingChange);15559#endif15560#if defined(MOD_BUILDINGS_CITY_AUTOMATON_WORKERS)15561 // SEE ABOVE - MOD_SERIALIZE_WRITE(kStream, m_iCityAutomatonWorkersChange);15562#endif15563 kStream << m_iMaintenance;15564 kStream << m_iHealRate;15565 kStream << m_iEspionageModifier;15566#if defined(MOD_RELIGION_CONVERSION_MODIFIERS)15567 MOD_SERIALIZE_WRITE(kStream, m_iConversionModifier);15568#endif15569 kStream << m_iNoOccupiedUnhappinessCount;15570 kStream << m_iFood;15571 kStream << m_iFoodKept;15572 kStream << m_iMaxFoodKeptPercent;15573 kStream << m_iOverflowProduction;15574 kStream << m_iFeatureProduction;15575 kStream << m_iMilitaryProductionModifier;15576 kStream << m_iSpaceProductionModifier;15577 kStream << m_iFreeExperience;15578 kStream << m_iCurrAirlift; // unused15579 kStream << m_iMaxAirUnits;15580 kStream << m_iAirModifier; // unused15581 kStream << m_iNukeModifier;15582 kStream << m_iTradeRouteTargetBonus;15583 kStream << m_iTradeRouteRecipientBonus;15584 kStream << m_iCultureUpdateTimer;15585 kStream << m_iCitySizeBoost;15586 kStream << m_iSpecialistFreeExperience;15587 kStream << m_iStrengthValue;15588 kStream << m_iDamage;15589 kStream << m_iThreatValue;15590 kStream << m_iGarrisonedUnit;15591 CvInfosSerializationHelper::WriteHashed(kStream, (ResourceTypes)(m_iResourceDemanded.get()));15592 kStream << m_iWeLoveTheKingDayCounter;15593 kStream << m_iLastTurnGarrisonAssigned;15594 kStream << m_iThingsProduced;15595 kStream << m_iDemandResourceCounter;15596 kStream << m_iResistanceTurns;15597 kStream << m_iRazingTurns;15598 kStream << m_iCountExtraLuxuries;15599 kStream << m_iCheapestPlotInfluence;15600 kStream << m_unitBeingBuiltForOperation.m_iOperationID;15601 kStream << m_unitBeingBuiltForOperation.m_iArmyID;15602 kStream << m_unitBeingBuiltForOperation.m_iSlotID;1560315604 kStream << m_bNeverLost;15605 kStream << m_bDrafted;15606 kStream << m_bAirliftTargeted; // unused15607 kStream << m_bProductionAutomated;15608 kStream << m_bMadeAttack;15609 kStream << m_bOccupied;15610 kStream << m_bPuppet;15611 kStream << m_bEverCapital;15612 kStream << m_bIndustrialRouteToCapital;15613 kStream << m_bFeatureSurrounded;1561415615 kStream << m_eOwner;15616 kStream << m_ePreviousOwner;15617 kStream << m_eOriginalOwner;15618 kStream << m_ePlayersReligion;1561915620 kStream << m_aiSeaPlotYield;15621 kStream << m_aiRiverPlotYield;15622 kStream << m_aiLakePlotYield;15623 kStream << m_aiSeaResourceYield;15624 kStream << m_aiBaseYieldRateFromTerrain;15625 kStream << m_aiBaseYieldRateFromBuildings;15626 kStream << m_aiBaseYieldRateFromSpecialists;15627 kStream << m_aiBaseYieldRateFromMisc;15628 kStream << m_aiBaseYieldRateFromReligion;15629 kStream << m_aiYieldPerPop;15630 kStream << m_aiYieldPerReligion;15631 kStream << m_aiYieldRateModifier;15632 kStream << m_aiPowerYieldRateModifier;15633 kStream << m_aiResourceYieldRateModifier;15634 kStream << m_aiExtraSpecialistYield;15635 kStream << m_aiProductionToYieldModifier;15636 kStream << m_aiDomainFreeExperience;15637 kStream << m_aiDomainProductionModifier;1563815639 kStream << m_abEverOwned;15640 kStream << m_abRevealed;1564115642 kStream << m_strName;15643 kStream << m_strScriptData;1564415645 CvInfosSerializationHelper::WriteHashedDataArray<ResourceTypes, int>(kStream, m_paiNoResource);15646 CvInfosSerializationHelper::WriteHashedDataArray<ResourceTypes, int>(kStream, m_paiFreeResource);15647 CvInfosSerializationHelper::WriteHashedDataArray<ResourceTypes, int>(kStream, m_paiNumResourcesLocal);1564815649 kStream << m_paiSpecialistProduction;15650 kStream << m_paiProjectProduction;1565115652 m_pCityBuildings->Write(kStream);1565315654 CvInfosSerializationHelper::WriteHashedDataArray<UnitTypes, int>(kStream, m_paiUnitProduction);15655 CvInfosSerializationHelper::WriteHashedDataArray<UnitTypes, int>(kStream, m_paiUnitProductionTime);1565615657 kStream << m_paiSpecialistCount;15658 kStream << m_paiMaxSpecialistCount;15659 kStream << m_paiForceSpecialistCount;15660 kStream << m_paiFreeSpecialistCount;15661 kStream << m_paiImprovementFreeSpecialists;15662 kStream << m_paiUnitCombatFreeExperience;15663 kStream << m_paiUnitCombatProductionModifier;1566415665 CvInfosSerializationHelper::WriteHashedDataArray<PromotionTypes, int>(kStream, m_paiFreePromotionCount);1566615667 // Write m_orderQueue15668 UINT uLength = (UINT)m_orderQueue.getLength();15669 kStream << uLength;15670 for(UINT uIdx = 0; uIdx < uLength; ++uIdx)15671 {15672 OrderData* pData = m_orderQueue.getAt(uIdx);1567315674 kStream << pData->eOrderType;15675 // Now we have to translate the data because most of them contain indices into Infos tables and it is very bad to save an index since the table order can change15676 switch (pData->eOrderType)15677 {15678 case ORDER_TRAIN:15679 CvInfosSerializationHelper::WriteHashed(kStream, (UnitTypes)(pData->iData1));15680 kStream << pData->iData2; // This is a UnitAIType, but no code respects the ordering in GC.getUnitAIInfo so just write out the index15681 break;1568215683 case ORDER_CONSTRUCT:15684 CvInfosSerializationHelper::WriteHashed(kStream, (BuildingTypes)pData->iData1);15685 kStream << pData->iData2;15686 break;1568715688 case ORDER_CREATE:15689 CvInfosSerializationHelper::WriteHashed(kStream, (ProjectTypes)pData->iData1);15690 kStream << pData->iData2;15691 break;1569215693 case ORDER_PREPARE:15694 CvInfosSerializationHelper::WriteHashed(kStream, (SpecialistTypes)pData->iData1);15695 kStream << pData->iData2;15696 break;1569715698 case ORDER_MAINTAIN:15699 CvInfosSerializationHelper::WriteHashed(kStream, (ProcessTypes)pData->iData1);15700 kStream << pData->iData2;15701 break;1570215703 default:15704 CvAssertMsg(false, "pData->eOrderType failed to match a valid option");15705 kStream << pData->iData1;15706 kStream << pData->iData2;15707 break;15708 }15709 kStream << pData->bSave;15710 kStream << pData->bRush;15711 }1571215713 CvInfosSerializationHelper::WriteHashedDataArray<ResourceTypes>(kStream, m_ppaiResourceYieldChange, NUM_YIELD_TYPES, GC.getNumResourceInfos());1571415715 CvInfosSerializationHelper::WriteHashedDataArray<FeatureTypes>(kStream, m_ppaiFeatureYieldChange, NUM_YIELD_TYPES, GC.getNumFeatureInfos());1571615717 CvInfosSerializationHelper::WriteHashedDataArray<TerrainTypes>(kStream, m_ppaiTerrainYieldChange, NUM_YIELD_TYPES, GC.getNumTerrainInfos());1571815719#if defined(MOD_API_UNIFIED_YIELDS) && defined(MOD_API_PLOT_YIELDS)15720 // MOD_SERIALIZE_WRITE - v57/v58/v59 broke the save format couldn't be helped, but don't make a habit of it!!!15721 CvInfosSerializationHelper::WriteHashedDataArray<PlotTypes>(kStream, m_ppaiPlotYieldChange, NUM_YIELD_TYPES, GC.getNumPlotInfos());15722#endif1572315724 kStream << m_iPopulationRank;15725 kStream << m_bPopulationRankValid;15726 kStream << m_aiBaseYieldRank;15727 kStream << m_abBaseYieldRankValid;15728 kStream << m_aiYieldRank;15729 kStream << m_abYieldRankValid;1573015731 kStream << m_iGameTurnLastExpanded;1573215733 kStream << m_iBaseHappinessFromBuildings;15734 kStream << m_iUnmoddedHappinessFromBuildings;1573515736 kStream << m_bRouteToCapitalConnectedLastTurn;15737 kStream << m_bRouteToCapitalConnectedThisTurn;15738 kStream << m_strName;15739 kStream << m_bOwedCultureBuilding;15740#if defined(MOD_BUGFIX_FREE_FOOD_BUILDING)15741 MOD_SERIALIZE_WRITE(kStream, m_bOwedFoodBuilding);15742#endif1574315744 m_pCityStrategyAI->Write(kStream);15745 m_pCityCitizens->Write(kStream);15746 kStream << *m_pCityReligions;15747 m_pEmphases->Write(kStream);15748 kStream << *m_pCityEspionage;1574915750 kStream << m_iExtraHitPoints;15751}