Răsfoiți Sursa

Reorganized types registration code

Ivan Savenko 1 an în urmă
părinte
comite
5c810df36f

+ 1 - 1
client/CServerHandler.cpp

@@ -47,7 +47,7 @@
 #include "../lib/modding/ModIncompatibility.h"
 #include "../lib/rmg/CMapGenOptions.h"
 #include "../lib/filesystem/Filesystem.h"
-#include "../lib/registerTypes/RegisterTypes.h"
+#include "../lib/registerTypes/RegisterTypesLobbyPacks.h"
 #include "../lib/serializer/Connection.h"
 #include "../lib/serializer/CMemorySerializer.h"
 

+ 3 - 3
client/Client.cpp

@@ -24,6 +24,7 @@
 #include "../CCallback.h"
 #include "../lib/CConfigHandler.h"
 #include "../lib/gameState/CGameState.h"
+#include "../lib/CPlayerState.h"
 #include "../lib/CThreadHelper.h"
 #include "../lib/VCMIDirs.h"
 #include "../lib/UnlockGuard.h"
@@ -32,7 +33,7 @@
 #include "../lib/mapping/CMapService.h"
 #include "../lib/pathfinder/CGPathNode.h"
 #include "../lib/filesystem/Filesystem.h"
-#include "../lib/registerTypes/RegisterTypes.h"
+#include "../lib/registerTypes/RegisterTypesClientPacks.h"
 #include "../lib/serializer/Connection.h"
 
 #include <memory>
@@ -137,8 +138,7 @@ CClient::CClient()
 {
 	waitingRequest.clear();
 	applier = std::make_shared<CApplier<CBaseForCLApply>>();
-	registerTypesClientPacks1(*applier);
-	registerTypesClientPacks2(*applier);
+	registerTypesClientPacks(*applier);
 	IObjectInterface::cb = this;
 	gs = nullptr;
 }

+ 1 - 1
client/windows/CMapOverview.cpp

@@ -39,7 +39,7 @@
 #include "../../lib/TerrainHandler.h"
 #include "../../lib/filesystem/Filesystem.h"
 
-#include "../../lib/serializer/BinaryDeserializer.h"
+#include "../../lib/serializer/CLoadFile.h"
 #include "../../lib/StartInfo.h"
 #include "../../lib/rmg/CMapGenOptions.h"
 

+ 8 - 9
cmake_modules/VCMI_lib.cmake

@@ -133,15 +133,6 @@ macro(add_main_lib TARGET_NAME LIBRARY_TYPE)
 		${MAIN_LIB_DIR}/pathfinder/PathfindingRules.cpp
 		${MAIN_LIB_DIR}/pathfinder/TurnInfo.cpp
 
-		${MAIN_LIB_DIR}/registerTypes/RegisterTypes.cpp
-		${MAIN_LIB_DIR}/registerTypes/TypesClientPacks1.cpp
-		${MAIN_LIB_DIR}/registerTypes/TypesClientPacks2.cpp
-		${MAIN_LIB_DIR}/registerTypes/TypesMapObjects1.cpp
-		${MAIN_LIB_DIR}/registerTypes/TypesMapObjects2.cpp
-		${MAIN_LIB_DIR}/registerTypes/TypesMapObjects3.cpp
-		${MAIN_LIB_DIR}/registerTypes/TypesLobbyPacks.cpp
-		${MAIN_LIB_DIR}/registerTypes/TypesServerPacks.cpp
-
 		${MAIN_LIB_DIR}/rewardable/Configuration.cpp
 		${MAIN_LIB_DIR}/rewardable/Info.cpp
 		${MAIN_LIB_DIR}/rewardable/Interface.cpp
@@ -181,8 +172,10 @@ macro(add_main_lib TARGET_NAME LIBRARY_TYPE)
 
 		${MAIN_LIB_DIR}/serializer/BinaryDeserializer.cpp
 		${MAIN_LIB_DIR}/serializer/BinarySerializer.cpp
+		${MAIN_LIB_DIR}/serializer/CLoadFile.cpp
 		${MAIN_LIB_DIR}/serializer/CMemorySerializer.cpp
 		${MAIN_LIB_DIR}/serializer/Connection.cpp
+		${MAIN_LIB_DIR}/serializer/CSaveFile.cpp
 		${MAIN_LIB_DIR}/serializer/CSerializer.cpp
 		${MAIN_LIB_DIR}/serializer/CTypeList.cpp
 		${MAIN_LIB_DIR}/serializer/JsonDeserializer.cpp
@@ -505,6 +498,10 @@ macro(add_main_lib TARGET_NAME LIBRARY_TYPE)
 		${MAIN_LIB_DIR}/pathfinder/TurnInfo.h
 
 		${MAIN_LIB_DIR}/registerTypes/RegisterTypes.h
+		${MAIN_LIB_DIR}/registerTypes/RegisterTypesClientPacks.h
+		${MAIN_LIB_DIR}/registerTypes/RegisterTypesLobbyPacks.h
+		${MAIN_LIB_DIR}/registerTypes/RegisterTypesMapObjects.h
+		${MAIN_LIB_DIR}/registerTypes/RegisterTypesServerPacks.h
 
 		${MAIN_LIB_DIR}/rewardable/Configuration.h
 		${MAIN_LIB_DIR}/rewardable/Info.h
@@ -548,8 +545,10 @@ macro(add_main_lib TARGET_NAME LIBRARY_TYPE)
 
 		${MAIN_LIB_DIR}/serializer/BinaryDeserializer.h
 		${MAIN_LIB_DIR}/serializer/BinarySerializer.h
+		${MAIN_LIB_DIR}/serializer/CLoadFile.h
 		${MAIN_LIB_DIR}/serializer/CMemorySerializer.h
 		${MAIN_LIB_DIR}/serializer/Connection.h
+		${MAIN_LIB_DIR}/serializer/CSaveFile.h
 		${MAIN_LIB_DIR}/serializer/CSerializer.h
 		${MAIN_LIB_DIR}/serializer/CTypeList.h
 		${MAIN_LIB_DIR}/serializer/JsonDeserializer.h

+ 2 - 3
lib/IGameCallback.cpp

@@ -21,9 +21,8 @@
 #include "bonuses/Propagators.h"
 #include "bonuses/Updaters.h"
 
-#include "serializer/CSerializer.h" // for SAVEGAME_MAGIC
-#include "serializer/BinaryDeserializer.h"
-#include "serializer/BinarySerializer.h"
+#include "serializer/CLoadFile.h"
+#include "serializer/CSaveFile.h"
 #include "rmg/CMapGenOptions.h"
 #include "mapObjectConstructors/AObjectTypeHandler.h"
 #include "mapObjectConstructors/CObjectClassesHandler.h"

+ 2 - 3
lib/gameState/CGameState.cpp

@@ -42,7 +42,7 @@
 #include "../modding/IdentifierStorage.h"
 #include "../pathfinder/CPathfinder.h"
 #include "../pathfinder/PathfinderOptions.h"
-#include "../registerTypes/RegisterTypes.h"
+#include "../registerTypes/RegisterTypesClientPacks.h"
 #include "../rmg/CMapGenerator.h"
 #include "../serializer/CMemorySerializer.h"
 #include "../serializer/CTypeList.h"
@@ -157,8 +157,7 @@ CGameState::CGameState()
 	gs = this;
 	heroesPool = std::make_unique<TavernHeroesPool>();
 	applier = std::make_shared<CApplier<CBaseForGSApply>>();
-	registerTypesClientPacks1(*applier);
-	registerTypesClientPacks2(*applier);
+	registerTypesClientPacks(*applier);
 	globalEffects.setNodeType(CBonusSystemNode::GLOBAL_EFFECTS);
 }
 

+ 1 - 1
lib/mapping/CMapInfo.cpp

@@ -21,7 +21,7 @@
 
 #include "../campaign/CampaignHandler.h"
 #include "../filesystem/Filesystem.h"
-#include "../serializer/CMemorySerializer.h"
+#include "../serializer/CLoadFile.h"
 #include "../CGeneralTextHandler.h"
 #include "../rmg/CMapGenOptions.h"
 #include "../CCreatureHandler.h"

+ 0 - 51
lib/registerTypes/RegisterTypes.cpp

@@ -1,51 +0,0 @@
-/*
- * RegisterTypes.cpp, part of VCMI engine
- *
- * Authors: listed in file AUTHORS in main folder
- *
- * License: GNU General Public License v2.0 or later
- * Full text of license available in license.txt file, in main folder
- *
- */
-#include "StdInc.h"
-#define INSTANTIATE_REGISTER_TYPES_HERE
-#include "RegisterTypes.h"
-
-#include "../mapping/CMapInfo.h"
-#include "../StartInfo.h"
-#include "../mapObjects/CObjectHandler.h"
-#include "../CCreatureHandler.h"
-#include "../spells/CSpellHandler.h"
-
-#include "../serializer/BinaryDeserializer.h"
-#include "../serializer/BinarySerializer.h"
-#include "../serializer/CTypeList.h"
-
-VCMI_LIB_NAMESPACE_BEGIN
-
-// For reference: peak memory usage by gcc during compilation of register type templates
-// registerTypesMapObjects:  1.9 Gb
-// registerTypes2:  2.2 Gb
-//     registerTypesClientPacks1 1.6 Gb
-//     registerTypesClientPacks2 1.6 Gb
-// registerTypesServerPacks:  1.3 Gb
-// registerTypes4:  1.3 Gb
-
-
-#define DEFINE_EXTERNAL_METHOD(METHODNAME) \
-extern template DLL_LINKAGE void METHODNAME<BinaryDeserializer>(BinaryDeserializer & s); \
-extern template DLL_LINKAGE void METHODNAME<BinarySerializer>(BinarySerializer & s);
-
-//DEFINE_EXTERNAL_METHOD(registerTypesMapObjects)
-DEFINE_EXTERNAL_METHOD(registerTypesMapObjects1)
-DEFINE_EXTERNAL_METHOD(registerTypesMapObjects2)
-DEFINE_EXTERNAL_METHOD(registerTypesClientPacks1)
-DEFINE_EXTERNAL_METHOD(registerTypesClientPacks2)
-DEFINE_EXTERNAL_METHOD(registerTypesServerPacks)
-DEFINE_EXTERNAL_METHOD(registerTypesLobbyPacks)
-
-template void registerTypes<BinaryDeserializer>(BinaryDeserializer & s);
-template void registerTypes<BinarySerializer>(BinarySerializer & s);
-template void registerTypes<CTypeList>(CTypeList & s);
-
-VCMI_LIB_NAMESPACE_END

