Ejemplo n.º 1
0
        public void LoadIniFile(FileSystemEntry entry, bool included = false)
        {
            using (GameTrace.TraceDurationEvent($"LoadIniFile('{entry.FilePath}'"))
            {
                if (!included && !entry.FilePath.ToLowerInvariant().EndsWith(".ini"))
                {
                    return;
                }

                if (_alreadyLoaded.Contains(entry.FilePath))
                {
                    return;
                }

                string source;

                using (var stream = entry.Open())
                    using (var reader = new StreamReader(stream, Encoding.ASCII))
                    {
                        source = reader.ReadToEnd();
                    }

                var parser = new IniParser(source, entry, this, _game);
                parser.ParseFile();

                _alreadyLoaded.Add(entry.FilePath);
            }
        }
Ejemplo n.º 2
0
    public void PlayerAddStep(GameTrace gameTrace)
    {
        if ((_gameDataHandler.GameState != GameState.WhitePlay && gameTrace.player == "white") ||
            (_gameDataHandler.GameState != GameState.BlackPlay && gameTrace.player == "black"))
        {
            return;
        }
        //Debug.Log("in PlayerAddStep:" + " GameState = " + _gameDataHandler.GameState + ", _isBlack = " + _isBlack +
        //    ", order = " + gameTrace.order + ", x = " + gameTrace.x + ", y = " + gameTrace.y + ", player = " + gameTrace.player);
        try {
            _gameDataHandler.AddStep(gameTrace);
            _gameSceneTool.AddGameObj(gameTrace);
            _gameDataHandler.UpdateGameState();

            if (_isDoublePlayer)
            {
                _isBlack = !_isBlack;
            }
            _gameSceneTool.LimitText.text = "";
        }
        catch (ArgumentException) {
            Debug.Log("already have a step on this position");
            // already have a step on this position
        }
        catch (PlayerLimitException) {
            _gameSceneTool.LimitText.text = "黑棋禁手触发" + Environment.NewLine + "x = " + gameTrace.x + ", y = " + (14 - gameTrace.y);
        }
    }
    private void Update()
    {
        if (!isLocalPlayer)
        {
            return;
        }

        // handle game playing
        if (_player.Cursor.Enabled && Input.GetMouseButtonDown(0))
        {
            GameTrace gameTrace = new GameTrace(GameDataHandler.Instance.Turn, _player.IsBlack, _player.Cursor.BoardPos.x, _player.Cursor.BoardPos.y);
            Debug.Log("in OnlinePlayer:" +
                      "order = " + gameTrace.order + ", x = " + gameTrace.x + ", y = " + gameTrace.y + ", player = " + gameTrace.player);
            CmdAddStep(gameTrace);
        }


        // handle regret
        if (Input.GetKeyDown("z"))
        {
            CmdRegret();
        }

        // reset operation
        if (Input.GetKeyDown("escape"))
        {
            CmdReset();
        }
    }
Ejemplo n.º 4
0
        public ShaderResourceManager(
            GraphicsDevice graphicsDevice,
            StandardGraphicsResources standardGraphicsResources)
        {
            using (GameTrace.TraceDurationEvent("ShaderResourceManager()"))
            {
                Global = AddDisposable(new GlobalShaderResources(graphicsDevice, standardGraphicsResources.SolidWhiteTexture));
                Mesh   = AddDisposable(new MeshShaderResources(graphicsDevice));

                RadiusCursor = AddDisposable(new RadiusCursorDecalShaderResources(graphicsDevice, standardGraphicsResources.Aniso4xClampSampler));

                FixedFunction = AddDisposable(new FixedFunctionShaderResources(graphicsDevice, Global, Mesh));
                MeshDepth     = AddDisposable(new MeshDepthShaderResources(graphicsDevice, Global, Mesh));
                Particle      = AddDisposable(new ParticleShaderResources(graphicsDevice, Global));
                Road          = AddDisposable(new RoadShaderResources(graphicsDevice, Global, RadiusCursor));
                Sprite        = AddDisposable(new SpriteShaderResources(graphicsDevice));
                Terrain       = AddDisposable(new TerrainShaderResources(graphicsDevice, Global, RadiusCursor));
                Water         = AddDisposable(new WaterShaderResources(graphicsDevice, Global));

                _shaderMaterialResources = new Dictionary <string, ShaderMaterialShaderResources>
                {
                    { "NormalMapped", AddDisposable(new NormalMappedShaderResources(graphicsDevice, Global, Mesh)) },
                    { "Simple", AddDisposable(new SimpleShaderResources(graphicsDevice, Global, Mesh)) }
                };
            }
        }
