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); } }
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(); } }
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)) } }; } }
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)); } }
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); } }
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"); } }
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; } }
internal void LoadIniFile(FileSystemEntry entry) { using (GameTrace.TraceDurationEvent($"LoadIniFile('{entry.FilePath}'")) { var parser = new IniParser(entry, _game.AssetStore, _game.SageGame, IniDataContext, LocaleSpecificEncoding); parser.ParseFile(); } }
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); }
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); } }
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(); } }
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)); }
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(); } }
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; } }
//[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(); } }
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); }
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); }
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(); }
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)); } }
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); } }
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)); } }
// 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))); }