Hooks
static bool BeforeCvGame_Write(const CvGame* self, FDataStream& kStream);static void AfterCvGame_Write(const CvGame* self, FDataStream& kStream);static void ReplaceCvGame_Write(void (*original)(const CvGame*, FDataStream&), const CvGame* self, FDataStream& kStream);CivRegisterBefore<CivHooks::CvGame_Write>(host, &BeforeCvGame_Write);CivRegisterAfter<CivHooks::CvGame_Write>(host, &AfterCvGame_Write);CivRegisterReplace<CivHooks::CvGame_Write>(host, &ReplaceCvGame_Write);
Code
9751void CvGame::Write(FDataStream& kStream) const9752{9753 // Current version number9754 kStream << g_CurrentCvGameVersion;9755 MOD_SERIALIZE_INIT_WRITE(kStream);97569757 kStream << m_iEndTurnMessagesSent;9758 kStream << m_iElapsedGameTurns;9759 kStream << m_iStartTurn;9760 kStream << m_iWinningTurn;9761 kStream << m_iStartYear;9762 kStream << m_iEstimateEndTurn;9763 kStream << m_iDefaultEstimateEndTurn;9764 kStream << m_iTurnSlice;9765 kStream << m_iCutoffSlice;9766 kStream << m_iNumCities;9767 kStream << m_iTotalPopulation;9768 kStream << m_iNoNukesCount;9769 kStream << m_iNukesExploded;9770 kStream << m_iMaxPopulation;9771 kStream << m_iUnused1;9772 kStream << m_iUnused2;9773 kStream << m_iUnused3;9774 kStream << m_iInitPopulation;9775 kStream << m_iInitLand;9776 kStream << m_iInitTech;9777 kStream << m_iInitWonders;9778 kStream << m_iAIAutoPlay;9779 kStream << m_iTotalReligionTechCost;9780 kStream << m_iCachedWorldReligionTechProgress;9781 kStream << m_iUnitedNationsCountdown;9782 kStream << m_iNumVictoryVotesTallied;9783 kStream << m_iNumVictoryVotesExpected;9784 kStream << m_iVotesNeededForDiploVictory;9785 kStream << m_iMapScoreMod;97869787 // m_uiInitialTime not saved97889789 kStream << m_bScoreDirty;9790 kStream << m_bCircumnavigated;9791 // m_bDebugMode not saved9792 kStream << m_bFinalInitialized;9793 // m_bPbemTurnSent not saved9794 kStream << m_bHotPbemBetweenTurns;9795 // m_bPlayerOptionsSent not saved9796 kStream << m_bNukesValid;9797 kStream << m_bEndGameTechResearched;9798 kStream << TunerEverConnected();9799 kStream << m_bTutorialEverAttacked;9800 kStream << m_bStaticTutorialActive;9801 kStream << m_bEverRightClickMoved;9802 kStream << m_AdvisorMessagesViewed;98039804 kStream << m_eHandicap;9805 kStream << m_ePausePlayer;9806 kStream << m_eAIAutoPlayReturnPlayer;9807 kStream << m_eBestLandUnit;9808 kStream << m_eWinner;9809 kStream << m_eVictory;9810 kStream << m_eGameState;9811 kStream << m_eBestWondersPlayer;9812 kStream << m_eBestPoliciesPlayer;9813 kStream << m_eBestGreatPeoplePlayer;9814 kStream << m_eReligionTech;9815 kStream << m_eIndustrialRoute;98169817 kStream << m_strScriptData;98189819 kStream << ArrayWrapper<int>(MAX_PLAYERS, m_aiEndTurnMessagesReceived);9820 kStream << ArrayWrapper<int>(MAX_PLAYERS, m_aiRankPlayer);9821 kStream << ArrayWrapper<int>(MAX_PLAYERS, m_aiPlayerRank);9822 kStream << ArrayWrapper<int>(MAX_PLAYERS, m_aiPlayerScore);9823 kStream << ArrayWrapper<int>(MAX_TEAMS, m_aiRankTeam);9824 kStream << ArrayWrapper<int>(MAX_TEAMS, m_aiTeamRank);9825 kStream << ArrayWrapper<int>(MAX_TEAMS, m_aiTeamScore);98269827 UnitArrayHelpers::Write(kStream, m_paiUnitCreatedCount, GC.getNumUnitInfos());98289829 UnitClassArrayHelpers::Write(kStream, m_paiUnitClassCreatedCount, GC.getNumUnitClassInfos());9830 BuildingClassArrayHelpers::Write(kStream, m_paiBuildingClassCreatedCount, GC.getNumBuildingClassInfos());98319832 CvInfosSerializationHelper::WriteHashedDataArray<ProjectTypes, int>(kStream, m_paiProjectCreatedCount, GC.getNumProjectInfos());9833 CvInfosSerializationHelper::WriteHashedDataArray<VoteTypes, PlayerVoteTypes>(kStream, m_paiVoteOutcome, GC.getNumVoteInfos());98349835 CvInfosSerializationHelper::WriteHashedDataArray<VoteSourceTypes, int>(kStream, m_aiSecretaryGeneralTimer, GC.getNumVoteSourceInfos());9836 CvInfosSerializationHelper::WriteHashedDataArray<VoteSourceTypes, int>(kStream, m_aiVoteTimer, GC.getNumVoteSourceInfos());9837 CvInfosSerializationHelper::WriteHashedDataArray<VoteSourceTypes, int>(kStream, m_aiDiploVote, GC.getNumVoteSourceInfos());98389839 kStream << ArrayWrapper<int>(MAX_CIV_TEAMS, m_aiVotesCast);9840 kStream << ArrayWrapper<int>(MAX_CIV_TEAMS, m_aiPreviousVotesCast);9841 kStream << ArrayWrapper<int>(MAX_CIV_TEAMS, m_aiNumVotesForTeam);98429843 CvInfosSerializationHelper::WriteHashedDataArray<SpecialUnitTypes, bool>(kStream, m_pabSpecialUnitValid, GC.getNumSpecialUnitInfos());98449845 CvInfosSerializationHelper::WriteHashedDataArray<VictoryTypes, int>(kStream, m_ppaaiTeamVictoryRank, GC.getNUM_VICTORY_POINT_AWARDS(), GC.getNumSpecialUnitInfos());98469847 kStream << m_aszDestroyedCities;9848 kStream << m_aszGreatPeopleBorn;9849 kStream << m_voteSelections;9850 kStream << m_votesTriggered;98519852 m_mapRand.write(kStream);9853 m_jonRand.write(kStream);98549855 const int iSize = m_listReplayMessages.size();9856 kStream << CvReplayMessage::Version();9857 kStream << iSize;98589859 ReplayMessageList::const_iterator it;9860 for(it = m_listReplayMessages.begin(); it != m_listReplayMessages.end(); ++it)9861 {9862 (*it).write(kStream);9863 }98649865 kStream << m_iNumSessions;98669867 kStream << m_aPlotExtraYields;9868 kStream << m_aPlotExtraCosts;98699870 kStream << m_bArchaeologyTriggered;98719872 kStream << m_iEarliestBarbarianReleaseTurn;98739874 kStream << m_kGameDeals;9875 kStream << *m_pGameReligions;9876 kStream << *m_pGameCulture;9877 kStream << *m_pGameLeagues;9878 kStream << *m_pGameTrade;98799880 //In Version 8, Serialize Saved Game database9881 CvString strPath = gDLL->GetCacheFolderPath();9882 strPath += "Civ5SavedGameDatabase.db";98839884 //Need to Convert the UTF-8 string into a wide character string so windows can open this file.9885 wchar_t savePath[MAX_PATH] = {0};9886 MultiByteToWideChar(CP_UTF8, 0, strPath.c_str(), -1, savePath, MAX_PATH);98879888 HANDLE hFile = CreateFileW(savePath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);9889 if(hFile != INVALID_HANDLE_VALUE)9890 {9891 DWORD dwSize = GetFileSize(hFile, NULL);9892 if(dwSize != INVALID_FILE_SIZE)9893 {9894 byte* szBuffer = GetTempHeap()->Allocate(sizeof(char) * dwSize);9895 ZeroMemory((void*)szBuffer, dwSize);98969897 DWORD dwBytesRead = 0;9898 if(ReadFile(hFile, szBuffer, dwSize, &dwBytesRead, NULL) == TRUE)9899 {9900 //Serialize out the file size first.9901 kStream << dwBytesRead;9902 kStream.WriteIt(dwBytesRead, szBuffer);9903 }99049905 GetTempHeap()->DeAllocate(szBuffer);9906 }9907 else9908 {9909 CvAssertMsg(false, "Saved game database exists, but could not get file size???");9910 }9911 9912 if(CloseHandle(hFile) == FALSE)9913 {9914 CvAssertMsg(false, "Could not close file handle to saved game database!");9915 }9916 }9917 else9918 {9919 WIN32_FILE_ATTRIBUTE_DATA fileAttributes;9920 if(GetFileAttributesExW(savePath, GetFileExInfoStandard, &fileAttributes) != INVALID_FILE_ATTRIBUTES)9921 {9922 CvAssertMsg(false,"Saved game database exists, but could not open it!");9923 }99249925 long nilSize = 0;9926 kStream << nilSize;9927 }9928}