Hooks
static bool BeforeCvPlayerTraits_Read(CvPlayerTraits* self, FDataStream& kStream);static void AfterCvPlayerTraits_Read(CvPlayerTraits* self, FDataStream& kStream);static void ReplaceCvPlayerTraits_Read(void (*original)(CvPlayerTraits*, FDataStream&), CvPlayerTraits* self, FDataStream& kStream);CivRegisterBefore<CivHooks::CvPlayerTraits_Read>(host, &BeforeCvPlayerTraits_Read);CivRegisterAfter<CivHooks::CvPlayerTraits_Read>(host, &AfterCvPlayerTraits_Read);CivRegisterReplace<CivHooks::CvPlayerTraits_Read>(host, &ReplaceCvPlayerTraits_Read);
Code
3580/// Serialization read3581void CvPlayerTraits::Read(FDataStream& kStream)3582{3583 int iNumEntries;35843585 // Version number to maintain backwards compatibility3586 uint uiVersion;3587 kStream >> uiVersion;3588 MOD_SERIALIZE_INIT_READ(kStream);35893590 kStream >> m_iGreatPeopleRateModifier;3591 kStream >> m_iGreatScientistRateModifier;3592 kStream >> m_iGreatGeneralRateModifier;3593 kStream >> m_iGreatGeneralExtraBonus;35943595 kStream >> m_iGreatPersonGiftInfluence;35963597 kStream >> m_iLevelExperienceModifier;3598 kStream >> m_iMaxGlobalBuildingProductionModifier;3599 kStream >> m_iMaxTeamBuildingProductionModifier;3600 kStream >> m_iMaxPlayerBuildingProductionModifier;3601 kStream >> m_iCityUnhappinessModifier;3602 kStream >> m_iPopulationUnhappinessModifier;3603 kStream >> m_iCityStateBonusModifier;3604 kStream >> m_iCityStateFriendshipModifier;3605 kStream >> m_iCityStateCombatModifier;3606 kStream >> m_iLandBarbarianConversionPercent;3607 kStream >> m_iLandBarbarianConversionExtraUnits;3608 kStream >> m_iSeaBarbarianConversionPercent;3609 kStream >> m_iCapitalBuildingModifier;3610 kStream >> m_iPlotBuyCostModifier;3611#if defined(MOD_TRAITS_CITY_WORKING)3612 MOD_SERIALIZE_READ(23, kStream, m_iCityWorkingChange, 0);3613#endif3614#if defined(MOD_TRAITS_CITY_AUTOMATON_WORKERS)3615 MOD_SERIALIZE_READ(90, kStream, m_iCityAutomatonWorkersChange, 0);3616#endif3617 kStream >> m_iPlotCultureCostModifier;3618 kStream >> m_iCultureFromKills;3619 if (uiVersion >= 19)3620 {3621 kStream >> m_iFaithFromKills;3622 }3623 else3624 {3625 m_iFaithFromKills = 0;3626 }3627 kStream >> m_iCityCultureBonus;36283629 if (uiVersion >= 17)3630 {3631 kStream >> m_iCapitalThemingBonusModifier;3632 }3633 else3634 {3635 m_iCapitalThemingBonusModifier = 0;3636 }36373638 kStream >> m_iPolicyCostModifier;3639 kStream >> m_iCityConnectionTradeRouteChange;3640 kStream >> m_iWonderProductionModifier;3641 kStream >> m_iPlunderModifier;36423643 kStream >> m_iImprovementMaintenanceModifier;36443645 kStream >> m_iGoldenAgeDurationModifier;3646 kStream >> m_iGoldenAgeMoveChange;3647 kStream >> m_iGoldenAgeCombatModifier;36483649 if (uiVersion >= 2)3650 {3651 kStream >> m_iGoldenAgeTourismModifier;3652 kStream >> m_iGoldenAgeGreatArtistRateModifier;3653 kStream >> m_iGoldenAgeGreatMusicianRateModifier;3654 kStream >> m_iGoldenAgeGreatWriterRateModifier;3655 }3656 else3657 {3658 m_iGoldenAgeTourismModifier = 0;3659 m_iGoldenAgeGreatArtistRateModifier = 0;3660 m_iGoldenAgeGreatMusicianRateModifier = 0;3661 m_iGoldenAgeGreatWriterRateModifier = 0;3662 }36633664 kStream >> m_iExtraEmbarkMoves;36653666 kStream >> m_iNaturalWonderFirstFinderGold;36673668 kStream >> m_iNaturalWonderSubsequentFinderGold;36693670 kStream >> m_iNaturalWonderYieldModifier;3671 kStream >> m_iNaturalWonderHappinessModifier;36723673 kStream >> m_iNearbyImprovementCombatBonus;3674 kStream >> m_iNearbyImprovementBonusRange;36753676 kStream >> m_iCultureBuildingYieldChange;36773678 kStream >> m_iCombatBonusVsHigherTech;36793680 kStream >> m_iCombatBonusVsLargerCiv;36813682 kStream >> m_iLandUnitMaintenanceModifier;36833684 kStream >> m_iNavalUnitMaintenanceModifier;36853686 kStream >> m_iRazeSpeedModifier;36873688 kStream >> m_iDOFGreatPersonModifier;36893690 kStream >> m_iLuxuryHappinessRetention;36913692#if defined(MOD_TRAITS_EXTRA_SUPPLY)3693 MOD_SERIALIZE_READ(78, kStream, m_iExtraSupply, 0);3694 MOD_SERIALIZE_READ(78, kStream, m_iExtraSupplyPerCity, 0);3695 MOD_SERIALIZE_READ(78, kStream, m_iExtraSupplyPerPopulation, 0);3696#endif36973698 kStream >> m_iExtraSpies;36993700 kStream >> m_iUnresearchedTechBonusFromKills;37013702 if (uiVersion >= 4)3703 {3704 kStream >> m_iExtraFoundedCityTerritoryClaimRange;3705 }3706 else3707 {3708 m_iExtraFoundedCityTerritoryClaimRange = 0;3709 }37103711 if (uiVersion >= 5)3712 {3713 kStream >> m_iFreeSocialPoliciesPerEra;3714 }3715 else3716 {3717 m_iFreeSocialPoliciesPerEra = 0;3718 }37193720 if (uiVersion >= 6)3721 {3722 kStream >> m_iNumTradeRoutesModifier;3723 }3724 else3725 {3726 m_iNumTradeRoutesModifier = 0;3727 }37283729 if (uiVersion >= 8)3730 {3731 kStream >> m_iTradeRouteResourceModifier;3732 }3733 else3734 {3735 m_iTradeRouteResourceModifier = 0;3736 }37373738 if (uiVersion >= 9)3739 {3740 kStream >> m_iUniqueLuxuryCities;3741 kStream >> m_iUniqueLuxuryQuantity;3742 }3743 else3744 {3745 m_iUniqueLuxuryCities = 0;3746 m_iUniqueLuxuryQuantity = 0;3747 }37483749 if (uiVersion >= 11)3750 {3751 kStream >> m_iUniqueLuxuryCitiesPlaced;3752 }3753 else3754 {3755 m_iUniqueLuxuryCitiesPlaced = 0;3756 }37573758 if (uiVersion >= 13)3759 {3760 kStream >> m_iWorkerSpeedModifier;3761 }3762 else3763 {3764 m_iWorkerSpeedModifier = 0;3765 }37663767 if (uiVersion >= 14)3768 {3769 kStream >> m_iAfraidMinorPerTurnInfluence;3770 }3771 else3772 {3773 m_iAfraidMinorPerTurnInfluence = 0;3774 }3775 3776 if (uiVersion >= 15)3777 {3778 kStream >> m_iLandTradeRouteRangeBonus;3779 kStream >> m_iTradeReligionModifier;3780 }3781 else3782 {3783 m_iLandTradeRouteRangeBonus = 0;3784 m_iTradeReligionModifier = 0;3785 }37863787 if (uiVersion >= 16)3788 {3789 kStream >> m_iTradeBuildingModifier;3790 }3791 else3792 {3793 m_iTradeBuildingModifier = 0;3794 }37953796#if defined(MOD_TRAITS_TRADE_ROUTE_BONUSES)3797 MOD_SERIALIZE_READ(52, kStream, m_iSeaTradeRouteRangeBonus, 0);3798#endif37993800 kStream >> m_bFightWellDamaged;3801 kStream >> m_bMoveFriendlyWoodsAsRoad;3802 kStream >> m_bFasterAlongRiver;38033804 kStream >> m_bFasterInHills;38053806 kStream >> m_bEmbarkedAllWater;38073808 kStream >> m_bEmbarkedToLandFlatCost;38093810 kStream >> m_bNoHillsImprovementMaintenance;38113812 kStream >> m_bTechBoostFromCapitalScienceBuildings;3813 kStream >> m_bStaysAliveZeroCities;38143815 kStream >> m_bFaithFromUnimprovedForest;38163817#if defined(MOD_TRAITS_ANY_BELIEF)3818 MOD_SERIALIZE_READ(46, kStream, m_bAnyBelief, false);3819#endif3820 kStream >> m_bBonusReligiousBelief;38213822 kStream >> m_bAbleToAnnexCityStates;38233824 kStream >> m_bCrossesMountainsAfterGreatGeneral;3825#if defined(MOD_TRAITS_CROSSES_ICE)3826 MOD_SERIALIZE_READ(23, kStream, m_bCrossesIce, false);3827#endif3828#if defined(MOD_TRAITS_GG_FROM_BARBARIANS)3829 MOD_SERIALIZE_READ(83, kStream, m_bGGFromBarbarians, false);3830#endif38313832 kStream >> m_bMayaCalendarBonuses;3833 kStream >> m_iBaktunPreviousTurn;38343835 kStream >> iNumEntries;3836 m_aMayaBonusChoices.clear();3837 MayaBonusChoice choice;3838 for(int iI = 0; iI < iNumEntries; iI++)3839 {3840 kStream >> choice.m_eUnitType;3841 kStream >> choice.m_iBaktunJustFinished;3842 m_aMayaBonusChoices.push_back(choice);3843 }38443845 kStream >> m_bNoAnnexing;3846 if (uiVersion >= 3)3847 {3848 kStream >> m_bTechFromCityConquer;3849 }3850 else3851 {3852 m_bTechFromCityConquer = false;3853 }38543855 if (uiVersion >= 9)3856 {3857 kStream >> m_bUniqueLuxuryRequiresNewArea;3858 }3859 else3860 {3861 m_bUniqueLuxuryRequiresNewArea = false;3862 }38633864 if (uiVersion >= 12)3865 {3866 kStream >> m_bRiverTradeRoad;3867 }3868 else3869 {3870 m_bRiverTradeRoad = false;3871 }38723873 if (uiVersion >= 18)3874 {3875 kStream >> m_bAngerFreeIntrusionOfCityStates;3876 }3877 else3878 {3879 m_bAngerFreeIntrusionOfCityStates = false;3880 }38813882 kStream >> m_eCampGuardType;38833884 kStream >> m_eCombatBonusImprovement;38853886 ArrayWrapper<int> kExtraYieldThreshold(NUM_YIELD_TYPES, m_iExtraYieldThreshold);3887 kStream >> kExtraYieldThreshold;38883889 ArrayWrapper<int> kFreeCityYield(NUM_YIELD_TYPES, m_iFreeCityYield);3890 kStream >> kFreeCityYield;38913892 ArrayWrapper<int> kYieldChangeResourcesWrapper(NUM_YIELD_TYPES, m_iYieldChangeStrategicResources);3893 kStream >> kYieldChangeResourcesWrapper;38943895 ArrayWrapper<int> kYieldRateModifierWrapper(NUM_YIELD_TYPES, m_iYieldRateModifier);3896 kStream >> kYieldRateModifierWrapper;38973898 ArrayWrapper<int> kYieldChangeNaturalWonderWrapper(NUM_YIELD_TYPES, m_iYieldChangeNaturalWonder);3899 kStream >> kYieldChangeNaturalWonderWrapper;39003901 if (uiVersion >= 7)3902 {3903 ArrayWrapper<int> kYieldChangePerTradePartnerWrapper(NUM_YIELD_TYPES, m_iYieldChangePerTradePartner);3904 kStream >> kYieldChangePerTradePartnerWrapper;39053906 ArrayWrapper<int> kYieldChangeIncomingTradeRouteWrapper(NUM_YIELD_TYPES, m_iYieldChangeIncomingTradeRoute);3907 kStream >> kYieldChangeIncomingTradeRouteWrapper;3908 }3909 else3910 {3911 for(int iYield = 0; iYield < NUM_YIELD_TYPES; iYield++)3912 {3913 m_iYieldChangePerTradePartner[iYield] = 0;3914 m_iYieldChangeIncomingTradeRoute[iYield] = 0;3915 }3916 }39173918 CvAssert(GC.getNumTerrainInfos() == NUM_TERRAIN_TYPES); // If this is not true, m_iStrategicResourceQuantityModifier must be resized dynamically3919 CvInfosSerializationHelper::ReadHashedDataArray(kStream, &m_iStrategicResourceQuantityModifier[0], GC.getNumTerrainInfos());39203921 CvInfosSerializationHelper::ReadHashedDataArray(kStream, m_aiResourceQuantityModifier);39223923 kStream >> iNumEntries;3924 m_abNoTrain.clear();3925 for (int i = 0; i < iNumEntries; i++)3926 {3927 bool bValue;3928 kStream >> bValue;3929 m_abNoTrain.push_back(bValue);3930 }39313932 kStream >> iNumEntries;3933 m_aFreeTraitUnits.clear();3934 for(int iI = 0; iI < iNumEntries; iI++)3935 {3936 FreeTraitUnit trait;3937 kStream >> trait.m_iFreeUnit;3938 kStream >> trait.m_ePrereqTech;3939 m_aFreeTraitUnits.push_back(trait);3940 }39413942 kStream >> iNumEntries;3943 for(int iI = 0; iI < iNumEntries; iI++)3944 {3945 kStream >> m_paiMovesChangeUnitCombat[iI];3946 }3947 if (uiVersion >= 10)3948 {3949 for(int iI = 0; iI < iNumEntries; iI++)3950 {3951 kStream >> m_paiMaintenanceModifierUnitCombat[iI];3952 }3953 }3954 else3955 {3956 int iNumUnitCombatClassInfos = GC.getNumUnitCombatClassInfos();3957 m_paiMaintenanceModifierUnitCombat.resize(iNumUnitCombatClassInfos);3958 for(int iI = 0; iI < iNumUnitCombatClassInfos; iI++)3959 {3960 m_paiMaintenanceModifierUnitCombat[iI] = 0;3961 }3962 }39633964 kStream >> m_ppaaiImprovementYieldChange;3965#if defined(MOD_API_UNIFIED_YIELDS) && defined(MOD_API_PLOT_YIELDS)3966 // MOD_SERIALIZE_READ - v57/v58/v59 broke the save format couldn't be helped, but don't make a habit of it!!!3967 kStream >> m_ppiPlotYieldChange;3968#endif3969#if defined(MOD_API_UNIFIED_YIELDS)3970 // MOD_SERIALIZE_READ - v57/v58/v59 and v61 broke the save format couldn't be helped, but don't make a habit of it!!!3971 kStream >> m_ppiBuildingClassYieldChange;3972 3973 ArrayWrapper<int> kCapitalYieldChangesWrapper(NUM_YIELD_TYPES, m_iCapitalYieldChanges);3974 kStream >> kCapitalYieldChangesWrapper;39753976 ArrayWrapper<int> kCityYieldChangesWrapper(NUM_YIELD_TYPES, m_iCityYieldChanges);3977 kStream >> kCityYieldChangesWrapper;39783979 ArrayWrapper<int> kCoastalCityYieldChangesWrapper(NUM_YIELD_TYPES, m_iCoastalCityYieldChanges);3980 kStream >> kCoastalCityYieldChangesWrapper;39813982 ArrayWrapper<int> kGreatWorkYieldChangesWrapper(NUM_YIELD_TYPES, m_iGreatWorkYieldChanges);3983 kStream >> kGreatWorkYieldChangesWrapper;39843985 kStream >> m_ppiFeatureYieldChange;3986 kStream >> m_ppiResourceYieldChange;3987 kStream >> m_ppiTerrainYieldChange;39883989 ArrayWrapper<int> kYieldFromKillsWrapper(NUM_YIELD_TYPES, m_iYieldFromKills);3990 kStream >> kYieldFromKillsWrapper;39913992 ArrayWrapper<int> kYieldFromBarbarianKillsWrapper(NUM_YIELD_TYPES, m_iYieldFromBarbarianKills);3993 kStream >> kYieldFromBarbarianKillsWrapper;39943995 ArrayWrapper<int> kYieldChangeTradeRouteWrapper(NUM_YIELD_TYPES, m_iYieldChangeTradeRoute);3996 kStream >> kYieldChangeTradeRouteWrapper;39973998 ArrayWrapper<int> kYieldChangeWorldWonderWrapper(NUM_YIELD_TYPES, m_iYieldChangeWorldWonder);3999 kStream >> kYieldChangeWorldWonderWrapper;40004001 kStream >> m_ppiTradeRouteYieldChange;4002#endif4003 kStream >> m_ppaaiSpecialistYieldChange;40044005#if defined(MOD_API_UNIFIED_YIELDS)4006 kStream >> m_ppiGreatPersonExpendedYield;4007 kStream >> m_piGoldenAgeGreatPersonRateModifier;4008 kStream >> m_ppiCityYieldFromUnimprovedFeature;4009#endif4010 kStream >> m_ppaaiUnimprovedFeatureYieldChange;40114012 if (uiVersion >= 11)4013 {4014 kStream >> iNumEntries;4015 m_aUniqueLuxuryAreas.clear();4016 for (int iI = 0; iI < iNumEntries; iI++)4017 {4018 int iAreaID;4019 kStream >> iAreaID;4020 m_aUniqueLuxuryAreas.push_back(iAreaID);4021 }4022 }4023 else if (uiVersion >= 9)4024 {4025 kStream >> m_aUniqueLuxuryAreas;4026 }4027 else4028 {4029 m_aUniqueLuxuryAreas.clear();4030 }4031}