Ejemplo n.º 5
0
        public ContentManager(
            Game game,
            FileSystem fileSystem,
            GraphicsDevice graphicsDevice,
            SageGame sageGame)
        {
            using (GameTrace.TraceDurationEvent("ContentManager()"))
            {
                _game       = game;
                _fileSystem = fileSystem;

                GraphicsDevice = graphicsDevice;

                SageGame = sageGame;

                Language = LanguageUtility.ReadCurrentLanguage(game.Definition, fileSystem.RootDirectory);

                IniDataContext = new IniDataContext();

                SubsystemLoader = Content.SubsystemLoader.Create(game.Definition, _fileSystem, game, this);

                switch (sageGame)
                {
                // Only load these INI files for a subset of games, because we can't parse them for others yet.
                case SageGame.CncGenerals:
                case SageGame.CncGeneralsZeroHour:
                case SageGame.Bfme:
                case SageGame.Bfme2:
                case SageGame.Bfme2Rotwk:
                    SubsystemLoader.Load(Subsystem.Core);

                    // TODO: Defer subsystem loading until necessary
                    SubsystemLoader.Load(Subsystem.Audio);
                    SubsystemLoader.Load(Subsystem.Players);
                    SubsystemLoader.Load(Subsystem.ParticleSystems);
                    SubsystemLoader.Load(Subsystem.ObjectCreation);
                    SubsystemLoader.Load(Subsystem.Multiplayer);
                    SubsystemLoader.Load(Subsystem.LinearCampaign);
                    SubsystemLoader.Load(Subsystem.Wnd);
                    SubsystemLoader.Load(Subsystem.Terrain);
                    SubsystemLoader.Load(Subsystem.Credits);

                    break;

                case SageGame.Cnc3:
                    SubsystemLoader.Load(Subsystem.Core);
                    break;

                default:
                    break;
                }

                TranslationManager = Translation.TranslationManager.Instance;
                Translation.TranslationManager.LoadGameStrings(fileSystem, Language, sageGame);

                FontManager = new FontManager();

                WndImageLoader = AddDisposable(new WndImageLoader(this, game.AssetStore));
            }
        }
Ejemplo n.º 6
0
    public void AddGameObj(GameTrace gameTrace)
    {
        Vector2Int boardPos = new Vector2Int(gameTrace.x, gameTrace.y);

        if (_gameObjects.ContainsKey(boardPos))
        {
            // already have a step on this position
            Debug.Log("in AddGameObj: already have this key");
            return;
        }
        Vector3    worldPos = new Vector3(CursorController.CalcPosition(gameTrace.x), 1, CursorController.CalcPosition(gameTrace.y));
        GameObject newStone = null;

        if (gameTrace.player == "black")
        {
            newStone = Instantiate(_blackStonePrefab, worldPos, Quaternion.LookRotation(Vector3.up));
        }
        else if (gameTrace.player == "white")
        {
            newStone = Instantiate(_whiteStonePrefab, worldPos, Quaternion.LookRotation(Vector3.up));
        }
        if (newStone != null)
        {
            _gameObjects.Add(new Vector2Int(gameTrace.x, gameTrace.y), newStone);
            newStone.transform.localScale = new Vector3(2, 2, 2);
        }
    }
Ejemplo n.º 7
0
    public void PlayerRegret()
    {
        if ((_gameDataHandler.GameState != GameState.BlackPlay && _isBlack) ||
            (_gameDataHandler.GameState != GameState.WhitePlay && !_isBlack) ||
            (_gameDataHandler.Turn <= 1))
        {
            return;
        }
        try {
            // remove 2 step
            _gameDataHandler.RevertGameState();
            GameTrace gameTrace = _gameDataHandler.GetCurrentStep();
            _gameDataHandler.RemoveStep(gameTrace);
            _gameSceneTool.RemoveGameObj(gameTrace);

            _gameDataHandler.RevertGameState();
            gameTrace = _gameDataHandler.GetCurrentStep();
            _gameDataHandler.RemoveStep(gameTrace);
            _gameSceneTool.RemoveGameObj(gameTrace);
        }
        catch (EmptyGameDataException) {
            // no game date available
            Debug.Log("EmptyGameDataException");
        }
    }
Ejemplo n.º 8
0
 public void AddStep(GameTrace gameTrace)
 {
     Debug.Log("Game_Data: " + GameToJson());
     Debug.Log("Step_Data: " + JsonConvert.SerializeObject(gameTrace));
     if (gameTrace.player == "black" && !GetLimit(gameTrace))
     {
         throw new PlayerLimitException();
     }
     try {
         if (gameTrace.player == "black")
         {
             _totalPlayTrace.Add(new Vector2Int(gameTrace.x, gameTrace.y), gameTrace);
             _blackPlayTrace.Add(new Vector2Int(gameTrace.x, gameTrace.y), gameTrace);
             _playSequence.Add(gameTrace.order, new Vector2Int(gameTrace.x, gameTrace.y));
         }
         else if (gameTrace.player == "white")
         {
             _totalPlayTrace.Add(new Vector2Int(gameTrace.x, gameTrace.y), gameTrace);
             _whitePlayTrace.Add(new Vector2Int(gameTrace.x, gameTrace.y), gameTrace);
             _playSequence.Add(gameTrace.order, new Vector2Int(gameTrace.x, gameTrace.y));
         }
     }
     catch (ArgumentException exc) {
         // already have this key
         Debug.Log("ArgumentException caught in GameDataHandler.AddStep");
         throw exc;
     }
 }
Ejemplo n.º 9
0
 internal void LoadIniFile(FileSystemEntry entry)
 {
     using (GameTrace.TraceDurationEvent($"LoadIniFile('{entry.FilePath}'"))
     {
         var parser = new IniParser(entry, _game.AssetStore, _game.SageGame, IniDataContext, LocaleSpecificEncoding);
         parser.ParseFile();
     }
 }