+ 6 - 337
lib/registerTypes/RegisterTypes.h

@@ -9,351 +9,20 @@
  */
 #pragma once
 
-#include "../networkPacks/PacksForClient.h"
-#include "../networkPacks/PacksForClientBattle.h"
-#include "../networkPacks/PacksForServer.h"
-#include "../networkPacks/PacksForLobby.h"
-#include "../networkPacks/SetStackEffect.h"
-#include "../mapObjectConstructors/CBankInstanceConstructor.h"
-#include "../mapObjects/MapObjects.h"
-#include "../mapObjects/CGCreature.h"
-#include "../mapObjects/CGTownBuilding.h"
-#include "../mapObjects/ObjectTemplate.h"
-#include "../battle/BattleInfo.h"
-#include "../battle/CObstacleInstance.h"
-#include "../bonuses/Limiters.h"
-#include "../bonuses/Updaters.h"
-#include "../bonuses/Propagators.h"
-#include "../CPlayerState.h"
-#include "../CStack.h"
+#include "RegisterTypesClientPacks.h"
+#include "RegisterTypesLobbyPacks.h"
+#include "RegisterTypesMapObjects.h"
+#include "RegisterTypesServerPacks.h"
 
 VCMI_LIB_NAMESPACE_BEGIN
 
-class BinarySerializer;
-class BinaryDeserializer;
-class CTypeList;
-
-template<typename Serializer>
-void registerTypesMapObjects1(Serializer &s)
-{
-	//////////////////////////////////////////////////////////////////////////
-	// Adventure map objects
-	//////////////////////////////////////////////////////////////////////////
-	s.template registerType<IObjectInterface, CGObjectInstance>();
-
-	// Non-armed objects
-	s.template registerType<CGObjectInstance, CGTeleport>();
-		s.template registerType<CGTeleport, CGMonolith>();
-			s.template registerType<CGMonolith, CGSubterraneanGate>();
-			s.template registerType<CGMonolith, CGWhirlpool>();
-	s.template registerType<CGObjectInstance, CGSignBottle>();
-	s.template registerType<CGObjectInstance, CGKeys>();
-		s.template registerType<CGKeys, CGKeymasterTent>();
-		s.template registerType<CGKeys, CGBorderGuard>(); s.template registerType<IQuestObject, CGBorderGuard>();
-			s.template registerType<CGBorderGuard, CGBorderGate>();
-	s.template registerType<CGObjectInstance, CGBoat>();
-	s.template registerType<CGObjectInstance, CGMagi>();
-	s.template registerType<CGObjectInstance, CGSirens>();
-	s.template registerType<CGObjectInstance, CGShipyard>();
-	s.template registerType<CGObjectInstance, CGDenOfthieves>();
-	s.template registerType<CGObjectInstance, CGLighthouse>();
-	s.template registerType<CGObjectInstance, CGTerrainPatch>();
-	s.template registerType<CGObjectInstance, HillFort>();
-	s.template registerType<CGObjectInstance, CGMarket>();
-		s.template registerType<CGMarket, CGBlackMarket>();
-		s.template registerType<CGMarket, CGUniversity>();
-	s.template registerType<CGObjectInstance, CGHeroPlaceholder>();
-
-	s.template registerType<CGObjectInstance, CArmedInstance>(); s.template registerType<CBonusSystemNode, CArmedInstance>(); s.template registerType<CCreatureSet, CArmedInstance>();
-
-	// Armed objects
-	s.template registerType<CArmedInstance, CGHeroInstance>(); s.template registerType<CArtifactSet, CGHeroInstance>();
-	s.template registerType<CArmedInstance, CGDwelling>();
-		s.template registerType<CGDwelling, CGTownInstance>();
-	s.template registerType<CArmedInstance, CGPandoraBox>();
-		s.template registerType<CGPandoraBox, CGEvent>();
-	s.template registerType<CArmedInstance, CGCreature>();
-	s.template registerType<CArmedInstance, CGGarrison>();
-	s.template registerType<CArmedInstance, CGArtifact>();
-	s.template registerType<CArmedInstance, CGResource>();
-	s.template registerType<CArmedInstance, CGMine>();
-	s.template registerType<CArmedInstance, CBank>();
-	s.template registerType<CArmedInstance, CGSeerHut>(); s.template registerType<IQuestObject, CGSeerHut>();
-	s.template registerType<CGSeerHut, CGQuestGuard>();
-}
-
-template<typename Serializer>
-void registerTypesMapObjectTypes(Serializer &s)
-{
-	s.template registerType<IUpdater, GrowsWithLevelUpdater>();
-	s.template registerType<IUpdater, TimesHeroLevelUpdater>();
-	s.template registerType<IUpdater, TimesStackLevelUpdater>();
-	s.template registerType<IUpdater, OwnerUpdater>();
-	s.template registerType<IUpdater, ArmyMovementUpdater>();
-
-	s.template registerType<ILimiter, AnyOfLimiter>();
-	s.template registerType<ILimiter, NoneOfLimiter>();
-	s.template registerType<ILimiter, OppositeSideLimiter>();
-	//new types (other than netpacks) must register here
-	//order of type registration is critical for loading old savegames
-}
-
-template<typename Serializer>
-void registerTypesMapObjects2(Serializer &s)
-{
-	//Other object-related
-	s.template registerType<IObjectInterface, CGTownBuilding>();
-		s.template registerType<CGTownBuilding, CTownBonus>();
-		s.template registerType<CGTownBuilding, COPWBonus>();
-		s.template registerType<CGTownBuilding, CTownRewardableBuilding>();
-
-	s.template registerType<CGObjectInstance, CRewardableObject>();
-
-	s.template registerType<CGObjectInstance, CTeamVisited>();
-		s.template registerType<CTeamVisited, CGObelisk>();
-
-	//s.template registerType<CQuest>();
-	//s.template registerType<IQuestObject>();
-
-	//end of objects
-
-	//////////////////////////////////////////////////////////////////////////
-	// Bonus system
-	//////////////////////////////////////////////////////////////////////////
-	//s.template registerType<IPropagator>();
-	s.template registerType<IPropagator, CPropagatorNodeType>();
-
-	// Limiters
-	//s.template registerType<ILimiter>();
-	s.template registerType<ILimiter, AllOfLimiter>();
-	s.template registerType<ILimiter, CCreatureTypeLimiter>();
-	s.template registerType<ILimiter, HasAnotherBonusLimiter>();
-	s.template registerType<ILimiter, CreatureTerrainLimiter>();
-	s.template registerType<ILimiter, FactionLimiter>();
-	s.template registerType<ILimiter, CreatureLevelLimiter>();
-	s.template registerType<ILimiter, CreatureAlignmentLimiter>();
-	s.template registerType<ILimiter, RankRangeLimiter>();
-	s.template registerType<ILimiter, UnitOnHexLimiter>();
-
-//	s.template registerType<CBonusSystemNode>();
-	s.template registerType<CBonusSystemNode, CArtifact>();
-	s.template registerType<CBonusSystemNode, CCreature>();
-	s.template registerType<CBonusSystemNode, CStackInstance>();
-	s.template registerType<CStackInstance, CCommanderInstance>();
-	s.template registerType<CBonusSystemNode, PlayerState>();
-	s.template registerType<CBonusSystemNode, TeamState>();
-	//s.template registerType<CGameState>(); //TODO
-	//s.template registerType<CArmedInstance>();
-	s.template registerType<CBonusSystemNode, CStack>();
-	s.template registerType<CBonusSystemNode, BattleInfo>();
-	//s.template registerType<QuestInfo>();
-	s.template registerType<CBonusSystemNode, CArtifactInstance>();
-
-	//s.template registerType<CObstacleInstance>();
-		s.template registerType<CObstacleInstance, SpellCreatedObstacle>();
-}
-template<typename Serializer>
-void registerTypesClientPacks1(Serializer &s)
-{
-	s.template registerType<CPack, CPackForClient>();
-
-	s.template registerType<CPackForClient, PackageApplied>();
-	s.template registerType<CPackForClient, SystemMessage>();
-	s.template registerType<CPackForClient, PlayerBlocked>();
-	s.template registerType<CPackForClient, PlayerCheated>();
-	s.template registerType<CPackForClient, PlayerStartsTurn>();
-	s.template registerType<CPackForClient, DaysWithoutTown>();
-	s.template registerType<CPackForClient, TurnTimeUpdate>();
-	s.template registerType<CPackForClient, SetResources>();
-	s.template registerType<CPackForClient, SetPrimSkill>();
-	s.template registerType<CPackForClient, SetSecSkill>();
-	s.template registerType<CPackForClient, HeroVisitCastle>();
-	s.template registerType<CPackForClient, ChangeSpells>();
-	s.template registerType<CPackForClient, SetMana>();
-	s.template registerType<CPackForClient, SetMovePoints>();
-	s.template registerType<CPackForClient, FoWChange>();
-	s.template registerType<CPackForClient, SetAvailableHero>();
-	s.template registerType<CPackForClient, GiveBonus>();
-	s.template registerType<CPackForClient, ChangeObjPos>();
-	s.template registerType<CPackForClient, PlayerEndsTurn>();
-	s.template registerType<CPackForClient, PlayerEndsGame>();
-	s.template registerType<CPackForClient, PlayerReinitInterface>();
-	s.template registerType<CPackForClient, RemoveBonus>();
-	s.template registerType<CPackForClient, UpdateArtHandlerLists>();
-	s.template registerType<CPackForClient, UpdateMapEvents>();
-	s.template registerType<CPackForClient, UpdateCastleEvents>();
-	s.template registerType<CPackForClient, ChangeFormation>();
-	s.template registerType<CPackForClient, RemoveObject>();
-	s.template registerType<CPackForClient, TryMoveHero>();
-	s.template registerType<CPackForClient, NewStructures>();
-	s.template registerType<CPackForClient, RazeStructures>();
-	s.template registerType<CPackForClient, SetAvailableCreatures>();
-	s.template registerType<CPackForClient, SetHeroesInTown>();
-	s.template registerType<CPackForClient, HeroRecruited>();
-	s.template registerType<CPackForClient, GiveHero>();
-	s.template registerType<CPackForClient, NewTurn>();
-	s.template registerType<CPackForClient, InfoWindow>();
-	s.template registerType<CPackForClient, SetObjectProperty>();
-	s.template registerType<CPackForClient, AdvmapSpellCast>();
-	s.template registerType<CPackForClient, OpenWindow>();
-	s.template registerType<CPackForClient, NewObject>();
-	s.template registerType<CPackForClient, NewArtifact>();
-	s.template registerType<CPackForClient, AddQuest>();
-	s.template registerType<CPackForClient, SetAvailableArtifacts>();
-	s.template registerType<CPackForClient, CenterView>();
-	s.template registerType<CPackForClient, HeroVisit>();
-	s.template registerType<CPackForClient, SetCommanderProperty>();
-	s.template registerType<CPackForClient, ChangeObjectVisitors>();
-	s.template registerType<CPackForClient, ShowWorldViewEx>();
-	s.template registerType<CPackForClient, PrepareHeroLevelUp>();
-	s.template registerType<CPackForClient, EntitiesChanged>();
-}
-
-template<typename Serializer>
-void registerTypesClientPacks2(Serializer &s)
-{
-	s.template registerType<CPackForClient, BattleStart>();
-	s.template registerType<CPackForClient, BattleNextRound>();
-	s.template registerType<CPackForClient, BattleSetActiveStack>();
-	s.template registerType<CPackForClient, BattleResult>();
-	s.template registerType<CPackForClient, BattleResultAccepted>();
-	s.template registerType<CPackForClient, BattleCancelled>();
-	s.template registerType<CPackForClient, BattleLogMessage>();
-	s.template registerType<CPackForClient, BattleStackMoved>();
-	s.template registerType<CPackForClient, BattleAttack>();
-	s.template registerType<CPackForClient, StartAction>();
-	s.template registerType<CPackForClient, EndAction>();
-	s.template registerType<CPackForClient, BattleSpellCast>();
-	s.template registerType<CPackForClient, SetStackEffect>();
-	s.template registerType<CPackForClient, BattleTriggerEffect>();
-	s.template registerType<CPackForClient, BattleUpdateGateState>();
-	s.template registerType<CPackForClient, BattleSetStackProperty>();
-	s.template registerType<CPackForClient, StacksInjured>();
-	s.template registerType<CPackForClient, BattleResultsApplied>();
-	s.template registerType<CPackForClient, BattleUnitsChanged>();
-	s.template registerType<CPackForClient, BattleObstaclesChanged>();
-	s.template registerType<CPackForClient, CatapultAttack>();
-
-	s.template registerType<CPackForClient, Query>();
-	s.template registerType<Query, HeroLevelUp>();
-	s.template registerType<Query, CommanderLevelUp>();
-	s.template registerType<Query, BlockingDialog>();
-	s.template registerType<Query, GarrisonDialog>();
-	s.template registerType<Query, ExchangeDialog>();
-	s.template registerType<Query, TeleportDialog>();
-	s.template registerType<Query, MapObjectSelectDialog>();
-
-	s.template registerType<CPackForClient, CGarrisonOperationPack>();
-	s.template registerType<CGarrisonOperationPack, ChangeStackCount>();
-	s.template registerType<CGarrisonOperationPack, SetStackType>();
-	s.template registerType<CGarrisonOperationPack, EraseStack>();
-	s.template registerType<CGarrisonOperationPack, SwapStacks>();
-	s.template registerType<CGarrisonOperationPack, InsertNewStack>();
-	s.template registerType<CGarrisonOperationPack, RebalanceStacks>();
-
-	s.template registerType<CPackForClient, CArtifactOperationPack>();
-	s.template registerType<CArtifactOperationPack, PutArtifact>();
-	s.template registerType<CArtifactOperationPack, EraseArtifact>();
-	s.template registerType<CArtifactOperationPack, MoveArtifact>();
-	s.template registerType<CArtifactOperationPack, AssembledArtifact>();
-	s.template registerType<CArtifactOperationPack, DisassembledArtifact>();
-	s.template registerType<CArtifactOperationPack, BulkMoveArtifacts>();
-
-	s.template registerType<CPackForClient, PlayerMessageClient>();
-	s.template registerType<CGarrisonOperationPack, BulkRebalanceStacks>();
-	s.template registerType<CGarrisonOperationPack, BulkSmartRebalanceStacks>();
-}
-
-template<typename Serializer>
-void registerTypesServerPacks(Serializer &s)
-{
-	s.template registerType<CPack, CPackForServer>();
-	s.template registerType<CPackForServer, EndTurn>();
-	s.template registerType<CPackForServer, DismissHero>();
-	s.template registerType<CPackForServer, MoveHero>();
-	s.template registerType<CPackForServer, ArrangeStacks>();
-	s.template registerType<CPackForServer, DisbandCreature>();
-	s.template registerType<CPackForServer, BuildStructure>();
-	s.template registerType<CPackForServer, RecruitCreatures>();
-	s.template registerType<CPackForServer, UpgradeCreature>();
-	s.template registerType<CPackForServer, GarrisonHeroSwap>();
-	s.template registerType<CPackForServer, ExchangeArtifacts>();
-	s.template registerType<CPackForServer, AssembleArtifacts>();
-	s.template registerType<CPackForServer, BuyArtifact>();
-	s.template registerType<CPackForServer, TradeOnMarketplace>();
-	s.template registerType<CPackForServer, SetFormation>();
-	s.template registerType<CPackForServer, HireHero>();
-	s.template registerType<CPackForServer, BuildBoat>();
-	s.template registerType<CPackForServer, QueryReply>();
-	s.template registerType<CPackForServer, MakeAction>();
-	s.template registerType<CPackForServer, DigWithHero>();
-	s.template registerType<CPackForServer, CastAdvSpell>();
-	s.template registerType<CPackForServer, CastleTeleportHero>();
-	s.template registerType<CPackForServer, SaveGame>();
-	s.template registerType<CPackForServer, PlayerMessage>();
-	s.template registerType<CPackForServer, BulkSplitStack>();
-	s.template registerType<CPackForServer, BulkMergeStacks>();
-	s.template registerType<CPackForServer, BulkSmartSplitStack>();
-	s.template registerType<CPackForServer, BulkMoveArmy>();
-	s.template registerType<CPackForServer, BulkExchangeArtifacts>();
-	s.template registerType<CPackForServer, EraseArtifactByClient>();
-	s.template registerType<CPackForServer, GamePause>();
-}
-
-template<typename Serializer>
-void registerTypesLobbyPacks(Serializer &s)
-{
-	s.template registerType<CPack, CPackForLobby>();
-	s.template registerType<CPackForLobby, CLobbyPackToPropagate>();
-	s.template registerType<CPackForLobby, CLobbyPackToServer>();
-
-	// Any client can sent
-	s.template registerType<CLobbyPackToPropagate, LobbyClientConnected>();
-	s.template registerType<CLobbyPackToPropagate, LobbyClientDisconnected>();
-	s.template registerType<CLobbyPackToPropagate, LobbyChatMessage>();
-	// Only host client send
-	s.template registerType<CLobbyPackToPropagate, LobbyGuiAction>();
-	s.template registerType<CLobbyPackToPropagate, LobbyLoadProgress>();
-	s.template registerType<CLobbyPackToPropagate, LobbyEndGame>();
-	s.template registerType<CLobbyPackToPropagate, LobbyStartGame>();
-	s.template registerType<CLobbyPackToPropagate, LobbyChangeHost>();
-	// Only server send
-	s.template registerType<CLobbyPackToPropagate, LobbyUpdateState>();
-	s.template registerType<CLobbyPackToPropagate, LobbyShowMessage>();
-
-	// For client with permissions
-	s.template registerType<CLobbyPackToServer, LobbyChangePlayerOption>();
-	// Only for host client
-	s.template registerType<CLobbyPackToServer, LobbySetMap>();
-	s.template registerType<CLobbyPackToServer, LobbySetCampaign>();
-	s.template registerType<CLobbyPackToServer, LobbySetCampaignMap>();
-	s.template registerType<CLobbyPackToServer, LobbySetCampaignBonus>();
-	s.template registerType<CLobbyPackToServer, LobbySetPlayer>();
-	s.template registerType<CLobbyPackToServer, LobbySetPlayerName>();
-	s.template registerType<CLobbyPackToServer, LobbySetTurnTime>();
-	s.template registerType<CLobbyPackToServer, LobbySetSimturns>();
-	s.template registerType<CLobbyPackToServer, LobbySetDifficulty>();
-	s.template registerType<CLobbyPackToServer, LobbyForceSetPlayer>();
-}
-
 template<typename Serializer>
 void registerTypes(Serializer &s)
 {
-	registerTypesMapObjects1(s);
-	registerTypesMapObjects2(s);
-	registerTypesMapObjectTypes(s);
-	registerTypesClientPacks1(s);
-	registerTypesClientPacks2(s);
+	registerTypesMapObjects(s);
+	registerTypesClientPacks(s);
 	registerTypesServerPacks(s);
 	registerTypesLobbyPacks(s);
 }
 
