Hooks
static bool BeforeCvPreGame_readArchive(FDataStream& loadFrom, bool bReadVersion);static void AfterCvPreGame_readArchive(FDataStream& loadFrom, bool bReadVersion);static void ReplaceCvPreGame_readArchive(void (*original)(FDataStream&, bool), FDataStream& loadFrom, bool bReadVersion);CivRegisterBefore<CivHooks::CvPreGame_readArchive>(host, &BeforeCvPreGame_readArchive);CivRegisterAfter<CivHooks::CvPreGame_readArchive>(host, &AfterCvPreGame_readArchive);CivRegisterReplace<CivHooks::CvPreGame_readArchive>(host, &ReplaceCvPreGame_readArchive);
Code
1725void readArchive(FDataStream& loadFrom, bool bReadVersion)1726{1727 uint uiVersion = 0;1728 if(bReadVersion)1729 loadFrom >> uiVersion;17301731 loadFrom >> s_activePlayer;1732 loadFrom >> s_adminPassword;1733 loadFrom >> s_advancedStartPoints;1734 loadFrom >> s_alias;1735 loadFrom >> s_artStyles;1736 loadFrom >> s_autorun;1737 loadFrom >> s_autorunTurnDelay;1738 loadFrom >> s_autorunTurnLimit;1739 loadFrom >> s_bandwidth;1740 loadFrom >> s_calendar;1741 loadFrom >> s_calendarInfo;1742 loadFrom >> s_civAdjectives;1743 loadFrom >> s_civDescriptions;1744 if (uiVersion <= 2) // Read the civilization indices. Newer versions have the keys in the header.1745 loadFrom >> s_civilizations;17461747 loadFrom >> s_civPasswords;1748 loadFrom >> s_civShortDescriptions;1749 loadFrom >> s_climate;1750 loadFrom >> s_climateInfo;1751 loadFrom >> s_era;1752 loadFrom >> s_emailAddresses;1753 loadFrom >> s_endTurnTimerLength;1754 loadFrom >> s_flagDecals;1755 loadFrom >> s_DEPRECATEDforceControls;1756 loadFrom >> s_gameMode;1757 loadFrom >> s_gameName;1758 loadFrom >> s_gameSpeed;1759 loadFrom >> s_gameStarted;1760 loadFrom >> s_gameTurn;1761 if(uiVersion >= 1)1762 {1763 loadFrom >> s_gameType;1764 loadFrom >> s_gameMapType;1765 }1766 else1767 {1768 // Old enum that was trying to cram too much info into a sequence1769 enum GameType1770 {1771 GAME_NONE = -1,17721773 GAME_SP_NEW,1774 GAME_SP_SCENARIO,1775 GAME_SP_LOAD,1776 GAME_MP_NEW,1777 GAME_MP_SCENARIO,1778 GAME_MP_LOAD,1779 GAME_HOTSEAT_NEW,1780 GAME_HOTSEAT_SCENARIO,1781 GAME_HOTSEAT_LOAD,1782 GAME_PBEM_NEW,1783 GAME_PBEM_SCENARIO,1784 GAME_PBEM_LOAD,17851786 NUM_GAMETYPES1787 };17881789 int iDummy;1790 loadFrom >> iDummy;1791 GameType eGameType = static_cast<GameType>(iDummy);17921793 // Convert the old one to the new format17941795 if((eGameType == GAME_HOTSEAT_NEW) || (eGameType == GAME_HOTSEAT_SCENARIO) || (eGameType == GAME_HOTSEAT_LOAD))1796 s_gameType = GAME_HOTSEAT_MULTIPLAYER;1797 else if((eGameType == GAME_MP_NEW) || (eGameType == GAME_MP_SCENARIO) || (eGameType == GAME_MP_LOAD))1798 s_gameType = GAME_NETWORK_MULTIPLAYER;1799 else if((eGameType == GAME_SP_NEW) || (eGameType == GAME_SP_SCENARIO) || (eGameType == GAME_SP_LOAD))1800 s_gameType = GAME_SINGLE_PLAYER;1801 else1802 {1803 if(s_gameType == GAME_TYPE_NONE)1804 s_gameType = GAME_SINGLE_PLAYER; // I've seen this saved as -1 (GAME_NONE)1805 }18061807 s_gameMapType = GAME_USER_PARAMETERS;1808 if((eGameType == GAME_MP_SCENARIO) || (eGameType == GAME_HOTSEAT_SCENARIO) || (eGameType == GAME_SP_SCENARIO))1809 s_gameMapType = GAME_SCENARIO;18101811 }1812 loadFrom >> s_gameUpdateTime;1813 loadFrom >> s_handicaps;1814 if(uiVersion >= 6){1815 loadFrom >> s_lastHumanHandicaps;1816 }18171818 loadFrom >> s_isEarthMap;1819 loadFrom >> s_isInternetGame;1820 if(uiVersion == 0)1821 {1822 bool bNetworkMultiplayerGame;1823 loadFrom >> bNetworkMultiplayerGame;1824 if(bNetworkMultiplayerGame && s_gameType != GAME_HOTSEAT_MULTIPLAYER)1825 {1826 s_gameType = GAME_NETWORK_MULTIPLAYER;1827 }1828 }1829 if (uiVersion <= 2) // Read the leader indices. Newer versions have the keys in the header.1830 loadFrom >> s_leaderHeads;1831 loadFrom >> s_leaderNames;1832 loadFrom >> s_loadFileName;1833 loadFrom >> s_localPlayerEmailAddress;1834 loadFrom >> s_mapNoPlayers;1835 loadFrom >> s_mapRandomSeed;1836 loadFrom >> s_loadWBScenario;1837 loadFrom >> s_overrideScenarioHandicap;1838 loadFrom >> s_mapScriptName;1839 loadFrom >> s_maxCityElimination;1840 loadFrom >> s_maxTurns;1841 loadFrom >> s_numMinorCivs;1842 if (uiVersion >= 3)1843 {1844 CvInfosSerializationHelper::ReadTypeArrayDBLookup<MinorCivTypes>(loadFrom, s_minorCivTypes.dirtyGet(), "MinorCivilizations"); 1845 s_minorCivTypes.clearDelta();1846 }1847 else1848 loadFrom >> s_minorCivTypes;1849 loadFrom >> s_minorNationCivs;1850 loadFrom >> s_dummyvalue;1851 loadFrom >> s_multiplayerOptions;1852 loadFrom >> s_netIDs;1853 loadFrom >> s_nicknames;1854 loadFrom >> s_numVictoryInfos;1855 loadFrom >> s_pitBossTurnTime;1856 loadFrom >> s_playableCivs;1857 if (uiVersion >= 3)1858 {1859 CvInfosSerializationHelper::ReadTypeArrayDBLookup<PlayerColorTypes>(loadFrom, s_playerColors.dirtyGet(), "PlayerColors");1860 s_playerColors.clearDelta();1861 }1862 else1863 loadFrom >> s_playerColors;18641865 loadFrom >> s_privateGame;1866 loadFrom >> s_quickCombat;1867 loadFrom >> s_quickCombatDefault;1868 loadFrom >> s_quickHandicap;1869 loadFrom >> s_quickstart;1870 loadFrom >> s_randomWorldSize;1871 loadFrom >> s_randomMapScript;1872 loadFrom >> s_readyPlayers;1873 loadFrom >> s_seaLevel;1874 loadFrom >> s_seaLevelInfo;1875 loadFrom >> s_dummyvalue2;1876 loadFrom >> s_slotClaims;1877 loadFrom >> s_slotStatus;1878 loadFrom >> s_smtpHost;1879 loadFrom >> s_syncRandomSeed;1880 loadFrom >> s_targetScore;1881 loadFrom >> s_teamTypes;1882 loadFrom >> s_transferredMap;1883 loadFrom >> s_turnTimer;1884 loadFrom >> s_turnTimerType;1885 loadFrom >> s_bCityScreenBlocked;1886 loadFrom >> s_victories;1887 loadFrom >> s_whiteFlags;1888 if(uiVersion <= 1)1889 s_worldInfo.dirtyGet().readFromVersion0(loadFrom);1890 else1891 loadFrom >> s_worldInfo;18921893 loadFrom >> s_worldSize;1894 loadFrom >> s_GameOptions;1895 loadFrom >> s_MapOptions;1896 loadFrom >> s_versionString;18971898 if (uiVersion >= 4)1899 loadFrom >> s_turnNotifySteamInvite;19001901 if (uiVersion >= 5){1902 loadFrom >> s_turnNotifyEmail;1903 loadFrom >> s_turnNotifyEmailAddress;1904 }19051906 // Rebuild the hash lookup to the options1907 s_GameOptionsHash.clear();1908 for(size_t i = 0; i < s_GameOptions.size(); i++)1909 {1910 const CustomOption& kOption = s_GameOptions[i];1911 s_GameOptionsHash[FString::Hash(kOption.GetName())] = i;1912 }1913}