Ejemplo n.º 10
0
    public void RemoveStep(GameTrace gameTrace)
    {
        _playSequence.Remove(gameTrace.order);
        Vector2Int boardPos = new Vector2Int(gameTrace.x, gameTrace.y);

        _totalPlayTrace.Remove(boardPos);
        _blackPlayTrace.Remove(boardPos);
        _whitePlayTrace.Remove(boardPos);
    }
Ejemplo n.º 11
0
    public void RemoveGameObj(GameTrace gameTrace)
    {
        Vector2Int boardPos   = new Vector2Int(gameTrace.x, gameTrace.y);
        GameObject gameObject = null;

        if (_gameObjects.TryGetValue(boardPos, out gameObject))
        {
            Destroy(gameObject);
            _gameObjects.Remove(boardPos);
        }
    }
Ejemplo n.º 12
0
        internal void LoadIniFile(FileSystemEntry entry)
        {
            using (GameTrace.TraceDurationEvent($"LoadIniFile('{entry.FilePath}'"))
            {
                if (!entry.FilePath.ToLowerInvariant().EndsWith(".ini"))
                {
                    return;
                }

                var parser = new IniParser(entry, _game.AssetStore, _game.SageGame, IniDataContext);
                parser.ParseFile();
            }
        }
Ejemplo n.º 13
0
    public string GameToJson()
    {
        var jsonWrapper = new JsonWrapper();

        jsonWrapper.gameTrace = new List <GameTrace>();
        foreach (var item in _totalPlayTrace)
        {
            GameTrace gameTrace = item.Value;
            gameTrace.y = 14 - gameTrace.y;
            jsonWrapper.gameTrace.Add(gameTrace);
        }
        return(JsonConvert.SerializeObject(jsonWrapper));
    }
Ejemplo n.º 14
0
    private void Update()
    {
        // online player is handled by class OnlinePlayer
        if (_isOnline)
        {
            return;
        }

        if (_isBot)
        {
            if ((_gameDataHandler.GameState != GameState.BlackPlay && _isBlack) ||
                (_gameDataHandler.GameState != GameState.WhitePlay && !_isBlack))
            {
                return;
            }
            try {
                GameTrace gameTrace = AiDriver.GetAiStep(GameDataHandler.Instance.GameToJson());
                PlayerAddStep(gameTrace);
            }
            catch (EmptyGameDataException) {
                Debug.Log("EmptyGameData");
            }
            return;
        }

        // handle game playing
        if (_cursor.Enabled && Input.GetMouseButtonDown(0))
        {
            GameTrace gameTrace = new GameTrace(_gameDataHandler.Turn, _isBlack, _cursor.BoardPos.x, _cursor.BoardPos.y);
            PlayerAddStep(gameTrace);
        }


        // handle regret
        if (Input.GetKeyDown("z"))
        {
            PlayerRegret();
        }

        // reset operation
        if (Input.GetKeyDown("escape"))
        {
            PlayerReset();
        }
    }
Ejemplo n.º 15
0
    public void UpdateGameState()
    {
        GameTrace  gameTrace = GetCurrentStep();
        Vector2Int boardPos  = new Vector2Int(gameTrace.x, gameTrace.y);

        switch (GameState)
        {
        case GameState.BlackPlay:
            _turn++;
            if (WinChecker.CheckWin(_blackPlayTrace, boardPos))
            {
                _gameState = GameState.BlackWin;
            }
            else
            {
                _gameState = GameState.WhitePlay;
            }
            break;

        case GameState.WhitePlay:
            _turn++;
            if (WinChecker.CheckWin(_whitePlayTrace, boardPos))
            {
                _gameState = GameState.WhiteWin;
            }
            else
            {
                _gameState = GameState.BlackPlay;
            }
            break;

        case GameState.BlackWin:
            break;

        case GameState.WhiteWin:
            break;
        }
    }
Ejemplo n.º 16
0
    //[DllImport("Native_Ai_Module_normal", CallingConvention = CallingConvention.Cdecl)]
    //static extern void drive_ai_normal(string json_in, StringBuilder json_out, int capacity);

    public static GameTrace GetAiStep(string gameDataJson)
    {
        StringBuilder json_out_builder = new StringBuilder(100);

        drive_ai_hard(gameDataJson, json_out_builder, json_out_builder.Capacity);
        string json_out = json_out_builder.ToString();
        int    pos      = json_out.IndexOf('}');

        json_out = json_out.Remove(pos + 1, json_out.Length - 1 - pos);
        Debug.Log(gameDataJson);
        Debug.Log(json_out);
        // deserialize the object from json text
        if (json_out.Length > 0)
        {
            GameTrace gameTrace = JsonConvert.DeserializeObject <GameTrace>(json_out);
            gameTrace.y = 14 - gameTrace.y;
            return(gameTrace);
        }
        else
        {
            throw new EmptyGameDataException();
        }
    }