-#ifndef INSTANTIATE_REGISTER_TYPES_HERE
-
-extern template DLL_LINKAGE void registerTypes<BinaryDeserializer>(BinaryDeserializer & s);
-extern template DLL_LINKAGE void registerTypes<BinarySerializer>(BinarySerializer & s);
-
-#endif
-
-
 VCMI_LIB_NAMESPACE_END

+ 125 - 0
lib/registerTypes/RegisterTypesClientPacks.h

@@ -0,0 +1,125 @@
+/*
+ * RegisterTypesClientPacks.h, part of VCMI engine
+ *
+ * Authors: listed in file AUTHORS in main folder
+ *
+ * License: GNU General Public License v2.0 or later
+ * Full text of license available in license.txt file, in main folder
+ *
+ */
+#pragma once
+
+#include "../networkPacks/PacksForClient.h"
+#include "../networkPacks/PacksForClientBattle.h"
+#include "../networkPacks/SetStackEffect.h"
+
+VCMI_LIB_NAMESPACE_BEGIN
+
+template<typename Serializer>
+void registerTypesClientPacks(Serializer &s)
+{
+	s.template registerType<CPack, CPackForClient>();
+
+	s.template registerType<CPackForClient, PackageApplied>();
+	s.template registerType<CPackForClient, SystemMessage>();
+	s.template registerType<CPackForClient, PlayerBlocked>();
+	s.template registerType<CPackForClient, PlayerCheated>();
+	s.template registerType<CPackForClient, PlayerStartsTurn>();
+	s.template registerType<CPackForClient, DaysWithoutTown>();
+	s.template registerType<CPackForClient, TurnTimeUpdate>();
+	s.template registerType<CPackForClient, SetResources>();
+	s.template registerType<CPackForClient, SetPrimSkill>();
+	s.template registerType<CPackForClient, SetSecSkill>();
+	s.template registerType<CPackForClient, HeroVisitCastle>();
+	s.template registerType<CPackForClient, ChangeSpells>();
+	s.template registerType<CPackForClient, SetMana>();
+	s.template registerType<CPackForClient, SetMovePoints>();
+	s.template registerType<CPackForClient, FoWChange>();
+	s.template registerType<CPackForClient, SetAvailableHero>();
+	s.template registerType<CPackForClient, GiveBonus>();
+	s.template registerType<CPackForClient, ChangeObjPos>();
+	s.template registerType<CPackForClient, PlayerEndsTurn>();
+	s.template registerType<CPackForClient, PlayerEndsGame>();
+	s.template registerType<CPackForClient, PlayerReinitInterface>();
+	s.template registerType<CPackForClient, RemoveBonus>();
+	s.template registerType<CPackForClient, UpdateArtHandlerLists>();
+	s.template registerType<CPackForClient, UpdateMapEvents>();
+	s.template registerType<CPackForClient, UpdateCastleEvents>();
+	s.template registerType<CPackForClient, ChangeFormation>();
+	s.template registerType<CPackForClient, RemoveObject>();
+	s.template registerType<CPackForClient, TryMoveHero>();
+	s.template registerType<CPackForClient, NewStructures>();
+	s.template registerType<CPackForClient, RazeStructures>();
+	s.template registerType<CPackForClient, SetAvailableCreatures>();
+	s.template registerType<CPackForClient, SetHeroesInTown>();
+	s.template registerType<CPackForClient, HeroRecruited>();
+	s.template registerType<CPackForClient, GiveHero>();
+	s.template registerType<CPackForClient, NewTurn>();
+	s.template registerType<CPackForClient, InfoWindow>();
+	s.template registerType<CPackForClient, SetObjectProperty>();
+	s.template registerType<CPackForClient, AdvmapSpellCast>();
+	s.template registerType<CPackForClient, OpenWindow>();
+	s.template registerType<CPackForClient, NewObject>();
+	s.template registerType<CPackForClient, NewArtifact>();
+	s.template registerType<CPackForClient, AddQuest>();
+	s.template registerType<CPackForClient, SetAvailableArtifacts>();
+	s.template registerType<CPackForClient, CenterView>();
+	s.template registerType<CPackForClient, HeroVisit>();
+	s.template registerType<CPackForClient, SetCommanderProperty>();
+	s.template registerType<CPackForClient, ChangeObjectVisitors>();
+	s.template registerType<CPackForClient, ShowWorldViewEx>();
+	s.template registerType<CPackForClient, PrepareHeroLevelUp>();
+	s.template registerType<CPackForClient, EntitiesChanged>();
+	s.template registerType<CPackForClient, BattleStart>();
+	s.template registerType<CPackForClient, BattleNextRound>();
+	s.template registerType<CPackForClient, BattleSetActiveStack>();
+	s.template registerType<CPackForClient, BattleResult>();
+	s.template registerType<CPackForClient, BattleResultAccepted>();
+	s.template registerType<CPackForClient, BattleCancelled>();
+	s.template registerType<CPackForClient, BattleLogMessage>();
+	s.template registerType<CPackForClient, BattleStackMoved>();
+	s.template registerType<CPackForClient, BattleAttack>();
+	s.template registerType<CPackForClient, StartAction>();
+	s.template registerType<CPackForClient, EndAction>();
+	s.template registerType<CPackForClient, BattleSpellCast>();
+	s.template registerType<CPackForClient, SetStackEffect>();
+	s.template registerType<CPackForClient, BattleTriggerEffect>();
+	s.template registerType<CPackForClient, BattleUpdateGateState>();
+	s.template registerType<CPackForClient, BattleSetStackProperty>();
+	s.template registerType<CPackForClient, StacksInjured>();
+	s.template registerType<CPackForClient, BattleResultsApplied>();
+	s.template registerType<CPackForClient, BattleUnitsChanged>();
+	s.template registerType<CPackForClient, BattleObstaclesChanged>();
+	s.template registerType<CPackForClient, CatapultAttack>();
+
+	s.template registerType<CPackForClient, Query>();
+	s.template registerType<Query, HeroLevelUp>();
+	s.template registerType<Query, CommanderLevelUp>();
+	s.template registerType<Query, BlockingDialog>();
+	s.template registerType<Query, GarrisonDialog>();
+	s.template registerType<Query, ExchangeDialog>();
+	s.template registerType<Query, TeleportDialog>();
+	s.template registerType<Query, MapObjectSelectDialog>();
+
+	s.template registerType<CPackForClient, CGarrisonOperationPack>();
+	s.template registerType<CGarrisonOperationPack, ChangeStackCount>();
+	s.template registerType<CGarrisonOperationPack, SetStackType>();
+	s.template registerType<CGarrisonOperationPack, EraseStack>();
+	s.template registerType<CGarrisonOperationPack, SwapStacks>();
+	s.template registerType<CGarrisonOperationPack, InsertNewStack>();
+	s.template registerType<CGarrisonOperationPack, RebalanceStacks>();
+
+	s.template registerType<CPackForClient, CArtifactOperationPack>();
+	s.template registerType<CArtifactOperationPack, PutArtifact>();
+	s.template registerType<CArtifactOperationPack, EraseArtifact>();
+	s.template registerType<CArtifactOperationPack, MoveArtifact>();
+	s.template registerType<CArtifactOperationPack, AssembledArtifact>();
+	s.template registerType<CArtifactOperationPack, DisassembledArtifact>();
+	s.template registerType<CArtifactOperationPack, BulkMoveArtifacts>();
+
+	s.template registerType<CPackForClient, PlayerMessageClient>();
+	s.template registerType<CGarrisonOperationPack, BulkRebalanceStacks>();
+	s.template registerType<CGarrisonOperationPack, BulkSmartRebalanceStacks>();
+}
+
+VCMI_LIB_NAMESPACE_END

