Esempio n. 1
0
        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;
        }
Esempio n. 2
0
        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);
            }
        }