Ejemplo n.º 17
0
        public static void Run(Options opts)
        {
            logger.Info("Starting...");

            var DetectedGame = opts.Game;
            var GameFolder   = opts.GamePath;
            var UseLocators  = true;

            if (GameFolder == null)
            {
                GameFolder = Environment.CurrentDirectory;
            }

            foreach (var gameDef in GameDefinition.All)
            {
                if (gameDef.Probe(GameFolder))
                {
                    DetectedGame = gameDef.Game;
                    UseLocators  = false;
                }
            }

            var definition = GameDefinition.FromGame(DetectedGame);
            GameInstallation installation;

            if (UseLocators)
            {
                installation = GameInstallation
                               .FindAll(new[] { definition })
                               .FirstOrDefault();
            }
            else
            {
                installation = new GameInstallation(definition, GameFolder);
            }

            if (installation == null)
            {
                Console.WriteLine($"OpenSAGE was unable to find any installations of {definition.DisplayName}.\n");

                Console.WriteLine("You can manually specify the installation path by setting the following environment variable:");
                Console.WriteLine($"\t{definition.Identifier.ToUpper()}_PATH=<installation path>\n");

                Console.WriteLine("OpenSAGE doesn't yet detect every released version of every game. Please report undetected versions to our GitHub page:");
                Console.WriteLine("\thttps://github.com/OpenSAGE/OpenSAGE/issues");

                Console.WriteLine("\n\n Press any key to exit.");

                Console.ReadLine();

                Environment.Exit(1);
            }

            logger.Debug($"Have installation of {definition.DisplayName}");

            Platform.Start();

            var traceEnabled = !string.IsNullOrEmpty(opts.TraceFile);

            if (traceEnabled)
            {
                GameTrace.Start(opts.TraceFile);
            }

            // TODO: Read game version from assembly metadata or .git folder
            // TODO: Set window icon.
            var config = new Configuration()
            {
                UseRenderDoc   = opts.RenderDoc,
                LoadShellMap   = !opts.NoShellmap,
                UseUniquePorts = opts.UseUniquePorts
            };

            UPnP.InitializeAsync(TimeSpan.FromSeconds(10)).ContinueWith(_ => logger.Info($"UPnP status: {UPnP.Status}"));

            logger.Debug($"Have configuration");

            using (var window = new GameWindow($"OpenSAGE - {installation.Game.DisplayName} - master", 100, 100, 1024, 768, opts.Fullscreen))
                using (var game = new Game(installation, opts.Renderer, config, window))
                    using (var textureCopier = new TextureCopier(game, window.Swapchain.Framebuffer.OutputDescription))
                        using (var developerModeView = new DeveloperModeView(game, window))
                        {
                            game.GraphicsDevice.SyncToVerticalBlank = !opts.DisableVsync;

                            var developerModeEnabled = opts.DeveloperMode;

                            if (opts.DeveloperMode)
                            {
                                window.Maximized = true;
                            }

                            if (opts.ReplayFile != null)
                            {
                                var replayFile = game.ContentManager.UserDataFileSystem?.GetFile(Path.Combine("Replays", opts.ReplayFile));
                                if (replayFile == null)
                                {
                                    logger.Debug("Could not find entry for Replay " + opts.ReplayFile);
                                    game.ShowMainMenu();
                                }

                                game.LoadReplayFile(replayFile);
                            }
                            else if (opts.Map != null)
                            {
                                game.Restart = StartMap;
                                StartMap();

                                void StartMap()
                                {
                                    var mapCache = game.AssetStore.MapCaches.GetByName(opts.Map);

                                    if (mapCache == null)
                                    {
                                        logger.Debug("Could not find MapCache entry for map " + opts.Map);
                                        game.ShowMainMenu();
                                    }
                                    else if (mapCache.IsMultiplayer)
                                    {
                                        var pSettings = new PlayerSetting[]
                                        {
                                            new PlayerSetting(null, "FactionAmerica", new ColorRgb(255, 0, 0), 0, PlayerOwner.Player),
                                            new PlayerSetting(null, "FactionGLA", new ColorRgb(0, 255, 0), 0, PlayerOwner.EasyAi),
                                        };

                                        logger.Debug("Starting multiplayer game");

                                        game.StartSkirmishOrMultiPlayerGame(opts.Map,
                                                                            new EchoConnection(),
                                                                            pSettings,
                                                                            Environment.TickCount,
                                                                            false);
                                    }
                                    else
                                    {
                                        logger.Debug("Starting singleplayer game");

                                        game.StartSinglePlayerGame(opts.Map);
                                    }
                                }
                            }
                            else
                            {
                                logger.Debug("Showing main menu");
                                game.ShowMainMenu();
                            }

                            game.InputMessageBuffer.Handlers.Add(
                                new CallbackMessageHandler(
                                    HandlingPriority.Window,
                                    message =>
                            {
                                if (message.MessageType == InputMessageType.KeyDown && message.Value.Key == Key.Enter && (message.Value.Modifiers & ModifierKeys.Alt) != 0)
                                {
                                    window.Fullscreen = !window.Fullscreen;
                                    return(InputMessageResult.Handled);
                                }

                                if (message.MessageType == InputMessageType.KeyDown && message.Value.Key == Key.F11)
                                {
                                    developerModeEnabled = !developerModeEnabled;
                                    return(InputMessageResult.Handled);
                                }

                                return(InputMessageResult.NotHandled);
                            }));

                            logger.Debug("Starting game");

                            game.StartRun();

                            while (game.IsRunning)
                            {
                                if (!window.PumpEvents())
                                {
                                    break;
                                }

                                if (developerModeEnabled)
                                {
                                    developerModeView.Tick();
                                }
                                else
                                {
                                    game.Update(window.MessageQueue);

                                    game.Panel.EnsureFrame(window.ClientBounds);

                                    game.Render();

                                    textureCopier.Execute(
                                        game.Panel.Framebuffer.ColorTargets[0].Target,
                                        window.Swapchain.Framebuffer);
                                }

                                window.MessageQueue.Clear();

                                game.GraphicsDevice.SwapBuffers(window.Swapchain);
                            }
                        }

            if (traceEnabled)
            {
                GameTrace.Stop();
            }

            Platform.Stop();
        }
 [ClientRpc] public void RpcAddStep(GameTrace gameTrace)
 {
     //Debug.Log("In Rpc:");
     //Debug.Log("order = " + gameTrace.order + ", x = " + gameTrace.x + ", y = " + gameTrace.y + ", player = " + gameTrace.player);
     _player.PlayerAddStep(gameTrace);
 }