+ 62 - 0
lib/registerTypes/RegisterTypesLobbyPacks.h

@@ -0,0 +1,62 @@
+/*
+ * RegisterTypesLobbyPacks.h, part of VCMI engine
+ *
+ * Authors: listed in file AUTHORS in main folder
+ *
+ * License: GNU General Public License v2.0 or later
+ * Full text of license available in license.txt file, in main folder
+ *
+ */
+#pragma once
+
+#include "../networkPacks/PacksForLobby.h"
+#include "../gameState/CGameState.h"
+#include "../campaign/CampaignState.h"
+#include "../mapping/CMapInfo.h"
+#include "../rmg/CMapGenOptions.h"
+#include "../gameState/TavernHeroesPool.h"
+#include "../gameState/CGameStateCampaign.h"
+#include "../mapping/CMap.h"
+#include "../TerrainHandler.h"
+#include "../RiverHandler.h"
+#include "../RoadHandler.h"
+
+VCMI_LIB_NAMESPACE_BEGIN
+
+template<typename Serializer>
+void registerTypesLobbyPacks(Serializer &s)
+{
+	s.template registerType<CPack, CPackForLobby>();
+	s.template registerType<CPackForLobby, CLobbyPackToPropagate>();
+	s.template registerType<CPackForLobby, CLobbyPackToServer>();
+
+	// Any client can sent
+	s.template registerType<CLobbyPackToPropagate, LobbyClientConnected>();
+	s.template registerType<CLobbyPackToPropagate, LobbyClientDisconnected>();
+	s.template registerType<CLobbyPackToPropagate, LobbyChatMessage>();
+	// Only host client send
+	s.template registerType<CLobbyPackToPropagate, LobbyGuiAction>();
+	s.template registerType<CLobbyPackToPropagate, LobbyLoadProgress>();
+	s.template registerType<CLobbyPackToPropagate, LobbyEndGame>();
+	s.template registerType<CLobbyPackToPropagate, LobbyStartGame>();
+	s.template registerType<CLobbyPackToPropagate, LobbyChangeHost>();
+	// Only server send
+	s.template registerType<CLobbyPackToPropagate, LobbyUpdateState>();
+	s.template registerType<CLobbyPackToPropagate, LobbyShowMessage>();
+
+	// For client with permissions
+	s.template registerType<CLobbyPackToServer, LobbyChangePlayerOption>();
+	// Only for host client
+	s.template registerType<CLobbyPackToServer, LobbySetMap>();
+	s.template registerType<CLobbyPackToServer, LobbySetCampaign>();
+	s.template registerType<CLobbyPackToServer, LobbySetCampaignMap>();
+	s.template registerType<CLobbyPackToServer, LobbySetCampaignBonus>();
+	s.template registerType<CLobbyPackToServer, LobbySetPlayer>();
+	s.template registerType<CLobbyPackToServer, LobbySetPlayerName>();
+	s.template registerType<CLobbyPackToServer, LobbySetTurnTime>();
+	s.template registerType<CLobbyPackToServer, LobbySetSimturns>();
+	s.template registerType<CLobbyPackToServer, LobbySetDifficulty>();
+	s.template registerType<CLobbyPackToServer, LobbyForceSetPlayer>();
+}
+
+VCMI_LIB_NAMESPACE_END

+ 137 - 0
lib/registerTypes/RegisterTypesMapObjects.h

