Hooks
static bool BeforeCvPlayer_Write(const CvPlayer* self, FDataStream& kStream);static void AfterCvPlayer_Write(const CvPlayer* self, FDataStream& kStream);static void ReplaceCvPlayer_Write(void (*original)(const CvPlayer*, FDataStream&), const CvPlayer* self, FDataStream& kStream);CivRegisterBefore<CivHooks::CvPlayer_Write>(host, &BeforeCvPlayer_Write);CivRegisterAfter<CivHooks::CvPlayer_Write>(host, &AfterCvPlayer_Write);CivRegisterReplace<CivHooks::CvPlayer_Write>(host, &ReplaceCvPlayer_Write);
Code
25367//25368// save object to a stream25369// used during save25370//25371void CvPlayer::Write(FDataStream& kStream) const25372{25373 //Save version number. THIS MUST BE FIRST!!25374 kStream << g_CurrentCvPlayerVersion;25375 MOD_SERIALIZE_INIT_WRITE(kStream);2537625377 kStream << m_iStartingX;25378 kStream << m_iStartingY;25379 kStream << m_iTotalPopulation;25380 kStream << m_iTotalLand;25381 kStream << m_iTotalLandScored;25382 kStream << m_iJONSCulturePerTurnForFree;25383 kStream << m_iJONSCulturePerTurnFromMinorCivs;25384 kStream << m_iJONSCultureCityModifier;25385 kStream << m_iJONSCulture;25386 kStream << m_iJONSCultureEverGenerated;25387 kStream << m_iCulturePerWonder;25388 kStream << m_iCultureWonderMultiplier;25389 kStream << m_iCulturePerTechResearched;25390 kStream << m_iFaith;25391 kStream << m_iFaithEverGenerated;25392 kStream << m_iHappiness;25393 kStream << m_iUprisingCounter;25394 kStream << m_iExtraHappinessPerLuxury;25395 kStream << m_iUnhappinessFromUnits;25396 kStream << m_iUnhappinessFromUnitsMod;25397 kStream << m_iUnhappinessMod;25398 kStream << m_iCityCountUnhappinessMod;25399 kStream << m_iOccupiedPopulationUnhappinessMod;25400 kStream << m_iCapitalUnhappinessMod;25401 kStream << m_iCityRevoltCounter;25402 kStream << m_iHappinessPerGarrisonedUnitCount;25403 kStream << m_iHappinessPerTradeRouteCount;25404 kStream << m_iHappinessPerXPopulation;25405 kStream << m_iHappinessPerXPolicies;25406 kStream << m_iHappinessFromLeagues;25407 kStream << m_iEspionageModifier;25408 kStream << m_iSpyStartingRank;25409#if defined(MOD_RELIGION_CONVERSION_MODIFIERS)25410 MOD_SERIALIZE_WRITE(kStream, m_iConversionModifier);25411#endif25412 kStream << m_iExtraLeagueVotes;25413 kStream << m_iSpecialPolicyBuildingHappiness;25414 kStream << m_iWoundedUnitDamageMod;25415 kStream << m_iUnitUpgradeCostMod;25416 kStream << m_iBarbarianCombatBonus;25417 kStream << m_iAlwaysSeeBarbCampsCount;25418 kStream << m_iHappinessFromBuildings;25419 kStream << m_iHappinessPerCity;25420 kStream << m_iAdvancedStartPoints;25421 kStream << m_iAttackBonusTurns;25422 kStream << m_iCultureBonusTurns;25423 kStream << m_iTourismBonusTurns;25424 kStream << m_iGoldenAgeProgressMeter;25425 kStream << m_iGoldenAgeMeterMod;25426 kStream << m_iNumGoldenAges;25427 kStream << m_iGoldenAgeTurns;25428 kStream << m_iNumUnitGoldenAges;25429 kStream << m_iStrikeTurns;25430 kStream << m_iGoldenAgeModifier;25431#if defined(MOD_GLOBAL_TRULY_FREE_GP)25432 MOD_SERIALIZE_WRITE(kStream, m_iFreeGreatPeopleCreated);25433 MOD_SERIALIZE_WRITE(kStream, m_iFreeGreatGeneralsCreated);25434 MOD_SERIALIZE_WRITE(kStream, m_iFreeGreatAdmiralsCreated);25435#if defined(MOD_GLOBAL_SEPARATE_GP_COUNTERS)25436 MOD_SERIALIZE_WRITE(kStream, m_iFreeGreatMerchantsCreated);25437 MOD_SERIALIZE_WRITE(kStream, m_iFreeGreatScientistsCreated);25438 MOD_SERIALIZE_WRITE(kStream, m_iFreeGreatEngineersCreated);25439#endif25440 MOD_SERIALIZE_WRITE(kStream, m_iFreeGreatWritersCreated);25441 MOD_SERIALIZE_WRITE(kStream, m_iFreeGreatArtistsCreated);25442 MOD_SERIALIZE_WRITE(kStream, m_iFreeGreatMusiciansCreated);25443#endif25444 kStream << m_iGreatPeopleCreated;25445 kStream << m_iGreatGeneralsCreated;25446 kStream << m_iGreatAdmiralsCreated;25447#if defined(MOD_GLOBAL_SEPARATE_GP_COUNTERS)25448 MOD_SERIALIZE_WRITE(kStream, m_iGreatMerchantsCreated);25449 MOD_SERIALIZE_WRITE(kStream, m_iGreatScientistsCreated);25450 MOD_SERIALIZE_WRITE(kStream, m_iGreatEngineersCreated);25451#endif25452 kStream << m_iGreatWritersCreated;25453 kStream << m_iGreatArtistsCreated;25454 kStream << m_iGreatMusiciansCreated;25455 kStream << m_iMerchantsFromFaith;25456 kStream << m_iScientistsFromFaith;25457 kStream << m_iWritersFromFaith;25458 kStream << m_iArtistsFromFaith;25459 kStream << m_iMusiciansFromFaith;25460 kStream << m_iGeneralsFromFaith;25461 kStream << m_iAdmiralsFromFaith;25462 kStream << m_iEngineersFromFaith;25463 kStream << m_iGreatPeopleThresholdModifier;25464 kStream << m_iGreatGeneralsThresholdModifier;25465 kStream << m_iGreatAdmiralsThresholdModifier;25466 kStream << m_iGreatGeneralCombatBonus;25467 kStream << m_iAnarchyNumTurns;25468 kStream << m_iPolicyCostModifier;25469 kStream << m_iGreatPeopleRateModifier;25470 kStream << m_iGreatPeopleRateModFromBldgs;25471 kStream << m_iGreatGeneralRateModifier;25472 kStream << m_iGreatGeneralRateModFromBldgs;25473 kStream << m_iDomesticGreatGeneralRateModifier;25474 kStream << m_iDomesticGreatGeneralRateModFromBldgs;25475 kStream << m_iGreatAdmiralRateModifier;25476 kStream << m_iGreatWriterRateModifier;25477 kStream << m_iGreatArtistRateModifier;25478 kStream << m_iGreatMusicianRateModifier;25479 kStream << m_iGreatMerchantRateModifier;25480 kStream << m_iGreatScientistRateModifier;25481 kStream << m_iGreatScientistBeakerModifier;25482 kStream << m_iGreatEngineerRateModifier;25483 kStream << m_iGreatPersonExpendGold;25484 kStream << m_iMaxGlobalBuildingProductionModifier;25485 kStream << m_iMaxTeamBuildingProductionModifier;25486 kStream << m_iMaxPlayerBuildingProductionModifier;25487 kStream << m_iFreeExperience;25488 kStream << m_iFreeExperienceFromBldgs;25489 kStream << m_iFreeExperienceFromMinors;25490 kStream << m_iFeatureProductionModifier;25491 kStream << m_iWorkerSpeedModifier;25492 kStream << m_iImprovementCostModifier;25493 kStream << m_iImprovementUpgradeRateModifier;25494 kStream << m_iSpecialistProductionModifier;25495 kStream << m_iMilitaryProductionModifier;25496 kStream << m_iSpaceProductionModifier;25497 kStream << m_iCityDefenseModifier;25498 kStream << m_iUnitFortificationModifier; // Version 4525499 kStream << m_iUnitBaseHealModifier; // Version 4625500 kStream << m_iWonderProductionModifier;25501 kStream << m_iSettlerProductionModifier;25502 kStream << m_iCapitalSettlerProductionModifier; // Version 1125503 kStream << m_iUnitProductionMaintenanceMod;25504 kStream << m_iPolicyCostBuildingModifier; // Added in version 325505 kStream << m_iPolicyCostMinorCivModifier;25506 kStream << m_iInfluenceSpreadModifier;25507 kStream << m_iExtraVotesPerDiplomat;25508 kStream << m_iNumNukeUnits;25509 kStream << m_iNumOutsideUnits;25510 kStream << m_iBaseFreeUnits;25511 kStream << m_iBaseFreeMilitaryUnits;25512 kStream << m_iFreeUnitsPopulationPercent;25513 kStream << m_iFreeMilitaryUnitsPopulationPercent;25514 kStream << m_iGoldPerUnit;25515 kStream << m_iGoldPerMilitaryUnit;25516 kStream << m_iRouteGoldMaintenanceMod;25517 kStream << m_iBuildingGoldMaintenanceMod;25518 kStream << m_iUnitGoldMaintenanceMod;25519 kStream << m_iUnitSupplyMod;25520 kStream << m_iExtraUnitCost;25521 kStream << m_iNumMilitaryUnits;25522 kStream << m_iHappyPerMilitaryUnit;25523 kStream << m_iHappinessToCulture;25524 kStream << m_iHappinessToScience;25525 kStream << m_iHalfSpecialistUnhappinessCount;25526 kStream << m_iHalfSpecialistFoodCount;25527 kStream << m_iMilitaryFoodProductionCount;25528 kStream << m_iGoldenAgeCultureBonusDisabledCount;25529 kStream << m_iSecondReligionPantheonCount;25530 kStream << m_iEnablesSSPartHurryCount;25531 kStream << m_iEnablesSSPartPurchaseCount;25532 kStream << m_iConscriptCount;25533 kStream << m_iMaxConscript;25534 kStream << m_iHighestUnitLevel;25535 kStream << m_iOverflowResearch;25536 kStream << m_iExpModifier;25537 kStream << m_iExpInBorderModifier;25538 kStream << m_iLevelExperienceModifier;25539 kStream << m_iMinorQuestFriendshipMod;25540 kStream << m_iMinorGoldFriendshipMod;25541 kStream << m_iMinorFriendshipMinimum;25542 kStream << m_iMinorFriendshipDecayMod;25543 kStream << m_iMinorScienceAlliesCount;25544 kStream << m_iMinorResourceBonusCount;25545 kStream << m_iAbleToAnnexCityStatesCount;25546 kStream << m_iConversionTimer;25547 kStream << m_iCapitalCityID;25548 kStream << m_iCitiesLost;25549 kStream << m_iMilitaryMight;25550 kStream << m_iEconomicMight;25551 kStream << m_iTurnMightRecomputed;25552 kStream << m_iNewCityExtraPopulation;25553 kStream << m_iFreeFoodBox;25554 kStream << m_iScenarioScore1;25555 kStream << m_iScenarioScore2;25556 kStream << m_iScenarioScore3;25557 kStream << m_iScoreFromFutureTech;25558 kStream << m_iScenarioScore4;25559 kStream << m_iCombatExperience;25560 kStream << m_iNavalCombatExperience;25561 kStream << m_iLifetimeCombatExperience;25562#if defined(MOD_UNITS_XP_TIMES_100)25563 MOD_SERIALIZE_WRITE(kStream, m_iCombatExperienceTimes100);25564 MOD_SERIALIZE_WRITE(kStream, m_iNavalCombatExperienceTimes100);25565 MOD_SERIALIZE_WRITE(kStream, m_iLifetimeCombatExperienceTimes100);25566#endif25567 kStream << m_iBorderObstacleCount;25568 kStream << m_iNextOperationID;25569 kStream << m_iCostNextPolicy;25570 kStream << m_iNumBuilders;25571 kStream << m_iMaxNumBuilders;25572 kStream << m_iCityStrengthMod;25573 kStream << m_iCityGrowthMod;25574 kStream << m_iCapitalGrowthMod;25575 kStream << m_iNumPlotsBought;25576 kStream << m_iPlotGoldCostMod;25577#if defined(MOD_TRAITS_CITY_WORKING) || defined(MOD_BUILDINGS_CITY_WORKING) || defined(MOD_POLICIES_CITY_WORKING) || defined(MOD_TECHS_CITY_WORKING)25578 MOD_SERIALIZE_WRITE(kStream, m_iCityWorkingChange);25579#endif25580#if defined(MOD_TRAITS_CITY_AUTOMATON_WORKERS) || defined(MOD_BUILDINGS_CITY_AUTOMATON_WORKERS) || defined(MOD_POLICIES_CITY_AUTOMATON_WORKERS) || defined(MOD_TECHS_CITY_AUTOMATON_WORKERS)25581 MOD_SERIALIZE_WRITE(kStream, m_iCityAutomatonWorkersChange);25582#endif25583 kStream << m_iPlotCultureCostModifier;25584 kStream << m_iPlotCultureExponentModifier;25585 kStream << m_iNumCitiesPolicyCostDiscount;25586 kStream << m_iGarrisonFreeMaintenanceCount;25587 kStream << m_iGarrisonedCityRangeStrikeModifier;25588 kStream << m_iNumCitiesFreeCultureBuilding;25589 kStream << m_iNumCitiesFreeFoodBuilding;25590 kStream << m_iUnitPurchaseCostModifier;25591 kStream << m_iAllFeatureProduction;25592 kStream << m_iCityDistanceHighwaterMark;25593 kStream << m_iOriginalCapitalX;25594 kStream << m_iOriginalCapitalY;25595 kStream << m_iNumWonders;25596 kStream << m_iNumPolicies;25597 kStream << m_iNumGreatPeople;25598 kStream << m_iCityConnectionHappiness;25599 kStream << m_iHolyCityID;25600 kStream << m_iTurnsSinceSettledLastCity;25601 kStream << m_iNumNaturalWondersDiscoveredInArea;25602 kStream << m_iStrategicResourceMod;25603 kStream << m_iSpecialistCultureChange;25604 kStream << m_iGreatPeopleSpawnCounter;25605 kStream << m_iFreeTechCount;25606 kStream << m_iMedianTechPercentage;25607 kStream << m_iNumFreePolicies;25608 kStream << m_iNumFreePoliciesEver;25609 kStream << m_iNumFreeTenets;25610 kStream << m_iNumFreeGreatPeople;25611 kStream << m_iNumMayaBoosts;25612 kStream << m_iNumFaithGreatPeople;25613 kStream << m_iNumArchaeologyChoices;25614 kStream << m_eFaithPurchaseType;25615 kStream << m_iFaithPurchaseIndex;25616 kStream << m_iMaxEffectiveCities;25617 kStream << m_iLastSliceMoved;2561825619 kStream << m_bHasBetrayedMinorCiv;25620 kStream << m_bAlive;25621 kStream << m_bEverAlive;25622 kStream << m_bBeingResurrected;25623 kStream << m_bTurnActive;25624 kStream << m_bAutoMoves;25625 kStream << m_bEndTurn;25626 kStream << m_bDynamicTurnsSimultMode;25627 kStream << static_cast<bool>(m_bPbemNewTurn && GC.getGame().isPbem());25628 kStream << m_bExtendedGame;25629 kStream << m_bFoundedFirstCity;25630 kStream << m_iNumCitiesFounded; // Added V3025631 kStream << m_bStrike;25632 kStream << m_bCramped;25633 kStream << m_bLostCapital;25634 kStream << m_eConqueror;25635 kStream << m_bHasAdoptedStateReligion;25636 kStream << m_bAlliesGreatPersonBiasApplied;2563725638 kStream << m_eID;25639 kStream << m_ePersonalityType;2564025641 kStream << m_aiCityYieldChange;25642 kStream << m_aiCoastalCityYieldChange;25643 kStream << m_aiCapitalYieldChange;25644 kStream << m_aiCapitalYieldPerPopChange;25645 kStream << m_aiSeaPlotYield;25646 kStream << m_aiYieldRateModifier;25647 kStream << m_aiCapitalYieldRateModifier;25648 kStream << m_aiGreatWorkYieldChange;25649 kStream << m_aiExtraYieldThreshold;25650 kStream << m_aiSpecialistExtraYield;25651 kStream << m_aiProximityToPlayer;25652 kStream << m_aiResearchAgreementCounter; // Added in Version 225653 kStream << m_aiIncomingUnitTypes;25654 kStream << m_aiIncomingUnitCountdowns;25655 kStream << m_aiMinorFriendshipAnchors; // Version 3825656 kStream << m_aiSiphonLuxuryCount;2565725658 //kStream << m_abOptions;2565925660 kStream << m_strReligionKey;25661 kStream << m_strScriptData;2566225663 CvAssertMsg((0 < GC.getNumResourceInfos()), "GC.getNumResourceInfos() is not greater than zero but an array is being allocated in CvPlayer::write");25664 CvInfosSerializationHelper::WriteHashedDataArray<ResourceTypes, int>(kStream, m_paiNumResourceUsed);25665 CvInfosSerializationHelper::WriteHashedDataArray<ResourceTypes, int>(kStream, m_paiNumResourceTotal);25666 CvInfosSerializationHelper::WriteHashedDataArray<ResourceTypes, int>(kStream, m_paiResourceGiftedToMinors);25667 CvInfosSerializationHelper::WriteHashedDataArray<ResourceTypes, int>(kStream, m_paiResourceExport);25668 CvInfosSerializationHelper::WriteHashedDataArray<ResourceTypes, int>(kStream, m_paiResourceImport);25669 CvInfosSerializationHelper::WriteHashedDataArray<ResourceTypes, int>(kStream, m_paiResourceFromMinors);25670 CvInfosSerializationHelper::WriteHashedDataArray<ResourceTypes, int>(kStream, m_paiResourcesSiphoned);2567125672 kStream << m_paiImprovementCount;2567325674 CvInfosSerializationHelper::WriteHashedDataArray<BuildingTypes, int>(kStream, m_paiFreeBuildingCount);2567525676 CvInfosSerializationHelper::WriteHashedDataArray<PromotionTypes, int>(kStream, m_paiFreePromotionCount);2567725678 kStream << m_paiUnitCombatProductionModifiers;25679 kStream << m_paiUnitCombatFreeExperiences;25680 kStream << m_paiUnitClassCount;25681 kStream << m_paiUnitClassMaking;25682 kStream << m_paiBuildingClassCount;25683 kStream << m_paiBuildingClassMaking;25684 kStream << m_paiProjectMaking;25685 kStream << m_paiHurryCount;25686 kStream << m_paiHurryModifier;256872568825689 CvAssertMsg((0 < GC.getNumTechInfos()), "GC.getNumTechInfos() is not greater than zero but it is expected to be in CvPlayer::write");2569025691 kStream << m_pabLoyalMember;2569225693 kStream << m_pabGetsScienceFromPlayer;2569425695 m_pPlayerPolicies->Write(kStream);25696 m_pEconomicAI->Write(kStream);25697 m_pCitySpecializationAI->Write(kStream);25698 m_pWonderProductionAI->Write(kStream);25699 m_pMilitaryAI->Write(kStream);25700 m_pGrandStrategyAI->Write(kStream);25701 m_pDiplomacyAI->Write(kStream);25702 m_pReligions->Write(kStream);25703 m_pReligionAI->Write(kStream);25704 m_pPlayerTechs->Write(kStream);25705 m_pFlavorManager->Write(kStream);25706 m_pTacticalAI->Write(kStream);25707 m_pHomelandAI->Write(kStream);25708 m_pMinorCivAI->Write(kStream);25709 m_pDealAI->Write(kStream);25710 m_pBuilderTaskingAI->Write(kStream);25711 m_pCityConnections->Write(kStream);25712 m_pDangerPlots->Write(kStream);25713 m_pTraits->Write(kStream);25714 kStream << *m_pEspionage;25715 kStream << *m_pEspionageAI;25716 kStream << *m_pTrade;25717 kStream << *m_pTradeAI;25718 m_pLeagueAI->Write(kStream);25719 kStream << *m_pCulture;2572025721 if(m_pNotifications)25722 {25723 kStream << true;25724 m_pNotifications->Write(kStream);25725 }25726 else25727 {25728 kStream << false;25729 }25730#if defined(MOD_API_PLAYER_LOGS)25731 // MOD_SERIALIZE_WRITE - v68 broke the save format couldn't be helped, but don't make a habit of it!!!25732 if (m_pDiplomacyLog)25733 {25734 kStream << true;25735 m_pDiplomacyLog->Write(kStream);25736 }25737 else25738 {25739 kStream << false;25740 }2574125742 // MOD_SERIALIZE_WRITE - v68 broke the save format couldn't be helped, but don't make a habit of it!!!25743 if (m_pMilitaryLog)25744 {25745 kStream << true;25746 m_pMilitaryLog->Write(kStream);25747 }25748 else25749 {25750 kStream << false;25751 }25752#endif25753 m_pTreasury->Write(kStream);2575425755 kStream << m_ppaaiSpecialistExtraYield;25756#if defined(MOD_API_UNIFIED_YIELDS) && defined(MOD_API_PLOT_YIELDS)25757 // MOD_SERIALIZE_WRITE - v57/v58/v59 broke the save format couldn't be helped, but don't make a habit of it!!!25758 kStream << m_ppiPlotYieldChange;25759#endif25760#if defined(MOD_API_UNIFIED_YIELDS)25761 // MOD_SERIALIZE_WRITE - v57/v58/v59 and v61 broke the save format couldn't be helped, but don't make a habit of it!!!25762 kStream << m_ppiFeatureYieldChange;25763 kStream << m_ppiResourceYieldChange;25764 kStream << m_ppiTerrainYieldChange;25765 kStream << m_ppiTradeRouteYieldChange;25766 kStream << m_ppiSpecialistYieldChange;25767 kStream << m_ppiGreatPersonExpendedYield;25768 kStream << m_piGoldenAgeGreatPersonRateModifier;25769 kStream << m_ppiUnimprovedFeatureYieldChange;25770 kStream << m_ppiCityYieldFromUnimprovedFeature;25771 kStream << m_piYieldFromKills;25772 kStream << m_piYieldFromBarbarianKills;25773 kStream << m_piYieldChangeTradeRoute;25774 kStream << m_piYieldChangesNaturalWonder;25775 kStream << m_piYieldChangeWorldWonder;25776 kStream << m_ppiBuildingClassYieldChange;25777#endif25778 kStream << m_ppaaiImprovementYieldChange;2577925780 kStream << m_UnitCycle;25781 kStream << m_researchQueue;2578225783 kStream << m_bEverPoppedGoody;25784 kStream << m_bEverTrainedBuilder;25785 kStream << m_eEndTurnBlockingType;25786 kStream << m_iEndTurnBlockingNotificationIndex;2578725788 kStream << m_cityNames;25789 kStream << m_cities;25790 kStream << m_units;25791 kStream << m_armyAIs;2579225793 {25794 uint iSize = m_AIOperations.size();25795 kStream << iSize;25796 std::map<int, CvAIOperation*>::const_iterator it;25797 for(it = m_AIOperations.begin(); it != m_AIOperations.end(); ++it)25798 {25799 kStream << it->first;25800 CvAIOperation* pThisOperation = it->second;25801 kStream << pThisOperation->GetOperationType();25802 pThisOperation->Write(kStream);25803 }25804 }2580525806 kStream << m_ReplayDataSets;25807 kStream << m_ReplayDataSetValues;2580825809 kStream << m_aVote;25810 kStream << m_aUnitExtraCosts;2581125812 // writing out plot values25813 {25814 // trying to cut down how big saves are25815 int iSize = -1;25816 for(int i = m_aiPlots.size() - 1; i >= 0; i--)25817 {25818 if(m_aiPlots[i] != -1)25819 {25820 iSize = i + 1;25821 break;25822 }25823 }2582425825 if(iSize < 0)25826 {25827 iSize = 0;25828 }2582925830 kStream << iSize;25831 for(int i = 0; i < iSize; i++)25832 {25833 kStream << m_aiPlots[i];25834 }25835 }2583625837 kStream << m_iPopRushHurryCount;25838 kStream << m_iTotalImprovementsBuilt;2583925840 // writing out25841 {25842 int iSize = MAX_PLAYERS;25843 kStream << iSize;25844 for(int i = 0; i < iSize; i++)25845 {25846 bool bValue = m_bfEverConqueredBy.GetBit(i);25847 kStream << bValue;25848 }25849 }2585025851 kStream << m_strEmbarkedGraphicOverride;2585225853 m_kPlayerAchievements.Write(kStream);25854}