Ejemplo n.º 19
0
        public static void Run(Options opts)
        {
            logger.Info("Starting...");

            var DetectedGame = opts.Game;
            var GameFolder   = opts.GamePath;
            var UseLocators  = true;

            if (GameFolder == null)
            {
                GameFolder = Environment.CurrentDirectory;
            }

            foreach (var gameDef in GameDefinition.All)
            {
                if (gameDef.Probe(GameFolder))
                {
                    DetectedGame = gameDef.Game;
                    UseLocators  = false;
                }
            }

            var definition = GameDefinition.FromGame(DetectedGame);
            GameInstallation installation;

            if (UseLocators)
            {
                installation = GameInstallation
                               .FindAll(new[] { definition })
                               .FirstOrDefault();
            }
            else
            {
                installation = new GameInstallation(definition, GameFolder);
            }

            if (installation == null)
            {
                Console.WriteLine($"OpenSAGE was unable to find any installations of {definition.DisplayName}.\n");

                Console.WriteLine("You can manually specify the installation path by setting the following environment variable:");
                Console.WriteLine($"\t{definition.Identifier.ToUpper()}_PATH=<installation path>\n");

                Console.WriteLine("OpenSAGE doesn't yet detect every released version of every game. Please report undetected versions to our GitHub page:");
                Console.WriteLine("\thttps://github.com/OpenSAGE/OpenSAGE/issues");

                Console.WriteLine("\n\n Press any key to exit.");

                Console.ReadLine();

                Environment.Exit(1);
            }

            logger.Debug($"Have installation of {definition.DisplayName}");

            Platform.Start();

            var traceEnabled = !string.IsNullOrEmpty(opts.TraceFile);

            if (traceEnabled)
            {
                GameTrace.Start(opts.TraceFile);
            }

            // TODO: Read game version from assembly metadata or .git folder
            // TODO: Set window icon.
            var config = new Configuration()
            {
                UseFullscreen = opts.Fullscreen,
                UseRenderDoc  = opts.RenderDoc,
                LoadShellMap  = !opts.NoShellmap,
            };

            if (opts.LanIPAddress != "")
            {
                try {
                    config.LanIpAddress = IPAddress.Parse(opts.LanIPAddress);
                }catch (FormatException) {
                    logger.Error($"Could not parse specified LAN IP address: {opts.LanIPAddress}");
                }
            }

            logger.Debug($"Have configuration");

            using (var game = new Game(installation, opts.Renderer, config))
            {
                game.GraphicsDevice.SyncToVerticalBlank = !opts.DisableVsync;

                game.DeveloperModeEnabled = opts.DeveloperMode;

                if (opts.DeveloperMode)
                {
                    game.Window.Maximized = true;
                }

                if (opts.ReplayFile != null)
                {
                    var replayFile = game.ContentManager.UserDataFileSystem?.GetFile(Path.Combine("Replays", opts.ReplayFile));
                    if (replayFile == null)
                    {
                        logger.Debug("Could not find entry for Replay " + opts.ReplayFile);
                        game.ShowMainMenu();
                    }

                    game.LoadReplayFile(replayFile);
                }
                else if (opts.Map != null)
                {
                    game.Restart = StartMap;
                    StartMap();

                    void StartMap()
                    {
                        var mapCache = game.AssetStore.MapCaches.GetByName(opts.Map);

                        if (mapCache == null)
                        {
                            logger.Debug("Could not find MapCache entry for map " + opts.Map);
                            game.ShowMainMenu();
                        }
                        else if (mapCache.IsMultiplayer)
                        {
                            var pSettings = new PlayerSetting?[]
                            {
                                new PlayerSetting(null, game.AssetStore.PlayerTemplates.GetByName("FactionAmerica"), new ColorRgb(255, 0, 0), PlayerOwner.Player),
                                new PlayerSetting(null, game.AssetStore.PlayerTemplates.GetByName("FactionGLA"), new ColorRgb(0, 255, 0), PlayerOwner.EasyAi),
                            };

                            logger.Debug("Starting multiplayer game");

                            game.StartMultiPlayerGame(opts.Map,
                                                      new EchoConnection(),
                                                      pSettings,
                                                      0);
                        }
                        else
                        {
                            logger.Debug("Starting singleplayer game");

                            game.StartSinglePlayerGame(opts.Map);
                        }
                    }
                }
                else
                {
                    logger.Debug("Showing main menu");
                    game.ShowMainMenu();
                }

                logger.Debug("Starting game");

                game.Run();
            }

            if (traceEnabled)
            {
                GameTrace.Stop();
            }

            Platform.Stop();
        }
 [Command] public void CmdAddStep(GameTrace gameTrace)
 {
     //Debug.Log("In Command:");
     //Debug.Log("order = " + gameTrace.order + ", x = " + gameTrace.x + ", y = " + gameTrace.y + ", player = " + gameTrace.player);
     RpcAddStep(gameTrace);
 }