@@ -0,0 +1,137 @@
+/*
+ * RegisterTypesMapObjects.h, part of VCMI engine
+ *
+ * Authors: listed in file AUTHORS in main folder
+ *
+ * License: GNU General Public License v2.0 or later
+ * Full text of license available in license.txt file, in main folder
+ *
+ */
+#pragma once
+
+#include "../mapObjectConstructors/CBankInstanceConstructor.h"
+#include "../mapObjects/MapObjects.h"
+#include "../mapObjects/CGCreature.h"
+#include "../mapObjects/CGTownBuilding.h"
+#include "../mapObjects/ObjectTemplate.h"
+#include "../battle/BattleInfo.h"
+#include "../battle/CObstacleInstance.h"
+#include "../bonuses/Limiters.h"
+#include "../bonuses/Updaters.h"
+#include "../bonuses/Propagators.h"
+#include "../CPlayerState.h"
+#include "../CStack.h"
+#include "../CHeroHandler.h"
+
+VCMI_LIB_NAMESPACE_BEGIN
+
+template<typename Serializer>
+void registerTypesMapObjects(Serializer &s)
+{
+	//////////////////////////////////////////////////////////////////////////
+	// Adventure map objects
+	//////////////////////////////////////////////////////////////////////////
+	s.template registerType<IObjectInterface, CGObjectInstance>();
+
+	// Non-armed objects
+	s.template registerType<CGObjectInstance, CGTeleport>();
+		s.template registerType<CGTeleport, CGMonolith>();
+			s.template registerType<CGMonolith, CGSubterraneanGate>();
+			s.template registerType<CGMonolith, CGWhirlpool>();
+	s.template registerType<CGObjectInstance, CGSignBottle>();
+	s.template registerType<CGObjectInstance, CGKeys>();
+		s.template registerType<CGKeys, CGKeymasterTent>();
+		s.template registerType<CGKeys, CGBorderGuard>(); s.template registerType<IQuestObject, CGBorderGuard>();
+			s.template registerType<CGBorderGuard, CGBorderGate>();
+	s.template registerType<CGObjectInstance, CGBoat>();
+	s.template registerType<CGObjectInstance, CGMagi>();
+	s.template registerType<CGObjectInstance, CGSirens>();
+	s.template registerType<CGObjectInstance, CGShipyard>();
+	s.template registerType<CGObjectInstance, CGDenOfthieves>();
+	s.template registerType<CGObjectInstance, CGLighthouse>();
+	s.template registerType<CGObjectInstance, CGTerrainPatch>();
+	s.template registerType<CGObjectInstance, HillFort>();
+	s.template registerType<CGObjectInstance, CGMarket>();
+		s.template registerType<CGMarket, CGBlackMarket>();
+		s.template registerType<CGMarket, CGUniversity>();
+	s.template registerType<CGObjectInstance, CGHeroPlaceholder>();
+
+	s.template registerType<CGObjectInstance, CArmedInstance>(); s.template registerType<CBonusSystemNode, CArmedInstance>(); s.template registerType<CCreatureSet, CArmedInstance>();
+
+	// Armed objects
+	s.template registerType<CArmedInstance, CGHeroInstance>(); s.template registerType<CArtifactSet, CGHeroInstance>();
+	s.template registerType<CArmedInstance, CGDwelling>();
+		s.template registerType<CGDwelling, CGTownInstance>();
+	s.template registerType<CArmedInstance, CGPandoraBox>();
+		s.template registerType<CGPandoraBox, CGEvent>();
+	s.template registerType<CArmedInstance, CGCreature>();
+	s.template registerType<CArmedInstance, CGGarrison>();
+	s.template registerType<CArmedInstance, CGArtifact>();
+	s.template registerType<CArmedInstance, CGResource>();
+	s.template registerType<CArmedInstance, CGMine>();
+	s.template registerType<CArmedInstance, CBank>();
+	s.template registerType<CArmedInstance, CGSeerHut>(); s.template registerType<IQuestObject, CGSeerHut>();
+	s.template registerType<CGSeerHut, CGQuestGuard>();
+
+	s.template registerType<IUpdater, GrowsWithLevelUpdater>();
+	s.template registerType<IUpdater, TimesHeroLevelUpdater>();
+	s.template registerType<IUpdater, TimesStackLevelUpdater>();
+	s.template registerType<IUpdater, OwnerUpdater>();
+	s.template registerType<IUpdater, ArmyMovementUpdater>();
+
+	s.template registerType<ILimiter, AnyOfLimiter>();
+	s.template registerType<ILimiter, NoneOfLimiter>();
+	s.template registerType<ILimiter, OppositeSideLimiter>();
+	//new types (other than netpacks) must register here
+	//order of type registration is critical for loading old savegames
+
+	//Other object-related
+	s.template registerType<IObjectInterface, CGTownBuilding>();
+		s.template registerType<CGTownBuilding, CTownBonus>();
+		s.template registerType<CGTownBuilding, COPWBonus>();
+		s.template registerType<CGTownBuilding, CTownRewardableBuilding>();
+
+	s.template registerType<CGObjectInstance, CRewardableObject>();
+
+	s.template registerType<CGObjectInstance, CTeamVisited>();
+		s.template registerType<CTeamVisited, CGObelisk>();
+
+	//end of objects
+
+	//////////////////////////////////////////////////////////////////////////
+	// Bonus system
+	//////////////////////////////////////////////////////////////////////////
+	//s.template registerType<IPropagator>();
+	s.template registerType<IPropagator, CPropagatorNodeType>();
+
+	// Limiters
+	//s.template registerType<ILimiter>();
+	s.template registerType<ILimiter, AllOfLimiter>();
+	s.template registerType<ILimiter, CCreatureTypeLimiter>();
+	s.template registerType<ILimiter, HasAnotherBonusLimiter>();
+	s.template registerType<ILimiter, CreatureTerrainLimiter>();
+	s.template registerType<ILimiter, FactionLimiter>();
+	s.template registerType<ILimiter, CreatureLevelLimiter>();
+	s.template registerType<ILimiter, CreatureAlignmentLimiter>();
+	s.template registerType<ILimiter, RankRangeLimiter>();
+	s.template registerType<ILimiter, UnitOnHexLimiter>();
+
+//	s.template registerType<CBonusSystemNode>();
+	s.template registerType<CBonusSystemNode, CArtifact>();
+	s.template registerType<CBonusSystemNode, CCreature>();
+	s.template registerType<CBonusSystemNode, CStackInstance>();
+	s.template registerType<CStackInstance, CCommanderInstance>();
+	s.template registerType<CBonusSystemNode, PlayerState>();
+	s.template registerType<CBonusSystemNode, TeamState>();
+	//s.template registerType<CGameState>(); //TODO
+	//s.template registerType<CArmedInstance>();
+	s.template registerType<CBonusSystemNode, CStack>();
+	s.template registerType<CBonusSystemNode, BattleInfo>();
+	//s.template registerType<QuestInfo>();
+	s.template registerType<CBonusSystemNode, CArtifactInstance>();
+
+	//s.template registerType<CObstacleInstance>();
+		s.template registerType<CObstacleInstance, SpellCreatedObstacle>();
+}
+
+VCMI_LIB_NAMESPACE_END

+ 56 - 0
lib/registerTypes/RegisterTypesServerPacks.h

@@ -0,0 +1,56 @@
+/*
+ * RegisterTypesServerPacks.h, part of VCMI engine
+ *
+ * Authors: listed in file AUTHORS in main folder
+ *
+ * License: GNU General Public License v2.0 or later
+ * Full text of license available in license.txt file, in main folder
+ *
+ */
+#pragma once
+
+#include "../networkPacks/PacksForServer.h"
+
+VCMI_LIB_NAMESPACE_BEGIN
+
+class BinarySerializer;
+class BinaryDeserializer;
+class CTypeList;
+
+template<typename Serializer>
+void registerTypesServerPacks(Serializer &s)
+{
+	s.template registerType<CPack, CPackForServer>();
+	s.template registerType<CPackForServer, EndTurn>();
+	s.template registerType<CPackForServer, DismissHero>();
+	s.template registerType<CPackForServer, MoveHero>();
+	s.template registerType<CPackForServer, ArrangeStacks>();
+	s.template registerType<CPackForServer, DisbandCreature>();
+	s.template registerType<CPackForServer, BuildStructure>();
+	s.template registerType<CPackForServer, RecruitCreatures>();
+	s.template registerType<CPackForServer, UpgradeCreature>();
+	s.template registerType<CPackForServer, GarrisonHeroSwap>();
+	s.template registerType<CPackForServer, ExchangeArtifacts>();
+	s.template registerType<CPackForServer, AssembleArtifacts>();
+	s.template registerType<CPackForServer, BuyArtifact>();
+	s.template registerType<CPackForServer, TradeOnMarketplace>();
+	s.template registerType<CPackForServer, SetFormation>();
+	s.template registerType<CPackForServer, HireHero>();
+	s.template registerType<CPackForServer, BuildBoat>();
+	s.template registerType<CPackForServer, QueryReply>();
+	s.template registerType<CPackForServer, MakeAction>();
+	s.template registerType<CPackForServer, DigWithHero>();
+	s.template registerType<CPackForServer, CastAdvSpell>();
+	s.template registerType<CPackForServer, CastleTeleportHero>();
+	s.template registerType<CPackForServer, SaveGame>();
+	s.template registerType<CPackForServer, PlayerMessage>();
+	s.template registerType<CPackForServer, BulkSplitStack>();
+	s.template registerType<CPackForServer, BulkMergeStacks>();
+	s.template registerType<CPackForServer, BulkSmartSplitStack>();
+	s.template registerType<CPackForServer, BulkMoveArmy>();
+	s.template registerType<CPackForServer, BulkExchangeArtifacts>();
+	s.template registerType<CPackForServer, EraseArtifactByClient>();
+	s.template registerType<CPackForServer, GamePause>();
+}
+
+VCMI_LIB_NAMESPACE_END

+ 0 - 33
lib/registerTypes/TypesClientPacks1.cpp

