Hooks
static bool BeforeCvGame_Read(CvGame* self, FDataStream& kStream);static void AfterCvGame_Read(CvGame* self, FDataStream& kStream);static void ReplaceCvGame_Read(void (*original)(CvGame*, FDataStream&), CvGame* self, FDataStream& kStream);CivRegisterBefore<CivHooks::CvGame_Read>(host, &BeforeCvGame_Read);CivRegisterAfter<CivHooks::CvGame_Read>(host, &AfterCvGame_Read);CivRegisterReplace<CivHooks::CvGame_Read>(host, &ReplaceCvGame_Read);
Code
9499void CvGame::Read(FDataStream& kStream)9500{9501 int iI;95029503 reset(NO_HANDICAP);95049505 // Version number to maintain backwards compatibility9506 uint uiVersion;9507 kStream >> uiVersion;9508 MOD_SERIALIZE_INIT_READ(kStream);95099510 kStream >> m_iEndTurnMessagesSent;9511 kStream >> m_iElapsedGameTurns;9512 kStream >> m_iStartTurn;9513 kStream >> m_iWinningTurn;9514 kStream >> m_iStartYear;9515 kStream >> m_iEstimateEndTurn;9516 m_iDefaultEstimateEndTurn = m_iEstimateEndTurn;9517 kStream >> m_iDefaultEstimateEndTurn;9518 kStream >> m_iTurnSlice;9519 kStream >> m_iCutoffSlice;9520 kStream >> m_iNumCities;9521 kStream >> m_iTotalPopulation;9522 kStream >> m_iNoNukesCount;9523 kStream >> m_iNukesExploded;9524 kStream >> m_iMaxPopulation;9525 kStream >> m_iUnused1;9526 kStream >> m_iUnused2;9527 kStream >> m_iUnused3;9528 kStream >> m_iInitPopulation;9529 kStream >> m_iInitLand;9530 kStream >> m_iInitTech;9531 kStream >> m_iInitWonders;9532 kStream >> m_iAIAutoPlay;95339534 if(m_iAIAutoPlay > 0)9535 {9536 m_iAIAutoPlay = 1;9537 }95389539 kStream >> m_iTotalReligionTechCost;9540 kStream >> m_iCachedWorldReligionTechProgress;9541 kStream >> m_iUnitedNationsCountdown;9542 kStream >> m_iNumVictoryVotesTallied;9543 kStream >> m_iNumVictoryVotesExpected;9544 kStream >> m_iVotesNeededForDiploVictory;9545 kStream >> m_iMapScoreMod;95469547 // m_uiInitialTime not saved95489549 kStream >> m_bScoreDirty;9550 kStream >> m_bCircumnavigated;9551 // m_bDebugMode not saved9552 kStream >> m_bFinalInitialized;9553 // m_bPbemTurnSent not saved9554 kStream >> m_bHotPbemBetweenTurns;9555 // m_bPlayerOptionsSent not saved9556 kStream >> m_bNukesValid;9557 kStream >> m_bEndGameTechResearched;9558 kStream >> m_bTunerEverConnected;9559 kStream >> m_bTutorialEverAttacked;9560 kStream >> m_bStaticTutorialActive;9561 kStream >> m_bEverRightClickMoved;9562 kStream >> m_AdvisorMessagesViewed;9563 kStream >> m_eHandicap;9564 kStream >> m_ePausePlayer;9565 kStream >> m_eAIAutoPlayReturnPlayer;9566 kStream >> m_eBestLandUnit;9567 kStream >> m_eWinner;9568 kStream >> m_eVictory;9569 kStream >> m_eGameState;9570 if(m_eGameState == GAMESTATE_OVER)9571 {9572 m_eGameState = GAMESTATE_EXTENDED;9573 }9574 kStream >> m_eBestWondersPlayer;9575 kStream >> m_eBestPoliciesPlayer;9576 kStream >> m_eBestGreatPeoplePlayer;9577 kStream >> m_eReligionTech;9578 kStream >> m_eIndustrialRoute;95799580 kStream >> m_strScriptData;95819582 ArrayWrapper<int> wrapm_aiEndTurnMessagesReceived(MAX_PLAYERS, m_aiEndTurnMessagesReceived);9583 kStream >> wrapm_aiEndTurnMessagesReceived;95849585 ArrayWrapper<int> wrapm_aiRankPlayer(MAX_PLAYERS, m_aiRankPlayer);9586 kStream >> wrapm_aiRankPlayer;95879588 ArrayWrapper<int> wrapm_aiPlayerRank(MAX_PLAYERS, m_aiPlayerRank);9589 kStream >> wrapm_aiPlayerRank;95909591 ArrayWrapper<int> wrapm_aiPlayerScore(MAX_PLAYERS, m_aiPlayerScore);9592 kStream >> wrapm_aiPlayerScore;95939594 ArrayWrapper<int> wrapm_aiRankTeam(MAX_TEAMS, m_aiRankTeam);9595 kStream >> wrapm_aiRankTeam;95969597 ArrayWrapper<int> wrapm_aiTeamRank(MAX_TEAMS, m_aiTeamRank);9598 kStream >> wrapm_aiTeamRank;95999600 ArrayWrapper<int> wrapm_aiTeamScore(MAX_TEAMS, m_aiTeamScore);9601 kStream >> wrapm_aiTeamScore;96029603 UnitArrayHelpers::Read(kStream, m_paiUnitCreatedCount);9604 UnitClassArrayHelpers::Read(kStream, m_paiUnitClassCreatedCount);9605 BuildingClassArrayHelpers::Read(kStream, m_paiBuildingClassCreatedCount);96069607 CvInfosSerializationHelper::ReadHashedDataArray(kStream, m_paiProjectCreatedCount, GC.getNumProjectInfos());9608 CvInfosSerializationHelper::ReadHashedDataArray(kStream, m_paiVoteOutcome, GC.getNumVoteInfos());96099610 CvInfosSerializationHelper::ReadHashedDataArray(kStream, m_aiSecretaryGeneralTimer, GC.getNumVoteSourceInfos());9611 CvInfosSerializationHelper::ReadHashedDataArray(kStream, m_aiVoteTimer, GC.getNumVoteSourceInfos());9612 CvInfosSerializationHelper::ReadHashedDataArray(kStream, m_aiDiploVote, GC.getNumVoteSourceInfos());96139614 ArrayWrapper<int> wrapm_aiVotesCast(MAX_CIV_TEAMS, m_aiVotesCast);9615 kStream >> wrapm_aiVotesCast;96169617 ArrayWrapper<int> wrapm_aiPreviousVotesCast(MAX_CIV_TEAMS, m_aiPreviousVotesCast);9618 kStream >> wrapm_aiPreviousVotesCast;96199620 ArrayWrapper<int> wrapm_aiNumVotesForTeam(MAX_CIV_TEAMS, m_aiNumVotesForTeam);9621 kStream >> wrapm_aiNumVotesForTeam;96229623 CvInfosSerializationHelper::ReadHashedDataArray(kStream, m_pabSpecialUnitValid, GC.getNumSpecialUnitInfos());96249625 CvInfosSerializationHelper::ReadHashedDataArray(kStream, m_ppaaiTeamVictoryRank, GC.getNUM_VICTORY_POINT_AWARDS(), GC.getNumVictoryInfos());96269627 kStream >> m_aszDestroyedCities;9628 kStream >> m_aszGreatPeopleBorn;9629 kStream >> m_voteSelections;9630 kStream >> m_votesTriggered;96319632 m_mapRand.read(kStream);9633 bool wasCallStackDebuggingEnabled = m_jonRand.callStackDebuggingEnabled();9634 m_jonRand.read(kStream);9635 m_jonRand.clearCallstacks();9636 m_jonRand.setCallStackDebuggingEnabled(wasCallStackDebuggingEnabled);96379638 {9639 clearReplayMessageMap();96409641 unsigned int uiReplayMessageVersion = 1;9642 int iSize = 0;96439644 kStream >> uiReplayMessageVersion;96459646 kStream >> iSize;9647 for(int i = 0; i < iSize; i++)9648 {9649 CvReplayMessage message;9650 message.read(kStream, uiReplayMessageVersion);9651 m_listReplayMessages.push_back(message);9652 }96539654 }96559656 kStream >> m_iNumSessions;9657 if(!isNetworkMultiPlayer())9658 {9659 ++m_iNumSessions;9660 }96619662 kStream >> m_aPlotExtraYields;9663 kStream >> m_aPlotExtraCosts;966496659666 // Get the active player information from the initialization structure9667 if(!isGameMultiPlayer())9668 {9669 for(iI = 0; iI < MAX_CIV_PLAYERS; iI++)9670 {9671 if(GET_PLAYER((PlayerTypes)iI).isHuman())9672 {9673 setActivePlayer((PlayerTypes)iI);9674 break;9675 }9676 }9677 Localization::String localizedText = Localization::Lookup("TXT_KEY_MISC_RELOAD");9678 localizedText << m_iNumSessions;9679 addReplayMessage(REPLAY_MESSAGE_MAJOR_EVENT, getActivePlayer(), localizedText.toUTF8());9680 }96819682 if(isOption(GAMEOPTION_NEW_RANDOM_SEED))9683 {9684 if(!isNetworkMultiPlayer())9685 {9686 m_jonRand.reseed(timeGetTime());9687 }9688 }96899690 kStream >> m_bArchaeologyTriggered;96919692 kStream >> m_iEarliestBarbarianReleaseTurn;9693 kStream >> m_kGameDeals;9694 kStream >> *m_pGameReligions;9695 kStream >> *m_pGameCulture;9696 kStream >> *m_pGameLeagues;9697 kStream >> *m_pGameTrade;96989699 unsigned int lSize = 0;9700 kStream >> lSize;9701 if(lSize > 0)9702 {9703 //Deserialize the embedded SQLite database file.9704 CvString strUTF8DatabasePath = gDLL->GetCacheFolderPath();9705 strUTF8DatabasePath += "Civ5SavedGameDatabase.db";97069707 // Need to Convert the UTF-8 string into a wide character string.9708 std::wstring wstrDatabasePath = CvStringUtils::FromUTF8ToUTF16(strUTF8DatabasePath);97099710 FIFile* pkFile = FFILESYSTEM.Create(wstrDatabasePath.c_str(), FIFile::modeWrite);9711 if (pkFile != NULL)9712 {9713 byte* szBuffer = GetTempHeap()->Allocate(sizeof(char) * lSize);9714 ZeroMemory((void*)szBuffer, lSize);97159716 kStream.ReadIt(lSize, szBuffer);97179718 pkFile->Write(szBuffer, lSize);97199720 pkFile->Close();97219722 GetTempHeap()->DeAllocate(szBuffer);9723 }9724 else9725 {9726 CvAssertMsg(false, "Cannot open Civ5SavedGameDatabase.db for write! Does something have this opened?");9727 }9728 }97299730 //when loading from file, we need to reset m_lastTurnAICivsProcessed 9731 //so that updateMoves() can turn active players after loading an autosave in simultaneous turns multiplayer.9732 m_lastTurnAICivsProcessed = -1;9733}