Ejemplo n.º 21
0
        public static void Run(Options opts)
        {
            logger.Info("Starting...");

            var definition = GameDefinition.FromGame(opts.Game);

            var installation = GameInstallation
                               .FindAll(new[] { definition })
                               .FirstOrDefault();

            if (installation == null)
            {
                Console.WriteLine($"OpenSAGE was unable to find any installations of {definition.DisplayName}.\n");

                Console.WriteLine("You can manually specify the installation path by setting the following environment variable:");
                Console.WriteLine($"\t{definition.Identifier.ToUpper()}_PATH=<installation path>\n");

                Console.WriteLine("OpenSAGE doesn't yet detect every released version of every game. Please report undetected versions to our GitHub page:");
                Console.WriteLine("\thttps://github.com/OpenSAGE/OpenSAGE/issues");

                Console.WriteLine("\n\n Press any key to exit.");

                Console.ReadLine();

                Environment.Exit(1);
            }

            logger.Debug($"Have installation of {definition.DisplayName}");

            Platform.Start();

            var traceEnabled = !string.IsNullOrEmpty(opts.TraceFile);

            if (traceEnabled)
            {
                GameTrace.Start(opts.TraceFile);
            }

            // TODO: Read game version from assembly metadata or .git folder
            // TODO: Set window icon.
            var config = new Configuration()
            {
                UseFullscreen = opts.Fullscreen,
                UseRenderDoc  = opts.RenderDoc,
                LoadShellMap  = !opts.NoShellmap,
            };

            logger.Debug($"Have configuration");

            using (var game = new Game(installation, opts.Renderer, config))
            {
                game.GraphicsDevice.SyncToVerticalBlank = !opts.DisableVsync;

                game.DeveloperModeEnabled = opts.DeveloperMode;

                if (opts.ReplayFile != null)
                {
                    using (var fileSystem = new FileSystem(Path.Combine(game.UserDataFolder, "Replays")))
                    {
                        game.LoadReplayFile(fileSystem.GetFile(opts.ReplayFile));
                    }
                }
                else if (opts.Map != null)
                {
                    var pSettings = new PlayerSetting?[]
                    {
                        new PlayerSetting(null, "America", new ColorRgb(255, 0, 0)),
                        new PlayerSetting(null, "GLA", new ColorRgb(255, 255, 255)),
                    };

                    logger.Debug("Starting multiplayer game");
                    game.StartMultiPlayerGame(opts.Map,
                                              new EchoConnection(),
                                              pSettings,
                                              0);
                }
                else
                {
                    logger.Debug("Showing main menu");
                    game.ShowMainMenu();
                }

                logger.Debug("Starting game");

                game.Run();
            }

            if (traceEnabled)
            {
                GameTrace.Stop();
            }

            Platform.Stop();
        }
Ejemplo n.º 22
0
        public ContentManager(
            Game game,
            FileSystem fileSystem,
            GraphicsDevice graphicsDevice,
            SageGame sageGame)
        {
            using (GameTrace.TraceDurationEvent("ContentManager()"))
            {
                _game = game;

                FileSystem = fileSystem;

                GraphicsDevice = graphicsDevice;

                SageGame = sageGame;

                Language = LanguageUtility.ReadCurrentLanguage(game.Definition, fileSystem.RootDirectory);

                TranslationManager = Translation.TranslationManager.Instance;
                Translation.TranslationManager.LoadGameStrings(fileSystem, Language, sageGame);
                LocaleSpecificEncoding              = Encoding.GetEncoding(TranslationManager.CurrentLanguage.TextInfo.ANSICodePage);
                TranslationManager.LanguageChanged +=
                    (sender, e) => throw new NotImplementedException("Encoding change on LanguageChanged not implemented yet");

                IniDataContext = new IniDataContext();

                SubsystemLoader = Content.SubsystemLoader.Create(game.Definition, FileSystem, game, this);

                switch (sageGame)
                {
                // Only load these INI files for a subset of games, because we can't parse them for others yet.
                case SageGame.CncGenerals:
                case SageGame.CncGeneralsZeroHour:
                case SageGame.Bfme:
                case SageGame.Bfme2:
                case SageGame.Bfme2Rotwk:
                    SubsystemLoader.Load(Subsystem.Core);

                    // TODO: Defer subsystem loading until necessary
                    SubsystemLoader.Load(Subsystem.Audio);
                    SubsystemLoader.Load(Subsystem.Players);
                    SubsystemLoader.Load(Subsystem.ParticleSystems);
                    SubsystemLoader.Load(Subsystem.ObjectCreation);
                    SubsystemLoader.Load(Subsystem.Locomotors);
                    SubsystemLoader.Load(Subsystem.Weapons);
                    SubsystemLoader.Load(Subsystem.FXList);
                    SubsystemLoader.Load(Subsystem.Multiplayer);
                    SubsystemLoader.Load(Subsystem.LinearCampaign);
                    SubsystemLoader.Load(Subsystem.Wnd);
                    SubsystemLoader.Load(Subsystem.Terrain);
                    SubsystemLoader.Load(Subsystem.Credits);

                    break;

                case SageGame.Cnc3:
                    SubsystemLoader.Load(Subsystem.Core);
                    break;

                default:
                    break;
                }

                FontManager = new FontManager(Language, StringComparer.Create(TranslationManager.CurrentLanguage, true));
            }
        }