@@ -1,33 +0,0 @@
-/*
- * TypesClientPacks1.cpp, part of VCMI engine
- *
- * Authors: listed in file AUTHORS in main folder
- *
- * License: GNU General Public License v2.0 or later
- * Full text of license available in license.txt file, in main folder
- *
- */
-#include "StdInc.h"
-#include "RegisterTypes.h"
-
-#include "../StartInfo.h"
-#include "../mapObjects/CObjectHandler.h"
-#include "../CCreatureHandler.h"
-#include "../VCMI_Lib.h"
-#include "../CArtHandler.h"
-#include "../CHeroHandler.h"
-#include "../spells/CSpellHandler.h"
-#include "../CTownHandler.h"
-
-#include "../serializer/BinaryDeserializer.h"
-#include "../serializer/BinarySerializer.h"
-#include "../serializer/CTypeList.h"
-
-VCMI_LIB_NAMESPACE_BEGIN
-
-
-template void registerTypesClientPacks1<BinaryDeserializer>(BinaryDeserializer & s);
-template void registerTypesClientPacks1<BinarySerializer>(BinarySerializer & s);
-template void registerTypesClientPacks1<CTypeList>(CTypeList & s);
-
-VCMI_LIB_NAMESPACE_END

+ 0 - 37
lib/registerTypes/TypesClientPacks2.cpp

@@ -1,37 +0,0 @@
-/*
- * TypesClientPacks2.cpp, part of VCMI engine
- *
- * Authors: listed in file AUTHORS in main folder
- *
- * License: GNU General Public License v2.0 or later
- * Full text of license available in license.txt file, in main folder
- *
- */
-#include "StdInc.h"
-#include "RegisterTypes.h"
-
-#include "../StartInfo.h"
-#include "../CStack.h"
-#include "../battle/BattleInfo.h"
-#include "../mapObjects/CObjectHandler.h"
-#include "../CCreatureHandler.h"
-#include "../VCMI_Lib.h"
-#include "../CArtHandler.h"
-#include "../CHeroHandler.h"
-#include "../spells/CSpellHandler.h"
-#include "../CTownHandler.h"
-
-#include "../serializer/BinaryDeserializer.h"
-#include "../serializer/BinarySerializer.h"
-#include "../serializer/CTypeList.h"
-
-VCMI_LIB_NAMESPACE_BEGIN
-
-
-template void registerTypesClientPacks2<BinaryDeserializer>(BinaryDeserializer & s);
-template void registerTypesClientPacks2<BinarySerializer>(BinarySerializer & s);
-template void registerTypesClientPacks2<CTypeList>(CTypeList & s);
-
-
-
-VCMI_LIB_NAMESPACE_END

+ 0 - 43
lib/registerTypes/TypesLobbyPacks.cpp

@@ -1,43 +0,0 @@
-/*
- * TypesLobbyPacks.cpp, part of VCMI engine
- *
- * Authors: listed in file AUTHORS in main folder
- *
- * License: GNU General Public License v2.0 or later
- * Full text of license available in license.txt file, in main folder
- *
- */
-#include "StdInc.h"
-#include "RegisterTypes.h"
-
-#include "../mapping/CMapInfo.h"
-#include "../StartInfo.h"
-#include "../gameState/CGameState.h"
-#include "../gameState/CGameStateCampaign.h"
-#include "../gameState/TavernHeroesPool.h"
-#include "../mapping/CMap.h"
-#include "../mapObjects/CObjectHandler.h"
-#include "../CCreatureHandler.h"
-#include "../VCMI_Lib.h"
-#include "../CArtHandler.h"
-#include "../CHeroHandler.h"
-#include "../spells/CSpellHandler.h"
-#include "../CTownHandler.h"
-#include "../RoadHandler.h"
-#include "../RiverHandler.h"
-#include "../TerrainHandler.h"
-#include "../campaign/CampaignState.h"
-#include "../rmg/CMapGenOptions.h"
-
-#include "../serializer/BinaryDeserializer.h"
-#include "../serializer/BinarySerializer.h"
-#include "../serializer/CTypeList.h"
-
-VCMI_LIB_NAMESPACE_BEGIN
-
-template void registerTypesLobbyPacks<BinaryDeserializer>(BinaryDeserializer & s);
-template void registerTypesLobbyPacks<BinarySerializer>(BinarySerializer & s);
-template void registerTypesLobbyPacks<CTypeList>(CTypeList & s);
-
-
-VCMI_LIB_NAMESPACE_END

+ 0 - 34
lib/registerTypes/TypesMapObjects1.cpp

@@ -1,34 +0,0 @@
-/*
- * TypesMapObjects1.cpp, part of VCMI engine
- *
- * Authors: listed in file AUTHORS in main folder
- *
- * License: GNU General Public License v2.0 or later
- * Full text of license available in license.txt file, in main folder
- *
- */
-#include "StdInc.h"
-#include "RegisterTypes.h"
-
-#include "../StartInfo.h"
-#include "../mapObjects/CObjectHandler.h"
-#include "../CCreatureHandler.h"
-#include "../VCMI_Lib.h"
-#include "../CArtHandler.h"
-#include "../CHeroHandler.h"
-#include "../spells/CSpellHandler.h"
-#include "../CTownHandler.h"
-
-#include "../serializer/BinaryDeserializer.h"
-#include "../serializer/BinarySerializer.h"
-#include "../serializer/CTypeList.h"
-
-VCMI_LIB_NAMESPACE_BEGIN
-
-template void registerTypesMapObjects1<BinaryDeserializer>(BinaryDeserializer & s);
-template void registerTypesMapObjects1<BinarySerializer>(BinarySerializer & s);
-template void registerTypesMapObjects1<CTypeList>(CTypeList & s);
-
-
-
-VCMI_LIB_NAMESPACE_END

+ 0 - 36
lib/registerTypes/TypesMapObjects2.cpp

@@ -1,36 +0,0 @@
-/*
- * TypesMapObjects2.cpp, part of VCMI engine
- *
- * Authors: listed in file AUTHORS in main folder
- *
- * License: GNU General Public License v2.0 or later
- * Full text of license available in license.txt file, in main folder
- *
- */
-#include "StdInc.h"
-#include "RegisterTypes.h"
-
-#include "../StartInfo.h"
-#include "../CStack.h"
-#include "../battle/BattleInfo.h"
-#include "../mapObjects/CObjectHandler.h"
-#include "../CCreatureHandler.h"
-#include "../VCMI_Lib.h"
-#include "../CArtHandler.h"
-#include "../CHeroHandler.h"
-#include "../spells/CSpellHandler.h"
-#include "../CTownHandler.h"
-
-#include "../serializer/BinaryDeserializer.h"
-#include "../serializer/BinarySerializer.h"
-#include "../serializer/CTypeList.h"
-
-VCMI_LIB_NAMESPACE_BEGIN
-
-
-template void registerTypesMapObjects2<BinaryDeserializer>(BinaryDeserializer & s);
-template void registerTypesMapObjects2<BinarySerializer>(BinarySerializer & s);
-template void registerTypesMapObjects2<CTypeList>(CTypeList & s);
-
-
-VCMI_LIB_NAMESPACE_END

+ 0 - 32
lib/registerTypes/TypesMapObjects3.cpp

@@ -1,32 +0,0 @@
-/*
- * TypesMapObjects3.cpp, part of VCMI engine
- *
- * Authors: listed in file AUTHORS in main folder
- *
- * License: GNU General Public License v2.0 or later
- * Full text of license available in license.txt file, in main folder
- *
- */
-#include "StdInc.h"
-#include "RegisterTypes.h"
-
-#include "../StartInfo.h"
-#include "../mapObjects/CObjectHandler.h"
-#include "../CCreatureHandler.h"
-#include "../VCMI_Lib.h"
-#include "../CArtHandler.h"
-#include "../CHeroHandler.h"
-#include "../spells/CSpellHandler.h"
-#include "../CTownHandler.h"
-
-#include "../serializer/BinaryDeserializer.h"
-#include "../serializer/BinarySerializer.h"
-#include "../serializer/CTypeList.h"
-
-VCMI_LIB_NAMESPACE_BEGIN
-
-template void registerTypesMapObjectTypes<BinaryDeserializer>(BinaryDeserializer & s);
-template void registerTypesMapObjectTypes<BinarySerializer>(BinarySerializer & s);
-template void registerTypesMapObjectTypes<CTypeList>(CTypeList & s);
-
-VCMI_LIB_NAMESPACE_END

+ 0 - 32
lib/registerTypes/TypesServerPacks.cpp

@@ -1,32 +0,0 @@
-/*
- * TypesServerPacks.cpp, part of VCMI engine
- *
- * Authors: listed in file AUTHORS in main folder
- *
- * License: GNU General Public License v2.0 or later
- * Full text of license available in license.txt file, in main folder
- *
- */
-#include "StdInc.h"
-#include "RegisterTypes.h"
-
-#include "../StartInfo.h"
-#include "../mapObjects/CObjectHandler.h"
-#include "../CCreatureHandler.h"
-#include "../VCMI_Lib.h"
-#include "../CArtHandler.h"
-#include "../CHeroHandler.h"
-#include "../spells/CSpellHandler.h"
-#include "../CTownHandler.h"
-
-#include "../serializer/BinaryDeserializer.h"
-#include "../serializer/BinarySerializer.h"
-#include "../serializer/CTypeList.h"
-
-VCMI_LIB_NAMESPACE_BEGIN
-
-template void registerTypesServerPacks<BinaryDeserializer>(BinaryDeserializer & s);
-template void registerTypesServerPacks<BinarySerializer>(BinarySerializer & s);
-template void registerTypesServerPacks<CTypeList>(CTypeList & s);
-
-VCMI_LIB_NAMESPACE_END

+ 6 - 85
lib/serializer/BinaryDeserializer.cpp

@@ -9,97 +9,18 @@
  */
 #include "StdInc.h"
 #include "BinaryDeserializer.h"
-
 #include "../registerTypes/RegisterTypes.h"
 
 VCMI_LIB_NAMESPACE_BEGIN
 
