private Scene3D(Game game, Func <Viewport> getViewport, InputMessageBuffer inputMessageBuffer, int randomSeed, bool isDiagnosticScene, MapFile mapFile, string mapPath) { Game = game; PlayerManager = new PlayerManager(); PartitionCellManager = new PartitionCellManager(game); Camera = new Camera(getViewport); SelectionGui = new SelectionGui(); DebugOverlay = new DebugOverlay(this, game.ContentManager); Random = new Random(randomSeed); if (mapFile != null) { MapFile = mapFile; Terrain = AddDisposable(new Terrain.Terrain(mapFile, game.AssetStore.LoadContext)); WaterAreas = AddDisposable(new WaterAreaCollection(mapFile.PolygonTriggers, mapFile.StandingWaterAreas, mapFile.StandingWaveAreas, game.AssetStore.LoadContext)); Navigation = new Navigation.Navigation(mapFile.BlendTileData, Terrain.HeightMap); } RegisterInputHandler(_cameraInputMessageHandler = new CameraInputMessageHandler(), inputMessageBuffer); if (!isDiagnosticScene) { RegisterInputHandler(new SelectionMessageHandler(game.Selection), inputMessageBuffer); RegisterInputHandler(_orderGeneratorInputHandler = new OrderGeneratorInputHandler(game.OrderGenerator), inputMessageBuffer); RegisterInputHandler(_debugMessageHandler = new DebugMessageHandler(DebugOverlay), inputMessageBuffer); } ParticleSystemManager = AddDisposable(new ParticleSystemManager(game.AssetStore.LoadContext)); Radar = new Radar(this, game.AssetStore, mapPath); if (mapFile != null) { var borderWidth = mapFile.HeightMapData.BorderWidth * HeightMap.HorizontalScale; var width = mapFile.HeightMapData.Width * HeightMap.HorizontalScale; var height = mapFile.HeightMapData.Height * HeightMap.HorizontalScale; Quadtree = new Quadtree <GameObject>(new RectangleF(-borderWidth, -borderWidth, width, height)); } GameContext = new GameContext( game.AssetStore.LoadContext, game.Audio, ParticleSystemManager, new ObjectCreationListManager(), Terrain, Navigation, Radar, Quadtree, this); GameObjects = AddDisposable(new GameObjectCollection(GameContext)); GameContext.GameObjects = GameObjects; _orderGeneratorSystem = game.OrderGenerator; }
public static void LoadFromStream(Stream stream, Game game) { using var binaryReader = new BinaryReader(stream, Encoding.Unicode, true); var reader = new SaveFileReader(binaryReader); var gameState = new GameState(); GameLogic gameLogic = null; GameClient gameClient = null; CampaignManager campaignManager = null; var terrainLogic = new TerrainLogic(); var terrainVisual = new TerrainVisual(); var partitionCellManager = new PartitionCellManager(game); var ghostObjectManager = new GhostObjectManager(); while (true) { var chunkName = reader.ReadAsciiString(); if (chunkName == "SG_EOF") { if (stream.Position != stream.Length) { throw new InvalidDataException(); } break; } reader.BeginSegment(); switch (chunkName) { case "CHUNK_GameState": gameState.Load(reader); break; case "CHUNK_Campaign": campaignManager = new CampaignManager(); campaignManager.Load(reader); break; case "CHUNK_GameStateMap": GameStateMap.Load(reader, game); partitionCellManager.OnNewGame(); break; case "CHUNK_TerrainLogic": terrainLogic.Load(reader); break; case "CHUNK_TeamFactory": game.Scene3D.TeamFactory.Load(reader); break; case "CHUNK_Players": game.Scene3D.PlayerManager.Load(reader, game); break; case "CHUNK_GameLogic": gameLogic = new GameLogic(game.Scene3D); gameLogic.Load(reader); break; case "CHUNK_ParticleSystem": game.Scene3D.ParticleSystemManager.Load(reader); break; case "CHUNK_Radar": game.Scene3D.Radar.Load(reader); break; case "CHUNK_ScriptEngine": game.Scripting.Load(reader); break; case "CHUNK_SidesList": game.Scene3D.PlayerScripts.Load(reader); break; case "CHUNK_TacticalView": ((RtsCameraController)game.Scene3D.CameraController).Load(reader); break; case "CHUNK_GameClient": gameClient = new GameClient(game.Scene3D, gameLogic); gameClient.Load(reader); break; case "CHUNK_InGameUI": game.AssetStore.InGameUI.Current.Load(reader); break; case "CHUNK_Partition": partitionCellManager.Load(reader); break; case "CHUNK_TerrainVisual": terrainVisual.Load(reader, game); break; case "CHUNK_GhostObject": ghostObjectManager.Load(reader, gameLogic, game); break; default: throw new InvalidDataException($"Unknown chunk type '{chunkName}'."); } reader.EndSegment(); } // If we haven't started a game yet (which will be the case for // "mission start" save files), then start it now. if (!game.InGame) { game.StartCampaign( campaignManager.CampaignName, campaignManager.MissionName); } }