Ejemplo n.º 23
0
        public ContentManager(
            Game game,
            FileSystem fileSystem,
            GraphicsDevice graphicsDevice,
            SageGame sageGame,
            WndCallbackResolver wndCallbackResolver)
        {
            using (GameTrace.TraceDurationEvent("ContentManager()"))
            {
                _game       = game;
                _fileSystem = fileSystem;

                GraphicsDevice = graphicsDevice;

                SageGame = sageGame;

                Language = LanguageUtility.ReadCurrentLanguage(game.Definition, fileSystem.RootDirectory);

                IniDataContext = new IniDataContext(fileSystem, sageGame);

                DataContext = new DataContext();

                SubsystemLoader = Content.SubsystemLoader.Create(game.Definition, _fileSystem, IniDataContext);

                switch (sageGame)
                {
                // Only load these INI files for a subset of games, because we can't parse them for others yet.
                case SageGame.CncGenerals:
                case SageGame.CncGeneralsZeroHour:
                case SageGame.Bfme:
                case SageGame.Bfme2:
                case SageGame.Bfme2Rotwk:
                    SubsystemLoader.Load(Subsystem.Core);

                    // TODO: Move this somewhere else.
                    // Subsystem.Core should load mouse and water config, but that isn't the case with at least BFME2.
                    IniDataContext.LoadIniFile(@"Data\INI\Mouse.ini");
                    IniDataContext.LoadIniFile(@"Data\INI\Water.ini");
                    IniDataContext.LoadIniFile(@"Data\INI\AudioSettings.ini");

                    break;

                default:
                    break;
                }

                // TODO: Defer subsystem loading until necessary
                switch (sageGame)
                {
                // Only load these INI files for a subset of games, because we can't parse them for others yet.
                case SageGame.CncGenerals:
                case SageGame.CncGeneralsZeroHour:
                case SageGame.Bfme:
                case SageGame.Bfme2:
                case SageGame.Bfme2Rotwk:
                    SubsystemLoader.Load(Subsystem.Players);
                    SubsystemLoader.Load(Subsystem.ParticleSystems);
                    SubsystemLoader.Load(Subsystem.ObjectCreation);
                    SubsystemLoader.Load(Subsystem.Multiplayer);
                    SubsystemLoader.Load(Subsystem.LinearCampaign);
                    break;

                default:
                    break;
                }

                _contentLoaders = new Dictionary <Type, ContentLoader>
                {
                    { typeof(Model), AddDisposable(new ModelLoader()) },
                    { typeof(Scene3D), AddDisposable(new MapLoader()) },
                    { typeof(Texture), AddDisposable(new TextureLoader(graphicsDevice)) },
                    { typeof(Window), AddDisposable(new WindowLoader(this, wndCallbackResolver, Language)) },
                    { typeof(AptWindow), AddDisposable(new AptLoader()) },
                };

                _cachedObjects = new Dictionary <string, object>();

                TranslationManager = Translation.TranslationManager.Instance;
                Translation.TranslationManager.LoadGameStrings(fileSystem, Language, sageGame);

                _cachedFonts = new Dictionary <FontKey, Font>();

                var linearClampSamplerDescription = SamplerDescription.Linear;
                linearClampSamplerDescription.AddressModeU = SamplerAddressMode.Clamp;
                linearClampSamplerDescription.AddressModeV = SamplerAddressMode.Clamp;
                linearClampSamplerDescription.AddressModeW = SamplerAddressMode.Clamp;
                LinearClampSampler = AddDisposable(
                    graphicsDevice.ResourceFactory.CreateSampler(ref linearClampSamplerDescription));

                var pointClampSamplerDescription = SamplerDescription.Point;
                pointClampSamplerDescription.AddressModeU = SamplerAddressMode.Clamp;
                pointClampSamplerDescription.AddressModeV = SamplerAddressMode.Clamp;
                pointClampSamplerDescription.AddressModeW = SamplerAddressMode.Clamp;
                PointClampSampler = AddDisposable(
                    graphicsDevice.ResourceFactory.CreateSampler(ref pointClampSamplerDescription));

                NullTexture = AddDisposable(graphicsDevice.ResourceFactory.CreateTexture(TextureDescription.Texture2D(1, 1, 1, 1, PixelFormat.R8_G8_B8_A8_UNorm, TextureUsage.Sampled)));

                _cachedNullStructuredBuffers = new Dictionary <uint, DeviceBuffer>();

                SolidWhiteTexture = AddDisposable(graphicsDevice.CreateStaticTexture2D(
                                                      1, 1, 1,
                                                      new TextureMipMapData(
                                                          new byte[] { 255, 255, 255, 255 },
                                                          4, 4, 1, 1),
                                                      PixelFormat.R8_G8_B8_A8_UNorm));

                ShaderResources = AddDisposable(new ShaderResourceManager(graphicsDevice, SolidWhiteTexture));

                WndImageLoader = AddDisposable(new WndImageLoader(this, new MappedImageLoader(this)));

                _fallbackFonts = new FontCollection();
                var assembly   = Assembly.GetExecutingAssembly();
                var fontStream = assembly.GetManifestResourceStream($"OpenSage.Content.Fonts.{_fallbackEmbeddedFont}-Regular.ttf");
                _fallbackFonts.Install(fontStream);
                fontStream = assembly.GetManifestResourceStream($"OpenSage.Content.Fonts.{_fallbackEmbeddedFont}-Bold.ttf");
                _fallbackFonts.Install(fontStream);
            }
        }