-extern template void registerTypes<BinaryDeserializer>(BinaryDeserializer & s);
-
-CLoadFile::CLoadFile(const boost::filesystem::path & fname, int minimalVersion)
-	: serializer(this)
-{
-	registerTypes(serializer);
-	openNextFile(fname, minimalVersion);
-}
-
-//must be instantiated in .cpp file for access to complete types of all member fields
-CLoadFile::~CLoadFile() = default;
-
-int CLoadFile::read(void * data, unsigned size)
-{
-	sfile->read(reinterpret_cast<char *>(data), size);
-	return size;
-}
-
-void CLoadFile::openNextFile(const boost::filesystem::path & fname, int minimalVersion)
-{
-	assert(!serializer.reverseEndianess);
-	assert(minimalVersion <= SERIALIZATION_VERSION);
-
-	try
-	{
-		fName = fname.string();
-		sfile = std::make_unique<std::fstream>(fname.c_str(), std::ios::in | std::ios::binary);
-		sfile->exceptions(std::ifstream::failbit | std::ifstream::badbit); //we throw a lot anyway
-
-		if(!(*sfile))
-			THROW_FORMAT("Error: cannot open to read %s!", fName);
-
-		//we can read
-		char buffer[4];
-		sfile->read(buffer, 4);
-		if(std::memcmp(buffer, "VCMI", 4) != 0)
-			THROW_FORMAT("Error: not a VCMI file(%s)!", fName);
-
-		serializer & serializer.fileVersion;
-		if(serializer.fileVersion < minimalVersion)
-			THROW_FORMAT("Error: too old file format (%s)!", fName);
-
-		if(serializer.fileVersion > SERIALIZATION_VERSION)
-		{
-			logGlobal->warn("Warning format version mismatch: found %d when current is %d! (file %s)\n", serializer.fileVersion, SERIALIZATION_VERSION , fName);
-
-			auto * versionptr = reinterpret_cast<char *>(&serializer.fileVersion);
-			std::reverse(versionptr, versionptr + 4);
-			logGlobal->warn("Version number reversed is %x, checking...", serializer.fileVersion);
-
-			if(serializer.fileVersion == SERIALIZATION_VERSION)
-			{
-				logGlobal->warn("%s seems to have different endianness! Entering reversing mode.", fname.string());
-				serializer.reverseEndianess = true;
-			}
-			else
-				THROW_FORMAT("Error: too new file format (%s)!", fName);
-		}
-	}
-	catch(...)
-	{
-		clear(); //if anything went wrong, we delete file and rethrow
-		throw;
-	}
-}
-
-void CLoadFile::reportState(vstd::CLoggerBase * out)
-{
-	out->debug("CLoadFile");
-	if(!!sfile && *sfile)
-		out->debug("\tOpened %s Position: %d", fName, sfile->tellg());
-}
-
-void CLoadFile::clear()
+BinaryDeserializer::BinaryDeserializer(IBinaryReader * r): CLoaderBase(r)
 {
-	sfile = nullptr;
-	fName.clear();
-	serializer.fileVersion = 0;
-}
+	saving = false;
+	fileVersion = 0;
+	smartPointerSerialization = true;
+	reverseEndianess = false;
 
-void CLoadFile::checkMagicBytes(const std::string &text)
-{
-	std::string loaded = text;
-	read((void *)loaded.data(), static_cast<unsigned int>(text.length()));
-	if(loaded != text)
-		throw std::runtime_error("Magic bytes doesn't match!");
+	registerTypes(*this);
 }
 
 VCMI_LIB_NAMESPACE_END

+ 3 - 37
lib/serializer/BinaryDeserializer.h

@@ -12,12 +12,9 @@
 #include "CSerializer.h"
 #include "CTypeList.h"
 #include "../mapObjects/CGHeroInstance.h"
-#include "../../Global.h"
 
 VCMI_LIB_NAMESPACE_BEGIN
 
-class CStackInstance;
-
 class DLL_LINKAGE CLoaderBase
 {
 protected:
@@ -115,7 +112,8 @@ class DLL_LINKAGE BinaryDeserializer : public CLoaderBase
 		}
 	};
 
-	template <typename Type> class CPointerLoader : public IPointerLoader
+	template <typename Type>
+	class CPointerLoader : public IPointerLoader
 	{
 	public:
 		void * loadPtr(CLoaderBase &ar, ui32 pid) const override //data is pointer to the ACTUAL POINTER
@@ -147,13 +145,7 @@ public:
 	bool smartPointerSerialization;
 	bool saving;
 
-	BinaryDeserializer(IBinaryReader * r): CLoaderBase(r)
-	{
-		saving = false;
-		fileVersion = 0;
-		smartPointerSerialization = true;
-		reverseEndianess = false;
-	}
+	BinaryDeserializer(IBinaryReader * r);
 
 	template<class T>
 	BinaryDeserializer & operator&(T & t)
@@ -538,30 +530,4 @@ public:
 	}
 };
 
-class DLL_LINKAGE CLoadFile : public IBinaryReader
-{
-public:
-	BinaryDeserializer serializer;
-
-	std::string fName;
-	std::unique_ptr<std::fstream> sfile;
-
-	CLoadFile(const boost::filesystem::path & fname, int minimalVersion = SERIALIZATION_VERSION); //throws!
-	virtual ~CLoadFile();
-	int read(void * data, unsigned size) override; //throws!
-
-	void openNextFile(const boost::filesystem::path & fname, int minimalVersion); //throws!
-	void clear();
-	void reportState(vstd::CLoggerBase * out) override;
-
-	void checkMagicBytes(const std::string & text);
-
-	template<class T>
-	CLoadFile & operator>>(T &t)
-	{
-		serializer & t;
-		return * this;
-	}
-};
-
 VCMI_LIB_NAMESPACE_END

+ 4 - 58
lib/serializer/BinarySerializer.cpp

@@ -9,69 +9,15 @@
  */
 #include "StdInc.h"
 #include "BinarySerializer.h"
-
 #include "../registerTypes/RegisterTypes.h"
 
 VCMI_LIB_NAMESPACE_BEGIN
 
-extern template void registerTypes<BinarySerializer>(BinarySerializer & s);
-
-CSaveFile::CSaveFile(const boost::filesystem::path &fname)
-	: serializer(this)
-{
-	registerTypes(serializer);
-	openNextFile(fname);
-}
-
-//must be instantiated in .cpp file for access to complete types of all member fields
-CSaveFile::~CSaveFile() = default;
-
-int CSaveFile::write(const void * data, unsigned size)
-{
-	sfile->write((char *)data,size);
-	return size;
-}
-
-void CSaveFile::openNextFile(const boost::filesystem::path &fname)
-{
-	fName = fname;
-	try
-	{
-		sfile = std::make_unique<std::fstream>(fname.c_str(), std::ios::out | std::ios::binary);
-		sfile->exceptions(std::ifstream::failbit | std::ifstream::badbit); //we throw a lot anyway
-
-		if(!(*sfile))
-			THROW_FORMAT("Error: cannot open to write %s!", fname);
-
-		sfile->write("VCMI",4); //write magic identifier
-		serializer & SERIALIZATION_VERSION; //write format version
-	}
-	catch(...)
-	{
-		logGlobal->error("Failed to save to %s", fname.string());
-		clear();
-		throw;
-	}
-}
-
-void CSaveFile::reportState(vstd::CLoggerBase * out)
-{
-	out->debug("CSaveFile");
-	if(sfile.get() && *sfile)
-	{
-		out->debug("\tOpened %s \tPosition: %d", fName, sfile->tellp());
-	}
-}
-
-void CSaveFile::clear()
-{
-	fName.clear();
-	sfile = nullptr;
-}
-
-void CSaveFile::putMagicBytes(const std::string &text)
+BinarySerializer::BinarySerializer(IBinaryWriter * w): CSaverBase(w)
 {
-	write(text.c_str(), static_cast<unsigned int>(text.length()));
+	saving=true;
+	smartPointerSerialization = true;
+	registerTypes(*this);
 }
 
 VCMI_LIB_NAMESPACE_END

+ 1 - 31
lib/serializer/BinarySerializer.h

@@ -115,11 +115,7 @@ public:
 	bool smartPointerSerialization;
 	bool saving;
 
-	BinarySerializer(IBinaryWriter * w): CSaverBase(w)
-	{
-		saving=true;
-		smartPointerSerialization = true;
-	}
+	BinarySerializer(IBinaryWriter * w);
 
 	template<typename Base, typename Derived>
 	void registerType(const Base * b = nullptr, const Derived * d = nullptr)
@@ -404,30 +400,4 @@ public:
 	}
 };
 
-class DLL_LINKAGE CSaveFile : public IBinaryWriter
-{
-public:
-	BinarySerializer serializer;
-
-	boost::filesystem::path fName;
-	std::unique_ptr<std::fstream> sfile;
-
-	CSaveFile(const boost::filesystem::path &fname); //throws!
-	~CSaveFile();
-	int write(const void * data, unsigned size) override;
-
-	void openNextFile(const boost::filesystem::path &fname); //throws!
-	void clear();
-	void reportState(vstd::CLoggerBase * out) override;
-
-	void putMagicBytes(const std::string &text);
-
-	template<class T>
-	CSaveFile & operator<<(const T &t)
-	{
-		serializer & t;
-		return * this;
-	}
-};
-
 VCMI_LIB_NAMESPACE_END

+ 100 - 0
lib/serializer/CLoadFile.cpp