Ejemplo n.º 24
0
        public ContentManager(
            Game game,
            FileSystem fileSystem,
            GraphicsDevice graphicsDevice,
            SageGame sageGame)
        {
            using (GameTrace.TraceDurationEvent("ContentManager()"))
            {
                _game = game;

                FileSystem = fileSystem;

                GraphicsDevice = graphicsDevice;

                SageGame = sageGame;

                Language = LanguageUtility.ReadCurrentLanguage(game.Definition, fileSystem);

                TranslationManager = Translation.TranslationManager.Instance;
                Translation.TranslationManager.LoadGameStrings(fileSystem, Language, game.Definition);
                LocaleSpecificEncoding = Encoding.GetEncoding(TranslationManager.CurrentLanguage.TextInfo.ANSICodePage);

                void OnLanguageChanged(object sender, EventArgs e)
                {
                    //throw new NotImplementedException("Encoding change on LanguageChanged not implemented yet");
                }

                TranslationManager.LanguageChanged += OnLanguageChanged;
                AddDisposeAction(() => TranslationManager.LanguageChanged -= OnLanguageChanged);

                IniDataContext = new IniDataContext();

                SubsystemLoader = Content.SubsystemLoader.Create(game.Definition, FileSystem, game, this);

                switch (sageGame)
                {
                // Only load these INI files for a subset of games, because we can't parse them for others yet.
                // TODO: Defer subsystem loading until necessary
                case SageGame.CncGenerals:
                case SageGame.CncGeneralsZeroHour:
                    SubsystemLoader.Load(Subsystem.Core);
                    SubsystemLoader.Load(Subsystem.Audio);
                    SubsystemLoader.Load(Subsystem.Players);
                    SubsystemLoader.Load(Subsystem.ParticleSystems);
                    SubsystemLoader.Load(Subsystem.ObjectCreation);
                    SubsystemLoader.Load(Subsystem.Locomotors);
                    SubsystemLoader.Load(Subsystem.Sciences);
                    SubsystemLoader.Load(Subsystem.Weapons);
                    SubsystemLoader.Load(Subsystem.FXList);
                    SubsystemLoader.Load(Subsystem.Multiplayer);
                    SubsystemLoader.Load(Subsystem.LinearCampaign);
                    SubsystemLoader.Load(Subsystem.Wnd);
                    SubsystemLoader.Load(Subsystem.Terrain);
                    SubsystemLoader.Load(Subsystem.Credits);
                    SubsystemLoader.Load(Subsystem.Damage);
                    SubsystemLoader.Load(Subsystem.SpecialPower);
                    SubsystemLoader.Load(Subsystem.InGameUI);
                    SubsystemLoader.Load(Subsystem.Rank);
                    SubsystemLoader.Load(Subsystem.Animation2D);
                    break;

                case SageGame.Bfme:
                case SageGame.Bfme2:
                case SageGame.Bfme2Rotwk:
                    SubsystemLoader.Load(Subsystem.Core);
                    SubsystemLoader.Load(Subsystem.Audio);
                    SubsystemLoader.Load(Subsystem.Players);
                    SubsystemLoader.Load(Subsystem.ParticleSystems);
                    SubsystemLoader.Load(Subsystem.ObjectCreation);
                    SubsystemLoader.Load(Subsystem.Locomotors);
                    SubsystemLoader.Load(Subsystem.Sciences);
                    SubsystemLoader.Load(Subsystem.Weapons);
                    SubsystemLoader.Load(Subsystem.FXList);
                    SubsystemLoader.Load(Subsystem.Multiplayer);
                    SubsystemLoader.Load(Subsystem.LinearCampaign);
                    SubsystemLoader.Load(Subsystem.Wnd);
                    SubsystemLoader.Load(Subsystem.Terrain);
                    SubsystemLoader.Load(Subsystem.Credits);
                    SubsystemLoader.Load(Subsystem.Damage);
                    SubsystemLoader.Load(Subsystem.SpecialPower);
                    SubsystemLoader.Load(Subsystem.InGameUI);
                    SubsystemLoader.Load(Subsystem.Rank);
                    SubsystemLoader.Load(Subsystem.Animation2D);

                    SubsystemLoader.Load(Subsystem.ExperienceLevels);
                    SubsystemLoader.Load(Subsystem.AttributeModifiers);
                    break;

                case SageGame.Cnc3:
                case SageGame.Ra3:
                    SubsystemLoader.Load(Subsystem.Core);
                    break;

                default:
                    break;
                }

                UpgradeManager.Initialize(_game.AssetStore);

                FontManager = new FontManager(Language, StringComparer.Create(TranslationManager.CurrentLanguage, true));
            }
        }
Ejemplo n.º 25
0
 // returns false if given step is not allowed
 private bool GetLimit(GameTrace gameTrace)
 {
     gameTrace.y = 14 - gameTrace.y;
     return(LimitChecker.player_limit(GameToJson(), JsonConvert.SerializeObject(gameTrace)));
 }