@@ -0,0 +1,100 @@
+/*
+ * CLoadFile.cpp, part of VCMI engine
+ *
+ * Authors: listed in file AUTHORS in main folder
+ *
+ * License: GNU General Public License v2.0 or later
+ * Full text of license available in license.txt file, in main folder
+ *
+ */
+#include "StdInc.h"
+#include "CLoadFile.h"
+
+VCMI_LIB_NAMESPACE_BEGIN
+
+CLoadFile::CLoadFile(const boost::filesystem::path & fname, int minimalVersion)
+	: serializer(this)
+{
+	openNextFile(fname, minimalVersion);
+}
+
+//must be instantiated in .cpp file for access to complete types of all member fields
+CLoadFile::~CLoadFile() = default;
+
+int CLoadFile::read(void * data, unsigned size)
+{
+	sfile->read(reinterpret_cast<char *>(data), size);
+	return size;
+}
+
+void CLoadFile::openNextFile(const boost::filesystem::path & fname, int minimalVersion)
+{
+	assert(!serializer.reverseEndianess);
+	assert(minimalVersion <= SERIALIZATION_VERSION);
+
+	try
+	{
+		fName = fname.string();
+		sfile = std::make_unique<std::fstream>(fname.c_str(), std::ios::in | std::ios::binary);
+		sfile->exceptions(std::ifstream::failbit | std::ifstream::badbit); //we throw a lot anyway
+
+		if(!(*sfile))
+			THROW_FORMAT("Error: cannot open to read %s!", fName);
+
+		//we can read
+		char buffer[4];
+		sfile->read(buffer, 4);
+		if(std::memcmp(buffer, "VCMI", 4) != 0)
+			THROW_FORMAT("Error: not a VCMI file(%s)!", fName);
+
+		serializer & serializer.fileVersion;
+		if(serializer.fileVersion < minimalVersion)
+			THROW_FORMAT("Error: too old file format (%s)!", fName);
+
+		if(serializer.fileVersion > SERIALIZATION_VERSION)
+		{
+			logGlobal->warn("Warning format version mismatch: found %d when current is %d! (file %s)\n", serializer.fileVersion, SERIALIZATION_VERSION , fName);
+
+			auto * versionptr = reinterpret_cast<char *>(&serializer.fileVersion);
+			std::reverse(versionptr, versionptr + 4);
+			logGlobal->warn("Version number reversed is %x, checking...", serializer.fileVersion);
+
+			if(serializer.fileVersion == SERIALIZATION_VERSION)
+			{
+				logGlobal->warn("%s seems to have different endianness! Entering reversing mode.", fname.string());
+				serializer.reverseEndianess = true;
+			}
+			else
+				THROW_FORMAT("Error: too new file format (%s)!", fName);
+		}
+	}
+	catch(...)
+	{
+		clear(); //if anything went wrong, we delete file and rethrow
+		throw;
+	}
+}
+
+void CLoadFile::reportState(vstd::CLoggerBase * out)
+{
+	out->debug("CLoadFile");
+	if(!!sfile && *sfile)
+		out->debug("\tOpened %s Position: %d", fName, sfile->tellg());
+}
+
+void CLoadFile::clear()
+{
+	sfile = nullptr;
+	fName.clear();
+	serializer.fileVersion = 0;
+}
+
+void CLoadFile::checkMagicBytes(const std::string &text)
+{
+	std::string loaded = text;
+	read((void *)loaded.data(), static_cast<unsigned int>(text.length()));
+	if(loaded != text)
+		throw std::runtime_error("Magic bytes doesn't match!");
+}
+
+VCMI_LIB_NAMESPACE_END

+ 42 - 0
lib/serializer/CLoadFile.h

@@ -0,0 +1,42 @@
+/*
+ * CLoadFile.h, part of VCMI engine
+ *
+ * Authors: listed in file AUTHORS in main folder
+ *
+ * License: GNU General Public License v2.0 or later
+ * Full text of license available in license.txt file, in main folder
+ *
+ */
+#pragma once
+
+#include "BinaryDeserializer.h"
+
+VCMI_LIB_NAMESPACE_BEGIN
+
+class DLL_LINKAGE CLoadFile : public IBinaryReader
+{
+public:
+	BinaryDeserializer serializer;
+
+	std::string fName;
+	std::unique_ptr<std::fstream> sfile;
+
+	CLoadFile(const boost::filesystem::path & fname, int minimalVersion = SERIALIZATION_VERSION); //throws!
+	virtual ~CLoadFile();
+	int read(void * data, unsigned size) override; //throws!
+
+	void openNextFile(const boost::filesystem::path & fname, int minimalVersion); //throws!
+	void clear();
+	void reportState(vstd::CLoggerBase * out) override;
+
+	void checkMagicBytes(const std::string & text);
+
+	template<class T>
+	CLoadFile & operator>>(T &t)
+	{
+		serializer & t;
+		return * this;
+	}
+};
+
+VCMI_LIB_NAMESPACE_END

+ 0 - 4
lib/serializer/CMemorySerializer.cpp

@@ -10,8 +10,6 @@
 #include "StdInc.h"
 #include "CMemorySerializer.h"
 
-#include "../registerTypes/RegisterTypes.h"
-
 VCMI_LIB_NAMESPACE_BEGIN
 
 int CMemorySerializer::read(void * data, unsigned size)
@@ -34,8 +32,6 @@ int CMemorySerializer::write(const void * data, unsigned size)
 
 CMemorySerializer::CMemorySerializer(): iser(this), oser(this), readPos(0)
 {
-	registerTypes(iser);
-	registerTypes(oser);
 	iser.fileVersion = SERIALIZATION_VERSION;
 }
 

+ 72 - 0
lib/serializer/CSaveFile.cpp

@@ -0,0 +1,72 @@
+/*
+ * CSaveFile.cpp, part of VCMI engine
+ *
+ * Authors: listed in file AUTHORS in main folder
+ *
+ * License: GNU General Public License v2.0 or later
+ * Full text of license available in license.txt file, in main folder
+ *
+ */
+#include "StdInc.h"
+#include "CSaveFile.h"
+
+VCMI_LIB_NAMESPACE_BEGIN
+
+CSaveFile::CSaveFile(const boost::filesystem::path &fname)
+	: serializer(this)
+{
+	openNextFile(fname);
+}
+
+//must be instantiated in .cpp file for access to complete types of all member fields
+CSaveFile::~CSaveFile() = default;
+
+int CSaveFile::write(const void * data, unsigned size)
+{
+	sfile->write((char *)data,size);
+	return size;
+}
+
+void CSaveFile::openNextFile(const boost::filesystem::path &fname)
+{
+	fName = fname;
+	try
+	{
+		sfile = std::make_unique<std::fstream>(fname.c_str(), std::ios::out | std::ios::binary);
+		sfile->exceptions(std::ifstream::failbit | std::ifstream::badbit); //we throw a lot anyway
+
+		if(!(*sfile))
+			THROW_FORMAT("Error: cannot open to write %s!", fname);
+
+		sfile->write("VCMI",4); //write magic identifier
+		serializer & SERIALIZATION_VERSION; //write format version
+	}
+	catch(...)
+	{
+		logGlobal->error("Failed to save to %s", fname.string());
+		clear();
+		throw;
+	}
+}
+
+void CSaveFile::reportState(vstd::CLoggerBase * out)
+{
+	out->debug("CSaveFile");
+	if(sfile.get() && *sfile)
+	{
+		out->debug("\tOpened %s \tPosition: %d", fName, sfile->tellp());
+	}
+}
+
+void CSaveFile::clear()
+{
+	fName.clear();
+	sfile = nullptr;
+}
+
+void CSaveFile::putMagicBytes(const std::string &text)
+{
+	write(text.c_str(), static_cast<unsigned int>(text.length()));
+}
+
+VCMI_LIB_NAMESPACE_END

+ 42 - 0
lib/serializer/CSaveFile.h

@@ -0,0 +1,42 @@
+/*
+ * CSaveFile.h, part of VCMI engine
+ *
+ * Authors: listed in file AUTHORS in main folder
+ *
+ * License: GNU General Public License v2.0 or later
+ * Full text of license available in license.txt file, in main folder
+ *
+ */
+#pragma once
+
+#include "BinarySerializer.h"
+
+VCMI_LIB_NAMESPACE_BEGIN
+
+class DLL_LINKAGE CSaveFile : public IBinaryWriter
+{
+public:
+	BinarySerializer serializer;
+
+	boost::filesystem::path fName;
+	std::unique_ptr<std::fstream> sfile;
+
+	CSaveFile(const boost::filesystem::path &fname); //throws!
+	~CSaveFile();
+	int write(const void * data, unsigned size) override;
+
+	void openNextFile(const boost::filesystem::path &fname); //throws!
+	void clear();
+	void reportState(vstd::CLoggerBase * out) override;
+
+	void putMagicBytes(const std::string &text);
+
+	template<class T>
+	CSaveFile & operator<<(const T &t)
+	{
+		serializer & t;
+		return * this;
+	}
+};
+
+VCMI_LIB_NAMESPACE_END

+ 1 - 4
lib/serializer/Connection.cpp

@@ -10,8 +10,7 @@
 #include "StdInc.h"
 #include "Connection.h"
 
-#include "../registerTypes/RegisterTypes.h"
-#include "../mapping/CMapHeader.h"
+#include "../networkPacks/NetPacksBase.h"
 
 #include <boost/asio.hpp>
 
@@ -45,8 +44,6 @@ void CConnection::init()
 
 	enableSmartPointerSerialization();
 	disableStackSendingByID();
-	registerTypes(iser);
-	registerTypes(oser);
 #ifndef VCMI_ENDIAN_BIG
 	myEndianess = true;
 #else

+ 5 - 5
server/CGameHandler.cpp

@@ -27,6 +27,7 @@
 #include "../lib/CCreatureSet.h"
 #include "../lib/CGeneralTextHandler.h"
 #include "../lib/CHeroHandler.h"
+#include "../lib/CPlayerState.h"
 #include "../lib/CSoundBase.h"
 #include "../lib/CThreadHelper.h"
 #include "../lib/CTownHandler.h"
@@ -47,20 +48,19 @@
 
 #include "../lib/mapping/CMap.h"
 #include "../lib/mapping/CMapService.h"
+#include "../lib/mapObjects/CGMarket.h"
 #include "../lib/modding/ModIncompatibility.h"
 #include "../lib/networkPacks/StackLocation.h"
 #include "../lib/pathfinder/CPathfinder.h"
 #include "../lib/pathfinder/PathfinderOptions.h"
 #include "../lib/pathfinder/TurnInfo.h"
 
-#include "../lib/registerTypes/RegisterTypes.h"
+#include "../lib/registerTypes/RegisterTypesServerPacks.h"
 
 #include "../lib/rmg/CMapGenOptions.h"
 
-#include "../lib/serializer/CTypeList.h"
-#include "../lib/serializer/Cast.h"
-#include "../lib/serializer/Connection.h"
-#include "../lib/serializer/JsonSerializer.h"
+#include "../lib/serializer/CSaveFile.h"
+#include "../lib/serializer/CLoadFile.h"
 
 #include "../lib/spells/CSpellHandler.h"
 

+ 1 - 1
server/CVCMIServer.cpp

@@ -47,7 +47,7 @@
 #include "../lib/UnlockGuard.h"
 
 // for applier
-#include "../lib/registerTypes/RegisterTypes.h"
+#include "../lib/registerTypes/RegisterTypesLobbyPacks.h"
 
 // UUID generation
 #include <boost/uuid/uuid.hpp>